diff --git a/src/game/bondeyespy.c b/src/game/bondeyespy.c index 4b78111bb..0dc64437f 100644 --- a/src/game/bondeyespy.c +++ b/src/game/bondeyespy.c @@ -2282,7 +2282,7 @@ glabel var7f1adb00 .PF0f0d2558: /* f0d2558: 24050001 */ li $a1,0x1 /* f0d255c: 8de4001c */ lw $a0,0x1c($t7) -/* f0d2560: 0fc22ac0 */ jal func0f08abd4 +/* f0d2560: 0fc22ac0 */ jal coordTriggerProxies /* f0d2564: 24840008 */ addiu $a0,$a0,0x8 /* f0d2568: 8fbf002c */ lw $ra,0x2c($sp) .PF0f0d256c: @@ -3894,7 +3894,7 @@ glabel var7f1adb00 .L0f0d1fb4: /* f0d1fb4: 24050001 */ addiu $a1,$zero,0x1 /* f0d1fb8: 8f04001c */ lw $a0,0x1c($t8) -/* f0d1fbc: 0fc22af5 */ jal func0f08abd4 +/* f0d1fbc: 0fc22af5 */ jal coordTriggerProxies /* f0d1fc0: 24840008 */ addiu $a0,$a0,8 /* f0d1fc4: 8fbf002c */ lw $ra,0x2c($sp) .L0f0d1fc8: @@ -5525,7 +5525,7 @@ glabel var7f1adb00 .NB0f0cf780: /* f0cf780: 24050001 */ addiu $a1,$zero,0x1 /* f0cf784: 8dc4001c */ lw $a0,0x1c($t6) -/* f0cf788: 0fc22507 */ jal func0f08abd4 +/* f0cf788: 0fc22507 */ jal coordTriggerProxies /* f0cf78c: 24840008 */ addiu $a0,$a0,0x8 /* f0cf790: 8fbf002c */ lw $ra,0x2c($sp) .NB0f0cf794: diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index c98701dbd..00357caa9 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -10467,7 +10467,7 @@ bool chrDropItem(struct chrdata *chr, u32 modelnum, u32 weaponnum) if (weapon && weapon->base.prop) { modelSetScale(weapon->base.model, weapon->base.model->scale); propReparent(weapon->base.prop, chr->prop); - weapon->unk62 = PALDOWN(720); + weapon->timer240 = PALDOWN(720); propobjSetDropped(weapon->base.prop, DROPREASON_1); chr->hidden |= CHRHFLAG_00000001; @@ -22332,7 +22332,7 @@ void chrTickThrowGrenade(struct chrdata *chr) weapon = weaponprop->weapon; propobjSetDropped(weaponprop, DROPREASON_3); chr->hidden |= CHRHFLAG_00000001; - weapon->unk62 = PALDOWN(240); + weapon->timer240 = PALDOWN(240); } frame2 = modelGetCurAnimFrame(model); @@ -22360,7 +22360,7 @@ bool chrDetectDangerousObject(struct chrdata *chr, u8 flags) if (prop) { if ((flags & 1) && prop->weapon && prop->weapon->weaponnum == WEAPON_GRENADE && - prop->weapon->unk62 < PALDOWN(480)) { + prop->weapon->timer240 < PALDOWN(480)) { pass = true; } diff --git a/src/game/game_00c490.c b/src/game/game_00c490.c index d8d2b5bb8..8dbd025ce 100644 --- a/src/game/game_00c490.c +++ b/src/game/game_00c490.c @@ -332,8 +332,8 @@ void setupClearProxyMines(void) { s32 i; - for (i = 0; i < ARRAYCOUNT(g_ProxyMines); i++) { - g_ProxyMines[i] = NULL; + for (i = 0; i < ARRAYCOUNT(g_Proxies); i++) { + g_Proxies[i] = NULL; } } diff --git a/src/game/game_097ba0.c b/src/game/game_097ba0.c index 313817fa6..9ff3a33be 100644 --- a/src/game/game_097ba0.c +++ b/src/game/game_097ba0.c @@ -11257,11 +11257,11 @@ struct weaponobj *func0f09ee18(struct chrdata *chr, struct shorthand *hand, stru if (tmpthing != NULL) { thing = tmpthing; - thing->unk62 = func->activatetime60; + // Note this timer is converted to 240 time immediately below + thing->timer240 = func->activatetime60; - // Convert to 240 time - if (thing->unk62 >= 2) { - thing->unk62 = PALDOWN(thing->unk62 * 4); + if (thing->timer240 >= 2) { + thing->timer240 = PALDOWN(thing->timer240 * 4); } if (thing->weaponnum == WEAPON_GRENADE || thing->weaponnum == WEAPON_NBOMB) { @@ -12389,7 +12389,7 @@ void func0f09f974(s32 handnum, struct weaponfunc_shootprojectile *func) hand->rocket = obj; hand->firedrocket = false; - obj->unk62 = 1; + obj->timer240 = 1; #if VERSION >= VERSION_NTSC_1_0 obj->base.flags |= OBJFLAG_00800000; #endif @@ -17104,7 +17104,7 @@ void currentPlayerLoseGun(struct prop *attackerprop) struct weaponobj *rocket = g_Vars.currentplayer->slayerrocket; if (rocket && rocket->base.prop) { - rocket->unk62 = 0; + rocket->timer240 = 0; } player->visionmode = VISIONMODE_NORMAL; diff --git a/src/game/game_1999b0.c b/src/game/game_1999b0.c index 2bc601426..1da1625ab 100644 --- a/src/game/game_1999b0.c +++ b/src/game/game_1999b0.c @@ -514,7 +514,7 @@ void aibotCreateSlayerRocket(struct chrdata *chr) if (rocket->base.hidden & OBJHFLAG_AIRBORNE) { struct prop *target = chrGetTargetProp(chr); - rocket->unk62 = -1; + rocket->timer240 = -1; rocket->base.projectile->unk010 = 7.5; rocket->base.projectile->unk014 = b; rocket->base.projectile->unk018 = a; @@ -526,7 +526,7 @@ void aibotCreateSlayerRocket(struct chrdata *chr) -1, 0, 0, 0, 0, -1, 0, -1, -1, -1, -1); if (!func0f19a6d0(chr, &chr->prop->pos, &target->pos, chr->prop->rooms, target->rooms, rocket->base.projectile)) { - rocket->unk62 = 0; + rocket->timer240 = 0; // blow up rocket } else { func0f19a7d0(rocket->base.projectile->waypads[0], &rocket->base.projectile->pos); chr->aibot->unk044 = rocket->base.prop; diff --git a/src/game/propobj.c b/src/game/propobj.c index fcd81da71..24c41aa86 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -101,7 +101,7 @@ const char var7f1a9fd0[] = "kkg"; const char var7f1a9fd4[] = "kkd"; const char var7f1a9fd8[] = "kkp"; -struct weaponobj *g_ProxyMines[30]; +struct weaponobj *g_Proxies[30]; u32 var8009ce38; u32 var8009ce3c; s32 var8009ce40; @@ -4638,7 +4638,7 @@ void func0f069c70(struct defaultobj *obj, bool arg1, bool arg2) prop = obj->prop; func0f069630(prop, obj->nextcol, obj->floorcol); - func0f08abd4(&obj->prop->pos, 0); + coordTriggerProxies(&obj->prop->pos, false); } GLOBAL_ASM( @@ -67429,10 +67429,10 @@ struct weaponobj *weaponFindThrown(s32 weaponnum) GLOBAL_ASM( glabel func0f08ab64 -/* f08ab64: 3c03800a */ lui $v1,%hi(g_ProxyMines) +/* f08ab64: 3c03800a */ lui $v1,%hi(g_Proxies) /* f08ab68: 3c02800a */ lui $v0,%hi(var8009ce38) /* f08ab6c: 2442ce38 */ addiu $v0,$v0,%lo(var8009ce38) -/* f08ab70: 2463cdc0 */ addiu $v1,$v1,%lo(g_ProxyMines) +/* f08ab70: 2463cdc0 */ addiu $v1,$v1,%lo(g_Proxies) /* f08ab74: 8c6e0000 */ lw $t6,0x0($v1) .L0f08ab78: /* f08ab78: 55c00004 */ bnezl $t6,.L0f08ab8c @@ -67449,10 +67449,10 @@ glabel func0f08ab64 GLOBAL_ASM( glabel func0f08ab9c -/* f08ab9c: 3c03800a */ lui $v1,%hi(g_ProxyMines) +/* f08ab9c: 3c03800a */ lui $v1,%hi(g_Proxies) /* f08aba0: 3c02800a */ lui $v0,%hi(var8009ce38) /* f08aba4: 2442ce38 */ addiu $v0,$v0,%lo(var8009ce38) -/* f08aba8: 2463cdc0 */ addiu $v1,$v1,%lo(g_ProxyMines) +/* f08aba8: 2463cdc0 */ addiu $v1,$v1,%lo(g_Proxies) /* f08abac: 8c6e0000 */ lw $t6,0x0($v1) .L0f08abb0: /* f08abb0: 548e0004 */ bnel $a0,$t6,.L0f08abc4 @@ -67467,71 +67467,35 @@ glabel func0f08ab9c /* f08abd0: 00000000 */ nop ); -GLOBAL_ASM( -glabel func0f08abd4 -.late_rodata -glabel var7f1aae88 -.word 0x47742400 -.text -/* f08abd4: 27bdffe8 */ addiu $sp,$sp,-24 -/* f08abd8: f7b60010 */ sdc1 $f22,0x10($sp) -/* f08abdc: 3c03800a */ lui $v1,%hi(g_ProxyMines) -/* f08abe0: 3c017f1b */ lui $at,%hi(var7f1aae88) -/* f08abe4: 3c0b800a */ lui $t3,%hi(var8009ce38) -/* f08abe8: f7b40008 */ sdc1 $f20,0x8($sp) -/* f08abec: 00803025 */ or $a2,$a0,$zero -/* f08abf0: 00a03825 */ or $a3,$a1,$zero -/* f08abf4: 256bce38 */ addiu $t3,$t3,%lo(var8009ce38) -/* f08abf8: c436ae88 */ lwc1 $f22,%lo(var7f1aae88)($at) -/* f08abfc: 2463cdc0 */ addiu $v1,$v1,%lo(g_ProxyMines) -/* f08ac00: 240a001e */ addiu $t2,$zero,0x1e -/* f08ac04: 2409000f */ addiu $t1,$zero,0xf -/* f08ac08: 24080001 */ addiu $t0,$zero,0x1 -/* f08ac0c: 8c620000 */ lw $v0,0x0($v1) -.L0f08ac10: -/* f08ac10: 24630004 */ addiu $v1,$v1,0x4 -/* f08ac14: 10400020 */ beqz $v0,.L0f08ac98 -/* f08ac18: 00000000 */ nop -/* f08ac1c: 844e0062 */ lh $t6,0x62($v0) -/* f08ac20: 150e001d */ bne $t0,$t6,.L0f08ac98 -/* f08ac24: 00000000 */ nop -/* f08ac28: 9044005c */ lbu $a0,0x5c($v0) -/* f08ac2c: 4600b006 */ mov.s $f0,$f22 -/* f08ac30: c4cc0000 */ lwc1 $f12,0x0($a2) -/* f08ac34: c4d00004 */ lwc1 $f16,0x4($a2) -/* f08ac38: 15240002 */ bne $t1,$a0,.L0f08ac44 -/* f08ac3c: c4d40008 */ lwc1 $f20,0x8($a2) -/* f08ac40: 4616b000 */ add.s $f0,$f22,$f22 -.L0f08ac44: -/* f08ac44: 8c450014 */ lw $a1,0x14($v0) -/* f08ac48: c4a40008 */ lwc1 $f4,0x8($a1) -/* f08ac4c: c4a6000c */ lwc1 $f6,0xc($a1) -/* f08ac50: c4a80010 */ lwc1 $f8,0x10($a1) -/* f08ac54: 46046081 */ sub.s $f2,$f12,$f4 -/* f08ac58: 46068381 */ sub.s $f14,$f16,$f6 -/* f08ac5c: 46021282 */ mul.s $f10,$f2,$f2 -/* f08ac60: 4608a481 */ sub.s $f18,$f20,$f8 -/* f08ac64: 460e7102 */ mul.s $f4,$f14,$f14 -/* f08ac68: 46045180 */ add.s $f6,$f10,$f4 -/* f08ac6c: 46129202 */ mul.s $f8,$f18,$f18 -/* f08ac70: 46083280 */ add.s $f10,$f6,$f8 -/* f08ac74: 4600503c */ c.lt.s $f10,$f0 -/* f08ac78: 00000000 */ nop -/* f08ac7c: 45000006 */ bc1f .L0f08ac98 -/* f08ac80: 00000000 */ nop -/* f08ac84: 55440004 */ bnel $t2,$a0,.L0f08ac98 -/* f08ac88: a4400062 */ sh $zero,0x62($v0) -/* f08ac8c: 14e80002 */ bne $a3,$t0,.L0f08ac98 -/* f08ac90: 00000000 */ nop -/* f08ac94: a4400062 */ sh $zero,0x62($v0) -.L0f08ac98: -/* f08ac98: 546bffdd */ bnel $v1,$t3,.L0f08ac10 -/* f08ac9c: 8c620000 */ lw $v0,0x0($v1) -/* f08aca0: d7b40008 */ ldc1 $f20,0x8($sp) -/* f08aca4: d7b60010 */ ldc1 $f22,0x10($sp) -/* f08aca8: 03e00008 */ jr $ra -/* f08acac: 27bd0018 */ addiu $sp,$sp,0x18 -); +void coordTriggerProxies(struct coord *pos, bool arg1) +{ + s32 i; + + for (i = 0; i < ARRAYCOUNT(g_Proxies); i++) { + struct weaponobj *weapon = g_Proxies[i]; + + if (weapon && weapon->timer240 == 1) { + f32 xdiff; + f32 ydiff; + f32 zdiff; + f32 range = 250 * 250; + + if (weapon->weaponnum == WEAPON_DRAGON) { + range += range; + } + + xdiff = pos->x - weapon->base.prop->pos.x; + ydiff = pos->y - weapon->base.prop->pos.y; + zdiff = pos->z - weapon->base.prop->pos.z; + + if (xdiff * xdiff + ydiff * ydiff + zdiff * zdiff < range) { + if (weapon->weaponnum != WEAPON_GRENADE || arg1 == true) { + weapon->timer240 = 0; + } + } + } + } +} #if VERSION >= VERSION_NTSC_1_0 GLOBAL_ASM( @@ -67585,7 +67549,7 @@ glabel func0f08acb0 /* f08ad64: 0fc0de6c */ jal chrCalculatePosition /* f08ad68: 02402825 */ or $a1,$s2,$zero /* f08ad6c: 02402025 */ or $a0,$s2,$zero -/* f08ad70: 0fc22af5 */ jal func0f08abd4 +/* f08ad70: 0fc22af5 */ jal coordTriggerProxies /* f08ad74: 24050001 */ addiu $a1,$zero,0x1 .L0f08ad78: /* f08ad78: 26310368 */ addiu $s1,$s1,0x368 @@ -67652,7 +67616,7 @@ glabel func0f08acb0 /* f08959c: 0fc0dcb4 */ jal chrCalculatePosition /* f0895a0: 02402825 */ or $a1,$s2,$zero /* f0895a4: 02402025 */ or $a0,$s2,$zero -/* f0895a8: 0fc22507 */ jal func0f08abd4 +/* f0895a8: 0fc22507 */ jal coordTriggerProxies /* f0895ac: 24050001 */ addiu $a1,$zero,0x1 .NB0f0895b0: /* f0895b0: 26310368 */ addiu $s1,$s1,0x368 diff --git a/src/game/training/training.c b/src/game/training/training.c index 1374364ea..0714c89f1 100644 --- a/src/game/training/training.c +++ b/src/game/training/training.c @@ -2997,10 +2997,10 @@ bool frIsAmmoWasted(void) g_FrData.proxyendtimer -= g_Vars.lvupdate240_60; if (g_FrData.proxyendtimer <= 0) { - // Timer has just hit zero - remove all mines - for (i = 0; i < ARRAYCOUNT(g_ProxyMines); i++) { - if (g_ProxyMines[i]) { - g_ProxyMines[i]->unk62 = 0; + // Timer has just hit zero - remove all proxy items + for (i = 0; i < ARRAYCOUNT(g_Proxies); i++) { + if (g_Proxies[i]) { + g_Proxies[i]->timer240 = 0; } } @@ -3472,7 +3472,7 @@ glabel var7f1b94e4 /* f1a10b4: 14610003 */ bne $v1,$at,.PF0f1a10c4 .PF0f1a10b8: /* f1a10b8: 26240008 */ addiu $a0,$s1,0x8 -/* f1a10bc: 0fc22ac0 */ jal func0f08abd4 +/* f1a10bc: 0fc22ac0 */ jal coordTriggerProxies /* f1a10c0: 24050001 */ li $a1,0x1 .PF0f1a10c4: /* f1a10c4: 920a0043 */ lbu $t2,0x43($s0) @@ -4572,7 +4572,7 @@ glabel var7f1b94e4 /* f19ffa0: 14610003 */ bne $v1,$at,.L0f19ffb0 .L0f19ffa4: /* f19ffa4: 26240008 */ addiu $a0,$s1,0x8 -/* f19ffa8: 0fc22af5 */ jal func0f08abd4 +/* f19ffa8: 0fc22af5 */ jal coordTriggerProxies /* f19ffac: 24050001 */ addiu $a1,$zero,0x1 .L0f19ffb0: /* f19ffb0: 920a0043 */ lbu $t2,0x43($s0) @@ -5685,7 +5685,7 @@ glabel var7f1b94e4 /* f199fa8: 14610003 */ bne $v1,$at,.NB0f199fb8 .NB0f199fac: /* f199fac: 26240008 */ addiu $a0,$s1,0x8 -/* f199fb0: 0fc22507 */ jal func0f08abd4 +/* f199fb0: 0fc22507 */ jal coordTriggerProxies /* f199fb4: 24050001 */ addiu $a1,$zero,0x1 .NB0f199fb8: /* f199fb8: 920b0043 */ lbu $t3,0x43($s0) @@ -6572,7 +6572,7 @@ glabel var7f1b94e4 // switch (weaponnum2) { // case WEAPON_GRENADE: // case WEAPON_PROXIMITYMINE: -// func0f08abd4(&prop->pos, 1); +// coordTriggerProxies(&prop->pos, 1); // break; // } // diff --git a/src/include/bss.h b/src/include/bss.h index 7de307ae4..3c3c5dce4 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -108,7 +108,7 @@ extern struct var8009cda4 *var8009cda4; extern struct prop *var8009cda8; extern u32 var8009cdac; extern u32 var8009cdb0; -extern struct weaponobj *g_ProxyMines[30]; +extern struct weaponobj *g_Proxies[30]; extern s32 var8009ce40; extern s32 var8009ce44; extern s32 var8009ce48; diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index b31cafdc5..c20630970 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -276,7 +276,7 @@ struct weaponobj *func0f08aa70(s32 weaponnum, struct prop *prop); struct weaponobj *weaponFindThrown(s32 weaponnum); u32 func0f08ab64(void); u32 func0f08ab9c(void); -void func0f08abd4(struct coord *pos, u32 arg1); +void coordTriggerProxies(struct coord *pos, bool arg1); void func0f08acb0(void); void propweaponSetDual(struct weaponobj *weapon1, struct weaponobj *weapon2); u32 func0f08adc8(void); diff --git a/src/include/types.h b/src/include/types.h index 8ce3c2679..fe41d5a99 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1740,12 +1740,11 @@ struct weaponobj { // objtype 0x08 /*0x61*/ s8 dualweaponnum; /** - * Appears to have multiple uses: - * Grenades = timer? - * Proxy mines = timer240 (counts down) - * CTC briefcase = team index + * timer240 is used for activation of proxy Dragons, grenades and proxy + * mines. It ticks down to 1 where it becomes active, and set to 0 when the + * item should explode. */ - /*0x62*/ s16 unk62; + /*0x62*/ s16 timer240; /*0x64*/ struct weaponobj *dualweapon; // other weapon when dual wielding };