From 9774747b3989ac36b5212b8e9f8d4bd403e48d76 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 26 Dec 2020 13:53:15 +1000 Subject: [PATCH] Decompile obj48GetNew --- src/game/game_0b63b0.c | 4 +- src/game/propobj.c | 178 +++++++++++-------------------------- src/gvars/gvars.c | 4 +- src/include/constants.h | 4 + src/include/game/propobj.h | 4 +- src/include/gvars/gvars.h | 4 +- src/include/types.h | 4 +- 7 files changed, 65 insertions(+), 137 deletions(-) diff --git a/src/game/game_0b63b0.c b/src/game/game_0b63b0.c index db74f0642..f16e1294c 100644 --- a/src/game/game_0b63b0.c +++ b/src/game/game_0b63b0.c @@ -8197,12 +8197,12 @@ glabel var7f1ad6ac // func00015b10(sp508, &obj48->unk04); // // obj48->unkb2 = 0xffff; -// obj48->flags |= 0x00004000; +// obj48->flags |= OBJ48FLAG_00004000; // obj48->unk18 = 0; // obj48->unk14 = 0; // obj48->unk10 = 0; // -// if ((obj48->flags & 0x00000080) == 0) { +// if ((obj48->flags & OBJ48FLAG_00000080) == 0) { // obj48->unk88 = 0; // } // diff --git a/src/game/propobj.c b/src/game/propobj.c index d2b61438f..aa26c3bbc 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -2669,10 +2669,10 @@ glabel func0f068218 /* f0682d8: 27bd0040 */ addiu $sp,$sp,0x40 ); -void func0f0682dc(struct obj48 *obj48) +void obj48Free(struct obj48 *obj48) { if (obj48) { - obj48->flags |= 0x80000000; + obj48->flags |= OBJ48FLAG_FREE; } } @@ -2734,7 +2734,7 @@ void obj48Reset(struct obj48 *obj48) obj48->dropreason = 1; obj48->unk0b4 = 0; obj48->unk0d0 = 0; - obj48->unk0d4 = 0; + obj48->obj = NULL; obj48->unk0d8 = 0; obj48->unk0f4 = 0; obj48->unk0e8 = 0; @@ -2751,126 +2751,50 @@ void obj48Reset(struct obj48 *obj48) obj48->unk0f0 = 0; } -GLOBAL_ASM( -glabel func0f06843c -/* f06843c: 3c07800a */ lui $a3,%hi(var8009ce50) -/* f068440: 8ce7ce50 */ lw $a3,%lo(var8009ce50)($a3) -/* f068444: 27bdffd0 */ addiu $sp,$sp,-48 -/* f068448: afbf0014 */ sw $ra,0x14($sp) -/* f06844c: 2405ffff */ addiu $a1,$zero,-1 -/* f068450: 18e00017 */ blez $a3,.L0f0684b0 -/* f068454: 00002025 */ or $a0,$zero,$zero -/* f068458: 3c08800a */ lui $t0,%hi(var8009ce68) -/* f06845c: 8d08ce68 */ lw $t0,%lo(var8009ce68)($t0) -/* f068460: 00001825 */ or $v1,$zero,$zero -/* f068464: 3c068000 */ lui $a2,0x8000 -/* f068468: 01001025 */ or $v0,$t0,$zero -.L0f06846c: -/* f06846c: 8c4e0000 */ lw $t6,0x0($v0) -/* f068470: 24840001 */ addiu $a0,$a0,0x1 -/* f068474: 0087082a */ slt $at,$a0,$a3 -/* f068478: 01c67824 */ and $t7,$t6,$a2 -/* f06847c: 11e00009 */ beqz $t7,.L0f0684a4 -/* f068480: 2442010c */ addiu $v0,$v0,0x10c -/* f068484: 00682021 */ addu $a0,$v1,$t0 -/* f068488: 0fc1a0da */ jal obj48Reset -/* f06848c: afa3001c */ sw $v1,0x1c($sp) -/* f068490: 3c18800a */ lui $t8,%hi(var8009ce68) -/* f068494: 8fa3001c */ lw $v1,0x1c($sp) -/* f068498: 8f18ce68 */ lw $t8,%lo(var8009ce68)($t8) -/* f06849c: 1000004d */ b .L0f0685d4 -/* f0684a0: 00781021 */ addu $v0,$v1,$t8 -.L0f0684a4: -/* f0684a4: 1420fff1 */ bnez $at,.L0f06846c -/* f0684a8: 2463010c */ addiu $v1,$v1,0x10c -/* f0684ac: 00002025 */ or $a0,$zero,$zero -.L0f0684b0: -/* f0684b0: 18e00018 */ blez $a3,.L0f068514 -/* f0684b4: 3c08800a */ lui $t0,%hi(var8009ce68) -/* f0684b8: 8d08ce68 */ lw $t0,%lo(var8009ce68)($t0) -/* f0684bc: 2406010c */ addiu $a2,$zero,0x10c -/* f0684c0: 01001025 */ or $v0,$t0,$zero -.L0f0684c4: -/* f0684c4: 8c5900d4 */ lw $t9,0xd4($v0) -/* f0684c8: 5320000f */ beqzl $t9,.L0f068508 -/* f0684cc: 24840001 */ addiu $a0,$a0,0x1 -/* f0684d0: 8c4300d8 */ lw $v1,0xd8($v0) -/* f0684d4: 5860000c */ blezl $v1,.L0f068508 -/* f0684d8: 24840001 */ addiu $a0,$a0,0x1 -/* f0684dc: 04a20009 */ bltzl $a1,.L0f068504 -/* f0684e0: 00802825 */ or $a1,$a0,$zero -/* f0684e4: 00a60019 */ multu $a1,$a2 -/* f0684e8: 00004812 */ mflo $t1 -/* f0684ec: 01095021 */ addu $t2,$t0,$t1 -/* f0684f0: 8d4b00d8 */ lw $t3,0xd8($t2) -/* f0684f4: 006b082a */ slt $at,$v1,$t3 -/* f0684f8: 50200003 */ beqzl $at,.L0f068508 -/* f0684fc: 24840001 */ addiu $a0,$a0,0x1 -/* f068500: 00802825 */ or $a1,$a0,$zero -.L0f068504: -/* f068504: 24840001 */ addiu $a0,$a0,0x1 -.L0f068508: -/* f068508: 0087082a */ slt $at,$a0,$a3 -/* f06850c: 1420ffed */ bnez $at,.L0f0684c4 -/* f068510: 2442010c */ addiu $v0,$v0,0x10c -.L0f068514: -/* f068514: 2401ffff */ addiu $at,$zero,-1 -/* f068518: 14a1000d */ bne $a1,$at,.L0f068550 -/* f06851c: 2406010c */ addiu $a2,$zero,0x10c -/* f068520: 10e0000b */ beqz $a3,.L0f068550 -/* f068524: 00000000 */ nop -/* f068528: 0c004b70 */ jal random -/* f06852c: 00000000 */ nop -/* f068530: 3c0c800a */ lui $t4,%hi(var8009ce50) -/* f068534: 8d8cce50 */ lw $t4,%lo(var8009ce50)($t4) -/* f068538: 2406010c */ addiu $a2,$zero,0x10c -/* f06853c: 004c001b */ divu $zero,$v0,$t4 -/* f068540: 00002810 */ mfhi $a1 -/* f068544: 15800002 */ bnez $t4,.L0f068550 -/* f068548: 00000000 */ nop -/* f06854c: 0007000d */ break 0x7 -.L0f068550: -/* f068550: 04a00020 */ bltz $a1,.L0f0685d4 -/* f068554: 00001025 */ or $v0,$zero,$zero -/* f068558: 00a60019 */ multu $a1,$a2 -/* f06855c: 3c08800a */ lui $t0,%hi(var8009ce68) -/* f068560: 8d08ce68 */ lw $t0,%lo(var8009ce68)($t0) -/* f068564: 00001812 */ mflo $v1 -/* f068568: 01036821 */ addu $t5,$t0,$v1 -/* f06856c: 8da200d4 */ lw $v0,0xd4($t5) -/* f068570: 50400011 */ beqzl $v0,.L0f0685b8 -/* f068574: 00682021 */ addu $a0,$v1,$t0 -/* f068578: 8c440014 */ lw $a0,0x14($v0) -/* f06857c: 50800009 */ beqzl $a0,.L0f0685a4 -/* f068580: 8c580040 */ lw $t8,0x40($v0) -/* f068584: 0fc1ab24 */ jal func0f06ac90 -/* f068588: afa30024 */ sw $v1,0x24($sp) -/* f06858c: 3c0e800a */ lui $t6,%hi(var8009ce68) -/* f068590: 8dcece68 */ lw $t6,%lo(var8009ce68)($t6) -/* f068594: 8fa30024 */ lw $v1,0x24($sp) -/* f068598: 01c37821 */ addu $t7,$t6,$v1 -/* f06859c: 8de200d4 */ lw $v0,0xd4($t7) -/* f0685a0: 8c580040 */ lw $t8,0x40($v0) -.L0f0685a4: -/* f0685a4: 3c08800a */ lui $t0,%hi(var8009ce68) -/* f0685a8: 37190004 */ ori $t9,$t8,0x4 -/* f0685ac: ac590040 */ sw $t9,0x40($v0) -/* f0685b0: 8d08ce68 */ lw $t0,%lo(var8009ce68)($t0) -/* f0685b4: 00682021 */ addu $a0,$v1,$t0 -.L0f0685b8: -/* f0685b8: 0fc1a0da */ jal obj48Reset -/* f0685bc: afa30024 */ sw $v1,0x24($sp) -/* f0685c0: 3c09800a */ lui $t1,%hi(var8009ce68) -/* f0685c4: 8fa30024 */ lw $v1,0x24($sp) -/* f0685c8: 8d29ce68 */ lw $t1,%lo(var8009ce68)($t1) -/* f0685cc: 10000001 */ b .L0f0685d4 -/* f0685d0: 00691021 */ addu $v0,$v1,$t1 -.L0f0685d4: -/* f0685d4: 8fbf0014 */ lw $ra,0x14($sp) -/* f0685d8: 27bd0030 */ addiu $sp,$sp,0x30 -/* f0685dc: 03e00008 */ jr $ra -/* f0685e0: 00000000 */ nop -); +struct obj48 *obj48GetNew(void) +{ + s32 bestindex = -1; + s32 i; + + // Happy path - find one that is already free + for (i = 0; i < var8009ce50; i++) { + if (var8009ce68[i].flags & OBJ48FLAG_FREE) { + obj48Reset(&var8009ce68[i]); + return &var8009ce68[i]; + } + } + + // Find one with the lowest unk0d8 (some kind of age/timer?) + // and some other conditions + for (i = 0; i < var8009ce50; i++) { + if (var8009ce68[i].obj + && var8009ce68[i].unk0d8 > 0 + && (bestindex < 0 || var8009ce68[i].unk0d8 < var8009ce68[bestindex].unk0d8)) { + bestindex = i; + } + } + + // If there were none, pick one at random + if (bestindex == -1 && var8009ce50) { + bestindex = random() % var8009ce50; + } + + if (bestindex >= 0) { + // Reset and return it + if (var8009ce68[bestindex].obj) { + if (var8009ce68[bestindex].obj->prop) { + func0f06ac90(var8009ce68[bestindex].obj->prop); + } + + var8009ce68[bestindex].obj->hidden |= OBJHFLAG_00000004; + } + + obj48Reset(&var8009ce68[bestindex]); + return &var8009ce68[bestindex]; + } else { + return NULL; + } +} void func0f0685e4(struct prop *prop) { @@ -2880,13 +2804,13 @@ void func0f0685e4(struct prop *prop) if (obj->unk48->unk044) { obj48Reset(obj->unk48->unk044); } else { - obj->unk48->unk044 = func0f06843c(); + obj->unk48->unk044 = obj48GetNew(); } } else if ((obj->hidden & OBJHFLAG_00000080) == 0) { if (obj->unk48) { obj48Reset(obj->unk48); } else { - obj->unk48 = func0f06843c(); + obj->unk48 = obj48GetNew(); } if (obj->unk48) { @@ -5602,7 +5526,7 @@ glabel var7f1aa208 void func0f06ac40(struct defaultobj *obj) { if (obj->hidden & OBJHFLAG_00000080) { - func0f0682dc(obj->unk48); + obj48Free(obj->unk48); obj->unk48 = NULL; obj->hidden &= ~OBJHFLAG_00000080; @@ -5629,7 +5553,7 @@ glabel func0f06ac90 /* f06accc: 10c00006 */ beqz $a2,.L0f06ace8 /* f06acd0: 00000000 */ nop /* f06acd4: 00c02025 */ or $a0,$a2,$zero -/* f06acd8: 0fc1a0b7 */ jal func0f0682dc +/* f06acd8: 0fc1a0b7 */ jal obj48Free /* f06acdc: afa3001c */ sw $v1,0x1c($sp) /* f06ace0: 8fa5001c */ lw $a1,0x1c($sp) /* f06ace4: 8ca40048 */ lw $a0,0x48($a1) diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index 97c8161ee..06aaf3304 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -14645,13 +14645,13 @@ u32 var8009ce40 = 0; u32 var8009ce44 = 0; u32 var8009ce48 = 0; u32 var8009ce4c = 0; -u32 var8009ce50 = 0; +s32 var8009ce50 = 0; u32 var8009ce54 = 0; u32 var8009ce58 = 0; u32 var8009ce5c = 0; u32 var8009ce60 = 0; u32 var8009ce64 = 0; -u32 var8009ce68 = 0; +struct obj48 *var8009ce68 = NULL; u32 var8009ce6c = 0; u32 var8009ce70 = 0; u32 var8009ce74 = 0; diff --git a/src/include/constants.h b/src/include/constants.h index ee3f0c6e9..a8b1cf4ff 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2212,6 +2212,10 @@ #define NUM_TEXTURES 3504 #define NUM_WEAPONS 94 +#define OBJ48FLAG_00000080 0x00000080 +#define OBJ48FLAG_00004000 0x00004000 +#define OBJ48FLAG_FREE 0x80000000 + #define OBJECTIVE_INCOMPLETE 0 #define OBJECTIVE_COMPLETE 1 #define OBJECTIVE_FAILED 2 diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 07c54fc31..505b500bb 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -59,10 +59,10 @@ bool modelSetRedBox(struct model *model, f32 *arg1, f32 *arg2, f32 *arg3, f32 *a void func0f06803c(f32 *arg0, f32 *arg1, f32 *arg2, f32 *arg3, f32 *arg4); struct defaultobj *objFindByPadNum(s32 padnum); u32 func0f068218(void); -void func0f0682dc(struct obj48 *obj48); +void obj48Free(struct obj48 *obj48); void func0f0682fc(struct prop *prop); void obj48Reset(struct obj48 *obj48); -struct obj48 *func0f06843c(void); +struct obj48 *obj48GetNew(void); void func0f0685e4(struct prop *prop); u32 func0f068694(void); u32 func0f0686e0(void); diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index c5536b5de..9555fe8ab 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -563,13 +563,13 @@ extern u32 var8009ce40; extern u32 var8009ce44; extern u32 var8009ce48; extern u32 var8009ce4c; -extern u32 var8009ce50; +extern s32 var8009ce50; extern u32 var8009ce54; extern u32 var8009ce58; extern u32 var8009ce5c; extern u32 var8009ce60; extern u32 var8009ce64; -extern u32 var8009ce68; +extern struct obj48 *var8009ce68; extern u32 var8009ce6c; extern u32 var8009ce78; extern u32 var8009ce88; diff --git a/src/include/types.h b/src/include/types.h index c6e37debb..224b8a082 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1097,8 +1097,8 @@ struct obj48 { /*0x0c0*/ f32 unk0c0; /*0x0c4*/ struct coord pos; /*0x0d0*/ u32 unk0d0; - /*0x0d4*/ u32 unk0d4; - /*0x0d8*/ u32 unk0d8; + /*0x0d4*/ struct defaultobj *obj; + /*0x0d8*/ s32 unk0d8; /*0x0dc*/ f32 unk0dc; /*0x0e0*/ f32 unk0e0; /*0x0e4*/ f32 unk0e4;