From 551d8eb2fd5d7b645672d30c95cc0733cf3a94c8 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Tue, 5 Sep 2023 00:49:33 -0400 Subject: [PATCH] Split makuhita_dojo.c --- include/code_801B3C0.h | 3 + include/code_80972F4.h | 3 + include/dungeon.h | 1 + include/{makuhita_dojo.h => makuhita_dojo1.h} | 54 +- include/makuhita_dojo2.h | 26 + ld_script.txt | 6 +- src/code_801B3C0.c | 1 - src/code_803B050.c | 10 +- src/code_809447C.c | 4 +- src/code_80972F4.c | 2 +- src/data/makuhita_dojo.h | 40 -- src/data/makuhita_dojo1.h | 15 + src/data/makuhita_dojo2.h | 22 + src/makuhita_dojo.c | 547 ------------------ src/makuhita_dojo1.c | 325 +++++++++++ src/makuhita_dojo2.c | 231 ++++++++ src/wonder_mail_3_mid.c | 4 +- sym_ewram2.txt | 7 +- 18 files changed, 659 insertions(+), 642 deletions(-) rename include/{makuhita_dojo.h => makuhita_dojo1.h} (62%) create mode 100644 include/makuhita_dojo2.h delete mode 100644 src/data/makuhita_dojo.h create mode 100644 src/data/makuhita_dojo1.h create mode 100644 src/data/makuhita_dojo2.h delete mode 100644 src/makuhita_dojo.c create mode 100644 src/makuhita_dojo1.c create mode 100644 src/makuhita_dojo2.c diff --git a/include/code_801B3C0.h b/include/code_801B3C0.h index 02b9e4266..7b39641a8 100644 --- a/include/code_801B3C0.h +++ b/include/code_801B3C0.h @@ -24,5 +24,8 @@ struct unkStruct_203B230 u32 sub_801B3C0(Item *); u32 sub_801B410(void); void sub_801B450(void); +u32 sub_801B60C(u32, u8, u8); +u32 sub_801B6AC(void); +void sub_801B72C(void); #endif // GUARD_CODE_801B3C0_H \ No newline at end of file diff --git a/include/code_80972F4.h b/include/code_80972F4.h index 7d6fdb66c..7a018146e 100644 --- a/include/code_80972F4.h +++ b/include/code_80972F4.h @@ -12,7 +12,10 @@ struct MissionText }; const u8 *GetCurrentMissionText(s16); +// TODO: this should probably be bool8 but can't get a match just yet +bool32 IsMazeCompleted(s16); +bool8 sub_8097504(s16); const u8 *sub_80975DC(u32); // These two are definitely bool8 but can't get them to match with it yet diff --git a/include/dungeon.h b/include/dungeon.h index f85693b48..e22098d1c 100644 --- a/include/dungeon.h +++ b/include/dungeon.h @@ -43,5 +43,6 @@ u32 GetMaxItemsAllowed(u8 dungeon); s8 GetRescuesAllowed(u8 dungeon); bool8 HasCheckpoint(u8 dungeon); s32 GetDungeonFloorCount(u8 dungeon); +void PrintYellowDungeonNametoBuffer(u8 *, DungeonLocation *); #endif //GUARD_DUNGEON_H diff --git a/include/makuhita_dojo.h b/include/makuhita_dojo1.h similarity index 62% rename from include/makuhita_dojo.h rename to include/makuhita_dojo1.h index e24ffbfe3..0e7d61f73 100644 --- a/include/makuhita_dojo.h +++ b/include/makuhita_dojo1.h @@ -1,14 +1,24 @@ -#ifndef GUARD_MAKUHITA_DOJO_H -#define GUARD_MAKUHITA_DOJO_H +#ifndef GUARD_MAKUHITA_DOJO1_H +#define GUARD_MAKUHITA_DOJO1_H -#include "constants/dungeon.h" #include "file_system.h" -#include "input.h" #include "menu.h" #include "text.h" +enum MakuhitaDojoMode +{ + MAKUHITA_DOJO_MODE_UNK0_AWAKE = 0, + MAKUHITA_DOJO_MODE_UNK1_AWAKE = 1, + MAKUHITA_DOJO_MODE_UNK2_AWAKE = 2, + MAKUHITA_DOJO_MODE_UNK3_AWAKE = 3, + MAKUHITA_DOJO_MODE_UNK4_ASLEEP = 4, + MAKUHITA_DOJO_MODE_UNK5_ASLEEP = 5, + MAKUHITA_DOJO_MODE_UNK6_ASLEEP = 6, + MAKUHITA_DOJO_MODE_UNK7_ASLEEP = 7, +}; + // size: 0xCC -struct unkStruct_203B318 +typedef struct MakuhitaDojoWork1 { /* 0x0 */ u32 mode; // Corresponds to the enum: MakuhitaDojoMode /* 0x4 */ bool32 isAsleep; @@ -28,40 +38,12 @@ struct unkStruct_203B318 u8 unk67; OpenedFile** unk68; UnkTextStruct2 unk6C[4]; -}; +} MakuhitaDojoWork1; -// size: 0xD0 -struct unkStruct_203B31C -{ - s16 unk0[NUM_DUNGEON_MAZE]; - /* 0x30 */ MenuInputStruct input; - u32 unk64; - UnkTextStruct2 *unk68; - UnkTextStruct2 unk6C[4]; - u8 unkCC[4]; -}; - -// mode corresponds to the enum: MakuhitaDojoMode -u32 MakuhitaDojo_New(u32 mode); void MakuhitaDojo_Delete(void); +bool8 MakuhitaDojo_New(u32); u32 sub_802FE58(void); s16 sub_802FED0(void); -bool8 sub_80302E8(s32, UnkTextStruct2_sub *, u32); -u32 sub_80303AC(bool8); -s16 sub_8030418(void); -void sub_8030480(void); -enum MakuhitaDojoMode -{ - MAKUHITA_DOJO_MODE_UNK0_AWAKE = 0, - MAKUHITA_DOJO_MODE_UNK1_AWAKE = 1, - MAKUHITA_DOJO_MODE_UNK2_AWAKE = 2, - MAKUHITA_DOJO_MODE_UNK3_AWAKE = 3, - MAKUHITA_DOJO_MODE_UNK4_ASLEEP = 4, - MAKUHITA_DOJO_MODE_UNK5_ASLEEP = 5, - MAKUHITA_DOJO_MODE_UNK6_ASLEEP = 6, - MAKUHITA_DOJO_MODE_UNK7_ASLEEP = 7, -}; - -#endif // GUARD_MAKUHITA_DOJO_H \ No newline at end of file +#endif // GUARD_MAKUHITA_DOJO1_H \ No newline at end of file diff --git a/include/makuhita_dojo2.h b/include/makuhita_dojo2.h new file mode 100644 index 000000000..ad3d11b56 --- /dev/null +++ b/include/makuhita_dojo2.h @@ -0,0 +1,26 @@ +#ifndef GUARD_MAKUHITA_DOJO2_H +#define GUARD_MAKUHITA_DOJO2_H + +#include "constants/dungeon.h" +#include "input.h" +#include "text.h" + +// size: 0xD0 +typedef struct MakuhitaDojoWork2 +{ + s16 unk0[NUM_DUNGEON_MAZE]; + /* 0x30 */ MenuInputStruct input; + u32 unk64; + UnkTextStruct2 *unk68; + UnkTextStruct2 unk6C[4]; + u8 unkCC[4]; +} MakuhitaDojoWork2; + +bool8 MakuhitaDojo_ReturnFalse(void); + +bool8 sub_80302E8(s32, UnkTextStruct2_sub *, u32); +u32 sub_80303AC(bool8); +s16 sub_8030418(void); +void sub_8030480(void); + +#endif // GUARD_MAKUHITA_DOJO2_H \ No newline at end of file diff --git a/ld_script.txt b/ld_script.txt index 10580dc2e..2b3994e25 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -126,7 +126,8 @@ SECTIONS { src/wonder_mail_3_mid.o(.text); asm/wonder_mail_3_mid.o(.text); src/wonder_mail_3_1.o(.text); - src/makuhita_dojo.o(.text); + src/makuhita_dojo1.o(.text); + src/makuhita_dojo2.o(.text); src/wonder_mail_4.o(.text); src/wonder_mail_5.o(.text); src/wonder_mail_6.o(.text); @@ -396,7 +397,8 @@ SECTIONS { src/mailbox.o(.rodata); src/pelipper_board.o(.rodata); src/wonder_mail_3_mid.o(.rodata); - src/makuhita_dojo.o(.rodata); + src/makuhita_dojo1.o(.rodata); + src/makuhita_dojo2.o(.rodata); src/wonder_mail_4.o(.rodata); src/wonder_mail_5.o(.rodata); src/wonder_mail_6.o(.rodata); diff --git a/src/code_801B3C0.c b/src/code_801B3C0.c index 743c0c4c9..fd446d101 100644 --- a/src/code_801B3C0.c +++ b/src/code_801B3C0.c @@ -7,7 +7,6 @@ #include "items.h" #include "memory.h" #include "pokemon.h" - #include "menu_input.h" #include "kecleon_bros.h" #include "sprite.h" diff --git a/src/code_803B050.c b/src/code_803B050.c index 15ad6ddbd..319f1c96e 100644 --- a/src/code_803B050.c +++ b/src/code_803B050.c @@ -13,6 +13,7 @@ #include "code_800D090.h" #include "menu_input.h" #include "wonder_mail.h" +#include "dungeon.h" extern s16 gUnknown_80E80E0[]; extern s16 gUnknown_80E8126[]; @@ -74,7 +75,6 @@ extern PokemonStruct1 *sub_808D378(void); s32 sub_8016028(void); extern void PrintDungeonLocationtoBuffer(u8 *, void *); -extern void PrintYellowDungeonNametoBuffer(u8 *, void *); extern u8 sub_803C1D0(WonderMailSub *, u8); extern u8 *sub_803C1F0(u8); void sub_803D414(u8 *, WonderMail *); @@ -86,9 +86,9 @@ void sub_803B6B0(s32 x, s32 y, u8 index, u32 param_4) void CreateRescueTitle(unkStruct_802C39C *param_1) { - char buf_1 [200]; - char buf_2 [20]; - char buf_3 [100]; + u8 buf_1[200]; + u8 buf_2[20]; + u8 buf_3[100]; u8 *monName; u8 uVar1; @@ -107,7 +107,7 @@ void CreateRescueTitle(unkStruct_802C39C *param_1) xxx_call_draw_string(0x15,param_1->y,gMedichamMission,param_1->unk0[0],0); break; case 7: - PrintYellowDungeonNametoBuffer(buf_1, param_1->unk8); + PrintYellowDungeonNametoBuffer(buf_1, ¶m_1->unk8->dungeon); xxx_call_draw_string(0x15,param_1->y,buf_1,param_1->unk0[0],0); break; case 12: diff --git a/src/code_809447C.c b/src/code_809447C.c index cf49f1047..e72ee1a8f 100644 --- a/src/code_809447C.c +++ b/src/code_809447C.c @@ -2,9 +2,10 @@ #include "code_80130A8.h" #include "code_8092334.h" #include "code_809447C.h" +#include "dungeon.h" +#include "dungeon_global_data.h" #include "items.h" #include "moves.h" -#include "dungeon_global_data.h" #include "text_util.h" #include "text2.h" @@ -39,7 +40,6 @@ extern u8 *gUnknown_8113870[]; extern struct unkStruct_8113080 gUnknown_8113080[]; extern void xxx_format_string(const char *, u8 *, void *, u32); -void PrintYellowDungeonNametoBuffer(u8 *buffer, DungeonLocation *dungeonLocation); extern s32 sub_8008ED0(u8 *); void sub_809447C(struct unkStruct_8094924 *r0, u8 *r1) diff --git a/src/code_80972F4.c b/src/code_80972F4.c index 8249d40ff..037b21ede 100644 --- a/src/code_80972F4.c +++ b/src/code_80972F4.c @@ -346,7 +346,7 @@ bool8 sub_8097504(s16 mazeIndex) #ifndef NONMATCHING register s32 mazeIndex_s32_1 asm("r1"); #else - s32 mazeIndex_s32_1; + s32 mazeIndex_s32_1; #endif s32 uVar3; diff --git a/src/data/makuhita_dojo.h b/src/data/makuhita_dojo.h deleted file mode 100644 index c602f5c3c..000000000 --- a/src/data/makuhita_dojo.h +++ /dev/null @@ -1,40 +0,0 @@ -static const UnkTextStruct2 gUnknown_80E0760 = { - 0x00, 0x00, 0x00, 0x00, - 0x03, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - NULL -}; - -ALIGNED(4) static 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."); -ALIGNED(4) static const u8 gMakuhitaDojoGoTrain[] = "Go Train"; -ALIGNED(4) static const u8 sFill2[] = "pksdir0"; - -// TODO: SPLIT MAKUHITA - -const UnkTextStruct2 gUnknown_80E07EC = { - 0x00, 0x00, 0x00, 0x00, - 0x03, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - NULL -}; - -const UnkTextStruct2 gUnknown_80E0804 = { - 0x00, 0x00, 0x00, 0x00, - 0x06, - 0x02, 0x02, - 0x0E, 0x0E, - 0x0E, 0x00, - NULL -}; - -ALIGNED(4) static const u8 gMakuhitaDojoHeader[] = "Courses"; -ALIGNED(4) static const u8 gUnknown_80E0824[] = _("{STAR_BULLET}"); -ALIGNED(4) static const u8 gMakuhitaCoursePlaceholder[] = _("{COLOR_2}%c%s{END_COLOR_TEXT_2}"); -ALIGNED(4) static const u8 sFill3[] = "pksdir0"; \ No newline at end of file diff --git a/src/data/makuhita_dojo1.h b/src/data/makuhita_dojo1.h new file mode 100644 index 000000000..5106fb35e --- /dev/null +++ b/src/data/makuhita_dojo1.h @@ -0,0 +1,15 @@ +static const UnkTextStruct2 sUnknown_80E0760 = { + 0, 0, 0, 0, + 3, + 0, 0, + 0, 0, + 0, 0, + NULL +}; + +ALIGNED(4) static const u8 sReceivedBonslyDoll[] = _( + "{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."); +ALIGNED(4) static const u8 sGoTrain[] = "Go Train"; +ALIGNED(4) static const u8 sFill[] = "pksdir0"; \ No newline at end of file diff --git a/src/data/makuhita_dojo2.h b/src/data/makuhita_dojo2.h new file mode 100644 index 000000000..f65f3b74e --- /dev/null +++ b/src/data/makuhita_dojo2.h @@ -0,0 +1,22 @@ +const UnkTextStruct2 sUnknown_80E07EC = { + 0, 0, 0, 0, + 3, + 0, 0, + 0, 0, + 0, 0, + NULL +}; + +const UnkTextStruct2 sUnknown_80E0804 = { + 0, 0, 0, 0, + 6, + 2, 2, + 14, 14, + 14, 0, + NULL +}; + +ALIGNED(4) static const u8 sCourses[] = "Courses"; +ALIGNED(4) static const u8 sStarBullet[] = _("{STAR_BULLET}"); +ALIGNED(4) static const u8 sFmtColor[] = _("{COLOR_2}%c%s{END_COLOR_TEXT_2}"); +ALIGNED(4) static const u8 sFill[] = "pksdir0"; \ No newline at end of file diff --git a/src/makuhita_dojo.c b/src/makuhita_dojo.c deleted file mode 100644 index ff787d16d..000000000 --- a/src/makuhita_dojo.c +++ /dev/null @@ -1,547 +0,0 @@ -#include "global.h" -#include "code_800D090.h" -#include "code_80118A4.h" -#include "code_80130A8.h" -#include "code_80A26CC.h" -#include "constants/colors.h" -#include "constants/input.h" -#include "dungeon.h" -#include "makuhita_dojo.h" -#include "memory.h" -#include "menu_input.h" -#include "pokemon.h" -#include "text1.h" -#include "text2.h" - -extern u8 gUnknown_202E1C8[]; -extern u8 gUnknown_202E5D8[]; -extern u8 gAvailablePokemonNames[]; -extern u8 gPlayerName[]; - -extern struct unkStruct_203B31C *gUnknown_203B31C; -extern struct unkStruct_203B318 *gUnknown_203B318; - -extern const u8 *gMakuhitaDialogue[2][10]; -extern u8 *gUnknown_80D4934[]; -extern u8 *gUnknown_80D4970[]; - -#include "data/makuhita_dojo.h" - -extern u32 sub_80095E4(s16, u32); -extern u32 sub_801B60C(u32, u8, u8); -extern u32 sub_801B6AC(void); -extern void sub_801B72C(void); -extern void sub_803053C(void); -extern bool8 sub_8097504(s16); - -extern PokemonStruct1 *GetPlayerPokemonStruct(void); -extern bool8 IsMazeCompleted(s32); -extern void PrintColoredPokeNameToBuffer(u8 *, PokemonStruct1 *, s32); -extern void PrintYellowDungeonNametoBuffer(u8 *, DungeonLocation *); - -void MakuhitaDojo_DrawCourseList(void); -void MakuhitaDojo_DrawMainMenu(void); -void MakuhitaDojo_GoToFallbackState(void); -bool8 MakuhitaDojo_ReturnFalse(void); -void MakuhitaDojo_SetState(s32); -void MakuhitaDojo_UpdateDialogue(void); - -void sub_802FF1C(void); -void sub_8030208(void); -void sub_8030258(void); -void sub_80302A8(void); -void sub_80304C8(void); -s32 sub_8030668(void); - -u32 MakuhitaDojo_New(u32 mode) -{ - char *monName; - OpenedFile *faceFile; - u32 initialState; - - ResetUnusedInputStruct(); - sub_800641C(NULL, TRUE, TRUE); - gUnknown_203B318 = MemoryAlloc(sizeof(struct unkStruct_203B318), 8); - gUnknown_203B318->unk10 = -1; - gUnknown_203B318->mode = mode; - - switch (mode) { - case MAKUHITA_DOJO_MODE_UNK0_AWAKE: - initialState = 0; - gUnknown_203B318->isAsleep = FALSE; - break; - case MAKUHITA_DOJO_MODE_UNK1_AWAKE: - initialState = 7; - gUnknown_203B318->isAsleep = FALSE; - break; - case MAKUHITA_DOJO_MODE_UNK2_AWAKE: - initialState = 6; - gUnknown_203B318->isAsleep = FALSE; - break; - case MAKUHITA_DOJO_MODE_UNK3_AWAKE: - initialState = 8; - gUnknown_203B318->isAsleep = FALSE; - break; - case MAKUHITA_DOJO_MODE_UNK4_ASLEEP: - initialState = 0; - gUnknown_203B318->isAsleep = TRUE; - break; - case MAKUHITA_DOJO_MODE_UNK5_ASLEEP: - initialState = 7; - gUnknown_203B318->isAsleep = TRUE; - break; - case MAKUHITA_DOJO_MODE_UNK6_ASLEEP: - initialState = 6; - gUnknown_203B318->isAsleep = TRUE; - break; - case MAKUHITA_DOJO_MODE_UNK7_ASLEEP: - default: - initialState = 8; - gUnknown_203B318->isAsleep = TRUE; - break; - } - - if (gUnknown_203B318->isAsleep == TRUE) - 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); - - 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; - MakuhitaDojo_SetState(initialState); - return TRUE; -} - -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: - MakuhitaDojo_GoToFallbackState(); - break; - } - return 0; -} - -s16 sub_802FED0(void) -{ - return gUnknown_203B318->unk10; -} - -void MakuhitaDojo_Delete(void) -{ - if (gUnknown_203B318 != NULL) { - CloseFile(gUnknown_203B318->faceFile); - MemoryFree(gUnknown_203B318); - gUnknown_203B318 = NULL; - } -} - -void MakuhitaDojo_SetState(s32 newState) -{ - gUnknown_203B318->state = newState; - sub_802FF1C(); - MakuhitaDojo_UpdateDialogue(); -} - -void sub_802FF1C(void) -{ - s32 index; - - sub_8006518(gUnknown_203B318->unk6C); - - switch (gUnknown_203B318->state) { - case 0: - case 4: - case 13: - for(index = 0; index < 4; index++) - gUnknown_203B318->unk6C[index] = gUnknown_80E0760; - break; - default: - break; - } - - ResetUnusedInputStruct(); - sub_800641C(gUnknown_203B318->unk6C, TRUE, TRUE); -} - -void MakuhitaDojo_UpdateDialogue(void) -{ - DungeonLocation dLoc; - - switch (gUnknown_203B318->state) { - case 0: - MakuhitaDojo_DrawMainMenu(); - sub_8014248(gMakuhitaDialogue[gUnknown_203B318->isAsleep][0], 0, gUnknown_203B318->menuAction, gUnknown_203B318->unk18, NULL, 4, 0, gUnknown_203B318->unk68, 12); - break; - case 1: - sub_8014248(gMakuhitaDialogue[gUnknown_203B318->isAsleep][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->isAsleep][2], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 3: - gUnknown_203B318->fallbackState = 4; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->isAsleep][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->isAsleep][4], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 7: - gUnknown_203B318->fallbackState = 13; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->isAsleep][6], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 6: - gUnknown_203B318->fallbackState = 13; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->isAsleep][5], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 8: - gUnknown_203B318->fallbackState = 9; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->isAsleep][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->isAsleep][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->isAsleep][9], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 13: - return; - } -} - -void MakuhitaDojo_DrawMainMenu(void) -{ - s32 loopMax; - - gUnknown_203B318->menuAction = 2; - loopMax = 0; - gUnknown_203B318->unk18[loopMax].text = gMakuhitaDojoGoTrain; - gUnknown_203B318->unk18[loopMax].menuAction = 2; - - if (MakuhitaDojo_ReturnFalse()) { - 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: - MakuhitaDojo_SetState(3); - break; - case 3: - MakuhitaDojo_SetState(12); - break; - case 1: - MakuhitaDojo_SetState(2); - break; - } - } -} - -void sub_8030258(void) -{ - switch (sub_80303AC(TRUE)) { - case 3: - gUnknown_203B318->unk10 = sub_8030418(); - sub_8030480(); - MakuhitaDojo_SetState(5); - break; - case 2: - sub_8030480(); - gUnknown_203B318->unk10 = -1; - MakuhitaDojo_SetState(1); - break; - case 0: - case 1: - break; - } -} - -void sub_80302A8(void) -{ - switch (sub_801B6AC()) { - case 2: - case 3: - sub_801B72C(); - MakuhitaDojo_SetState(10); - break; - case 0: - case 1: - break; - } -} - -void MakuhitaDojo_GoToFallbackState(void) -{ - s32 temp; - if (sub_80144A4(&temp) == 0) - MakuhitaDojo_SetState(gUnknown_203B318->fallbackState); -} - -bool8 sub_80302E8(s32 param_1, UnkTextStruct2_sub *param_2, u32 param_3) -{ - if (MakuhitaDojo_ReturnFalse()) - 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, TRUE, TRUE); - sub_8013818(&gUnknown_203B31C->input, sub_8030668(), param_3, param_1); - sub_80304C8(); - MakuhitaDojo_DrawCourseList(); - return TRUE; -} - -u32 sub_80303AC(bool8 param_1) -{ - if (param_1 == FALSE) { - 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(); - MakuhitaDojo_DrawCourseList(); - 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]; -} - -// Unused? -void sub_8030444(u8 r0) -{ - gUnknown_203B31C->input.unk22 = sub_8030668(); - sub_8013984(&gUnknown_203B31C->input); - sub_80304C8(); - MakuhitaDojo_DrawCourseList(); - 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, TRUE, TRUE); - MemoryFree(gUnknown_203B31C); - gUnknown_203B31C = NULL; - } -} - -#ifdef NONMATCHING // https://decomp.me/scratch/lM7lE -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, TRUE, TRUE); -} -#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 MakuhitaDojo_DrawCourseList(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(16, 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 MakuhitaDojo_ReturnFalse(void) -{ - return FALSE; -} \ No newline at end of file diff --git a/src/makuhita_dojo1.c b/src/makuhita_dojo1.c new file mode 100644 index 000000000..9af8c8a26 --- /dev/null +++ b/src/makuhita_dojo1.c @@ -0,0 +1,325 @@ +#include "global.h" +#include "code_80118A4.h" +#include "code_80130A8.h" +#include "code_801B3C0.h" +#include "code_80A26CC.h" +#include "constants/colors.h" +#include "dungeon.h" +#include "makuhita_dojo1.h" +#include "makuhita_dojo2.h" +#include "memory.h" +#include "pokemon.h" +#include "text1.h" +#include "text2.h" + +extern u8 gAvailablePokemonNames[]; // 202DF98 +extern u8 gUnknown_202E1C8[]; +extern u8 gPlayerName[]; // 202E2B8 +extern u8 gUnknown_202E5D8[]; + +static EWRAM_DATA_2 MakuhitaDojoWork1 *sMakuhitaDojoWork1 = {0}; + +// data_80D47B8.s +extern const u8 *gUnknown_80D4934[]; +extern const u8 *gUnknown_80D4970[]; +// data_80D47B8.s +extern const u8 *gMakuhitaDialogue[2][10]; // 80D9FC8 + +#include "data/makuhita_dojo1.h" // 80E0760 + +// pokemon.s +extern PokemonStruct1 *GetPlayerPokemonStruct(void); + +static void MakuhitaDojo_DrawMainMenu(void); +static void MakuhitaDojo_GoToFallbackState(void); +static void MakuhitaDojo_SetState(s32); +static void MakuhitaDojo_UpdateDialogue(void); + +static void sub_802FF1C(void); +static void sub_8030208(void); +static void sub_8030258(void); +static void sub_80302A8(void); + +bool8 MakuhitaDojo_New(u32 mode) +{ + u8 *monName; + OpenedFile *faceFile; + u32 initialState; + + ResetUnusedInputStruct(); + sub_800641C(NULL, TRUE, TRUE); + + sMakuhitaDojoWork1 = MemoryAlloc(sizeof(MakuhitaDojoWork1), 8); + sMakuhitaDojoWork1->unk10 = -1; + sMakuhitaDojoWork1->mode = mode; + + switch (mode) { + case MAKUHITA_DOJO_MODE_UNK0_AWAKE: + initialState = 0; + sMakuhitaDojoWork1->isAsleep = FALSE; + break; + case MAKUHITA_DOJO_MODE_UNK1_AWAKE: + initialState = 7; + sMakuhitaDojoWork1->isAsleep = FALSE; + break; + case MAKUHITA_DOJO_MODE_UNK2_AWAKE: + initialState = 6; + sMakuhitaDojoWork1->isAsleep = FALSE; + break; + case MAKUHITA_DOJO_MODE_UNK3_AWAKE: + initialState = 8; + sMakuhitaDojoWork1->isAsleep = FALSE; + break; + case MAKUHITA_DOJO_MODE_UNK4_ASLEEP: + initialState = 0; + sMakuhitaDojoWork1->isAsleep = TRUE; + break; + case MAKUHITA_DOJO_MODE_UNK5_ASLEEP: + initialState = 7; + sMakuhitaDojoWork1->isAsleep = TRUE; + break; + case MAKUHITA_DOJO_MODE_UNK6_ASLEEP: + initialState = 6; + sMakuhitaDojoWork1->isAsleep = TRUE; + break; + case MAKUHITA_DOJO_MODE_UNK7_ASLEEP: + default: + initialState = 8; + sMakuhitaDojoWork1->isAsleep = TRUE; + break; + } + + if (sMakuhitaDojoWork1->isAsleep == TRUE) + sMakuhitaDojoWork1->unk68 = NULL; + else + sMakuhitaDojoWork1->unk68 = &sMakuhitaDojoWork1->faceFile; + + CopyYellowMonsterNametoBuffer(gUnknown_202E5D8, MONSTER_MAKUHITA); + CopyYellowMonsterNametoBuffer(gUnknown_202E1C8, MONSTER_MAKUHITA); + monName = GetMonSpecies(MONSTER_MAKUHITA); + strcpy(gUnknown_202E1C8 - 0x50, monName); + + faceFile = GetDialogueSpriteDataPtr(MONSTER_MAKUHITA); + sMakuhitaDojoWork1->faceFile = faceFile; + sMakuhitaDojoWork1->faceData = faceFile->data; + sMakuhitaDojoWork1->unk64 = 0; + sMakuhitaDojoWork1->unk65 = 0; + sMakuhitaDojoWork1->unk66 = 0; + sMakuhitaDojoWork1->unk60 = 2; + sMakuhitaDojoWork1->unk62 = 8; + MakuhitaDojo_SetState(initialState); + return TRUE; +} + +u32 sub_802FE58(void) +{ + switch (sMakuhitaDojoWork1->state) { + case 0: + case 1: + sub_8030208(); + break; + case 4: + sub_8030258(); + break; + case 11: + sub_80302A8(); + break; + case 13: + return 3; + default: + MakuhitaDojo_GoToFallbackState(); + break; + } + return 0; +} + +s16 sub_802FED0(void) +{ + return sMakuhitaDojoWork1->unk10; +} + +void MakuhitaDojo_Delete(void) +{ + if (sMakuhitaDojoWork1 != NULL) { + CloseFile(sMakuhitaDojoWork1->faceFile); + MemoryFree(sMakuhitaDojoWork1); + sMakuhitaDojoWork1 = NULL; + } +} + +static void MakuhitaDojo_SetState(s32 newState) +{ + sMakuhitaDojoWork1->state = newState; + sub_802FF1C(); + MakuhitaDojo_UpdateDialogue(); +} + +static void sub_802FF1C(void) +{ + s32 index; + + sub_8006518(sMakuhitaDojoWork1->unk6C); + + switch (sMakuhitaDojoWork1->state) { + case 0: + case 4: + case 13: + for(index = 0; index < 4; index++) + sMakuhitaDojoWork1->unk6C[index] = sUnknown_80E0760; + break; + default: + break; + } + + ResetUnusedInputStruct(); + sub_800641C(sMakuhitaDojoWork1->unk6C, TRUE, TRUE); +} + +static void MakuhitaDojo_UpdateDialogue(void) +{ + DungeonLocation dLoc; + + switch (sMakuhitaDojoWork1->state) { + case 0: + MakuhitaDojo_DrawMainMenu(); + sub_8014248(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][0], 0, sMakuhitaDojoWork1->menuAction, sMakuhitaDojoWork1->unk18, NULL, 4, 0, sMakuhitaDojoWork1->unk68, 12); + break; + case 1: + sub_8014248(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][1], 0, sMakuhitaDojoWork1->menuAction, sMakuhitaDojoWork1->unk18, NULL, 4, 0, sMakuhitaDojoWork1->unk68, 12); + break; + case 2: + sMakuhitaDojoWork1->fallbackState = 13; + sub_80141B4(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][2], 0, sMakuhitaDojoWork1->unk68, 0x10D); + break; + case 3: + sMakuhitaDojoWork1->fallbackState = 4; + sub_80141B4(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][3], 0, sMakuhitaDojoWork1->unk68, 0x10D); + break; + case 4: + sub_80302E8(3, NULL, 10); + break; + case 5: + sMakuhitaDojoWork1->fallbackState = 13; + dLoc.id = sub_80A2740(sMakuhitaDojoWork1->unk10); + dLoc.floor = 1; + PrintYellowDungeonNametoBuffer(gAvailablePokemonNames, &dLoc); + sub_80141B4(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][4], 0, sMakuhitaDojoWork1->unk68, 0x10D); + break; + case 7: + sMakuhitaDojoWork1->fallbackState = 13; + sub_80141B4(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][6], 0, sMakuhitaDojoWork1->unk68, 0x10D); + break; + case 6: + sMakuhitaDojoWork1->fallbackState = 13; + sub_80141B4(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][5], 0, sMakuhitaDojoWork1->unk68, 0x10D); + break; + case 8: + sMakuhitaDojoWork1->fallbackState = 9; + sub_80141B4(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][7], 0, sMakuhitaDojoWork1->unk68, 0x10D); + break; + case 9: + PrintColoredPokeNameToBuffer(gPlayerName, GetPlayerPokemonStruct(), COLOR_YELLOW); + sMakuhitaDojoWork1->fallbackState = 11; + PlaySound(203); + sub_80141B4(sReceivedBonslyDoll, 0, 0, 0x101); + break; + case 10: + sMakuhitaDojoWork1->fallbackState = 13; + sub_80141B4(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][8], 0, sMakuhitaDojoWork1->unk68, 0x10D); + break; + case 11: + sub_801B60C(1, ITEM_GINSENG, 1); + break; + case 12: + sMakuhitaDojoWork1->fallbackState = 1; + sub_80141B4(gMakuhitaDialogue[sMakuhitaDojoWork1->isAsleep][9], 0, sMakuhitaDojoWork1->unk68, 0x10D); + break; + case 13: + return; + } +} + +static void MakuhitaDojo_DrawMainMenu(void) +{ + s32 loopMax; + + sMakuhitaDojoWork1->menuAction = 2; + loopMax = 0; + sMakuhitaDojoWork1->unk18[loopMax].text = sGoTrain; + sMakuhitaDojoWork1->unk18[loopMax].menuAction = 2; + + if (MakuhitaDojo_ReturnFalse()) { + sMakuhitaDojoWork1->unk18[loopMax].menuAction = -1; + sMakuhitaDojoWork1->menuAction = 1; + } + + loopMax += 1; + sMakuhitaDojoWork1->unk18[loopMax].text = *gUnknown_80D4970; + sMakuhitaDojoWork1->unk18[loopMax].menuAction = 3; + loopMax += 1; + sMakuhitaDojoWork1->unk18[loopMax].text = *gUnknown_80D4934; + sMakuhitaDojoWork1->unk18[loopMax].menuAction = 1; + loopMax += 1; + sMakuhitaDojoWork1->unk18[loopMax].text = NULL; + sMakuhitaDojoWork1->unk18[loopMax].menuAction = 1; +} + +static void sub_8030208(void) +{ + s32 menuAction; + if (sub_80144A4(&menuAction) == 0) { + sMakuhitaDojoWork1->menuAction = menuAction; + + switch (menuAction) { + case 2: + MakuhitaDojo_SetState(3); + break; + case 3: + MakuhitaDojo_SetState(12); + break; + case 1: + MakuhitaDojo_SetState(2); + break; + } + } +} + +static void sub_8030258(void) +{ + switch (sub_80303AC(TRUE)) { + case 3: + sMakuhitaDojoWork1->unk10 = sub_8030418(); + sub_8030480(); + MakuhitaDojo_SetState(5); + break; + case 2: + sub_8030480(); + sMakuhitaDojoWork1->unk10 = -1; + MakuhitaDojo_SetState(1); + break; + case 0: + case 1: + break; + } +} + +static void sub_80302A8(void) +{ + switch (sub_801B6AC()) { + case 2: + case 3: + sub_801B72C(); + MakuhitaDojo_SetState(10); + break; + case 0: + case 1: + break; + } +} + +static void MakuhitaDojo_GoToFallbackState(void) +{ + s32 temp; + if (sub_80144A4(&temp) == 0) + MakuhitaDojo_SetState(sMakuhitaDojoWork1->fallbackState); +} \ No newline at end of file diff --git a/src/makuhita_dojo2.c b/src/makuhita_dojo2.c new file mode 100644 index 000000000..8edf26449 --- /dev/null +++ b/src/makuhita_dojo2.c @@ -0,0 +1,231 @@ +#include "global.h" +#include "code_800D090.h" +#include "code_80118A4.h" +#include "code_80972F4.h" +#include "code_80A26CC.h" +#include "constants/colors.h" +#include "constants/input.h" +#include "dungeon.h" +#include "makuhita_dojo2.h" +#include "memory.h" +#include "menu_input.h" +#include "text1.h" +#include "text2.h" + +static EWRAM_DATA_2 MakuhitaDojoWork2 *sMakuhitaDojoWork2 = {0}; + +#include "data/makuhita_dojo2.h" // 80E07EC + +static void MakuhitaDojo_DrawCourseList(void); + +static void sub_80304C8(void); +static s32 sub_8030668(void); + +bool8 sub_80302E8(s32 param_1, UnkTextStruct2_sub *param_2, u32 param_3) +{ + if (MakuhitaDojo_ReturnFalse()) + return FALSE; + + if (sMakuhitaDojoWork2 == NULL) + sMakuhitaDojoWork2 = MemoryAlloc(sizeof(MakuhitaDojoWork2), 8); + + sMakuhitaDojoWork2->unk64 = param_1; + sMakuhitaDojoWork2->unk68 = &sMakuhitaDojoWork2->unk6C[param_1]; + sub_8006518(sMakuhitaDojoWork2->unk6C); + sMakuhitaDojoWork2->unk6C[sMakuhitaDojoWork2->unk64] = sUnknown_80E0804; + sMakuhitaDojoWork2->unk68->unk14 = sMakuhitaDojoWork2->unkCC; + + if (param_2 != NULL) + sMakuhitaDojoWork2->unk6C[sMakuhitaDojoWork2->unk64].unk8 = *param_2; + + sub_8012D08(sMakuhitaDojoWork2->unk68, param_3); + ResetUnusedInputStruct(); + sub_800641C(sMakuhitaDojoWork2->unk6C, TRUE, TRUE); + sub_8013818(&sMakuhitaDojoWork2->input, sub_8030668(), param_3, param_1); + sub_80304C8(); + MakuhitaDojo_DrawCourseList(); + return TRUE; +} + +u32 sub_80303AC(bool8 param_1) +{ + if (param_1 == FALSE) { + sub_8013660(&sMakuhitaDojoWork2->input); + return 0; + } + + switch (GetKeyPress(&sMakuhitaDojoWork2->input)) { + case INPUT_B_BUTTON: + PlayMenuSoundEffect(1); + return 2; + case INPUT_A_BUTTON: + PlayMenuSoundEffect(0); + return 3; + default: + if (sub_80138B8(&sMakuhitaDojoWork2->input, 1)) { + sub_80304C8(); + MakuhitaDojo_DrawCourseList(); + return 1; + } + else + return 0; + } +} + +s16 sub_8030418(void) +{ + return sMakuhitaDojoWork2->unk0[(sMakuhitaDojoWork2->input.unk1E * sMakuhitaDojoWork2->input.unk1C) + sMakuhitaDojoWork2->input.menuIndex]; +} + +UNUSED static void sub_8030444(bool8 a0) +{ + sMakuhitaDojoWork2->input.unk22 = sub_8030668(); + sub_8013984(&sMakuhitaDojoWork2->input); + sub_80304C8(); + MakuhitaDojo_DrawCourseList(); + if (a0) + AddMenuCursorSprite(&sMakuhitaDojoWork2->input); +} + +void sub_8030480(void) +{ + if (sMakuhitaDojoWork2 != NULL) { + sMakuhitaDojoWork2->unk6C[sMakuhitaDojoWork2->unk64] = sUnknown_80E07EC; + ResetUnusedInputStruct(); + sub_800641C(sMakuhitaDojoWork2->unk6C, TRUE, TRUE); + MemoryFree(sMakuhitaDojoWork2); + sMakuhitaDojoWork2 = NULL; + } +} + +#ifdef NONMATCHING // https://decomp.me/scratch/lM7lE +static void sub_80304C8(void) +{ + s16 test; + + sMakuhitaDojoWork2->unkCC[0] = 1; + sMakuhitaDojoWork2->unkCC[1] = 0; + sMakuhitaDojoWork2->unkCC[2] = 8; + sMakuhitaDojoWork2->unkCC[3] = 0; + + test = sub_80095E4(sMakuhitaDojoWork2->input.unk1A, 12) + 2; + sMakuhitaDojoWork2->unk6C[sMakuhitaDojoWork2->unk64].unkE = test; + sMakuhitaDojoWork2->unk6C[sMakuhitaDojoWork2->unk64].unk10 = test + 2; + ResetUnusedInputStruct(); + sub_800641C(sMakuhitaDojoWork2->unk6C, TRUE, TRUE); +} +#else +NAKED +static 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 sMakuhitaDojoWork2"); +} +#endif // NONMATCHING + +static void MakuhitaDojo_DrawCourseList(void) +{ + u8 dungeonIndex; + s32 mazeIndex; + s32 y; + s32 iVar6; + u32 color; + s32 i; + u8 buffer[256]; + + sub_8008C54(sMakuhitaDojoWork2->unk64); + sub_80073B8(sMakuhitaDojoWork2->unk64); + xxx_call_draw_string(10, 0, sCourses, sMakuhitaDojoWork2->unk64, 0); + sub_8012BC4((sMakuhitaDojoWork2->unkCC[2] * 8) + 4, 0, sMakuhitaDojoWork2->input.unk1E + 1, 2, 7, sMakuhitaDojoWork2->unk64); + + for (i = 0; i < sMakuhitaDojoWork2->input.unk1A; i++) { + iVar6 = sMakuhitaDojoWork2->unk0[sMakuhitaDojoWork2->input.unk1E * sMakuhitaDojoWork2->input.unk1C + i]; + dungeonIndex = sub_80A2740(iVar6); + + mazeIndex = sub_80A2668(iVar6); + + y = sub_8013800(&sMakuhitaDojoWork2->input, i); + color = COLOR_WHITE_2; // COLOR_WHITE again? + if ((bool8)IsMazeCompleted(mazeIndex)) { + xxx_call_draw_string(8, y, sStarBullet, sMakuhitaDojoWork2->unk64, 0); + color = COLOR_GREEN; + } + sprintfStatic(buffer, sFmtColor, color, GetDungeonName1(dungeonIndex)); + xxx_call_draw_string(16, y, buffer, sMakuhitaDojoWork2->unk64, 0); + } + sub_80073E0(sMakuhitaDojoWork2->unk64); +} + +static s32 sub_8030668(void) +{ + s32 i; + s32 counter; + + counter = 0; + + for (i = 0; i < NUM_DUNGEON_MAZE; i++) { + if (sub_8097504(i)) { + sMakuhitaDojoWork2->unk0[counter] = sub_80A26CC(i); + counter++; + } + } + return counter; +} + +bool8 MakuhitaDojo_ReturnFalse(void) +{ + return FALSE; +} \ No newline at end of file diff --git a/src/wonder_mail_3_mid.c b/src/wonder_mail_3_mid.c index 1ba7400c7..cc5a6c73b 100644 --- a/src/wonder_mail_3_mid.c +++ b/src/wonder_mail_3_mid.c @@ -13,6 +13,7 @@ #include "code_80130A8.h" #include "code_80118A4.h" #include "wonder_mail_3.h" +#include "code_801B3C0.h" extern unkStruct_803B344 *sub_803B344(u8); @@ -96,8 +97,6 @@ extern void sub_802F184(void); extern void sub_802F1E8(void); extern void sub_802F004(); extern void sub_802F088(); -extern void sub_801B72C(void); -extern u32 sub_801B6AC(void); extern void sub_802F108(void); extern void sub_803B35C(WonderMail*, unkStruct_802C39C *); extern void sub_802DE84(unkStruct_802C39C *); @@ -115,7 +114,6 @@ extern void sub_802F6FC(void); extern void ProceedToNextRewardSceneState(void); extern void sub_802F300(void); extern s32 sub_808D544(u32); -extern u32 sub_801B60C(u32, u8, u8); void HandleMissionReward(void); const u8 *sub_80974A0(s16 index); diff --git a/sym_ewram2.txt b/sym_ewram2.txt index 6575fd58f..9f24dc9f9 100644 --- a/sym_ewram2.txt +++ b/sym_ewram2.txt @@ -329,11 +329,8 @@ gUnknown_203B310: /* 203B310 */ gUnknown_203B314: /* 203B314 */ .space 0x4 -gUnknown_203B318: /* 203B318 */ - .space 0x4 - -gUnknown_203B31C: /* 203B31C */ - .space 0x4 +.include "src/makuhita_dojo1.o" +.include "src/makuhita_dojo2.o" gUnknown_203B320: /* 203B320 */ .space 0x4