62#include "table/strings.h"
67int RecursiveCommandCounter::_counter = 0;
83inline constexpr CommandInfo CommandFromTrait() noexcept {
return { T::name, T::flags, T::type }; };
85template <
typename T, T... i>
86inline constexpr auto MakeCommandsFromTraits(std::integer_sequence<T, i...>)
noexcept {
87 return std::array<
CommandInfo,
sizeof...(i)>{{ CommandFromTrait<CommandTraits<static_cast<Commands>(i)>>()... }};
97static constexpr auto _command_proc_table = MakeCommandsFromTraits(std::make_integer_sequence<std::underlying_type_t<Commands>,
CMD_END>{});
147 static const int command_type_lookup[] = {
171 if (top_level) _cleared_object_areas.clear();
218 bool only_sending =
_networking && !network_command;
223 return {
true, estimate_only, only_sending };
225 return {
false, estimate_only, only_sending };
245 if (estimate_only || (
IsLocalCompany() && err_message != 0 && my_cmd)) {
248 }
else if (estimate_only) {
250 }
else if (!only_sending && tile != 0 &&
IsLocalCompany() && _game_mode != GM_EDITOR) {
263 Debug(desync, 1,
"{}: {:08x}; {:02x}; {:02x}; {:08x}; {:08x}; {} ({})", failed ?
"cmdf" :
"cmd", (uint32_t)
TimerGameEconomy::date.base(),
TimerGameEconomy::date_fract,
_current_company, cmd, err_message,
FormatArrayAsHex(args),
GetCommandName(cmd));
287 _cleared_object_areas.clear();
324 _cleared_object_areas.clear();
328 return {
false, _debug_desync_level >= 1, send_net };
363 if (!test_and_exec_can_differ) {
364 assert(res_test.GetCost() == res_exec.
GetCost() && res_test.Failed() == res_exec.
Failed());
365 }
else if (res_exec.
Failed()) {
371 if (extra_cash != 0 && res_exec.
GetCost() == 0) {
Command definitions related to autoreplace.
Class for backupping variables and making sure they are restored later.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Timpl & Set()
Set all bits.
constexpr bool Any(const Timpl &other) const
Test if any of the given values are set.
Common return value for all commands.
bool Succeeded() const
Did this command succeed?
void AddCost(const Money &cost)
Adds the given cost to the cost of the command.
Money cost
The cost of this action.
Money GetCost() const
The costs as made up to this moment.
static void SetEncodedMessage(EncodedString &&message)
Set the encoded message string.
StringID message
Warning message for when success is unset.
bool Failed() const
Did this command fail?
bool success
Whether the command went fine up to this moment.
static EncodedString encoded_message
Encoded error message, used if the error message includes parameters.
static std::tuple< bool, bool, bool > InternalPostBefore(Commands cmd, CommandFlags flags, TileIndex tile, StringID err_message, bool network_command)
Decide what to do with the command depending on current game state.
static void InternalDoBefore(bool top_level, bool test)
Prepare for calling a command proc.
static void LogCommandExecution(Commands cmd, StringID err_message, const CommandDataBuffer &args, bool failed)
Helper to make a desync log for a command.
static CommandCost InternalExecuteProcessResult(Commands cmd, CommandFlags cmd_flags, const CommandCost &res_test, const CommandCost &res_exec, Money extra_cash, TileIndex tile, Backup< CompanyID > &cur_company)
Process the result of a command test run and execution run.
static void InternalPostResult(const CommandCost &res, TileIndex tile, bool estimate_only, bool only_sending, StringID err_message, bool my_cmd)
Process result of executing a command, possibly displaying any error to the player.
static void InternalDoAfter(CommandCost &res, DoCommandFlags flags, bool top_level, bool test)
Process result after calling a command proc.
static std::tuple< bool, bool, bool > InternalExecuteValidateTestAndPrepExec(CommandCost &res, CommandFlags cmd_flags, bool estimate_only, bool network_command, Backup< CompanyID > &cur_company)
Validate result of test run and prepare for real execution.
static bool InternalExecutePrepTest(CommandFlags cmd_flags, TileIndex tile, Backup< CompanyID > &cur_company)
Prepare for the test run of a command proc call.
Container for an encoded string, created by GetEncodedString.
static Date date
Current date in days (day counter).
static DateFract date_fract
Fractional part of the day.
CommandFlags GetCommandFlags(Commands cmd)
This function mask the parameter with CMD_ID_MASK and returns the flags which belongs to the given co...
CommandCost CommandCostWithParam(StringID str, uint64_t value)
Return an error status, with string and parameter.
bool IsCommandAllowedWhilePaused(Commands cmd)
Returns whether the command is allowed while the game is paused.
const char * GetCommandName(Commands cmd)
This function mask the parameter with CMD_ID_MASK and returns the name which belongs to the given com...
bool IsValidCommand(Commands cmd)
This function range-checks a cmd.
static constexpr auto _command_proc_table
The master command table.
Functions related to commands.
bool IsCommandAllowedWhilePaused(Commands cmd)
Returns whether the command is allowed while the game is paused.
const char * GetCommandName(Commands cmd)
This function mask the parameter with CMD_ID_MASK and returns the name which belongs to the given com...
CommandType
Types of commands we have.
@ CMDT_END
Magic end marker.
@ CMDT_SERVER_SETTING
Pausing/removing companies/server settings.
@ QueryCost
query cost only, don't build.
@ Bankrupt
company bankrupts, skip money check, skip vehicle on tile check in some cases
@ NoEst
the command is never estimated.
@ Deity
the command may be executed by COMPANY_DEITY
@ Spectator
the command may be initiated by a spectator
@ Server
the command can only be initiated by the server
@ NoTest
the command's output may differ between test and execute due to town rating changes etc.
@ 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.
std::vector< uint8_t > CommandDataBuffer
Storage buffer for serialized command data.
Commands
List of commands.
@ CMD_COMPANY_CTRL
used in multiplayer to create a new companies etc.
@ CMD_END
Must ALWAYS be on the end of this list!! (period)
Definition of stuff that is very close to a company, like the company struct itself.
bool CheckCompanyHasMoney(CommandCost &cost)
Verify whether the company can pay the bill.
void SubtractMoneyFromCompany(const CommandCost &cost)
Subtract money from the _current_company, if the company is valid.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
CompanyID _current_company
Company currently doing an action.
Command definitions related to companies.
Functions related to companies.
bool IsLocalCompany()
Is the current company the local company?
static constexpr Owner OWNER_DEITY
The object is owned by a superuser / goal script.
static constexpr CompanyID COMPANY_SPECTATOR
The client is spectating.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
Command definitions related to depots.
Command definitions related to the economy.
Command definitions related to engines.
Functions related to errors.
@ WL_INFO
Used for DoCommand-like (and some non-fatal AI GUI) errors/information.
void ShowErrorMessage(EncodedString &&summary_msg, int x, int y, const CommandCost &cc)
Display an error message in a window.
bool _generating_world
Whether we are generating the map or not.
Functions related to world/map generation.
bool _shift_pressed
Is Shift pressed?
PauseModes _pause_mode
The current pause mode.
Command definitions related to goals.
Command definitions related to engine groups.
GUI functions that shouldn't be here.
void ShowEstimatedCostOrIncome(Money cost, int x, int y)
Display estimated costs.
Command definitions related to industries.
int GetSlopePixelZ(int x, int y, bool ground_vehicle)
Return world Z coordinate of a given point of a tile.
Functions related to OTTD's landscape.
Command definitions related to landscape (slopes etc.).
Command definitions related to league tables.
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
Miscellaneous command definitions.
void ShowCostOrIncomeAnimation(int x, int y, int z, Money cost)
Display animated income or costs on the map.
bool _networking
are we in networking mode?
Basic functions/variables used all over the place.
Types used for networking.
@ PSM_LEAVE_TESTMODE
Leave command test mode, revert to previous mode.
@ PSM_LEAVE_COMMAND
Leave command scope, revert to previous mode.
@ PSM_ENTER_COMMAND
Enter command scope, changes will be permanent.
@ PSM_ENTER_TESTMODE
Enter command test mode, changes will be temporary.
Command definitions related to news messages.
Command definitions related to objects.
@ CommandDuringPause
A game paused, and a command executed during the pause; resets on autosave.
Command definitions related to orders.
Command definitions for rail.
Command definitions related to road vehicles.
A number of safeguards to prevent using unsafe methods.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Command definitions related to settings.
void UpdateSignalsInBuffer()
Update signals in buffer Called from 'outside'.
Functions related to signals.
Command definitions related to signs.
Command definitions related to stations.
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Command definitions related to stories.
std::string FormatArrayAsHex(std::span< const uint8_t > data)
Format a byte array into a continuous hex string.
Functions related to low-level strings.
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Class to backup a specific variable and restore it later.
void Trash()
Trash the backup.
bool Verify() const
Check whether the variable is currently equals the backup.
void Change(const U &new_value)
Change the value of the variable.
void Restore()
Restore the variable.
static void SwitchMode(PersistentStorageMode mode, bool ignore_prev_mode=false)
Clear temporary changes made since the last call to SwitchMode, and set whether subsequent changes sh...
Define a command with the flags which belongs to it.
const char * name
A human readable name for the procedure.
CommandType type
The type of command.
CommandFlags flags
The (command) flags to that apply to this command.
TileIndex last_build_coordinate
Coordinate of the last build thing by this company.
uint8_t command_pause_level
level/amount of commands that can't be executed while paused
ConstructionSettings construction
construction of things in-game
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static Titem * GetIfValid(auto index)
Returns Titem with given index.
Command definitions related to subsidies.
Functions related to text effects.
static const uint TILE_SIZE
Tile size in world coordinates.
Definition of the game-economy-timer.
void SetTownRatingTestMode(bool mode)
Switch the town rating to test-mode, to allow commands to be tested without affecting current ratings...
Command definitions related to towns.
Command definitions related to trains.
Command definitions related to tree tiles.
Command definitions related to tunnels and bridges.
Command definitions for vehicles.
Command definitions related to viewports.
Command definitions related to water tiles.
Command definitions related to waypoints.