From a780b5f1795163f72262f34d49a04a6a2fd8497e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 28 Jun 2023 23:37:39 +1000 Subject: [PATCH] Identify hov and hovtype properties --- src/game/bondbike.c | 6 +- src/game/bondgrab.c | 6 +- src/game/propobj.c | 195 +++++++++++++++++++------------------ src/game/setup.c | 28 +++--- src/include/constants.h | 2 + src/include/game/propobj.h | 2 +- src/include/props.h | 4 +- src/include/types.h | 54 +++++----- 8 files changed, 152 insertions(+), 145 deletions(-) diff --git a/src/game/bondbike.c b/src/game/bondbike.c index 4ef6948f2..7c83d4f5d 100644 --- a/src/game/bondbike.c +++ b/src/game/bondbike.c @@ -281,10 +281,10 @@ void bbikeApplyMoveData(struct movedata *data) sp3c = -bike->exreal; - if (bike->hov.unk14 < M_PI) { - sp3c += -bike->hov.unk14 * 0.8f; + if (bike->hov.bobpitchcur < M_PI) { + sp3c += -bike->hov.bobpitchcur * 0.8f; } else { - sp3c += (M_BADTAU - bike->hov.unk14) * 0.8f; + sp3c += (M_BADTAU - bike->hov.bobpitchcur) * 0.8f; } if (sp3c < 0) { diff --git a/src/game/bondgrab.c b/src/game/bondgrab.c index e44c6d170..a1cec58f0 100644 --- a/src/game/bondgrab.c +++ b/src/game/bondgrab.c @@ -84,7 +84,7 @@ void bgrabInit(void) if (hov) { g_Vars.currentplayer->grabbedrotoffset = - hov->unk10 - (M_BADTAU - (g_Vars.currentplayer->vv_theta * M_BADTAU) / 360.0f); + hov->yrot - (M_BADTAU - (g_Vars.currentplayer->vv_theta * M_BADTAU) / 360.0f); if (g_Vars.currentplayer->grabbedrotoffset >= M_BADTAU) { g_Vars.currentplayer->grabbedrotoffset -= M_BADTAU; @@ -448,7 +448,7 @@ s32 bgrabCalculateNewPosition(struct coord *delta, f32 angle, bool arg2) - g_Vars.currentplayer->vv_theta * M_BADTAU / 360.0f + -angle + g_Vars.currentplayer->grabbedrotoffset - - hov->unk10 + - hov->yrot + rotextra; while (sp78 >= M_PI) { @@ -1207,7 +1207,7 @@ void bgrabTick(void) if (g_Vars.currentplayer->grabbedprop) { // Determine if the grabbed prop should be force released f32 ydiff = g_Vars.currentplayer->grabbedprop->pos.y - - objGetHov04(g_Vars.currentplayer->grabbedprop->obj) + - objGetHovBobOffsetY(g_Vars.currentplayer->grabbedprop->obj) - g_Vars.currentplayer->vv_manground; struct prop *grabbedprop = g_Vars.currentplayer->grabbedprop; diff --git a/src/game/propobj.c b/src/game/propobj.c index ff0392a62..76d6ad75b 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -1773,11 +1773,11 @@ void func0f069850(struct defaultobj *obj, struct coord *pos, f32 rot[3][3], stru if (obj->type == OBJTYPE_HOVERBIKE) { hoverbike = (struct hoverbikeobj *)obj; - cyl->ymax = hoverbike->hov.ground + g_HovTypes[hoverbike->hov.type].unk00 + objGetLocalYMax(bbox) * obj->model->scale; + cyl->ymax = hoverbike->hov.ground + g_HovTypes[hoverbike->hov.type].bobymid + objGetLocalYMax(bbox) * obj->model->scale; cyl->ymin = hoverbike->hov.ground + 20.0f; } else if (obj->type == OBJTYPE_HOVERPROP) { hoverprop = (struct hoverpropobj *)obj; - cyl->ymax = hoverprop->hov.ground + g_HovTypes[hoverprop->hov.type].unk00 + objGetLocalYMax(bbox) * obj->model->scale; + cyl->ymax = hoverprop->hov.ground + g_HovTypes[hoverprop->hov.type].bobymid + objGetLocalYMax(bbox) * obj->model->scale; cyl->ymin = hoverprop->hov.ground + 20.0f; } else { cyl->ymin = mtx.m[3][1] + objGetRotatedLocalYMinByMtx4(bbox, &mtx); @@ -1796,11 +1796,11 @@ void func0f069850(struct defaultobj *obj, struct coord *pos, f32 rot[3][3], stru if (obj->type == OBJTYPE_HOVERBIKE) { hoverbike = (struct hoverbikeobj *)obj; - cyl->ymax = hoverbike->hov.ground + g_HovTypes[hoverbike->hov.type].unk00 + objGetLocalYMax(bbox) * obj->model->scale; + cyl->ymax = hoverbike->hov.ground + g_HovTypes[hoverbike->hov.type].bobymid + objGetLocalYMax(bbox) * obj->model->scale; cyl->ymin = hoverbike->hov.ground + 20.0f; } else if (obj->type == OBJTYPE_HOVERPROP) { hoverprop = (struct hoverpropobj *)obj; - cyl->ymax = hoverprop->hov.ground + g_HovTypes[hoverprop->hov.type].unk00 + objGetLocalYMax(bbox) * obj->model->scale; + cyl->ymax = hoverprop->hov.ground + g_HovTypes[hoverprop->hov.type].bobymid + objGetLocalYMax(bbox) * obj->model->scale; cyl->ymin = hoverprop->hov.ground + 20.0f; } } @@ -4817,20 +4817,15 @@ s32 glassCalculateOpacity(struct coord *pos, f32 xludist, f32 opadist, f32 arg3) struct prop *g_Lifts[10] = {NULL}; +#define BOB(minamount, randamount, accel, maxspeed) \ + minamount, randamount, PALUPF(accel), PALUPF(maxspeed) + struct hovtype g_HovTypes[] = { -#if PAL - /* HOVTYPE_BED */ { 90, 1, 2, 0.0012, 1.200000000, 0.0062821852043271, 0.0062821852043271, 0.000012564370990731, 0.00037693112972192, 0.0062821852043271, 0.0062821852043271, 0.000012564370990731, 0.00037693112972192 }, - /* HOVTYPE_BIKE */ { 80, 1, 3, 0.0030, 0.120000004, 0.0125643704086540, 0.0188465546816590, 0.000025128741981462, 0.00075386225944385, 0.0125643704086540, 0.0188465546816590, 0.000025128741981462, 0.00075386225944385 }, - /* HOVTYPE_CRATE */ { 70, 2, 4, 0.0012, 1.200000000, 0.0062821852043271, 0.0125643704086540, 0.000012564370990731, 0.00037693112972192, 0.0062821852043271, 0.0125643704086540, 0.000012564370990731, 0.00037693112972192 }, - /* HOVTYPE_3 */ { 170, 2, 2, 0.0012, 1.200000000, 0.0031410926021636, 0.0031410926021636, 0.000006282185495365, 0.00022615866328124, 0.0031410926021636, 0.0031410926021636, 0.000006282185495365, 0.00022615866328124 }, - /* HOVTYPE_4 */ { 170, 2, 2, 0.0012, 1.200000000, 0.0031410926021636, 0.0031410926021636, 0.000006282185495365, 0.00022615866328124, 0.0031410926021636, 0.0031410926021636, 0.000006282185495365, 0.00022615866328124 }, -#else - /* HOVTYPE_BED */ { 90, 1, 2, 0.0010, 1.000000000, 0.0062821852043271, 0.0062821852043271, 0.000010470308552613, 0.00031410926021636, 0.0062821852043271, 0.0062821852043271, 0.000010470308552613, 0.00031410926021636 }, - /* HOVTYPE_BIKE */ { 80, 1, 3, 0.0025, 0.100000000, 0.0125643704086540, 0.0188465546816590, 0.000020940617105225, 0.00062821852043271, 0.0125643704086540, 0.0188465546816590, 0.000020940617105225, 0.00062821852043271 }, - /* HOVTYPE_CRATE */ { 70, 2, 4, 0.0010, 1.000000000, 0.0062821852043271, 0.0125643704086540, 0.000010470308552613, 0.00031410926021636, 0.0062821852043271, 0.0125643704086540, 0.000010470308552613, 0.00031410926021636 }, - /* HOVTYPE_3 */ { 170, 2, 2, 0.0010, 1.000000000, 0.0031410926021636, 0.0031410926021636, 0.000005235154276306, 0.00018846555030905, 0.0031410926021636, 0.0031410926021636, 0.000005235154276306, 0.00018846555030905 }, - /* HOVTYPE_4 */ { 170, 2, 2, 0.0010, 1.000000000, 0.0031410926021636, 0.0031410926021636, 0.000005235154276306, 0.00018846555030905, 0.0031410926021636, 0.0031410926021636, 0.000005235154276306, 0.00018846555030905 }, -#endif + /* HOVTYPE_BED */ { 90, BOB(1, 2, 0.0010, 1.0), BOB(0.0062821852043271, 0.0062821852043271, 0.000010470308552613, 0.00031410926021636), BOB(0.0062821852043271, 0.0062821852043271, 0.000010470308552613, 0.00031410926021636) }, + /* HOVTYPE_BIKE */ { 80, BOB(1, 3, 0.0025, 0.1), BOB(0.0125643704086540, 0.0188465546816590, 0.000020940617105225, 0.00062821852043271), BOB(0.0125643704086540, 0.0188465546816590, 0.000020940617105225, 0.00062821852043271) }, + /* HOVTYPE_CRATE */ { 70, BOB(2, 4, 0.0010, 1.0), BOB(0.0062821852043271, 0.0125643704086540, 0.000010470308552613, 0.00031410926021636), BOB(0.0062821852043271, 0.0125643704086540, 0.000010470308552613, 0.00031410926021636) }, + /* HOVTYPE_3 */ { 170, BOB(2, 2, 0.0010, 1.0), BOB(0.0031410926021636, 0.0031410926021636, 0.000005235154276306, 0.00018846555030905), BOB(0.0031410926021636, 0.0031410926021636, 0.000005235154276306, 0.00018846555030905) }, + /* HOVTYPE_4 */ { 170, BOB(2, 2, 0.0010, 1.0), BOB(0.0031410926021636, 0.0031410926021636, 0.000005235154276306, 0.00018846555030905), BOB(0.0031410926021636, 0.0031410926021636, 0.000005235154276306, 0.00018846555030905) }, }; void func0f070a1c(struct modelrodata_bbox *bbox, f32 rot[3][3], struct coord *pos, struct coord *vertices) @@ -5135,7 +5130,13 @@ void liftGoToStop(struct liftobj *lift, s32 stopnum) } } -f32 objGetHov04(struct defaultobj *obj) +/** + * For hover crates, hover bikes and hover beds. + * + * The value returned is the distance between the object's ground (when not falling) + * and its Y value. For crates, the value returned is typically between 65 and 75 (cm). + */ +f32 objGetHovBobOffsetY(struct defaultobj *obj) { struct hov *hov = NULL; f32 result; @@ -5149,7 +5150,7 @@ f32 objGetHov04(struct defaultobj *obj) } if (hov) { - result = hov->unk04; + result = hov->bobycur; } else { struct modelrodata_bbox *bbox = objFindBboxRodata(obj); f32 value = objGetRotatedLocalYMinByMtx3(bbox, obj->realrot); @@ -5165,7 +5166,7 @@ void hovUpdateGround(struct defaultobj *obj, struct hov *hov, struct coord *pos, RoomNum testrooms[8]; struct coord testpos; - if (g_Vars.lvframe60 > hov->nexttick60) { + if (g_Vars.lvframe60 > hov->prevframe60) { testpos.x = pos->x; testpos.y = pos->y - 50; testpos.z = pos->z; @@ -5180,7 +5181,7 @@ void hovUpdateGround(struct defaultobj *obj, struct hov *hov, struct coord *pos, } hov->ground = ground; - hov->prevtick60 = g_Vars.lvframe60; + hov->prevgroundframe60 = g_Vars.lvframe60; } } @@ -5203,30 +5204,31 @@ void hovTick(struct defaultobj *obj, struct hov *hov) struct hovtype *type; f32 spbc; f32 spb8; - f32 spb4; + f32 groundangle; f32 xrot; - f32 spac; + f32 ground; RoomNum sp9c[8]; struct coord sp90; - bool sp8c; + bool moved; f32 radius; f32 ymax; f32 ymin; - if (g_Vars.lvframe60 > hov->nexttick60) { + if (g_Vars.lvframe60 > hov->prevframe60) { prop = obj->prop; bbox = objFindBboxRodata(obj); type = &g_HovTypes[hov->type]; - sp8c = false; + moved = false; - if (hov->prevtick60 < g_Vars.lvframe60) { + if (g_Vars.lvframe60 > hov->prevgroundframe60) { hovUpdateGround(obj, hov, &prop->pos, prop->rooms, obj->realrot); } - hov->nexttick60 = g_Vars.lvframe60; + hov->prevframe60 = g_Vars.lvframe60; + // Calculate ground angle if (obj->flags & OBJFLAG_DEACTIVATED) { - spb4 = 0.0f; + groundangle = 0.0f; } else { if (obj->flags3 & OBJFLAG3_GEOCYL) { objGetBbox(prop, &radius, &ymax, &ymin); @@ -5237,8 +5239,8 @@ void hovTick(struct defaultobj *obj, struct hov *hov) sp1cc = bbox->zmax * 0.9f * obj->model->scale; } - spbc = cosf(hov->unk10); - spb8 = sinf(hov->unk10); + spbc = cosf(hov->yrot); + spb8 = sinf(hov->yrot); sp1b4.x = prop->pos.x + sp1d0 * spb8; sp1b4.y = prop->pos.y; @@ -5265,81 +5267,84 @@ void hovTick(struct defaultobj *obj, struct hov *hov) ground2 = cdFindGroundAtCyl(&sp1a8, 5, sp188, NULL, NULL); if (ground1 >= -30000.0f && ground2 >= -30000.0f) { - spb4 = atan2f(ground1 - ground2, sp1cc - sp1d0); + groundangle = atan2f(ground1 - ground2, sp1cc - sp1d0); - if (spb4 >= M_PI) { - spb4 -= M_BADTAU; + if (groundangle >= M_PI) { + groundangle -= M_BADTAU; } } else if (ground1 >= -30000.0f) { - spb4 = atan2f(ground1 - hov->ground, -sp1d0); + groundangle = atan2f(ground1 - hov->ground, -sp1d0); - if (spb4 >= M_PI) { - spb4 -= M_BADTAU; + if (groundangle >= M_PI) { + groundangle -= M_BADTAU; } } else if (ground2 >= -30000.0f) { - spb4 = atan2f(hov->ground - ground2, sp1cc); + groundangle = atan2f(hov->ground - ground2, sp1cc); - if (spb4 >= M_PI) { - spb4 -= M_BADTAU; + if (groundangle >= M_PI) { + groundangle -= M_BADTAU; } } else { - spb4 = 0.0f; + groundangle = 0.0f; } } - spac = hov->ground; + ground = hov->ground; if (obj->hidden & OBJHFLAG_GRABBED) { - if (spac < g_Vars.currentplayer->vv_ground - 70.0f) { - spac = g_Vars.currentplayer->vv_ground; + if (g_Vars.currentplayer->vv_ground - 70.0f > ground) { + ground = g_Vars.currentplayer->vv_ground; } } - if (hov->flags & 1) { - sp8c = true; - hov->unk04 = hov->unk08 = type->unk00; - hov->unk30 = spac; - hov->flags &= ~1; + if (hov->flags & HOVFLAG_FIRSTTICK) { + moved = true; + hov->bobycur = hov->bobytarget = type->bobymid; + hov->y = ground; + hov->flags &= ~HOVFLAG_FIRSTTICK; if (obj->type == OBJTYPE_HOVERBIKE) { psCreate(NULL, obj->prop, SFX_BIKE_PULSE, -1, -1, 0, 0, PSTYPE_NONE, 0, -1.0f, 0, -1, -1.0f, -1.0f, -1.0f); } } - applySpeed(&hov->unk04, hov->unk08, &hov->unk0c, type->unk0c, type->unk0c, type->unk10); + // Update Y bob + applySpeed(&hov->bobycur, hov->bobytarget, &hov->bobyspeed, type->bobyaccel, type->bobyaccel, type->bobymaxspeed); - if (hov->unk08 >= type->unk00 && hov->unk08 <= hov->unk04) { - hov->unk0c = 0.0f; - hov->unk08 = type->unk00 - type->unk04 - RANDOMFRAC() * type->unk08; - } else if (hov->unk08 < type->unk00 && hov->unk08 >= hov->unk04) { - hov->unk0c = 0.0f; - hov->unk08 = type->unk00 + type->unk04 + RANDOMFRAC() * type->unk08; + if (hov->bobytarget >= type->bobymid && hov->bobycur >= hov->bobytarget) { + hov->bobyspeed = 0.0f; + hov->bobytarget = type->bobymid - type->bobyminradius - RANDOMFRAC() * type->bobyrandradius; + } else if (hov->bobytarget < type->bobymid && hov->bobycur <= hov->bobytarget) { + hov->bobyspeed = 0.0f; + hov->bobytarget = type->bobymid + type->bobyminradius + RANDOMFRAC() * type->bobyrandradius; } - applyRotation(&hov->unk14, hov->unk18, &hov->unk1c, type->unk1c, type->unk1c, type->unk20); + // Update pitch bob + applyRotation(&hov->bobpitchcur, hov->bobpitchtarget, &hov->bobpitchspeed, type->bobpitchaccel, type->bobpitchaccel, type->bobpitchmaxspeed); - if (hov->unk14 == hov->unk18) { - if (hov->unk1c <= 2.0f * type->unk1c && hov->unk1c >= 2.0f * -type->unk1c) { - hov->unk1c = 0.0f; + if (hov->bobpitchcur == hov->bobpitchtarget) { + if (hov->bobpitchspeed <= 2.0f * type->bobpitchaccel && hov->bobpitchspeed >= 2.0f * -type->bobpitchaccel) { + hov->bobpitchspeed = 0.0f; - if (hov->unk18 < M_PI) { - hov->unk18 = M_BADTAU - type->unk14 - RANDOMFRAC() * type->unk18; + if (hov->bobpitchtarget < M_PI) { + hov->bobpitchtarget = M_BADTAU - type->bobpitchminangle - RANDOMFRAC() * type->bobpitchrandangle; } else { - hov->unk18 = type->unk14 + RANDOMFRAC() * type->unk18; + hov->bobpitchtarget = type->bobpitchminangle + RANDOMFRAC() * type->bobpitchrandangle; } } } - applyRotation(&hov->unk20, hov->unk24, &hov->unk28, type->unk2c, type->unk2c, type->unk30); + // Update roll bob + applyRotation(&hov->bobrollcur, hov->bobrolltarget, &hov->bobrollspeed, type->bobrollaccel, type->bobrollaccel, type->bobrollmaxspeed); - if (hov->unk20 == hov->unk24) { - if (hov->unk28 <= 2.0f * type->unk2c && hov->unk28 >= 2.0f * -type->unk2c) { - hov->unk28 = 0.0f; + if (hov->bobrollcur == hov->bobrolltarget) { + if (hov->bobrollspeed <= 2.0f * type->bobrollaccel && hov->bobrollspeed >= 2.0f * -type->bobrollaccel) { + hov->bobrollspeed = 0.0f; - if (hov->unk24 < M_PI) { - hov->unk24 = M_BADTAU - type->unk24 - RANDOMFRAC() * type->unk28; + if (hov->bobrolltarget < M_PI) { + hov->bobrolltarget = M_BADTAU - type->bobrollminangle - RANDOMFRAC() * type->bobrollrandangle; } else { - hov->unk24 = type->unk24 + RANDOMFRAC() * type->unk28; + hov->bobrolltarget = type->bobrollminangle + RANDOMFRAC() * type->bobrollrandangle; } } } @@ -5349,12 +5354,12 @@ void hovTick(struct defaultobj *obj, struct hov *hov) f32 f12; f32 f2; - hov->unk2c += (spb4 - hov->unk2c) * (PAL ? 0.0893f : 0.075f); + hov->groundpitch += (groundangle - hov->groundpitch) * (PAL ? 0.0893f : 0.075f); - f0 = spac - hov->unk30; + f0 = ground - hov->y; f12 = (PAL ? 0.102000005f : 0.085f); - if (hov->unk30 < hov->ground) { + if (hov->y < hov->ground) { if (f0 >= 0.0f) { f2 = f0; } else { @@ -5388,28 +5393,28 @@ void hovTick(struct defaultobj *obj, struct hov *hov) } } - hov->unk30 += f0; + hov->y += f0; if (f0 > 1.0f || f0 < -1.0f) { - sp8c = true; + moved = true; } } - if (sp8c) { + if (moved) { func0f069c70(obj, true, true); } - if (hov->unk30 < hov->ground - 5.0f || hov->unk30 > hov->ground + 5.0f) { + if (hov->y < hov->ground - 5.0f || hov->y > hov->ground + 5.0f) { obj->flags |= OBJFLAG_HOVERCAR_ISHOVERBOT; } else { obj->flags &= ~OBJFLAG_HOVERCAR_ISHOVERBOT; } - prop->pos.y = objGetHov04(obj) + hov->unk30; + prop->pos.y = objGetHovBobOffsetY(obj) + hov->y; - mtx4LoadZRotation(hov->unk20, &sp148); + mtx4LoadZRotation(hov->bobrollcur, &sp148); - xrot = hov->unk2c + hov->unk14; + xrot = hov->groundpitch + hov->bobpitchcur; if (xrot >= M_BADTAU) { xrot -= M_BADTAU; @@ -5419,7 +5424,7 @@ void hovTick(struct defaultobj *obj, struct hov *hov) mtx4LoadXRotation(xrot, &sp108); mtx00015be0(&sp108, &sp148); - mtx4LoadYRotation(hov->unk10, &sp108); + mtx4LoadYRotation(hov->yrot, &sp108); mtx00015be0(&sp108, &sp148); mtx00015f04(obj->model->scale, &sp148); @@ -5455,10 +5460,10 @@ f32 hoverpropGetTurnAngle(struct defaultobj *obj) if (obj->type == OBJTYPE_HOVERPROP) { struct hoverpropobj *hoverprop = (struct hoverpropobj *)obj; - angle = hoverprop->hov.unk10; + angle = hoverprop->hov.yrot; } else if (obj->type == OBJTYPE_HOVERBIKE) { struct hoverbikeobj *hoverbike = (struct hoverbikeobj *)obj; - angle = hoverbike->hov.unk10; + angle = hoverbike->hov.yrot; } return angle; @@ -5468,10 +5473,10 @@ void hoverpropSetTurnAngle(struct defaultobj *obj, f32 angle) { if (obj->type == OBJTYPE_HOVERPROP) { struct hoverpropobj *hoverprop = (struct hoverpropobj *)obj; - hoverprop->hov.unk10 = angle; + hoverprop->hov.yrot = angle; } else if (obj->type == OBJTYPE_HOVERBIKE) { struct hoverbikeobj *hoverbike = (struct hoverbikeobj *)obj; - hoverbike->hov.unk10 = angle; + hoverbike->hov.yrot = angle; } } @@ -6649,7 +6654,7 @@ s32 projectileTick(struct defaultobj *obj, bool *embedded) ground = cdFindGroundAtCyl(&prop->pos, 2, prop->rooms, &obj->floorcol, NULL); if (ground > -30000.0f) { - prop->pos.y = ground + objGetHov04(obj); + prop->pos.y = ground + objGetHovBobOffsetY(obj); } } @@ -7814,7 +7819,7 @@ void platformDisplaceProps(struct prop *platform, s16 *propnums, struct coord *p } if (hov) { - hov->unk30 += newpos->y - prevpos->y; + hov->y += newpos->y - prevpos->y; hov->ground += newpos->y - prevpos->y; } @@ -10546,7 +10551,7 @@ void hovercarTick(struct prop *prop) // during acceleration can cause the hovercar to exceed its max speed. if (hovercar->speedtime60 >= 0) { if (1); - if (hovercar->speedtime60 <= g_Vars.lvupdate60freal) { + if (g_Vars.lvupdate60freal >= hovercar->speedtime60) { hovercar->speed = hovercar->speedaim; } else { hovercar->speed += (hovercar->speedaim - hovercar->speed) * g_Vars.lvupdate60freal / hovercar->speedtime60; @@ -11085,13 +11090,13 @@ s32 objTickPlayer(struct prop *prop) 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->ground; - hov->unk04 = prop->pos.y - hov->ground; - hov->unk0c = 0; + hov->bobpitchcur = 0; + hov->bobpitchspeed = 0; + hov->bobrollcur = 0; + hov->bobrollspeed = 0; + hov->y = hov->ground; + hov->bobycur = prop->pos.y - hov->ground; + hov->bobyspeed = 0; } if ((obj->flags & OBJFLAG_IGNOREFLOORCOLOUR) == 0) { diff --git a/src/game/setup.c b/src/game/setup.c index d532db458..3c1a00bbf 100644 --- a/src/game/setup.c +++ b/src/game/setup.c @@ -1184,21 +1184,21 @@ void setupCreateDoor(struct doorobj *door, s32 cmdindex) void setupCreateHov(struct defaultobj *obj, struct hov *hov) { - hov->unk04 = 0; - hov->unk08 = 0; - hov->unk0c = 0; - hov->unk10 = atan2f(obj->realrot[2][0], obj->realrot[2][2]); - hov->unk14 = 0; - hov->unk18 = 0; - hov->unk1c = 0; - hov->unk20 = 0; - hov->unk24 = 0; - hov->unk28 = 0; - hov->unk2c = 0; - hov->unk30 = 0; + hov->bobycur = 0; + hov->bobytarget = 0; + hov->bobyspeed = 0; + hov->yrot = atan2f(obj->realrot[2][0], obj->realrot[2][2]); + hov->bobpitchcur = 0; + hov->bobpitchtarget = 0; + hov->bobpitchspeed = 0; + hov->bobrollcur = 0; + hov->bobrolltarget = 0; + hov->bobrollspeed = 0; + hov->groundpitch = 0; + hov->y = 0; hov->ground = 0; - hov->nexttick60 = -1; - hov->prevtick60 = -1; + hov->prevframe60 = -1; + hov->prevgroundframe60 = -1; } void setupLoadBriefing(s32 stagenum, u8 *buffer, s32 bufferlen, struct briefing *briefing) diff --git a/src/include/constants.h b/src/include/constants.h index b7bb670e7..a0b3f3b35 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -1382,6 +1382,8 @@ #define HITPART_GENERAL 200 #define HITPART_GENERALHALF 201 +#define HOVFLAG_FIRSTTICK 1 + #define HOVTYPE_BED 0 #define HOVTYPE_BIKE 1 #define HOVTYPE_CRATE 2 diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 304947f69..98752dd7a 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -141,7 +141,7 @@ struct prop *liftFindByPad(s16 padnum); f32 liftGetY(struct liftobj *lift); void liftUpdateTiles(struct liftobj *lift, bool stationary); void liftGoToStop(struct liftobj *lift, s32 stopnum); -f32 objGetHov04(struct defaultobj *obj); +f32 objGetHovBobOffsetY(struct defaultobj *obj); void hovUpdateGround(struct defaultobj *obj, struct hov *hov, struct coord *pos, RoomNum *rooms, f32 matrix[3][3]); void hovTick(struct defaultobj *obj, struct hov *hov); s32 objIsHoverpropOrBike(struct defaultobj *obj); diff --git a/src/include/props.h b/src/include/props.h index b9069f884..ddb46622a 100644 --- a/src/include/props.h +++ b/src/include/props.h @@ -186,14 +186,14 @@ #define hoverbike(scale, model, pad, flags, flags2, flags3, maxdamage) \ _generic_object(0x33, scale, model, pad, flags, flags2, flags3, maxdamage), \ - _mkword(_mkshort(HOVTYPE_BIKE, TRUE), 0), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + _mkword(_mkshort(HOVTYPE_BIKE, HOVFLAG_FIRSTTICK), 0), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #define endprops \ 0x34, #define hover_prop(scale, model, pad, flags, flags2, flags3, maxdamage, hovtype) \ _generic_object(0x35, scale, model, pad, flags, flags2, flags3, maxdamage), \ - _mkword(_mkshort(hovtype, TRUE), 0), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + _mkword(_mkshort(hovtype, HOVFLAG_FIRSTTICK), 0), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #define fan(scale, model, pad, flags, flags2, flags3, maxdamage, maxspeed, accel, on) \ _generic_object(0x36, scale, model, pad, flags, flags2, flags3, maxdamage), \ diff --git a/src/include/types.h b/src/include/types.h index 7d591494c..ce4ec5f7c 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1419,21 +1419,21 @@ struct tvscreen { struct hov { /*0x00*/ u8 type; /*0x01*/ u8 flags; - /*0x04*/ f32 unk04; - /*0x08*/ f32 unk08; - /*0x0c*/ f32 unk0c; - /*0x10*/ f32 unk10; - /*0x14*/ f32 unk14; - /*0x18*/ f32 unk18; - /*0x1c*/ f32 unk1c; - /*0x20*/ f32 unk20; - /*0x24*/ f32 unk24; - /*0x28*/ f32 unk28; - /*0x2c*/ f32 unk2c; - /*0x30*/ f32 unk30; + /*0x04*/ f32 bobycur; + /*0x08*/ f32 bobytarget; + /*0x0c*/ f32 bobyspeed; + /*0x10*/ f32 yrot; + /*0x14*/ f32 bobpitchcur; + /*0x18*/ f32 bobpitchtarget; + /*0x1c*/ f32 bobpitchspeed; + /*0x20*/ f32 bobrollcur; + /*0x24*/ f32 bobrolltarget; + /*0x28*/ f32 bobrollspeed; + /*0x2c*/ f32 groundpitch; + /*0x30*/ f32 y; /*0x34*/ f32 ground; - /*0x38*/ s32 nexttick60; // framenum of when next tick should occur - /*0x3c*/ s32 prevtick60; // framenum of when hov was last ticked + /*0x38*/ s32 prevframe60; + /*0x3c*/ s32 prevgroundframe60; }; struct defaultobj { @@ -6279,19 +6279,19 @@ struct skyvtx2d { }; struct hovtype { - /*0x00*/ f32 unk00; - /*0x04*/ f32 unk04; - /*0x08*/ f32 unk08; - /*0x0c*/ f32 unk0c; - /*0x10*/ f32 unk10; - /*0x14*/ f32 unk14; - /*0x18*/ f32 unk18; - /*0x1c*/ f32 unk1c; - /*0x20*/ f32 unk20; - /*0x24*/ f32 unk24; - /*0x28*/ f32 unk28; - /*0x2c*/ f32 unk2c; - /*0x30*/ f32 unk30; + /*0x00*/ f32 bobymid; + /*0x04*/ f32 bobyminradius; + /*0x08*/ f32 bobyrandradius; + /*0x0c*/ f32 bobyaccel; + /*0x10*/ f32 bobymaxspeed; + /*0x14*/ f32 bobpitchminangle; + /*0x18*/ f32 bobpitchrandangle; + /*0x1c*/ f32 bobpitchaccel; + /*0x20*/ f32 bobpitchmaxspeed; + /*0x24*/ f32 bobrollminangle; + /*0x28*/ f32 bobrollrandangle; + /*0x2c*/ f32 bobrollaccel; + /*0x30*/ f32 bobrollmaxspeed; }; struct modelrwdatabinding {