From 4b299fa41293d01ce70d37310b236cfc1a6a18a1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 27 Aug 2020 00:58:21 +0200 Subject: [PATCH] - Exhumed also handled. --- source/core/packet.h | 3 - source/exhumed/src/exhumed.cpp | 7 +- source/exhumed/src/gameloop.cpp | 2 +- source/exhumed/src/input.cpp | 221 ++++++++++++++++++++++++++++++- source/exhumed/src/player.cpp | 222 +------------------------------- source/exhumed/src/player.h | 2 +- source/exhumed/src/ps_input.h | 12 ++ 7 files changed, 239 insertions(+), 230 deletions(-) diff --git a/source/core/packet.h b/source/core/packet.h index 431434c6b..0ffbc6fb1 100644 --- a/source/core/packet.h +++ b/source/core/packet.h @@ -158,9 +158,6 @@ enum { kButtonCheatGodMode = 0x40, kButtonCheatKeys = 0x80, kButtonCheatItems = 0x100, - - kButtonWeaponShift = 13, - kButtonWeaponBits = 7 << kButtonWeaponShift, // upper 3 bits. }; diff --git a/source/exhumed/src/exhumed.cpp b/source/exhumed/src/exhumed.cpp index 9881842b1..12c09a06b 100644 --- a/source/exhumed/src/exhumed.cpp +++ b/source/exhumed/src/exhumed.cpp @@ -483,7 +483,7 @@ void GameTicker() lastTic = currentTic; int lLocalButtons = GetLocalInput(); // shouldn't this be placed in localInput? - PlayerInterruptKeys(); + PlayerInterruptKeys(false); nPlayerDAng = fix16_sadd(nPlayerDAng, localInput.q16avel); inita &= kAngleMask; @@ -500,8 +500,11 @@ void GameTicker() sPlayerInput[nLocalPlayer].xVel = lPlayerXVel; sPlayerInput[nLocalPlayer].yVel = lPlayerYVel; // make weapon selection persist until it gets used up. - if ((lLocalButtons & kButtonWeaponBits) == 0) lLocalButtons |= sPlayerInput[nLocalPlayer].buttons & kButtonWeaponBits; sPlayerInput[nLocalPlayer].buttons = lLocalButtons | lLocalCodes; + int weap = sPlayerInput[nLocalPlayer].getNewWeapon(); + sPlayerInput[nLocalPlayer].actions = localInput.actions; + int weap2 = localInput.getNewWeapon(); + if (weap2 <= 0 || weap2 > 7) sPlayerInput[nLocalPlayer].SetNewWeapon(weap); sPlayerInput[nLocalPlayer].nTarget = besttarget; Ra[nLocalPlayer].nTarget = besttarget; diff --git a/source/exhumed/src/gameloop.cpp b/source/exhumed/src/gameloop.cpp index 1668218d0..087969cbd 100644 --- a/source/exhumed/src/gameloop.cpp +++ b/source/exhumed/src/gameloop.cpp @@ -257,7 +257,7 @@ void GameLoop() { CheckKeys(); GameTicker(); - PlayerInterruptKeys(); + PlayerInterruptKeys(true); UpdateSounds(); CheckKeys2(); } diff --git a/source/exhumed/src/input.cpp b/source/exhumed/src/input.cpp index f51c828dd..eb1d6fff9 100644 --- a/source/exhumed/src/input.cpp +++ b/source/exhumed/src/input.cpp @@ -28,7 +28,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_PS_NS +extern short bPlayerPan; +extern short bLockPan; + int WeaponToSend, BitsToSend; +bool g_MyAimMode; short nInputStack = 0; @@ -82,8 +86,6 @@ int GetLocalInput() { lLocalButtons = (buttonMap.ButtonDown(gamefunc_Crouch) << 4) | (buttonMap.ButtonDown(gamefunc_Fire) << 3) | (buttonMap.ButtonDown(gamefunc_Jump) << 0); - lLocalButtons |= (WeaponToSend << 13); - WeaponToSend = 0; } else { @@ -156,6 +158,221 @@ void CheckKeys2() } +void PlayerInterruptKeys(bool after) +{ + ControlInfo info; + memset(&info, 0, sizeof(ControlInfo)); // this is done within CONTROL_GetInput() anyway + CONTROL_GetInput(&info); + + static double lastInputTicks; + auto const currentHiTicks = I_msTimeF(); + double const elapsedInputTicks = currentHiTicks - lastInputTicks; + + lastInputTicks = currentHiTicks; + + auto scaleAdjustmentToInterval = [=](double x) { return x * (120 / 4) / (1000.0 / elapsedInputTicks); }; + + if (paused) + return; + + localInput = {}; + InputPacket input{}; + fix16_t input_angle = 0; + + if (PlayerList[nLocalPlayer].nHealth == 0) + { + lPlayerYVel = 0; + lPlayerXVel = 0; + nPlayerDAng = 0; + return; + } + + // JBF: Run key behaviour is selectable + int const playerRunning = G_CheckAutorun(buttonMap.ButtonDown(gamefunc_Run)); + int const turnAmount = playerRunning ? 12 : 8; + int const keyMove = playerRunning ? 12 : 6; + + if (buttonMap.ButtonDown(gamefunc_Strafe)) + { + input.svel -= info.mousex * 4.f; + input.svel -= info.dyaw * keyMove; + } + else + { + input_angle = fix16_sadd(input_angle, fix16_from_float(info.mousex)); + input_angle = fix16_sadd(input_angle, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw))); + } + + g_MyAimMode = in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming); + + if (g_MyAimMode) + input.q16horz = fix16_sadd(input.q16horz, fix16_from_float(info.mousey)); + else + input.fvel -= info.mousey * 8.f; + + if (!in_mouseflip) input.q16horz = -input.q16horz; + + input.q16horz = fix16_ssub(input.q16horz, fix16_from_dbl(scaleAdjustmentToInterval(info.dpitch))); + input.svel -= info.dx * keyMove; + input.fvel -= info.dz * keyMove; + + if (buttonMap.ButtonDown(gamefunc_Strafe)) + { + if (buttonMap.ButtonDown(gamefunc_Turn_Left)) + input.svel -= -keyMove; + + if (buttonMap.ButtonDown(gamefunc_Turn_Right)) + input.svel -= keyMove; + } + else + { + static int turn = 0; + static int counter = 0; + // normal, non strafing movement + if (buttonMap.ButtonDown(gamefunc_Turn_Left)) + { + turn -= 2; + + if (turn < -turnAmount) + turn = -turnAmount; + } + else if (buttonMap.ButtonDown(gamefunc_Turn_Right)) + { + turn += 2; + + if (turn > turnAmount) + turn = turnAmount; + } + + if (turn < 0) + { + turn++; + if (turn > 0) + turn = 0; + } + + if (turn > 0) + { + turn--; + if (turn < 0) + turn = 0; + } + + //if ((counter++) % 4 == 0) // what was this for??? + input_angle = fix16_sadd(input_angle, fix16_from_dbl(scaleAdjustmentToInterval(turn * 2))); + + } + + if (buttonMap.ButtonDown(gamefunc_Strafe_Left)) + input.svel += keyMove; + + if (buttonMap.ButtonDown(gamefunc_Strafe_Right)) + input.svel += -keyMove; + + if (buttonMap.ButtonDown(gamefunc_Move_Forward)) + input.fvel += keyMove; + + if (buttonMap.ButtonDown(gamefunc_Move_Backward)) + input.fvel += -keyMove; + + localInput.fvel = clamp(localInput.fvel + input.fvel, -12, 12); + localInput.svel = clamp(localInput.svel + input.svel, -12, 12); + + localInput.q16avel = fix16_sadd(localInput.q16avel, input_angle); + + if (!after) + { + if (WeaponToSend > 0) + localInput.SetNewWeapon(WeaponToSend); + WeaponToSend = 0; + } + + if (!nFreeze) + { + PlayerList[nLocalPlayer].q16angle = fix16_sadd(PlayerList[nLocalPlayer].q16angle, input_angle) & 0x7FFFFFF; + + // A horiz diff of 128 equal 45 degrees, + // so we convert horiz to 1024 angle units + + float const horizAngle = clamp(atan2f(PlayerList[nLocalPlayer].q16horiz - fix16_from_int(92), fix16_from_int(128)) * (512.f / fPI) + fix16_to_float(input.q16horz), -255.f, 255.f); + PlayerList[nLocalPlayer].q16horiz = fix16_from_int(92) + Blrintf(fix16_from_int(128) * tanf(horizAngle * (fPI / 512.f))); + + // Look/aim up/down functions. + if (buttonMap.ButtonDown(gamefunc_Look_Up) || buttonMap.ButtonDown(gamefunc_Aim_Up)) + { + bLockPan = false; + if (PlayerList[nLocalPlayer].q16horiz < fix16_from_int(180)) { + PlayerList[nLocalPlayer].q16horiz = fix16_sadd(PlayerList[nLocalPlayer].q16horiz, fix16_from_dbl(scaleAdjustmentToInterval(4))); + } + + bPlayerPan = true; + nDestVertPan[nLocalPlayer] = PlayerList[nLocalPlayer].q16horiz; + } + else if (buttonMap.ButtonDown(gamefunc_Look_Down) || buttonMap.ButtonDown(gamefunc_Aim_Down)) + { + bLockPan = false; + if (PlayerList[nLocalPlayer].q16horiz > fix16_from_int(4)) { + PlayerList[nLocalPlayer].q16horiz = fix16_ssub(PlayerList[nLocalPlayer].q16horiz, fix16_from_dbl(scaleAdjustmentToInterval(4))); + } + + bPlayerPan = true; + nDestVertPan[nLocalPlayer] = PlayerList[nLocalPlayer].q16horiz; + } + } + + // loc_1C048: + if (totalvel[nLocalPlayer] > 20) { + bPlayerPan = false; + } + + if (g_MyAimMode) + bLockPan = true; + + // loc_1C05E + fix16_t ecx = nDestVertPan[nLocalPlayer] - PlayerList[nLocalPlayer].q16horiz; + + if (g_MyAimMode) + { + ecx = 0; + } + + if (!nFreeze) + { + if (ecx) + { + if (ecx / 4 == 0) + { + if (ecx >= 0) { + ecx = 1; + } + else + { + ecx = -1; + } + } + else + { + ecx /= 4; + + if (ecx > fix16_from_int(4)) + { + ecx = fix16_from_int(4); + } + else if (ecx < -fix16_from_int(4)) + { + ecx = -fix16_from_int(4); + } + } + + PlayerList[nLocalPlayer].q16horiz = fix16_sadd(PlayerList[nLocalPlayer].q16horiz, ecx); + } + + PlayerList[nLocalPlayer].q16horiz = fix16_clamp(PlayerList[nLocalPlayer].q16horiz, fix16_from_int(0), fix16_from_int(184)); + } +} + + + //--------------------------------------------------------------------------- // // CCMD based input. The basics are from Randi's ZDuke but this uses dynamic diff --git a/source/exhumed/src/player.cpp b/source/exhumed/src/player.cpp index 9ae4f53fd..5b8fecc45 100644 --- a/source/exhumed/src/player.cpp +++ b/source/exhumed/src/player.cpp @@ -53,7 +53,6 @@ fix16_t nPlayerDAng = 0; short obobangle = 0, bobangle = 0; short bPlayerPan = 0; short bLockPan = 0; -bool g_MyAimMode; static actionSeq ActionSeq[] = { {18, 0}, {0, 0}, {9, 0}, {27, 0}, {63, 0}, @@ -130,224 +129,6 @@ short PlayerCount; short nNetStartSprites; short nCurStartSprite; -/* -typedef struct -{ -fixed dx; -fixed dy; -fixed dz; -fixed dyaw; -fixed dpitch; -fixed droll; -} ControlInfo; -*/ - -void PlayerInterruptKeys() -{ - ControlInfo info; - memset(&info, 0, sizeof(ControlInfo)); // this is done within CONTROL_GetInput() anyway - CONTROL_GetInput(&info); - - static double lastInputTicks; - auto const currentHiTicks = I_msTimeF(); - double const elapsedInputTicks = currentHiTicks - lastInputTicks; - - lastInputTicks = currentHiTicks; - - auto scaleAdjustmentToInterval = [=](double x) { return x * (120 / 4) / (1000.0 / elapsedInputTicks); }; - - if (paused) - return; - - localInput = {}; - InputPacket input {}; - fix16_t input_angle = 0; - - if (PlayerList[nLocalPlayer].nHealth == 0) - { - lPlayerYVel = 0; - lPlayerXVel = 0; - nPlayerDAng = 0; - return; - } - - // JBF: Run key behaviour is selectable - int const playerRunning = G_CheckAutorun(buttonMap.ButtonDown(gamefunc_Run)); - int const turnAmount = playerRunning ? 12 : 8; - int const keyMove = playerRunning ? 12 : 6; - - if (buttonMap.ButtonDown(gamefunc_Strafe)) - { - input.svel -= info.mousex * 4.f; - input.svel -= info.dyaw * keyMove; - } - else - { - input_angle = fix16_sadd(input_angle, fix16_from_float(info.mousex)); - input_angle = fix16_sadd(input_angle, fix16_from_dbl(scaleAdjustmentToInterval(info.dyaw))); - } - - g_MyAimMode = in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming); - - if (g_MyAimMode) - input.q16horz = fix16_sadd(input.q16horz, fix16_from_float(info.mousey)); - else - input.fvel -= info.mousey * 8.f; - - if (!in_mouseflip) input.q16horz = -input.q16horz; - - input.q16horz = fix16_ssub(input.q16horz, fix16_from_dbl(scaleAdjustmentToInterval(info.dpitch))); - input.svel -= info.dx * keyMove; - input.fvel -= info.dz * keyMove; - - if (buttonMap.ButtonDown(gamefunc_Strafe)) - { - if (buttonMap.ButtonDown(gamefunc_Turn_Left)) - input.svel -= -keyMove; - - if (buttonMap.ButtonDown(gamefunc_Turn_Right)) - input.svel -= keyMove; - } - else - { - static int turn = 0; - static int counter = 0; - // normal, non strafing movement - if (buttonMap.ButtonDown(gamefunc_Turn_Left)) - { - turn -= 2; - - if (turn < -turnAmount) - turn = -turnAmount; - } - else if (buttonMap.ButtonDown(gamefunc_Turn_Right)) - { - turn += 2; - - if (turn > turnAmount) - turn = turnAmount; - } - - if (turn < 0) - { - turn++; - if (turn > 0) - turn = 0; - } - - if (turn > 0) - { - turn--; - if (turn < 0) - turn = 0; - } - - //if ((counter++) % 4 == 0) // what was this for??? - input_angle = fix16_sadd(input_angle, fix16_from_dbl(scaleAdjustmentToInterval(turn * 2))); - - } - - if (buttonMap.ButtonDown(gamefunc_Strafe_Left)) - input.svel += keyMove; - - if (buttonMap.ButtonDown(gamefunc_Strafe_Right)) - input.svel += -keyMove; - - if (buttonMap.ButtonDown(gamefunc_Move_Forward)) - input.fvel += keyMove; - - if (buttonMap.ButtonDown(gamefunc_Move_Backward)) - input.fvel += -keyMove; - - localInput.fvel = clamp(localInput.fvel + input.fvel, -12, 12); - localInput.svel = clamp(localInput.svel + input.svel, -12, 12); - - localInput.q16avel = fix16_sadd(localInput.q16avel, input_angle); - - if (!nFreeze) - { - PlayerList[nLocalPlayer].q16angle = fix16_sadd(PlayerList[nLocalPlayer].q16angle, input_angle) & 0x7FFFFFF; - - // A horiz diff of 128 equal 45 degrees, - // so we convert horiz to 1024 angle units - - float const horizAngle = clamp(atan2f(PlayerList[nLocalPlayer].q16horiz - fix16_from_int(92), fix16_from_int(128)) * (512.f / fPI) + fix16_to_float(input.q16horz), -255.f, 255.f); - PlayerList[nLocalPlayer].q16horiz = fix16_from_int(92) + Blrintf(fix16_from_int(128) * tanf(horizAngle * (fPI / 512.f))); - - // Look/aim up/down functions. - if (buttonMap.ButtonDown(gamefunc_Look_Up) || buttonMap.ButtonDown(gamefunc_Aim_Up)) - { - bLockPan = false; - if (PlayerList[nLocalPlayer].q16horiz < fix16_from_int(180)) { - PlayerList[nLocalPlayer].q16horiz = fix16_sadd(PlayerList[nLocalPlayer].q16horiz, fix16_from_dbl(scaleAdjustmentToInterval(4))); - } - - bPlayerPan = true; - nDestVertPan[nLocalPlayer] = PlayerList[nLocalPlayer].q16horiz; - } - else if (buttonMap.ButtonDown(gamefunc_Look_Down) || buttonMap.ButtonDown(gamefunc_Aim_Down)) - { - bLockPan = false; - if (PlayerList[nLocalPlayer].q16horiz > fix16_from_int(4)) { - PlayerList[nLocalPlayer].q16horiz = fix16_ssub(PlayerList[nLocalPlayer].q16horiz, fix16_from_dbl(scaleAdjustmentToInterval(4))); - } - - bPlayerPan = true; - nDestVertPan[nLocalPlayer] = PlayerList[nLocalPlayer].q16horiz; - } - } - - // loc_1C048: - if (totalvel[nLocalPlayer] > 20) { - bPlayerPan = false; - } - - if (g_MyAimMode) - bLockPan = true; - - // loc_1C05E - fix16_t ecx = nDestVertPan[nLocalPlayer] - PlayerList[nLocalPlayer].q16horiz; - - if (g_MyAimMode) - { - ecx = 0; - } - - if (!nFreeze) - { - if (ecx) - { - if (ecx / 4 == 0) - { - if (ecx >= 0) { - ecx = 1; - } - else - { - ecx = -1; - } - } - else - { - ecx /= 4; - - if (ecx > fix16_from_int(4)) - { - ecx = fix16_from_int(4); - } - else if (ecx < -fix16_from_int(4)) - { - ecx = -fix16_from_int(4); - } - } - - PlayerList[nLocalPlayer].q16horiz = fix16_sadd(PlayerList[nLocalPlayer].q16horiz, ecx); - } - - PlayerList[nLocalPlayer].q16horiz = fix16_clamp(PlayerList[nLocalPlayer].q16horiz, fix16_from_int(0), fix16_from_int(184)); - } -} - void RestoreSavePoint(int nPlayer, int *x, int *y, int *z, short *nSector, short *nAngle) { *x = sPlayerSave[nPlayer].x; @@ -2884,7 +2665,7 @@ loc_1BD2E: // loc_1BE70: // Handle player pressing number keys to change weapon - uint8_t var_90 = (buttons >> 13) & 0xF; + uint8_t var_90 = sPlayerInput[nPlayer].getNewWeapon(); if (var_90) { @@ -3108,7 +2889,6 @@ static SavegameHelper sgh("player", SV(bobangle), SV(bPlayerPan), SV(bLockPan), - SV(g_MyAimMode), SV(nStandHeight), SV(PlayerCount), SV(nNetStartSprites), diff --git a/source/exhumed/src/player.h b/source/exhumed/src/player.h index 49321f55e..3c1dc8c40 100644 --- a/source/exhumed/src/player.h +++ b/source/exhumed/src/player.h @@ -23,7 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_PS_NS -void PlayerInterruptKeys(); +void PlayerInterruptKeys(bool after); void RestoreSavePoint(int nPlayer, int *x, int *y, int *z, short *nSector, short *nAngle); void SetSavePoint(int nPlayer, int x, int y, int z, short nSector, short nAngle); void InitPlayer(); diff --git a/source/exhumed/src/ps_input.h b/source/exhumed/src/ps_input.h index 966313223..23ae1e3fb 100644 --- a/source/exhumed/src/ps_input.h +++ b/source/exhumed/src/ps_input.h @@ -33,6 +33,18 @@ struct PlayerInput short nTarget; fix16_t horizon; int8_t nItem; + ESyncBits actions; + + int getNewWeapon() const + { + return (actions & SB_WEAPONMASK_BITS).GetValue(); + } + + void SetNewWeapon(int weap) + { + actions = (actions & ~SB_WEAPONMASK_BITS) | (ESyncBits::FromInt(weap) & SB_WEAPONMASK_BITS); + } + }; void InitInput();