From 365541acfe0cc428155e8fae647f5284426df1ea Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 11 Sep 2020 19:26:48 +1000 Subject: [PATCH] Decompile menuOpenDialog and discover data argument for menu handlers --- src/game/endscreen.c | 8 +- src/game/game_0f09f0.c | 199 +++------------------------------ src/game/game_102240.c | 144 ++++++++++++------------ src/game/game_107fb0.c | 4 +- src/game/game_179060.c | 149 ++++++++++++------------ src/game/game_17f930.c | 6 +- src/game/game_1a3340.c | 68 +++++------ src/game/mplayer.c | 2 +- src/include/constants.h | 2 +- src/include/game/game_0f09f0.h | 2 +- src/include/game/mplayer.h | 2 +- src/include/types.h | 62 ++++++++-- 12 files changed, 256 insertions(+), 392 deletions(-) diff --git a/src/game/endscreen.c b/src/game/endscreen.c index e5c54c9ff..33675b5bd 100644 --- a/src/game/endscreen.c +++ b/src/game/endscreen.c @@ -60,7 +60,7 @@ s32 menudialogRetryMission(u32 operation, struct menudialog *dialog, union handl if (dialog == g_Menus[g_MpPlayerNum].curframe->dialog || (dialog->nextsibling && dialog->nextsibling == g_Menus[g_MpPlayerNum].curframe->dialog)) { #endif - struct menuthing *thing = data->ptrs[0]; + struct menuthing *thing = data->dialog2.ptr; bool pass = false; if (thing->unk03) { @@ -883,14 +883,14 @@ s32 menuhandlerEndscreenCheats(u32 operation, struct menuitem *item, union handl return 0; } - data->words[1] = colourBlend(data->words[1], g_CheatColour, weight); + data->label.colour2 = colourBlend(data->label.colour2, g_CheatColour, weight); if (item->param == 3) { // completion cheat name - data->words[0] = colourBlend(data->words[0], g_CheatColour, weight); + data->label.colour1 = colourBlend(data->label.colour1, g_CheatColour, weight); } if (item->param == 5) { // timed cheat name - data->words[0] = colourBlend(data->words[0], g_CheatColour, weight); + data->label.colour1 = colourBlend(data->label.colour1, g_CheatColour, weight); } } diff --git a/src/game/game_0f09f0.c b/src/game/game_0f09f0.c index ac99ac3e8..1686d77e8 100644 --- a/src/game/game_0f09f0.c +++ b/src/game/game_0f09f0.c @@ -2796,179 +2796,12 @@ glabel func0f0f2c44 /* f0f2cf0: 00000000 */ nop ); -//GLOBAL_ASM( -//glabel func0f0f2cf4 -//.late_rodata -//glabel var7f1b2928 -//.word 0x40c90fdb -//.text -///* f0f2cf4: 27bdff98 */ addiu $sp,$sp,-104 -///* f0f2cf8: afbf0024 */ sw $ra,0x24($sp) -///* f0f2cfc: afb30020 */ sw $s3,0x20($sp) -///* f0f2d00: afb2001c */ sw $s2,0x1c($sp) -///* f0f2d04: afb10018 */ sw $s1,0x18($sp) -///* f0f2d08: afb00014 */ sw $s0,0x14($sp) -///* f0f2d0c: afa60070 */ sw $a2,0x70($sp) -///* f0f2d10: aca40000 */ sw $a0,0x0($a1) -///* f0f2d14: 3c02800a */ lui $v0,%hi(g_MenuData+0x4) -///* f0f2d18: 8c4219c4 */ lw $v0,%lo(g_MenuData+0x4)($v0) -///* f0f2d1c: 00a08825 */ or $s1,$a1,$zero -///* f0f2d20: 24010002 */ addiu $at,$zero,0x2 -///* f0f2d24: 1041000d */ beq $v0,$at,.L0f0f2d5c -///* f0f2d28: 02202825 */ or $a1,$s1,$zero -///* f0f2d2c: 24010003 */ addiu $at,$zero,0x3 -///* f0f2d30: 10410008 */ beq $v0,$at,.L0f0f2d54 -///* f0f2d34: 240e0001 */ addiu $t6,$zero,0x1 -///* f0f2d38: 2401000b */ addiu $at,$zero,0xb -///* f0f2d3c: 10410005 */ beq $v0,$at,.L0f0f2d54 -///* f0f2d40: 2401000d */ addiu $at,$zero,0xd -///* f0f2d44: 50410006 */ beql $v0,$at,.L0f0f2d60 -///* f0f2d48: a220006e */ sb $zero,0x6e($s1) -///* f0f2d4c: 10000004 */ b .L0f0f2d60 -///* f0f2d50: a220006e */ sb $zero,0x6e($s1) -//.L0f0f2d54: -///* f0f2d54: 10000002 */ b .L0f0f2d60 -///* f0f2d58: a22e006e */ sb $t6,0x6e($s1) -//.L0f0f2d5c: -///* f0f2d5c: a220006e */ sb $zero,0x6e($s1) -//.L0f0f2d60: -///* f0f2d60: 8fa60070 */ lw $a2,0x70($sp) -///* f0f2d64: 0fc3c75b */ jal func0f0f1d6c -///* f0f2d68: afa40068 */ sw $a0,0x68($sp) -///* f0f2d6c: 0fc3e95d */ jal func0f0fa574 -///* f0f2d70: 02202025 */ or $a0,$s1,$zero -///* f0f2d74: 8faf0068 */ lw $t7,0x68($sp) -///* f0f2d78: 3c01bf80 */ lui $at,0xbf80 -///* f0f2d7c: 44812000 */ mtc1 $at,$f4 -///* f0f2d80: 44803000 */ mtc1 $zero,$f6 -///* f0f2d84: 91f80000 */ lbu $t8,0x0($t7) -///* f0f2d88: e6240040 */ swc1 $f4,0x40($s1) -///* f0f2d8c: e6260048 */ swc1 $f6,0x48($s1) -///* f0f2d90: 0c004b70 */ jal random -///* f0f2d94: a238003c */ sb $t8,0x3c($s1) -///* f0f2d98: 44824000 */ mtc1 $v0,$f8 -///* f0f2d9c: 3c03800a */ lui $v1,%hi(g_Menus) -///* f0f2da0: 3c058007 */ lui $a1,%hi(g_MpPlayerNum) -///* f0f2da4: 24a51448 */ addiu $a1,$a1,%lo(g_MpPlayerNum) -///* f0f2da8: 2463e000 */ addiu $v1,$v1,%lo(g_Menus) -///* f0f2dac: 24060e70 */ addiu $a2,$zero,0xe70 -///* f0f2db0: 04410005 */ bgez $v0,.L0f0f2dc8 -///* f0f2db4: 468042a0 */ cvt.s.w $f10,$f8 -///* f0f2db8: 3c014f80 */ lui $at,0x4f80 -///* f0f2dbc: 44818000 */ mtc1 $at,$f16 -///* f0f2dc0: 00000000 */ nop -///* f0f2dc4: 46105280 */ add.s $f10,$f10,$f16 -//.L0f0f2dc8: -///* f0f2dc8: 3c012f80 */ lui $at,0x2f80 -///* f0f2dcc: 44819000 */ mtc1 $at,$f18 -///* f0f2dd0: 3c017f1b */ lui $at,%hi(var7f1b2928) -///* f0f2dd4: c4262928 */ lwc1 $f6,%lo(var7f1b2928)($at) -///* f0f2dd8: 46125102 */ mul.s $f4,$f10,$f18 -///* f0f2ddc: 44808000 */ mtc1 $zero,$f16 -///* f0f2de0: 02202025 */ or $a0,$s1,$zero -///* f0f2de4: 46062202 */ mul.s $f8,$f4,$f6 -///* f0f2de8: e628004c */ swc1 $f8,0x4c($s1) -///* f0f2dec: 8cb90000 */ lw $t9,0x0($a1) -///* f0f2df0: 03260019 */ multu $t9,$a2 -///* f0f2df4: 00004012 */ mflo $t0 -///* f0f2df8: 00684821 */ addu $t1,$v1,$t0 -///* f0f2dfc: 8d2a04f8 */ lw $t2,0x4f8($t1) -///* f0f2e00: a1400060 */ sb $zero,0x60($t2) -///* f0f2e04: 8cab0000 */ lw $t3,0x0($a1) -///* f0f2e08: 01660019 */ multu $t3,$a2 -///* f0f2e0c: 00006012 */ mflo $t4 -///* f0f2e10: 006c6821 */ addu $t5,$v1,$t4 -///* f0f2e14: 8dae04f8 */ lw $t6,0x4f8($t5) -///* f0f2e18: e5d00050 */ swc1 $f16,0x50($t6) -///* f0f2e1c: ae200054 */ sw $zero,0x54($s1) -///* f0f2e20: ae200058 */ sw $zero,0x58($s1) -///* f0f2e24: 0fc3ca23 */ jal func0f0f288c -///* f0f2e28: ae20005c */ sw $zero,0x5c($s1) -///* f0f2e2c: 8e2f0000 */ lw $t7,0x0($s1) -///* f0f2e30: ae220008 */ sw $v0,0x8($s1) -///* f0f2e34: 2412001a */ addiu $s2,$zero,0x1a -///* f0f2e38: 8df00008 */ lw $s0,0x8($t7) -///* f0f2e3c: 27b30044 */ addiu $s3,$sp,0x44 -///* f0f2e40: 92180000 */ lbu $t8,0x0($s0) -///* f0f2e44: 52580014 */ beql $s2,$t8,.L0f0f2e98 -///* f0f2e48: 8e250008 */ lw $a1,0x8($s1) -///* f0f2e4c: 8e020010 */ lw $v0,0x10($s0) -//.L0f0f2e50: -///* f0f2e50: 5040000d */ beqzl $v0,.L0f0f2e88 -///* f0f2e54: 92090014 */ lbu $t1,0x14($s0) -///* f0f2e58: 8e190004 */ lw $t9,0x4($s0) -///* f0f2e5c: 2404000f */ addiu $a0,$zero,0xf -///* f0f2e60: 02002825 */ or $a1,$s0,$zero -///* f0f2e64: 33280004 */ andi $t0,$t9,0x4 -///* f0f2e68: 55000007 */ bnezl $t0,.L0f0f2e88 -///* f0f2e6c: 92090014 */ lbu $t1,0x14($s0) -///* f0f2e70: 0040f809 */ jalr $v0 -///* f0f2e74: 02603025 */ or $a2,$s3,$zero -///* f0f2e78: 50400003 */ beqzl $v0,.L0f0f2e88 -///* f0f2e7c: 92090014 */ lbu $t1,0x14($s0) -///* f0f2e80: ae300008 */ sw $s0,0x8($s1) -///* f0f2e84: 92090014 */ lbu $t1,0x14($s0) -//.L0f0f2e88: -///* f0f2e88: 26100014 */ addiu $s0,$s0,0x14 -///* f0f2e8c: 5649fff0 */ bnel $s2,$t1,.L0f0f2e50 -///* f0f2e90: 8e020010 */ lw $v0,0x10($s0) -///* f0f2e94: 8e250008 */ lw $a1,0x8($s1) -//.L0f0f2e98: -///* f0f2e98: 50a0000c */ beqzl $a1,.L0f0f2ecc -///* f0f2e9c: 8fa70068 */ lw $a3,0x68($sp) -///* f0f2ea0: 8ca20010 */ lw $v0,0x10($a1) -///* f0f2ea4: 50400009 */ beqzl $v0,.L0f0f2ecc -///* f0f2ea8: 8fa70068 */ lw $a3,0x68($sp) -///* f0f2eac: 8caa0004 */ lw $t2,0x4($a1) -///* f0f2eb0: 2404000d */ addiu $a0,$zero,0xd -///* f0f2eb4: 314b0004 */ andi $t3,$t2,0x4 -///* f0f2eb8: 55600004 */ bnezl $t3,.L0f0f2ecc -///* f0f2ebc: 8fa70068 */ lw $a3,0x68($sp) -///* f0f2ec0: 0040f809 */ jalr $v0 -///* f0f2ec4: 27a60034 */ addiu $a2,$sp,0x34 -///* f0f2ec8: 8fa70068 */ lw $a3,0x68($sp) -//.L0f0f2ecc: -///* f0f2ecc: ae20000c */ sw $zero,0xc($s1) -///* f0f2ed0: ae200064 */ sw $zero,0x64($s1) -///* f0f2ed4: ae200068 */ sw $zero,0x68($s1) -///* f0f2ed8: 8ce2000c */ lw $v0,0xc($a3) -///* f0f2edc: 24040064 */ addiu $a0,$zero,0x64 -///* f0f2ee0: 00e02825 */ or $a1,$a3,$zero -///* f0f2ee4: 50400005 */ beqzl $v0,.L0f0f2efc -///* f0f2ee8: 00e02025 */ or $a0,$a3,$zero -///* f0f2eec: 0040f809 */ jalr $v0 -///* f0f2ef0: 27a60058 */ addiu $a2,$sp,0x58 -///* f0f2ef4: 8fa70068 */ lw $a3,0x68($sp) -///* f0f2ef8: 00e02025 */ or $a0,$a3,$zero -//.L0f0f2efc: -///* f0f2efc: 02202825 */ or $a1,$s1,$zero -///* f0f2f00: 0fc3c84d */ jal func0f0f2134 -///* f0f2f04: 8fa60070 */ lw $a2,0x70($sp) -///* f0f2f08: 0fc3dfa6 */ jal func0f0f7e98 -///* f0f2f0c: 02202025 */ or $a0,$s1,$zero -///* f0f2f10: 8e2c002c */ lw $t4,0x2c($s1) -///* f0f2f14: 8e2d0030 */ lw $t5,0x30($s1) -///* f0f2f18: 8e2e0034 */ lw $t6,0x34($s1) -///* f0f2f1c: 8e2f0038 */ lw $t7,0x38($s1) -///* f0f2f20: ae2c0014 */ sw $t4,0x14($s1) -///* f0f2f24: ae2d0018 */ sw $t5,0x18($s1) -///* f0f2f28: ae2e001c */ sw $t6,0x1c($s1) -///* f0f2f2c: ae2f0020 */ sw $t7,0x20($s1) -///* f0f2f30: 8fbf0024 */ lw $ra,0x24($sp) -///* f0f2f34: 8fb30020 */ lw $s3,0x20($sp) -///* f0f2f38: 8fb2001c */ lw $s2,0x1c($sp) -///* f0f2f3c: 8fb10018 */ lw $s1,0x18($sp) -///* f0f2f40: 8fb00014 */ lw $s0,0x14($sp) -///* f0f2f44: 03e00008 */ jr $ra -///* f0f2f48: 27bd0068 */ addiu $sp,$sp,0x68 -//); - -void func0f0f2cf4(struct menudialog *dialog, struct menuframe *frame, struct menu *menu) +void menuOpenDialog(struct menudialog *dialog, struct menuframe *frame, struct menu *menu) { - union handlerdata buffer3; + union handlerdata data3; struct menuitem *item; - union handlerdata buffer1; - union handlerdata buffer2; + union handlerdata data1; + union handlerdata data2; s32 (*handler)(u32 operation, struct menuitem *item, union handlerdata *data); frame->dialog = dialog; @@ -2988,7 +2821,6 @@ void func0f0f2cf4(struct menudialog *dialog, struct menuframe *frame, struct men func0f0f1d6c(dialog, frame, menu); func0f0fa574(frame); - // d74 frame->dialogtype = dialog->type; frame->unk40 = -1; frame->unk48 = 0; @@ -3001,28 +2833,29 @@ void func0f0f2cf4(struct menudialog *dialog, struct menuframe *frame, struct men frame->unk58 = 0; frame->unk5c = 0; - // e24 frame->focuseditem = func0f0f288c(frame); // Check if any items should be focused automatically item = frame->dialog->items; while (item->type != MENUITEMTYPE_END) { - handler = item->ptr.handler; + handler = item->handler; + if (handler && (item->param1 & 0x04) == 0 - && handler(MENUOP_CHECKPREFOCUSED, item, &buffer1)) { + && handler(MENUOP_CHECKPREFOCUSED, item, &data1)) { frame->focuseditem = item; } item++; } - // Run onfocus handler? + // Run focus handler if (frame->focuseditem) { - handler = frame->focuseditem->ptr.handler; + handler = frame->focuseditem->handler; + if (handler && (frame->focuseditem->param1 & 0x04) == 0) { - handler(MENUOP_13, frame->focuseditem, &buffer2); + handler(MENUOP_FOCUS, frame->focuseditem, &data2); } } @@ -3031,7 +2864,7 @@ void func0f0f2cf4(struct menudialog *dialog, struct menuframe *frame, struct men frame->unk68 = 0; if (dialog->handler) { - dialog->handler(MENUOP_OPEN, dialog, &buffer3); + dialog->handler(MENUOP_OPEN, dialog, &data3); } func0f0f2134(dialog, frame, menu); @@ -3114,7 +2947,7 @@ glabel menuPushDialog /* f0f3054: 01560019 */ multu $t2,$s6 /* f0f3058: 00005812 */ mflo $t3 /* f0f305c: 028b3021 */ addu $a2,$s4,$t3 -/* f0f3060: 0fc3cb3d */ jal func0f0f2cf4 +/* f0f3060: 0fc3cb3d */ jal menuOpenDialog /* f0f3064: 00000000 */ nop /* f0f3068: 0c002f02 */ jal viGetX /* f0f306c: 00000000 */ nop @@ -3180,7 +3013,7 @@ glabel menuPushDialog /* f0f3150: 01d60019 */ multu $t6,$s6 /* f0f3154: 00007812 */ mflo $t7 /* f0f3158: 028f3021 */ addu $a2,$s4,$t7 -/* f0f315c: 0fc3cb3d */ jal func0f0f2cf4 +/* f0f315c: 0fc3cb3d */ jal menuOpenDialog /* f0f3160: 00000000 */ nop /* f0f3164: ae130014 */ sw $s3,0x14($s0) /* f0f3168: 0c002f06 */ jal viGetY @@ -3259,7 +3092,7 @@ glabel menuPushDialog // g_Menus[g_MpPlayerNum].curframe = frame; // frame->unk6d = 0; // -// func0f0f2cf4(dialog, frame, &g_Menus[g_MpPlayerNum]); +// menuOpenDialog(dialog, frame, &g_Menus[g_MpPlayerNum]); // // frame->unk2c = (viGetX() - frame->unk1c) / 2; // frame->unk30 = (viGetY() - frame->unk20) / 2; @@ -3279,7 +3112,7 @@ glabel menuPushDialog // // frame->unk6d = -1; // -// func0f0f2cf4(sibling, frame, &g_Menus[g_MpPlayerNum]); +// menuOpenDialog(sibling, frame, &g_Menus[g_MpPlayerNum]); // // frame->unk14 = -320; // frame->unk2c = -320; diff --git a/src/game/game_102240.c b/src/game/game_102240.c index 85a1474d5..3af852b5a 100644 --- a/src/game/game_102240.c +++ b/src/game/game_102240.c @@ -87,33 +87,29 @@ s32 menuhandlerControlStyleImpl(u32 operation, struct menuitem *item, union hand switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 8; + data->custom.value = 8; break; case MENUOP_GETOPTGROUPCOUNT: - data->word = 2; + data->custom.value = 2; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(g_ControlStyleOptions[data->word]); + return (s32) langGet(g_ControlStyleOptions[data->custom.value]); case MENUOP_GETOPTGROUPTEXT: - return (s32) langGet(categories[data->word]); + return (s32) langGet(categories[data->custom.value]); case MENUOP_GETGROUPSTARTINDEX: - if (data->words[0] == 0) { - data->words[2] = 0; - } else { - data->words[2] = 4; - } + data->custom.groupstartindex = data->custom.value == 0 ? 0 : 4; break; case MENUOP_SET: - optionsSetControlMode(mpindex, data->word); + optionsSetControlMode(mpindex, data->custom.value); g_Vars.unk000458 |= 1; break; case MENUOP_GETOPTIONVALUE: - data->word = optionsGetControlMode(mpindex); + data->custom.value = optionsGetControlMode(mpindex); g_Menus[g_MpPlayerNum].data.main.mpindex = mpindex; break; case MENUOP_16: if (g_MenuData.root == MENUROOT_MAINMENU) { - g_Menus[g_MpPlayerNum].data.main.unke20 = data->word; + g_Menus[g_MpPlayerNum].data.main.unke20 = data->custom.value; } break; } @@ -145,7 +141,7 @@ s32 menuhandlerReversePitch(u32 operation, struct menuitem *item, union handlerd case MENUOP_GET: return !optionsGetForwardPitch(mpchrnum); case MENUOP_SET: - optionsSetForwardPitch(mpchrnum, data->word == 0); + optionsSetForwardPitch(mpchrnum, data->checkbox.value == 0); g_Vars.unk000458 |= 1; } @@ -164,16 +160,16 @@ s32 menuhandlerAimControl(u32 operation, struct menuitem *item, union handlerdat switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 2; + data->dropdown.value = 2; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(options[data->word]); + return (s32) langGet(options[data->dropdown.value]); case MENUOP_SET: - optionsSetAimControl(playernum, data->word); + optionsSetAimControl(playernum, data->dropdown.value); g_Vars.unk000458 |= 1; break; case MENUOP_GETOPTIONVALUE: - data->word = optionsGetAimControl(playernum); + data->dropdown.value = optionsGetAimControl(playernum); } return 0; @@ -190,16 +186,16 @@ s32 menuhandlerSoundMode(u32 operation, struct menuitem *item, union handlerdata switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 4; + data->dropdown.value = 4; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(options[data->word]); + return (s32) langGet(options[data->dropdown.value]); case MENUOP_SET: - audioSetSoundMode(data->word); + audioSetSoundMode(data->dropdown.value); g_Vars.unk000458 |= 1; break; case MENUOP_GETOPTIONVALUE: - data->word = g_SoundMode; + data->dropdown.value = g_SoundMode; } return 0; @@ -215,16 +211,16 @@ s32 menuhandlerScreenSize(u32 operation, struct menuitem *item, union handlerdat switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 3; + data->dropdown.value = 3; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(options[data->word]); + return (s32) langGet(options[data->dropdown.value]); case MENUOP_SET: - optionsSetScreenSize(data->word); + optionsSetScreenSize(data->dropdown.value); g_Vars.unk000458 |= 1; break; case MENUOP_GETOPTIONVALUE: - data->word = optionsGetEffectiveScreenSize(); + data->dropdown.value = optionsGetEffectiveScreenSize(); } return 0; @@ -239,16 +235,16 @@ s32 menuhandlerScreenRatio(u32 operation, struct menuitem *item, union handlerda switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 2; + data->dropdown.value = 2; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(options[data->word]); + return (s32) langGet(options[data->dropdown.value]); case MENUOP_SET: - optionsSetScreenRatio(data->word); + optionsSetScreenRatio(data->dropdown.value); g_Vars.unk000458 |= 1; break; case MENUOP_GETOPTIONVALUE: - data->word = optionsGetScreenRatio(); + data->dropdown.value = optionsGetScreenRatio(); } return 0; @@ -263,13 +259,13 @@ s32 menuhandlerScreenSplit(u32 operation, struct menuitem *item, union handlerda switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 2; + data->dropdown.value = 2; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(options[data->word]); + return (s32) langGet(options[data->dropdown.value]); case MENUOP_SET: - if (optionsGetScreenSplit() != data->word) { - optionsSetScreenSplit(data->word); + if (data->dropdown.value != (u32)optionsGetScreenSplit()) { + optionsSetScreenSplit(data->dropdown.value); g_Vars.unk000458 |= 1; @@ -284,7 +280,7 @@ s32 menuhandlerScreenSplit(u32 operation, struct menuitem *item, union handlerda } break; case MENUOP_GETOPTIONVALUE: - data->word = optionsGetScreenSplit(); + data->dropdown.value = optionsGetScreenSplit(); break; } @@ -305,7 +301,7 @@ s32 menuhandlerLookAhead(u32 operation, struct menuitem *item, union handlerdata case MENUOP_GET: return optionsGetLookAhead(mpchrnum); case MENUOP_SET: - optionsSetLookAhead(mpchrnum, data->word); + optionsSetLookAhead(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -326,7 +322,7 @@ s32 menuhandlerHeadRoll(u32 operation, struct menuitem *item, union handlerdata case MENUOP_GET: return optionsGetHeadRoll(mpchrnum); case MENUOP_SET: - optionsSetHeadRoll(mpchrnum, data->word); + optionsSetHeadRoll(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -339,7 +335,7 @@ s32 menuhandlerInGameSubtitles(u32 operation, struct menuitem *item, union handl case MENUOP_GET: return optionsGetInGameSubtitles(); case MENUOP_SET: - optionsSetInGameSubtitles(data->word); + optionsSetInGameSubtitles(data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -352,7 +348,7 @@ s32 menuhandlerCutsceneSubtitles(u32 operation, struct menuitem *item, union han case MENUOP_GET: return optionsGetCutsceneSubtitles(); case MENUOP_SET: - optionsSetCutsceneSubtitles(data->word); + optionsSetCutsceneSubtitles(data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -370,7 +366,7 @@ s32 menuhandlerAlternativeTitle(u32 operation, struct menuitem *item, union hand case MENUOP_GET: return g_AltTitle; case MENUOP_SET: - g_AltTitle = data->word; + g_AltTitle = data->checkbox.value; g_Vars.unk000458 |= 4; } @@ -393,7 +389,7 @@ s32 menuhandlerHiRes(u32 operation, struct menuitem *item, union handlerdata *da case MENUOP_GET: return g_HiResEnabled == true; case MENUOP_SET: - optionsSetHiRes(data->word ? 1 : 0); + optionsSetHiRes(data->checkbox.value ? 1 : 0); g_Vars.unk000458 |= 1; } @@ -414,7 +410,7 @@ s32 menuhandlerAmmoOnScreen(u32 operation, struct menuitem *item, union handlerd case MENUOP_GET: return optionsGetAmmoOnScreen(mpchrnum); case MENUOP_SET: - optionsSetAmmoOnScreen(mpchrnum, data->word); + optionsSetAmmoOnScreen(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -440,7 +436,7 @@ s32 menuhandlerShowGunFunction(u32 operation, struct menuitem *item, union handl case MENUOP_GET: return optionsGetShowGunFunction(mpchrnum); case MENUOP_SET: - optionsSetShowGunFunction(mpchrnum, data->word); + optionsSetShowGunFunction(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -461,7 +457,7 @@ s32 menuhandlerShowMissionTime(u32 operation, struct menuitem *item, union handl case MENUOP_GET: return optionsGetShowMissionTime(mpchrnum); case MENUOP_SET: - optionsSetShowMissionTime(mpchrnum, data->word); + optionsSetShowMissionTime(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -487,7 +483,7 @@ s32 menuhandlerAlwaysShowTarget(u32 operation, struct menuitem *item, union hand case MENUOP_GET: return optionsGetAlwaysShowTarget(mpchrnum); case MENUOP_SET: - optionsSetAlwaysShowTarget(mpchrnum, data->word); + optionsSetAlwaysShowTarget(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -513,7 +509,7 @@ s32 menuhandlerShowZoomRange(u32 operation, struct menuitem *item, union handler case MENUOP_GET: return optionsGetShowZoomRange(mpchrnum); case MENUOP_SET: - optionsSetShowZoomRange(mpchrnum, data->word); + optionsSetShowZoomRange(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -534,7 +530,7 @@ s32 menuhandlerPaintball(u32 operation, struct menuitem *item, union handlerdata case MENUOP_GET: return optionsGetPaintball(mpchrnum); case MENUOP_SET: - optionsSetPaintball(mpchrnum, data->word); + optionsSetPaintball(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -555,7 +551,7 @@ s32 menuhandlerSightOnScreen(u32 operation, struct menuitem *item, union handler case MENUOP_GET: return optionsGetSightOnScreen(mpchrnum); case MENUOP_SET: - optionsSetSightOnScreen(mpchrnum, data->word); + optionsSetSightOnScreen(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -576,7 +572,7 @@ s32 menuhandlerAutoAim(u32 operation, struct menuitem *item, union handlerdata * case MENUOP_GET: return optionsGetAutoAim(mpchrnum); case MENUOP_SET: - optionsSetAutoAim(mpchrnum, data->word); + optionsSetAutoAim(mpchrnum, data->checkbox.value); g_Vars.unk000458 |= 1; } @@ -587,10 +583,10 @@ s32 menuhandlerMusicVolume(u32 operation, struct menuitem *item, union handlerda { switch (operation) { case MENUOP_GETSLIDER: - data->word = optionsGetMusicVolume(); + data->slider.value = optionsGetMusicVolume(); break; case MENUOP_SET: - optionsSetMusicVolume(data->word); + optionsSetMusicVolume(data->slider.value); g_Vars.unk000458 |= 1; } @@ -602,13 +598,13 @@ s32 menuhandlerSfxVolume(u32 operation, struct menuitem *item, union handlerdata switch (operation) { case MENUOP_GETSLIDER: if (g_SfxVolume > 0x5000) { - data->word = 0x5000; + data->slider.value = 0x5000; } else { - data->word = g_SfxVolume; + data->slider.value = g_SfxVolume; } break; case MENUOP_SET: - audioSetSfxVolume(data->word); + audioSetSfxVolume(data->slider.value); g_Vars.unk000458 |= 1; } @@ -898,17 +894,17 @@ s32 menuhandlerPdModeSetting(u32 operation, struct menuitem *item, union handler switch (operation) { case MENUOP_GETSLIDER: - data->word = *property; + data->slider.value = *property; break; case MENUOP_SET: - *property = (u16)data->word; + *property = (u16)data->slider.value; break; case MENUOP_GETSLIDERLABEL: fvalue = func0f1036ac(*property, item->param); if (item->param == 0) { fvalue = fvalue * 4 + 1.0f; } - sprintf(data->ptrs[1], "%s%s%.00f%%\n", "", "", fvalue * 100.0f); + sprintf(data->slider.label, "%s%s%.00f%%\n", "", "", fvalue * 100.0f); break; } @@ -1477,7 +1473,7 @@ s32 menuhandlerCoopRadar(u32 operation, struct menuitem *item, union handlerdata case MENUOP_GET: return g_Vars.coopradaron; case MENUOP_SET: - g_Vars.coopradaron = data->word ? 1 : 0; + g_Vars.coopradaron = data->checkbox.value ? 1 : 0; g_Vars.unk000458 |= 1; } @@ -1490,7 +1486,7 @@ s32 menuhandlerCoopFriendlyFire(u32 operation, struct menuitem *item, union hand case MENUOP_GET: return g_Vars.coopfriendlyfire; case MENUOP_SET: - g_Vars.coopfriendlyfire = data->word ? 1 : 0; + g_Vars.coopfriendlyfire = data->checkbox.value ? 1 : 0; g_Vars.unk000458 |= 1; } @@ -1635,7 +1631,7 @@ s32 menuhandlerAntiRadar(u32 operation, struct menuitem *item, union handlerdata case MENUOP_GET: return g_Vars.antiradaron; case MENUOP_SET: - g_Vars.antiradaron = data->word ? 1 : 0; + g_Vars.antiradaron = data->checkbox.value ? 1 : 0; g_Vars.unk000458 |= 1; } @@ -1648,16 +1644,16 @@ s32 menuhandlerAntiPlayer(u32 operation, struct menuitem *item, union handlerdat switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 2; + data->dropdown.value = 2; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(labels[data->word]); + return (s32) langGet(labels[data->dropdown.value]); case MENUOP_SET: - g_Vars.pendingantiplayernum = data->word; + g_Vars.pendingantiplayernum = data->dropdown.value; g_Vars.unk000458 |= 1; break; case MENUOP_GETOPTIONVALUE: - data->word = g_Vars.pendingantiplayernum; + data->dropdown.value = g_Vars.pendingantiplayernum; break; } @@ -2846,7 +2842,7 @@ s32 menudialog0010559c(u32 operation, struct menudialog *dialog, union handlerda case MENUOP_CLOSE: if ((g_Vars.unk000458 & 1) && g_Vars.coopplayernum < 0 && g_Vars.antiplayernum < 0) { if (func0f1094e4(&var800a22c0, 1, 0) == 0) { - data->word = 1; + data->dialog1.value = 1; } g_Vars.unk000458 &= ~0x00000001; @@ -2923,7 +2919,7 @@ s32 menuhandlerLangFilter(u32 operation, struct menuitem *item, union handlerdat case MENUOP_GET: return g_Vars.langfilteron; case MENUOP_SET: - g_Vars.langfilteron = data->word; + g_Vars.langfilteron = data->checkbox.value; g_Vars.unk000458 |= 1; } @@ -4360,38 +4356,38 @@ s32 menuhandlerCinema(u32 operation, struct menuitem *item, union handlerdata *d switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = g_CutsceneIndexes[getNumCompletedMissions()] + 1; + data->custom.value = g_CutsceneIndexes[getNumCompletedMissions()] + 1; break; case MENUOP_GETOPTIONTEXT: - if (data->word == 0) { + if (data->custom.value == 0) { sprintf(g_StringPointer, langGet(L_OPTIONS(448))); // "Play All" return (s32) g_StringPointer; } - return (s32) langGet(g_Cutscenes[data->word - 1].name); + return (s32) langGet(g_Cutscenes[data->custom.value - 1].name); case MENUOP_SET: - if (data->word == 0) { + if (data->custom.value == 0) { s32 index = getNumCompletedMissions(); g_Vars.unk0004d4 = 0; g_Vars.unk0004d5 = g_CutsceneIndexes[index]; menuPopDialog(); func0f01bea0(); } else { - g_Vars.unk0004d4 = data->word - 1; + g_Vars.unk0004d4 = data->custom.value - 1; g_Vars.unk0004d5 = 1; menuPopDialog(); func0f01bea0(); } break; case MENUOP_GETOPTIONVALUE: - data->word = 0xfffff; + data->custom.value = 0xfffff; break; case MENUOP_GETOPTGROUPCOUNT: - data->word = ARRAYCOUNT(groups); + data->custom.value = ARRAYCOUNT(groups); break; case MENUOP_GETOPTGROUPTEXT: - return (s32) langGet(groups[data->word].name); + return (s32) langGet(groups[data->custom.value].name); case MENUOP_GETGROUPSTARTINDEX: - data->words[2] = groups[data->words[0]].first_cutscene_index; + data->custom.groupstartindex = groups[data->custom.value].first_cutscene_index; break; } diff --git a/src/game/game_107fb0.c b/src/game/game_107fb0.c index f639851f9..e8c4c3478 100644 --- a/src/game/game_107fb0.c +++ b/src/game/game_107fb0.c @@ -2484,7 +2484,7 @@ glabel func0f109ec4 s32 menuhandlerRenameFile(u32 operation, struct menuitem *item, union handlerdata *data) { - char *name = data->ptrs[0]; + char *name = data->keyboard.string; switch (operation) { case MENUOP_GETTEXT: @@ -4343,7 +4343,7 @@ s32 menuhandlerOpenDeleteFile(u32 operation, struct menuitem *item, union handle s32 menuhandlerAgentName(u32 operation, struct menuitem *item, union handlerdata *data) { - char *name = data->ptrs[0]; + char *name = data->keyboard.string; if (!g_SaveLocations[0]) { return 0; diff --git a/src/game/game_179060.c b/src/game/game_179060.c index ffe4e51f1..0c069216c 100644 --- a/src/game/game_179060.c +++ b/src/game/game_179060.c @@ -384,15 +384,15 @@ s32 menuhandlerMpControlStyle(u32 operation, struct menuitem *item, union handle switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 4; + data->dropdown.value = 4; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(labels[data->word]); + return (s32) langGet(labels[data->dropdown.value]); case MENUOP_SET: - optionsSetControlMode(g_MpPlayerNum, data->word); + optionsSetControlMode(g_MpPlayerNum, data->dropdown.value); break; case MENUOP_GETOPTIONVALUE: - data->word = optionsGetControlMode(g_MpPlayerNum); + data->dropdown.value = optionsGetControlMode(g_MpPlayerNum); break; } @@ -403,15 +403,15 @@ s32 menuhandlerMpWeaponSlot(u32 operation, struct menuitem *item, union handlerd { switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = mpGetNumWeaponOptions(); + data->dropdown.value = mpGetNumWeaponOptions(); break; case MENUOP_GETOPTIONTEXT: - return (s32) mpGetWeaponLabel(data->word); + return (s32) mpGetWeaponLabel(data->dropdown.value); case MENUOP_SET: - mpSetWeaponSlot(item->param3, data->word); + mpSetWeaponSlot(item->param3, data->dropdown.value); break; case MENUOP_GETOPTIONVALUE: - data->word = mpGetWeaponSlot(item->param3); + data->dropdown.value = mpGetWeaponSlot(item->param3); } return 0; @@ -426,15 +426,15 @@ s32 menuhandlerMpWeaponSetDropdown(u32 operation, struct menuitem *item, union h { switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = func0f189058(item->param); + data->dropdown.value = func0f189058(item->param); break; case MENUOP_GETOPTIONTEXT: - return (s32) mpGetWeaponSetName(data->word); + return (s32) mpGetWeaponSetName(data->dropdown.value); case MENUOP_SET: - mpSetWeaponSet(data->word); + mpSetWeaponSet(data->dropdown.value); break; case MENUOP_GETOPTIONVALUE: - data->word = mpGetWeaponSet(); + data->dropdown.value = mpGetWeaponSet(); break; } @@ -461,16 +461,16 @@ s32 menuhandlerMpControlCheckbox(u32 operation, struct menuitem *item, union han val = OPTION_FORWARDPITCH; if (item->param3 == val) { - if (data->word == 0) { - data->word = val; + if (data->checkbox.value == 0) { + data->checkbox.value = val; } else { - data->word = 0; + data->checkbox.value = 0; } } g_MpPlayers[g_MpPlayerNum].options &= ~item->param3; - if (data->word) { + if (data->checkbox.value) { g_MpPlayers[g_MpPlayerNum].options |= item->param3; } } @@ -484,15 +484,15 @@ s32 menuhandlerMpAimControl(u32 operation, struct menuitem *item, union handlerd switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 2; + data->dropdown.value = 2; break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(labels[data->word]); + return (s32) langGet(labels[data->dropdown.value]); case MENUOP_SET: - optionsSetAimControl(g_MpPlayerNum, data->word); + optionsSetAimControl(g_MpPlayerNum, data->dropdown.value); break; case MENUOP_GETOPTIONVALUE: - data->word = optionsGetAimControl(g_MpPlayerNum); + data->dropdown.value = optionsGetAimControl(g_MpPlayerNum); break; } @@ -509,7 +509,7 @@ s32 menuhandlerMpCheckboxOption(u32 operation, struct menuitem *item, union hand return true; case MENUOP_SET: g_MpSetup.options = g_MpSetup.options & ~item->param3; - if (data->word) { + if (data->checkbox.value) { g_MpSetup.options = g_MpSetup.options | item->param3; } } @@ -542,7 +542,7 @@ s32 menuhandlerMpDisplayOptionCheckbox(u32 operation, struct menuitem *item, uni case MENUOP_SET: g_MpPlayers[g_MpPlayerNum].base.displayoptions &= ~(u8)item->param3; - if (data->word) { + if (data->checkbox.value) { g_MpPlayers[g_MpPlayerNum].base.displayoptions |= (u8)item->param3; } break; @@ -563,7 +563,7 @@ s32 menuhandlerMpConfirmSaveChr(u32 operation, struct menuitem *item, union hand s32 menuhandlerMpPlayerName(u32 operation, struct menuitem *item, union handlerdata *data) { - char *name = data->ptrs[0]; + char *name = data->keyboard.string; switch (operation) { case MENUOP_GETTEXT: @@ -997,11 +997,11 @@ s32 menuhandlerMpCharacterBody(u32 operation, struct menuitem *item, union handl switch (operation) { case MENUOP_SET: if (g_MpPlayers[g_MpPlayerNum].base.headnum < mpGetNumHeads()) { - if (!data->words[1]) { - g_MpPlayers[g_MpPlayerNum].base.headnum = mpBodyGetMpHeadIndex(data->word); + if (!data->carousel.unk04) { + g_MpPlayers[g_MpPlayerNum].base.headnum = mpBodyGetMpHeadIndex(data->carousel.value); } } - g_MpPlayers[g_MpPlayerNum].base.bodynum = data->word; + g_MpPlayers[g_MpPlayerNum].base.bodynum = data->carousel.value; func0f17b8f0(); break; case MENUOP_CHECKPREFOCUSED: @@ -2685,7 +2685,7 @@ glabel var7f1b814c s32 menuhandlerMpCharacterHead(u32 operation, struct menuitem *item, union handlerdata *data) { if (operation == MENUOP_SET) { - g_MpPlayers[g_MpPlayerNum].base.headnum = data->word; + g_MpPlayers[g_MpPlayerNum].base.headnum = data->carousel.value; } return func0f17b4f8(operation, item, data, g_MpPlayers[g_MpPlayerNum].base.headnum, 1); @@ -3361,16 +3361,16 @@ s32 menuhandlerMpTimeLimitSlider(u32 operation, struct menuitem *item, union han { switch (operation) { case MENUOP_GETSLIDER: - data->word = g_MpSetup.timelimit; + data->slider.value = g_MpSetup.timelimit; break; case MENUOP_SET: - g_MpSetup.timelimit = data->word; + g_MpSetup.timelimit = data->slider.value; break; case MENUOP_GETSLIDERLABEL: - if (data->word == 60) { - sprintf(data->ptrs[1], langGet(L_MPMENU(112))); // "No Limit" + if (data->slider.value == 60) { + sprintf(data->slider.label, langGet(L_MPMENU(112))); // "No Limit" } else { - sprintf(data->ptrs[1], langGet(L_MPMENU(114)), data->word + 1); // "%d Min" + sprintf(data->slider.label, langGet(L_MPMENU(114)), data->slider.value + 1); // "%d Min" } } return 0; @@ -3380,16 +3380,16 @@ s32 menuhandlerMpScoreLimitSlider(u32 operation, struct menuitem *item, union ha { switch (operation) { case MENUOP_GETSLIDER: - data->word = g_MpSetup.scorelimit; + data->slider.value = g_MpSetup.scorelimit; break; case MENUOP_SET: - g_MpSetup.scorelimit = data->word; + g_MpSetup.scorelimit = data->slider.value; break; case MENUOP_GETSLIDERLABEL: - if (data->word == 100) { - sprintf(data->ptrs[1], langGet(L_MPMENU(112))); // "No Limit" + if (data->slider.value == 100) { + sprintf(data->slider.label, langGet(L_MPMENU(112))); // "No Limit" } else { - sprintf(data->ptrs[1], langGet(L_MPMENU(113)), data->word + 1); // "%d" + sprintf(data->slider.label, langGet(L_MPMENU(113)), data->slider.value + 1); // "%d" } } @@ -3400,16 +3400,16 @@ s32 menuhandlerMpTeamScoreLimitSlider(u32 operation, struct menuitem *item, unio { switch (operation) { case MENUOP_GETSLIDER: - data->word = func0f18844c(); + data->slider.value = func0f18844c(); break; case MENUOP_SET: - g_MpSetup.teamscorelimit = data->word; + g_MpSetup.teamscorelimit = data->slider.value; break; case MENUOP_GETSLIDERLABEL: - if (data->word == 400) { - sprintf(data->ptrs[1], langGet(L_MPMENU(112))); // "No Limit" + if (data->slider.value == 400) { + sprintf(data->slider.label, langGet(L_MPMENU(112))); // "No Limit" } else { - sprintf(data->ptrs[1], langGet(L_MPMENU(113)), data->word + 1); // "%d" + sprintf(data->slider.label, langGet(L_MPMENU(113)), data->slider.value + 1); // "%d" } } @@ -3863,13 +3863,15 @@ s32 menuhandlerMpSimulantHead(u32 operation, struct menuitem *item, union handle /** * Rare developers forgot to add a break statement to the first case, * and when they noticed a problem their fix was to add an additional - * MENUOP_13 check in the next case. + * MENUOP_FOCUS check in the next case. */ switch (operation) { case MENUOP_SET: - g_MpSimulants[g_Menus[g_MpPlayerNum].data.mpsetup.slotindex].base.headnum = start + data->word; - case MENUOP_13: - if (operation == MENUOP_13 && item->param2 == 1 && g_MpSimulants[g_Menus[g_MpPlayerNum].data.mpsetup.slotindex].base.headnum < start) { + g_MpSimulants[g_Menus[g_MpPlayerNum].data.mpsetup.slotindex].base.headnum = start + data->carousel.value; + case MENUOP_FOCUS: + if (operation == MENUOP_FOCUS + && item->param2 == 1 + && g_MpSimulants[g_Menus[g_MpPlayerNum].data.mpsetup.slotindex].base.headnum < start) { g_MpSimulants[g_Menus[g_MpPlayerNum].data.mpsetup.slotindex].base.headnum = start; } break; @@ -3881,7 +3883,7 @@ s32 menuhandlerMpSimulantHead(u32 operation, struct menuitem *item, union handle s32 menuhandlerMpSimulantBody(u32 operation, struct menuitem *item, union handlerdata *data) { if (operation == MENUOP_SET) { - g_MpSimulants[g_Menus[g_MpPlayerNum].data.mpsetup.slotindex].base.bodynum = data->word; + g_MpSimulants[g_Menus[g_MpPlayerNum].data.mpsetup.slotindex].base.bodynum = data->carousel.value; } return func0f179da4(operation, item, data, @@ -4641,15 +4643,15 @@ s32 menuhandlerMpTeamSlot(u32 operation, struct menuitem *item, union handlerdat switch (operation) { case MENUOP_SET: mpchr = func0f18c794(item->param); - mpchr->team = data->word; + mpchr->team = data->dropdown.value; break; case MENUOP_GETOPTIONVALUE: mpchr = func0f18c794(item->param); if (!mpchr) { - data->word = 0xff; + data->dropdown.value = 0xff; } else { - data->word = mpchr->team; + data->dropdown.value = mpchr->team; } break; @@ -4951,7 +4953,7 @@ s32 menuhandlerMpMultipleTunes(u32 operation, struct menuitem *item, union handl case MENUOP_GET: return mpGetUsingMultipleTunes(); case MENUOP_SET: - mpSetUsingMultipleTunes(data->word); + mpSetUsingMultipleTunes(data->checkbox.value); g_Vars.unk000458 |= 2; } @@ -5780,18 +5782,14 @@ s32 menuhandlerMpLock(u32 operation, struct menuitem *item, union handlerdata *d switch (operation) { case MENUOP_GETOPTIONCOUNT: - if (mpGetLockType() == MPLOCKTYPE_CHALLENGE) { - data->word = 1; - } else { - data->word = 5; - } + data->dropdown.value = mpGetLockType() == MPLOCKTYPE_CHALLENGE ? 1 : 5; break; case MENUOP_GETOPTIONTEXT: if (mpGetLockType() == MPLOCKTYPE_CHALLENGE) { return (s32) langGet(L_MPMENU(49)); // "Challenge" } - if ((u32)data->word <= 3) { - return (s32) langGet(labels[data->word]); + if (data->dropdown.value <= 3) { + return (s32) langGet(labels[data->dropdown.value]); } if (mpGetLockType() == MPLOCKTYPE_PLAYER) { return (s32) g_MpPlayers[mpGetLockPlayerNum()].base.name; @@ -5799,16 +5797,12 @@ s32 menuhandlerMpLock(u32 operation, struct menuitem *item, union handlerdata *d return (s32) mpGetCurrentPlayerName(item); case MENUOP_SET: if (mpGetLockType() != MPLOCKTYPE_CHALLENGE) { - mpSetLock(data->word, g_MpPlayerNum); + mpSetLock(data->dropdown.value, g_MpPlayerNum); } g_Vars.unk000458 |= 2; break; case MENUOP_GETOPTIONVALUE: - if (mpGetLockType() == MPLOCKTYPE_CHALLENGE) { - data->word = 0; - } else { - data->word = mpGetLockType(); - } + data->dropdown.value = mpGetLockType() == MPLOCKTYPE_CHALLENGE ? 0 : mpGetLockType(); break; } @@ -6340,23 +6334,20 @@ s32 menuhandlerMpNumberOfSimulants(u32 operation, struct menuitem *item, union h { switch (operation) { case MENUOP_GETOPTIONCOUNT: - if (!mpIsChallengeComplete(CHALLENGE_UNK64)) { - data->word = 4; - } else { - data->word = 8; - } + data->dropdown.value = !mpIsChallengeComplete(CHALLENGE_UNK64) ? 4 : 8; break; case MENUOP_GETOPTIONTEXT: - sprintf(g_StringPointer, "%d\n", data->word + 1); - return (u32)g_StringPointer; + sprintf(g_StringPointer, "%d\n", data->dropdown.value + 1); + return (s32) g_StringPointer; case MENUOP_SET: - g_Vars.mpquickteamnumsims = data->word + 1; + g_Vars.mpquickteamnumsims = data->dropdown.value + 1; break; case MENUOP_GETOPTIONVALUE: - data->word = g_Vars.mpquickteamnumsims - 1; + data->dropdown.value = g_Vars.mpquickteamnumsims - 1; break; case MENUOP_CHECKHIDDEN: - if (g_Vars.mpquickteam != MPQUICKTEAM_PLAYERSANDSIMS && g_Vars.mpquickteam != MPQUICKTEAM_PLAYERSVSSIMS) { + if (g_Vars.mpquickteam != MPQUICKTEAM_PLAYERSANDSIMS + && g_Vars.mpquickteam != MPQUICKTEAM_PLAYERSVSSIMS) { return true; } break; @@ -6369,16 +6360,16 @@ s32 menuhandlerMpSimulantsPerTeam(u32 operation, struct menuitem *item, union ha { switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = 2; + data->dropdown.value = 2; break; case MENUOP_GETOPTIONTEXT: - sprintf(g_StringPointer, "%d\n", data->word + 1); - return (u32)g_StringPointer; + sprintf(g_StringPointer, "%d\n", data->dropdown.value + 1); + return (s32) g_StringPointer; case MENUOP_SET: - g_Vars.unk0004a0 = data->word + 1; + g_Vars.unk0004a0 = data->dropdown.value + 1; break; case MENUOP_GETOPTIONVALUE: - data->word = g_Vars.unk0004a0 - 1; + data->dropdown.value = g_Vars.unk0004a0 - 1; break; case MENUOP_CHECKHIDDEN: if (g_Vars.mpquickteam != MPQUICKTEAM_PLAYERSIMTEAMS) { diff --git a/src/game/game_17f930.c b/src/game/game_17f930.c index e6911222c..342bea766 100644 --- a/src/game/game_17f930.c +++ b/src/game/game_17f930.c @@ -1773,13 +1773,13 @@ s32 menuhandlerMpHillTime(u32 operation, struct menuitem *item, union handlerdat { switch (operation) { case MENUOP_GETSLIDER: - data->word = g_Vars.mphilltime; + data->slider.value = g_Vars.mphilltime; break; case MENUOP_SET: - g_Vars.mphilltime = (u8)data->word; + g_Vars.mphilltime = (u8)data->slider.value; break; case MENUOP_GETSLIDERLABEL: - sprintf(data->ptrs[1], langGet(L_MPWEAPONS(23)), data->word + 10); // "%ds/Point" + sprintf(data->slider.label, langGet(L_MPWEAPONS(23)), data->slider.value + 10); // "%ds/Point" break; } diff --git a/src/game/game_1a3340.c b/src/game/game_1a3340.c index a8567bb29..4429a10eb 100644 --- a/src/game/game_1a3340.c +++ b/src/game/game_1a3340.c @@ -592,20 +592,20 @@ s32 frDifficultyDropdownMenuHandler(u32 operation, struct menuitem *item, union switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = ciGetFiringRangeScore(frGetSlot()) + 1; + data->dropdown.value = ciGetFiringRangeScore(frGetSlot()) + 1; - if ((u32)data->word > 3) { - data->word = 3; + if (data->dropdown.value > 3) { + data->dropdown.value = 3; } break; case MENUOP_GETOPTIONTEXT: - return (s32) langGet(names[data->word]); + return (s32) langGet(names[data->dropdown.value]); case MENUOP_SET: - frSetDifficulty(data->word); + frSetDifficulty(data->dropdown.value); menuPushDialog(&menudialog_frtraininginfo2); break; case MENUOP_GETOPTIONVALUE: - data->word = frGetDifficulty(); + data->dropdown.value = frGetDifficulty(); break; } @@ -2658,19 +2658,19 @@ s32 ciOfficeInformationMenuHandler(u32 operation, struct menuitem *item, union h switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = numunlockedchrbios + numunlockedmiscbios; + data->custom.value = numunlockedchrbios + numunlockedmiscbios; break; case MENUOP_GETOPTIONTEXT: - if ((u32)data->words[0] < numunlockedchrbios) { - chrbio = ciGetChrBioByBodynum(ciGetChrBioIndexBySlot((u32)data->words[0])); + if (data->custom.value < numunlockedchrbios) { + chrbio = ciGetChrBioByBodynum(ciGetChrBioIndexBySlot(data->custom.value)); return (s32) langGet(chrbio->name); } else { - miscbio = ciGetMiscBio(ciGetMiscBioIndexBySlot((u32)data->words[0] - numunlockedchrbios)); + miscbio = ciGetMiscBio(ciGetMiscBioIndexBySlot(data->custom.value - numunlockedchrbios)); return (s32) langGet(miscbio->name); } break; case MENUOP_SET: - var800888a0 = data->word; + var800888a0 = data->custom.value; if (var800888a0 < numunlockedchrbios) { menuPushDialog(&menudialog_characterprofile); } else { @@ -2678,15 +2678,15 @@ s32 ciOfficeInformationMenuHandler(u32 operation, struct menuitem *item, union h } break; case MENUOP_GETOPTIONVALUE: - data->word = var800888a0; + data->custom.value = var800888a0; break; case MENUOP_GETOPTGROUPCOUNT: - data->word = 2; + data->custom.value = 2; break; case MENUOP_GETOPTGROUPTEXT: - return (s32) langGet(groups[data->word].name); + return (s32) langGet(groups[data->custom.value].name); case MENUOP_GETGROUPSTARTINDEX: - data->words[2] = data->word == 0 ? 0 : numunlockedchrbios; + data->custom.groupstartindex = data->custom.value == 0 ? 0 : numunlockedchrbios; break; } @@ -2988,24 +2988,24 @@ s32 dtDeviceListMenuHandler(u32 operation, struct menuitem *item, union handlerd { switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = dtGetNumAvailable(); + data->custom.value = dtGetNumAvailable(); break; case MENUOP_GETOPTIONTEXT: - return (s32) weaponGetName(dtGetWeaponByDeviceIndex(dtGetIndexBySlot(data->word))); + return (s32) weaponGetName(dtGetWeaponByDeviceIndex(dtGetIndexBySlot(data->custom.value))); case MENUOP_SET: - g_DtSlot = data->word; + g_DtSlot = data->custom.value; menuPushDialog(&g_DeviceTrainingDetailsMenuDialog); break; case MENUOP_GETOPTIONVALUE: - data->word = g_DtSlot; + data->custom.value = g_DtSlot; break; case MENUOP_GETOPTGROUPCOUNT: - data->word = 0; + data->custom.value = 0; break; case MENUOP_GETOPTGROUPTEXT: return 0; case MENUOP_GETGROUPSTARTINDEX: - data->words[2] = 0; + data->custom.groupstartindex = 0; break; } @@ -3266,24 +3266,24 @@ s32 htHoloListMenuHandler(u32 operation, struct menuitem *item, union handlerdat { switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = htGetNumUnlocked(); + data->custom.value = htGetNumUnlocked(); break; case MENUOP_GETOPTIONTEXT: - return (s32) htGetName(htGetIndexBySlot(data->word)); + return (s32) htGetName(htGetIndexBySlot(data->custom.value)); case MENUOP_SET: - var80088bb4 = data->word; + var80088bb4 = data->custom.value; menuPushDialog(&g_HoloTrainingDetailsMenuDialog); break; case MENUOP_GETOPTIONVALUE: - data->word = var80088bb4; + data->custom.value = var80088bb4; break; case MENUOP_GETOPTGROUPCOUNT: - data->word = 0; + data->custom.value = 0; break; case MENUOP_GETOPTGROUPTEXT: return 0; case MENUOP_GETGROUPSTARTINDEX: - data->words[2] = 0; + data->custom.groupstartindex = 0; break; } @@ -3635,13 +3635,13 @@ s32 ciHangarInformationMenuHandler(u32 operation, struct menuitem *item, union h switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->word = ciGetNumUnlockedHangarBios(); + data->custom.value = ciGetNumUnlockedHangarBios(); break; case MENUOP_GETOPTIONTEXT: - bio = ciGetHangarBio(ciGetHangarBioIndexBySlot(data->word)); + bio = ciGetHangarBio(ciGetHangarBioIndexBySlot(data->custom.value)); return (s32) langGet(bio->name); case MENUOP_SET: - g_HangarBioSlot = data->word; + g_HangarBioSlot = data->custom.value; bioindex = ciGetHangarBioIndexBySlot(g_HangarBioSlot); if (bioindex <= HANGARBIO_SKEDARRUINS) { @@ -3651,15 +3651,15 @@ s32 ciHangarInformationMenuHandler(u32 operation, struct menuitem *item, union h } break; case MENUOP_GETOPTIONVALUE: - data->word = g_HangarBioSlot; + data->custom.value = g_HangarBioSlot; break; case MENUOP_GETOPTGROUPCOUNT: - data->word = 2; + data->custom.value = 2; break; case MENUOP_GETOPTGROUPTEXT: - return (s32) langGet(groups[data->word].name); + return (s32) langGet(groups[data->custom.value].name); case MENUOP_GETGROUPSTARTINDEX: - data->words[2] = data->words[0] == 0 ? 0 : groups[1].offset; + data->custom.groupstartindex = data->custom.value == 0 ? 0 : groups[1].offset; break; } diff --git a/src/game/mplayer.c b/src/game/mplayer.c index 9ee0ee5d8..aab6f0609 100644 --- a/src/game/mplayer.c +++ b/src/game/mplayer.c @@ -5081,7 +5081,7 @@ bool mpSetLock(s32 locktype, s32 playernum) return true; } -u32 mpGetLockType(void) +s32 mpGetLockType(void) { return g_MpSetupSaveFile.locktype; } diff --git a/src/include/constants.h b/src/include/constants.h index 12a49800b..dac96ffed 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -1086,7 +1086,7 @@ #define MENUOP_GETSLIDER 9 #define MENUOP_GETSLIDERLABEL 10 #define MENUOP_CHECKDISABLED 12 -#define MENUOP_13 13 +#define MENUOP_FOCUS 13 #define MENUOP_CHECKPREFOCUSED 15 #define MENUOP_16 16 #define MENUOP_GETTEXT 17 diff --git a/src/include/game/game_0f09f0.h b/src/include/game/game_0f09f0.h index 85d061473..b0a3c4602 100644 --- a/src/include/game/game_0f09f0.h +++ b/src/include/game/game_0f09f0.h @@ -32,7 +32,7 @@ u32 func0f0f2928(void); u32 func0f0f29cc(void); u32 func0f0f2b2c(void); u32 func0f0f2c44(void); -void func0f0f2cf4(struct menudialog *dialog, struct menuframe *arg1, struct menu *menu); +void menuOpenDialog(struct menudialog *dialog, struct menuframe *arg1, struct menu *menu); void menuPushDialog(struct menudialog *dialog); u32 func0f0f3220(s32 arg0); u32 func0f0f33bc(void); diff --git a/src/include/game/mplayer.h b/src/include/game/mplayer.h index 64e41385d..20cedcbfd 100644 --- a/src/include/game/mplayer.h +++ b/src/include/game/mplayer.h @@ -58,7 +58,7 @@ u8 mpGetBodyUnk06(u8 bodynum); s32 mpBodyGetMpHeadIndex(s32 bodynum); u32 mpChooseRandomLockPlayer(void); bool mpSetLock(s32 locktype, s32 playernum); -u32 mpGetLockType(void); +s32 mpGetLockType(void); u32 mpGetLockPlayerNum(void); bool mpIsPlayerLockedOut(u32 playernum); void mpCalculateLockIfLastWinnerOrLoser(void); diff --git a/src/include/types.h b/src/include/types.h index 6c5f23c7b..92ad828be 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3245,10 +3245,59 @@ struct hoverprop { u16 size; }; +struct handlerdata_carousel { + s32 value; + u32 unk04; +}; + +struct handlerdata_checkbox { + u32 value; +}; + +struct handlerdata_custom { + u32 value; + u32 unk04; + u32 groupstartindex; + u32 padding; // just extra padding to make the union 16 bytes +}; + +struct handlerdata_dropdown { + u32 value; +}; + +struct handlerdata_keyboard { + char *string; +}; + +struct handlerdata_label { + u32 colour1; + u32 colour2; +}; + +struct handlerdata_slider { + u32 value; + char *label; +}; + +struct handlerdata_dialog1 { + u32 value; +}; + +struct handlerdata_dialog2 { + void *ptr; +}; + union handlerdata { - s32 words[4]; - s32 word; - void *ptrs[4]; + struct handlerdata_carousel carousel; + struct handlerdata_checkbox checkbox; + struct handlerdata_custom custom; + struct handlerdata_dropdown dropdown; + struct handlerdata_keyboard keyboard; + struct handlerdata_label label; + struct handlerdata_slider slider; + + struct handlerdata_dialog1 dialog1; + struct handlerdata_dialog2 dialog2; }; struct menuitem { @@ -3257,12 +3306,7 @@ struct menuitem { u32 param1; u32 param2; u32 param3; - - union { - void *handler; - //struct menudialog *dialog; - //s32 (*handler)(u32 operation, struct menuitem *item, union handlerdata *data); - } ptr; + void *handler; }; struct menudialog {