From f4e763e25200c895fa0769b97edf90456a181e96 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 6 Jul 2020 10:34:31 +0200 Subject: [PATCH] - input code cleanup. The input queues are mostly abstracted now and some EDuke specific handling that isn't needed anymore was removed. --- source/games/duke/src/gameloop.cpp | 113 +++++++++++++++++--------- source/games/duke/src/global.h | 5 -- source/games/duke/src/player.h | 3 - source/games/duke/src/premap.h | 2 +- source/games/duke/src/sectors.cpp | 8 -- source/games/duke/src/zz_game.cpp | 52 ++---------- source/games/duke/src/zz_global.cpp | 4 - source/games/duke/src/zz_player.cpp | 23 ------ source/games/duke/src/zz_premap.cpp | 16 +--- source/games/duke/src/zz_savegame.cpp | 2 +- 10 files changed, 87 insertions(+), 141 deletions(-) diff --git a/source/games/duke/src/gameloop.cpp b/source/games/duke/src/gameloop.cpp index f6ae99e6e..dce639542 100644 --- a/source/games/duke/src/gameloop.cpp +++ b/source/games/duke/src/gameloop.cpp @@ -41,17 +41,80 @@ BEGIN_DUKE_NS void GetNextInput(); -/* -static inline int movefifoend(int myconnectindex) +//--------------------------------------------------------------------------- +// +// abstract the queue's implementation +// All access to the input queues should go through this function interface. +// +//--------------------------------------------------------------------------- +static input_t inputfifo[MOVEFIFOSIZ][MAXPLAYERS]; +static int movefifoend[MAXPLAYERS]; +static int movefifoplc; + + +void clearfifo(void) { -#if 1 - return g_player[myconnectindex].movefifoend; -#else - return movefifoend[myconnectindex]; + localInput = {}; + memset(&inputfifo, 0, sizeof(inputfifo)); + + for (int p = 0; p <= MAXPLAYERS - 1; ++p) + { + if (g_player[p].input != NULL) + *g_player[p].input = {}; + } +} + + +static inline void GetNextInput() +{ + for (int i = connecthead; i >= 0; i = connectpoint2[i]) + memcpy(g_player[i].input /*originally: &sync[i] */, &inputfifo[movefifoplc & (MOVEFIFOSIZ - 1)][i], sizeof(input_t)); + + movefifoplc++; +} + +void advancequeue(int myconnectindex) +{ + movefifoend[myconnectindex]++; +} + +input_t& nextinput(int myconnectindex) +{ + return inputfifo[movefifoend[myconnectindex] & (MOVEFIFOSIZ - 1)][myconnectindex]; +} + +bool shouldprocessinput(int myconnectindex) +{ + if (movefifoend[myconnectindex] - movefifoplc > bufferjitter) + { + int i; + for (i = connecthead; i >= 0; i = connectpoint2[i]) + if (movefifoplc == movefifoend[i]) return false; + if (i >= 0) return false; + return true; + } + return false; +} + +static void fakedomovethings() +{ + // prediction +} + +static void fakedomovethingscorrect() +{ + // unprediction +} + +void prediction() +{ +#if 0 + // We currently have no net code driving this. + if (numplayers > 1) + while (fakemovefifoplc < movefifoend[myconnectindex]) fakedomovethings(); + getpackets(); #endif } -*/ - //--------------------------------------------------------------------------- // // @@ -70,22 +133,6 @@ int menuloop(void) return 0; } -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -static void fakedomovethings() -{ - // prediction -} - -static void fakedomovethingscorrect() -{ - // unprediction -} - //--------------------------------------------------------------------------- // // @@ -254,28 +301,20 @@ int domovethings() // // //--------------------------------------------------------------------------- -/* -char moveloop() + +int moveloop() { - int i; - - if (numplayers > 1) - while (fakemovefifoplc < movefifoend[myconnectindex]) fakedomovethings(); - - getpackets(); + prediction(); if (numplayers < 2) bufferjitter = 0; - while (movefifoend(myconnectindex)-movefifoplc > bufferjitter) + while (shouldprocessinput(myconnectindex)) { - for(i=connecthead;i>=0;i=connectpoint2[i]) - if (movefifoplc == movefifoend(i)) break; - if (i >= 0) break; if( domovethings() ) return 1; } return 0; } -*/ + END_DUKE_NS diff --git a/source/games/duke/src/global.h b/source/games/duke/src/global.h index c3cd03ece..6604d9de9 100644 --- a/source/games/duke/src/global.h +++ b/source/games/duke/src/global.h @@ -82,15 +82,11 @@ G_EXTERN uint8_t packbuf[PACKBUF_SIZE]; G_EXTERN input_t localInput; G_EXTERN input_t recsync[RECSYNCBUFSIZ]; -//G_EXTERN uint8_t syncstat, syncval[MAXPLAYERS][MOVEFIFOSIZ]; -//G_EXTERN int32_t syncvalhead[MAXPLAYERS], syncvaltail, syncvaltottail; - G_EXTERN int32_t avgfvel, avgsvel, avgbits; G_EXTERN fix16_t avgavel, avghorz; G_EXTERN int8_t avgextbits; G_EXTERN int32_t movefifosendplc; -G_EXTERN int32_t movefifoplc; G_EXTERN int32_t predictfifoplc; G_EXTERN vec3_t mypos, omypos, myvel; @@ -257,7 +253,6 @@ extern playerdata_t *const g_player; #endif G_EXTERN playerspawn_t g_playerSpawnPoints[MAXPLAYERS]; #define po g_playerSpawnPoints -G_EXTERN input_t inputfifo[MOVEFIFOSIZ][MAXPLAYERS]; #pragma pack(pop) G_EXTERN int32_t g_noEnemies; diff --git a/source/games/duke/src/player.h b/source/games/duke/src/player.h index 0e29e4601..25d59bcf7 100644 --- a/source/games/duke/src/player.h +++ b/source/games/duke/src/player.h @@ -137,7 +137,6 @@ typedef struct { uint32_t bits; int16_t fvel, svel; fix16_t q16avel, q16horz; - int8_t extbits; } input_t; #pragma pack(push,1) @@ -315,7 +314,6 @@ typedef struct float horizAngleAdjust; fix16_t horizSkew; - int32_t movefifoend, syncvalhead, myminlag; int32_t pcolor, pteam; // NOTE: wchoice[HANDREMOTE_WEAPON .. MAX_WEAPONS-1] unused uint8_t frags[MAXPLAYERS]; @@ -366,7 +364,6 @@ typedef struct { int32_t shade; } hudweapon_t; -extern input_t inputfifo[MOVEFIFOSIZ][MAXPLAYERS]; extern playerspawn_t g_playerSpawnPoints[MAXPLAYERS]; extern playerdata_t *const g_player; extern hudweapon_t hudweap; diff --git a/source/games/duke/src/premap.h b/source/games/duke/src/premap.h index a9a3d4c7a..423c48410 100644 --- a/source/games/duke/src/premap.h +++ b/source/games/duke/src/premap.h @@ -38,7 +38,7 @@ void P_ResetPlayer(int playerNum); void resetplayerstats(int playerNum); void resetweapons(int playerNum); void resetprestat(int snum, int g); -void G_ClearFIFO(void); +void clearfifo(void); void G_ResetInterpolations(void); void setmapfog(int fogtype); void G_InitRRRASkies(void); diff --git a/source/games/duke/src/sectors.cpp b/source/games/duke/src/sectors.cpp index 6ee085d12..c7b11db64 100644 --- a/source/games/duke/src/sectors.cpp +++ b/source/games/duke/src/sectors.cpp @@ -313,14 +313,6 @@ void doanimations(void) { ps[p].posz += v; ps[p].poszv = 0; -#if 0 - if (p == myconnectindex) - { - myz += v; - myzvel = 0; - myzbak[((movefifoplc - 1) & (MOVEFIFOSIZ - 1))] = ps[p].posz; - } -#endif } for (j = headspritesect[dasect]; j >= 0; j = nextspritesect[j]) diff --git a/source/games/duke/src/zz_game.cpp b/source/games/duke/src/zz_game.cpp index 9aabb2052..9474375ac 100644 --- a/source/games/duke/src/zz_game.cpp +++ b/source/games/duke/src/zz_game.cpp @@ -56,8 +56,10 @@ void SetDispatcher(); void InitCheats(); void checkcommandline(); int registerosdcommands(void); -int32_t G_MoveLoop(void); +int32_t moveloop(void); int menuloop(void); +void advancequeue(int myconnectindex); +input_t& nextinput(int myconnectindex); int16_t max_ammo_amount[MAX_WEAPONS]; int32_t spriteqamount = 64; @@ -203,14 +205,14 @@ void G_HandleLocalKeys(void) if (SHIFTS_IS_PRESSED) { Printf(PRINT_NOTIFY, *CombatMacros[ridiculeNum-1]); - Net_SendTaunt(ridiculeNum); + //Net_SendTaunt(ridiculeNum); return; } // Not SHIFT -- that is, either some ALT or WIN. if (startrts(ridiculeNum, 1)) { - Net_SendRTS(ridiculeNum); + //Net_SendRTS(ridiculeNum); return; } } @@ -772,8 +774,6 @@ MAIN_LOOP_RESTART: } G_NewGame_EnterLevel(); - - Net_WaitForEverybody(); } else { @@ -811,9 +811,6 @@ MAIN_LOOP_RESTART: Net_GetPackets(); - // only allow binds to function if the player is actually in a game (not in a menu, typing, et cetera) or demo - inputState.SetBindsEnabled(!!(g_player[myconnectindex].ps->gm & (MODE_GAME|MODE_DEMO))); - G_HandleLocalKeys(); C_RunDelayedCommands(); @@ -836,7 +833,7 @@ MAIN_LOOP_RESTART: // this is where we fill the input_t struct that is actually processed by P_ProcessInput() auto const pPlayer = g_player[myconnectindex].ps; auto const q16ang = fix16_to_int(pPlayer->q16ang); - auto & input = inputfifo[g_player[myconnectindex].movefifoend&(MOVEFIFOSIZ-1)][myconnectindex]; + auto& input = nextinput(myconnectindex); input = localInput; input.fvel = mulscale9(localInput.fvel, sintable[(q16ang + 2560) & 2047]) + @@ -847,12 +844,12 @@ MAIN_LOOP_RESTART: pPlayer->fric.y; localInput = {}; - g_player[myconnectindex].movefifoend++; + advancequeue(myconnectindex); if (((!System_WantGuiCapture() && (g_player[myconnectindex].ps->gm&MODE_MENU) != MODE_MENU) || ud.recstat == 2 || (g_netServer || ud.multimode > 1)) && (g_player[myconnectindex].ps->gm&MODE_GAME)) { - G_MoveLoop(); + moveloop(); } } @@ -894,39 +891,6 @@ MAIN_LOOP_RESTART: while (1); } -int domovethings(); -int32_t G_MoveLoop() -{ - int i; - - if (numplayers > 1) - while (predictfifoplc < g_player[myconnectindex].movefifoend) Net_DoPrediction(); - - Net_GetPackets(); - - if (numplayers < 2) bufferjitter = 0; - while (g_player[myconnectindex].movefifoend-movefifoplc > bufferjitter) - { - for(TRAVERSE_CONNECT(i)) - { - if (movefifoplc == g_player[i].movefifoend) break; - } - if (i >= 0) break; - if (domovethings()) return 1; - } - - - return 0; -} - -void GetNextInput() -{ - for (bssize_t TRAVERSE_CONNECT(i)) - Bmemcpy(g_player[i].input, &inputfifo[movefifoplc & (MOVEFIFOSIZ - 1)][i], sizeof(input_t)); - - movefifoplc++; -} - void GameInterface::FreeGameData() { setmapfog(0); diff --git a/source/games/duke/src/zz_global.cpp b/source/games/duke/src/zz_global.cpp index 8e27f7bec..3570ac1b2 100644 --- a/source/games/duke/src/zz_global.cpp +++ b/source/games/duke/src/zz_global.cpp @@ -29,8 +29,6 @@ BEGIN_DUKE_NS user_defs ud; -const char *s_buildDate = "20120522"; - char g_gametypeNames[MAXGAMETYPES][33] = { "DukeMatch (Spawn)", "Cooperative Play", "DukeMatch (No Spawn)", "Team DM (Spawn)", "Team DM (No Spawn)" }; @@ -57,8 +55,6 @@ int32_t g_tripbombRadius = 3880; int16_t weaponsandammosprites[15]; -char CheatKeys[2] = { sc_D, sc_N }; - TileInfo tileinfo[MAXTILES]; // This is not from EDuke32. END_DUKE_NS diff --git a/source/games/duke/src/zz_player.cpp b/source/games/duke/src/zz_player.cpp index 5125e8d89..b11153eb3 100644 --- a/source/games/duke/src/zz_player.cpp +++ b/source/games/duke/src/zz_player.cpp @@ -106,8 +106,6 @@ void P_GetInput(int const playerNum) localInput = {}; localInput.bits = (((int32_t)g_gameQuit) << SK_GAMEQUIT); - localInput.extbits |= (1 << 7); - return; } @@ -354,13 +352,6 @@ void P_GetInput(int const playerNum) else if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming)) input.fvel = 0; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Move_Forward) || (input.fvel > 0)); - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Move_Backward) || (input.fvel < 0)) << 1; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Strafe_Left) || (input.svel > 0)) << 2; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Strafe_Right) || (input.svel < 0)) << 3; - localInput.extbits |= buttonMap.ButtonDown(gamefunc_Turn_Left)<<4; - localInput.extbits |= buttonMap.ButtonDown(gamefunc_Turn_Right)<<5; - int const movementLocked = P_CheckLockedMovement(playerNum); if ((ud.scrollmode && ud.overhead_on) || (movementLocked & IL_NOTHING) == IL_NOTHING) @@ -465,8 +456,6 @@ void P_GetInputMotorcycle(int playerNum) localInput = {}; localInput.bits = (((int32_t)g_gameQuit) << SK_GAMEQUIT); - localInput.extbits |= (1 << 7); - return; } @@ -533,11 +522,6 @@ void P_GetInputMotorcycle(int playerNum) if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming)) input.fvel = 0; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Move_Forward) || (input.fvel > 0)); - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Move_Backward) || (input.fvel < 0)) << 1; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Strafe_Left) || (input.svel > 0)) << 2; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Strafe_Right) || (input.svel < 0)) << 3; - int turnAmount; int const turn = input.q16avel / 32; int turnLeft = buttonMap.ButtonDown(gamefunc_Turn_Left) || buttonMap.ButtonDown(gamefunc_Strafe_Left); @@ -671,8 +655,6 @@ void P_GetInputBoat(int playerNum) localInput = {}; localInput.bits = (((int32_t)g_gameQuit) << SK_GAMEQUIT); - localInput.extbits |= (1 << 7); - return; } @@ -739,11 +721,6 @@ void P_GetInputBoat(int playerNum) if (buttonMap.ButtonDown(gamefunc_Dpad_Aiming)) input.fvel = 0; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Move_Forward) || (input.fvel > 0)); - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Move_Backward) || (input.fvel < 0)) << 1; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Strafe_Left) || (input.svel > 0)) << 2; - localInput.extbits |= (buttonMap.ButtonDown(gamefunc_Strafe_Right) || (input.svel < 0)) << 3; - int turnAmount; int const turn = input.q16avel / 32; int turnLeft = buttonMap.ButtonDown(gamefunc_Turn_Left) || buttonMap.ButtonDown(gamefunc_Strafe_Left); diff --git a/source/games/duke/src/zz_premap.cpp b/source/games/duke/src/zz_premap.cpp index 7ffce2a96..fb92f510e 100644 --- a/source/games/duke/src/zz_premap.cpp +++ b/source/games/duke/src/zz_premap.cpp @@ -184,20 +184,6 @@ void G_ResetTimers(uint8_t keepgtics) actor[camsprite].t_data[0] = 0; } -void G_ClearFIFO(void) -{ - Net_ClearFIFO(); - - memset(&localInput, 0, sizeof(input_t)); - memset(&inputfifo, 0, sizeof(input_t) * MOVEFIFOSIZ * MAXPLAYERS); - - for (bsize_t p = 0; p <= MAXPLAYERS - 1; ++p) - { - if (g_player[p].input != NULL) - Bmemset(g_player[p].input, 0, sizeof(input_t)); - } -} - int G_FindLevelByFile(const char *fileName) { for (bssize_t volumeNum = 0; volumeNum < MAXVOLUMES; volumeNum++) @@ -444,7 +430,7 @@ int G_EnterLevel(int gameMode) ud.last_level = ud.level_number+1; - G_ClearFIFO(); + clearfifo(); for (i=numinterpolations-1; i>=0; i--) bakipos[i] = *curipos[i]; diff --git a/source/games/duke/src/zz_savegame.cpp b/source/games/duke/src/zz_savegame.cpp index d11b39d2a..dd100eb8c 100644 --- a/source/games/duke/src/zz_savegame.cpp +++ b/source/games/duke/src/zz_savegame.cpp @@ -1450,7 +1450,7 @@ static void postloadplayer(int32_t savegamep) if (savegamep) { ready2send = 1; - G_ClearFIFO(); + clearfifo(); Net_WaitForEverybody(); }