diff --git a/src/command.cpp b/src/command.cpp index 12485062af..bbda7b491a 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -34,6 +34,7 @@ #include "debug_desync.h" #include "order_backup.h" #include +#include #include "table/strings.h" @@ -585,6 +586,12 @@ struct CommandLog { static CommandLog _command_log; static CommandLog _command_log_aux; +struct CommandQueueItem { + CommandContainer cmd; + CompanyID company; +}; +static std::deque _command_queue; + void ClearCommandLog() { _command_log.Reset(); @@ -973,6 +980,33 @@ CommandCost DoCommandPScript(TileIndex tile, uint32 p1, uint32 p2, uint64 p3, ui return res; } +void ExecuteCommandQueue() +{ + while (!_command_queue.empty()) { + Backup cur_company(_current_company, FILE_LINE); + cur_company.Change(_command_queue.front().company); + DoCommandP(&_command_queue.front().cmd); + cur_company.Restore(); + _command_queue.pop_front(); + } +} + +void ClearCommandQueue() +{ + _command_queue.clear(); +} + +void EnqueueDoCommandP(CommandContainer cmd) +{ + if (_docommand_recursive == 0) { + DoCommandP(&cmd); + } else { + CommandQueueItem &item = _command_queue.emplace_back(); + item.cmd = std::move(cmd); + item.company = _current_company; + } +} + /** * Helper to deduplicate the code for returning. diff --git a/src/command_func.h b/src/command_func.h index 62756b89e1..fd0446df00 100644 --- a/src/command_func.h +++ b/src/command_func.h @@ -85,6 +85,10 @@ static inline DoCommandFlag CommandFlagsToDCFlags(CommandFlags cmd_flags) void ClearCommandLog(); char *DumpCommandLog(char *buffer, const char *last); +void ExecuteCommandQueue(); +void ClearCommandQueue(); +void EnqueueDoCommandP(CommandContainer cmd); + /*** All command callbacks that exist ***/ /* ai/ai_instance.cpp */ diff --git a/src/misc.cpp b/src/misc.cpp index 225c8ecece..e512a17468 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -79,6 +79,7 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin ViewportMapClearTunnelCache(); ClearCommandLog(); + ClearCommandQueue(); ClearSpecialEventsLog(); ClearDesyncMsgLog(); diff --git a/src/openttd.cpp b/src/openttd.cpp index 5958e772a2..d2bbd96bbc 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -467,6 +467,7 @@ static void ShutdownGame() ClearVehicleTickCaches(); InvalidateTemplateReplacementImages(); ClearCommandLog(); + ClearCommandQueue(); ClearSpecialEventsLog(); ClearDesyncMsgLog(); @@ -2078,6 +2079,7 @@ void GameLoop() /* Singleplayer */ StateGameLoop(); } + ExecuteCommandQueue(); if (!_pause_mode && HasBit(_display_opt, DO_FULL_ANIMATION)) { extern std::mutex _cur_palette_mutex;