diff --git a/source/build/include/build.h b/source/build/include/build.h index 172874b1b..1294dbf80 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -74,7 +74,6 @@ enum rendmode_t { #define MAXVOXELS 1024 #define MAXSTATUS 1024 -#define MAXPLAYERS 16 // Maximum number of component tiles in a multi-psky: #define MAXPSKYTILES 16 #define MAXSPRITESONSCREEN 2560 diff --git a/source/core/d_net.h b/source/core/d_net.h index 75aa806a4..5b72f38ef 100644 --- a/source/core/d_net.h +++ b/source/core/d_net.h @@ -53,6 +53,8 @@ void Net_SkipCommand (int type, uint8_t **stream); void Net_ClearBuffers (); +bool D_CheckNetGame(void); + // Netgame stuff (buffers and pointers, i.e. indices). diff --git a/source/core/gamecontrol.cpp b/source/core/gamecontrol.cpp index bf19c2169..7728dc53c 100644 --- a/source/core/gamecontrol.cpp +++ b/source/core/gamecontrol.cpp @@ -69,6 +69,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "screenjob.h" #include "statusbar.h" #include "uiinput.h" +#include "d_net.h" CVAR(Bool, autoloadlights, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Bool, autoloadbrightmaps, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) @@ -100,6 +101,7 @@ int lastTic; int automapMode; bool automapFollow; +extern int pauseext; CCMD(togglemap) { @@ -137,6 +139,7 @@ void I_DetectOS(void); void LoadScripts(); void app_loop(); void DrawFullscreenBlends(); +void MainLoop(); bool AppActive; @@ -280,15 +283,6 @@ void UserConfig::ProcessOptions() Printf("Build-format config files not supported and will be ignored\n"); } -#if 0 // MP disabled pending evaluation - auto v = Args->CheckValue("-port"); - if (v) netPort = strtol(v, nullptr, 0); - - netServerMode = Args->CheckParm("-server"); - netServerAddress = Args->CheckValue("-connect"); - netPassword = Args->CheckValue("-password"); -#endif - auto v = Args->CheckValue("-addon"); if (v) { @@ -866,9 +860,9 @@ int RunGame() auto exec = C_ParseCmdLineParams(nullptr); if (exec) exec->ExecCommands(); - gamestate = GS_LEVEL; SetupGameButtons(); gi->app_init(); + app_loop(); return 0; // this is never reached. app_loop only exits via exception. } @@ -1150,6 +1144,15 @@ void S_SetSoundPaused(int state) } } } + if (!netgame +#if 0 //def _DEBUG + && !demoplayback +#endif + ) + { + pauseext = !state; + } + } FString G_GetDemoPath() diff --git a/source/core/mainloop.cpp b/source/core/mainloop.cpp index 9f09a73db..3848da8ba 100644 --- a/source/core/mainloop.cpp +++ b/source/core/mainloop.cpp @@ -98,6 +98,11 @@ int oldentertics; int gametic; +//========================================================================== +// +// +// +//========================================================================== void G_BuildTiccmd(ticcmd_t* cmd) { @@ -105,8 +110,13 @@ void G_BuildTiccmd(ticcmd_t* cmd) cmd->consistancy = consistancy[myconnectindex][(maketic / ticdup) % BACKUPTICS]; } +//========================================================================== +// +// +// +//========================================================================== -void G_Ticker() +static void GameTicker() { int i; @@ -116,11 +126,6 @@ void G_Ticker() // Todo: Migrate state changes to here instead of doing them ad-hoc while (gameaction != ga_nothing) { - if (gameaction == ga_newgame2) - { - gameaction = ga_newgame; - break; - } switch (gameaction) { } @@ -181,18 +186,15 @@ void G_Ticker() gi->Startup(); break; - case GS_MENUSCREEN: - case GS_FULLCONSOLE: - gi->DrawBackground(); - break; - case GS_LEVEL: gi->Ticker(); break; + case GS_MENUSCREEN: + case GS_FULLCONSOLE: case GS_INTERMISSION: case GS_INTRO: - RunScreenJobFrame(); + // These elements do not tick at game rate. break; } @@ -201,54 +203,65 @@ void G_Ticker() //========================================================================== // -// D_Display -// -// Draw current display, possibly wiping it from the previous +// Display // //========================================================================== -void D_Display() +void Display() { - FGameTexture* wipe = nullptr; - - if (screen == NULL) - return; // for comparative timing / profiling - - if (!AppActive && (screen->IsFullscreen() || !vid_activeinbackground)) + if (screen == nullptr || !AppActive && (screen->IsFullscreen() || !vid_activeinbackground)) { return; } screen->FrameTime = I_msTimeFS(); screen->BeginFrame(); + twodpsp.ClearClipRect(); twod->ClearClipRect(); - if ((gamestate == GS_LEVEL) && gametic != 0) + switch (gamestate) { - // [ZZ] execute event hook that we just started the frame - //E_RenderFrame(); - // - gi->Render(); + case GS_MENUSCREEN: + gi->DrawBackground(); + break; + + case GS_FINALE: + // screen jobs are not bound by the game ticker so they need to be ticked in the display loop. + RunScreenJobFrame(); + break; + + case GS_LEVEL: + if (gametic != 0) + { + gi->Render(); + DrawFullscreenBlends(); + } + break; + + default: + break; } - // Draw overlay elements to the 2D drawer NetUpdate(); // send out any new accumulation + + // Draw overlay elements CT_Drawer(); C_DrawConsole(); M_Drawer(); FStat::PrintStat(twod); - - // Handle the final 2D overlays. - if (gamestate == GS_LEVEL) DrawFullscreenBlends(); DrawRateStuff(); videoShowFrame(0); } +//========================================================================== +// // Forces playsim processing time to be consistent across frames. // This improves interpolation for frames in between tics. // // With this cvar off the mods with a high playsim processing time will appear // less smooth as the measured time used for interpolation will vary. +// +//========================================================================== static void TicStabilityWait() { @@ -280,9 +293,12 @@ static void TicStabilityEnd() stabilityticduration = std::min(stabilityendtime - stabilitystarttime, (uint64_t)1'000'000); } +//========================================================================== // -// TryRunTics +// The most important function in the engine. // +//========================================================================== + void TryRunTics (void) { int i; @@ -296,7 +312,7 @@ void TryRunTics (void) // will all be wasted anyway. if (pauseext) r_NoInterpolate = true; - bool doWait = cl_capfps || r_NoInterpolate /*|| netgame*/; + bool doWait = cl_capfps || r_NoInterpolate; // get real tics if (doWait) @@ -328,14 +344,7 @@ void TryRunTics (void) } } - if (ticdup == 1) - { - availabletics = lowtic - gametic; - } - else - { - availabletics = lowtic - gametic / ticdup; - } + availabletics = lowtic - gametic / ticdup; // decide how many tics to run if (realtics < availabletics-1) @@ -362,6 +371,7 @@ void TryRunTics (void) gi->Predict(myconnectindex); #endif } + gi->GetInput(nullptr); return; } @@ -431,10 +441,9 @@ void TryRunTics (void) D_DoAdvanceDemo (); } #endif - //if (debugfile) fprintf (debugfile, "run tic %d\n", gametic); C_Ticker (); M_Ticker (); - G_Ticker(); + GameTicker(); gametic++; NetUpdate (); // check for new console commands @@ -482,7 +491,7 @@ void MainLoop () // Update display, next frame, with current state. I_StartTic (); - D_Display(); + Display(); Mus_UpdateMusic(); // must be at the end. } catch (CRecoverableError &error) diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index 315422fcb..d44c2c4eb 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -59,6 +59,10 @@ struct GameInterface : public ::GameInterface void ResetFollowPos(bool message) override; void GetInput(InputPacket* packet) override; void UpdateSounds() override; + void Startup() override; + void DrawBackground() override; + void Render() override; + void Ticker() override; }; diff --git a/source/games/duke/src/gameloop.cpp b/source/games/duke/src/gameloop.cpp index 0920d59a6..c0500974b 100644 --- a/source/games/duke/src/gameloop.cpp +++ b/source/games/duke/src/gameloop.cpp @@ -400,6 +400,24 @@ static void Startup() // //--------------------------------------------------------------------------- +void GameInterface::Startup() +{ + +} +void GameInterface::DrawBackground() +{ + +} +void GameInterface::Render() +{ + +} +void GameInterface::Ticker() +{ + +} + + void GameInterface::RunGameFrame() { switch (gamestate) diff --git a/source/games/duke/src/global.h b/source/games/duke/src/global.h index 41768b54e..ac6b8f58a 100644 --- a/source/games/duke/src/global.h +++ b/source/games/duke/src/global.h @@ -8,6 +8,7 @@ #include "sounds.h" #include "constants.h" #include "types.h" +#include "d_net.h" BEGIN_DUKE_NS diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h index 7ab4ae0f8..685b7bcf0 100644 --- a/source/games/duke/src/types.h +++ b/source/games/duke/src/types.h @@ -1,6 +1,7 @@ #pragma once #include "names.h" #include "packet.h" +#include "d_net.h" BEGIN_DUKE_NS diff --git a/source/glbackend/glbackend.h b/source/glbackend/glbackend.h index 66b7f3dc0..ed91273a9 100644 --- a/source/glbackend/glbackend.h +++ b/source/glbackend/glbackend.h @@ -355,6 +355,7 @@ public: }; extern GLInstance GLInterface; +extern F2DDrawer twodpsp; void renderSetProjectionMatrix(const float* p); void renderSetViewMatrix(const float* p); diff --git a/source/sw/src/game.h b/source/sw/src/game.h index c7a1ec15c..cae06d40d 100644 --- a/source/sw/src/game.h +++ b/source/sw/src/game.h @@ -2057,7 +2057,6 @@ extern short numplayers, myconnectindex; extern short connecthead, connectpoint2[MAXPLAYERS]; */ extern int *lastpacket2clock; -extern char username[MAXPLAYERS][50]; // save player info when moving to a new level extern USER puser[MAX_SW_PLAYERS_REG];