From 43c4c5eb5e7fd4b6125fa2ab3cddf7568967bbf1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 16 Jul 2020 22:49:26 +0200 Subject: [PATCH] - consolidated some parts common to the 3 input routines. --- source/games/duke/src/constants.h | 13 -- source/games/duke/src/game.cpp | 2 +- source/games/duke/src/gameexec.cpp | 1 - source/games/duke/src/input.cpp | 60 +++++++ source/games/duke/src/player.h | 1 - source/games/duke/src/types.h | 3 +- source/games/duke/src/zz_player.cpp | 245 ++++++---------------------- 7 files changed, 114 insertions(+), 211 deletions(-) diff --git a/source/games/duke/src/constants.h b/source/games/duke/src/constants.h index d5f257ccb..97b439d1b 100644 --- a/source/games/duke/src/constants.h +++ b/source/games/duke/src/constants.h @@ -224,7 +224,6 @@ enum ESyncVals // Todo: Make this bit masks - cannot be done before eliminating all old code using it SK_JUMP = 0 , SK_CROUCH = 1 , - SK_FIRE = 2 , SK_AIM_UP = 3 , SK_AIM_DOWN = 4 , SK_RUN = 5 , @@ -235,26 +234,14 @@ enum ESyncVals SK_WEAPON_BITS1 = 9 , SK_WEAPON_BITS2 = 10, SK_WEAPON_BITS3 = 11, - SK_STEROIDS = 12, SK_LOOK_UP = 13, SK_LOOK_DOWN = 14, - SK_NIGHTVISION = 15, - SK_MEDKIT = 16, SK_MULTIFLAG = 17, SK_CENTER_VIEW = 18, SK_HOLSTER = 19, - SK_INV_LEFT = 20, - SK_PAUSE = 21, SK_QUICK_KICK = 22, SK_AIMMODE = 23, - SK_HOLODUKE = 24, - SK_JETPACK = 25, - SK_GAMEQUIT = 26, - SK_INV_RIGHT = 27, SK_TURNAROUND = 28, - SK_OPEN = 29, - SK_INVENTORY = 30, - SK_ESCAPE = 31, }; enum ESyncBits_ : uint32_t diff --git a/source/games/duke/src/game.cpp b/source/games/duke/src/game.cpp index 03d00ef06..8ceb4fd93 100644 --- a/source/games/duke/src/game.cpp +++ b/source/games/duke/src/game.cpp @@ -309,7 +309,7 @@ static void ticker(void) S_Update(); // we need CONTROL_GetInput in order to pick up joystick button presses - if (!(ps[myconnectindex].gm & MODE_GAME)) + if (!(ps[myconnectindex].gm & MODE_GAME) || (paused && !System_WantGuiCapture())) { ControlInfo noshareinfo; CONTROL_GetInput(&noshareinfo); diff --git a/source/games/duke/src/gameexec.cpp b/source/games/duke/src/gameexec.cpp index 387299fd1..9cccbc826 100644 --- a/source/games/duke/src/gameexec.cpp +++ b/source/games/duke/src/gameexec.cpp @@ -1017,7 +1017,6 @@ int parse(void) resetinventory(g_p); resetweapons(g_p); - ps[g_p].movement_lock = 0; //cameradist = 0; //cameraclock = totalclock; diff --git a/source/games/duke/src/input.cpp b/source/games/duke/src/input.cpp index 579044e9c..23fc14756 100644 --- a/source/games/duke/src/input.cpp +++ b/source/games/duke/src/input.cpp @@ -682,6 +682,66 @@ enum TURBOTURNTIME = (TICRATE/8) // 7 }; +//--------------------------------------------------------------------------- +// +// This one's from VoidSW, not EDuke32 +// +//--------------------------------------------------------------------------- + +fix16_t GetDeltaQ16Angle(fix16_t ang1, fix16_t ang2) +{ + // Look at the smaller angle if > 1024 (180 degrees) + if (fix16_abs(ang1 - ang2) > fix16_from_int(1024)) + { + if (ang1 <= fix16_from_int(1024)) + ang1 += fix16_from_int(2048); + + if (ang2 <= fix16_from_int(1024)) + ang2 += fix16_from_int(2048); + } + + //if (ang1 - ang2 == -fix16_from_int(1024)) + // return(fix16_from_int(1024)); + + return ang1 - ang2; +} + +//--------------------------------------------------------------------------- +// +// common handler for all 3 input methods. +// +//--------------------------------------------------------------------------- + +void processCommonInput(input_t &input) +{ + if (buttonMap.ButtonDown(gamefunc_Fire)) localInput.bits |= SKB_FIRE; + if (buttonMap.ButtonDown(gamefunc_Open)) localInput.bits |= SKB_OPEN; + + // todo: handle these with CCMDs instead. + if (buttonMap.ButtonDown(gamefunc_Inventory)) localInput.bits |= SKB_INVENTORY; + if (buttonMap.ButtonDown(gamefunc_MedKit)) localInput.bits |= SKB_MEDKIT; + if (buttonMap.ButtonDown(gamefunc_Steroids)) localInput.bits |= SKB_STEROIDS; + if (buttonMap.ButtonDown(gamefunc_NightVision)) localInput.bits |= SKB_NIGHTVISION; + if (buttonMap.ButtonDown(gamefunc_Holo_Duke)) localInput.bits |= SKB_HOLODUKE; + if (buttonMap.ButtonDown(gamefunc_Jetpack)) localInput.bits |= SKB_JETPACK; + + // the way this checks for controller axis movement will also catch mouse and keyboard input. + bool dpad_select = buttonMap.ButtonDown(gamefunc_Dpad_Select); + if (buttonMap.ButtonDown(gamefunc_Inventory_Left) || (dpad_select && (input.svel > 0 || input.q16avel < 0))) localInput.bits |= SKB_INV_LEFT; + if (buttonMap.ButtonDown(gamefunc_Inventory_Right) || (dpad_select && (input.svel < 0 || input.q16avel > 0))) localInput.bits |= SKB_INV_RIGHT; + + if (inputState.CheckPause()) localInput.bits |= SKB_PAUSE; + if (g_gameQuit) localInput.bits |= SKB_GAMEQUIT; + //if (inputState.GetKeyStatus(sc_Escape)) localInput.bits |= SKB_ESCAPE; fixme. This never gets here because the menu eats the escape key. + + if (dpad_select) + { + input.fvel = 0; + input.svel = 0; + input.q16avel = 0; + } + +} //--------------------------------------------------------------------------- // diff --git a/source/games/duke/src/player.h b/source/games/duke/src/player.h index b4aca8a2d..30e7e70b9 100644 --- a/source/games/duke/src/player.h +++ b/source/games/duke/src/player.h @@ -50,7 +50,6 @@ typedef struct { float horizAngleAdjust; fix16_t horizSkew; - double lastInputTicks; bool lookLeft; bool lookRight; bool horizRecenter; diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h index a4c26cd27..4a37f37ce 100644 --- a/source/games/duke/src/types.h +++ b/source/games/duke/src/types.h @@ -101,8 +101,7 @@ struct player_struct unsigned int palette; PalEntry pals; - // these did not exist in JFDuke. - uint8_t movement_lock; + // this was a global variable originally. vec2_t fric; // From here on it is unaltered from JFDuke with the exception of a few fields that are no longer needed and were removed. diff --git a/source/games/duke/src/zz_player.cpp b/source/games/duke/src/zz_player.cpp index 0ba011afa..6a487c3fb 100644 --- a/source/games/duke/src/zz_player.cpp +++ b/source/games/duke/src/zz_player.cpp @@ -27,6 +27,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. BEGIN_DUKE_NS +fix16_t GetDeltaQ16Angle(fix16_t ang1, fix16_t ang2); +void processCommonInput(input_t& input); +int motoApplyTurn(player_struct* p, int turnl, int turnr, int bike_turn, bool goback, double factor); +int boatApplyTurn(player_struct* p, int turnl, int turnr, int bike_turn, double factor); + int32_t PHEIGHT = PHEIGHT_DUKE; @@ -57,24 +62,6 @@ enum inputlock_t IL_NOTHING = IL_NOANGLE|IL_NOHORIZ|IL_NOMOVE, }; -fix16_t GetDeltaQ16Angle(fix16_t ang1, fix16_t ang2) -{ - // Look at the smaller angle if > 1024 (180 degrees) - if (fix16_abs(ang1 - ang2) > fix16_from_int(1024)) - { - if (ang1 <= fix16_from_int(1024)) - ang1 += fix16_from_int(2048); - - if (ang2 <= fix16_from_int(1024)) - ang2 += fix16_from_int(2048); - } - - //if (ang1 - ang2 == -fix16_from_int(1024)) - // return(fix16_from_int(1024)); - - return ang1 - ang2; -} - static int P_CheckLockedMovement(int const playerNum) { auto const pPlayer = &ps[playerNum]; @@ -109,32 +96,10 @@ void P_GetInput(int const playerNum) auto const pPlayer = &ps[playerNum]; auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; - - auto const currentHiTicks = timerGetHiTicks(); - elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; - thisPlayer.lastInputTicks = currentHiTicks; double scaleAdjust = elapsedInputTicks * REALGAMETICSPERSEC / 1000.0; - - if (paused) - { - if (!(pPlayer->gm&MODE_MENU)) - CONTROL_GetInput(&info); - - localInput = {}; - localInput.bits = (((int32_t)g_gameQuit) << SK_GAMEQUIT); - return; - } - - D_ProcessEvents(); - bool mouseaim = in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming); - if (numplayers == 1) - { - setlocalplayerinput(pPlayer); - } - CONTROL_GetInput(&info); @@ -175,10 +140,10 @@ void P_GetInput(int const playerNum) { if (!localInput.svel) { - if (buttonMap.ButtonDown(gamefunc_Turn_Left) && !(pPlayer->movement_lock & 4) && !localInput.svel) + if (buttonMap.ButtonDown(gamefunc_Turn_Left) && !localInput.svel) input.svel = keyMove; - if (buttonMap.ButtonDown(gamefunc_Turn_Right) && !(pPlayer->movement_lock & 8) && !localInput.svel) + if (buttonMap.ButtonDown(gamefunc_Turn_Right) && !localInput.svel) input.svel = -keyMove; } } @@ -206,60 +171,41 @@ void P_GetInput(int const playerNum) if (localInput.svel < keyMove && localInput.svel > -keyMove) { - if (buttonMap.ButtonDown(gamefunc_Strafe_Left) && !(pPlayer->movement_lock & 4)) + if (buttonMap.ButtonDown(gamefunc_Strafe_Left)) input.svel += keyMove; - if (buttonMap.ButtonDown(gamefunc_Strafe_Right) && !(pPlayer->movement_lock & 8)) + if (buttonMap.ButtonDown(gamefunc_Strafe_Right)) input.svel += -keyMove; } if (localInput.fvel < keyMove && localInput.fvel > -keyMove) { - if (isRR()) + if (isRR() && pPlayer->drink_amt >= 66 && pPlayer->drink_amt <= 87) { - /*if (buttonMap.ButtonDown(gamefunc_Quick_Kick)) + if (buttonMap.ButtonDown(gamefunc_Move_Forward)) { - localInput.bits |= buttonMap.ButtonDown(gamefunc_Move_Forward)<drink_amt >= 66 && pPlayer->drink_amt <= 87) - { - if (buttonMap.ButtonDown(gamefunc_Move_Forward)) - { - input.fvel += keyMove; - if (pPlayer->drink_amt & 1) - input.svel += keyMove; - else - input.svel -= keyMove; - } - - if (buttonMap.ButtonDown(gamefunc_Move_Backward)) - { - input.fvel += -keyMove; - if (pPlayer->drink_amt & 1) - input.svel -= keyMove; - else - input.svel += keyMove; - } - } + input.fvel += keyMove; + if (pPlayer->drink_amt & 1) + input.svel += keyMove; else - { - if (buttonMap.ButtonDown(gamefunc_Move_Forward)) - input.fvel += keyMove; + input.svel -= keyMove; + } - if (buttonMap.ButtonDown(gamefunc_Move_Backward)) - input.fvel += -keyMove; - } + if (buttonMap.ButtonDown(gamefunc_Move_Backward)) + { + input.fvel += -keyMove; + if (pPlayer->drink_amt & 1) + input.svel -= keyMove; + else + input.svel += keyMove; } } else { - if (buttonMap.ButtonDown(gamefunc_Move_Forward) && !(pPlayer->movement_lock & 1)) + if (buttonMap.ButtonDown(gamefunc_Move_Forward)) input.fvel += keyMove; - if (buttonMap.ButtonDown(gamefunc_Move_Backward) && !(pPlayer->movement_lock & 2)) + if (buttonMap.ButtonDown(gamefunc_Move_Backward)) input.fvel += -keyMove; } } @@ -295,9 +241,6 @@ void P_GetInput(int const playerNum) if ((localInput.bits & SKB_WEAPONMASK_BITS) == 0) localInput.bits |= (weaponSelection << SK_WEAPON_BITS); - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Fire) << SK_FIRE); - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Open) << SK_OPEN); - int const sectorLotag = pPlayer->cursectnum != -1 ? sector[pPlayer->cursectnum].lotag : 0; int const crouchable = sectorLotag != 2 && (sectorLotag != 1 || pPlayer->spritebridge); @@ -312,6 +255,8 @@ void P_GetInput(int const playerNum) if (buttonMap.ButtonDown(gamefunc_Crouch) || buttonMap.ButtonDown(gamefunc_Jump) || pPlayer->jetpack_on || (!crouchable && pPlayer->on_ground)) pPlayer->crouch_toggle = 0; + processCommonInput(input); + int const crouching = buttonMap.ButtonDown(gamefunc_Crouch) || buttonMap.ButtonDown(gamefunc_Toggle_Crouch) || pPlayer->crouch_toggle; localInput.bits |= (buttonMap.ButtonDown(gamefunc_Jump) << SK_JUMP) | (crouching << SK_CROUCH); @@ -325,22 +270,11 @@ void P_GetInput(int const playerNum) localInput.bits |= (playerRunning << SK_RUN); - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Inventory_Left) || (buttonMap.ButtonDown(gamefunc_Dpad_Select) && (input.svel > 0 || input.q16avel < 0))) << SK_INV_LEFT; - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Inventory_Right) || (buttonMap.ButtonDown(gamefunc_Dpad_Select) && (input.svel < 0 || input.q16avel > 0))) << SK_INV_RIGHT; - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Inventory) << SK_INVENTORY); - - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Steroids) << SK_STEROIDS) | (buttonMap.ButtonDown(gamefunc_NightVision) << SK_NIGHTVISION); - localInput.bits |= (buttonMap.ButtonDown(gamefunc_MedKit) << SK_MEDKIT) | (buttonMap.ButtonDown(gamefunc_Holo_Duke) << SK_HOLODUKE); - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Jetpack) << SK_JETPACK); - localInput.bits |= buttonMap.ButtonDown(gamefunc_Holster_Weapon) << SK_HOLSTER; localInput.bits |= buttonMap.ButtonDown(gamefunc_Quick_Kick) << SK_QUICK_KICK; localInput.bits |= buttonMap.ButtonDown(gamefunc_TurnAround) << SK_TURNAROUND; localInput.bits |= (mouseaim << SK_AIMMODE); - localInput.bits |= (g_gameQuit << SK_GAMEQUIT); - localInput.bits |= inputState.CheckPause() << SK_PAUSE; - //localInput.bits |= ((uint32_t)inputState.GetKeyStatus(sc_Escape)) << SK_ESCAPE; fixme.This needs to be done differently if (isRR()) { @@ -352,13 +286,7 @@ void P_GetInput(int const playerNum) localInput.bits |= SKB_LOOK_DOWN; } - if (buttonMap.ButtonDown(gamefunc_Dpad_Select)) - { - input.fvel = 0; - input.svel = 0; - input.q16avel = 0; - } - else if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming)) + if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming)) input.fvel = 0; int const movementLocked = P_CheckLockedMovement(playerNum); @@ -494,7 +422,6 @@ void P_GetInput(int const playerNum) pPlayer->q16horiz = fix16_clamp(pPlayer->q16horiz, F16(HORIZ_MIN), F16(HORIZ_MAX)); } -int motoApplyTurn(player_struct* p, int turnl, int turnr, int bike_turn, bool goback, double factor); void P_GetInputMotorcycle(int playerNum) { @@ -502,31 +429,10 @@ void P_GetInputMotorcycle(int playerNum) auto const pPlayer = &ps[playerNum]; auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; - - auto const currentHiTicks = timerGetHiTicks(); - elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; - thisPlayer.lastInputTicks = currentHiTicks; double scaleAdjust = elapsedInputTicks * REALGAMETICSPERSEC / 1000.0; - if (paused) - { - if (!(pPlayer->gm&MODE_MENU)) - CONTROL_GetInput(&info); - - localInput = {}; - localInput.bits = (((int32_t)g_gameQuit) << SK_GAMEQUIT); - return; - } - - D_ProcessEvents(); - bool mouseaim = in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming); - if (numplayers == 1) - { - setlocalplayerinput(pPlayer); - } - CONTROL_GetInput(&info); // JBF: Run key behaviour is selectable @@ -542,29 +448,7 @@ void P_GetInputMotorcycle(int playerNum) input.fvel -= scaleAdjustmentToInterval(info.dz * keyMove); pPlayer->crouch_toggle = 0; - - localInput.bits |= buttonMap.ButtonDown(gamefunc_Fire) << SK_FIRE; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Steroids) << SK_STEROIDS; - localInput.bits |= buttonMap.ButtonDown(gamefunc_NightVision) << SK_NIGHTVISION; - localInput.bits |= buttonMap.ButtonDown(gamefunc_MedKit) << SK_MEDKIT; - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Inventory_Left) || - (buttonMap.ButtonDown(gamefunc_Dpad_Select) && (input.svel > 0 || input.q16avel < 0))) << SK_INV_LEFT; - localInput.bits |= inputState.CheckPause() << SK_PAUSE; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Holo_Duke) << SK_HOLODUKE; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Jetpack) << SK_JETPACK; - localInput.bits |= (g_gameQuit << SK_GAMEQUIT); - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Inventory_Right) || - (buttonMap.ButtonDown(gamefunc_Dpad_Select) && (input.svel < 0 || input.q16avel > 0))) << SK_INV_RIGHT; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Open) << SK_OPEN; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Inventory) << SK_INVENTORY; - //localInput.bits |= ((uint32_t)inputState.GetKeyStatus(sc_Escape)) << SK_ESCAPE; fixme.This needs to be done differently - - if (buttonMap.ButtonDown(gamefunc_Dpad_Select)) - { - input.fvel = 0; - input.svel = 0; - input.q16avel = 0; - } + processCommonInput(input); if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming)) input.fvel = 0; @@ -641,39 +525,16 @@ void P_GetInputMotorcycle(int playerNum) } } -int boatApplyTurn(player_struct* p, int turnl, int turnr, int bike_turn, double factor); - void P_GetInputBoat(int playerNum) { auto &thisPlayer = g_player[playerNum]; auto const pPlayer = &ps[playerNum]; auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; - - auto const currentHiTicks = timerGetHiTicks(); - elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; - thisPlayer.lastInputTicks = currentHiTicks; double scaleAdjust = elapsedInputTicks * REALGAMETICSPERSEC / 1000.0; - if (paused) - { - if (!(pPlayer->gm&MODE_MENU)) - CONTROL_GetInput(&info); - - localInput = {}; - localInput.bits = (((int32_t)g_gameQuit) << SK_GAMEQUIT); - return; - } - - D_ProcessEvents(); - bool mouseaim = in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming); - if (numplayers == 1) - { - setlocalplayerinput(pPlayer); - } - CONTROL_GetInput(&info); // JBF: Run key behaviour is selectable @@ -691,29 +552,7 @@ void P_GetInputBoat(int playerNum) input.fvel -= scaleAdjustmentToInterval(info.dz * keyMove); pPlayer->crouch_toggle = 0; - - localInput.bits |= buttonMap.ButtonDown(gamefunc_Fire) << SK_FIRE; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Steroids) << SK_STEROIDS; - localInput.bits |= buttonMap.ButtonDown(gamefunc_NightVision) << SK_NIGHTVISION; - localInput.bits |= buttonMap.ButtonDown(gamefunc_MedKit) << SK_MEDKIT; - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Inventory_Left) || - (buttonMap.ButtonDown(gamefunc_Dpad_Select) && (input.svel > 0 || input.q16avel < 0))) << SK_INV_LEFT; - localInput.bits |= inputState.CheckPause() << SK_PAUSE; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Holo_Duke) << SK_HOLODUKE; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Jetpack) << SK_JETPACK; - localInput.bits |= (g_gameQuit << SK_GAMEQUIT); - localInput.bits |= (buttonMap.ButtonDown(gamefunc_Inventory_Right) || - (buttonMap.ButtonDown(gamefunc_Dpad_Select) && (input.svel < 0 || input.q16avel > 0))) << SK_INV_RIGHT; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Open) << SK_OPEN; - localInput.bits |= buttonMap.ButtonDown(gamefunc_Inventory) << SK_INVENTORY; - //localInput.bits |= ((uint32_t)inputState.GetKeyStatus(sc_Escape)) << SK_ESCAPE; fixme.This needs to be done differently - - if (buttonMap.ButtonDown(gamefunc_Dpad_Select)) - { - input.fvel = 0; - input.svel = 0; - input.q16avel = 0; - } + processCommonInput(input); if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming)) input.fvel = 0; @@ -787,11 +626,31 @@ void P_GetInputBoat(int playerNum) void GetInput() { + static uint64_t lastCheck; + + auto const p = &ps[myconnectindex]; updatePauseStatus(); - if (isRRRA() && ps[myconnectindex].OnMotorcycle) + auto now = I_msTimeF(); + elapsedInputTicks = now - lastCheck; + lastCheck = now; + + if (paused) + { + localInput = {}; + if (g_gameQuit) localInput.bits |= SKB_GAMEQUIT; + return; + } + + D_ProcessEvents(); + if (numplayers == 1) + { + setlocalplayerinput(p); + } + + if (isRRRA() && p->OnMotorcycle) P_GetInputMotorcycle(myconnectindex); - else if (isRRRA() && ps[myconnectindex].OnBoat) + else if (isRRRA() && p->OnBoat) P_GetInputBoat(myconnectindex); else P_GetInput(myconnectindex);