diff --git a/src/game/chr/chr.c b/src/game/chr/chr.c index 0dbee9a42..592eda237 100644 --- a/src/game/chr/chr.c +++ b/src/game/chr/chr.c @@ -4551,11 +4551,11 @@ bool propchrDoFireslotThing(struct prop *prop) struct chrdata *chr = prop->chr; if (chr->fireslot[0] >= 0) { - func0f0adbbc(&g_Fireslots[chr->fireslot[0]].unk04); + bullettailTick(&g_Fireslots[chr->fireslot[0]].bullettail); } if (chr->fireslot[1] >= 0) { - func0f0adbbc(&g_Fireslots[chr->fireslot[1]].unk04); + bullettailTick(&g_Fireslots[chr->fireslot[1]].bullettail); } if (chr->aibot && chr->aibot->unk058 > 0) { diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index c924fe722..37498dd50 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -17815,10 +17815,10 @@ glabel func0f041a74 /* f041b78: a058003f */ sb $t8,0x3f($v0) .L0f041b7c: /* f041b7c: 8e190348 */ lw $t9,0x348($s0) -/* f041b80: 0fc2b6ef */ jal func0f0adbbc +/* f041b80: 0fc2b6ef */ jal bullettailTick /* f041b84: 8f240004 */ lw $a0,0x4($t9) /* f041b88: 8e08034c */ lw $t0,0x34c($s0) -/* f041b8c: 0fc2b6ef */ jal func0f0adbbc +/* f041b8c: 0fc2b6ef */ jal bullettailTick /* f041b90: 8d040004 */ lw $a0,0x4($t0) /* f041b94: 10000027 */ b .L0f041c34 /* f041b98: 8fbf0024 */ lw $ra,0x24($sp) diff --git a/src/game/game_0abe70.c b/src/game/game_0abe70.c index b3e7cb7e1..fa8ad28a2 100644 --- a/src/game/game_0abe70.c +++ b/src/game/game_0abe70.c @@ -2090,82 +2090,30 @@ glabel var7f1accf4 /* f0adbb8: 27bd0190 */ addiu $sp,$sp,0x190 ); -GLOBAL_ASM( -glabel func0f0adbbc -/* f0adbbc: 27bdffe8 */ addiu $sp,$sp,-24 -/* f0adbc0: afbf0014 */ sw $ra,0x14($sp) -/* f0adbc4: 80820000 */ lb $v0,0x0($a0) -/* f0adbc8: 0442003c */ bltzl $v0,.L0f0adcbc -/* f0adbcc: 8fbf0014 */ lw $ra,0x14($sp) -/* f0adbd0: 808e0001 */ lb $t6,0x1($a0) -/* f0adbd4: 2401fffe */ addiu $at,$zero,-2 -/* f0adbd8: 244f0001 */ addiu $t7,$v0,0x1 -/* f0adbdc: 15c10009 */ bne $t6,$at,.L0f0adc04 -/* f0adbe0: 00000000 */ nop -/* f0adbe4: a08f0000 */ sb $t7,0x0($a0) -/* f0adbe8: 80980000 */ lb $t8,0x0($a0) -/* f0adbec: 2419ffff */ addiu $t9,$zero,-1 -/* f0adbf0: 2b010002 */ slti $at,$t8,0x2 -/* f0adbf4: 54200031 */ bnezl $at,.L0f0adcbc -/* f0adbf8: 8fbf0014 */ lw $ra,0x14($sp) -/* f0adbfc: 1000002e */ b .L0f0adcb8 -/* f0adc00: a0990000 */ sb $t9,0x0($a0) -.L0f0adc04: -/* f0adc04: 3c02800a */ lui $v0,%hi(g_Vars) -/* f0adc08: 24429fc0 */ addiu $v0,$v0,%lo(g_Vars) -/* f0adc0c: 8c480034 */ lw $t0,0x34($v0) -/* f0adc10: 29010009 */ slti $at,$t0,0x9 -/* f0adc14: 10200008 */ beqz $at,.L0f0adc38 -/* f0adc18: 00000000 */ nop -/* f0adc1c: c4840020 */ lwc1 $f4,0x20($a0) -/* f0adc20: c4460044 */ lwc1 $f6,0x44($v0) -/* f0adc24: c48a0028 */ lwc1 $f10,0x28($a0) -/* f0adc28: 46062202 */ mul.s $f8,$f4,$f6 -/* f0adc2c: 46085400 */ add.s $f16,$f10,$f8 -/* f0adc30: 10000019 */ b .L0f0adc98 -/* f0adc34: e4900028 */ swc1 $f16,0x28($a0) -.L0f0adc38: -/* f0adc38: 0c004b70 */ jal random -/* f0adc3c: afa40018 */ sw $a0,0x18($sp) -/* f0adc40: 44829000 */ mtc1 $v0,$f18 -/* f0adc44: 8fa40018 */ lw $a0,0x18($sp) -/* f0adc48: 04410005 */ bgez $v0,.L0f0adc60 -/* f0adc4c: 46809120 */ cvt.s.w $f4,$f18 -/* f0adc50: 3c014f80 */ lui $at,0x4f80 -/* f0adc54: 44813000 */ mtc1 $at,$f6 -/* f0adc58: 00000000 */ nop -/* f0adc5c: 46062100 */ add.s $f4,$f4,$f6 -.L0f0adc60: -/* f0adc60: 3c012f80 */ lui $at,0x2f80 -/* f0adc64: 44815000 */ mtc1 $at,$f10 -/* f0adc68: 3c013f00 */ lui $at,0x3f00 -/* f0adc6c: 44818000 */ mtc1 $at,$f16 -/* f0adc70: 460a2202 */ mul.s $f8,$f4,$f10 -/* f0adc74: 3c014000 */ lui $at,0x4000 -/* f0adc78: 44813000 */ mtc1 $at,$f6 -/* f0adc7c: c48a0020 */ lwc1 $f10,0x20($a0) -/* f0adc80: 46104482 */ mul.s $f18,$f8,$f16 -/* f0adc84: c4900028 */ lwc1 $f16,0x28($a0) -/* f0adc88: 46123100 */ add.s $f4,$f6,$f18 -/* f0adc8c: 46045202 */ mul.s $f8,$f10,$f4 -/* f0adc90: 46088180 */ add.s $f6,$f16,$f8 -/* f0adc94: e4860028 */ swc1 $f6,0x28($a0) -.L0f0adc98: -/* f0adc98: c4920028 */ lwc1 $f18,0x28($a0) -/* f0adc9c: c48a001c */ lwc1 $f10,0x1c($a0) -/* f0adca0: 2409ffff */ addiu $t1,$zero,-1 -/* f0adca4: 4612503e */ c.le.s $f10,$f18 -/* f0adca8: 00000000 */ nop -/* f0adcac: 45020003 */ bc1fl .L0f0adcbc -/* f0adcb0: 8fbf0014 */ lw $ra,0x14($sp) -/* f0adcb4: a0890000 */ sb $t1,0x0($a0) -.L0f0adcb8: -/* f0adcb8: 8fbf0014 */ lw $ra,0x14($sp) -.L0f0adcbc: -/* f0adcbc: 27bd0018 */ addiu $sp,$sp,0x18 -/* f0adcc0: 03e00008 */ jr $ra -/* f0adcc4: 00000000 */ nop -); +void bullettailTick(struct bullettail *tail) +{ + if (tail->age >= 0) { + if (tail->unk01 == -2) { + tail->age++; + + if (tail->age > 1) { + tail->age = -1; + } + } else { + if (g_Vars.lvupdate240 <= 8) { + // Not lagging + tail->dist += tail->speed * g_Vars.lvupdate240f; + } else { + // Lagging + tail->dist += tail->speed * (2 + random() * (1.0f / U32_MAX) * 0.5f); + } + + if (tail->dist >= tail->maxdist) { + tail->age = -1; + } + } + } +} GLOBAL_ASM( glabel func0f0adcc8 diff --git a/src/game/game_0b63b0.c b/src/game/game_0b63b0.c index bd509af8f..bf2991dcf 100644 --- a/src/game/game_0b63b0.c +++ b/src/game/game_0b63b0.c @@ -13910,7 +13910,7 @@ glabel func0f0c228c /* f0c22a0: 3c04800a */ lui $a0,%hi(g_Vars+0x64) /* f0c22a4: 008e2021 */ addu $a0,$a0,$t6 /* f0c22a8: 8c84a024 */ lw $a0,%lo(g_Vars+0x64)($a0) -/* f0c22ac: 0fc2b6ef */ jal func0f0adbbc +/* f0c22ac: 0fc2b6ef */ jal bullettailTick /* f0c22b0: 24840814 */ addiu $a0,$a0,2068 /* f0c22b4: 0fc4a25f */ jal propGetPlayerNum /* f0c22b8: 8fa40020 */ lw $a0,0x20($sp) @@ -13918,7 +13918,7 @@ glabel func0f0c228c /* f0c22c0: 3c04800a */ lui $a0,%hi(g_Vars+0x64) /* f0c22c4: 008f2021 */ addu $a0,$a0,$t7 /* f0c22c8: 8c84a024 */ lw $a0,%lo(g_Vars+0x64)($a0) -/* f0c22cc: 0fc2b6ef */ jal func0f0adbbc +/* f0c22cc: 0fc2b6ef */ jal bullettailTick /* f0c22d0: 24840fb8 */ addiu $a0,$a0,4024 /* f0c22d4: 8fb80020 */ lw $t8,0x20($sp) /* f0c22d8: 3c19800a */ lui $t9,%hi(g_Vars+0x314) @@ -13938,7 +13938,7 @@ glabel func0f0c228c /* f0c2310: 25090004 */ addiu $t1,$t0,0x4 /* f0c2314: 254ad150 */ addiu $t2,$t2,%lo(g_Fireslots) /* f0c2318: 012a2021 */ addu $a0,$t1,$t2 -/* f0c231c: 0fc2b6ef */ jal func0f0adbbc +/* f0c231c: 0fc2b6ef */ jal bullettailTick /* f0c2320: afa2001c */ sw $v0,0x1c($sp) /* f0c2324: 8fa3001c */ lw $v1,0x1c($sp) .L0f0c2328: @@ -13950,7 +13950,7 @@ glabel func0f0c228c /* f0c233c: 01625823 */ subu $t3,$t3,$v0 /* f0c2340: 000b5900 */ sll $t3,$t3,0x4 /* f0c2344: 256c0004 */ addiu $t4,$t3,0x4 -/* f0c2348: 0fc2b6ef */ jal func0f0adbbc +/* f0c2348: 0fc2b6ef */ jal bullettailTick /* f0c234c: 018d2021 */ addu $a0,$t4,$t5 .L0f0c2350: /* f0c2350: 8fbf0014 */ lw $ra,0x14($sp) diff --git a/src/game/propobj.c b/src/game/propobj.c index 5d51d125c..e66db74f6 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -28122,12 +28122,12 @@ u32 func0f07e474(struct prop *prop) if (obj->type == OBJTYPE_AUTOGUN) { struct autogunobj *autogun = (struct autogunobj *)prop->obj; - if (autogun->unk9c) { - func0f0adbbc(autogun->unk9c); + if (autogun->bullettail) { + bullettailTick(autogun->bullettail); } } else if (obj->type == OBJTYPE_CHOPPER) { struct chopperobj *chopper = (struct chopperobj *)prop->obj; - func0f0adbbc(chopper->fireslotthing->unk04); + bullettailTick(chopper->fireslotthing->bullettail); } else if (obj->type == OBJTYPE_LIFT) { liftTick(prop); } else if (obj->type == OBJTYPE_ESCALATOR) { diff --git a/src/include/game/game_0abe70.h b/src/include/game/game_0abe70.h index b37fd69bb..31b4e6cb3 100644 --- a/src/include/game/game_0abe70.h +++ b/src/include/game/game_0abe70.h @@ -7,7 +7,7 @@ u32 func0f0abe70(void); u32 func0f0ac138(void); u32 func0f0ac4b8(void); u32 func0f0acb90(void); -void func0f0adbbc(struct fireslot04 *fireslot04); +void bullettailTick(struct bullettail *bullettail); u32 func0f0adcc8(void); u32 func0f0ade00(void); u32 func0f0ae964(void); diff --git a/src/include/types.h b/src/include/types.h index 69b03aa38..e5deafec9 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1135,7 +1135,7 @@ struct autogunobj { // objtype 0d /*0x90*/ u32 unk90; /*0x94*/ u32 unk94; /*0x98*/ u32 unk98; - /*0x9c*/ struct fireslot04 *unk9c; + /*0x9c*/ struct bullettail *bullettail; /*0xa0*/ u32 unka0; /*0xa4*/ u32 unka4; /*0xa8*/ u8 autogun_type; @@ -3271,8 +3271,8 @@ struct room { /*0x88*/ u32 unk88; }; -struct fireslot04 { - s8 unk00; +struct bullettail { + s8 age; s8 unk01; u32 unk04; u32 unk08; @@ -3280,20 +3280,20 @@ struct fireslot04 { u32 unk10; u32 unk14; u32 unk18; - f32 unk1c; - f32 unk20; + f32 maxdist; + f32 speed; u32 unk24; - f32 unk28; + f32 dist; }; struct fireslotthing { /*0x00*/ u32 unk00; - /*0x04*/ struct fireslot04 *unk04; + /*0x04*/ struct bullettail *bullettail; }; struct fireslot { /*0x00*/ s32 unk00; - /*0x04*/ struct fireslot04 unk04; + /*0x04*/ struct bullettail bullettail; }; struct menulayer {