Identify hov and hovtype properties

This commit is contained in:
Ryan Dwyer 2023-06-28 23:37:39 +10:00
parent 3b4451a2d1
commit a780b5f179
8 changed files with 152 additions and 145 deletions

View File

@ -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) {

View File

@ -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;

View File

@ -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) {

View File

@ -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)

View File

@ -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

View File

@ -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);

View File

@ -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), \

View File

@ -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 {