diff --git a/gen_commands.py b/gen_commands.py index 42095a7717..c82d20418a 100644 --- a/gen_commands.py +++ b/gen_commands.py @@ -1,4 +1,5 @@ import re +from pathlib import Path from pprint import pprint RX_COMMAND = re.compile(r'(?PCommandCost|std::tuple]*>) (?PCmd\w*)\((?P[^)]*)\);') @@ -6,31 +7,40 @@ RX_ARG = re.compile(r'(?P(:?const |)[\w:]* &?)(?P\w*)') RX_CAMEL_TO_SNAKE = re.compile(r'(?{an}' for _, an in args) f.write( - f'bool {name}::Post(bool automatic) {{\n' - f' return ::Command<{constant}>({args_list});\n' - '}\n\n' + f'bool {name}::DoPost() {{\n' + f' return ::Command<{constant}>::Post(this->error, this->tile, {args_list});\n' + '}\n' ) + f.write('\n') f.write( - '} // namaespace cmd\n' - '} // namaespace citymania\n' + '} // namespace cmd\n' + '} // namespace citymania\n' ) if __name__ == "__main__": diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index 6551ac2cbf..7fd1ca699c 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -460,7 +460,7 @@ public: /* strings such as 'Size' and 'Coverage Area' */ top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, false) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); top = DrawStationCoverageAreaText(r.left, r.right, top, SCT_ALL, rad, true) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); - top = DrawStationAuthorityText(panel_nwi->pos_x + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, top) + WD_PAR_VSEP_NORMAL; + top = DrawStationAuthorityText(r.left, r.right, top) + ScaleGUITrad(WD_PAR_VSEP_NORMAL); } /* Resize background if the window is too small. diff --git a/src/blitter/32bpp_anim_sse4.hpp b/src/blitter/32bpp_anim_sse4.hpp index 4b1e27a6cc..1005caebe0 100644 --- a/src/blitter/32bpp_anim_sse4.hpp +++ b/src/blitter/32bpp_anim_sse4.hpp @@ -40,7 +40,7 @@ public: void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom); void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom) override; Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) override { - return Blitter_32bppSSE_Base::Encode(sprite, allocator, this); + return Blitter_32bppSSE2::Encode(sprite, allocator); } const char *GetName() override { return "32bpp-sse4-anim"; } using Blitter_32bppSSE2_Anim::LookupColourInPalette; diff --git a/src/citymania/CMakeLists.txt b/src/citymania/CMakeLists.txt index 75ec6477fe..07302e560e 100644 --- a/src/citymania/CMakeLists.txt +++ b/src/citymania/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory(extensions) +add_subdirectory(generated) add_files( cm_bitstream.hpp diff --git a/src/citymania/cm_command_type.hpp b/src/citymania/cm_command_type.hpp new file mode 100644 index 0000000000..cdabe884fa --- /dev/null +++ b/src/citymania/cm_command_type.hpp @@ -0,0 +1,53 @@ +#ifndef CM_COMMAND_TYPE_HPP +#define CM_COMMAND_TYPE_HPP + +#include "../command_func.h" +#include "../misc_cmd.h" +#include "../object_type.h" +#include "../order_type.h" + +namespace citymania { + +class Command { +public: + TileIndex tile = 0; + bool automatic = false; + CompanyID as_company = INVALID_COMPANY; + StringID error = (StringID)0; + + virtual ~Command() {} + virtual bool DoPost()=0; + + bool Post() { + CompanyID old = _current_company; + if (this->as_company != INVALID_COMPANY) + _current_company = as_company; + bool res = this->DoPost(); + _current_company = old; + return res; + } + + Command &WithTile(TileIndex tile) { + this->tile = tile; + return *this; + } + + Command &WithError(StringID error) { + this->error = error; + return *this; + } + + Command &SetAuto() { + this->automatic = true; + return *this; + } + + Command &AsCompany(CompanyID company) { + this->as_company = company; + return *this; + } +}; + +} // namaespace citymania + +#endif diff --git a/src/citymania/cm_commands.cpp b/src/citymania/cm_commands.cpp index 10ec2ba50b..4baad0176c 100644 --- a/src/citymania/cm_commands.cpp +++ b/src/citymania/cm_commands.cpp @@ -29,7 +29,7 @@ size_t GetCommandHash(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, const st hash_combine(res, tile, p1, p2, cmd, text); return res; } - +/* void AddCommandCallback(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, const std::string &text, CommandCallback callback) { if (!_networking) { callback(true); @@ -56,7 +56,7 @@ bool DoCommandWithCallback(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, ::C bool DoCommandWithCallback(const CommandContainer &cc, CommandCallback callback) { return DoCommandWithCallback(cc.tile, cc.p1, cc.p2, cc.cmd, cc.callback, cc.text, callback); } - +*/ void HandleCommandExecution(bool res, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, const std::string &text) { auto hash = GetCommandHash(tile, p1, p2, cmd & CMD_ID_MASK, text); auto p = _command_callbacks.find(hash); @@ -109,14 +109,33 @@ void HandleNextClientFrame() { ClearOldCallbacks(); } -void SendClientCommand(const CommandPacket *cp) { +/*void SendClientCommand(const CommandPacket *cp) { if (_outgoing_queue.empty() && CanSendCommand()) { MyClient::SendCommand(cp); _commands_this_frame++; return; } _outgoing_queue.push(*cp); +}*/ + + +namespace cmd { + +bool Pause::Post(bool automati) { + return ::Command::Post(this->mode, this->pause); } +bool DoTownAction::Post(bool automatic) { + return ::Command::Post(this->town_id, this->town_action); +} + +bool SkipToOrder::Post(bool automatic) { + return ::Command::Post( + this->veh_id, this->sel_ord + _ctrl_pressed ? STR_ERROR_CAN_T_SKIP_TO_ORDER : STR_ERROR_CAN_T_SKIP_ORDER, + this->vehicle->tile, this->vehicle->index, citymania::_fn_mod ? this->OrderGetSel() : ((this->vehicle->cur_implicit_order_index + 1) % this->vehicle->GetNumOrders())); +} + +} // namespace cmd } // namespace citymania diff --git a/src/citymania/cm_commands.hpp b/src/citymania/cm_commands.hpp index 8ba8d2ec05..d6dc226f36 100644 --- a/src/citymania/cm_commands.hpp +++ b/src/citymania/cm_commands.hpp @@ -5,17 +5,19 @@ #include "../tile_type.h" #include "../network/network_internal.h" +#include "generated/cm_gen_commands.hpp" + namespace citymania { typedef std::function CommandCallback; -void AddCommandCallback(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, const std::string &text, CommandCallback callback); -bool DoCommandWithCallback(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, ::CommandCallback *callback, const std::string &text, CommandCallback cm_callback); -bool DoCommandWithCallback(const CommandContainer &cc, CommandCallback callback); +// void AddCommandCallback(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, const std::string &text, CommandCallback callback); +// bool DoCommandWithCallback(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, ::CommandCallback *callback, const std::string &text, CommandCallback cm_callback); +// bool DoCommandWithCallback(const CommandContainer &cc, CommandCallback callback); void HandleCommandExecution(bool res, TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, const std::string &text); void InitCommandQueue(); void HandleNextClientFrame(); -void SendClientCommand(const CommandPacket *cp); +// void SendClientCommand(const CommandPacket *cp); } // namespace citymania diff --git a/src/citymania/cm_console_cmds.cpp b/src/citymania/cm_console_cmds.cpp index a66e996adc..a771ec19c6 100644 --- a/src/citymania/cm_console_cmds.cpp +++ b/src/citymania/cm_console_cmds.cpp @@ -2,6 +2,7 @@ #include "cm_console_cmds.hpp" +#include "cm_commands.hpp" #include "cm_export.hpp" #include "../command_func.h" @@ -53,7 +54,8 @@ bool ConStep(byte argc, char *argv[]) { } auto n = (argc > 1 ? atoi(argv[1]) : 1); - DoCommandP(0, PM_PAUSED_NORMAL, 0 | (n << 1), CMD_PAUSE); + // FIXME (n << 1) + cmd::Pause(PM_PAUSED_NORMAL, 0).Post(); return true; } @@ -123,7 +125,8 @@ bool ConTreeMap(byte argc, char *argv[]) { auto tree_count = std::min(t / 51, 4); // auto tree_growth = (uint)(t % 51) * 7 / 50; for (auto i = 0; i < tree_count; i++) { - DoCommand(tile, TREE_INVALID, tile, DC_EXEC, CMD_PLANT_TREE); + // FIXME +// DoCommand(tile, TREE_INVALID, tile, DC_EXEC, CMD_PLANT_TREE); } } @@ -200,7 +203,8 @@ void ExecuteFakeCommands(Date date, DateFract date_fract) { while (!_fake_commands.empty() && !DatePredate(date, date_fract, _fake_commands.front().date, _fake_commands.front().date_fract)) { auto &x = _fake_commands.front(); - fprintf(stderr, "Executing command: company=%u cmd=%u(%s) tile=%u p1=%u p2=%u text=%s ... ", x.company_id, x.cmd, GetCommandName(x.cmd), x.tile, x.p1, x.p2, x.text.c_str()); + // FIXME + // fprintf(stderr, "Executing command: company=%u cmd=%u(%s) tile=%u p1=%u p2=%u text=%s ... ", x.company_id, x.cmd, GetCommandName(x.cmd), x.tile, x.p1, x.p2, x.text.c_str()); if (x.res == 0) { fprintf(stderr, "REJECTED\n"); _fake_commands.pop(); @@ -208,6 +212,7 @@ void ExecuteFakeCommands(Date date, DateFract date_fract) { } if (_networking) { + /* FIXME CommandPacket cp; cp.tile = x.tile; cp.p1 = x.p1; @@ -223,9 +228,10 @@ void ExecuteFakeCommands(Date date, DateFract date_fract) { if (cs->status >= NetworkClientSocket::STATUS_MAP) { cs->outgoing_queue.Append(&cp); } - } + }*/ } _current_company = (CompanyID)x.company_id; + /* FIXME auto res = DoCommandPInternal(x.tile, x.p1, x.p2, x.cmd | CMD_NETWORK_COMMAND, nullptr, x.text.c_str(), false, false); if (res.Failed() != (x.res != 1)) { if (!res.Failed()) { @@ -242,7 +248,7 @@ void ExecuteFakeCommands(Date date, DateFract date_fract) { } if (x.seed != (_random.state[0] & 255)) { fprintf(stderr, "*** DESYNC expected seed %u vs current %u ***\n", x.seed, _random.state[0] & 255); - } + }*/ _fake_commands.pop(); } _current_company = backup_company; @@ -273,7 +279,7 @@ void LoadCommands(const std::string &filename) { while(std::getline(file, str)) { std::istringstream ss(str); FakeCommand cmd; - ss >> cmd.date >> cmd.date_fract >> cmd.res >> cmd.seed >> cmd.company_id >> cmd.cmd >> cmd.tile >> cmd.p1 >> cmd.p2; + // FIXME ss >> cmd.date >> cmd.date_fract >> cmd.res >> cmd.seed >> cmd.company_id >> cmd.cmd >> cmd.tile >> cmd.p1 >> cmd.p2; std::string s; ss.get(); std::getline(ss, cmd.text); diff --git a/src/citymania/cm_export.cpp b/src/citymania/cm_export.cpp index 0ac0d636a8..8a187b771b 100644 --- a/src/citymania/cm_export.cpp +++ b/src/citymania/cm_export.cpp @@ -15,7 +15,7 @@ #include "../strings_type.h" #include "../table/palettes.h" #include "../table/sprites.h" -#include "../table/train_cmd.h" +#include "../table/train_sprites.h" #include "../viewport_sprite_sorter.h" #include "../viewport_type.h" #include "../window_func.h" diff --git a/src/citymania/cm_highlight_type.hpp b/src/citymania/cm_highlight_type.hpp index 2afede1ac8..bd6e84b6bb 100644 --- a/src/citymania/cm_highlight_type.hpp +++ b/src/citymania/cm_highlight_type.hpp @@ -19,6 +19,19 @@ namespace citymania { +class TileIndexWrapper { +public: + TileIndex tile; + TileIndexWrapper() {} + TileIndexWrapper(TileIndex tile) + :tile{tile} {} + + inline operator TileIndex () const + { + return this->tile; + } +}; + class ObjectTileHighlight { public: enum class Type { @@ -31,6 +44,7 @@ public: RAIL_TUNNEL_HEAD, ROAD_STOP, ROAD_DEPOT, + AIRPORT_TILE, POINT, NUMBERED_RECT, @@ -57,7 +71,7 @@ public: } signal; struct { DiagDirection ddir; - TileIndex other_end; + TileIndexWrapper other_end; BridgeType type; } bridge_head; struct { diff --git a/src/citymania/cm_station_gui.cpp b/src/citymania/cm_station_gui.cpp index f10750fb50..c765a7a165 100644 --- a/src/citymania/cm_station_gui.cpp +++ b/src/citymania/cm_station_gui.cpp @@ -202,25 +202,18 @@ bool CheckStationJoin(TileIndex start_tile, TileIndex end_tile) { return false; } -void JoinAndBuild(CommandContainer cmdcont) { - auto join_to = _highlight_station_to_join; - uint32 adj_bit = ((citymania::_fn_mod || join_to) ? 1 : 0); - auto cmd = (cmdcont.cmd & CMD_ID_MASK); - if (cmd == CMD_BUILD_RAIL_STATION) { - SB(cmdcont.p1, 24, 1, adj_bit); - } else if (cmd == CMD_BUILD_ROAD_STOP) { - SB(cmdcont.p2, 2, 1, adj_bit); - } else if (cmd == CMD_BUILD_DOCK) { - SB(cmdcont.p1, 0, 1, adj_bit); - } else if (cmd == CMD_BUILD_AIRPORT) { - SB(cmdcont.p2, 0, 1, adj_bit); - } - if (citymania::_fn_mod) SB(cmdcont.p2, 16, 16, NEW_STATION); - else if (join_to) SB(cmdcont.p2, 16, 16, join_to->index); - else SB(cmdcont.p2, 16, 16, INVALID_STATION); +using JoinAndBuildCmdProc = std::function; - _last_station_bulid_cmd = cmdcont; - DoCommandP(&cmdcont); +void JoinAndBuild(JoinAndBuildCmdProc proc) { + auto join_to = _highlight_station_to_join; + bool adjacent = (citymania::_fn_mod || join_to); + StationID to_join = INVALID_STATION; + + if (citymania::_fn_mod) to_join = NEW_STATION; + else if (join_to) to_join = join_to->index; + + FIXME _last_station_bulid_cmd = cmdcont; + proc(false, to_join, adjacent); } static DiagDirection TileFractCoordsToDiagDir(Point pt) { @@ -412,16 +405,22 @@ void PlaceDock(TileIndex tile) { } void PlaceAirport(TileIndex tile) { + FIXME if (CheckStationJoin(tile, tile)) return; if (_selected_airport_index == -1) return; - uint32 p2 = (citymania::_fn_mod ? 1 : 0); - SB(p2, 16, 16, INVALID_STATION); // no station to join + byte airport_type = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index)->GetIndex(); + byte layout = _selected_airport_layout; + + auto proc = [=](bool test, StationID to_join, bool adjacent) -> bool { + if (test) { + return Command::Do(CommandFlagsToDCFlags(GetCommandFlags()), tile, airport_type, layout, INVALID_STATION, adjacent).Succeeded(); + } else { + return Command::Post(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE, CcBuildAirport, tile, airport_type, layout, to_join, adjacent); + } + }; - uint32 p1 = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index)->GetIndex(); - p1 |= _selected_airport_layout << 8; - CommandContainer cmdcont = { tile, p1, p2, CMD_BUILD_AIRPORT | CMD_MSG(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE), CcBuildAirport, "" }; JoinAndBuild(cmdcont); } diff --git a/src/citymania/cm_watch_gui.cpp b/src/citymania/cm_watch_gui.cpp index 1079b78910..eef78740e4 100644 --- a/src/citymania/cm_watch_gui.cpp +++ b/src/citymania/cm_watch_gui.cpp @@ -701,4 +701,22 @@ void ShowWatchWindow(CompanyID company_to_watch = INVALID_COMPANY, int type = EW } } +void UpdateWatching(CompanyID company, TileIndex tile) { + /* Send Tile Number to Watching Company Windows */ + WatchCompany *wc; + for(int watching_window = 0; ; watching_window++){ + wc = dynamic_cast(FindWindowById(WC_WATCH_COMPANY, watching_window)); + if(wc != NULL) wc->OnDoCommand(_current_company, tile); + else break; + } + + for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { + if (ci->client_playas == _current_company) { + wc = dynamic_cast(FindWindowById(WC_WATCH_COMPANYA, ci->client_id)); + if (wc != NULL) wc->OnDoCommand(_current_company, tile); + break; + } + } +} + } // namespace citymania diff --git a/src/citymania/cm_watch_gui.hpp b/src/citymania/cm_watch_gui.hpp index 1dc547871b..16926bc649 100644 --- a/src/citymania/cm_watch_gui.hpp +++ b/src/citymania/cm_watch_gui.hpp @@ -91,6 +91,7 @@ public: }; void ShowWatchWindow(CompanyID company_to_watch, int type); +void UpdateWatching(CompanyID company, TileIndex tile); } // namespace citymania diff --git a/src/citymania/generated/cm_gen_commands.cpp b/src/citymania/generated/cm_gen_commands.cpp index a305c75122..7b09faf0ca 100644 --- a/src/citymania/generated/cm_gen_commands.cpp +++ b/src/citymania/generated/cm_gen_commands.cpp @@ -1,76 +1,109 @@ // This file is generated by gen_commands.py, do not edit -#include "cm_gen_commands.cpp" +#include "../../stdafx.h" +#include "cm_gen_commands.hpp" +#include "../../src/misc_cmd.h" +#include "../../src/object_cmd.h" +#include "../../src/order_cmd.h" +#include "../../src/town_cmd.h" namespace citymania { namespace cmd { -bool ModifyOrder::Post(bool automatic) { - return ::Command(this->flags, this->veh, this->sel_ord, this->mof, this->data); +bool MoneyCheat::DoPost() { + return ::Command::Post(this->error, this->tile, this->amount); } -bool SkipToOrder::Post(bool automatic) { - return ::Command(this->flags, this->veh_id, this->sel_ord); +bool ChangeBankBalance::DoPost() { + return ::Command::Post(this->error, this->tile, this->delta, this->company, this->expenses_type); } -bool DeleteOrder::Post(bool automatic) { - return ::Command(this->flags, this->veh_id, this->sel_ord); +bool IncreaseLoan::DoPost() { + return ::Command::Post(this->error, this->tile, this->cmd, this->amount); } -bool InsertOrder::Post(bool automatic) { - return ::Command(this->flags, this->veh, this->sel_ord, this->new_order); +bool DecreaseLoan::DoPost() { + return ::Command::Post(this->error, this->tile, this->cmd, this->amount); } -bool OrderRefit::Post(bool automatic) { - return ::Command(this->flags, this->veh, this->order_number, this->cargo); +bool Pause::DoPost() { + return ::Command::Post(this->error, this->tile, this->mode, this->pause); } -bool CloneOrder::Post(bool automatic) { - return ::Command(this->flags, this->action, this->veh_dst, this->veh_src); +bool BuildObject::DoPost() { + return ::Command::Post(this->error, this->tile, this->type, this->view); } -bool MoveOrder::Post(bool automatic) { - return ::Command(this->flags, this->veh, this->moving_order, this->target_order); +bool BuildObjectArea::DoPost() { + return ::Command::Post(this->error, this->tile, this->start_tile, this->type, this->view, this->diagonal); } -bool ClearOrderBackup::Post(bool automatic) { - return ::Command(this->flags, this->tile, this->user_id); +bool ModifyOrder::DoPost() { + return ::Command::Post(this->error, this->tile, this->veh, this->sel_ord, this->mof, this->data); } -bool CreateStoryPage::Post(bool automatic) { - return ::Command(this->flags, this->company, this->text); +bool SkipToOrder::DoPost() { + return ::Command::Post(this->error, this->tile, this->veh_id, this->sel_ord); } -bool CreateStoryPageElement::Post(bool automatic) { - return ::Command(this->flags, this->tile, this->page_id, this->type, this->reference, this->text); +bool DeleteOrder::DoPost() { + return ::Command::Post(this->error, this->tile, this->veh_id, this->sel_ord); } -bool UpdateStoryPageElement::Post(bool automatic) { - return ::Command(this->flags, this->tile, this->page_element_id, this->reference, this->text); +bool InsertOrder::DoPost() { + return ::Command::Post(this->error, this->tile, this->veh, this->sel_ord, this->new_order); } -bool SetStoryPageTitle::Post(bool automatic) { - return ::Command(this->flags, this->page_id, this->text); +bool OrderRefit::DoPost() { + return ::Command::Post(this->error, this->tile, this->veh, this->order_number, this->cargo); } -bool SetStoryPageDate::Post(bool automatic) { - return ::Command(this->flags, this->page_id, this->date); +bool CloneOrder::DoPost() { + return ::Command::Post(this->error, this->tile, this->action, this->veh_dst, this->veh_src); } -bool ShowStoryPage::Post(bool automatic) { - return ::Command(this->flags, this->page_id); +bool MoveOrder::DoPost() { + return ::Command::Post(this->error, this->tile, this->veh, this->moving_order, this->target_order); } -bool RemoveStoryPage::Post(bool automatic) { - return ::Command(this->flags, this->page_id); +bool ClearOrderBackup::DoPost() { + return ::Command::Post(this->error, this->tile, this->user_id); } -bool RemoveStoryPageElement::Post(bool automatic) { - return ::Command(this->flags, this->page_element_id); +bool FoundTown::DoPost() { + return ::Command::Post(this->error, this->tile, this->size, this->city, this->layout, this->random_location, this->townnameparts, this->text); } -bool StoryPageButton::Post(bool automatic) { - return ::Command(this->flags, this->tile, this->page_element_id, this->reference); +bool RenameTown::DoPost() { + return ::Command::Post(this->error, this->tile, this->town_id, this->text); } -} // namaespace cmd -} // namaespace citymania +bool DoTownAction::DoPost() { + return ::Command::Post(this->error, this->tile, this->town_id, this->action); +} + +bool TownGrowthRate::DoPost() { + return ::Command::Post(this->error, this->tile, this->town_id, this->growth_rate); +} + +bool TownRating::DoPost() { + return ::Command::Post(this->error, this->tile, this->town_id, this->company_id, this->rating); +} + +bool TownCargoGoal::DoPost() { + return ::Command::Post(this->error, this->tile, this->town_id, this->te, this->goal); +} + +bool TownSetText::DoPost() { + return ::Command::Post(this->error, this->tile, this->town_id, this->text); +} + +bool ExpandTown::DoPost() { + return ::Command::Post(this->error, this->tile, this->town_id, this->grow_amount); +} + +bool DeleteTown::DoPost() { + return ::Command::Post(this->error, this->tile, this->town_id); +} + +} // namespace cmd +} // namespace citymania diff --git a/src/citymania/generated/cm_gen_commands.hpp b/src/citymania/generated/cm_gen_commands.hpp index c926a3dfcd..d28fb6f917 100644 --- a/src/citymania/generated/cm_gen_commands.hpp +++ b/src/citymania/generated/cm_gen_commands.hpp @@ -1,221 +1,311 @@ // This file is generated by gen_commands.py, do not edit +#ifndef CM_GEN_COMMANDS_HPP +#define CM_GEN_COMMANDS_HPP #include "../cm_command_type.hpp" namespace citymania { namespace cmd { +class MoneyCheat: public Command { +public: + Money amount; + + MoneyCheat(Money amount) + :amount{amount} {} + ~MoneyCheat() override {} + + bool DoPost() override; +}; + +class ChangeBankBalance: public Command { +public: + Money delta; + CompanyID company; + ExpensesType expenses_type; + + ChangeBankBalance(Money delta, CompanyID company, ExpensesType expenses_type) + :delta{delta}, company{company}, expenses_type{expenses_type} {} + ~ChangeBankBalance() override {} + + bool DoPost() override; +}; + +class IncreaseLoan: public Command { +public: + LoanCommand cmd; + Money amount; + + IncreaseLoan(LoanCommand cmd, Money amount) + :cmd{cmd}, amount{amount} {} + ~IncreaseLoan() override {} + + bool DoPost() override; +}; + +class DecreaseLoan: public Command { +public: + LoanCommand cmd; + Money amount; + + DecreaseLoan(LoanCommand cmd, Money amount) + :cmd{cmd}, amount{amount} {} + ~DecreaseLoan() override {} + + bool DoPost() override; +}; + +class Pause: public Command { +public: + PauseMode mode; + bool pause; + + Pause(PauseMode mode, bool pause) + :mode{mode}, pause{pause} {} + ~Pause() override {} + + bool DoPost() override; +}; + +class BuildObject: public Command { +public: + ObjectType type; + uint8 view; + + BuildObject(ObjectType type, uint8 view) + :type{type}, view{view} {} + ~BuildObject() override {} + + bool DoPost() override; +}; + +class BuildObjectArea: public Command { +public: + TileIndex start_tile; + ObjectType type; + uint8 view; + bool diagonal; + + BuildObjectArea(TileIndex start_tile, ObjectType type, uint8 view, bool diagonal) + :start_tile{start_tile}, type{type}, view{view}, diagonal{diagonal} {} + ~BuildObjectArea() override {} + + bool DoPost() override; +}; + class ModifyOrder: public Command { public: - DoCommandFlag flags; - VehicleID veh; - VehicleOrderID sel_ord; - ModifyOrderFlags mof; - uint16 data; + VehicleID veh; + VehicleOrderID sel_ord; + ModifyOrderFlags mof; + uint16 data; - ModifyOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID sel_ord, ModifyOrderFlags mof, uint16 data) - :flags{flags}, veh{veh}, sel_ord{sel_ord}, mof{mof}, data{data} {} + ModifyOrder(VehicleID veh, VehicleOrderID sel_ord, ModifyOrderFlags mof, uint16 data) + :veh{veh}, sel_ord{sel_ord}, mof{mof}, data{data} {} + ~ModifyOrder() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; class SkipToOrder: public Command { public: - DoCommandFlag flags; - VehicleID veh_id; - VehicleOrderID sel_ord; + VehicleID veh_id; + VehicleOrderID sel_ord; - SkipToOrder(DoCommandFlag flags, VehicleID veh_id, VehicleOrderID sel_ord) - :flags{flags}, veh_id{veh_id}, sel_ord{sel_ord} {} + SkipToOrder(VehicleID veh_id, VehicleOrderID sel_ord) + :veh_id{veh_id}, sel_ord{sel_ord} {} + ~SkipToOrder() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; class DeleteOrder: public Command { public: - DoCommandFlag flags; - VehicleID veh_id; - VehicleOrderID sel_ord; + VehicleID veh_id; + VehicleOrderID sel_ord; - DeleteOrder(DoCommandFlag flags, VehicleID veh_id, VehicleOrderID sel_ord) - :flags{flags}, veh_id{veh_id}, sel_ord{sel_ord} {} + DeleteOrder(VehicleID veh_id, VehicleOrderID sel_ord) + :veh_id{veh_id}, sel_ord{sel_ord} {} + ~DeleteOrder() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; class InsertOrder: public Command { public: - DoCommandFlag flags; - VehicleID veh; - VehicleOrderID sel_ord; - const Order & new_order; + VehicleID veh; + VehicleOrderID sel_ord; + const Order &new_order; - InsertOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID sel_ord, const Order & new_order) - :flags{flags}, veh{veh}, sel_ord{sel_ord}, new_order{new_order} {} + InsertOrder(VehicleID veh, VehicleOrderID sel_ord, const Order & new_order) + :veh{veh}, sel_ord{sel_ord}, new_order{new_order} {} + ~InsertOrder() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; class OrderRefit: public Command { public: - DoCommandFlag flags; - VehicleID veh; - VehicleOrderID order_number; - CargoID cargo; + VehicleID veh; + VehicleOrderID order_number; + CargoID cargo; - OrderRefit(DoCommandFlag flags, VehicleID veh, VehicleOrderID order_number, CargoID cargo) - :flags{flags}, veh{veh}, order_number{order_number}, cargo{cargo} {} + OrderRefit(VehicleID veh, VehicleOrderID order_number, CargoID cargo) + :veh{veh}, order_number{order_number}, cargo{cargo} {} + ~OrderRefit() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; class CloneOrder: public Command { public: - DoCommandFlag flags; - CloneOptions action; - VehicleID veh_dst; - VehicleID veh_src; + CloneOptions action; + VehicleID veh_dst; + VehicleID veh_src; - CloneOrder(DoCommandFlag flags, CloneOptions action, VehicleID veh_dst, VehicleID veh_src) - :flags{flags}, action{action}, veh_dst{veh_dst}, veh_src{veh_src} {} + CloneOrder(CloneOptions action, VehicleID veh_dst, VehicleID veh_src) + :action{action}, veh_dst{veh_dst}, veh_src{veh_src} {} + ~CloneOrder() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; class MoveOrder: public Command { public: - DoCommandFlag flags; - VehicleID veh; - VehicleOrderID moving_order; - VehicleOrderID target_order; + VehicleID veh; + VehicleOrderID moving_order; + VehicleOrderID target_order; - MoveOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID moving_order, VehicleOrderID target_order) - :flags{flags}, veh{veh}, moving_order{moving_order}, target_order{target_order} {} + MoveOrder(VehicleID veh, VehicleOrderID moving_order, VehicleOrderID target_order) + :veh{veh}, moving_order{moving_order}, target_order{target_order} {} + ~MoveOrder() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; class ClearOrderBackup: public Command { public: - DoCommandFlag flags; - TileIndex tile; - ClientID user_id; + ClientID user_id; - ClearOrderBackup(DoCommandFlag flags, TileIndex tile, ClientID user_id) - :flags{flags}, tile{tile}, user_id{user_id} {} + ClearOrderBackup(ClientID user_id) + :user_id{user_id} {} + ~ClearOrderBackup() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class CreateStoryPage: public Command { +class FoundTown: public Command { public: - DoCommandFlag flags; - CompanyID company; - const std::string & text; + TownSize size; + bool city; + TownLayout layout; + bool random_location; + uint32 townnameparts; + const std::string &text; - CreateStoryPage(DoCommandFlag flags, CompanyID company, const std::string & text) - :flags{flags}, company{company}, text{text} {} + FoundTown(TownSize size, bool city, TownLayout layout, bool random_location, uint32 townnameparts, const std::string & text) + :size{size}, city{city}, layout{layout}, random_location{random_location}, townnameparts{townnameparts}, text{text} {} + ~FoundTown() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class CreateStoryPageElement: public Command { +class RenameTown: public Command { public: - DoCommandFlag flags; - TileIndex tile; - StoryPageID page_id; - StoryPageElementType type; - uint32 reference; - const std::string & text; + TownID town_id; + const std::string &text; - CreateStoryPageElement(DoCommandFlag flags, TileIndex tile, StoryPageID page_id, StoryPageElementType type, uint32 reference, const std::string & text) - :flags{flags}, tile{tile}, page_id{page_id}, type{type}, reference{reference}, text{text} {} + RenameTown(TownID town_id, const std::string & text) + :town_id{town_id}, text{text} {} + ~RenameTown() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class UpdateStoryPageElement: public Command { +class DoTownAction: public Command { public: - DoCommandFlag flags; - TileIndex tile; - StoryPageElementID page_element_id; - uint32 reference; - const std::string & text; + TownID town_id; + uint8 action; - UpdateStoryPageElement(DoCommandFlag flags, TileIndex tile, StoryPageElementID page_element_id, uint32 reference, const std::string & text) - :flags{flags}, tile{tile}, page_element_id{page_element_id}, reference{reference}, text{text} {} + DoTownAction(TownID town_id, uint8 action) + :town_id{town_id}, action{action} {} + ~DoTownAction() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class SetStoryPageTitle: public Command { +class TownGrowthRate: public Command { public: - DoCommandFlag flags; - StoryPageID page_id; - const std::string & text; + TownID town_id; + uint16 growth_rate; - SetStoryPageTitle(DoCommandFlag flags, StoryPageID page_id, const std::string & text) - :flags{flags}, page_id{page_id}, text{text} {} + TownGrowthRate(TownID town_id, uint16 growth_rate) + :town_id{town_id}, growth_rate{growth_rate} {} + ~TownGrowthRate() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class SetStoryPageDate: public Command { +class TownRating: public Command { public: - DoCommandFlag flags; - StoryPageID page_id; - Date date; + TownID town_id; + CompanyID company_id; + int16 rating; - SetStoryPageDate(DoCommandFlag flags, StoryPageID page_id, Date date) - :flags{flags}, page_id{page_id}, date{date} {} + TownRating(TownID town_id, CompanyID company_id, int16 rating) + :town_id{town_id}, company_id{company_id}, rating{rating} {} + ~TownRating() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class ShowStoryPage: public Command { +class TownCargoGoal: public Command { public: - DoCommandFlag flags; - StoryPageID page_id; + TownID town_id; + TownEffect te; + uint32 goal; - ShowStoryPage(DoCommandFlag flags, StoryPageID page_id) - :flags{flags}, page_id{page_id} {} + TownCargoGoal(TownID town_id, TownEffect te, uint32 goal) + :town_id{town_id}, te{te}, goal{goal} {} + ~TownCargoGoal() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class RemoveStoryPage: public Command { +class TownSetText: public Command { public: - DoCommandFlag flags; - StoryPageID page_id; + TownID town_id; + const std::string &text; - RemoveStoryPage(DoCommandFlag flags, StoryPageID page_id) - :flags{flags}, page_id{page_id} {} + TownSetText(TownID town_id, const std::string & text) + :town_id{town_id}, text{text} {} + ~TownSetText() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class RemoveStoryPageElement: public Command { +class ExpandTown: public Command { public: - DoCommandFlag flags; - StoryPageElementID page_element_id; + TownID town_id; + uint32 grow_amount; - RemoveStoryPageElement(DoCommandFlag flags, StoryPageElementID page_element_id) - :flags{flags}, page_element_id{page_element_id} {} + ExpandTown(TownID town_id, uint32 grow_amount) + :town_id{town_id}, grow_amount{grow_amount} {} + ~ExpandTown() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -class StoryPageButton: public Command { +class DeleteTown: public Command { public: - DoCommandFlag flags; - TileIndex tile; - StoryPageElementID page_element_id; - VehicleID reference; + TownID town_id; - StoryPageButton(DoCommandFlag flags, TileIndex tile, StoryPageElementID page_element_id, VehicleID reference) - :flags{flags}, tile{tile}, page_element_id{page_element_id}, reference{reference} {} + DeleteTown(TownID town_id) + :town_id{town_id} {} + ~DeleteTown() override {} - bool Post(bool automatic=False); + bool DoPost() override; }; -} // namaespace cmd -} // namaespace citymania +} // namespace cmd +} // namespace citymania +#endif diff --git a/src/command.cpp b/src/command.cpp index 5ef60b2f37..24fab14367 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -261,7 +261,7 @@ void CommandHelperBase::InternalPostResult(const CommandCost &res, TileIndex til int x = TileX(tile) * TILE_SIZE; int y = TileY(tile) * TILE_SIZE; - FIXME if (!(cmd & CMD_NO_ESTIMATE) && my_cmd) citymania::CountEffectiveAction(); + // FIXME if (!(cmd & CMD_NO_ESTIMATE) && my_cmd) citymania::CountEffectiveAction(); if (res.Failed()) { /* Only show the error when it's for us. */ @@ -412,22 +412,7 @@ CommandCost CommandHelperBase::InternalExecuteProcessResult(Commands cmd, Comman if (c != nullptr) c->last_build_coordinate = tile; } - FIXME - /* Send Tile Number to Watching Company Windows */ - citymania::WatchCompany *wc; - for(int watching_window = 0; ; watching_window++){ - wc = dynamic_cast(FindWindowById(WC_WATCH_COMPANY, watching_window)); - if(wc != NULL) wc->OnDoCommand(_current_company, tile); - else break; - } - - for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - if (ci->client_playas == _current_company) { - wc = dynamic_cast(FindWindowById(WC_WATCH_COMPANYA, ci->client_id)); - if (wc != NULL) wc->OnDoCommand(_current_company, tile); - break; - } - } + citymania::UpdateWatching(_current_company, tile); SubtractMoneyFromCompany(res_exec); diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 6ef94564b0..4f682f156b 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -881,11 +881,13 @@ struct DepotWindow : Window { */ bool OnVehicleSelect(const Vehicle *v) override { - if (_settings_client.gui.cm_open_vehicle_for_shared_clone) { // CM - if (DoCommandP(this->window_number, v->index, citymania::_fn_mod ? 1 : 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), CcCloneVehicle)) + /* CityMania code start */ + if (_settings_client.gui.cm_open_vehicle_for_shared_clone) { + if (Command::Post(STR_ERROR_CAN_T_BUY_TRAIN + v->type, CcCloneVehicle, this->window_number, v->index, citymania::_fn_mod)) ResetObjectToPlace(); return true; } + /* CityMania code end */ if (citymania::_fn_mod) { /* Share-clone, do not open new viewport, and keep tool active */ diff --git a/src/main_gui.cpp b/src/main_gui.cpp index 2ca7ee9e8f..e902a5fad4 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -372,7 +372,9 @@ struct MainWindow : Window break; case GHK_BORROW_ALL: - DoCommandP(0, 0, 1, CMD_INCREASE_LOAN | CMD_MSG(STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY)); + citymania::cmd::IncreaseLoan(LoanCommand::Max, 0) + .WithError(STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY) + .Post(); break; case GHK_CHAT: // smart chat; send to team if any, otherwise to all diff --git a/src/road_gui.cpp b/src/road_gui.cpp index f61dd830cf..333dbfd6cd 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -647,19 +647,19 @@ struct BuildRoadToolbarWindow : Window { VpSelectTilesWithMethod(pt.x, pt.y, select_method); } - void TryToRemoveExtraRoadBits(TileIndex tile, RoadBits &rb) { - for (DiagDirection dir = DIAGDIR_BEGIN; dir != DIAGDIR_END; dir++) { - RoadBits dir_rb = DiagDirToRoadBits(dir); - if (!(rb & dir_rb)) continue; - if (CanConnectToRoad(tile, _cur_roadtype, dir)) continue; - DoCommandP(tile, tile, - (dir_rb == ROAD_NW || dir_rb == ROAD_NE ? 0 : 3) | - (dir_rb & ROAD_X ? 0 : 4) | - (_cur_roadtype << 3), - CMD_REMOVE_LONG_ROAD); - rb &= ~dir_rb; - } - } + // void TryToRemoveExtraRoadBits(TileIndex tile, RoadBits &rb) { + // for (DiagDirection dir = DIAGDIR_BEGIN; dir != DIAGDIR_END; dir++) { + // RoadBits dir_rb = DiagDirToRoadBits(dir); + // if (!(rb & dir_rb)) continue; + // if (CanConnectToRoad(tile, _cur_roadtype, dir)) continue; + // DoCommandP(tile, tile, + // (dir_rb == ROAD_NW || dir_rb == ROAD_NE ? 0 : 3) | + // (dir_rb & ROAD_X ? 0 : 4) | + // (_cur_roadtype << 3), + // CMD_REMOVE_LONG_ROAD); + // rb &= ~dir_rb; + // } + // } void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile) override { diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 8ed14c7ad3..49a8eb0210 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -59,6 +59,7 @@ #include "object_type.h" #include "citymania/cm_cargo_table_gui.hpp" +#include "citymania/cm_commands.hpp" #include "citymania/cm_commands_gui.hpp" #include "citymania/cm_locations.hpp" #include "citymania/cm_main.hpp" @@ -88,7 +89,7 @@ enum CallBackFunction { CBF_NONE, CBF_PLACE_SIGN, CBF_PLACE_LANDINFO, - CBF_BUILD_HQ, + CM_CBF_BUILD_HQ, }; static CallBackFunction _last_started_action = CBF_NONE; ///< Last started user action. @@ -275,13 +276,13 @@ static CallBackFunction SelectSignTool() /* hq hotkey */ static CallBackFunction BuildCompanyHQ(){ - if (_last_started_action == CBF_BUILD_HQ) { + if (_last_started_action == CM_CBF_BUILD_HQ) { ResetObjectToPlace(); return CBF_NONE; } else { SetObjectToPlace(SPR_CURSOR_HQ, PAL_NONE, HT_RECT, WC_MAIN_TOOLBAR, 0, CM_DDSP_BUILD_HQ); SetTileSelectSize(2, 2); - return CBF_BUILD_HQ; + return CM_CBF_BUILD_HQ; } } @@ -670,13 +671,12 @@ static CallBackFunction MenuClickCompany(int index) case CTMN_NEW_COMPANY: if (_network_server) { - DoCommandP(0, CCA_NEW, _network_own_client_id, CMD_COMPANY_CTRL); + Command::Post(CCA_NEW, INVALID_COMPANY, CRR_NONE, _network_own_client_id); } else { - NetworkSendCommand(0, CCA_NEW, 0, CMD_COMPANY_CTRL, nullptr, {}, _local_company); + Command::SendNet(STR_NULL, _local_company, CCA_NEW, INVALID_COMPANY, CRR_NONE, INVALID_CLIENT_ID); } return CBF_NONE; - case CTMN_SPECTATE: if (_network_server) { NetworkServerDoMove(CLIENT_ID_SERVER, COMPANY_SPECTATOR); @@ -2167,8 +2167,11 @@ struct MainToolbarWindow : Window { VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_MEASURE); break; - case CBF_BUILD_HQ: - if(DoCommandP(tile, OBJECT_HQ, 0, CMD_BUILD_OBJECT | CMD_MSG(STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS))){ + case CM_CBF_BUILD_HQ: + if(citymania::cmd::BuildObject(OBJECT_HQ, 0) + .WithTile(tile) + .WithError(STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS) + .Post()) { ResetObjectToPlace(); this->RaiseButtons(); } diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 4168839d4c..f25be3b87f 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -56,6 +56,7 @@ #include "table/strings.h" #include "table/town_land.h" +#include "citymania/cm_commands.hpp" #include "citymania/cm_highlight.hpp" #include "citymania/cm_main.hpp" @@ -918,11 +919,12 @@ static void DoRegularFunding(Town *t) if (UINT32_MAX - t->last_funding + _tick_counter < TOWN_GROWTH_TICKS) return; } else if (_tick_counter - t->last_funding < TOWN_GROWTH_TICKS) return; - CompanyID old = _current_company; - _current_company = _local_company; - DoCommandP(t->xy, t->index, HK_FUND, CMD_DO_TOWN_ACTION | CMD_NO_ESTIMATE); + citymania::cmd::DoTownAction(t->index, HK_FUND) + .WithTile(t->xy) + .SetAuto() + .AsCompany(_local_company) + .Post(); t->last_funding = _tick_counter; - _current_company = old; } static void DoRegularAdvertising(Town *t) { @@ -954,10 +956,11 @@ static void DoRegularAdvertising(Town *t) { } else if (_tick_counter - t->last_advertisement < 30) return; t->last_advertisement = _tick_counter; - CompanyID old = _current_company; - _current_company = _local_company; - DoCommandP(t->xy, t->index, HK_LADVERT, CMD_DO_TOWN_ACTION | CMD_NO_ESTIMATE); - _current_company = old; + citymania::cmd::DoTownAction(t->index, HK_LADVERT) + .WithTile(t->xy) + .SetAuto() + .AsCompany(_local_company) + .Post(); } static void TownTickHandler(Town *t) diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 01a1a60b50..88567526d9 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -60,7 +60,10 @@ static void DrawExtraTownInfo (const Rect &r, uint &y, Town *town, uint line, bo bool TownExecuteAction(const Town *town, uint action){ if(!(action == HK_STATUE && HasBit(town->statues, _current_company))){ //don't built statue when there is one - return DoCommandP(town->xy, town->index, action, CMD_DO_TOWN_ACTION | CMD_MSG(STR_ERROR_CAN_T_DO_THIS)); + return citymania::cmd::DoTownAction(town->index, action) + .WithTile(town->xy) + .WithError(STR_ERROR_CAN_T_DO_THIS) + .Post(); } return false; } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index b23649f388..3375bb5387 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -43,6 +43,7 @@ #include "train_cmd.h" #include "hotkeys.h" +#include "citymania/cm_commands.hpp" #include "citymania/cm_hotkeys.hpp" #include "safeguards.h" @@ -2647,7 +2648,9 @@ void CcCloneVehicleWithOrderIndex(const CommandCost &result, TileIndex tile, uin if (!cloned || !cloned->IsPrimaryVehicle()) return; const Vehicle *v = Vehicle::Get(_new_vehicle_id); if (cloned->cur_implicit_order_index == v->cur_implicit_order_index) return; - DoCommandP(v->tile, v->index, cloned->cur_implicit_order_index, CMD_SKIP_TO_ORDER); + citymania::cmd::SkipToOrder(v->index, cloned->cur_implicit_order_index) + .WithTile(v->tile) + .Post(); } /** Window manager class for viewing a vehicle. */