- Exhumed: Restore synchronised input, hook up rest of backend input functions and get rid of nPlayerDAng.

This commit is contained in:
Mitchell Richters 2020-09-21 20:37:09 +10:00
parent 5324d9680b
commit d46787cd96
11 changed files with 82 additions and 33 deletions

View file

@ -339,7 +339,6 @@ void GameInterface::Ticker()
} }
else if (EndLevel == 0) else if (EndLevel == 0)
{ {
nPlayerDAng += localInput.q16avel;
inita &= kAngleMask; inita &= kAngleMask;
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
@ -433,17 +432,12 @@ void GameInterface::Ticker()
sPlayerInput[nLocalPlayer].actions = localInput.actions; sPlayerInput[nLocalPlayer].actions = localInput.actions;
if (oldactions & SB_CENTERVIEW) sPlayerInput[nLocalPlayer].actions |= SB_CENTERVIEW; if (oldactions & SB_CENTERVIEW) sPlayerInput[nLocalPlayer].actions |= SB_CENTERVIEW;
if (cl_syncinput) sPlayerInput[nLocalPlayer].nAngle = localInput.q16avel;
{ sPlayerInput[nLocalPlayer].pan = localInput.q16horz;
;// To be completed...
}
Ra[nLocalPlayer].nTarget = besttarget; Ra[nLocalPlayer].nTarget = besttarget;
lLocalCodes = 0; lLocalCodes = 0;
nPlayerDAng = 0;
sPlayerInput[nLocalPlayer].horizon = PlayerList[nLocalPlayer].q16horiz;
leveltime++; leveltime++;
if (leveltime == 2) gameaction = ga_autosave; // let the game run for 1 frame before saving. if (leveltime == 2) gameaction = ga_autosave; // let the game run for 1 frame before saving.

View file

@ -102,8 +102,13 @@ void GameInterface::Render()
DrawClock(); DrawClock();
} }
DrawView(calc_smoothratio()); double const smoothratio = calc_smoothratio();
double const look_anghalf = getHalfLookAng(PlayerList[nLocalPlayer].oq16look_ang, PlayerList[nLocalPlayer].q16look_ang, cl_syncinput, smoothratio);
DrawView(smoothratio);
DrawStatusBar(); DrawStatusBar();
DrawCrosshair(MAXTILES, PlayerList[nLocalPlayer].nHealth >> 3, -look_anghalf, 1);
if (paused && !M_Active()) if (paused && !M_Active())
{ {
auto tex = GStrings("TXTB_PAUSED"); auto tex = GStrings("TXTB_PAUSED");

View file

@ -739,7 +739,7 @@ loc_flag:
// loc_27266: // loc_27266:
case kWeaponSword: case kWeaponSword:
{ {
nHeight += (100 - FixedToInt(sPlayerInput[nPlayer].horizon)) << 6; nHeight += (100 - FixedToInt(PlayerList[nLocalPlayer].q16horiz)) << 6;
theZ += nHeight; theZ += nHeight;
@ -844,7 +844,7 @@ loc_flag:
} }
case kWeaponPistol: case kWeaponPistol:
{ {
int var_50 = (FixedToInt(sPlayerInput[nPlayer].horizon) - 100) << 2; int var_50 = (FixedToInt(PlayerList[nLocalPlayer].q16horiz) - 100) << 2;
nHeight -= var_50; nHeight -= var_50;
if (sPlayerInput[nPlayer].nTarget >= 0 && cl_autoaim) if (sPlayerInput[nPlayer].nTarget >= 0 && cl_autoaim)
@ -859,7 +859,7 @@ loc_flag:
case kWeaponGrenade: case kWeaponGrenade:
{ {
ThrowGrenade(nPlayer, ebp, ebx, nHeight - 2560, FixedToInt(sPlayerInput[nPlayer].horizon) - 100); ThrowGrenade(nPlayer, ebp, ebx, nHeight - 2560, FixedToInt(PlayerList[nLocalPlayer].q16horiz) - 100);
break; break;
} }
case kWeaponStaff: case kWeaponStaff:
@ -985,6 +985,12 @@ void DrawWeapons(double smooth)
nShade = sprite[PlayerList[nLocalPlayer].nSprite].shade; nShade = sprite[PlayerList[nLocalPlayer].nSprite].shade;
} }
double const look_anghalf = getHalfLookAng(PlayerList[nLocalPlayer].oq16look_ang, PlayerList[nLocalPlayer].q16look_ang, cl_syncinput, smooth);
double const looking_arc = fabs(look_anghalf) / 4.5;
xOffset -= look_anghalf;
yOffset += looking_arc;
seq_DrawGunSequence(var_28, PlayerList[nLocalPlayer].field_3FOUR, xOffset, yOffset, nShade, nPal); seq_DrawGunSequence(var_28, PlayerList[nLocalPlayer].field_3FOUR, xOffset, yOffset, nShade, nPal);
if (nWeapon != kWeaponM60) if (nWeapon != kWeaponM60)

View file

@ -196,7 +196,6 @@ void InitLevel(int level) // todo: use a map record
totalmoves = 0; totalmoves = 0;
GrabPalette(); GrabPalette();
ResetMoveFifo(); ResetMoveFifo();
nPlayerDAng = 0;
lPlayerXVel = 0; lPlayerXVel = 0;
lPlayerYVel = 0; lPlayerYVel = 0;
movefifopos = movefifoend; movefifopos = movefifoend;

View file

@ -201,6 +201,7 @@ static void processMovement(ControlInfo* const hidInput)
{ {
applylook(&pPlayer->q16angle, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, tempinput.q16avel, &sPlayerInput[nLocalPlayer].actions, scaleAdjust, false); applylook(&pPlayer->q16angle, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, tempinput.q16avel, &sPlayerInput[nLocalPlayer].actions, scaleAdjust, false);
sethorizon(&pPlayer->q16horiz, tempinput.q16horz, &sPlayerInput[nLocalPlayer].actions, scaleAdjust); sethorizon(&pPlayer->q16horiz, tempinput.q16horz, &sPlayerInput[nLocalPlayer].actions, scaleAdjust);
UpdatePlayerSpriteAngle(pPlayer);
} }
playerProcessHelpers(&pPlayer->q16angle, &pPlayer->angAdjust, &pPlayer->angTarget, &pPlayer->q16horiz, &pPlayer->horizAdjust, &pPlayer->horizTarget, scaleAdjust); playerProcessHelpers(&pPlayer->q16angle, &pPlayer->angAdjust, &pPlayer->angTarget, &pPlayer->q16horiz, &pPlayer->horizAdjust, &pPlayer->horizTarget, scaleAdjust);
@ -220,7 +221,6 @@ void GameInterface::GetInput(InputPacket* packet, ControlInfo* const hidInput)
{ {
lPlayerYVel = 0; lPlayerYVel = 0;
lPlayerXVel = 0; lPlayerXVel = 0;
nPlayerDAng = 0;
return; return;
} }

View file

@ -51,7 +51,6 @@ struct PlayerSave
int lPlayerXVel = 0; int lPlayerXVel = 0;
int lPlayerYVel = 0; int lPlayerYVel = 0;
fixed_t nPlayerDAng = 0;
short obobangle = 0, bobangle = 0; short obobangle = 0, bobangle = 0;
short bPlayerPan = 0; short bPlayerPan = 0;
short bLockPan = 0; short bLockPan = 0;
@ -338,6 +337,10 @@ void RestartPlayer(short nPlayer)
} }
PlayerList[nPlayer].opos = sprite[nSprite].pos; PlayerList[nPlayer].opos = sprite[nSprite].pos;
PlayerList[nPlayer].oq16angle = PlayerList[nPlayer].q16angle;
PlayerList[nPlayer].oq16horiz = PlayerList[nPlayer].q16horiz;
PlayerList[nPlayer].oq16look_ang = PlayerList[nPlayer].q16look_ang = 0;
PlayerList[nPlayer].oq16rotscrnang = PlayerList[nPlayer].q16rotscrnang = 0;
nPlayerFloorSprite[nPlayer] = floorspr; nPlayerFloorSprite[nPlayer] = floorspr;
@ -437,7 +440,7 @@ void RestartPlayer(short nPlayer)
nYDamage[nPlayer] = 0; nYDamage[nPlayer] = 0;
nXDamage[nPlayer] = 0; nXDamage[nPlayer] = 0;
PlayerList[nPlayer].q16horiz = IntToFixed(100); PlayerList[nPlayer].oq16horiz = PlayerList[nPlayer].q16horiz = IntToFixed(100);
nBreathTimer[nPlayer] = 90; nBreathTimer[nPlayer] = 90;
nTauntTimer[nPlayer] = RandomSize(3) + 3; nTauntTimer[nPlayer] = RandomSize(3) + 3;
@ -454,7 +457,6 @@ void RestartPlayer(short nPlayer)
if (nPlayer == nLocalPlayer) if (nPlayer == nLocalPlayer)
{ {
nLocalSpr = nSprite; nLocalSpr = nSprite;
nPlayerDAng = 0;
SetMagicFrame(); SetMagicFrame();
RestoreGreenPal(); RestoreGreenPal();
@ -538,7 +540,7 @@ void StartDeathSeq(int nPlayer, int nVal)
StopFiringWeapon(nPlayer); StopFiringWeapon(nPlayer);
PlayerList[nPlayer].q16horiz = IntToFixed(100); PlayerList[nPlayer].oq16horiz = PlayerList[nPlayer].q16horiz = IntToFixed(100);
oeyelevel[nPlayer] = eyelevel[nPlayer] = -14080; oeyelevel[nPlayer] = eyelevel[nPlayer] = -14080;
nPlayerInvisible[nPlayer] = 0; nPlayerInvisible[nPlayer] = 0;
dVertPan[nPlayer] = 15; dVertPan[nPlayer] = 15;
@ -703,6 +705,11 @@ static void pickupMessage(int no)
} }
} }
void UpdatePlayerSpriteAngle(Player* pPlayer)
{
sprite[pPlayer->nSprite].ang = FixedToInt(pPlayer->q16angle);
}
void FuncPlayer(int a, int nDamage, int nRun) void FuncPlayer(int a, int nDamage, int nRun)
{ {
int var_48 = 0; int var_48 = 0;
@ -724,6 +731,10 @@ void FuncPlayer(int a, int nDamage, int nRun)
short nSprite2; short nSprite2;
PlayerList[nPlayer].opos = sprite[nPlayerSprite].pos; PlayerList[nPlayer].opos = sprite[nPlayerSprite].pos;
PlayerList[nPlayer].oq16angle = PlayerList[nPlayer].q16angle;
PlayerList[nPlayer].oq16horiz = PlayerList[nPlayer].q16horiz;
PlayerList[nPlayer].oq16look_ang = PlayerList[nPlayer].q16look_ang;
PlayerList[nPlayer].oq16rotscrnang = PlayerList[nPlayer].q16rotscrnang;
oeyelevel[nPlayer] = eyelevel[nPlayer]; oeyelevel[nPlayer] = eyelevel[nPlayer];
switch (nMessage) switch (nMessage)
@ -937,7 +948,12 @@ void FuncPlayer(int a, int nDamage, int nRun)
} }
// loc_1A494: // loc_1A494:
sprite[nPlayerSprite].ang = FixedToInt(PlayerList[nPlayer].q16angle); if (cl_syncinput)
{
Player* pPlayer = &PlayerList[nPlayer];
applylook(&pPlayer->q16angle, &pPlayer->q16look_ang, &pPlayer->q16rotscrnang, &pPlayer->spin, sPlayerInput[nPlayer].nAngle, &sPlayerInput[nLocalPlayer].actions, 1, false);
UpdatePlayerSpriteAngle(pPlayer);
}
// sprite[nPlayerSprite].zvel is modified within Gravity() // sprite[nPlayerSprite].zvel is modified within Gravity()
short zVel = sprite[nPlayerSprite].zvel; short zVel = sprite[nPlayerSprite].zvel;
@ -1034,9 +1050,11 @@ void FuncPlayer(int a, int nDamage, int nRun)
{ {
auto ang = GetAngleToSprite(nPlayerSprite, nSpiritSprite) & kAngleMask; auto ang = GetAngleToSprite(nPlayerSprite, nSpiritSprite) & kAngleMask;
playerSetAngle(&PlayerList[nPlayer].q16angle, &PlayerList[nPlayer].angTarget, ang); playerSetAngle(&PlayerList[nPlayer].q16angle, &PlayerList[nPlayer].angTarget, ang);
PlayerList[nPlayer].oq16angle = PlayerList[nPlayer].q16angle;
sprite[nPlayerSprite].ang = ang; sprite[nPlayerSprite].ang = ang;
playerSetHoriz(&PlayerList[nPlayer].q16horiz, &PlayerList[nPlayer].horizTarget, 100); playerSetHoriz(&PlayerList[nPlayer].q16horiz, &PlayerList[nPlayer].horizTarget, 100);
PlayerList[nPlayer].oq16horiz = PlayerList[nPlayer].q16horiz;
lPlayerXVel = 0; lPlayerXVel = 0;
lPlayerYVel = 0; lPlayerYVel = 0;
@ -1045,8 +1063,6 @@ void FuncPlayer(int a, int nDamage, int nRun)
sprite[nPlayerSprite].yvel = 0; sprite[nPlayerSprite].yvel = 0;
sprite[nPlayerSprite].zvel = 0; sprite[nPlayerSprite].zvel = 0;
nPlayerDAng = 0;
if (nFreeze < 1) if (nFreeze < 1)
{ {
nFreeze = 1; nFreeze = 1;
@ -1190,11 +1206,6 @@ void FuncPlayer(int a, int nDamage, int nRun)
} }
loc_1AB8E: loc_1AB8E:
if (cl_syncinput)
{
;// To be completed.
}
playerX -= sprite[nPlayerSprite].x; playerX -= sprite[nPlayerSprite].x;
playerY -= sprite[nPlayerSprite].y; playerY -= sprite[nPlayerSprite].y;
@ -2663,6 +2674,12 @@ loc_1BD2E:
PlayerList[nPlayer].nAction = nActionB; PlayerList[nPlayer].nAction = nActionB;
PlayerList[nPlayer].field_2 = 0; PlayerList[nPlayer].field_2 = 0;
} }
if (cl_syncinput)
{
Player* pPlayer = &PlayerList[nPlayer];
sethorizon(&pPlayer->q16horiz, sPlayerInput[nPlayer].pan, &sPlayerInput[nLocalPlayer].actions, 1);
}
} }
else // else, player's health is less than 0 else // else, player's health is less than 0
{ {
@ -2833,7 +2850,6 @@ loc_1BD2E:
static SavegameHelper sgh("player", static SavegameHelper sgh("player",
SV(lPlayerXVel), SV(lPlayerXVel),
SV(lPlayerYVel), SV(lPlayerYVel),
SV(nPlayerDAng),
SV(obobangle), SV(obobangle),
SV(bobangle), SV(bobangle),
SV(bPlayerPan), SV(bPlayerPan),

View file

@ -43,7 +43,6 @@ extern int nLocalPlayer;
extern int lPlayerXVel; extern int lPlayerXVel;
extern int lPlayerYVel; extern int lPlayerYVel;
extern fixed_t nPlayerDAng;
struct Player struct Player
{ {
@ -127,6 +126,7 @@ short GetPlayerFromSprite(short nSprite);
void SetPlayerMummified(int nPlayer, int bIsMummified); void SetPlayerMummified(int nPlayer, int bIsMummified);
int AddAmmo(int nPlayer, int nWeapon, int nAmmoAmount); int AddAmmo(int nPlayer, int nWeapon, int nAmmoAmount);
void ShootStaff(int nPlayer); void ShootStaff(int nPlayer);
void UpdatePlayerSpriteAngle(Player* pPlayer);
END_PS_NS END_PS_NS

View file

@ -38,7 +38,8 @@ struct PlayerInput
int yVel; int yVel;
uint16_t buttons; uint16_t buttons;
short nTarget; short nTarget;
fixed_t horizon; fixed_t nAngle;
fixed_t pan;
int8_t nItem; int8_t nItem;
ESyncBits actions; ESyncBits actions;

View file

@ -376,7 +376,7 @@ void seq_DrawPilotLightSeq(double xOffset, double yOffset)
double x = ChunkXpos[nFrameBase] + (160 + xOffset); double x = ChunkXpos[nFrameBase] + (160 + xOffset);
double y = ChunkYpos[nFrameBase] + (100 + yOffset); double y = ChunkYpos[nFrameBase] + (100 + yOffset);
hud_drawsprite(x, y, 65536, fmod(-2 * FixedToFloat(nPlayerDAng), kAngleMask + 1), nTile, 0, 0, 1); hud_drawsprite(x, y, 65536, fmod(-2 * FixedToFloat(PlayerList[nLocalPlayer].q16angle), kAngleMask + 1), nTile, 0, 0, 1);
nFrameBase++; nFrameBase++;
} }
} }

View file

@ -1002,7 +1002,6 @@ void DrawStatusBar()
} }
DExhumedStatusBar sbar; DExhumedStatusBar sbar;
sbar.Draw(); sbar.Draw();
DrawCrosshair(MAXTILES, PlayerList[nLocalPlayer].nHealth >> 3, 0, 1);
} }

View file

@ -237,6 +237,9 @@ void DrawView(double smoothRatio, bool sceneonly)
short nSector; short nSector;
fixed_t nAngle; fixed_t nAngle;
fixed_t pan; fixed_t pan;
fixed_t q16rotscrnang;
fixed_t dang = IntToFixed(1024);
zbob = Sin(2 * bobangle) >> 3; zbob = Sin(2 * bobangle) >> 3;
@ -276,13 +279,32 @@ void DrawView(double smoothRatio, bool sceneonly)
+ interpolate16(oeyelevel[nLocalPlayer], eyelevel[nLocalPlayer], smoothRatio); + interpolate16(oeyelevel[nLocalPlayer], eyelevel[nLocalPlayer], smoothRatio);
nSector = nPlayerViewSect[nLocalPlayer]; nSector = nPlayerViewSect[nLocalPlayer];
updatesector(playerX, playerY, &nSector); updatesector(playerX, playerY, &nSector);
nAngle = PlayerList[nLocalPlayer].q16angle;
if (!cl_syncinput)
{
nAngle = PlayerList[nLocalPlayer].q16angle + PlayerList[nLocalPlayer].q16look_ang;
q16rotscrnang = PlayerList[nLocalPlayer].q16rotscrnang;
}
else
{
fixed_t oang, ang;
oang = PlayerList[nLocalPlayer].oq16angle + PlayerList[nLocalPlayer].oq16look_ang;
ang = PlayerList[nLocalPlayer].q16angle + PlayerList[nLocalPlayer].q16look_ang;
nAngle = oang + xs_CRoundToInt(fmulscale16(((ang + dang - oang) & 0x7FFFFFF) - dang, smoothRatio));
oang = PlayerList[nLocalPlayer].oq16rotscrnang + PlayerList[nLocalPlayer].oq16rotscrnang;
ang = PlayerList[nLocalPlayer].q16rotscrnang + PlayerList[nLocalPlayer].q16rotscrnang;
q16rotscrnang = oang + xs_CRoundToInt(fmulscale16(((ang + dang - oang) & 0x7FFFFFF) - dang, smoothRatio));
}
if (!bCamera) if (!bCamera)
{ {
sprite[nPlayerSprite].cstat |= CSTAT_SPRITE_INVISIBLE; sprite[nPlayerSprite].cstat |= CSTAT_SPRITE_INVISIBLE;
sprite[nDoppleSprite[nLocalPlayer]].cstat |= CSTAT_SPRITE_INVISIBLE; sprite[nDoppleSprite[nLocalPlayer]].cstat |= CSTAT_SPRITE_INVISIBLE;
} }
renderSetRollAngle(FixedToFloat(q16rotscrnang));
} }
nCameraa = nAngle; nCameraa = nAngle;
@ -299,7 +321,14 @@ void DrawView(double smoothRatio, bool sceneonly)
viewz = playerZ + nQuake[nLocalPlayer]; viewz = playerZ + nQuake[nLocalPlayer];
int floorZ = sector[sprite[nPlayerSprite].sectnum].floorz; int floorZ = sector[sprite[nPlayerSprite].sectnum].floorz;
pan = PlayerList[nLocalPlayer].q16horiz; if (!cl_syncinput)
{
pan = PlayerList[nLocalPlayer].q16horiz;
}
else
{
pan = PlayerList[nLocalPlayer].oq16horiz + xs_CRoundToInt(fmulscale16(PlayerList[nLocalPlayer].q16horiz - PlayerList[nLocalPlayer].oq16horiz, smoothRatio));
}
if (viewz > floorZ) if (viewz > floorZ)
viewz = floorZ; viewz = floorZ;