From 92774e8a2b304d18fde0729676f7a1fd36eb2ad5 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 13 Sep 2026 18:52:06 -0700 Subject: [PATCH] Decompile the head of overlay_11_023090DC; type the parent-menu tables Five functions, the head of asm/overlay_11_023090DC.s, all merging into src/overlay_11_02307334.c beside their only caller ov11_02307334: ov11_023090DC 809 insn (NA/EU), 807 (JAPAN) ov11_02309DAC 18 ov11_02309DF8 10 ov11_02309E24 8 ov11_02309E48 39 ov11_023090DC is the largest function landed on this branch. It reached STRUCT 0 -- every instruction, immediate and branch target correct -- while a single register permutation over 35 rows held it at score 230. The rule that closed it: MWCC colours the locals living across a call in case-scope declaration order, lowest free register first, and a local assigned only inside a loop body does not join that group from case scope. Four qualifying locals therefore reach only r4-r7; the target needs one on r8, so a fifth member has to exist. Hoisting e, move_id, k and q into the case's declaration list supplies it. No statement moved and no type changed. struct unk_02324D90 gains 22 offsets, replacing padding. Size and every pre-existing offset are unchanged in all three regions, checked by compiling sizeof/offsetof comparisons against the previous layout with the real compiler and reading the folded constant back out. The parent-menu tables are typed from their data rather than from the weakest prototype that accepted them. asm/overlay_11_022ECD24_data.s shows each as a run of 8-byte entries -- u16 string id, 2 bytes padding, s32 value -- i.e. struct unk_0202A5CC, which include/main_0202A66C.h already declares and which CreateParentMenuFromStringIds already takes. Four were declared extern s32 as scalars (hence the & at every call site), one duplicated the struct under a second name, and this file carried its own void*-taking prototype that let all of it compile. Seven globals are now struct unk_0202A5CC[], the duplicate struct unk_02322D38 is gone, the local prototype yields to the header, and five redundant & are dropped. Byte-neutral: &scalar and array yield the same address. Authored by Claude (Opus 5) under human direction. All five measured at decomp.me score 0 in all three regions and re-measured independently. Confirmed by matching builds of all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- ...1_023090DC.inc => overlay_11_02309EE4.inc} | 51 - ...ay_11_023090DC.s => overlay_11_02309EE4.s} | 1049 +---------------- include/overlay_11_02307334.h | 5 + main.lsf | 2 +- src/overlay_11_02307334.c | 655 +++++++++- 5 files changed, 637 insertions(+), 1125 deletions(-) rename asm/include/{overlay_11_023090DC.inc => overlay_11_02309EE4.inc} (73%) rename asm/{overlay_11_023090DC.s => overlay_11_02309EE4.s} (77%) diff --git a/asm/include/overlay_11_023090DC.inc b/asm/include/overlay_11_02309EE4.inc similarity index 73% rename from asm/include/overlay_11_023090DC.inc rename to asm/include/overlay_11_02309EE4.inc index 1eafb560..1463c744 100644 --- a/asm/include/overlay_11_023090DC.inc +++ b/asm/include/overlay_11_02309EE4.inc @@ -11,8 +11,6 @@ .public CountNbItemsOfTypeInStorage .public CreateAdvancedTextBox .public CreateCollectionMenu -.public CreateMonsterSummaryFromTeamMember -.public CreateParentMenu .public CreateParentMenuFromStringIds .public DrawTextInWindow .public DungeonMoveToGroundMove @@ -22,19 +20,13 @@ .public GetActorMatchingStorageId .public GetCroagunkItemTemplates .public GetCurrentBagCapacity -.public GetDexNumber .public GetExclusiveItemType .public GetGameMode .public GetInfoMoveGround .public GetItemAtIdx -.public GetItemMoveId16 -.public GetKeyboardStatus -.public GetKeyboardStringResult -.public GetPressedButtons .public GetSimpleMenuResult__0202AEA4 .public GetTeamMember .public GetWindowIdPageStart -.public GetWindowIdSelectedItemOnPage .public GetWindowIdSelectedMenuItemIdx .public InitMenu .public InitMove @@ -51,11 +43,7 @@ .public MemZero .public MemcpySimple .public PlaySeVolumeWrapper -.public PreprocessString .public PreprocessStringFromId -.public PrintIqSkillsMenu -.public RecolorNameString -.public ResumeParentMenu .public SWAP_SHOP_CLUMSET_ONE_STAR_STR .public SWAP_SHOP_CLUMSET_THREE_STAR_STR .public SWAP_SHOP_CLUMSET_TWO_STAR_STR @@ -68,28 +56,11 @@ .public SetCollectionMenuField0x1A4 .public SetCollectionMenuField0x1C8 .public SetWindowTitle -.public ShowKeyboard -.public StrcmpMonsterName -.public StrcpySimple -.public StrncpySimple -.public StrncpySimpleNoPad -.public StrncpySimpleNoPadSafe .public SwapShopFreeDoublePointer .public UpdateWindow .public ov11_02301174 -.public ov11_0230D000 -.public ov11_0230D220 -.public ov11_0230D92C -.public ov11_02310BDC .public ov11_02322DC8 -.public ov11_02322DD0 -.public ov11_02322DE0 .public ov11_02322DF0 -.public ov11_02322E00 -.public ov11_02322E28 -.public ov11_02322E58 -.public ov11_02322E7C -.public ov11_02322EA0 .public ov11_02322EAC .public ov11_02322EBC .public ov11_02322ECC @@ -105,7 +76,6 @@ .public ov11_02322FD4 .public ov11_02322FE4 .public ov11_02322FF4 -.public ov11_02324D90 .public ov11_02324D94 .public ov11_02324D98 .public strcat @@ -117,31 +87,16 @@ .public sub_02017C50 .public sub_02017C74 .public sub_020262E0 -.public sub_0202810C -.public sub_0202812C -.public sub_02028354 .public sub_0202836C .public sub_0202A03C -.public sub_0202B030 .public sub_0202C620 .public sub_0202C75C .public sub_0202D07C .public sub_0202D0EC -.public sub_020307EC -.public sub_02037468 -.public sub_0203909C -.public sub_02039218 -.public sub_0203931C -.public sub_0203F150 -.public sub_0203F398 -.public sub_0203F974 -.public sub_0203F990 .public sub_0203FA64 -.public sub_0203FBD4 .public sub_0203FD14 .public sub_0203FD38 .public sub_0203FD80 -.public sub_0203FDEC .public sub_0204018C .public sub_020407C0 .public sub_020407EC @@ -155,8 +110,6 @@ .public sub_020417A8 .public sub_02041A00 .public sub_02041A18 -.public sub_02041B7C -.public sub_020420F4 .public sub_02046A20 .public sub_02046B04 .public sub_02046BA0 @@ -171,12 +124,8 @@ .public sub_02047188 .public sub_0204E210 .public sub_02053A0C -.public sub_02053D1C .public sub_020546E8 .public sub_02055894 -.public sub_02055FCC .public sub_02056094 .public sub_0205633C .public sub_020564B0 -.public sub_020586F0 -.public sub_02058794 diff --git a/asm/overlay_11_023090DC.s b/asm/overlay_11_02309EE4.s similarity index 77% rename from asm/overlay_11_023090DC.s rename to asm/overlay_11_02309EE4.s index 3ce49cb5..58a04711 100644 --- a/asm/overlay_11_023090DC.s +++ b/asm/overlay_11_02309EE4.s @@ -1,1055 +1,8 @@ .include "asm/macros.inc" - .include "overlay_11_023090DC.inc" - -#ifdef JAPAN -#define OV11_02309084_OFFSET -0x20 -#else -#define OV11_02309084_OFFSET 0 -#endif + .include "overlay_11_02309EE4.inc" .text - arm_func_start ov11_023090DC -ov11_023090DC: ; 0x023090DC - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x124 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r3, [r0] - ldr r0, [r3] - cmp r0, #0x1b - addls pc, pc, r0, lsl #2 - b _02309D74 -_023090FC: ; jump table - b _0230916C ; case 0 - b _0230955C ; case 1 - b _02309518 ; case 2 - b _02309724 ; case 3 - b _023097EC ; case 4 - b _0230984C ; case 5 - b _0230987C ; case 6 - b _023098A8 ; case 7 - b _023098E4 ; case 8 - b _023099B0 ; case 9 - b _023099CC ; case 10 - b _023099F8 ; case 11 - b _02309A2C ; case 12 - b _02309A68 ; case 13 - b _02309A8C ; case 14 - b _02309AB4 ; case 15 - b _02309AD0 ; case 16 - b _02309B40 ; case 17 - b _02309B5C ; case 18 - b _02309BA4 ; case 19 - b _02309C04 ; case 20 - b _02309CA4 ; case 21 - b _02309CE0 ; case 22 - b _02309CF8 ; case 23 - b _02309D20 ; case 24 - b _02309D38 ; case 25 - b _02309D54 ; case 26 - b _02309D6C ; case 27 -_0230916C: - ldr r5, [r3, #0x114 + OV11_02309084_OFFSET] - mov r0, #0 - str r0, [sp, #4] - ldr r8, [sp, #4] - add r4, r3, #0x11c + OV11_02309084_OFFSET - mov r2, r8 -#ifdef JAPAN - str r2, [sp, #8] - ldrsh r2, [r3, #0xf8] -#else - add r3, r3, #0x100 - str r2, [sp, #8] - ldrsh r2, [r3, #0x18] -#endif - mov r0, r4 - mov r1, r5 - str r2, [sp, #0x10] - ldr r2, _02309D84 ; =0x00401833 - add r7, r4, #0x38 - str r2, [sp, #0x14] - bl ov11_02309EE4 - mov r2, #0 - mov r1, r2 - b _023091C4 -_023091B8: - add r0, r4, r2 - strb r1, [r0, #0x70] - add r2, r2, #1 -_023091C4: - ldr r0, [r4, #0x30] - cmp r2, r0 - blt _023091B8 - cmp r5, #2 - bne _023092FC - mov sl, #0 - b _023092F0 -_023091E0: - ldr r0, [sp, #0x10] - add fp, r4, sl, lsl #3 - bl GetItemMoveId16 - ldr r1, [r4, sl, lsl #3] - mov r6, r0 - cmp r1, #1 - bne _02309258 - ldrsh r0, [fp, #4] - bl GetTeamMember - ldrsh r1, [r0, #4] - mov sb, #0 - mov r3, sb - str r1, [sp, #0xc] - mov fp, #1 - mov r1, #6 - b _0230924C -_02309220: - mla ip, sb, r1, r0 - ldrb r2, [ip, #0x22] - tst r2, #1 - movne r2, fp - moveq r2, r3 - tst r2, #0xff - beq _02309248 - ldrh r2, [ip, #0x24] - cmp r6, r2 - beq _023092B8 -_02309248: - add sb, sb, #1 -_0230924C: - cmp sb, #4 - blt _02309220 - b _023092B8 -_02309258: - cmp r1, #2 - bne _023092B8 - ldrsh r0, [fp, #4] - bl GetActiveTeamMember - ldrsh r1, [r0, #0xc] - mov sb, #0 - mov r2, sb - str r1, [sp, #0xc] - mov r3, #1 - b _023092B0 -_02309280: - add r1, r0, sb, lsl #3 - ldrb r1, [r1, #0x1c] - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - beq _023092AC - add r1, r0, sb, lsl #3 - ldrh r1, [r1, #0x20] - cmp r6, r1 - beq _023092B8 -_023092AC: - add sb, sb, #1 -_023092B0: - cmp sb, #4 - blt _02309280 -_023092B8: - ldr r1, [sp, #0xc] - mov r0, r6 - bl sub_02053D1C - cmp r0, #0 - beq _023092E0 - cmp sb, #4 - addlt r0, r4, sl - movlt r1, #3 - strltb r1, [r0, #0x70] - b _023092EC -_023092E0: - add r0, r4, sl - mov r1, #3 - strb r1, [r0, #0x70] -_023092EC: - add sl, sl, #1 -_023092F0: - ldr r0, [r4, #0x30] - cmp sl, r0 - blt _023091E0 -_023092FC: - mov sl, #0 - add r6, r4, #0x76 - add fp, sp, #0x5c - b _02309450 -_0230930C: - add sb, r4, sl, lsl #3 - ldr r0, [r4, sl, lsl #3] - cmp r0, #1 - bne _0230935C - ldrsh r0, [sb, #4] - bl GetTeamMember - ldrsh r1, [sb, #4] - mov sb, r0 - orr r0, r1, #0x20000 - str r0, [sp, #0x5c] - ldrsh r0, [sb, #4] - bl GetDexNumber - str r0, [sp, #0x80] - add r1, sb, #0x3a - add r0, sp, #0x1a - mov r2, #0 - bl RecolorNameString - add r0, sp, #0x1a - str r0, [sp, #0x94] - b _023093A0 -_0230935C: - cmp r0, #2 - bne _023093A0 - ldrsh r0, [sb, #4] - bl GetActiveTeamMember - ldrsh r1, [sb, #4] - mov sb, r0 - orr r0, r1, #0x30000 - str r0, [sp, #0x5c] - ldrsh r0, [sb, #0xc] - bl GetDexNumber - str r0, [sp, #0x80] - add r1, sb, #0x5e - add r0, sp, #0x1a - mov r2, #0 - bl RecolorNameString - add r0, sp, #0x1a - str r0, [sp, #0x94] -_023093A0: - cmp r5, #1 - mov r1, #0x100 - mov r3, #0 - bne _023093C8 - ldr r2, _02309D88 ; =ov11_02322E58 - add r0, r6, r8, lsl #8 - str fp, [sp] - mov sb, r8, lsl #8 - bl PreprocessString - b _0230941C -_023093C8: - cmp r5, #2 - bne _02309408 - add r0, r4, sl - ldrb r0, [r0, #0x70] - mov sb, r8, lsl #8 - tst r0, #2 - str fp, [sp] - beq _023093F8 - ldr r2, _02309D8C ; =ov11_02322E7C - add r0, r6, r8, lsl #8 - bl PreprocessString - b _0230941C -_023093F8: - ldr r2, _02309D88 ; =ov11_02322E58 - add r0, r6, r8, lsl #8 - bl PreprocessString - b _0230941C -_02309408: - ldr r2, _02309D90 ; =ov11_02322EA0 - add r0, r6, r8, lsl #8 - str fp, [sp] - mov sb, r8, lsl #8 - bl PreprocessString -_0230941C: - add r0, r4, sl - ldrb r0, [r0, #0x70] - add r8, r8, #1 - cmp r0, #0 - ldreq r0, [sp, #4] - cmpeq r0, #0 - moveq r0, #1 - streq r0, [sp, #4] - add r0, r6, sb - stmia r7, {r0, sl} - streq sl, [sp, #8] - add r7, r7, #8 - add sl, sl, #1 -_02309450: - ldr r0, [r4, #0x30] - cmp sl, r0 - blt _0230930C - mov r3, #0 - str r3, [r7] - sub r0, r3, #1 - str r0, [r7, #4] - ldr r0, [sp, #8] - ldr r1, _02309D80 ; =ov11_02324D90 - str r0, [r4, #0x34] - ldr r0, [r1] - mov r2, #0x10 - str r2, [r0, #0x88 + OV11_02309084_OFFSET] - ldr r0, [r1] - str r3, [r0, #0x7c + OV11_02309084_OFFSET] - ldr r3, [r1] - ldr r0, [r3, #0x114 + OV11_02309084_OFFSET] - cmp r0, #1 - ldreq r0, _02309D94 ; =0x000002F2 - streqh r0, [r3, #0x84 + OV11_02309084_OFFSET] - beq _023094E0 - cmp r0, #2 - ldrne r0, _02309D98 ; =0x00000A3A - strneh r0, [r3, #0x84 + OV11_02309084_OFFSET] - bne _023094E0 - ldr r2, _02309D94 ; =0x000002F2 - ldr r0, [sp, #0x14] - strh r2, [r3, #0x84 + OV11_02309084_OFFSET] - orr r0, r0, #0x200 - ldr r2, [r1] - str r0, [sp, #0x14] - add r0, r2, #0x18c + OV11_02309084_OFFSET - str r0, [r2, #0xdc + OV11_02309084_OFFSET] - ldr r1, [r1] - ldr r0, [r1, #0x150 + OV11_02309084_OFFSET] - str r0, [r1, #0x7c + OV11_02309084_OFFSET] -_023094E0: - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r0, _02309D9C ; =ov11_02322DD0 - ldr r3, [r1] - ldr r1, [sp, #0x14] - add r2, r3, #0x7c + OV11_02309084_OFFSET - add r3, r3, #0x154 + OV11_02309084_OFFSET - bl CreateParentMenu - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #1 - ldr r3, [r1] - strb r0, [r3, #4] - ldr r0, [r1] - str r2, [r0] - b _02309D74 -_02309518: - ldrsb r0, [r3, #4] - bl sub_02028354 - cmp r0, #3 - bne _02309538 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202810C -_02309538: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl ResumeParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #1 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_0230955C: - add r1, sp, #0x18 - mov r0, #0 - ldr r5, [r3, #0x114 + OV11_02309084_OFFSET] - bl GetPressedButtons - ldrh r0, [sp, #0x18] - tst r0, #8 - beq _02309584 - cmp r5, #0 - moveq r0, #1 - beq _02309588 -_02309584: - mov r0, #0 -_02309588: - cmp r0, #0 - beq _023095E0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r4, [r0] - ldrsb r0, [r4, #4] - bl GetWindowIdSelectedItemOnPage - add r0, r4, r0, lsl #3 - ldr r1, [r0, #0x158 + OV11_02309084_OFFSET] - ldr r0, _02309D80 ; =ov11_02324D90 - str r1, [r4, #0x10] - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202B030 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202812C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #4 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023095E0: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl IsParentMenuActive - cmp r0, #0 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl GetSimpleMenuResult__0202AEA4 - cmp r0, #0 - blt _02309704 - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r2, [r1] - str r0, [r2, #0x10] - ldr r1, [r1] - add r2, r1, #0x11c + OV11_02309084_OFFSET - ldr r1, [r2, r0, lsl #3] - add r5, r2, r0, lsl #3 - cmp r1, #1 - bne _02309644 - ldrsh r0, [r5, #4] - bl GetTeamMember - ldrsh r4, [r0, #4] - b _02309658 -_02309644: - cmp r1, #2 - bne _02309658 - ldrsh r0, [r5, #4] - bl GetActiveTeamMember - ldrsh r4, [r0, #0xc] -_02309658: - mov r0, r5 - bl ov11_0230A044 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r5, r0 - ldr r1, [r1] - ldr r0, [r1, #0x114 + OV11_02309084_OFFSET] - sub r0, r0, #1 - cmp r0, #1 - movls r0, #0x1a - strls r0, [r1] - bls _02309D74 - bl GetGameMode - cmp r0, #5 - beq _023096D0 - cmp r4, #0x140 - bne _023096D0 - mov r0, r5 - mov r1, r4 - bl StrcmpMonsterName - cmp r0, #0 - beq _023096D0 - ldr r0, _02309DA0 ; =ov11_02322DE0 - ldr r3, _02309DA4 ; =ov11_02322E28 - mov r1, #0x13 - mov r2, #0 - bl CreateParentMenuFromStringIds - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strb r0, [r1, #5] - b _023096F0 -_023096D0: - ldr r0, _02309DA0 ; =ov11_02322DE0 - ldr r3, _02309DA8 ; =ov11_02322E00 - mov r1, #0x13 - mov r2, #0 - bl CreateParentMenuFromStringIds - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strb r0, [r1, #5] -_023096F0: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #3 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309704: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r3, #0x1a - ldr r2, [r0] - sub r1, r3, #0x1b - str r3, [r2] - ldr r0, [r0] - str r1, [r0, #0x10] - b _02309D74 -_02309724: - ldrsb r0, [r3, #5] - bl IsParentMenuActive - cmp r0, #0 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #5] - bl GetSimpleMenuResult__0202AEA4 - mvn r1, #0 - cmp r0, r1 - beq _023097C8 - ldr r1, _02309D80 ; =ov11_02324D90 - cmp r0, #3 - ldr r2, [r1] - str r0, [r2, #0x14] - addls pc, pc, r0, lsl #2 - b _023097B4 -_02309768: ; jump table - b _02309778 ; case 0 - b _02309788 ; case 1 - b _02309798 ; case 2 - b _023097A8 ; case 3 -_02309778: - ldr r0, [r1] - mov r1, #4 - str r1, [r0] - b _023097B4 -_02309788: - ldr r0, [r1] - mov r1, #7 - str r1, [r0] - b _023097B4 -_02309798: - ldr r0, [r1] - mov r1, #0xc - str r1, [r0] - b _023097B4 -_023097A8: - ldr r0, [r1] - mov r1, #0xe - str r1, [r0] -_023097B4: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl sub_0202812C - b _023097D8 -_023097C8: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] -_023097D8: - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #5] - bl CloseParentMenu - b _02309D74 -_023097EC: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - ldrsh r0, [r4, #4] - bl GetActiveTeamMember - ldrb r0, [r0, #1] - cmp r0, #0 - movne r5, #1 - ldrsh r0, [r4, #4] - moveq r5, #0 - bl GetActiveTeamMember - mov r1, r0 - add r0, sp, #0xac - and r2, r5, #0xff - bl CreateMonsterSummaryFromTeamMember - add r0, sp, #0xac - mov r1, #3 - bl sub_0203F150 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #5 - ldr r3, [r1] - strb r0, [r3, #9] - ldr r0, [r1] - str r2, [r0] -_0230984C: - bl sub_0203F398 - cmp r0, #1 - bne _02309D74 - bl sub_0203F974 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r3, #1 - ldr r2, [r0] - mov r1, #6 - str r3, [r2, #0x18] - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_0230987C: - ldr r1, [r3, #0x18] - sub r0, r1, #1 - str r0, [r3, #0x18] - cmp r1, #0 - bne _02309D74 - bl sub_0203F990 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023098A8: - ldr r0, [r3, #0x10] -#ifdef JAPAN - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 -#else - add r0, r3, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20] -#endif - bl sub_0203FBD4 - mov r1, #0 - mov r2, r1 - mov r0, #9 - bl sub_0204018C - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #8 - ldr r3, [r1] - strb r0, [r3, #0xa] - ldr r0, [r1] - str r2, [r0] -_023098E4: - bl sub_020407EC - cmp r0, #1 - bne _02309934 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] - ldr r0, [r1, #0x10] - add r0, r1, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20 + OV11_02309084_OFFSET] - bl sub_0203FDEC - bl sub_020407C0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309934: - cmp r0, #2 - cmpne r0, #7 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] - ldr r0, [r1, #0x10] - add r1, r1, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - bl sub_0203FD38 - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - mov r2, #0x20 - add r0, r0, #0x1e - bl MemcpySimple - bl sub_02041094 - ldr r1, _02309D80 ; =ov11_02324D90 - ldr r1, [r1] - strh r0, [r1, #0x1c] - ldrsh r0, [r4, #4] - bl sub_0203FDEC - bl sub_020407C0 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xa] - bl CloseAdvancedTextBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xa - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023099B0: - ldrsb r0, [r3, #0xa] - bl sub_020307EC - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #8 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_023099CC: - ldrsh r2, [r3, #0x1c] - add r0, r3, #0x1e - mov r1, #4 - mov r3, #1 - bl sub_020417A8 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r2, #0xb - ldr r3, [r1] - strb r0, [r3, #0xb] - ldr r0, [r1] - str r2, [r0] -_023099F8: - bl sub_02041A18 - cmp r0, #1 - bne _02309D74 - bl sub_02041A00 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #0xb] - bl CloseScrollBox - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #7 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309A2C: - ldr r0, [r3, #0x10] - add r0, r3, r0, lsl #3 - add r0, r0, #0x100 - ldrsh r0, [r0, #0x20 + OV11_02309084_OFFSET] - bl GetActiveTeamMember - mov r1, r0 - ldrsh r0, [r1, #0xc] - ldrsh r2, [r1, #6] - add r1, r1, #0x4c - mov r3, #0 - bl PrintIqSkillsMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xd - ldr r0, [r0] - str r1, [r0] -_02309A68: - bl sub_02041B7C - cmp r0, #1 - bne _02309D74 - bl sub_020420F4 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309A8C: - bl ov11_0230D92C - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] - ldrsb r0, [r0, #4] - bl CloseParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xf - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309AB4: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x10 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309AD0: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r0, r1, r0, lsl #3 - bl ov11_0230A044 - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - mov r2, #0xa - add r0, r0, #0x3e - bl StrncpySimpleNoPad - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r1, [r0] -#ifdef JAPAN - add r0, r1, #0x48 -#else - add r0, r1, #0x52 -#endif - add r1, r1, #0x3e - bl StrcpySimple - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, #2 - ldr r3, [r1] - mov r2, #0 - add r1, r3, #0x3e -#ifdef JAPAN - add r3, r3, #0x48 -#else - add r3, r3, #0x52 -#endif - bl ShowKeyboard - bl ov11_02310BDC - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x11 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309B40: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x12 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309B5C: - bl GetKeyboardStatus - cmp r0, #3 - bne _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0xa - ldr r0, [r0] - str r1, [r0, #0x18] - bl GetKeyboardStringResult - ldr r2, _02309D80 ; =ov11_02324D90 - mov r1, r0 - ldr r0, [r2] - add r0, r0, #0x3e - bl StrcpySimple - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x13 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309BA4: - bl sub_02037468 - cmp r0, #0 - beq _02309D74 - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r3, [r0] - ldr r2, [r3, #0x18] - sub r1, r2, #1 - str r1, [r3, #0x18] - cmp r2, #0 - bgt _02309D74 - ldr r1, [r0] - mov r2, #0xa -#ifdef JAPAN - add r0, r1, #0x52 -#else - add r0, r1, #0x66 -#endif - add r1, r1, #0x3e - bl StrncpySimpleNoPadSafe - ldr r0, _02309D80 ; =ov11_02324D90 - ldr r0, [r0] -#ifdef JAPAN - add r0, r0, #0x52 -#else - add r0, r0, #0x66 -#endif - bl sub_0203909C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x14 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309C04: - ldr r0, [r3, #0x10] - add r1, r3, #0x11c + OV11_02309084_OFFSET - add r4, r1, r0, lsl #3 - mov r0, r4 - bl ov11_0230A044 - mov r5, r0 - bl sub_0203931C - mvn r1, #0 - cmp r0, r1 - beq _02309D74 - cmp r0, #0 - beq _02309C4C - cmp r0, #1 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0x15 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309C4C: - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, r5 - ldr r1, [r1] - mov r2, #0xa - add r1, r1, #0x3e - bl StrncpySimple - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, r5 - ldr r1, [r1] - mov r2, #0xa - add r1, r1, #0x3e - bl StrncpySimple - ldr r0, [r4] - cmp r0, #2 - bne _02309C90 - ldrsh r0, [r4, #4] - bl sub_02058794 -_02309C90: - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x16 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CA4: - bl sub_02039218 - cmp r0, #0 - beq _02309D74 - ldr r1, _02309D80 ; =ov11_02324D90 - mov r0, #2 - ldr r3, [r1] - mov r2, #0 - add r1, r3, #0x3e -#ifdef JAPAN - add r3, r3, #0x48 -#else - add r3, r3, #0x52 -#endif - bl ShowKeyboard - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x12 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CE0: - bl ov11_0230D92C - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x17 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309CF8: - bl ov11_0230D220 - cmp r0, #0 - bne _02309D74 - bl sub_02039218 - cmp r0, #0 - ldrne r0, _02309D80 ; =ov11_02324D90 - movne r1, #0x18 - ldrne r0, [r0] - strne r1, [r0] - b _02309D74 -_02309D20: - bl ov11_0230D000 - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x19 - ldr r0, [r0] - str r1, [r0] - b _02309D74 -_02309D38: - bl ov11_0230D220 - cmp r0, #0 - ldreq r0, _02309D80 ; =ov11_02324D90 - moveq r1, #0 - ldreq r0, [r0] - streq r1, [r0] - b _02309D74 -_02309D54: - ldrsb r0, [r3, #4] - bl CloseParentMenu - ldr r0, _02309D80 ; =ov11_02324D90 - mov r1, #0x1b - ldr r0, [r0] - str r1, [r0] -_02309D6C: - mov r0, #1 - b _02309D78 -_02309D74: - mov r0, #0 -_02309D78: - add sp, sp, #0x124 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02309D80: .word ov11_02324D90 -_02309D84: .word 0x00401833 -_02309D88: .word ov11_02322E58 -_02309D8C: .word ov11_02322E7C -_02309D90: .word ov11_02322EA0 -#ifdef JAPAN -_02309D94: .word 0x00002FF2 -_02309D98: .word 0x00000875 -#else -_02309D94: .word 0x000002F2 -_02309D98: .word 0x00000A3A -#endif -_02309D9C: .word ov11_02322DD0 -_02309DA0: .word ov11_02322DE0 -_02309DA4: .word ov11_02322E28 -_02309DA8: .word ov11_02322E00 - arm_func_end ov11_023090DC - - arm_func_start ov11_02309DAC -ov11_02309DAC: ; 0x02309DAC - ldr r1, _02309DF4 ; =ov11_02324D90 - ldr r1, [r1] - ldr r2, [r1, #0x10] -#ifdef JAPAN - add r3, r1, #0xfc -#else - add r3, r1, #0x11c -#endif - ldr r1, [r3, r2, lsl #3] - add r2, r3, r2, lsl #3 - cmp r1, #1 - moveq r1, #0 - streq r1, [r0] - ldreqsh r1, [r2, #4] - streqh r1, [r0, #4] - bxeq lr - cmp r1, #2 - moveq r1, #1 - streq r1, [r0] - ldreqsh r1, [r2, #4] - streqh r1, [r0, #4] - bx lr - .align 2, 0 -_02309DF4: .word ov11_02324D90 - arm_func_end ov11_02309DAC - - arm_func_start ov11_02309DF8 -ov11_02309DF8: ; 0x02309DF8 - stmdb sp!, {r3, lr} - ldr r0, _02309E20 ; =ov11_02324D90 - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _02309E20 ; =ov11_02324D90 - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_02309E20: .word ov11_02324D90 - arm_func_end ov11_02309DF8 - - arm_func_start ov11_02309E24 -ov11_02309E24: ; 0x02309E24 - ldr r0, _02309E44 ; =ov11_02324D90 - ldr r0, [r0] - cmp r0, #0 - ldrne r0, [r0, #0x10] - movne r0, r0, lsl #0x10 - movne r0, r0, asr #0x10 - mvneq r0, #0 - bx lr - .align 2, 0 -_02309E44: .word ov11_02324D90 - arm_func_end ov11_02309E24 - - arm_func_start ov11_02309E48 -ov11_02309E48: ; 0x02309E48 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r0, #0x34 - mov r1, #0 - mov r5, #1 - bl MemAlloc - mov r1, #2 - mov r4, r0 - bl ov11_02309EE4 - mov r6, #0 - b _02309EBC -_02309E74: - ldr r0, [r4, r6, lsl #3] - add r1, r4, r6, lsl #3 - cmp r0, #1 - bne _02309E9C - ldrsh r0, [r1, #4] - mov r1, r7 - bl sub_02055FCC - cmp r0, #0 - bne _02309EC8 - b _02309EB8 -_02309E9C: - cmp r0, #2 - bne _02309EB8 - ldrsh r0, [r1, #4] - mov r1, r7 - bl sub_020586F0 - cmp r0, #0 - bne _02309EC8 -_02309EB8: - add r6, r6, #1 -_02309EBC: - ldr r0, [r4, #0x30] - cmp r6, r0 - blt _02309E74 -_02309EC8: - ldr r0, [r4, #0x30] - cmp r6, r0 - mov r0, r4 - moveq r5, #0 - bl MemFree - mov r0, r5 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov11_02309E48 - arm_func_start ov11_02309EE4 ov11_02309EE4: ; 0x02309EE4 stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} diff --git a/include/overlay_11_02307334.h b/include/overlay_11_02307334.h index f1187aa4..cbd2973d 100644 --- a/include/overlay_11_02307334.h +++ b/include/overlay_11_02307334.h @@ -32,5 +32,10 @@ void ov11_02308FEC(struct unk_02308F4C *a); s32 ov11_0230901C(struct unk_02308F4C *a); int ov11_02309040(s32 param_1); int ov11_02309084(s16 param_1); +int ov11_023090DC(void); +void ov11_02309DAC(struct unk_02309DAC *out); +void ov11_02309DF8(void); +s16 ov11_02309E24(void); +int ov11_02309E48(s16 param_1); #endif diff --git a/main.lsf b/main.lsf index 6382135a..bba8d585 100644 --- a/main.lsf +++ b/main.lsf @@ -658,7 +658,7 @@ Overlay OVY_11 Object src/overlay_11_022FE58C.o Object asm/overlay_11_022FE5F8.o Object src/overlay_11_02307334.o - Object asm/overlay_11_023090DC.o + Object asm/overlay_11_02309EE4.o Object src/overlay_11_0230CB88.o Object src/overlay_11_0230CD48.o Object asm/overlay_11_0230CE30.o diff --git a/src/overlay_11_02307334.c b/src/overlay_11_02307334.c index f8dc7c19..fe283c43 100644 --- a/src/overlay_11_02307334.c +++ b/src/overlay_11_02307334.c @@ -29,23 +29,115 @@ #include "main_0202B558.h" #include "main_02055410.h" #include "main_02056294.h" +#include "main_020526EC.h" +#include "main_0203755C.h" +#include "main_0200330C.h" +#include "main_020307A4.h" +#include "main_0202A66C.h" extern void sub_02056094(char *dst, struct ground_monster *ground_monster, bool8 is_leader); +struct unk_0202A690 { char *field_0x0; s32 field_0x4; }; +struct unk_0230A044 { s32 field_0x0; s16 field_0x4; }; +struct unk_02309EE4 { struct unk_0230A044 field_0x0[6]; s32 field_0x30; }; +struct unk_023090DC { + struct unk_02309EE4 field_0x0; + s32 field_0x34; + struct unk_0202A690 field_0x38[7]; + u8 field_0x70[6]; + char field_0x76[6][0x100]; +}; + struct unk_02324D90 { s32 field_0x0; + s8 field_0x4; + s8 field_0x5; + u8 field_0x6[3]; + s8 field_0x9; + s8 field_0xa; + s8 field_0xb; + u8 field_0xc[4]; + s32 field_0x10; + s32 field_0x14; + s32 field_0x18; + s16 field_0x1c; + u8 field_0x1e[0x20]; #ifdef JAPAN - u8 field_0x4[0xF0]; + u8 field_0x3e[0xA]; + u8 field_0x52[0xA]; + u8 field_0x66[0xA]; #else - u8 field_0x4[0x110]; + u8 field_0x3e[0x14]; + u8 field_0x52[0x14]; + u8 field_0x66[0x14]; #endif + u32 field_0x7c; + u8 field_0x80[4]; + s16 field_0x84; + u8 field_0x86[2]; + s32 field_0x88; + u8 field_0x8c[0x50]; + u8 *field_0xdc; + u8 field_0xe0[0x34]; s32 field_0x114; s16 field_0x118; - u8 field_0x11a[0x67A]; + u8 field_0x11a[2]; + struct unk_023090DC field_0x11c; }; extern struct unk_02324D90 *ov11_02324D90; extern char ov11_02322DB8[]; + +extern u8 ov11_02322DD0[]; +extern u8 ov11_02322DE0[]; +extern struct unk_0202A5CC ov11_02322E00[]; +extern struct unk_0202A5CC ov11_02322E28[]; +extern char ov11_02322E58[]; +extern char ov11_02322E7C[]; +extern char ov11_02322EA0[]; + +extern void CreateMonsterSummaryFromTeamMember(struct monster_summary *monster_summary, struct team_member *team_member, bool8 is_leader); +extern s32 GetKeyboardStatus(); +extern int PreprocessString(char* output, int output_size, const char* format, u16 flags, struct preprocessor_args* args); +extern void ShowKeyboard(s32 mode, u8 *, s32, u8 *); +extern void sub_0202B030(s8); +extern s32 sub_02037468(); +extern void sub_0203909C(u8 *name); +extern s32 sub_02039218(); +extern s32 sub_0203931C(); +extern u8 CreateParentMenu(void *a, u32 b, void *c, struct unk_0202A690 *items); +extern void ResumeParentMenu(s8 menu_id); +extern void PrintIqSkillsMenu(s16 monster_id, u32 *iq_skill_flags, s16 iq, s32 d); +extern void RecolorNameString(char *dst, const char *src, s32 mode); +extern s32 StrcmpMonsterName(u8 *name, s16 monster_id); +extern s32 sub_02028354(s8); +extern s8 sub_0203F150(struct monster_summary *summary, s32 b); +extern s32 sub_0203F398(void); +extern void sub_0203F974(void); +extern void sub_0203F990(void); +extern s8 sub_0204018C(s32 a, s32 b, s32 c); +extern s32 sub_02041A18(void); +extern s32 sub_02041B7C(void); +extern void sub_020420F4(void); +extern s32 sub_02053D1C(u16 move_id, s16 monster_id); +extern s32 sub_02055FCC(s16 a, s16 b); +extern s32 sub_020586F0(s16 a, s16 b); + +extern s32 ov11_02309EE4(struct unk_02309EE4 *out, s32 mode); +extern u8 *ov11_0230A044(struct unk_0230A044 *entry); +extern void ov11_0230D000(void); +extern s32 ov11_0230D220(void); +extern void ov11_0230D92C(void); +extern void ov11_02310BDC(void); + +#ifdef JAPAN +#define OV11_023090DC_CONST_1 0x2FF2 +#define OV11_023090DC_CONST_2 0x875 +#else +#define OV11_023090DC_CONST_1 0x2F2 +#define OV11_023090DC_CONST_2 0xA3A +#endif + extern s32 sub_02055894(struct ground_monster *member); extern bool8 sub_020564B0(int idx); extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); @@ -92,27 +184,21 @@ struct unk_02324D8C { extern struct unk_02324D8C *ov11_02324D8C; -struct unk_02322D38 { - u16 field_0x0; - u16 field_0x2; - u32 field_0x4; -}; - -extern struct unk_02322D38 ov11_02322D38[]; +extern struct unk_0202A5CC ov11_02322D38[]; extern s32 ov11_02322C78; extern s32 ov11_02322C88; extern s32 ov11_02322C98; extern s32 ov11_02322CA8; extern s32 ov11_02322CB8; extern s32 ov11_02322CC8; -extern s32 ov11_02322CD8; +extern struct unk_0202A5CC ov11_02322CD8[]; extern s32 ov11_02322CF0; -extern s32 ov11_02322D10; -extern s32 ov11_02322D60; -extern s32 ov11_02322D88; +extern struct unk_0202A5CC ov11_02322D10[]; +extern struct unk_0202A5CC ov11_02322D60[]; +extern struct unk_0202A5CC ov11_02322D88[]; extern u8 ov11_02322DB0[]; -extern void CloseScrollBox(s8); extern void CloseTextBox2(s8); extern u8 CreateParentMenuFromStringIds(void *, u32, void *, void *); extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); +extern void CloseScrollBox(s8); extern void CloseTextBox2(s8);extern s8 CreateScrollBoxSingle(void *, s32, s32, s32, void *, s32, void *); extern s8 CreateSimpleMenuFromStringIds(void *, s32, s32, void *, s32); extern s8 CreateTextBox(void *, void *); extern void GetPressedButtons(u32, u16 *); extern s32 GetSimpleMenuResult__0202AEA4(s8); extern void InitPreprocessorArgs(struct preprocessor_args *); @@ -124,11 +210,6 @@ extern bool8 IsBagNotEmpty(void); extern u8 PopInventoryMenuField0x1A3(s32 window_id); extern void SortItemsInBag(void); extern void *memcpy(void *, const void *, u32); -extern int ov11_023090DC(void); -extern void ov11_02309DAC(void *out); -extern void ov11_02309DF8(void); -extern s16 ov11_02309E24(void); -extern int ov11_02309E48(s16); extern s32 ov11_02307300(s32, s32, s32); extern s32 sub_020037A4(void); extern void sub_0203FD14(u16 move_id); @@ -269,11 +350,11 @@ s32 ov11_02307334(void) menu_a.c = ov11_02324D8C->field_0x276; ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CB8, 0x400213, &menu_a, ov11_02322D38); } else if (IsGummi(ov11_02324D8C->field_0x24e) && v8 != 4 && v8 != 5) { - ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CB8, 0x400013, 0, &ov11_02322D88); + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CB8, 0x400013, 0, ov11_02322D88); } else if (v6->held_by) { - ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, &ov11_02322D10); + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, ov11_02322D10); } else { - ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, &ov11_02322D60); + ov11_02324D8C->field_0x6 = CreateParentMenuFromStringIds(&ov11_02322CA8, 0x400013, 0, ov11_02322D60); } ov11_02324D8C->field_0x0 = 3; } else { @@ -315,7 +396,7 @@ s32 ov11_02307334(void) ov11_02324D8C->field_0x0 = 9; } else if (v1 == 2) { menu_b.b = 5; - ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(&ov11_02322C98, 0x33, &menu_b, &ov11_02322CD8); + ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(&ov11_02322C98, 0x33, &menu_b, ov11_02322CD8); ov11_02324D8C->field_0x0 = 4; } else if (v1 == 6) { ov11_02308D48(); @@ -640,7 +721,7 @@ s32 ov11_02307334(void) } case 37: { menu_b.b = 5; - ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(0, 0x33, &menu_b, &ov11_02322CD8); + ov11_02324D8C->field_0x7 = CreateParentMenuFromStringIds(0, 0x33, &menu_b, ov11_02322CD8); ov11_02324D8C->field_0x0 = 0x26; break; } @@ -1045,3 +1126,527 @@ int ov11_02309084(s16 param_1) ov11_02324D90->field_0x118 = param_1; return 1; } + +int ov11_023090DC(void) +{ + struct monster_summary summary; + struct preprocessor_args args; + char buf[0x42]; + u16 buttons; + + switch (ov11_02324D90->field_0x0) { + case 0: { + struct unk_02324D90 *p = ov11_02324D90; + struct unk_023090DC *lst; + s32 mode; + struct unk_0230A044 *e; + u16 move_id; + struct unk_0202A690 *w; + s32 n; + s32 k; + s32 i; + s32 q; + u32 flags; + s16 item_id; + s16 monster_id; + s32 v_sel; + bool8 v_flag; + + mode = p->field_0x114; + v_flag = 0; + n = v_flag; + lst = &p->field_0x11c; + v_sel = n; + item_id = p->field_0x118; + flags = 0x00401833; + w = lst->field_0x38; + ov11_02309EE4(&lst->field_0x0, mode); + + for (i = 0; i < lst->field_0x0.field_0x30; i++) { + lst->field_0x70[i] = 0; + } + + if (mode == 2) { + for (i = 0; i < lst->field_0x0.field_0x30; i++) { + e = &lst->field_0x0.field_0x0[i]; + move_id = GetItemMoveId16(item_id); + + if (e->field_0x0 == 1) { + struct ground_monster *gm = GetTeamMember(e->field_0x4); + + monster_id = gm->id; + for (k = 0; k < 4; k++) { + bool8 exists = (gm->moves[k].flags0 & 1) != 0; + + if (exists) { + if (move_id == gm->moves[k].id) { + break; + } + } + } + } else if (e->field_0x0 == 2) { + struct team_member *tm = GetActiveTeamMember(e->field_0x4); + + monster_id = tm->id; + for (k = 0; k < 4; k++) { + bool8 exists = (tm->moves[k].flags0 & 1) != 0; + + if (exists) { + if (move_id == tm->moves[k].id) { + break; + } + } + } + } + if (sub_02053D1C(move_id, monster_id)) { + if (k < 4) { + lst->field_0x70[i] = 3; + } + } else { + lst->field_0x70[i] = 3; + } + } + } + + for (i = 0; i < lst->field_0x0.field_0x30; i++) { + e = &lst->field_0x0.field_0x0[i]; + + if (e->field_0x0 == 1) { + struct ground_monster *gm = GetTeamMember(e->field_0x4); + + args.flag_vals[0] = e->field_0x4 | 0x20000; + args.number_vals[0] = GetDexNumber(gm->id); + RecolorNameString(buf, gm->name, 0); + args.strings[0] = buf; + } else if (e->field_0x0 == 2) { + struct team_member *tm = GetActiveTeamMember(e->field_0x4); + + args.flag_vals[0] = e->field_0x4 | 0x30000; + args.number_vals[0] = GetDexNumber(tm->id); + RecolorNameString(buf, tm->name, 0); + args.strings[0] = buf; + } + + if (mode == 1) { + q = n * 0x100; + PreprocessString(lst->field_0x76[n], 0x100, ov11_02322E58, 0, &args); + } else if (mode == 2) { + if (lst->field_0x70[i] & 2) { + q = n * 0x100; + PreprocessString(lst->field_0x76[n], 0x100, ov11_02322E7C, 0, &args); + } else { + q = n * 0x100; + PreprocessString(lst->field_0x76[n], 0x100, ov11_02322E58, 0, &args); + } + } else { + q = n * 0x100; + PreprocessString(lst->field_0x76[n], 0x100, ov11_02322EA0, 0, &args); + } + + if (lst->field_0x70[i] == 0 && v_flag == 0) { + v_flag = 1; + v_sel = i; + } + n++; + w->field_0x0 = lst->field_0x76[0] + q; + w->field_0x4 = i; + w++; + } + w->field_0x0 = 0; + w->field_0x4 = -1; + lst->field_0x34 = v_sel; + + ov11_02324D90->field_0x88 = 0x10; + ov11_02324D90->field_0x7c = 0; + if (ov11_02324D90->field_0x114 == 1) { + ov11_02324D90->field_0x84 = OV11_023090DC_CONST_1; + } else if (ov11_02324D90->field_0x114 == 2) { + ov11_02324D90->field_0x84 = OV11_023090DC_CONST_1; + flags |= 0x200; + ov11_02324D90->field_0xdc = ov11_02324D90->field_0x11c.field_0x70; + ov11_02324D90->field_0x7c = ov11_02324D90->field_0x11c.field_0x34; + } else { + ov11_02324D90->field_0x84 = OV11_023090DC_CONST_2; + } + ov11_02324D90->field_0x4 = + CreateParentMenu(ov11_02322DD0, flags, &ov11_02324D90->field_0x7c, + ov11_02324D90->field_0x11c.field_0x38); + ov11_02324D90->field_0x0 = 1; + break; + } + + case 2: + if (sub_02028354(ov11_02324D90->field_0x4) == 3) { + sub_0202810C(ov11_02324D90->field_0x4); + } + ResumeParentMenu(ov11_02324D90->field_0x4); + ov11_02324D90->field_0x0 = 1; + break; + + case 1: { + s32 mode = ov11_02324D90->field_0x114; + s32 r; + s32 cond; + + GetPressedButtons(0, &buttons); + cond = (buttons & 8) && mode == 0; + if (cond) { + ov11_02324D90->field_0x10 = + ov11_02324D90->field_0x11c.field_0x38[GetWindowIdSelectedItemOnPage( + ov11_02324D90->field_0x4)].field_0x4; + sub_0202B030(ov11_02324D90->field_0x4); + sub_0202812C(ov11_02324D90->field_0x4); + ov11_02324D90->field_0x0 = 4; + break; + } + if (IsParentMenuActive(ov11_02324D90->field_0x4)) { + break; + } + r = GetSimpleMenuResult__0202AEA4(ov11_02324D90->field_0x4); + if (r >= 0) { + struct unk_0230A044 *e; + s16 id; + u8 *name; + + ov11_02324D90->field_0x10 = r; + e = &ov11_02324D90->field_0x11c.field_0x0.field_0x0[r]; + if (e->field_0x0 == 1) { + id = GetTeamMember(e->field_0x4)->id; + } else if (e->field_0x0 == 2) { + id = GetActiveTeamMember(e->field_0x4)->id; + } + name = ov11_0230A044(e); + if (ov11_02324D90->field_0x114 == 1 || ov11_02324D90->field_0x114 == 2) { + ov11_02324D90->field_0x0 = 0x1a; + break; + } + if (GetGameMode() != GAME_MODE_5 && id == 0x140 && + StrcmpMonsterName(name, id)) { + ov11_02324D90->field_0x5 = CreateParentMenuFromStringIds( + ov11_02322DE0, 0x13, 0, ov11_02322E28); + } else { + ov11_02324D90->field_0x5 = CreateParentMenuFromStringIds( + ov11_02322DE0, 0x13, 0, ov11_02322E00); + } + ov11_02324D90->field_0x0 = 3; + } else { + ov11_02324D90->field_0x0 = 0x1a; + ov11_02324D90->field_0x10 = -1; + } + break; + } + + case 3: { + s32 r; + + if (IsParentMenuActive(ov11_02324D90->field_0x5)) { + break; + } + r = GetSimpleMenuResult__0202AEA4(ov11_02324D90->field_0x5); + if (r != -1) { + ov11_02324D90->field_0x14 = r; + switch (r) { + case 0: + ov11_02324D90->field_0x0 = 4; + break; + case 1: + ov11_02324D90->field_0x0 = 7; + break; + case 2: + ov11_02324D90->field_0x0 = 0xc; + break; + case 3: + ov11_02324D90->field_0x0 = 0xe; + break; + } + sub_0202812C(ov11_02324D90->field_0x4); + } else { + ov11_02324D90->field_0x0 = 2; + } + CloseParentMenu(ov11_02324D90->field_0x5); + break; + } + + case 4: { + struct unk_0230A044 *e = + &ov11_02324D90->field_0x11c.field_0x0.field_0x0[ov11_02324D90->field_0x10]; + s32 leader = GetActiveTeamMember(e->field_0x4)->is_leader != 0; + + CreateMonsterSummaryFromTeamMember(&summary, + GetActiveTeamMember(e->field_0x4), + leader); + ov11_02324D90->field_0x9 = sub_0203F150(&summary, 3); + ov11_02324D90->field_0x0 = 5; + } + + case 5: + if (sub_0203F398() != 1) { + break; + } + sub_0203F974(); + ov11_02324D90->field_0x18 = 1; + ov11_02324D90->field_0x0 = 6; + break; + + case 6: + if (ov11_02324D90->field_0x18-- != 0) { + break; + } + sub_0203F990(); + ov11_02324D90->field_0x0 = 2; + break; + + case 7: +#ifdef JAPAN + sub_0203FBD4(ov11_02324D90->field_0x10); +#else + sub_0203FBD4(ov11_02324D90->field_0x11c.field_0x0 + .field_0x0[ov11_02324D90->field_0x10] + .field_0x4); +#endif + ov11_02324D90->field_0xa = sub_0204018C(9, 0, 0); + ov11_02324D90->field_0x0 = 8; + + case 8: { + s32 r = sub_020407EC(); + + if (r == 1) { + sub_0203FDEC(ov11_02324D90->field_0x11c.field_0x0 + .field_0x0[ov11_02324D90->field_0x10] + .field_0x4); + sub_020407C0(); + CloseAdvancedTextBox(ov11_02324D90->field_0xa); + ov11_02324D90->field_0x0 = 2; + break; + } + if (r == 2 || r == 7) { + struct unk_0230A044 *e = + &ov11_02324D90->field_0x11c.field_0x0.field_0x0[ov11_02324D90->field_0x10]; + + MemcpySimple(ov11_02324D90->field_0x1e, sub_0203FD38(), 0x20); + ov11_02324D90->field_0x1c = sub_02041094(); + sub_0203FDEC(e->field_0x4); + sub_020407C0(); + CloseAdvancedTextBox(ov11_02324D90->field_0xa); + ov11_02324D90->field_0x0 = 0xa; + } + break; + } + + case 9: + sub_020307EC(ov11_02324D90->field_0xa); + ov11_02324D90->field_0x0 = 8; + break; + + case 10: + ov11_02324D90->field_0xb = sub_020417A8(ov11_02324D90->field_0x1e, 4, + ov11_02324D90->field_0x1c, 1); + ov11_02324D90->field_0x0 = 0xb; + + case 11: + if (sub_02041A18() != 1) { + break; + } + sub_02041A00(); + CloseScrollBox(ov11_02324D90->field_0xb); + ov11_02324D90->field_0x0 = 7; + break; + + case 12: { + struct team_member *tm = + GetActiveTeamMember(ov11_02324D90->field_0x11c.field_0x0 + .field_0x0[ov11_02324D90->field_0x10] + .field_0x4); + + PrintIqSkillsMenu(tm->id, tm->iq_skill_flags, tm->iq, 0); + ov11_02324D90->field_0x0 = 0xd; + } + + case 13: + if (sub_02041B7C() != 1) { + break; + } + sub_020420F4(); + ov11_02324D90->field_0x0 = 2; + break; + + case 14: + ov11_0230D92C(); + CloseParentMenu(ov11_02324D90->field_0x4); + ov11_02324D90->field_0x0 = 0xf; + break; + + case 15: + if (ov11_0230D220() == 0) { + ov11_02324D90->field_0x0 = 0x10; + } + break; + + case 16: + StrncpySimpleNoPad( + ov11_02324D90->field_0x3e, + ov11_0230A044(&ov11_02324D90->field_0x11c.field_0x0 + .field_0x0[ov11_02324D90->field_0x10]), + 10); + StrcpySimple(ov11_02324D90->field_0x52, ov11_02324D90->field_0x3e); + ShowKeyboard(2, ov11_02324D90->field_0x3e, 0, ov11_02324D90->field_0x52); + ov11_02310BDC(); + ov11_02324D90->field_0x0 = 0x11; + break; + + case 17: + if (ov11_0230D220() == 0) { + ov11_02324D90->field_0x0 = 0x12; + } + break; + + case 18: + if (GetKeyboardStatus() != 3) { + break; + } + ov11_02324D90->field_0x18 = 0xa; + StrcpySimple(ov11_02324D90->field_0x3e, (u8 *)GetKeyboardStringResult()); + ov11_02324D90->field_0x0 = 0x13; + break; + + case 19: + if (!sub_02037468()) { + break; + } + if (ov11_02324D90->field_0x18-- > 0) { + break; + } + StrncpySimpleNoPadSafe(ov11_02324D90->field_0x66, + ov11_02324D90->field_0x3e, 10); + sub_0203909C(ov11_02324D90->field_0x66); + ov11_02324D90->field_0x0 = 0x14; + break; + + case 20: { + struct unk_0230A044 *e = + &ov11_02324D90->field_0x11c.field_0x0.field_0x0[ov11_02324D90->field_0x10]; + u8 *name = ov11_0230A044(e); + s32 r = sub_0203931C(); + + if (r == -1) { + break; + } + if (r != 0) { + if (r == 1) { + ov11_02324D90->field_0x0 = 0x15; + } + break; + } + StrncpySimple(name, ov11_02324D90->field_0x3e, 10); + StrncpySimple(name, ov11_02324D90->field_0x3e, 10); + if (e->field_0x0 == 2) { + sub_02058794(e->field_0x4); + } + ov11_02324D90->field_0x0 = 0x16; + break; + } + + case 21: + if (!sub_02039218()) { + break; + } + ShowKeyboard(2, ov11_02324D90->field_0x3e, 0, ov11_02324D90->field_0x52); + ov11_02324D90->field_0x0 = 0x12; + break; + + case 22: + ov11_0230D92C(); + ov11_02324D90->field_0x0 = 0x17; + break; + + case 23: + if (ov11_0230D220() != 0) { + break; + } + if (sub_02039218() != 0) { + ov11_02324D90->field_0x0 = 0x18; + } + break; + + case 24: + ov11_0230D000(); + ov11_02324D90->field_0x0 = 0x19; + break; + + case 25: + if (ov11_0230D220() == 0) { + ov11_02324D90->field_0x0 = 0; + } + break; + + case 26: + CloseParentMenu(ov11_02324D90->field_0x4); + ov11_02324D90->field_0x0 = 0x1b; + + case 27: + return 1; + } + return 0; +} + +void ov11_02309DAC(struct unk_02309DAC *out) +{ + struct unk_02324D90 *p = ov11_02324D90; + struct unk_0230A044 *list = p->field_0x11c.field_0x0.field_0x0; + struct unk_0230A044 *e = &list[p->field_0x10]; + + if (e->field_0x0 == 1) { + out->field_0x0 = 0; + out->field_0x4 = e->field_0x4; + return; + } + if (e->field_0x0 == 2) { + out->field_0x0 = 1; + out->field_0x4 = e->field_0x4; + } +} + +void ov11_02309DF8(void) +{ + if (ov11_02324D90 == NULL) { + return; + } + MemFree(ov11_02324D90); + ov11_02324D90 = NULL; +} + +s16 ov11_02309E24(void) +{ + if (ov11_02324D90 != NULL) { + return ov11_02324D90->field_0x10; + } + return -1; +} + +int ov11_02309E48(s16 param_1) +{ + struct unk_02309EE4 *p; + int found = 1; + s32 i; + + p = MemAlloc(sizeof(struct unk_02309EE4), 0); + ov11_02309EE4(p, 2); + for (i = 0; i < p->field_0x30; i++) { + struct unk_0230A044 *e = &p->field_0x0[i]; + + if (e->field_0x0 == 1) { + if (sub_02055FCC(e->field_0x4, param_1)) { + break; + } + } else if (e->field_0x0 == 2) { + if (sub_020586F0(e->field_0x4, param_1)) { + break; + } + } + } + if (i == p->field_0x30) { + found = 0; + } + MemFree(p); + return found; +}