Fix these godforsaken rideroids

This commit is contained in:
Lat 2023-09-24 13:57:42 +02:00
parent a710237fde
commit 32620fbb4f
3 changed files with 61 additions and 47 deletions

View file

@ -725,9 +725,9 @@ struct player_t
//////////////
boolean rideroid; // on rideroid y/n
boolean rdnodepull; // being pulled by rideroid node. mo target is set to the node while this is true.
angle_t rideroidangle; // angle the rideroid is going at. This doesn't change once we're on it.
INT32 rideroidangle; // angle the rideroid is going at. This doesn't change once we're on it. INT32 because the code was originally written in lua and fuckshit happens with angle_t.
fixed_t rideroidspeed; // speed the rideroid is to be moving at.
fixed_t rideroidrollangle; // rollangle while turning
INT32 rideroidrollangle; // rollangle while turning
fixed_t rdaddmomx; // some speed variables to smoothe things out without fighting with the regular momentum system.
fixed_t rdaddmomy;
fixed_t rdaddmomz;

View file

@ -307,34 +307,34 @@ void Obj_RideroidThink(mobj_t *mo)
// now actual movement:
// first, do the movement for this frame
P_InstaThrust(pmo, mo->angle, p->rideroidspeed*mapobjectscale);
P_InstaThrust(pmo, (angle_t)p->rideroidangle, p->rideroidspeed*mapobjectscale);
basemomx = p->mo->momx;
basemomy = p->mo->momy;
pmo->momx += p->rdaddmomx;
pmo->momy += p->rdaddmomy;
pmo->momz += p->rdaddmomz;
pmo->angle = mo->angle;
p->drawangle = mo->angle;
P_SetPlayerAngle(pmo->player, mo->angle);
pmo->angle = (angle_t)p->rideroidangle;
p->drawangle = (angle_t)p->rideroidangle;
P_SetPlayerAngle(pmo->player, (angle_t)p->rideroidangle);
pmo->rollangle = p->rideroidrollangle;
mo->rollangle = p->rideroidrollangle;
pmo->pitch = 0;
// update the rideroid object (me) to be below the target player
Obj_updateRideroidPos(mo);
// now compute all the shit for the *next* frame!
basemomx = p->rideroidspeed*FINECOSINE(mo->angle >> ANGLETOFINESHIFT);
basemomy = p->rideroidspeed*FINESINE(mo->angle >> ANGLETOFINESHIFT);
// turning left/right
if (p->cmd.turning)
{
fixed_t savemomx = pmo->momx;
fixed_t savemomy = pmo->momy;
UINT8 dir = 0;
SINT8 dir = 0;
INT32 a;
if (p->cmd.turning < -400)
{
a = (INT32)(mo->angle) - ANG1*90;
P_Thrust(pmo, mo->angle - ANGLE_90, 2*mapobjectscale);
p->rideroidrollangle -= ANG1*3;
@ -346,6 +346,7 @@ void Obj_RideroidThink(mobj_t *mo)
}
else if (p->cmd.turning > 400)
{
a = (INT32)(mo->angle) + ANG1*90;
P_Thrust(pmo, mo->angle + ANGLE_90, 2*mapobjectscale);
p->rideroidrollangle += ANG1*3;
@ -360,38 +361,51 @@ void Obj_RideroidThink(mobj_t *mo)
p->rideroidspeed -= 1;
}
// save the added momentum
p->rdaddmomx = pmo->momx - basemomx;
p->rdaddmomy = pmo->momy - basemomy;
/*CONS_Printf("CURR: %d, %d\n", pmo->momx/mapobjectscale, pmo->momy/mapobjectscale);
CONS_Printf("BASE: %d, %d\n", basemomx/mapobjectscale, basemomy/mapobjectscale);
CONS_Printf("ADD: %d, %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale);*/
// find out how much addmomx and addmomy we can actually get.
// we do this by misusing P_Thrust to calc our values then immediately cancelling it.
basemomx = pmo->momx;
basemomy = pmo->momy;
if (mo->angle > ANGLE_90 && mo->angle < ANGLE_270)
P_Thrust(pmo, mo->angle - ANGLE_90, RIDEROIDMAXADD*6*mapobjectscale);
else
P_Thrust(pmo, mo->angle + ANGLE_90, RIDEROIDMAXADD*6*mapobjectscale);
xthreshold = pmo->momx - basemomx;
ythreshold = pmo->momy - basemomy;
// clamp the momentums using the calculated thresholds.
p->rdaddmomx = max(p->rdaddmomx, -abs(xthreshold));
p->rdaddmomy = max(p->rdaddmomy, -abs(ythreshold));
p->rdaddmomx = min(p->rdaddmomx, abs(xthreshold));
p->rdaddmomy = min(p->rdaddmomy, abs(ythreshold));
if (dir != 0)
{
// save the added momentum
p->rdaddmomx = pmo->momx - basemomx;
p->rdaddmomy = pmo->momy - basemomy;
// now cancel it.
pmo->momx = savemomx;
pmo->momy = savemomy;
//CONS_Printf("NEWCURR: %d, %d\n", pmo->momx/mapobjectscale, pmo->momy/mapobjectscale);
CONS_Printf("AX1: %d, AY1: %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale);
pmo->momx = basemomx;
pmo->momy = basemomy;
/*CONS_Printf("CURR: %d, %d\n", pmo->momx/mapobjectscale, pmo->momy/mapobjectscale);
CONS_Printf("BASE: %d, %d\n", basemomx/mapobjectscale, basemomy/mapobjectscale);
CONS_Printf("ADD: %d, %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale);*/
// find out how much addmomx and addmomy we can actually get.
// we do this by misusing P_Thrust to calc our values then immediately cancelling it.
basemomx = pmo->momx;
basemomy = pmo->momy;
a = (INT32)(mo->angle) - dir*ANG1*90;
P_Thrust(pmo, (angle_t)a, RIDEROIDMAXADD*3*mapobjectscale);
xthreshold = pmo->momx - basemomx;
ythreshold = pmo->momy - basemomy;
//CONS_Printf("XT: %d (%d), YT: %d (%d)\n", xthreshold/mapobjectscale, abs(xthreshold/mapobjectscale), ythreshold/mapobjectscale, abs(ythreshold/mapobjectscale));
// clamp the momentums using the calculated thresholds.
// the fixedmul check checks if both numbers are of the same sign.
if (abs(p->rdaddmomx) > abs(xthreshold))
p->rdaddmomx = xthreshold;
if (abs(p->rdaddmomy) > abs(ythreshold))
p->rdaddmomy = ythreshold;
//CONS_Printf("AX2: %d, AY2: %d\n", p->rdaddmomx/mapobjectscale, p->rdaddmomy/mapobjectscale);
// now cancel it.
pmo->momx = savemomx;
pmo->momy = savemomy;
//CONS_Printf("NEWCURR: %d, %d\n", pmo->momx/mapobjectscale, pmo->momy/mapobjectscale);
}
}
else // not turning
{

View file

@ -556,9 +556,9 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITEUINT8(save->p, players[i].rideroid);
WRITEUINT8(save->p, players[i].rdnodepull);
WRITEANGLE(save->p, players[i].rideroidangle);
WRITEINT32(save->p, players[i].rideroidangle);
WRITEFIXED(save->p, players[i].rideroidspeed);
WRITEANGLE(save->p, players[i].rideroidrollangle);
WRITEINT32(save->p, players[i].rideroidrollangle);
WRITEFIXED(save->p, players[i].rdaddmomx);
WRITEFIXED(save->p, players[i].rdaddmomy);
WRITEFIXED(save->p, players[i].rdaddmomz);
@ -1063,9 +1063,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].rideroid = READUINT8(save->p);
players[i].rdnodepull = READUINT8(save->p);
players[i].rideroidangle = READANGLE(save->p);
players[i].rideroidangle = READINT32(save->p);
players[i].rideroidspeed = READFIXED(save->p);
players[i].rideroidrollangle = READANGLE(save->p);
players[i].rideroidrollangle = READINT32(save->p);
players[i].rdaddmomx = READFIXED(save->p);
players[i].rdaddmomy = READFIXED(save->p);
players[i].rdaddmomz = READFIXED(save->p);