From 8442f00659ea94a8e084f31365b8f10b0eb4dc8c Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 12 Apr 2020 09:58:05 +1000 Subject: [PATCH] Decompile frDetailsOkMenuHandler --- src/game/data/data_02e820.c | 4 +- src/game/game_19c990.c | 2 +- src/game/game_1a3340.c | 117 ++++++++++++--------------------- src/include/game/game_19c990.h | 1 + src/include/game/game_1a3340.h | 2 +- src/include/types.h | 3 +- 6 files changed, 47 insertions(+), 82 deletions(-) diff --git a/src/game/data/data_02e820.c b/src/game/data/data_02e820.c index 5987a061d..962a9f173 100644 --- a/src/game/data/data_02e820.c +++ b/src/game/data/data_02e820.c @@ -91,7 +91,7 @@ struct menu_item menuitems_frtraininginfo[] = { { MENUITEMTYPE_SEPARATOR, 0, 0x00000000, 0x00000000, 0x00000000, NULL }, { MENUITEMTYPE_SCROLLABLE, 6, 0x00004000, 0x0000010e, 0x0000005f, NULL }, { MENUITEMTYPE_SEPARATOR, 0, 0x00000000, 0x00000000, 0x00000000, NULL }, - { MENUITEMTYPE_SELECTABLE, 0, 0x00000028, L_OPTIONS(3), L_MPMENU(428), menuhandler001a3340 }, // "", "Resume" + { MENUITEMTYPE_SELECTABLE, 0, 0x00000028, L_OPTIONS(3), L_MPMENU(428), frDetailsOkMenuHandler }, // "", "Resume" { MENUITEMTYPE_SELECTABLE, 0, 0x00000028, L_OPTIONS(3), L_MPMENU(430), menuhandler001a3448 }, // "", "Abort" { MENUITEMTYPE_END, 0, 0x00000000, 0x00000000, 0x00000000, NULL }, }; @@ -116,7 +116,7 @@ struct menu_item menuitems_frtraininginfo2[] = { { MENUITEMTYPE_SEPARATOR, 0, 0x00000000, 0x00000000, 0x00000000, NULL }, { MENUITEMTYPE_SCROLLABLE, 6, 0x00004000, 0x0000010e, 0x0000005f, NULL }, { MENUITEMTYPE_SEPARATOR, 0, 0x00000000, 0x00000000, 0x00000000, NULL }, - { MENUITEMTYPE_SELECTABLE, 0, 0x00000028, L_OPTIONS(3), L_MPMENU(427), menuhandler001a3340 }, // "", "Ok" + { MENUITEMTYPE_SELECTABLE, 0, 0x00000028, L_OPTIONS(3), L_MPMENU(427), frDetailsOkMenuHandler }, // "", "Ok" { MENUITEMTYPE_SELECTABLE, 0, 0x00000028, L_OPTIONS(3), L_MPMENU(429), menuhandler001a3448 }, // "", "Cancel" { MENUITEMTYPE_END, 0, 0x00000000, 0x00000000, 0x00000000, NULL }, }; diff --git a/src/game/game_19c990.c b/src/game/game_19c990.c index aabf5f563..6a6556c46 100644 --- a/src/game/game_19c990.c +++ b/src/game/game_19c990.c @@ -1312,7 +1312,7 @@ void func0f19de24(void) } } -u32 var8008889c = 1; +s32 g_FrWeaponNum = WEAPON_UNARMED; GLOBAL_ASM( glabel func0f19def4 diff --git a/src/game/game_1a3340.c b/src/game/game_1a3340.c index 8f096fb4a..dbc39dc20 100644 --- a/src/game/game_1a3340.c +++ b/src/game/game_1a3340.c @@ -36,82 +36,47 @@ const char var7f1b97d0[] = "\n"; const char var7f1b97d4[] = "\n"; -GLOBAL_ASM( -glabel menuhandler001a3340 -/* f1a3340: 27bdffe0 */ addiu $sp,$sp,-32 -/* f1a3344: 24010006 */ addiu $at,$zero,0x6 -/* f1a3348: afbf0014 */ sw $ra,0x14($sp) -/* f1a334c: afa50024 */ sw $a1,0x24($sp) -/* f1a3350: 10810006 */ beq $a0,$at,.L0f1a336c -/* f1a3354: afa60028 */ sw $a2,0x28($sp) -/* f1a3358: 2401000f */ addiu $at,$zero,0xf -/* f1a335c: 54810036 */ bnel $a0,$at,.L0f1a3438 -/* f1a3360: 00001025 */ or $v0,$zero,$zero -/* f1a3364: 10000034 */ beqz $zero,.L0f1a3438 -/* f1a3368: 24020001 */ addiu $v0,$zero,0x1 -.L0f1a336c: -/* f1a336c: 0fc6830c */ jal frIsInTraining -/* f1a3370: 00000000 */ sll $zero,$zero,0x0 -/* f1a3374: 1440002d */ bnez $v0,.L0f1a342c -/* f1a3378: 00000000 */ sll $zero,$zero,0x0 -/* f1a337c: 0fc67494 */ jal frGetSlot -/* f1a3380: 00000000 */ sll $zero,$zero,0x0 -/* f1a3384: 0fc6749a */ jal frGetWeaponBySlot -/* f1a3388: 00402025 */ or $a0,$v0,$zero -/* f1a338c: 3c048009 */ lui $a0,%hi(var8008889c) -/* f1a3390: 8c84889c */ lw $a0,%lo(var8008889c)($a0) -/* f1a3394: 24010001 */ addiu $at,$zero,0x1 -/* f1a3398: afa20018 */ sw $v0,0x18($sp) -/* f1a339c: 50810004 */ beql $a0,$at,.L0f1a33b0 -/* f1a33a0: 8fae0018 */ lw $t6,0x18($sp) -/* f1a33a4: 0fc447a9 */ jal currentPlayerRemoveWeapon -/* f1a33a8: 00000000 */ sll $zero,$zero,0x0 -/* f1a33ac: 8fae0018 */ lw $t6,0x18($sp) -.L0f1a33b0: -/* f1a33b0: 24010001 */ addiu $at,$zero,0x1 -/* f1a33b4: 11c10003 */ beq $t6,$at,.L0f1a33c4 -/* f1a33b8: 00000000 */ sll $zero,$zero,0x0 -/* f1a33bc: 0fc44762 */ jal currentPlayerGiveWeapon -/* f1a33c0: 01c02025 */ or $a0,$t6,$zero -.L0f1a33c4: -/* f1a33c4: 0fc44bd8 */ jal currentPlayerSetEquipCurItem -/* f1a33c8: 24040001 */ addiu $a0,$zero,0x1 -/* f1a33cc: 0fc2866a */ jal getCurrentPlayerWeaponId -/* f1a33d0: 00002025 */ or $a0,$zero,$zero -/* f1a33d4: 8fa50018 */ lw $a1,0x18($sp) -/* f1a33d8: 10450004 */ beq $v0,$a1,.L0f1a33ec -/* f1a33dc: 00000000 */ sll $zero,$zero,0x0 -/* f1a33e0: 0fc28824 */ jal currentPlayerEquipWeapon -/* f1a33e4: 00002025 */ or $a0,$zero,$zero -/* f1a33e8: 8fa50018 */ lw $a1,0x18($sp) -.L0f1a33ec: -/* f1a33ec: 3c018009 */ lui $at,%hi(var8008889c) -/* f1a33f0: 3c03800a */ lui $v1,%hi(g_Vars) -/* f1a33f4: ac25889c */ sw $a1,%lo(var8008889c)($at) -/* f1a33f8: 24639fc0 */ addiu $v1,$v1,%lo(g_Vars) -/* f1a33fc: 00001025 */ or $v0,$zero,$zero -/* f1a3400: 24040008 */ addiu $a0,$zero,0x8 -.L0f1a3404: -/* f1a3404: 8c6f0284 */ lw $t7,0x284($v1) -/* f1a3408: 01e2c021 */ addu $t8,$t7,$v0 -/* f1a340c: a7000d74 */ sh $zero,0xd74($t8) -/* f1a3410: 8c790284 */ lw $t9,0x284($v1) -/* f1a3414: 03224021 */ addu $t0,$t9,$v0 -/* f1a3418: 24420002 */ addiu $v0,$v0,0x2 -/* f1a341c: 1444fff9 */ bne $v0,$a0,.L0f1a3404 -/* f1a3420: a5001518 */ sh $zero,0x1518($t0) -/* f1a3424: 0fc67a70 */ jal func0f19e9c0 -/* f1a3428: 00a02025 */ or $a0,$a1,$zero -.L0f1a342c: -/* f1a342c: 0fc3e048 */ jal func0f0f8120 -/* f1a3430: 00000000 */ sll $zero,$zero,0x0 -/* f1a3434: 00001025 */ or $v0,$zero,$zero -.L0f1a3438: -/* f1a3438: 8fbf0014 */ lw $ra,0x14($sp) -/* f1a343c: 27bd0020 */ addiu $sp,$sp,0x20 -/* f1a3440: 03e00008 */ jr $ra -/* f1a3444: 00000000 */ sll $zero,$zero,0x0 -); +s32 frDetailsOkMenuHandler(u32 operation, struct menu_item *item, s32 *value) +{ + s32 i; + + switch (operation) { + case MENUOP_CHECKPREFOCUSED: + return true; + case MENUOP_SET: + if (frIsInTraining() == false) { + s32 weapon = frGetWeaponBySlot(frGetSlot()); + + if (g_FrWeaponNum != 1) { + currentPlayerRemoveWeapon(g_FrWeaponNum); + } + + if (weapon != WEAPON_UNARMED) { + currentPlayerGiveWeapon(weapon); + } + + currentPlayerSetEquipCurItem(1); + + if (getCurrentPlayerWeaponId(0) != weapon) { + currentPlayerEquipWeapon(0, weapon); + } + + g_FrWeaponNum = weapon; + + for (i = 0; i < 4; i++) { + g_Vars.currentplayer->unk0638[0].unk0d74[i] = 0; + g_Vars.currentplayer->unk0638[1].unk0d74[i] = 0; + } + + func0f19e9c0(weapon); + } + + func0f0f8120(); + break; + } + + return 0; +} s32 menuhandler001a3448(u32 operation, struct menu_item *item, s32 *value) { diff --git a/src/include/game/game_19c990.h b/src/include/game/game_19c990.h index 9565379d6..8da49cccb 100644 --- a/src/include/game/game_19c990.h +++ b/src/include/game/game_19c990.h @@ -4,6 +4,7 @@ #include "types.h" extern u8 var80088804; +extern s32 g_FrWeaponNum; extern u8 var800888a0; bool ciIsTourDone(void); diff --git a/src/include/game/game_1a3340.h b/src/include/game/game_1a3340.h index e113e2582..5f7e507e4 100644 --- a/src/include/game/game_1a3340.h +++ b/src/include/game/game_1a3340.h @@ -45,7 +45,7 @@ bool menudialogDeviceTrainingResults(u32 operation, struct menu_dialog *dialog, bool menudialog001a6aa4(u32 operation, struct menu_dialog *dialog, struct menustackitem *stackitem); bool menudialogFiringRangeResults(u32 operation, struct menu_dialog *dialog, struct menustackitem *stackitem); s32 menudialog001a737c(u32, u32, u32 *); -s32 menuhandler001a3340(u32, u32, u32 *); +s32 frDetailsOkMenuHandler(u32 operation, struct menu_item *item, s32 *value); s32 menuhandler001a3448(u32 operation, struct menu_item *item, s32 *value); s32 menuhandler001a348c(u32, u32, u32 *); s32 menuhandler001a44c0(u32, u32, u32 *); diff --git a/src/include/types.h b/src/include/types.h index 0d95f52b3..6d76a00bf 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1621,8 +1621,7 @@ struct player638 { /*0x0d68*/ u32 unk0d68; /*0x0d6c*/ u32 unk0d6c; /*0x0d70*/ u32 unk0d70; - /*0x0d74*/ u32 unk0d74; - /*0x0d78*/ u32 unk0d78; + /*0x0d74*/ u16 unk0d74[4]; /*0x0d7c*/ u32 unk0d7c; /*0x0d80*/ u32 unk0d80; /*0x0d84*/ void *unk0d84;