diff --git a/src/game/bondbike.c b/src/game/bondbike.c index a263168d5..b345e6d75 100644 --- a/src/game/bondbike.c +++ b/src/game/bondbike.c @@ -1085,9 +1085,9 @@ s32 bbikeCalculateNewPosition(struct coord *vel, f32 angledelta) hov = bike->hov; - func0f0713e4(&bike->base, &hov, &dstpos, dstrooms, bike->base.realrot); + hovUpdateGround(&bike->base, &hov, &dstpos, dstrooms, bike->base.realrot); - dstpos.y += hov.unk34 - bike->hov.unk34; + dstpos.y += hov.ground - bike->hov.ground; halfwidth = width * 0.5f; xdiff = dstpos.x - g_Vars.currentplayer->hoverbike->pos.x; diff --git a/src/game/game_00c490.c b/src/game/game_00c490.c index c27fa291b..d8d2b5bb8 100644 --- a/src/game/game_00c490.c +++ b/src/game/game_00c490.c @@ -2391,9 +2391,9 @@ void setupHov(struct defaultobj *obj, struct hov *hov) hov->unk28 = 0; hov->unk2c = 0; hov->unk30 = 0; - hov->unk34 = 0; - hov->unk38 = -1; - hov->unk3c = -1; + hov->ground = 0; + hov->groundnext60 = -1; + hov->groundprev60 = -1; } #if VERSION >= VERSION_PAL_FINAL diff --git a/src/game/propobj.c b/src/game/propobj.c index 1e162a4b1..9906df905 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -16782,68 +16782,30 @@ f32 objGetHov04(struct defaultobj *obj) return result; } -GLOBAL_ASM( -glabel func0f0713e4 -.late_rodata -glabel var7f1aa2c8 -.word 0xc6ea6000 -.text -/* f0713e4: 27bdffc0 */ addiu $sp,$sp,-64 -/* f0713e8: afbf001c */ sw $ra,0x1c($sp) -/* f0713ec: afa40040 */ sw $a0,0x40($sp) -/* f0713f0: afa50044 */ sw $a1,0x44($sp) -/* f0713f4: 3c18800a */ lui $t8,%hi(g_Vars+0x8) -/* f0713f8: 8f189fc8 */ lw $t8,%lo(g_Vars+0x8)($t8) -/* f0713fc: 8caf0038 */ lw $t7,0x38($a1) -/* f071400: 01f8082a */ slt $at,$t7,$t8 -/* f071404: 50200029 */ beqzl $at,.L0f0714ac -/* f071408: 8fbf001c */ lw $ra,0x1c($sp) -/* f07140c: c4c40000 */ lwc1 $f4,0x0($a2) -/* f071410: 3c014248 */ lui $at,0x4248 -/* f071414: 44814000 */ mtc1 $at,$f8 -/* f071418: e7a40020 */ swc1 $f4,0x20($sp) -/* f07141c: c4c60004 */ lwc1 $f6,0x4($a2) -/* f071420: 00e02025 */ or $a0,$a3,$zero -/* f071424: 27a5002c */ addiu $a1,$sp,0x2c -/* f071428: 46083281 */ sub.s $f10,$f6,$f8 -/* f07142c: e7aa0024 */ swc1 $f10,0x24($sp) -/* f071430: c4d00008 */ lwc1 $f16,0x8($a2) -/* f071434: afa60048 */ sw $a2,0x48($sp) -/* f071438: 0fc195e9 */ jal roomsCopy -/* f07143c: e7b00028 */ swc1 $f16,0x28($sp) -/* f071440: 8fa40040 */ lw $a0,0x40($sp) -/* f071444: 27a50020 */ addiu $a1,$sp,0x20 -/* f071448: 8fa60050 */ lw $a2,0x50($sp) -/* f07144c: 0fc248cf */ jal func0f09233c -/* f071450: 27a7002c */ addiu $a3,$sp,0x2c -/* f071454: 8fa70040 */ lw $a3,0x40($sp) -/* f071458: 8fa40048 */ lw $a0,0x48($sp) -/* f07145c: 3c0540a0 */ lui $a1,0x40a0 -/* f071460: 27a6002c */ addiu $a2,$sp,0x2c -/* f071464: afa00010 */ sw $zero,0x10($sp) -/* f071468: 0c00a8cc */ jal cdFindGroundYSimple -/* f07146c: 24e70058 */ addiu $a3,$a3,0x58 -/* f071470: 3c017f1b */ lui $at,%hi(var7f1aa2c8) -/* f071474: c432a2c8 */ lwc1 $f18,%lo(var7f1aa2c8)($at) -/* f071478: 46000086 */ mov.s $f2,$f0 -/* f07147c: 8fa20044 */ lw $v0,0x44($sp) -/* f071480: 4612003c */ c.lt.s $f0,$f18 -/* f071484: 00000000 */ nop -/* f071488: 45020003 */ bc1fl .L0f071498 -/* f07148c: 8fa20044 */ lw $v0,0x44($sp) -/* f071490: c4420034 */ lwc1 $f2,0x34($v0) -/* f071494: 8fa20044 */ lw $v0,0x44($sp) -.L0f071498: -/* f071498: 3c19800a */ lui $t9,%hi(g_Vars+0x8) -/* f07149c: e4420034 */ swc1 $f2,0x34($v0) -/* f0714a0: 8f399fc8 */ lw $t9,%lo(g_Vars+0x8)($t9) -/* f0714a4: ac59003c */ sw $t9,0x3c($v0) -/* f0714a8: 8fbf001c */ lw $ra,0x1c($sp) -.L0f0714ac: -/* f0714ac: 27bd0040 */ addiu $sp,$sp,0x40 -/* f0714b0: 03e00008 */ jr $ra -/* f0714b4: 00000000 */ nop -); +void hovUpdateGround(struct defaultobj *obj, struct hov *hov, struct coord *pos, s16 *rooms, f32 *matrix) +{ + f32 ground; + s16 testrooms[8]; + struct coord testpos; + + if (g_Vars.lvframe60 > hov->groundnext60) { + testpos.x = pos->x; + testpos.y = pos->y - 50; + testpos.z = pos->z; + + roomsCopy(rooms, testrooms); + func0f09233c(obj, &testpos, matrix, testrooms); + + ground = cdFindGroundYSimple(pos, 5, testrooms, &obj->floorcol, NULL); + + if (ground < -30000) { + ground = hov->ground; + } + + hov->ground = ground; + hov->groundprev60 = g_Vars.lvframe60; + } +} #if VERSION >= VERSION_PAL_FINAL GLOBAL_ASM( @@ -16932,7 +16894,7 @@ glabel var7f1ab5c0pf /* f0717d4: 02002825 */ move $a1,$s0 /* f0717d8: afa801c0 */ sw $t0,0x1c0($sp) /* f0717dc: 24460008 */ addiu $a2,$v0,0x8 -/* f0717e0: 0fc1c59b */ jal func0f0713e4 +/* f0717e0: 0fc1c59b */ jal hovUpdateGround /* f0717e4: 24470028 */ addiu $a3,$v0,0x28 /* f0717e8: 3c03800a */ lui $v1,0x800a /* f0717ec: 8c63a518 */ lw $v1,-0x5ae8($v1) @@ -17793,7 +17755,7 @@ glabel var7f1aa314 /* f07154c: 02002825 */ or $a1,$s0,$zero /* f071550: afa801c0 */ sw $t0,0x1c0($sp) /* f071554: 24460008 */ addiu $a2,$v0,0x8 -/* f071558: 0fc1c4f9 */ jal func0f0713e4 +/* f071558: 0fc1c4f9 */ jal hovUpdateGround /* f07155c: 24470028 */ addiu $a3,$v0,0x28 /* f071560: 3c03800a */ lui $v1,%hi(g_Vars+0x8) /* f071564: 8c639fc8 */ lw $v1,%lo(g_Vars+0x8)($v1) @@ -18793,7 +18755,7 @@ glabel var7f1aa31c /* f0723d4: 27a70440 */ addiu $a3,$sp,0x440 /* f0723d8: ad410000 */ sw $at,0x0($t2) /* f0723dc: afad0010 */ sw $t5,0x10($sp) -/* f0723e0: 0fc1c4f9 */ jal func0f0713e4 +/* f0723e0: 0fc1c4f9 */ jal hovUpdateGround /* f0723e4: 8fa503fc */ lw $a1,0x3fc($sp) /* f0723e8: 8fae03fc */ lw $t6,0x3fc($sp) /* f0723ec: c7b20434 */ lwc1 $f18,0x434($sp) @@ -47418,15 +47380,15 @@ s32 objTick(struct prop *prop) } if (hov) { - func0f0713e4(obj, hov, &prop->pos, prop->rooms, obj->realrot); + hovUpdateGround(obj, hov, &prop->pos, prop->rooms, obj->realrot); hoverpropSetTurnAngle(obj, atan2f(sp412.m[2][0], sp412.m[2][2])); hov->unk14 = 0; hov->unk1c = 0; hov->unk20 = 0; hov->unk28 = 0; - hov->unk30 = hov->unk34; - hov->unk04 = prop->pos.y - hov->unk34; + hov->unk30 = hov->ground; + hov->unk04 = prop->pos.y - hov->ground; hov->unk0c = 0; } diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 454e80002..b31cafdc5 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -145,7 +145,7 @@ u32 func0f070eac(void); void func0f070f08(struct liftobj *lift, bool arg0); void liftGoToStop(struct liftobj *lift, s32 stopnum); f32 objGetHov04(struct defaultobj *obj); -void func0f0713e4(struct defaultobj *obj, struct hov *hov, struct coord *coord, s16 *rooms, f32 *matrix); +void hovUpdateGround(struct defaultobj *obj, struct hov *hov, struct coord *pos, s16 *rooms, f32 *matrix); void func0f0714b8(struct defaultobj *obj, struct hov *hov); s32 objIsHoverpropOrBike(struct defaultobj *obj); f32 hoverpropGetTurnAngle(struct defaultobj *obj); diff --git a/src/include/types.h b/src/include/types.h index 28ffa55c7..522d785f0 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1622,9 +1622,9 @@ struct hov { /*0x28*/ f32 unk28; /*0x2c*/ f32 unk2c; /*0x30*/ f32 unk30; - /*0x34*/ f32 unk34; - /*0x38*/ s32 unk38; - /*0x3c*/ s32 unk3c; + /*0x34*/ f32 ground; + /*0x38*/ s32 groundnext60; // time60 of when ground should be updated next + /*0x3c*/ s32 groundprev60; // time60 of when ground was last updated }; struct defaultobj {