From 845c8cd59df21bb44ff5528394a4d883d98e11f8 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 12 Mar 2020 18:28:30 +1000 Subject: [PATCH] Attempt to decompile aibotGiveAmmo --- src/game/game_097ba0.c | 2 +- src/game/game_190260.c | 12 ++++++------ src/game/game_1999b0.c | 31 +++++++++++++++++++++++++++---- src/game/game_19c990.c | 10 +++++----- src/game/propobj.c | 10 +++++----- src/include/game/game_097ba0.h | 2 +- src/include/game/game_1999b0.h | 2 +- src/include/types.h | 6 +++--- 8 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/game/game_097ba0.c b/src/game/game_097ba0.c index 618156eae..ac99c7dcb 100644 --- a/src/game/game_097ba0.c +++ b/src/game/game_097ba0.c @@ -21692,7 +21692,7 @@ glabel currentPlayerGetAmmoCount ); GLOBAL_ASM( -glabel func0f0a98f4 +glabel ammotypeGetMaxCapacity /* f0a98f4: 00047080 */ sll $t6,$a0,0x2 /* f0a98f8: 01c47023 */ subu $t6,$t6,$a0 /* f0a98fc: 000e7080 */ sll $t6,$t6,0x2 diff --git a/src/game/game_190260.c b/src/game/game_190260.c index fa374662f..19e67a180 100644 --- a/src/game/game_190260.c +++ b/src/game/game_190260.c @@ -789,7 +789,7 @@ glabel var7f1b8ea8 /* f190df4: 9124005c */ lbu $a0,0x5c($t1) /* f190df8: 0fc6666c */ jal func0f1999b0 /* f190dfc: 9125005f */ lbu $a1,0x5f($t1) -/* f190e00: 0fc2a63d */ jal func0f0a98f4 +/* f190e00: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f190e04: 00402025 */ or $a0,$v0,$zero /* f190e08: 0202082a */ slt $at,$s0,$v0 /* f190e0c: 54200004 */ bnezl $at,.L0f190e20 @@ -823,7 +823,7 @@ glabel var7f1b8ea8 /* f190e70: 0fc6672e */ jal func0f199cb8 /* f190e74: 8dc402d4 */ lw $a0,0x2d4($t6) /* f190e78: 8e04005c */ lw $a0,0x5c($s0) -/* f190e7c: 0fc2a63d */ jal func0f0a98f4 +/* f190e7c: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f190e80: afa20034 */ sw $v0,0x34($sp) /* f190e84: 8fa50034 */ lw $a1,0x34($sp) /* f190e88: 00a2082a */ slt $at,$a1,$v0 @@ -865,7 +865,7 @@ glabel var7f1b8ea8 /* f190f0c: 0fc6672e */ jal func0f199cb8 /* f190f10: afa30028 */ sw $v1,0x28($sp) /* f190f14: 02002025 */ or $a0,$s0,$zero -/* f190f18: 0fc2a63d */ jal func0f0a98f4 +/* f190f18: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f190f1c: afa20034 */ sw $v0,0x34($sp) /* f190f20: 8fa50034 */ lw $a1,0x34($sp) /* f190f24: 8fa30028 */ lw $v1,0x28($sp) @@ -4384,13 +4384,13 @@ glabel var7f1b8f50 /* f1941f4: 8e640000 */ lw $a0,0x0($s3) /* f1941f8: 0fc6666c */ jal func0f1999b0 /* f1941fc: 00002825 */ or $a1,$zero,$zero -/* f194200: 0fc2a63d */ jal func0f0a98f4 +/* f194200: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f194204: 00402025 */ or $a0,$v0,$zero /* f194208: 0040b825 */ or $s7,$v0,$zero /* f19420c: 8e640000 */ lw $a0,0x0($s3) /* f194210: 0fc6666c */ jal func0f1999b0 /* f194214: 24050001 */ addiu $a1,$zero,0x1 -/* f194218: 0fc2a63d */ jal func0f0a98f4 +/* f194218: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f19421c: 00402025 */ or $a0,$v0,$zero /* f194220: 8e650000 */ lw $a1,0x0($s3) /* f194224: 3c038008 */ lui $v1,%hi(var80087eb4) @@ -4660,7 +4660,7 @@ glabel var7f1b8f50 /* f1945d0: 0fc6672e */ jal func0f199cb8 /* f1945d4: 00003025 */ or $a2,$zero,$zero /* f1945d8: 00409025 */ or $s2,$v0,$zero -/* f1945dc: 0fc2a63d */ jal func0f0a98f4 +/* f1945dc: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f1945e0: 02002025 */ or $a0,$s0,$zero /* f1945e4: 0242082a */ slt $at,$s2,$v0 /* f1945e8: 10200008 */ beqz $at,.L0f19460c diff --git a/src/game/game_1999b0.c b/src/game/game_1999b0.c index 51cd0cf4e..983b5192c 100644 --- a/src/game/game_1999b0.c +++ b/src/game/game_1999b0.c @@ -203,7 +203,7 @@ glabel func0f199be4 /* f199c1c: 00a02025 */ or $a0,$a1,$zero /* f199c20: 0fc6666c */ jal func0f1999b0 /* f199c24: 00c02825 */ or $a1,$a2,$zero -/* f199c28: 0fc2a63d */ jal func0f0a98f4 +/* f199c28: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f199c2c: 00402025 */ or $a0,$v0,$zero /* f199c30: 10000007 */ beqz $zero,.L0f199c50 /* f199c34: 00401825 */ or $v1,$v0,$zero @@ -260,7 +260,7 @@ glabel func0f199cb8 /* f199ce0: 31cf0001 */ andi $t7,$t6,0x1 /* f199ce4: 51e00007 */ beqzl $t7,.L0f199d04 /* f199ce8: 8cf8001c */ lw $t8,0x1c($a3) -/* f199cec: 0fc2a63d */ jal func0f0a98f4 +/* f199cec: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f199cf0: afa70020 */ sw $a3,0x20($sp) /* f199cf4: 8fa70020 */ lw $a3,0x20($sp) /* f199cf8: 10000005 */ beqz $zero,.L0f199d10 @@ -393,7 +393,7 @@ glabel func0f199e3c /* f199eb0: 8fa40024 */ lw $a0,0x24($sp) /* f199eb4: 0fc6666c */ jal func0f1999b0 /* f199eb8: afa30018 */ sw $v1,0x18($sp) -/* f199ebc: 0fc2a63d */ jal func0f0a98f4 +/* f199ebc: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f199ec0: 00402025 */ or $a0,$v0,$zero /* f199ec4: 8fa30018 */ lw $v1,0x18($sp) /* f199ec8: 8c6c0000 */ lw $t4,0x0($v1) @@ -436,7 +436,7 @@ glabel aibotGiveAmmo /* f199f40: 8c680000 */ lw $t0,0x0($v1) /* f199f44: 01064821 */ addu $t1,$t0,$a2 /* f199f48: ac690000 */ sw $t1,0x0($v1) -/* f199f4c: 0fc2a63d */ jal func0f0a98f4 +/* f199f4c: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f199f50: afa30018 */ sw $v1,0x18($sp) /* f199f54: 8fa30018 */ lw $v1,0x18($sp) /* f199f58: 8c6a0000 */ lw $t2,0x0($v1) @@ -455,6 +455,29 @@ glabel aibotGiveAmmo /* f199f80: 00000000 */ sll $zero,$zero,0x0 ); +// Mismatches because the target saves the heldquantity pointer to the stack +// before calling to ammotypeGetMaxCapacity, despite it already being saved. +//void aibotGiveAmmo(struct aibot *aibot, u32 ammotype, s32 quantity) +//{ +// s32 max; +// s32 *heldquantity = &aibot->ammotypes->quantities[ammotype]; +// +// if (!aibot || (aibot->unk064 & 1) || quantity <= 0) { +// return; +// } +// +// dprint(); +// +// *heldquantity += quantity; +// max = ammotypeGetMaxCapacity(ammotype); +// +// if (*heldquantity > max) { +// *heldquantity = max; +// } +// +// dprint(); +//} + GLOBAL_ASM( glabel func0f199f84 .late_rodata diff --git a/src/game/game_19c990.c b/src/game/game_19c990.c index af9e93d2c..d71014fee 100644 --- a/src/game/game_19c990.c +++ b/src/game/game_19c990.c @@ -1364,7 +1364,7 @@ glabel var7f1b93ec /* f19dbc0: 00402025 */ or $a0,$v0,$zero /* f19dbc4: 0fc2a685 */ jal weaponGetAmmoType /* f19dbc8: 00002825 */ or $a1,$zero,$zero -/* f19dbcc: 0fc2a63d */ jal func0f0a98f4 +/* f19dbcc: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f19dbd0: 00402025 */ or $a0,$v0,$zero /* f19dbd4: 920f0448 */ lbu $t7,0x448($s0) /* f19dbd8: 26310004 */ addiu $s1,$s1,0x4 @@ -1386,7 +1386,7 @@ glabel var7f1b93ec .L0f19dc14: /* f19dc14: 10000073 */ beqz $zero,.L0f19dde4 /* f19dc18: 92220000 */ lbu $v0,0x0($s1) -/* f19dc1c: 0fc2a63d */ jal func0f0a98f4 +/* f19dc1c: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f19dc20: 2404000b */ addiu $a0,$zero,0xb /* f19dc24: 92080448 */ lbu $t0,0x448($s0) /* f19dc28: 26310004 */ addiu $s1,$s1,0x4 @@ -2346,7 +2346,7 @@ glabel func0f19e900 /* f19e90c: 0fc2a685 */ jal weaponGetAmmoType /* f19e910: 00002825 */ or $a1,$zero,$zero /* f19e914: afa20020 */ sw $v0,0x20($sp) -/* f19e918: 0fc2a63d */ jal func0f0a98f4 +/* f19e918: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f19e91c: 00402025 */ or $a0,$v0,$zero /* f19e920: 0fc6757d */ jal func0f19d5f4 /* f19e924: afa2001c */ sw $v0,0x1c($sp) @@ -3897,7 +3897,7 @@ glabel var7f1b94e4 /* f19fd4c: 0fc2a685 */ jal weaponGetAmmoType /* f19fd50: 00002825 */ or $a1,$zero,$zero /* f19fd54: 00408825 */ or $s1,$v0,$zero -/* f19fd58: 0fc2a63d */ jal func0f0a98f4 +/* f19fd58: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f19fd5c: 00402025 */ or $a0,$v0,$zero /* f19fd60: 00408025 */ or $s0,$v0,$zero /* f19fd64: 02402025 */ or $a0,$s2,$zero @@ -3940,7 +3940,7 @@ glabel var7f1b94e4 .L0f19fde8: /* f19fde8: 5641001d */ bnel $s2,$at,.L0f19fe60 /* f19fdec: a2a0045a */ sb $zero,0x45a($s5) -/* f19fdf0: 0fc2a63d */ jal func0f0a98f4 +/* f19fdf0: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f19fdf4: 2404000b */ addiu $a0,$zero,0xb /* f19fdf8: 86a30478 */ lh $v1,0x478($s5) /* f19fdfc: 00408025 */ or $s0,$v0,$zero diff --git a/src/game/propobj.c b/src/game/propobj.c index 942dcfee7..ead8704e5 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -39207,7 +39207,7 @@ glabel func0f088028 /* f088048: 0fc2a5dc */ jal ammoGetQuantity /* f08804c: 00000000 */ sll $zero,$zero,0x0 /* f088050: afa20020 */ sw $v0,0x20($sp) -/* f088054: 0fc2a63d */ jal func0f0a98f4 +/* f088054: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f088058: 02002025 */ or $a0,$s0,$zero /* f08805c: 8faf0020 */ lw $t7,0x20($sp) /* f088060: 01e2082a */ slt $at,$t7,$v0 @@ -40104,7 +40104,7 @@ glabel var7f1aae70 /* f088ccc: 0fc2a5dc */ jal ammoGetQuantity /* f088cd0: afa20054 */ sw $v0,0x54($sp) /* f088cd4: 8fa4006c */ lw $a0,0x6c($sp) -/* f088cd8: 0fc2a63d */ jal func0f0a98f4 +/* f088cd8: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f088cdc: afa2003c */ sw $v0,0x3c($sp) /* f088ce0: 8fa6003c */ lw $a2,0x3c($sp) /* f088ce4: 8fa50054 */ lw $a1,0x54($sp) @@ -40135,7 +40135,7 @@ glabel var7f1aae70 /* f088d40: 0fc2a5dc */ jal ammoGetQuantity /* f088d44: 2404000b */ addiu $a0,$zero,0xb /* f088d48: 2404000b */ addiu $a0,$zero,0xb -/* f088d4c: 0fc2a63d */ jal func0f0a98f4 +/* f088d4c: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f088d50: afa2003c */ sw $v0,0x3c($sp) /* f088d54: 8fa6003c */ lw $a2,0x3c($sp) /* f088d58: 00c2082a */ slt $at,$a2,$v0 @@ -40638,7 +40638,7 @@ glabel var7f1aae84 /* f08940c: 0fc2a5dc */ jal ammoGetQuantity /* f089410: 8e04005c */ lw $a0,0x5c($s0) /* f089414: 8e04005c */ lw $a0,0x5c($s0) -/* f089418: 0fc2a63d */ jal func0f0a98f4 +/* f089418: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f08941c: afa20030 */ sw $v0,0x30($sp) /* f089420: 8fa30030 */ lw $v1,0x30($sp) /* f089424: 0062082a */ slt $at,$v1,$v0 @@ -40745,7 +40745,7 @@ glabel var7f1aae84 /* f08958c: 0fc2a5dc */ jal ammoGetQuantity /* f089590: afa30028 */ sw $v1,0x28($sp) /* f089594: 02002025 */ or $a0,$s0,$zero -/* f089598: 0fc2a63d */ jal func0f0a98f4 +/* f089598: 0fc2a63d */ jal ammotypeGetMaxCapacity /* f08959c: afa20030 */ sw $v0,0x30($sp) /* f0895a0: 8fa30030 */ lw $v1,0x30($sp) /* f0895a4: 0062082a */ slt $at,$v1,$v0 diff --git a/src/include/game/game_097ba0.h b/src/include/game/game_097ba0.h index 9efb7a768..7e064adff 100644 --- a/src/include/game/game_097ba0.h +++ b/src/include/game/game_097ba0.h @@ -154,7 +154,7 @@ void func0f0a95ec(u32 arg0, u32 arg1); void currentPlayerGiveAmmo(s32 ammotype, s32 quantity); s32 ammoGetQuantity(u32 type); s32 currentPlayerGetAmmoCount(s8 arg0); -u32 func0f0a98f4(void); +s32 ammotypeGetMaxCapacity(u32 ammotype); bool ammotypeAllowsUnlimitedAmmo(u32 ammotype); u32 func0f0a9980(void); s32 weaponGetAmmoType(s32 weaponnum, u32 func); diff --git a/src/include/game/game_1999b0.h b/src/include/game/game_1999b0.h index e3d1816bd..7be209945 100644 --- a/src/include/game/game_1999b0.h +++ b/src/include/game/game_1999b0.h @@ -10,7 +10,7 @@ u32 func0f199be4(void); u32 func0f199cb8(void); u32 func0f199d70(void); void func0f199e3c(struct aibot *aibot, u32 weaponnum, bool proxy, u32 qty); -void aibotGiveAmmo(struct aibot *aibot, u32 ammotype, u32 qty); +void aibotGiveAmmo(struct aibot *aibot, u32 ammotype, s32 quantity); u32 func0f199f84(void); bool func0f19a29c(u32 value, bool fallback); u32 func0f19a2dc(u32 value); diff --git a/src/include/types.h b/src/include/types.h index d0fca5d01..36f83b31d 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -137,8 +137,8 @@ struct animdata { /*0x20*/ struct anim *anim; }; -struct aibot_01c { - u32 unk00[33]; +struct aibotammotype { + s32 quantities[33]; }; struct aibot { @@ -150,7 +150,7 @@ struct aibot { /*0x010*/ struct prop *prop; /*0x014*/ u32 unk014; /*0x018*/ u32 unk018; - /*0x01c*/ struct aibot_01c *unk01c; + /*0x01c*/ struct aibotammotype *ammotypes; /*0x020*/ u32 unk020; /*0x024*/ u32 unk024; /*0x028*/ u32 unk028;