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 <noreply@anthropic.com>
This commit is contained in:
cecilarmitais
2026-09-13 18:52:06 -07:00
parent 964beafb7d
commit 92774e8a2b
5 changed files with 637 additions and 1125 deletions

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}