Attempt to decompile func0f0f1d6c

This commit is contained in:
Ryan Dwyer
2022-01-23 09:52:35 +10:00
parent 8b669f5771
commit 65b1b19137
5 changed files with 142 additions and 62 deletions
+88 -26
View File
@@ -1627,38 +1627,38 @@ char *menuResolveDialogTitle(struct menudialog *dialog)
return menuResolveText(dialog->title, dialog);
}
void func0f0f15a4(u8 *arg0, u32 *arg1)
void func0f0f15a4(struct menuitem *item, s32 *arg1)
{
switch (*arg0) {
case 8:
case 9:
case 14:
case 20:
case 24:
switch (item->type) {
case MENUITEMTYPE_SLIDER:
case MENUITEMTYPE_CHECKBOX:
case MENUITEMTYPE_RANKING:
case MENUITEMTYPE_14:
case MENUITEMTYPE_18:
*arg1 = 1;
break;
#if VERSION < VERSION_PAL_FINAL
case 5:
case MENUITEMTYPE_SCROLLABLE:
#endif
case 23:
case 25:
case MENUITEMTYPE_MARQUEE:
case MENUITEMTYPE_CONTROLLER:
*arg1 = 2;
break;
case 2:
case MENUITEMTYPE_LIST:
#if VERSION >= VERSION_PAL_FINAL
case 5:
case MENUITEMTYPE_SCROLLABLE:
#endif
*arg1 = 3;
break;
case 12:
case MENUITEMTYPE_DROPDOWN:
*arg1 = 4;
break;
case 15:
case MENUITEMTYPE_PLAYERSTATS:
*arg1 = 5;
break;
case 13:
case 16:
case 22:
case MENUITEMTYPE_KEYBOARD:
case MENUITEMTYPE_10:
case MENUITEMTYPE_16:
*arg1 = 3;
break;
}
@@ -3583,6 +3583,68 @@ glabel func0f0f1d6c
);
#endif
// Mismatch: Goal stores index660 in v0 while the below stores it in v0
// initially but then all the increments in v1, resulting in one less
// instruction. Removing the + 1 from the assign to frame->unk04 or
// menu->unk6d8 causes the below to use v0 only, which is a closer
// match but is functionally incorrect.
//void func0f0f1d6c(struct menudialog *dialog, struct menuframe *frame, struct menu *menu)
//{
// s32 index660 = menu->unk6d8 - 1; // 64
// s32 index4fc = menu->unk65c;
// s32 numitems = 0;
// s32 numblocksthisitem; // 58
// struct menuitem *item = dialog->items;
// s16 totalblocksused = menu->unk81c;
//
// frame->unk05 = 0;
// frame->unk04 = index660 + 1;
// frame->unk06 = totalblocksused;
//
// if (item) {
// bool append = true;
//
// while (item->type != MENUITEMTYPE_END) {
// if (item->flags & MENUITEMFLAG_00000001) {
// append = true;
// }
//
// if (append) {
// frame->unk05++;
// index660++;
//
// menu->unk660[index660].unk00 = 0;
// menu->unk660[index660].unk02 = 0;
// menu->unk660[index660].unk04 = 0;
// menu->unk660[index660].unk08 = 0;
// menu->unk660[index660].unk06 = index4fc;
//
// append = false;
// }
//
// numblocksthisitem = -1;
// func0f0f15a4(item, &numblocksthisitem);
//
// if (numblocksthisitem != -1) {
// menu->unk4fc[index4fc].blockindex = totalblocksused;
// totalblocksused += (s16)numblocksthisitem;
// } else {
// menu->unk4fc[index4fc].blockindex = -1;
// }
//
// menu->unk4fc[index4fc].itemindex = numitems;
// menu->unk660[index660].unk08++;
// index4fc++;
// item++;
// numitems++;
// }
// }
//
// menu->unk6d8 = index660 + 1;
// menu->unk65c = index4fc;
// menu->unk81c = totalblocksused;
//}
#if VERSION >= VERSION_NTSC_1_0
GLOBAL_ASM(
glabel func0f0f1ef4
@@ -4497,11 +4559,11 @@ bool menuIsItemDisabled(struct menuitem *item, struct menuframe *frame)
s16 sp2c;
u32 stack[2];
if (item->param1 & 0x00000400) {
if (item->flags & MENUITEMFLAG_00000400) {
return true;
}
if (mpIsPlayerLockedOut(g_MpPlayerNum) && item->param1 & 0x00040000) {
if (mpIsPlayerLockedOut(g_MpPlayerNum) && item->flags & MENUITEMFLAG_00040000) {
return true;
}
@@ -4510,7 +4572,7 @@ bool menuIsItemDisabled(struct menuitem *item, struct menuframe *frame)
}
if (item->handler
&& (item->param1 & 0x00000004) == 0
&& (item->flags & MENUITEMFLAG_00000004) == 0
&& item->handler(MENUOP_CHECKDISABLED, item, &sp30)) {
return true;
}
@@ -4563,7 +4625,7 @@ struct menuitem *func0f0f26fc(s32 arg0, s32 arg1, struct menudialog *dialog, s32
s32 i;
for (i = 0, sum = 0; !done && i < g_Menus[g_MpPlayerNum].unk660[arg1].unk08; index++, i++) {
struct menuitem *item = &dialog->items[g_Menus[g_MpPlayerNum].unk4fc[index].unk02];
struct menuitem *item = &dialog->items[g_Menus[g_MpPlayerNum].unk4fc[index].itemindex];
if (func0f0f2674(item, frame, 1)) {
result = item;
@@ -5022,7 +5084,7 @@ void menuOpenDialog(struct menudialog *dialog, struct menuframe *frame, struct m
while (item->type != MENUITEMTYPE_END) {
if (item->handler
&& (item->param1 & 0x04) == 0
&& (item->flags & MENUITEMFLAG_00000004) == 0
&& item->handler(MENUOP_CHECKPREFOCUSED, item, &data1)) {
frame->focuseditem = item;
}
@@ -5033,7 +5095,7 @@ void menuOpenDialog(struct menudialog *dialog, struct menuframe *frame, struct m
// Run focus handler
if (frame->focuseditem
&& frame->focuseditem->handler
&& (frame->focuseditem->param1 & 0x04) == 0) {
&& (frame->focuseditem->flags & MENUITEMFLAG_00000004) == 0) {
frame->focuseditem->handler(MENUOP_FOCUS, frame->focuseditem, &data2);
}
@@ -22961,11 +23023,11 @@ void func0f0fa574(struct menuframe *frame)
for (j = 0; j < menu->unk660[index1].unk08; j++) {
s32 index2 = menu->unk660[index1].unk06 + j;
struct menuitem *item = &frame->dialog->items[menu->unk4fc[index2].unk02];
struct menuitem *item = &frame->dialog->items[menu->unk4fc[index2].itemindex];
union menuitemdata *data = NULL;
if (menu->unk4fc[index2].handlerdataindex != -1) {
data = (union menuitemdata *)&menu->handlerdatabuffer[menu->unk4fc[index2].handlerdataindex];
if (menu->unk4fc[index2].blockindex != -1) {
data = (union menuitemdata *)&menu->blocks[menu->unk4fc[index2].blockindex];
}
menuInitItem(item, data);
+30 -30
View File
@@ -2973,7 +2973,7 @@ bool menuTickItemList(struct menuitem *item, struct menuinputs *inputs, u32 arg2
return true;
}
if (item->param1 & 0x00200000) {
if (item->flags & MENUITEMFLAG_00200000) {
item->handler(MENUOP_GETOPTIONHEIGHT, item, &handlerdata2);
g_LineHeight = handlerdata2.list.value;
} else {
@@ -3104,7 +3104,7 @@ void menuInitItemDropdown(struct menuitem *item, union menuitemdata *data)
handler = item->handler;
if (item->param1 & 0x00200000) {
if (item->flags & MENUITEMFLAG_00200000) {
handler(MENUOP_GETOPTIONHEIGHT, item, &handlerdata2);
g_LineHeight = handlerdata2.dropdown.value;
} else {
@@ -3596,7 +3596,7 @@ bool menuTickItemDropdown(struct menuitem *item, struct menuframe *frame, struct
menuTickItemList(item, inputs, arg3, data);
if (mpIsPlayerLockedOut(g_MpPlayerNum)) {
if ((item->param1 & 0x00040000) || (frame->dialog->unk10 & 0x10)) {
if ((item->flags & MENUITEMFLAG_00040000) || (frame->dialog->unk10 & 0x10)) {
frame->dimmed = false;
}
}
@@ -4036,7 +4036,7 @@ glabel menuRenderOverlayDropdown
// }
//
// // 334
// if (item->param1 & 0x00000080) {
// if (item->flags & MENUITEMFLAG_00000080) {
// context.x = x + 30;
// }
//
@@ -4053,7 +4053,7 @@ glabel menuRenderOverlayDropdown
// // 380
// union handlerdata handlerdata; // 5c
//
// if (item->param1 & 0x00200000) {
// if (item->flags & MENUITEMFLAG_00200000) {
// union handlerdata handlerdata2; // 4c
// item->handler(MENUOP_GETOPTIONHEIGHT, item, &handlerdata2);
// g_LineHeight = handlerdata2.dropdown.value;
@@ -6639,7 +6639,7 @@ Gfx *menuRenderItemObjectives(Gfx *gdl, struct menurendercontext *context)
Gfx *menuRenderItemModel(Gfx *gdl, struct menurendercontext *context)
{
if (context->item->param1 & 0x00200000) {
if (context->item->flags & MENUITEMFLAG_00200000) {
struct menuitemrenderdata renderdata;
union handlerdata data;
@@ -6687,7 +6687,7 @@ Gfx *menuRenderItemLabel(Gfx *gdl, struct menurendercontext *context)
x = context->x + 10;
y = context->y + 2;
if (context->item->param1 & 0x00000010) {
if (context->item->flags & MENUITEMFLAG_00000010) {
x -= 6;
}
@@ -6697,13 +6697,13 @@ Gfx *menuRenderItemLabel(Gfx *gdl, struct menurendercontext *context)
return gdl;
}
if (context->item->param1 & 0x00000200) {
if (context->item->flags & MENUITEMFLAG_00000200) {
font1 = g_CharsHandelGothicXs;
font2 = g_FontHandelGothicXs;
y -= 2;
}
if (context->item->param1 & 0x00000020) {
if (context->item->flags & MENUITEMFLAG_00000020) {
// Center
s32 textheight;
s32 textwidth;
@@ -6711,7 +6711,7 @@ Gfx *menuRenderItemLabel(Gfx *gdl, struct menurendercontext *context)
x = context->x + (context->width - textwidth) / 2;
}
if (context->item->param1 & 0x00000100) {
if (context->item->flags & MENUITEMFLAG_00000100) {
if (context->frame->transitiontimer < 0) {
colour1 = g_MenuColourPalettes[context->frame->type].checkedunfocused;
} else {
@@ -6780,7 +6780,7 @@ Gfx *menuRenderItemLabel(Gfx *gdl, struct menurendercontext *context)
colour2 = colour1;
if (context->item->param1 & 0x01000000) {
if (context->item->flags & MENUITEMFLAG_01000000) {
union handlerdata data;
data.label.colour2 = colour2;
data.label.colour1 = colour1;
@@ -6800,7 +6800,7 @@ Gfx *menuRenderItemLabel(Gfx *gdl, struct menurendercontext *context)
gdl = textRenderProjected(gdl, &x, &y, text,
font1, font2, colour1, context->width, context->height, 0, 0);
if ((context->item->param1 & 0x00008000) == 0) {
if ((context->item->flags & MENUITEMFLAG_00008000) == 0) {
// Right side text
text = menuResolveText(context->item->param3, context->item);
@@ -6811,14 +6811,14 @@ Gfx *menuRenderItemLabel(Gfx *gdl, struct menurendercontext *context)
y = context->y + 2;
if (context->item->param1 & 0x00000200) {
if (context->item->flags & MENUITEMFLAG_00000200) {
y -= 2;
}
textMeasure(&textheight, &textwidth, text, font1, font2, 0);
x = context->x + context->width - textwidth - 10;
if (context->item->param1 & 0x00000010) {
if (context->item->flags & MENUITEMFLAG_00000010) {
x += 6;
}
@@ -6839,7 +6839,7 @@ Gfx *menuRenderItemLabel(Gfx *gdl, struct menurendercontext *context)
func0f153c88();
}
if (context->item->param1 & 0x00200000) {
if (context->item->flags & MENUITEMFLAG_00200000) {
struct menuitemrenderdata renderdata;
union handlerdata data;
@@ -7317,11 +7317,11 @@ const char var7f1adfb8[] = "";
// struct fontchar *font1 = g_CharsHandelGothicSm;
// struct font *font2 = g_FontHandelGothicSm;
//
// if (context->item->param1 & 0x00000010) {
// if (context->item->flags & MENUITEMFLAG_00000010) {
// x -= 6;
// }
//
// if (context->item->param1 & 0x00400000) {
// if (context->item->flags & MENUITEMFLAG_00400000) {
// font1 = g_CharsHandelGothicMd;
// font2 = g_FontHandelGothicMd;
// }
@@ -7392,7 +7392,7 @@ const char var7f1adfb8[] = "";
// g_MenuColourPalettes2[context->frame->type].disabled);
// }
//
// if (context->item->param1 & 0x00000020) {
// if (context->item->flags & MENUITEMFLAG_00000020) {
// // Center text
// s32 textheight;
// s32 textwidth;
@@ -7400,7 +7400,7 @@ const char var7f1adfb8[] = "";
// x = context->x + (context->width - textwidth) / 2;
// }
//
// if (context->item->param1 & 0x00400000) {
// if (context->item->flags & MENUITEMFLAG_00400000) {
// x += 35;
// y += 6;
// }
@@ -7409,7 +7409,7 @@ const char var7f1adfb8[] = "";
// gdl = textRenderProjected(gdl, &x, &y, text, font1, font2,
// leftcolour, context->width, context->height, 0, 0);
//
// if ((context->item->param1 & 0x00408000) == 0) {
// if ((context->item->flags & (MENUITEMFLAG_00008000 | MENUITEMFLAG_00400000)) == 0) {
// // Right side text
// text = menuResolveText(context->item->param3, context->item);
//
@@ -7435,11 +7435,11 @@ bool menuTickItemSelectable(struct menuitem *item, struct menuinputs *inputs, u3
if ((arg2 & 2) && inputs->select) {
menuPlaySound(MENUSOUND_SELECT);
if (item->param1 & 0x00000008) {
if (item->flags & MENUITEMFLAG_00000008) {
menuPopDialog();
}
if (item->param1 & 0x00000004) {
if (item->flags & MENUITEMFLAG_00000004) {
menuPushDialog((struct menudialog *)item->handler);
} else if (item->handler) {
union handlerdata data;
@@ -8139,7 +8139,7 @@ bool menuTickItemSlider(struct menuitem *item, struct menuframe *frame, struct m
index = 0;
}
if ((item->param1 & 0x00000800) == 0 && !g_Menus[g_MpPlayerNum].unk82c) {
if ((item->flags & MENUITEMFLAG_00000800) == 0 && !g_Menus[g_MpPlayerNum].unk82c) {
index = index + inputs->leftright;
} else {
f0 = data->slider.unk00 / 1000.0f;
@@ -8166,7 +8166,7 @@ bool menuTickItemSlider(struct menuitem *item, struct menuframe *frame, struct m
f2 = f14;
}
if ((item->param1 & 0x00000800) == 0 && f2 < 40) {
if ((item->flags & MENUITEMFLAG_00000800) == 0 && f2 < 40) {
if (g_Menus[g_MpPlayerNum].unk82c) {
index = index + inputs->leftright;
}
@@ -8291,9 +8291,9 @@ bool menuTickItemCarousel(struct menuitem *item, struct menuinputs *inputs, u32
bool done;
u32 stack;
if (((arg2 & 2) || (item->param1 & 0x04000000)) && item->handler) {
if (((arg2 & 2) || (item->flags & MENUITEMFLAG_04000000)) && item->handler) {
if (inputs->leftright != 0) {
if (mpIsPlayerLockedOut(g_MpPlayerNum) == 0 || (item->param1 & 0x00020000) == 0) {
if (mpIsPlayerLockedOut(g_MpPlayerNum) == 0 || (item->flags & MENUITEMFLAG_00020000) == 0) {
done = false;
item->handler(MENUOP_GETOPTIONCOUNT, item, &data);
@@ -8739,7 +8739,7 @@ glabel menuRenderItemCheckbox
// struct font *font2 = g_FontHandelGothicSm;
// struct fontchar *font1 = g_CharsHandelGothicSm;
//
// if (context->item->param1 & 0x00000200) {
// if (context->item->flags & MENUITEMFLAG_00000200) {
// font2 = g_FontHandelGothicXs;
// font1 = g_CharsHandelGothicXs;
// }
@@ -9745,7 +9745,7 @@ u32 var800711ec = 0x20000000;
// struct font *font2 = g_FontHandelGothicSm; // 5c
// struct fontchar *font1 = g_CharsHandelGothicSm; // 58
//
// if (context->item->param1 & 0x00000200) {
// if (context->item->flags & MENUITEMFLAG_00000200) {
// font2 = g_FontHandelGothicXs;
// font1 = g_CharsHandelGothicXs;
// }
@@ -9843,7 +9843,7 @@ u32 var800711ec = 0x20000000;
//
// func0f153d24();
//
// if (context->item->param1 & 0x00000800) {
// if (context->item->flags & MENUITEMFLAG_00000800) {
// func0f153ce8(context->x, context->x + context->width, 0xe);
// } else {
// func0f153ce8(context->x, context->x, 0xe);
@@ -9967,7 +9967,7 @@ bool menuTickItemMarquee(struct menuitem *item, union menuitemdata *data)
font2 = g_FontHandelGothicSm;
font1 = g_CharsHandelGothicSm;
if (item->param1 & 0x00000200) {
if (item->flags & MENUITEMFLAG_00000200) {
font2 = g_FontHandelGothicXs;
font1 = g_CharsHandelGothicXs;
}
+18
View File
@@ -1427,6 +1427,24 @@
#define MENUDIALOGTYPE_DANGER 2
#define MENUDIALOGTYPE_SUCCESS 3
#define MENUITEMFLAG_00000001 0x00000001
#define MENUITEMFLAG_00000004 0x00000004
#define MENUITEMFLAG_00000008 0x00000008
#define MENUITEMFLAG_00000010 0x00000010
#define MENUITEMFLAG_00000020 0x00000020
#define MENUITEMFLAG_00000080 0x00000080
#define MENUITEMFLAG_00000100 0x00000100
#define MENUITEMFLAG_00000200 0x00000200
#define MENUITEMFLAG_00000400 0x00000400
#define MENUITEMFLAG_00000800 0x00000800
#define MENUITEMFLAG_00008000 0x00008000
#define MENUITEMFLAG_00020000 0x00020000
#define MENUITEMFLAG_00040000 0x00040000
#define MENUITEMFLAG_00200000 0x00200000
#define MENUITEMFLAG_00400000 0x00400000
#define MENUITEMFLAG_01000000 0x01000000
#define MENUITEMFLAG_04000000 0x04000000
#define MENUITEMTYPE_LABEL 0x01
#define MENUITEMTYPE_LIST 0x02
#define MENUITEMTYPE_SELECTABLE 0x04
+1 -1
View File
@@ -22,7 +22,7 @@ void func0f0f1494(void);
char *menuResolveText(u32 thing, void *dialogoritem);
char *menuResolveParam2Text(struct menuitem *item);
char *menuResolveDialogTitle(struct menudialog *dialog);
void func0f0f15a4(u8 *arg0, u32 *arg1);
void func0f0f15a4(struct menuitem *item, s32 *arg1);
void func0f0f1618(struct menuitem *item, void *arg1, void *arg2, struct menuframe *frame);
void func0f0f1d6c(struct menudialog *dialog, struct menuframe *frame, struct menu *menu);
u32 func0f0f1ef4(void);
+5 -5
View File
@@ -3550,7 +3550,7 @@ union handlerdata {
struct menuitem {
u8 type;
u8 param;
u32 param1;
u32 flags;
s32 param2;
s32 param3;
@@ -3924,14 +3924,14 @@ struct perfectheadtexturelist {
struct menu4fc {
s16 unk00;
u8 unk02;
s8 handlerdataindex;
u8 itemindex;
s8 blockindex;
};
struct menu660 {
u16 unk00;
u16 unk02;
u16 unk04;
u8 unk04;
u16 unk06;
u8 unk08;
};
@@ -3946,7 +3946,7 @@ struct menu {
/*0x65c*/ s32 unk65c;
/*0x660*/ struct menu660 unk660[VERSION >= VERSION_NTSC_1_0 ? 12 : 10];
/*0x6d8*/ s32 unk6d8;
/*0x6dc*/ u32 handlerdatabuffer[80];
/*0x6dc*/ u32 blocks[80]; // for menuitemdata
/*0x81c*/ s32 unk81c;
/*0x820*/ u32 unk820;
/*0x824*/ u32 unk824;