From ca23e8abcfcfd78c467813957a434b5a0169f6c7 Mon Sep 17 00:00:00 2001 From: dP Date: Fri, 5 Jun 2020 17:11:09 +0100 Subject: [PATCH] Add step console command to advance n ticks Cherry-picked from https://github.com/citymania-org/cmclient Commit: 5ce2d21223a96934a83b8da43434c7a81f001ef0 --- src/console_cmds.cpp | 14 ++++++++++++++ src/gfx.cpp | 1 + src/misc.cpp | 1 + src/misc_cmd.cpp | 3 ++- src/network/network.cpp | 1 + src/openttd.cpp | 6 ++++++ src/openttd.h | 1 + 7 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index c06b48f283..f7fd47016d 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -807,6 +807,19 @@ DEF_CONSOLE_CMD(ConUnpauseGame) return true; } +DEF_CONSOLE_CMD(ConStepGame) +{ + if (argc == 0 || argc > 2) { + IConsoleHelp("Advances the game for a certain amount of ticks (default 1). Usage: 'step [n]'"); + return true; + } + auto n = (argc > 1 ? atoi(argv[1]) : 1); + + DoCommandP(0, PM_PAUSED_NORMAL, 0 | (n << 1), CMD_PAUSE); + + return true; +} + DEF_CONSOLE_CMD(ConRcon) { if (argc == 0) { @@ -3651,6 +3664,7 @@ void IConsoleStdLibRegister() IConsole::CmdRegister("pause", ConPauseGame, ConHookServerOrNoNetwork); IConsole::CmdRegister("unpause", ConUnpauseGame, ConHookServerOrNoNetwork); + IConsole::CmdRegister("step", ConStepGame, ConHookNoNetwork); IConsole::CmdRegister("company_pw", ConCompanyPassword, ConHookNeedNetwork); IConsole::AliasRegister("company_password", "company_pw %+"); diff --git a/src/gfx.cpp b/src/gfx.cpp index 58613f4870..b91226bea2 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -53,6 +53,7 @@ std::atomic _exit_game; GameMode _game_mode; SwitchMode _switch_mode; ///< The next mainloop command. PauseMode _pause_mode; +uint32 _pause_countdown; Palette _cur_palette; std::mutex _cur_palette_mutex; std::string _switch_baseset; diff --git a/src/misc.cpp b/src/misc.cpp index 95b2bd873b..225c8ecece 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -83,6 +83,7 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin ClearDesyncMsgLog(); _pause_mode = PM_UNPAUSED; + _pause_countdown = 0; _game_speed = 100; _tick_counter = 0; _tick_skip_counter = 0; diff --git a/src/misc_cmd.cpp b/src/misc_cmd.cpp index be40234692..775809f4f8 100644 --- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -179,8 +179,9 @@ CommandCost CmdPause(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, } else { PauseMode prev_mode = _pause_mode; - if (p2 == 0) { + if ((p2 & 1) == 0) { _pause_mode = static_cast(_pause_mode & (byte)~p1); + _pause_countdown = (p2 >> 1); } else { _pause_mode = static_cast(_pause_mode | (byte)p1); } diff --git a/src/network/network.cpp b/src/network/network.cpp index 51c8ec3047..48f7fd991f 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1214,6 +1214,7 @@ void NetworkGameLoop() } NetworkExecuteLocalCommandQueue(); + if (_pause_countdown > 0 && --_pause_countdown == 0) DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE); /* Then we make the frame */ StateGameLoop(); diff --git a/src/openttd.cpp b/src/openttd.cpp index d6e19379d0..1a2d6d6bae 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -513,6 +513,7 @@ static void LoadIntroGame(bool load_newgrfs = true) FixTitleGameZoom(); _pause_mode = PM_UNPAUSED; + _pause_countdown = 0; _cursor.fix_at = false; CheckForMissingGlyphs(); @@ -1967,6 +1968,11 @@ void StateGameLoop() } if (_extra_aspects > 0) FlushDeferredAspectUpdates(); + if (_pause_countdown > 0 && --_pause_countdown == 0) { + _pause_mode = PM_PAUSED_NORMAL; + SetWindowDirty(WC_MAIN_TOOLBAR, 0); + } + assert(IsLocalCompany()); } diff --git a/src/openttd.h b/src/openttd.h index 0adf90a203..703f79973a 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -81,6 +81,7 @@ DECLARE_ENUM_AS_BIT_SET(PauseMode) /** The current pause mode */ extern PauseMode _pause_mode; +extern uint32 _pause_countdown; void AskExitGame(); void AskExitToGameMenu();