From 215367dd202678f2610f30d9a9969c6cd86d70c5 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 26 Feb 2021 18:39:25 +1000 Subject: [PATCH] Attempt to decompile func0f190be4 --- src/game/game_190260.c | 191 ++++++++++++++++++++++++++++++++++++- src/game/propobj.c | 10 +- src/include/game/propobj.h | 4 +- 3 files changed, 197 insertions(+), 8 deletions(-) diff --git a/src/game/game_190260.c b/src/game/game_190260.c index a207ca528..f2968d841 100644 --- a/src/game/game_190260.c +++ b/src/game/game_190260.c @@ -703,7 +703,7 @@ glabel var7f1b8ea8 /* f190c50: 1000014b */ b .L0f191180 /* f190c54: 00001025 */ or $v0,$zero,$zero .L0f190c58: -/* f190c58: 0fc21465 */ jal func0f085194 +/* f190c58: 0fc21465 */ jal objIsCollectableByDefault /* f190c5c: 8fa40084 */ lw $a0,0x84($sp) /* f190c60: 5040000d */ beqzl $v0,.L0f190c98 /* f190c64: 8fa20084 */ lw $v0,0x84($sp) @@ -1069,6 +1069,195 @@ glabel var7f1b8ea8 /* f191190: 00000000 */ nop ); +// Mismatch: Uses too many callee-save registers +//bool func0f190be4(struct prop *prop, struct chrdata *chr) +//{ +// struct defaultobj *obj = prop->obj; // 84 +// +// struct weaponobj *weaponobj; // 80 +// s32 itemtype; // 7c +// struct weapon *weapon; +// bool singleonly; +// s32 cap; +// s32 qty; +// +// struct ammocrateobj *crate; +// +// s32 weaponnum; // 68 +// bool ignore1; // 64 +// struct multiammocrateobj *crate2; +// +// struct shieldobj *shield; // 58 +// bool ignore2; +// +// struct prop *chrprop; +// +// f32 xdist; // 4c +// f32 ydist; // 48 +// f32 zdist; // 44 +// f32 sqrange; +// bool sp3c; +// s32 i; +// f32 latdist; +// u32 stack; +// +// if (!chr || !chr->aibot || !g_Vars.lvmpbotlevel || chrIsDead(chr)) { +// return false; +// } +// +// dprint(); +// +// if (prop->timetoregen != 0) { +// return false; +// } +// +// if (objIsCollectableByDefault(obj) && obj->type != OBJTYPE_HAT) { +// if (obj->flags & OBJFLAG_UNCOLLECTABLE) { +// return false; +// } +// } else { +// if ((obj->flags & OBJFLAG_COLLECTABLE) == 0) { +// return false; +// } +// } +// +// dprint(); +// +// if ((obj->hidden & OBJHFLAG_00000004) || (obj->flags & OBJFLAG_00080000)) { +// return false; +// } +// +// dprint(); +// +// if ((obj->hidden & OBJHFLAG_AIRBORNE) +// && obj->projectile +// && obj->projectile->unk0b4 > 0 +// && obj->projectile->unk090 == 0) { +// return false; +// } +// +// dprint(); +// +// if (!func0f066640(obj)) { +// return false; +// } +// +// dprint(); +// +// // d64 +// if (obj->type == OBJTYPE_WEAPON) { +// weaponobj = prop->weapon; // 80 +// itemtype = aibotGetInvItemType(chr, weaponobj->weaponnum); // 7c +// weapon = weaponFindById(weaponobj->weaponnum); +// singleonly = weapon && (weapon->flags & WEAPONFLAG_DUALWIELD) == 0; +// +// if (weaponobj->weaponnum != WEAPON_BRIEFCASE2) { +// // If aibot is dual wielding, or single wielding and weapon doesn't support dual, +// // ignore the pickup if at max ammo already +// if (itemtype == INVITEMTYPE_DUAL || (itemtype == INVITEMTYPE_WEAP && singleonly)) { +// qty = aibotGetAmmoQuantityByWeapon(chr->aibot, weaponobj->weaponnum, weaponobj->gunfunc, false); +// cap = ammotypeGetMaxCapacity(weaponGetAmmoTypeByFunction(weaponobj->weaponnum, weaponobj->gunfunc)); +// +// if (qty >= cap) { +// return false; +// } +// } +// +// // Ignore rockets that are in flight +// if ((weaponobj->weaponnum == WEAPON_ROCKET || weaponobj->weaponnum == WEAPON_HOMINGROCKET) +// && (obj->hidden & OBJHFLAG_AIRBORNE)) { +// return false; +// } +// } +// } else /*e58*/ if (obj->type == OBJTYPE_AMMOCRATE) { +// crate = (struct ammocrateobj *)prop->obj; +// +// // Ignore ammo crate if at max ammo already +// if (aibotGetAmmoQuantityByType(chr->aibot, crate->ammotype, false) >= ammotypeGetMaxCapacity(crate->ammotype)) { +// return false; +// } +// } else /*e9c*/ if (obj->type == OBJTYPE_MULTIAMMOCRATE) { +// crate2 = (struct multiammocrateobj *)prop->obj; +// ignore1 = true; +// +// if (func0f0687b8(obj)) { +// dprint(); +// return false; +// } +// +// for (i = 0; i < 0x13; i++) { +// weaponnum = ammotypeGetWeapon(i + 1); +// +// if (crate2->quantities[i].unk02 > 0) { +// if (aibotGetAmmoQuantityByType(chr->aibot, i + 1, false) < ammotypeGetMaxCapacity(i + 1)) { +// ignore1 = false; +// +// if (weaponnum && !aibotGetInvItemType(chr, weaponnum)) { +// dprint(); +// aibotGiveProp(chr, prop); +// } +// +// break; +// } +// } +// } +// +// if (ignore1) { +// return false; +// } +// } else /*f9c*/ if (obj->type == OBJTYPE_SHIELD) { +// shield = (struct shieldobj *)prop->obj; // 58 +// ignore2 = false; +// +// if (shield->amount <= chrGetShield(chr) * 0.125f) { +// ignore2 = true; +// } else if (g_MpSetup.scenario == MPSCENARIO_HOLDTHEBRIEFCASE && chr->aibot->unk09c_00) { +// ignore2 = true; +// } +// +// if (ignore2) { +// return false; +// } +// } +// +// // 024 +// chrprop = chr->prop; +// +// xdist = prop->pos.x - chrprop->pos.x; +// ydist = prop->pos.y - chrprop->pos.y; +// zdist = prop->pos.z - chrprop->pos.z; +// +// latdist = xdist * xdist + zdist * zdist; +// +// dprint(); +// +// if (chr->aibot->cheap) { +// sqrange = 250 * 250; +// } else { +// sqrange = 100 * 100; +// } +// +// sp3c = latdist <= sqrange && ydist >= -200 && ydist <= 200; +// +// // 108 +// if (sp3c) { +// dprint(); +// +// if ((obj->flags2 & OBJFLAG2_00001000) == 0 +// && !func0002dcd0(&chrprop->pos, chrprop->rooms, &prop->pos, prop->rooms, 0x22)) { +// sp3c = false; +// } +// } +// +// // 15c +// if (sp3c) { +// dprint(); +// return propobjHandlePickupByAibot(prop, chr); +// } +// +// return false; +//} + s32 mpObjIsSafe(struct defaultobj *obj) { if (!obj) { diff --git a/src/game/propobj.c b/src/game/propobj.c index f042a5442..72733a9a4 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -35230,7 +35230,7 @@ bool func0f085158(struct defaultobj *obj) return false; } -bool func0f085194(struct defaultobj *obj) +bool objIsCollectableByDefault(struct defaultobj *obj) { switch (obj->type) { case OBJTYPE_KEY: @@ -35257,7 +35257,7 @@ glabel func0f0851ec /* f085204: 10000016 */ b .L0f085260 /* f085208: 00001025 */ or $v0,$zero,$zero .L0f08520c: -/* f08520c: 0fc21465 */ jal func0f085194 +/* f08520c: 0fc21465 */ jal objIsCollectableByDefault /* f085210: afa40018 */ sw $a0,0x18($sp) /* f085214: 1040000b */ beqz $v0,.L0f085244 /* f085218: 8fa40018 */ lw $a0,0x18($sp) @@ -35354,7 +35354,7 @@ glabel var7f1aab30 /* f085338: 02002025 */ or $a0,$s0,$zero /* f08533c: 55a0000c */ bnezl $t5,.L0f085370 /* f085340: 8e030008 */ lw $v1,0x8($s0) -/* f085344: 0fc21465 */ jal func0f085194 +/* f085344: 0fc21465 */ jal objIsCollectableByDefault /* f085348: e7ac00c4 */ swc1 $f12,0xc4($sp) /* f08534c: 1440018f */ bnez $v0,.L0f08598c /* f085350: c7ac00c4 */ lwc1 $f12,0xc4($sp) @@ -36832,7 +36832,7 @@ glabel func0f085eac /* f086860: 1000002a */ b .L0f08690c /* f086864: 8fbf0034 */ lw $ra,0x34($sp) .L0f086868: -/* f086868: 0fc21465 */ jal func0f085194 +/* f086868: 0fc21465 */ jal objIsCollectableByDefault /* f08686c: afa00054 */ sw $zero,0x54($sp) /* f086870: 10400008 */ beqz $v0,.L0f086894 /* f086874: 8fa30054 */ lw $v1,0x54($sp) @@ -39268,7 +39268,7 @@ glabel var7f1aae84 /* f08903c: 10000262 */ b .L0f0899c8 /* f089040: 00001025 */ or $v0,$zero,$zero .L0f089044: -/* f089044: 0fc21465 */ jal func0f085194 +/* f089044: 0fc21465 */ jal objIsCollectableByDefault /* f089048: afa50084 */ sw $a1,0x84($sp) /* f08904c: 1040000b */ beqz $v0,.L0f08907c /* f089050: 8fa40084 */ lw $a0,0x84($sp) diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 6eaea5a4a..49576f0d3 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -29,7 +29,7 @@ void countdownTimerSetVisible(u32 flag, bool show); void countdownTimerTick(void); bool func0f066310(struct prop *doorprop, bool arg1); bool doorIsPadlockFree(struct doorobj *door); -u32 func0f066640(void); +bool func0f066640(struct defaultobj *obj); u32 func0f0666cc(void); u32 func0f0667ac(void); u32 func0f0667b4(void); @@ -231,7 +231,7 @@ u32 func0f084cf0(void); u32 func0f084e58(void); u32 func0f084f64(void); u32 func0f085050(void); -bool func0f085194(struct defaultobj *obj); +bool objIsCollectableByDefault(struct defaultobj *obj); u32 func0f0851ec(void); void func0f085270(struct defaultobj *obj, f32 damage, struct coord *pos, s32 weaponnum, s32 playernum); void func0f0852ac(struct defaultobj *obj, f32 damage, struct coord *pos, s32 arg3, s32 arg4);