- SW: Consistently apply SOP angle scaling to pitch as well as yaw.

This commit is contained in:
Mitchell Richters 2023-10-03 14:46:26 +11:00
parent 3c4eb21484
commit 6cff02d33b
2 changed files with 60 additions and 95 deletions

View file

@ -105,7 +105,7 @@ void GameInput::processMovement(PlayerAngles* const plrAngles, const float scale
// set up variables. // set up variables.
InputPacket thisInput{}; InputPacket thisInput{};
const auto keymove = 1 << int(!!(inputBuffer.actions & SB_RUN)); const auto keymove = 1 << int(!!(inputBuffer.actions & SB_RUN));
const auto hidspeed = float(getTicrateScale(YAW_TURNSPEEDS[2]) * turnscale); const auto hidspeed = float(getTicrateScale(YAW_TURNSPEEDS[2]));
// get all input amounts. // get all input amounts.
const auto turning = buttonMap.ButtonDown(gamefunc_Turn_Right) - const auto turning = buttonMap.ButtonDown(gamefunc_Turn_Right) -
@ -131,14 +131,15 @@ void GameInput::processMovement(PlayerAngles* const plrAngles, const float scale
const float turnspeed = float(getTicrateScale(YAW_TURNSPEEDS[keymove]) * tttscale); const float turnspeed = float(getTicrateScale(YAW_TURNSPEEDS[keymove]) * tttscale);
thisInput.avel += mouseInput.X * MOUSE_SCALE * m_yaw; thisInput.avel += mouseInput.X * MOUSE_SCALE * m_yaw;
thisInput.avel -= joyAxes[JOYAXIS_Yaw] * hidspeed * scaleAdjust; thisInput.avel -= joyAxes[JOYAXIS_Yaw] * hidspeed * scaleAdjust;
thisInput.avel += turndir * turnscale * turnspeed * scaleAdjust; thisInput.avel += turndir * turnspeed * scaleAdjust;
thisInput.avel *= turnscale;
if (turndir) updateTurnHeldAmt(scaleAdjust); else turnheldtime = 0; if (turndir) updateTurnHeldAmt(scaleAdjust); else turnheldtime = 0;
} }
else else
{ {
thisInput.svel += mouseInput.X * MOUSE_SCALE * m_side; thisInput.svel += mouseInput.X * MOUSE_SCALE * m_side;
thisInput.svel -= joyAxes[JOYAXIS_Yaw] * keymove * scaleAdjust; thisInput.svel -= joyAxes[JOYAXIS_Yaw] * keymove * scaleAdjust;
thisInput.svel += turning * turnscale * keymove * scaleAdjust; thisInput.svel += turning * keymove * scaleAdjust;
} }
// process player pitch input. // process player pitch input.
@ -146,6 +147,7 @@ void GameInput::processMovement(PlayerAngles* const plrAngles, const float scale
{ {
thisInput.horz -= mouseInput.Y * MOUSE_SCALE * m_pitch; thisInput.horz -= mouseInput.Y * MOUSE_SCALE * m_pitch;
thisInput.horz -= joyAxes[JOYAXIS_Pitch] * hidspeed * scaleAdjust; thisInput.horz -= joyAxes[JOYAXIS_Pitch] * hidspeed * scaleAdjust;
thisInput.horz *= turnscale;
} }
else else
{ {

View file

@ -1444,99 +1444,18 @@ void UpdatePlayerSpriteAngle(DSWPlayer* pp)
// //
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void DoPlayerTurnVehicle(DSWPlayer* pp, double zz, double floordist) void DoPlayerVehicleInputScaling(DSWPlayer* const pp, float InputPacket::* angle, const float scale)
{ {
SECTOR_OBJECT* sop = pp->sop; SECTOR_OBJECT* sop = pp->sop;
if (sop->drive_angspeed) if (sop->drive_angspeed)
{ {
pp->cmd.ucmd.avel = float(((pp->cmd.ucmd.avel * sop->drive_angspeed) + (pp->lastcmd.ucmd.avel * (sop->drive_angslide - 1))) / sop->drive_angslide); pp->cmd.ucmd.*angle = float(((pp->cmd.ucmd.*angle * sop->drive_angspeed) + (pp->lastcmd.ucmd.*angle * (sop->drive_angslide - 1))) / sop->drive_angslide);
} }
else else
{ {
pp->cmd.ucmd.avel *= synctics * 0.125f; pp->cmd.ucmd.*angle *= synctics * scale;
} }
if (pp->cmd.ucmd.avel != 0)
{
auto sum = pp->GetActor()->spr.Angles.Yaw + DAngle::fromDeg(pp->cmd.ucmd.avel);
if (MultiClipTurn(pp, sum, zz, floordist))
{
pp->GetActor()->spr.Angles.Yaw = sum;
}
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DoPlayerTurnVehicleRect(DSWPlayer* pp, DVector2* pos, DVector2* opos)
{
SECTOR_OBJECT* sop = pp->sop;
if (sop->drive_angspeed)
{
pp->cmd.ucmd.avel = float(((pp->cmd.ucmd.avel * sop->drive_angspeed) + (pp->lastcmd.ucmd.avel * (sop->drive_angslide - 1))) / sop->drive_angslide);
}
else
{
pp->cmd.ucmd.avel *= synctics * 0.125f;
}
if (pp->cmd.ucmd.avel != 0)
{
auto sum = pp->GetActor()->spr.Angles.Yaw + DAngle::fromDeg(pp->cmd.ucmd.avel);
if (RectClipTurn(pp, sum, pos, opos))
{
pp->GetActor()->spr.Angles.Yaw = sum;
}
}
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
void DoPlayerTurnTurret(DSWPlayer* pp)
{
DAngle new_ang, diff;
SECTOR_OBJECT* sop = pp->sop;
if (sop->drive_angspeed)
{
pp->cmd.ucmd.avel = float(((pp->cmd.ucmd.avel * sop->drive_angspeed) + (pp->lastcmd.ucmd.avel * (sop->drive_angslide - 1))) / sop->drive_angslide);
}
else
{
pp->cmd.ucmd.avel *= synctics * 0.25f;
}
if (fabs(pp->cmd.ucmd.avel) >= FLT_EPSILON)
{
new_ang = pp->GetActor()->spr.Angles.Yaw + DAngle::fromDeg(pp->cmd.ucmd.avel);
if (sop->limit_ang_center >= nullAngle)
{
diff = deltaangle(sop->limit_ang_center, new_ang);
if (abs(diff) >= sop->limit_ang_delta)
{
if (diff < nullAngle)
new_ang = sop->limit_ang_center - sop->limit_ang_delta;
else
new_ang = sop->limit_ang_center + sop->limit_ang_delta;
}
}
pp->GetActor()->spr.Angles.Yaw = new_ang;
}
OperateSectorObject(pp->sop, pp->GetActor()->spr.Angles.Yaw, pp->sop->pmid);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -2505,7 +2424,7 @@ void DoPlayerMoveVehicle(DSWPlayer* pp)
pp->vect.X = pp->vect.Y = 0; pp->vect.X = pp->vect.Y = 0;
pp->lastcursector = pp->cursector; pp->lastcursector = pp->cursector;
double zz = pp->GetActor()->getOffsetZ() + 10; double zz = plActor->getOffsetZ() + 10;
DVector2 pos[4], opos[4]; DVector2 pos[4], opos[4];
@ -2530,12 +2449,15 @@ void DoPlayerMoveVehicle(DSWPlayer* pp)
} }
auto save_sect = pp->cursector; auto save_sect = pp->cursector;
OperateSectorObject(pp->sop, pp->GetActor()->spr.Angles.Yaw, { MAXSO, MAXSO }); OperateSectorObject(pp->sop, plActor->spr.Angles.Yaw, { MAXSO, MAXSO });
pp->setcursector(pp->sop->op_main_sector); // for speed pp->setcursector(pp->sop->op_main_sector); // for speed
double floordist = abs(zz - pp->sop->floor_loz); double floordist = abs(zz - pp->sop->floor_loz);
setForcedSyncInput(pp->pnum); setForcedSyncInput(pp->pnum);
DoPlayerVehicleInputScaling(pp, &InputPacket::avel, 0.125f);
DoPlayerVehicleInputScaling(pp, &InputPacket::horz, 0.125f);
if (RectClip) if (RectClip)
{ {
HitInfo hit{}; HitInfo hit{};
@ -2543,7 +2465,15 @@ void DoPlayerMoveVehicle(DSWPlayer* pp)
auto save_cstat = plActor->spr.cstat; auto save_cstat = plActor->spr.cstat;
plActor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK); plActor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK);
DoPlayerTurnVehicleRect(pp, pos, opos);
if (pp->cmd.ucmd.avel != 0)
{
auto sum = plActor->spr.Angles.Yaw + DAngle::fromDeg(pp->cmd.ucmd.avel);
if (RectClipTurn(pp, sum, pos, opos))
{
plActor->spr.Angles.Yaw = sum;
}
}
ret = RectClipMove(pp, pos); ret = RectClipMove(pp, pos);
DriveCrush(pp, pos); DriveCrush(pp, pos);
@ -2558,7 +2488,7 @@ void DoPlayerMoveVehicle(DSWPlayer* pp)
DVector3 hitpos((pos[0] + pos[1]) * 0.5, pp->cursector->floorz - 10); DVector3 hitpos((pos[0] + pos[1]) * 0.5, pp->cursector->floorz - 10);
hitscan(hitpos, pp->cursector, hitscan(hitpos, pp->cursector,
DVector3(pp->GetActor()->spr.Angles.Yaw.ToVector() * 16, 0), DVector3(plActor->spr.Angles.Yaw.ToVector() * 16, 0),
hit, CLIPMASK_PLAYER); hit, CLIPMASK_PLAYER);
if ((hit.hitpos.XY() - hitpos.XY()).LengthSquared() < 50 * 50) if ((hit.hitpos.XY() - hitpos.XY()).LengthSquared() < 50 * 50)
@ -2588,14 +2518,21 @@ void DoPlayerMoveVehicle(DSWPlayer* pp)
} }
else else
{ {
DoPlayerTurnVehicle(pp, zz, floordist); if (pp->cmd.ucmd.avel != 0)
{
auto sum = plActor->spr.Angles.Yaw + DAngle::fromDeg(pp->cmd.ucmd.avel);
if (MultiClipTurn(pp, sum, zz, floordist))
{
plActor->spr.Angles.Yaw = sum;
}
}
auto save_cstat = plActor->spr.cstat; auto save_cstat = plActor->spr.cstat;
plActor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK); plActor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK);
if (pp->sop->clipdist) if (pp->sop->clipdist)
{ {
Collision coll; Collision coll;
clipmove(pp->GetActor()->spr.pos.XY(), zz, &pp->cursector, pp->vect, pp->sop->clipdist, 4., floordist, CLIPMASK_PLAYER, actor->user.coll); clipmove(plActor->spr.pos.XY(), zz, &pp->cursector, pp->vect, pp->sop->clipdist, 4., floordist, CLIPMASK_PLAYER, actor->user.coll);
} }
else else
{ {
@ -2624,7 +2561,7 @@ void DoPlayerMoveVehicle(DSWPlayer* pp)
} }
} }
OperateSectorObject(pp->sop, pp->GetActor()->spr.Angles.Yaw, pp->GetActor()->spr.pos.XY()); OperateSectorObject(pp->sop, plActor->spr.Angles.Yaw, plActor->spr.pos.XY());
pp->cursector = save_sect; // for speed pp->cursector = save_sect; // for speed
DoPlayerSlopeTilting(pp); DoPlayerSlopeTilting(pp);
@ -2641,6 +2578,8 @@ void DoPlayerMoveVehicle(DSWPlayer* pp)
void DoPlayerMoveTurret(DSWPlayer* pp) void DoPlayerMoveTurret(DSWPlayer* pp)
{ {
const auto pact = pp->GetActor();
if (!Prediction) if (!Prediction)
{ {
if (pp->cmd.ucmd.avel && !pp->lastcmd.ucmd.avel) if (pp->cmd.ucmd.avel && !pp->lastcmd.ucmd.avel)
@ -2650,7 +2589,31 @@ void DoPlayerMoveTurret(DSWPlayer* pp)
} }
setForcedSyncInput(pp->pnum); setForcedSyncInput(pp->pnum);
DoPlayerTurnTurret(pp);
DoPlayerVehicleInputScaling(pp, &InputPacket::avel, 0.125f);
DoPlayerVehicleInputScaling(pp, &InputPacket::horz, 0.125f);
if (fabs(pp->cmd.ucmd.avel) >= FLT_EPSILON)
{
DAngle new_ang = pact->spr.Angles.Yaw + DAngle::fromDeg(pp->cmd.ucmd.avel);
if (pp->sop->limit_ang_center >= nullAngle)
{
DAngle diff = deltaangle(pp->sop->limit_ang_center, new_ang);
if (abs(diff) >= pp->sop->limit_ang_delta)
{
if (diff < nullAngle)
new_ang = pp->sop->limit_ang_center - pp->sop->limit_ang_delta;
else
new_ang = pp->sop->limit_ang_center + pp->sop->limit_ang_delta;
}
}
pact->spr.Angles.Yaw = new_ang;
}
OperateSectorObject(pp->sop, pact->spr.Angles.Yaw, pp->sop->pmid);
if (PLAYER_MOVING(pp) == 0) if (PLAYER_MOVING(pp) == 0)
pp->Flags &= ~(PF_PLAYER_MOVED); pp->Flags &= ~(PF_PLAYER_MOVED);