From 31d9765da7881d7fe02fc6f6ed6d08fab7e62bd1 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 4 Mar 2021 17:52:23 +1000 Subject: [PATCH] Decompile currentPlayerHasAmmoForWeapon --- src/game/activemenu/activemenu.c | 2 +- src/game/game_097ba0.c | 108 ++++++++++++------------------- src/include/game/game_097ba0.h | 2 +- 3 files changed, 45 insertions(+), 67 deletions(-) diff --git a/src/game/activemenu/activemenu.c b/src/game/activemenu/activemenu.c index eedb8086f..8bc9ad6d1 100644 --- a/src/game/activemenu/activemenu.c +++ b/src/game/activemenu/activemenu.c @@ -751,7 +751,7 @@ void amGetSlotDetails(s32 slot, u32 *flags, char *label) weaponnum = invGetWeaponNumByIndex(g_AmMenus[g_AmIndex].invindexes[slot]); - if (func0f0a1d14(weaponnum) == false) { + if (!currentPlayerHasAmmoForWeapon(weaponnum)) { *flags |= AMSLOTFLAG_NOAMMO; } break; diff --git a/src/game/game_097ba0.c b/src/game/game_097ba0.c index 411614b12..b1a2120e5 100644 --- a/src/game/game_097ba0.c +++ b/src/game/game_097ba0.c @@ -11869,71 +11869,49 @@ glabel func0f0a1c2c /* f0a1d10: 00000000 */ nop ); -GLOBAL_ASM( -glabel func0f0a1d14 -/* f0a1d14: 27bdffd0 */ addiu $sp,$sp,-48 -/* f0a1d18: afbf002c */ sw $ra,0x2c($sp) -/* f0a1d1c: afb50028 */ sw $s5,0x28($sp) -/* f0a1d20: afb30020 */ sw $s3,0x20($sp) -/* f0a1d24: afb2001c */ sw $s2,0x1c($sp) -/* f0a1d28: 00809825 */ or $s3,$a0,$zero -/* f0a1d2c: afb40024 */ sw $s4,0x24($sp) -/* f0a1d30: afb10018 */ sw $s1,0x18($sp) -/* f0a1d34: afb00014 */ sw $s0,0x14($sp) -/* f0a1d38: 00009025 */ or $s2,$zero,$zero -/* f0a1d3c: 0fc2c3f4 */ jal weaponFindById -/* f0a1d40: 0000a825 */ or $s5,$zero,$zero -/* f0a1d44: 14400003 */ bnez $v0,.L0f0a1d54 -/* f0a1d48: 0040a025 */ or $s4,$v0,$zero -/* f0a1d4c: 10000020 */ b .L0f0a1dd0 -/* f0a1d50: 24020001 */ addiu $v0,$zero,0x1 -.L0f0a1d54: -/* f0a1d54: 00008025 */ or $s0,$zero,$zero -/* f0a1d58: 24110002 */ addiu $s1,$zero,0x2 -/* f0a1d5c: 02602025 */ or $a0,$s3,$zero -.L0f0a1d60: -/* f0a1d60: 0fc2c401 */ jal weaponGetFunctionById -/* f0a1d64: 02002825 */ or $a1,$s0,$zero -/* f0a1d68: 5040000f */ beqzl $v0,.L0f0a1da8 -/* f0a1d6c: 26100001 */ addiu $s0,$s0,0x1 -/* f0a1d70: 80440007 */ lb $a0,0x7($v0) -/* f0a1d74: 0480000b */ bltz $a0,.L0f0a1da4 -/* f0a1d78: 00047080 */ sll $t6,$a0,0x2 -/* f0a1d7c: 028e7821 */ addu $t7,$s4,$t6 -/* f0a1d80: 8de3001c */ lw $v1,0x1c($t7) -/* f0a1d84: 50600008 */ beqzl $v1,.L0f0a1da8 -/* f0a1d88: 26100001 */ addiu $s0,$s0,0x1 -/* f0a1d8c: 24120001 */ addiu $s2,$zero,0x1 -/* f0a1d90: 0fc2a61a */ jal currentPlayerGetAmmoCount -/* f0a1d94: 8c640000 */ lw $a0,0x0($v1) -/* f0a1d98: 58400003 */ blezl $v0,.L0f0a1da8 -/* f0a1d9c: 26100001 */ addiu $s0,$s0,0x1 -/* f0a1da0: 24150001 */ addiu $s5,$zero,0x1 -.L0f0a1da4: -/* f0a1da4: 26100001 */ addiu $s0,$s0,0x1 -.L0f0a1da8: -/* f0a1da8: 5611ffed */ bnel $s0,$s1,.L0f0a1d60 -/* f0a1dac: 02602025 */ or $a0,$s3,$zero -/* f0a1db0: 16400003 */ bnez $s2,.L0f0a1dc0 -/* f0a1db4: 24010001 */ addiu $at,$zero,0x1 -/* f0a1db8: 10000005 */ b .L0f0a1dd0 -/* f0a1dbc: 24020001 */ addiu $v0,$zero,0x1 -.L0f0a1dc0: -/* f0a1dc0: 16a10003 */ bne $s5,$at,.L0f0a1dd0 -/* f0a1dc4: 00001025 */ or $v0,$zero,$zero -/* f0a1dc8: 10000001 */ b .L0f0a1dd0 -/* f0a1dcc: 24020001 */ addiu $v0,$zero,0x1 -.L0f0a1dd0: -/* f0a1dd0: 8fbf002c */ lw $ra,0x2c($sp) -/* f0a1dd4: 8fb00014 */ lw $s0,0x14($sp) -/* f0a1dd8: 8fb10018 */ lw $s1,0x18($sp) -/* f0a1ddc: 8fb2001c */ lw $s2,0x1c($sp) -/* f0a1de0: 8fb30020 */ lw $s3,0x20($sp) -/* f0a1de4: 8fb40024 */ lw $s4,0x24($sp) -/* f0a1de8: 8fb50028 */ lw $s5,0x28($sp) -/* f0a1dec: 03e00008 */ jr $ra -/* f0a1df0: 27bd0030 */ addiu $sp,$sp,0x30 -); +/** + * Return true if the player has ammo for the given weapon (for either function) + * or if the weapon doesn't support ammo. + * + * Used by the active menu to colour the slots. + */ +bool currentPlayerHasAmmoForWeapon(s32 weaponnum) +{ + bool ammodefexists = false; + bool hasammo = false; + struct weapon *weapon = weaponFindById(weaponnum); + s32 i; + + if (weapon == NULL) { + return true; + } + + for (i = 0; i < 2; i++) { + struct weaponfunc *func = weaponGetFunctionById(weaponnum, i); + + if (func && func->ammoindex >= 0) { + struct inventory_ammo *ammo = weapon->ammos[func->ammoindex]; + + if (ammo) { + ammodefexists = true; + + if (currentPlayerGetAmmoCount(ammo->type) > 0) { + hasammo = true; + } + } + } + } + + if (!ammodefexists) { + return true; + } + + if (hasammo == true) { + return true; + } + + return false; +} GLOBAL_ASM( glabel func0f0a1df4 diff --git a/src/include/game/game_097ba0.h b/src/include/game/game_097ba0.h index 6114299fb..aa675db3a 100644 --- a/src/include/game/game_097ba0.h +++ b/src/include/game/game_097ba0.h @@ -96,7 +96,7 @@ s32 func0f0a1a68(s32 arg0); void func0f0a1ab0(void); void func0f0a1b50(void); void func0f0a1c2c(void); -bool func0f0a1d14(u32 weaponnum); +bool currentPlayerHasAmmoForWeapon(s32 weaponnum); void func0f0a1df4(void); void currentPlayerEquipWeaponWrapper(bool arg0, s32 weaponnum); s32 handIsFiring(s32 handnum);