From ec34c3a5cea197f365fe0ca13c833b6ef881b9c3 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 25 Sep 2020 20:15:39 +1000 Subject: [PATCH] Decompile menuTickItemDropdown --- src/game/game_0e5ce0.c | 173 +++++++++++---------------------- src/include/game/game_0e5ce0.h | 22 ++--- src/include/types.h | 14 +++ 3 files changed, 84 insertions(+), 125 deletions(-) diff --git a/src/game/game_0e5ce0.c b/src/game/game_0e5ce0.c index 3f72a8d57..55c9c42d9 100644 --- a/src/game/game_0e5ce0.c +++ b/src/game/game_0e5ce0.c @@ -2559,101 +2559,46 @@ glabel menuRenderItemDropdown /* f0e8134: 27bd0080 */ addiu $sp,$sp,0x80 ); -GLOBAL_ASM( -glabel menuTickItemDropdown -/* f0e8138: 27bdffc8 */ addiu $sp,$sp,-56 -/* f0e813c: afb10018 */ sw $s1,0x18($sp) -/* f0e8140: afb00014 */ sw $s0,0x14($sp) -/* f0e8144: 30ef0002 */ andi $t7,$a3,0x2 -/* f0e8148: 00a08025 */ or $s0,$a1,$zero -/* f0e814c: 00808825 */ or $s1,$a0,$zero -/* f0e8150: afbf001c */ sw $ra,0x1c($sp) -/* f0e8154: afa60040 */ sw $a2,0x40($sp) -/* f0e8158: 11e00047 */ beqz $t7,.L0f0e8278 -/* f0e815c: afa70044 */ sw $a3,0x44($sp) -/* f0e8160: 8c980010 */ lw $t8,0x10($a0) -/* f0e8164: 53000045 */ beqzl $t8,.L0f0e827c -/* f0e8168: 8fbf001c */ lw $ra,0x1c($sp) -/* f0e816c: 8cb9000c */ lw $t9,0xc($a1) -/* f0e8170: 53200018 */ beqzl $t9,.L0f0e81d4 -/* f0e8174: 8faf0040 */ lw $t7,0x40($sp) -/* f0e8178: 8ca80008 */ lw $t0,0x8($a1) -/* f0e817c: 00c02825 */ or $a1,$a2,$zero -/* f0e8180: 00e03025 */ or $a2,$a3,$zero -/* f0e8184: 54880013 */ bnel $a0,$t0,.L0f0e81d4 -/* f0e8188: 8faf0040 */ lw $t7,0x40($sp) -/* f0e818c: 0fc39d68 */ jal menuTickItemCustom -/* f0e8190: 8fa70048 */ lw $a3,0x48($sp) -/* f0e8194: 3c048007 */ lui $a0,%hi(g_MpPlayerNum) -/* f0e8198: 0fc62ff6 */ jal mpIsPlayerLockedOut -/* f0e819c: 8c841448 */ lw $a0,%lo(g_MpPlayerNum)($a0) -/* f0e81a0: 5040000c */ beqzl $v0,.L0f0e81d4 -/* f0e81a4: 8faf0040 */ lw $t7,0x40($sp) -/* f0e81a8: 8e290004 */ lw $t1,0x4($s1) -/* f0e81ac: 00095340 */ sll $t2,$t1,0xd -/* f0e81b0: 05420007 */ bltzl $t2,.L0f0e81d0 -/* f0e81b4: ae00000c */ sw $zero,0xc($s0) -/* f0e81b8: 8e0b0000 */ lw $t3,0x0($s0) -/* f0e81bc: 8d6c0010 */ lw $t4,0x10($t3) -/* f0e81c0: 318d0010 */ andi $t5,$t4,0x10 -/* f0e81c4: 51a00003 */ beqzl $t5,.L0f0e81d4 -/* f0e81c8: 8faf0040 */ lw $t7,0x40($sp) -/* f0e81cc: ae00000c */ sw $zero,0xc($s0) -.L0f0e81d0: -/* f0e81d0: 8faf0040 */ lw $t7,0x40($sp) -.L0f0e81d4: -/* f0e81d4: 91f80003 */ lbu $t8,0x3($t7) -/* f0e81d8: 5300000a */ beqzl $t8,.L0f0e8204 -/* f0e81dc: 8fae0040 */ lw $t6,0x40($sp) -/* f0e81e0: 8e19000c */ lw $t9,0xc($s0) -/* f0e81e4: 53200007 */ beqzl $t9,.L0f0e8204 -/* f0e81e8: 8fae0040 */ lw $t6,0x40($sp) -/* f0e81ec: ae00000c */ sw $zero,0xc($s0) -/* f0e81f0: 8fa80040 */ lw $t0,0x40($sp) -/* f0e81f4: 24040009 */ addiu $a0,$zero,0x9 -/* f0e81f8: 0fc3c27c */ jal menuPlaySound -/* f0e81fc: a1000003 */ sb $zero,0x3($t0) -/* f0e8200: 8fae0040 */ lw $t6,0x40($sp) -.L0f0e8204: -/* f0e8204: 91c90002 */ lbu $t1,0x2($t6) -/* f0e8208: 5120001c */ beqzl $t1,.L0f0e827c -/* f0e820c: 8fbf001c */ lw $ra,0x1c($sp) -/* f0e8210: 8e0a000c */ lw $t2,0xc($s0) -/* f0e8214: 240b0001 */ addiu $t3,$zero,0x1 -/* f0e8218: 02202025 */ or $a0,$s1,$zero -/* f0e821c: 51400004 */ beqzl $t2,.L0f0e8230 -/* f0e8220: ae0b000c */ sw $t3,0xc($s0) -/* f0e8224: 10000014 */ b .L0f0e8278 -/* f0e8228: ae00000c */ sw $zero,0xc($s0) -/* f0e822c: ae0b000c */ sw $t3,0xc($s0) -.L0f0e8230: -/* f0e8230: 0fc39e66 */ jal menuInitItemDropdown -/* f0e8234: 8fa50048 */ lw $a1,0x48($sp) -/* f0e8238: afa00024 */ sw $zero,0x24($sp) -/* f0e823c: 8e390010 */ lw $t9,0x10($s1) -/* f0e8240: 24040007 */ addiu $a0,$zero,0x7 -/* f0e8244: 02202825 */ or $a1,$s1,$zero -/* f0e8248: 0320f809 */ jalr $t9 -/* f0e824c: 27a60024 */ addiu $a2,$sp,0x24 -/* f0e8250: 3c0d8007 */ lui $t5,%hi(var800711a8) -/* f0e8254: 8dad11a8 */ lw $t5,%lo(var800711a8)($t5) -/* f0e8258: 8fac0024 */ lw $t4,0x24($sp) -/* f0e825c: 8fb80048 */ lw $t8,0x48($sp) -/* f0e8260: 24040009 */ addiu $a0,$zero,0x9 -/* f0e8264: 018d0019 */ multu $t4,$t5 -/* f0e8268: 00007812 */ mflo $t7 -/* f0e826c: a70f000e */ sh $t7,0xe($t8) -/* f0e8270: 0fc3c27c */ jal menuPlaySound -/* f0e8274: 00000000 */ nop -.L0f0e8278: -/* f0e8278: 8fbf001c */ lw $ra,0x1c($sp) -.L0f0e827c: -/* f0e827c: 8fb00014 */ lw $s0,0x14($sp) -/* f0e8280: 8fb10018 */ lw $s1,0x18($sp) -/* f0e8284: 27bd0038 */ addiu $sp,$sp,0x38 -/* f0e8288: 03e00008 */ jr $ra -/* f0e828c: 24020001 */ addiu $v0,$zero,0x1 -); +bool menuTickItemDropdown(struct menuitem *item, struct menuframe *frame, struct somemenuitemtickarg *arg2, u32 arg3, union menuitemtickdata *data) +{ + u32 stack; + + if ((arg3 & 2) && item->handler) { + if (frame->unk0c && item == frame->focuseditem) { + menuTickItemCustom(item, arg2, arg3, data); + + if (mpIsPlayerLockedOut(g_MpPlayerNum)) { + if ((item->param1 & 0x00040000) || (frame->dialog->unk10 & 0x10)) { + frame->unk0c = 0; + } + } + } + + if (arg2->unk03 && frame->unk0c) { + frame->unk0c = 0; + arg2->unk03 = 0; + menuPlaySound(MENUSOUND_TOGGLEOFF); + } + + if (arg2->unk02) { + if (frame->unk0c) { + frame->unk0c = 0; + } else { + union handlerdata handlerdata; + + frame->unk0c = 1; + menuInitItemDropdown(item, data); + + handlerdata.dropdown.value = 0; + item->handler(MENUOP_GETOPTIONVALUE, item, &handlerdata); + data->dropdown.unk0e = handlerdata.dropdown.value * var800711a8; + menuPlaySound(MENUSOUND_TOGGLEOFF); + } + } + } + + return true; +} GLOBAL_ASM( glabel func0f0e8290 @@ -5625,9 +5570,9 @@ const char var7f1adfb8[] = ""; // return func0f153780(gdl); //} -bool menuTickItemSelectable(struct menuitem *item, u8 *arg1, u32 arg2) +bool menuTickItemSelectable(struct menuitem *item, struct somemenuitemtickarg *arg1, u32 arg2) { - if ((arg2 & 2) && arg1[2]) { + if ((arg2 & 2) && arg1->unk02) { menuPlaySound(MENUSOUND_SELECT); if (item->param1 & 0x00000008) { @@ -7215,11 +7160,11 @@ glabel menuRenderItemCheckbox // return func0f153780(gdl); //} -bool menuTickItemCheckbox(struct menuitem *item, u8 *arg1, u32 arg2) +bool menuTickItemCheckbox(struct menuitem *item, struct somemenuitemtickarg *arg1, u32 arg2) { union handlerdata data; - if ((arg2 & 2) && arg1[2]) { + if ((arg2 & 2) && arg1->unk02) { if (item->handler && item->handler(MENUOP_GET, item, &data) == 1) { data.checkbox.value = 0; menuPlaySound(MENUSOUND_TOGGLEOFF); @@ -10905,23 +10850,23 @@ glabel menuRenderItemRanking /* f0ee570: 27bd01b0 */ addiu $sp,$sp,0x1b0 ); -bool menuTickItemRanking(s8 *arg0, u32 arg1, union menuitemtickdata *data) +bool menuTickItemRanking(struct somemenuitemtickarg *arg0, u32 arg1, union menuitemtickdata *data) { f32 floatval; s32 intval; if (arg1 & 2) { intval = 0; - floatval = arg0[5] < 0 ? -(f32)arg0[5] : arg0[5]; + floatval = arg0->unk05 < 0 ? -(f32)arg0->unk05 : arg0->unk05; if (floatval > 20) { floatval = (floatval - 20) / 5; floatval *= g_Vars.diffframe60f; - intval = arg0[5] < 0 ? (s32)floatval : -(s32)floatval; + intval = arg0->unk05 < 0 ? (s32)floatval : -(s32)floatval; } - intval += arg0[9] * 2 * g_Vars.diffframe60; + intval += arg0->unk09 * 2 * g_Vars.diffframe60; data->ranking.unk00 += intval; if (data->ranking.unk00 < 0) { @@ -11721,23 +11666,23 @@ glabel menuRenderItemPlayerStats /* f0ef1fc: 27bd00c8 */ addiu $sp,$sp,0xc8 ); -bool menuTickItemPlayerStats(struct menuitem *item, u32 *arg1, s8 *arg2, u32 arg3, union menuitemtickdata *data) +bool menuTickItemPlayerStats(struct menuitem *item, struct menuframe *frame, struct somemenuitemtickarg *arg2, u32 arg3, union menuitemtickdata *data) { f32 floatval; s32 intval; - if ((arg3 & 2) && arg1[3] == 0) { + if ((arg3 & 2) && frame->unk0c == 0) { intval = 0; - floatval = arg2[5] < 0 ? -(f32)arg2[5] : arg2[5]; + floatval = arg2->unk05 < 0 ? -(f32)arg2->unk05 : arg2->unk05; if (floatval > 20) { floatval = (floatval - 20) / 5; floatval *= g_Vars.diffframe60f; - intval = arg2[5] < 0 ? (s32)floatval : -(s32)floatval; + intval = arg2->unk05 < 0 ? (s32)floatval : -(s32)floatval; } - intval += arg2[9] * 2 * g_Vars.diffframe60; + intval += arg2->unk09 * 2 * g_Vars.diffframe60; data->dropdown.unk0c += intval; if (data->dropdown.unk0c < 0) { @@ -11745,7 +11690,7 @@ bool menuTickItemPlayerStats(struct menuitem *item, u32 *arg1, s8 *arg2, u32 arg } } - menuTickItemDropdown(item, arg1, arg2, arg3, data); + menuTickItemDropdown(item, frame, arg2, arg3, data); } GLOBAL_ASM( @@ -12561,20 +12506,20 @@ Gfx *menuRenderItem(Gfx *gdl, struct menurenderthing *thing) /** * Return true if default up/down/left/right/back behaviour should be used. */ -bool menuTickItem(struct menuitem *item, void *arg1, void *arg2, u32 arg3, union menuitemtickdata *data) +bool menuTickItem(struct menuitem *item, struct menuframe *frame, struct somemenuitemtickarg *arg2, u32 arg3, union menuitemtickdata *data) { switch (item->type) { case MENUITEMTYPE_CUSTOM: return menuTickItemCustom(item, arg2, arg3, data); case MENUITEMTYPE_SELECTABLE: return menuTickItemSelectable(item, arg2, arg3); - case MENUITEMTYPE_SLIDER: return menuTickItemSlider(item, arg1, arg2, arg3, data); + case MENUITEMTYPE_SLIDER: return menuTickItemSlider(item, frame, arg2, arg3, data); case MENUITEMTYPE_CHECKBOX: return menuTickItemCheckbox(item, arg2, arg3); - case MENUITEMTYPE_SCROLLABLE: return menuTickItemScrollable(item, arg1, arg2, arg3, data); + case MENUITEMTYPE_SCROLLABLE: return menuTickItemScrollable(item, frame, arg2, arg3, data); case MENUITEMTYPE_MARQUEE: return menuTickItemMarquee(item, data); case MENUITEMTYPE_RANKING: return menuTickItemRanking(arg2, arg3, data); - case MENUITEMTYPE_DROPDOWN: return menuTickItemDropdown(item, arg1, arg2, arg3, data); + case MENUITEMTYPE_DROPDOWN: return menuTickItemDropdown(item, frame, arg2, arg3, data); case MENUITEMTYPE_KEYBOARD: return menuTickItemKeyboard(item, arg2, arg3, data); case MENUITEMTYPE_CAROUSEL: return menuTickItemCarousel(item, arg2, arg3); - case MENUITEMTYPE_PLAYERSTATS: return menuTickItemPlayerStats(item, arg1, arg2, arg3, data); + case MENUITEMTYPE_PLAYERSTATS: return menuTickItemPlayerStats(item, frame, arg2, arg3, data); } return true; diff --git a/src/include/game/game_0e5ce0.h b/src/include/game/game_0e5ce0.h index 35ec6166b..58d7e6bc8 100644 --- a/src/include/game/game_0e5ce0.h +++ b/src/include/game/game_0e5ce0.h @@ -8,14 +8,14 @@ s32 func0f0e5ef8(s16 arg0, struct menuitem *item); u32 func0f0e6038(void); Gfx *func0f0e6298(Gfx *gdl, s16 x, s16 y, s16 x2, s16 y2); Gfx *menuRenderItemCustom(Gfx *gdl); -bool menuTickItemCustom(struct menuitem *item, void *arg1, u32 arg2, union menuitemtickdata *data); +bool menuTickItemCustom(struct menuitem *item, struct somemenuitemtickarg *arg1, u32 arg2, union menuitemtickdata *data); void menuInitItemDropdown(struct menuitem *item, union menuitemtickdata *data); Gfx *menuRenderItemDropdown(Gfx *gdl); -bool menuTickItemDropdown(struct menuitem *item, void *arg1, void *arg2, u32 arg3, union menuitemtickdata *data); +bool menuTickItemDropdown(struct menuitem *item, struct menuframe *frame, struct somemenuitemtickarg *arg2, u32 arg3, union menuitemtickdata *data); Gfx *func0f0e8290(Gfx *gdl, s16 x, s16 y, s16 x2, s16 y2, struct menuitem *item, u32 arg6, u32 arg7); u32 func0f0e855c(void); Gfx *menuRenderItemKeyboard(Gfx *gdl); -bool menuTickItemKeyboard(struct menuitem *item, void *arg1, u32 arg2, union menuitemtickdata *data); +bool menuTickItemKeyboard(struct menuitem *item, struct somemenuitemtickarg *arg1, u32 arg2, union menuitemtickdata *data); void menuInitItemKeyboard(struct menuitem *item, union menuitemtickdata *data); Gfx *menuRenderItemSeparator(Gfx *gdl, struct menurenderthing *thing); Gfx *menuRenderObjective(Gfx *gfx, struct menurenderthing10 *thing10, s32 index, s32 position, s32 x, s32 y, s32 width, s32 height, s32 arg8, s32 arg9); @@ -24,27 +24,27 @@ Gfx *menuRenderItemModel(Gfx *gdl, struct menurenderthing *thing); Gfx *menuRenderItemLabel(Gfx *gdl, struct menurenderthing *thing); Gfx *menuRenderItemMeter(Gfx *gdl, struct menurenderthing *thing); Gfx *menuRenderItemSelectable(Gfx *gdl, struct menurenderthing *thing); -bool menuTickItemSelectable(struct menuitem *item, u8 *arg1, u32 arg2); +bool menuTickItemSelectable(struct menuitem *item, struct somemenuitemtickarg *arg1, u32 arg2); Gfx *menuRenderItemSlider(Gfx *gdl); -bool menuTickItemSlider(struct menuitem *item, void *arg1, void *arg2, u32 arg3, union menuitemtickdata *data); +bool menuTickItemSlider(struct menuitem *item, struct menuframe *frame, struct somemenuitemtickarg *arg2, u32 arg3, union menuitemtickdata *data); void menuInitItemSlider(union menuitemtickdata *data); Gfx *menuRenderItemCarousel(Gfx *gdl, struct menurenderthing *thing); -bool menuTickItemCarousel(struct menuitem *item, void *arg1, u32 arg2); +bool menuTickItemCarousel(struct menuitem *item, struct somemenuitemtickarg *arg1, u32 arg2); Gfx *menuRenderItemCheckbox(Gfx *gdl, struct menurenderthing *thing); -bool menuTickItemCheckbox(struct menuitem *item, u8 *arg1, u32 arg2); +bool menuTickItemCheckbox(struct menuitem *item, struct somemenuitemtickarg *arg1, u32 arg2); char *menuItemScrollableGetText(u32 type); Gfx *menuRenderItemScrollable(Gfx *gdl, struct menurenderthing *thing); -bool menuTickItemScrollable(struct menuitem *item, void *arg1, void *arg2, u32 arg3, union menuitemtickdata *data); +bool menuTickItemScrollable(struct menuitem *item, struct menuframe *frame, struct somemenuitemtickarg *arg2, u32 arg3, union menuitemtickdata *data); void menuInitItemScrollable(union menuitemtickdata *data); Gfx *menuRenderItemMarquee(Gfx *gdl, struct menurenderthing *thing); bool menuTickItemMarquee(struct menuitem *item, union menuitemtickdata *data); void menuInitItemMarquee(union menuitemtickdata *data); Gfx *menuRenderItem07(Gfx *gdl); Gfx *menuRenderItemRanking(Gfx *gdl); -bool menuTickItemRanking(s8 *arg0, u32 arg1, union menuitemtickdata *data); +bool menuTickItemRanking(struct somemenuitemtickarg *arg0, u32 arg1, union menuitemtickdata *data); void menuInitItemRanking(union menuitemtickdata *data); Gfx *menuRenderItemPlayerStats(Gfx *gdl); -bool menuTickItemPlayerStats(struct menuitem *item, u32 *arg1, s8 *arg2, u32 arg3, union menuitemtickdata *data); +bool menuTickItemPlayerStats(struct menuitem *item, struct menuframe *frame, struct somemenuitemtickarg *arg2, u32 arg3, union menuitemtickdata *data); Gfx *func0f0ef2fc(Gfx *gdl, s16 x, s16 y, s16 x2, s16 y2, struct menuitem *item, u32 arg6, u32 arg7); void menuInitItemPlayerStats(struct menuitem *item, union menuitemtickdata *data); u32 func0f0ef394(void); @@ -56,7 +56,7 @@ Gfx *menuRenderControllerInfo(Gfx *gdl, struct menurenderthing *thing, s32 x, s3 Gfx *menuRenderItemController(Gfx *gdl, struct menurenderthing *thing); void menuInitItemController(union menuitemtickdata *data); Gfx *menuRenderItem(Gfx *gdl, struct menurenderthing *thing); -bool menuTickItem(struct menuitem *item, void *arg1, void *arg2, u32 arg3, union menuitemtickdata *data); +bool menuTickItem(struct menuitem *item, struct menuframe *frame, struct somemenuitemtickarg *arg2, u32 arg3, union menuitemtickdata *data); void menuInitItem(struct menuitem *item, union menuitemtickdata *data); Gfx *func0f0f0918(Gfx *gdl, s16 x, s16 y, s16 x2, s16 y2, struct menuitem *item, u32 arg6, u32 arg7); diff --git a/src/include/types.h b/src/include/types.h index e630c4c8e..9bf2ec757 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3266,6 +3266,7 @@ struct menuitemtickdata_dropdown { u16 unk08; u16 unk0a; s16 unk0c; + u16 unk0e; }; struct menuitemtickdata_keyboard { @@ -6937,4 +6938,17 @@ struct var800a45d0 { /*0x5c*/ u32 colour2; }; +struct somemenuitemtickarg { + /*0x00*/ u8 unk00; + /*0x01*/ u8 unk01; + /*0x02*/ u8 unk02; + /*0x03*/ u8 unk03; + /*0x04*/ u8 unk04; + /*0x05*/ s8 unk05; + /*0x06*/ u8 unk06; + /*0x07*/ u8 unk07; + /*0x08*/ u8 unk08; + /*0x09*/ s8 unk09; +}; + #endif