SW: Modify DoPlayerTurn/DoPlayerHorizon to make it possible

for them to modify the player's camq16ang/camq16horiz field
instead of q16ang/q16horiz. Additionally, pass to them the
change in angle/horiz via a parameter, as an alternative
to direct access to the corresponding player input field.
This commit is contained in:
NY00123 2020-04-11 00:06:59 +03:00 committed by Christoph Oelckers
parent 1f9e319d39
commit de0ed067f5

View file

@ -1536,10 +1536,8 @@ DoPlayerCrawlHeight(PLAYERp pp)
} }
void void
DoPlayerTurn(PLAYERp pp) DoPlayerTurn(PLAYERp pp, fix16_t *pq16ang, fix16_t q16avel)
{ {
fix16_t q16avel;
#define TURN_SHIFT 2 #define TURN_SHIFT 2
if (!TEST(pp->Flags, PF_TURN_180)) if (!TEST(pp->Flags, PF_TURN_180))
@ -1552,12 +1550,12 @@ DoPlayerTurn(PLAYERp pp)
FLAG_KEY_RELEASE(pp, SK_TURN_180); FLAG_KEY_RELEASE(pp, SK_TURN_180);
pp->turn180_target = NORM_ANGLE(fix16_to_int(pp->q16ang) + 1024); pp->turn180_target = NORM_ANGLE(fix16_to_int(*pq16ang) + 1024);
// make the first turn in the clockwise direction // make the first turn in the clockwise direction
// the rest will follow // the rest will follow
delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(pp->q16ang)); delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(*pq16ang));
pp->q16ang = fix16_from_int(NORM_ANGLE(fix16_to_int(pp->q16ang) + (labs(delta_ang) >> TURN_SHIFT))); *pq16ang = fix16_from_int(NORM_ANGLE(fix16_to_int(*pq16ang) + (labs(delta_ang) >> TURN_SHIFT)));
SET(pp->Flags, PF_TURN_180); SET(pp->Flags, PF_TURN_180);
} }
@ -1572,49 +1570,49 @@ DoPlayerTurn(PLAYERp pp)
{ {
short delta_ang; short delta_ang;
delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(pp->q16ang)); delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(*pq16ang));
pp->q16ang = fix16_from_int(NORM_ANGLE(fix16_to_int(pp->q16ang) + (delta_ang >> TURN_SHIFT))); *pq16ang = fix16_from_int(NORM_ANGLE(fix16_to_int(*pq16ang) + (delta_ang >> TURN_SHIFT)));
sprite[pp->PlayerSprite].ang = fix16_to_int(pp->q16ang); sprite[pp->PlayerSprite].ang = fix16_to_int(*pq16ang);
if (!Prediction) if (!Prediction)
{ {
if (pp->PlayerUnderSprite >= 0) if (pp->PlayerUnderSprite >= 0)
sprite[pp->PlayerUnderSprite].ang = fix16_to_int(pp->q16ang); sprite[pp->PlayerUnderSprite].ang = fix16_to_int(*pq16ang);
} }
// get new delta to see how close we are // get new delta to see how close we are
delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(pp->q16ang)); delta_ang = GetDeltaAngle(pp->turn180_target, fix16_to_int(*pq16ang));
if (labs(delta_ang) < (3<<TURN_SHIFT)) if (labs(delta_ang) < (3<<TURN_SHIFT))
{ {
pp->q16ang = fix16_from_int(pp->turn180_target); *pq16ang = fix16_from_int(pp->turn180_target);
RESET(pp->Flags, PF_TURN_180); RESET(pp->Flags, PF_TURN_180);
} }
else else
return; return;
} }
q16avel = fix16_smul(pp->input.q16avel, fix16_from_int(PLAYER_TURN_SCALE)); q16avel = fix16_smul(q16avel, fix16_from_int(PLAYER_TURN_SCALE));
if (q16avel != 0) if (q16avel != 0)
{ {
// running is not handled here now // running is not handled here now
q16avel += fix16_sdiv(q16avel, fix16_from_int(4)); q16avel += fix16_sdiv(q16avel, fix16_from_int(4));
pp->q16ang += fix16_sdiv(fix16_mul(q16avel, fix16_from_int(synctics)), fix16_from_int(32)); *pq16ang += fix16_sdiv(fix16_mul(q16avel, fix16_from_int(synctics)), fix16_from_int(32));
pp->q16ang = NORM_Q16ANGLE(pp->q16ang); *pq16ang = NORM_Q16ANGLE(*pq16ang);
if (PEDANTIC_MODE) if (PEDANTIC_MODE)
pp->q16ang = fix16_floor(pp->q16ang); *pq16ang = fix16_floor(*pq16ang);
// update players sprite angle // update players sprite angle
// NOTE: It's also updated in UpdatePlayerSprite, but needs to be // NOTE: It's also updated in UpdatePlayerSprite, but needs to be
// here to cover // here to cover
// all cases. // all cases.
sprite[pp->PlayerSprite].ang = fix16_to_int(pp->q16ang); sprite[pp->PlayerSprite].ang = fix16_to_int(*pq16ang);
if (!Prediction) if (!Prediction)
{ {
if (pp->PlayerUnderSprite >= 0) if (pp->PlayerUnderSprite >= 0)
sprite[pp->PlayerUnderSprite].ang = fix16_to_int(pp->q16ang); sprite[pp->PlayerUnderSprite].ang = fix16_to_int(*pq16ang);
} }
} }
@ -1855,7 +1853,7 @@ PlayerAutoLook(PLAYERp pp)
extern int PlaxCeilGlobZadjust, PlaxFloorGlobZadjust; extern int PlaxCeilGlobZadjust, PlaxFloorGlobZadjust;
void void
DoPlayerHorizon(PLAYERp pp) DoPlayerHorizon(PLAYERp pp, fix16_t *pq16horiz, fix16_t q16horz)
{ {
int i; int i;
#define HORIZ_SPEED (16) #define HORIZ_SPEED (16)
@ -1867,15 +1865,15 @@ DoPlayerHorizon(PLAYERp pp)
if (cl_slopetilting) if (cl_slopetilting)
PlayerAutoLook(pp); PlayerAutoLook(pp);
if (pp->input.q16horz) if (q16horz)
{ {
pp->q16horizbase += pp->input.q16horz; pp->q16horizbase += q16horz;
SET(pp->Flags, PF_LOCK_HORIZ | PF_LOOKING); SET(pp->Flags, PF_LOCK_HORIZ | PF_LOOKING);
} }
if (TEST_SYNC_KEY(pp, SK_CENTER_VIEW)) if (TEST_SYNC_KEY(pp, SK_CENTER_VIEW))
{ {
pp->q16horiz = pp->q16horizbase = fix16_from_int(100); *pq16horiz = pp->q16horizbase = fix16_from_int(100);
pp->q16horizoff = 0; pp->q16horizoff = 0;
} }
@ -1885,11 +1883,11 @@ DoPlayerHorizon(PLAYERp pp)
// set looking because player is manually looking // set looking because player is manually looking
SET(pp->Flags, PF_LOCK_HORIZ | PF_LOOKING); SET(pp->Flags, PF_LOCK_HORIZ | PF_LOOKING);
// adjust pp->q16horiz negative // adjust *pq16horiz negative
if (TEST_SYNC_KEY(pp, SK_SNAP_DOWN)) if (TEST_SYNC_KEY(pp, SK_SNAP_DOWN))
pp->q16horizbase -= fix16_from_int((HORIZ_SPEED/2)); pp->q16horizbase -= fix16_from_int((HORIZ_SPEED/2));
// adjust pp->q16horiz positive // adjust *pq16horiz positive
if (TEST_SYNC_KEY(pp, SK_SNAP_UP)) if (TEST_SYNC_KEY(pp, SK_SNAP_UP))
pp->q16horizbase += fix16_from_int((HORIZ_SPEED/2)); pp->q16horizbase += fix16_from_int((HORIZ_SPEED/2));
} }
@ -1901,11 +1899,11 @@ DoPlayerHorizon(PLAYERp pp)
RESET(pp->Flags, PF_LOCK_HORIZ); RESET(pp->Flags, PF_LOCK_HORIZ);
SET(pp->Flags, PF_LOOKING); SET(pp->Flags, PF_LOOKING);
// adjust pp->q16horiz negative // adjust *pq16horiz negative
if (TEST_SYNC_KEY(pp, SK_LOOK_DOWN)) if (TEST_SYNC_KEY(pp, SK_LOOK_DOWN))
pp->q16horizbase -= fix16_from_int(HORIZ_SPEED); pp->q16horizbase -= fix16_from_int(HORIZ_SPEED);
// adjust pp->q16horiz positive // adjust *pq16horiz positive
if (TEST_SYNC_KEY(pp, SK_LOOK_UP)) if (TEST_SYNC_KEY(pp, SK_LOOK_UP))
pp->q16horizbase += fix16_from_int(HORIZ_SPEED); pp->q16horizbase += fix16_from_int(HORIZ_SPEED);
} }
@ -1915,20 +1913,20 @@ DoPlayerHorizon(PLAYERp pp)
{ {
if (!(TEST_SYNC_KEY(pp, SK_LOOK_UP) || TEST_SYNC_KEY(pp, SK_LOOK_DOWN))) if (!(TEST_SYNC_KEY(pp, SK_LOOK_UP) || TEST_SYNC_KEY(pp, SK_LOOK_DOWN)))
{ {
// not pressing the pp->q16horiz keys // not pressing the *pq16horiz keys
if (pp->q16horizbase != fix16_from_int(100)) if (pp->q16horizbase != fix16_from_int(100))
{ {
// move pp->q16horiz back to 100 // move *pq16horiz back to 100
for (i = 1; i; i--) for (i = 1; i; i--)
{ {
// this formula does not work for pp->q16horiz = 101-103 // this formula does not work for *pq16horiz = 101-103
pp->q16horizbase += fix16_from_int(25 - (fix16_to_int(pp->q16horizbase) >> 2)); pp->q16horizbase += fix16_from_int(25 - (fix16_to_int(pp->q16horizbase) >> 2));
} }
} }
else else
{ {
// not looking anymore because pp->q16horiz is back at 100 // not looking anymore because *pq16horiz is back at 100
RESET(pp->Flags, PF_LOOKING); RESET(pp->Flags, PF_LOOKING);
} }
} }
@ -1949,14 +1947,14 @@ DoPlayerHorizon(PLAYERp pp)
//MONO_PRINT(ds); //MONO_PRINT(ds);
// add base and offsets // add base and offsets
pp->q16horiz = pp->q16horizbase + pp->q16horizoff; *pq16horiz = pp->q16horizbase + pp->q16horizoff;
#else #else
if (pp->q16horizbase + pp->q16horizoff < fix16_from_int(PLAYER_HORIZ_MIN)) if (pp->q16horizbase + pp->q16horizoff < fix16_from_int(PLAYER_HORIZ_MIN))
pp->q16horizbase += fix16_from_int(HORIZ_SPEED); pp->q16horizbase += fix16_from_int(HORIZ_SPEED);
else if (pp->q16horizbase + pp->q16horizoff > fix16_from_int(PLAYER_HORIZ_MAX)) else if (pp->q16horizbase + pp->q16horizoff > fix16_from_int(PLAYER_HORIZ_MAX))
pp->q16horizbase -= HORIZ_SPEED; pp->q16horizbase -= HORIZ_SPEED;
pp->q16horiz = pp->q16horizbase + pp->q16horizoff; *pq16horiz = pp->q16horizbase + pp->q16horizoff;
#endif #endif
} }
@ -2543,7 +2541,7 @@ DoPlayerMove(PLAYERp pp)
SlipSlope(pp); SlipSlope(pp);
DoPlayerTurn(pp); DoPlayerTurn(pp, &pp->q16ang, pp->input.q16avel);
pp->oldposx = pp->posx; pp->oldposx = pp->posx;
pp->oldposy = pp->posy; pp->oldposy = pp->posy;
@ -2647,7 +2645,7 @@ DoPlayerMove(PLAYERp pp)
DoPlayerSetWadeDepth(pp); DoPlayerSetWadeDepth(pp);
DoPlayerHorizon(pp); DoPlayerHorizon(pp, &pp->q16horiz, pp->input.q16horz);
if (pp->cursectnum >= 0 && TEST(sector[pp->cursectnum].extra, SECTFX_DYNAMIC_AREA)) if (pp->cursectnum >= 0 && TEST(sector[pp->cursectnum].extra, SECTFX_DYNAMIC_AREA))
{ {
@ -2855,7 +2853,7 @@ DoPlayerMoveBoat(PLAYERp pp)
OperateSectorObject(pp->sop, fix16_to_int(pp->q16ang), pp->posx, pp->posy); OperateSectorObject(pp->sop, fix16_to_int(pp->q16ang), pp->posx, pp->posy);
pp->cursectnum = save_sectnum; // for speed pp->cursectnum = save_sectnum; // for speed
DoPlayerHorizon(pp); DoPlayerHorizon(pp, &pp->q16horiz, pp->input.q16horz);
} }
#if 0 #if 0
@ -3366,7 +3364,7 @@ DoPlayerMoveTank(PLAYERp pp)
OperateSectorObject(pp->sop, fix16_to_int(pp->q16ang), pp->posx, pp->posy); OperateSectorObject(pp->sop, fix16_to_int(pp->q16ang), pp->posx, pp->posy);
pp->cursectnum = save_sectnum; // for speed pp->cursectnum = save_sectnum; // for speed
DoPlayerHorizon(pp); DoPlayerHorizon(pp, &pp->q16horiz, pp->input.q16horz);
DoTankTreads(pp); DoTankTreads(pp);
} }
@ -3383,7 +3381,7 @@ DoPlayerMoveTurret(PLAYERp pp)
OperateSectorObject(pp->sop, fix16_to_int(pp->q16ang), pp->sop->xmid, pp->sop->ymid); OperateSectorObject(pp->sop, fix16_to_int(pp->q16ang), pp->sop->xmid, pp->sop->ymid);
DoPlayerHorizon(pp); DoPlayerHorizon(pp, &pp->q16horiz, pp->input.q16horz);
} }
void void
@ -3959,7 +3957,7 @@ DoPlayerClimb(PLAYERp pp)
sp->z = pp->posz + PLAYER_HEIGHT; sp->z = pp->posz + PLAYER_HEIGHT;
changespritesect(pp->PlayerSprite, pp->cursectnum); changespritesect(pp->PlayerSprite, pp->cursectnum);
DoPlayerHorizon(pp); DoPlayerHorizon(pp, &pp->q16horiz, pp->input.q16horz);
if (FAF_ConnectArea(pp->cursectnum)) if (FAF_ConnectArea(pp->cursectnum))
{ {
@ -6689,7 +6687,7 @@ void DoPlayerDeathFollowKiller(PLAYERp pp)
// allow turning // allow turning
if ((TEST(pp->Flags, PF_DEAD_HEAD) && pp->input.q16avel != 0) || TEST(pp->Flags, PF_HEAD_CONTROL)) if ((TEST(pp->Flags, PF_DEAD_HEAD) && pp->input.q16avel != 0) || TEST(pp->Flags, PF_HEAD_CONTROL))
{ {
DoPlayerTurn(pp); DoPlayerTurn(pp, &pp->q16ang, pp->input.q16avel);
return; return;
} }