mirror of
https://gitlab.com/ryandwyer/perfect-dark
synced 2026-09-10 19:49:51 -04:00
Identify hov and hovtype properties
This commit is contained in:
+3
-3
@@ -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) {
|
||||
|
||||
+3
-3
@@ -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;
|
||||
|
||||
+100
-95
@@ -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) {
|
||||
|
||||
+14
-14
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
+2
-2
@@ -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), \
|
||||
|
||||
+27
-27
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user