OpenTTD Source 20250312-master-gcdcc6b491d
command_type.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#ifndef COMMAND_TYPE_H
11#define COMMAND_TYPE_H
12
13#include "company_type.h"
14#include "economy_type.h"
15#include "strings_type.h"
16#include "tile_type.h"
17
18struct GRFFile;
19
28 bool success;
29 Owner owner = CompanyID::Invalid();
31
33
34public:
39
43 explicit CommandCost(StringID msg, StringID extra_msg = INVALID_STRING_ID) : cost(0), message(msg), expense_type(INVALID_EXPENSES), success(false), extra_message(extra_msg) {}
44
50
56 CommandCost(ExpensesType ex_t, const Money &cst) : cost(cst), message(INVALID_STRING_ID), expense_type(ex_t), success(true) {}
57
63 {
64 this->owner = owner;
65 }
66
77
86
90 inline CompanyID GetErrorOwner() const
91 {
92 return this->owner;
93 }
94
99 inline void AddCost(const Money &cost)
100 {
101 this->cost += cost;
102 }
103
104 void AddCost(const CommandCost &cmd_cost);
105
110 inline void MultiplyCost(int factor)
111 {
112 this->cost *= factor;
113 }
114
119 inline Money GetCost() const
120 {
121 return this->cost;
122 }
123
129 {
130 return this->expense_type;
131 }
132
138 {
139 assert(message != INVALID_STRING_ID);
140 this->success = false;
141 this->message = message;
142 this->extra_message = INVALID_STRING_ID;
143 }
144
150 {
151 if (this->success) return INVALID_STRING_ID;
152 return this->message;
153 }
154
160 {
161 if (this->success) return INVALID_STRING_ID;
162 return this->extra_message;
163 }
164
169 inline bool Succeeded() const
170 {
171 return this->success;
172 }
173
178 inline bool Failed() const
179 {
180 return !this->success;
181 }
182};
183
184CommandCost CommandCostWithParam(StringID str, uint64_t value);
185CommandCost CommandCostWithParam(StringID str, ConvertibleThroughBase auto value) { return CommandCostWithParam(str, value.base()); }
186
197enum Commands : uint8_t {
212
215
219
222
230
232
234
237
239
245
249
255
257
263
266
270
273
280
283
285
287
289
300
304
308
331
333
335
338
342
344
351
360
367
369
375
377};
378
398
404enum class CommandFlag : uint8_t {
405 Server,
406 Spectator,
407 Offline,
408 Auto,
409 AllTiles,
410 NoTest,
411 NoWater,
412 ClientID,
413 Deity,
414 StrCtrl,
415 NoEst,
416 Location,
417};
419
434
442
443
444template <typename T> struct CommandFunctionTraitHelper;
445template <typename... Targs>
447 using Args = std::tuple<std::decay_t<Targs>...>;
448 using RetTypes = void;
449 using CbArgs = Args;
450 using CbProcType = void(*)(Commands, const CommandCost &);
451};
452template <template <typename...> typename Tret, typename... Tretargs, typename... Targs>
453struct CommandFunctionTraitHelper<Tret<CommandCost, Tretargs...>(*)(DoCommandFlags, Targs...)> {
454 using Args = std::tuple<std::decay_t<Targs>...>;
455 using RetTypes = std::tuple<std::decay_t<Tretargs>...>;
456 using CbArgs = std::tuple<std::decay_t<Tretargs>..., std::decay_t<Targs>...>;
457 using CbProcType = void(*)(Commands, const CommandCost &, Tretargs...);
458};
459
461template <Commands Tcmd> struct CommandTraits;
462
463#define DEF_CMD_TRAIT(cmd_, proc_, flags_, type_) \
464 template <> struct CommandTraits<cmd_> { \
465 using ProcType = decltype(&proc_); \
466 using Args = typename CommandFunctionTraitHelper<ProcType>::Args; \
467 using RetTypes = typename CommandFunctionTraitHelper<ProcType>::RetTypes; \
468 using CbArgs = typename CommandFunctionTraitHelper<ProcType>::CbArgs; \
469 using RetCallbackProc = typename CommandFunctionTraitHelper<ProcType>::CbProcType; \
470 static constexpr Commands cmd = cmd_; \
471 static constexpr auto &proc = proc_; \
472 static constexpr CommandFlags flags = flags_; \
473 static constexpr CommandType type = type_; \
474 static inline constexpr const char *name = #proc_; \
475 };
476
478typedef std::vector<uint8_t> CommandDataBuffer;
479
492typedef void CommandCallback(Commands cmd, const CommandCost &result, TileIndex tile);
493
508typedef void CommandCallbackData(Commands cmd, const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data);
509
510#endif /* COMMAND_TYPE_H */
Common return value for all commands.
ExpensesType GetExpensesType() const
The expense type of the cost.
bool Succeeded() const
Did this command succeed?
void AddCost(const Money &cost)
Adds the given cost to the cost of the command.
void MakeError(StringID message)
Makes this CommandCost behave like an error command.
Money cost
The cost of this action.
StringID extra_message
Additional warning message for when success is unset.
CommandCost(ExpensesType ex_t, const Money &cst)
Creates a command return value with the given start cost and expense type.
Money GetCost() const
The costs as made up to this moment.
CommandCost(ExpensesType ex_t)
Creates a command cost with given expense type and start cost of 0.
static void SetEncodedMessage(EncodedString &&message)
Set the encoded message string.
Owner owner
Originator owner of error.
CommandCost(StringID msg, StringID extra_msg=INVALID_STRING_ID)
Creates a command return value with one, or optionally two, error message strings.
StringID message
Warning message for when success is unset.
bool Failed() const
Did this command fail?
CommandCost()
Creates a command cost return with no cost and no error.
void MultiplyCost(int factor)
Multiplies the cost of the command by the given factor.
static EncodedString & GetEncodedMessage()
Get the last encoded error message.
StringID GetErrorMessage() const
Returns the error message of a command.
void SetErrorOwner(Owner owner)
Set the 'owner' (the originator) of this error message.
bool success
Whether the command went fine up to this moment.
CompanyID GetErrorOwner() const
Get the originator owner for this error.
ExpensesType expense_type
the type of expence as shown on the finances view
StringID GetExtraErrorMessage() const
Returns the extra error message of a command.
static EncodedString encoded_message
Encoded error message, used if the error message includes parameters.
Container for an encoded string, created by GetEncodedString.
Enum-as-bit-set wrapper.
CommandType
Types of commands we have.
@ CMDT_END
Magic end marker.
@ CMDT_VEHICLE_CONSTRUCTION
Construction, modification (incl. refit) and destruction of vehicles.
@ CMDT_COMPANY_SETTING
Changing settings related to a company.
@ CMDT_LANDSCAPE_CONSTRUCTION
Construction and destruction of objects on the map.
@ CMDT_VEHICLE_MANAGEMENT
Stopping, starting, sending to depot, turning around, replace orders etc.
@ CMDT_CHEAT
A cheat of some sorts.
@ CMDT_ROUTE_MANAGEMENT
Modifications to route management (orders, groups, etc).
@ CMDT_OTHER_MANAGEMENT
Renaming stuff, changing company colours, placing signs, etc.
@ CMDT_MONEY_MANAGEMENT
Management of money, i.e. loans.
@ CMDT_SERVER_SETTING
Pausing/removing companies/server settings.
void CommandCallback(Commands cmd, const CommandCost &result, TileIndex tile)
Define a callback function for the client, after the command is finished.
DoCommandFlag
List of flags for a command.
@ Execute
execute the given command
@ QueryCost
query cost only, don't build.
@ NoCargoCapacityCheck
when autoreplace/autorenew is in progress, this shall prevent truncating the amount of cargo in the v...
@ NoModifyTownRating
do not change town rating
@ NoTestTownRating
town rating does not disallow you from building
@ Bankrupt
company bankrupts, skip money check, skip vehicle on tile check in some cases
@ AutoReplace
autoreplace/autorenew is in progress, this shall disable vehicle limits when building,...
@ NoWater
don't allow building on water
@ Auto
don't allow building on structures
@ ForceClearTile
do not only remove the object on the tile, but also clear any water left on it
@ AllTiles
allow this command also on MP_VOID tiles
CommandCost CommandCostWithParam(StringID str, uint64_t value)
Return an error status, with string and parameter.
Definition command.cpp:418
CommandFlag
Command flags for the command table _command_proc_table.
@ NoEst
the command is never estimated.
@ Deity
the command may be executed by COMPANY_DEITY
@ Spectator
the command may be initiated by a spectator
@ Offline
the command cannot be executed in a multiplayer game; single-player only
@ Server
the command can only be initiated by the server
@ ClientID
set p2 with the ClientID of the sending client.
@ StrCtrl
the command's string may contain control strings
@ Location
the command has implicit location argument.
@ NoTest
the command's output may differ between test and execute due to town rating changes etc.
CommandPauseLevel
Different command pause levels.
@ CMDPL_NO_LANDSCAPING
No landscaping actions may be executed.
@ CMDPL_ALL_ACTIONS
All actions may be executed.
@ CMDPL_NO_ACTIONS
No user actions may be executed.
@ CMDPL_NO_CONSTRUCTION
No construction actions may be executed.
void CommandCallbackData(Commands cmd, const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data)
Define a callback function for the client, after the command is finished.
std::vector< uint8_t > CommandDataBuffer
Storage buffer for serialized command data.
Commands
List of commands.
@ CMD_BUILD_LONG_ROAD
build a complete road (not a "half" one)
@ CMD_REMOVE_FROM_RAIL_WAYPOINT
remove a (rectangle of) tiles from a rail waypoint
@ CMD_REMOVE_STORY_PAGE
remove a story page
@ CMD_OPEN_CLOSE_AIRPORT
open/close an airport to incoming aircraft
@ CMD_WANT_ENGINE_PREVIEW
confirm the preview of an engine
@ CMD_GOAL_QUESTION_ANSWER
answer(s) to CMD_GOAL_QUESTION
@ CMD_CREATE_STORY_PAGE_ELEMENT
create a new story page element
@ CMD_BUILD_OBJECT_AREA
build an area of objects
@ CMD_BUILD_TRAIN_DEPOT
build a train depot
@ CMD_MASS_START_STOP
start/stop all vehicles (in a depot)
@ CMD_UPDATE_LEAGUE_TABLE_ELEMENT_DATA
update the data fields of a league table element
@ CMD_REMOVE_SINGLE_RAIL
remove a single rail track
@ CMD_PAUSE
pause the game
@ CMD_BUILD_ROAD
build a "half" road
@ CMD_BUILD_BUOY
build a buoy
@ CMD_SET_GOAL_DESTINATION
update goal destination of a goal
@ CMD_SHOW_STORY_PAGE
show a story page
@ CMD_MONEY_CHEAT
do the money cheat
@ CMD_EXPAND_TOWN
expand a town
@ CMD_COMPANY_CTRL
used in multiplayer to create a new companies etc.
@ CMD_CONVERT_RAIL
convert a rail type
@ CMD_MODIFY_ORDER
modify an order (like set full-load)
@ CMD_BUILD_SIGNAL_TRACK
add signals along a track (by dragging)
@ CMD_ADD_SHARED_VEHICLE_GROUP
add all other shared vehicles to a group which are missing
@ CMD_GOAL_QUESTION
ask a goal related question
@ CMD_UPDATE_STORY_PAGE_ELEMENT
update a story page element
@ CMD_MOVE_ORDER
move an order
@ CMD_SELL_VEHICLE
sell a vehicle
@ CMD_CLONE_VEHICLE
clone a vehicle
@ CMD_CREATE_STORY_PAGE
create a new story page
@ CMD_DELETE_TOWN
delete a town
@ CMD_SET_TIMETABLE_START
set the date that a timetable should start
@ CMD_CONVERT_ROAD
convert a road type
@ CMD_SET_VEHICLE_ON_TIME
set the vehicle on time feature (timetable)
@ CMD_BUILD_VEHICLE
build a vehicle
@ CMD_REMOVE_RAILROAD_TRACK
remove a rail track
@ CMD_TOWN_SET_TEXT
set the custom text of a town
@ CMD_BUILD_OBJECT
build an object
@ CMD_SET_AUTOREPLACE
set an autoreplace entry
@ CMD_REMOVE_LEAGUE_TABLE_ELEMENT
remove a league table element
@ CMD_CREATE_LEAGUE_TABLE_ELEMENT
create a new element in a league table
@ CMD_DEPOT_SELL_ALL_VEHICLES
sell all vehicles which are in a given depot
@ CMD_REMOVE_LONG_ROAD
remove a complete road (not a "half" one)
@ CMD_BUILD_SHIP_DEPOT
build a ship depot
@ CMD_RENAME_COMPANY
change the company name
@ CMD_BUILD_DOCK
build a dock
@ CMD_STORY_PAGE_BUTTON
selection via story page button
@ CMD_DECREASE_LOAN
decrease the loan from the bank
@ CMD_FOUND_TOWN
found a town
@ CMD_PLACE_SIGN
place a sign
@ CMD_REFIT_VEHICLE
refit the cargo space of a vehicle
@ CMD_LEVEL_LAND
level land
@ CMD_CREATE_GOAL
create a new goal
@ CMD_SET_COMPANY_MANAGER_FACE
set the manager's face of the company
@ CMD_LANDSCAPE_CLEAR
demolish a tile
@ CMD_INDUSTRY_SET_FLAGS
change industry control flags
@ CMD_TURN_ROADVEH
turn a road vehicle around
@ CMD_CLEAR_AREA
clear an area
@ CMD_ENGINE_CTRL
control availability of the engine for companies
@ CMD_INDUSTRY_SET_TEXT
change additional text for the industry
@ CMD_FORCE_TRAIN_PROCEED
proceed a train to pass a red signal
@ CMD_DO_TOWN_ACTION
do a action from the town detail window (like advertises or bribe)
@ CMD_SET_STORY_PAGE_TITLE
update title of a story page
@ CMD_ADD_VEHICLE_GROUP
add a vehicle to a group
@ CMD_BUILD_CANAL
build a canal
@ CMD_CLONE_ORDER
clone (and share) an order
@ CMD_BUILD_ROAD_WAYPOINT
build a road waypoint
@ CMD_REMOVE_FROM_ROAD_WAYPOINT
remove a (rectangle of) tiles from a road waypoint
@ CMD_SKIP_TO_ORDER
skip an order to the next of specific one
@ CMD_INDUSTRY_SET_EXCLUSIVITY
change industry exclusive consumer/supplier
@ CMD_INDUSTRY_SET_PRODUCTION
change industry production
@ CMD_REVERSE_TRAIN_DIRECTION
turn a train around
@ CMD_CREATE_SUBSIDY
create a new subsidy
@ CMD_RENAME_WAYPOINT
rename a waypoint
@ CMD_BUILD_RAIL_WAYPOINT
build a waypoint
@ CMD_DELETE_ORDER
delete an order
@ CMD_CHANGE_SETTING
change a setting
@ CMD_TOWN_RATING
set rating of a company in a town
@ CMD_END
Must ALWAYS be on the end of this list!! (period)
@ CMD_BUY_COMPANY
buy a company which is bankrupt
@ CMD_PLANT_TREE
plant a tree
@ CMD_ORDER_REFIT
change the refit information of an order (for "goto depot" )
@ CMD_CLEAR_ORDER_BACKUP
clear the order backup of a given user/tile
@ CMD_SET_GOAL_COMPLETED
update goal completed status of a goal
@ CMD_BUILD_AIRPORT
build an airport
@ CMD_TERRAFORM_LAND
terraform a tile
@ CMD_BUILD_BRIDGE
build a bridge
@ CMD_GIVE_MONEY
give money to another company
@ CMD_RENAME_VEHICLE
rename a whole vehicle
@ CMD_SET_STORY_PAGE_DATE
update date of a story page
@ CMD_RENAME_PRESIDENT
change the president name
@ CMD_BUILD_LOCK
build a lock
@ CMD_COMPANY_ALLOW_LIST_CTRL
Used in multiplayer to add/remove a client's public key to/from the company's allow list.
@ CMD_PLACE_HOUSE
place a house
@ CMD_CHANGE_TIMETABLE
change the timetable for a vehicle
@ CMD_DEPOT_MASS_AUTOREPLACE
force the autoreplace to take action in a given depot
@ CMD_CHANGE_COMPANY_SETTING
change a company setting
@ CMD_CUSTOM_NEWS_ITEM
create a custom news message
@ CMD_BUILD_RAILROAD_TRACK
build a rail track
@ CMD_CREATE_LEAGUE_TABLE
create a new league table
@ CMD_ALTER_GROUP
alter a group
@ CMD_RENAME_SIGN
rename a sign
@ CMD_INCREASE_LOAN
increase the loan from the bank
@ CMD_BUILD_ROAD_DEPOT
build a road depot
@ CMD_SCROLL_VIEWPORT
scroll main viewport of players
@ CMD_SET_COMPANY_MAX_LOAN
sets the max loan for the company
@ CMD_BUILD_INDUSTRY
build a new industry
@ CMD_SEND_VEHICLE_TO_DEPOT
send a vehicle to a depot
@ CMD_SET_VEHICLE_VISIBILITY
hide or unhide a vehicle in the build vehicle and autoreplace GUIs
@ CMD_SET_GROUP_FLAG
set/clear a flag for a group
@ CMD_BUILD_ROAD_STOP
build a road stop
@ CMD_SET_GOAL_TEXT
update goal text of a goal
@ CMD_START_STOP_VEHICLE
start or stop a vehicle
@ CMD_MOVE_RAIL_VEHICLE
move a rail vehicle (in the depot)
@ CMD_SET_GOAL_PROGRESS
update goal progress text of a goal
@ CMD_CHANGE_BANK_BALANCE
change bank balance to charge costs or give money from a GS
@ CMD_RENAME_DEPOT
rename a depot
@ CMD_RENAME_ENGINE
rename a engine (in the engine list)
@ CMD_INSERT_ORDER
insert a new order
@ CMD_TOWN_GROWTH_RATE
set the town growth rate
@ CMD_SET_GROUP_LIVERY
set the livery for a group
@ CMD_CREATE_GROUP
create a new group
@ CMD_BUILD_SINGLE_SIGNAL
build a signal
@ CMD_RENAME_TOWN
rename a town
@ CMD_REMOVE_SIGNAL_TRACK
remove signals along a track (by dragging)
@ CMD_BUILD_RAIL_STATION
build a rail station
@ CMD_AUTOREPLACE_VEHICLE
replace/renew a vehicle while it is in a depot
@ CMD_BUILD_SINGLE_RAIL
build a single rail track
@ CMD_REMOVE_GOAL
remove a goal
@ CMD_REMOVE_SINGLE_SIGNAL
remove a signal
@ CMD_RENAME_STATION
rename a station
@ CMD_BUILD_TUNNEL
build a tunnel
@ CMD_SET_COMPANY_COLOUR
set the colour of the company
@ CMD_REMOVE_STORY_PAGE_ELEMENT
remove a story page element
@ CMD_TOWN_CARGO_GOAL
set the goal of a cargo for a town
@ CMD_REMOVE_FROM_RAIL_STATION
remove a (rectangle of) tiles from a rail station
@ CMD_REMOVE_ALL_VEHICLES_GROUP
remove all vehicles from a group
@ CMD_REMOVE_ROAD_STOP
remove a road stop
@ CMD_CHANGE_SERVICE_INT
change the server interval of a vehicle
@ CMD_UPDATE_LEAGUE_TABLE_ELEMENT_SCORE
update the score of a league table element
@ CMD_DELETE_GROUP
delete a group
@ CMD_AUTOFILL_TIMETABLE
autofill the timetable
@ CMD_BULK_CHANGE_TIMETABLE
change the timetable for all orders of a vehicle
Types related to companies.
A type is considered 'convertible through base()' when it has a 'base()' function that returns someth...
Types related to the economy.
ExpensesType
Types of expenses.
@ INVALID_EXPENSES
Invalid expense type.
Types related to strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Defines the traits of a command.
Dynamic data of a loaded NewGRF.
Definition newgrf.h:111
Types related to tiles.