summaryrefslogtreecommitdiff
path: root/command.c
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-01-02 19:19:48 +0000
committerrubidium <rubidium@openttd.org>2007-01-02 19:19:48 +0000
commit66bbf336c6af7353ef0aeed58002c46543b30635 (patch)
treead4a63860df2626b22f77e7dac712e958bea54cb /command.c
parentccc0a3f4dbf58c005b22341ac8874252924690cd (diff)
downloadopenttd-66bbf336c6af7353ef0aeed58002c46543b30635.tar.xz
(svn r7759) -Merge: makefile rewrite. This merge features:
- A proper ./configure, so everything needs to be configured only once, not for every make. - Usage of makedepend when available. This greatly reduces the time needed for generating the dependencies. - A generator for all project files. There is a single file with sources, which is used to generate Makefiles and the project files for MSVC. - Proper support for OSX universal binaries. - Object files for non-MSVC compiles are also placed in separate directories, making is faster to switch between debug and release compiles and it does not touch the directory with the source files. - Functionality to make a bundle of all needed files for for example a nightly or distribution of a binary with all needed GRFs and language files. Note: as this merge moves almost all files, it is recommended to make a backup of your working copy before updating your working copy.
Diffstat (limited to 'command.c')
-rw-r--r--command.c562
1 files changed, 0 insertions, 562 deletions
diff --git a/command.c b/command.c
deleted file mode 100644
index f99371946..000000000
--- a/command.c
+++ /dev/null
@@ -1,562 +0,0 @@
-/* $Id$ */
-
-#include "stdafx.h"
-#include "openttd.h"
-#include "table/strings.h"
-#include "functions.h"
-#include "map.h"
-#include "gui.h"
-#include "command.h"
-#include "player.h"
-#include "network/network.h"
-#include "variables.h"
-#include "genworld.h"
-
-const char* _cmd_text = NULL;
-
-#define DEF_COMMAND(yyyy) int32 yyyy(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
-
-DEF_COMMAND(CmdBuildRailroadTrack);
-DEF_COMMAND(CmdRemoveRailroadTrack);
-DEF_COMMAND(CmdBuildSingleRail);
-DEF_COMMAND(CmdRemoveSingleRail);
-
-DEF_COMMAND(CmdLandscapeClear);
-
-DEF_COMMAND(CmdBuildBridge);
-
-DEF_COMMAND(CmdBuildRailroadStation);
-DEF_COMMAND(CmdRemoveFromRailroadStation);
-DEF_COMMAND(CmdConvertRail);
-
-DEF_COMMAND(CmdBuildSingleSignal);
-DEF_COMMAND(CmdRemoveSingleSignal);
-
-DEF_COMMAND(CmdTerraformLand);
-
-DEF_COMMAND(CmdPurchaseLandArea);
-DEF_COMMAND(CmdSellLandArea);
-
-DEF_COMMAND(CmdBuildTunnel);
-
-DEF_COMMAND(CmdBuildTrainDepot);
-DEF_COMMAND(CmdBuildTrainWaypoint);
-DEF_COMMAND(CmdRenameWaypoint);
-DEF_COMMAND(CmdRemoveTrainWaypoint);
-
-DEF_COMMAND(CmdBuildRoadStop);
-
-DEF_COMMAND(CmdBuildLongRoad);
-DEF_COMMAND(CmdRemoveLongRoad);
-DEF_COMMAND(CmdBuildRoad);
-DEF_COMMAND(CmdRemoveRoad);
-
-DEF_COMMAND(CmdBuildRoadDepot);
-
-DEF_COMMAND(CmdBuildAirport);
-
-DEF_COMMAND(CmdBuildDock);
-
-DEF_COMMAND(CmdBuildShipDepot);
-
-DEF_COMMAND(CmdBuildBuoy);
-
-DEF_COMMAND(CmdPlantTree);
-
-DEF_COMMAND(CmdBuildRailVehicle);
-DEF_COMMAND(CmdMoveRailVehicle);
-
-DEF_COMMAND(CmdStartStopTrain);
-
-DEF_COMMAND(CmdSellRailWagon);
-
-DEF_COMMAND(CmdSendTrainToDepot);
-DEF_COMMAND(CmdForceTrainProceed);
-DEF_COMMAND(CmdReverseTrainDirection);
-
-DEF_COMMAND(CmdModifyOrder);
-DEF_COMMAND(CmdSkipOrder);
-DEF_COMMAND(CmdDeleteOrder);
-DEF_COMMAND(CmdInsertOrder);
-DEF_COMMAND(CmdChangeServiceInt);
-DEF_COMMAND(CmdRestoreOrderIndex);
-
-DEF_COMMAND(CmdBuildIndustry);
-
-DEF_COMMAND(CmdBuildCompanyHQ);
-DEF_COMMAND(CmdSetPlayerFace);
-DEF_COMMAND(CmdSetPlayerColor);
-
-DEF_COMMAND(CmdIncreaseLoan);
-DEF_COMMAND(CmdDecreaseLoan);
-
-DEF_COMMAND(CmdWantEnginePreview);
-
-DEF_COMMAND(CmdNameVehicle);
-DEF_COMMAND(CmdRenameEngine);
-
-DEF_COMMAND(CmdChangeCompanyName);
-DEF_COMMAND(CmdChangePresidentName);
-
-DEF_COMMAND(CmdRenameStation);
-
-DEF_COMMAND(CmdSellAircraft);
-DEF_COMMAND(CmdStartStopAircraft);
-DEF_COMMAND(CmdBuildAircraft);
-DEF_COMMAND(CmdSendAircraftToHangar);
-DEF_COMMAND(CmdRefitAircraft);
-
-DEF_COMMAND(CmdPlaceSign);
-DEF_COMMAND(CmdRenameSign);
-
-DEF_COMMAND(CmdBuildRoadVeh);
-DEF_COMMAND(CmdStartStopRoadVeh);
-DEF_COMMAND(CmdSellRoadVeh);
-DEF_COMMAND(CmdSendRoadVehToDepot);
-DEF_COMMAND(CmdTurnRoadVeh);
-DEF_COMMAND(CmdRefitRoadVeh);
-
-DEF_COMMAND(CmdPause);
-
-DEF_COMMAND(CmdBuyShareInCompany);
-DEF_COMMAND(CmdSellShareInCompany);
-DEF_COMMAND(CmdBuyCompany);
-
-DEF_COMMAND(CmdBuildTown);
-
-DEF_COMMAND(CmdRenameTown);
-DEF_COMMAND(CmdDoTownAction);
-
-DEF_COMMAND(CmdSetRoadDriveSide);
-
-DEF_COMMAND(CmdChangeDifficultyLevel);
-DEF_COMMAND(CmdChangePatchSetting);
-
-DEF_COMMAND(CmdStartStopShip);
-DEF_COMMAND(CmdSellShip);
-DEF_COMMAND(CmdBuildShip);
-DEF_COMMAND(CmdSendShipToDepot);
-DEF_COMMAND(CmdRefitShip);
-
-DEF_COMMAND(CmdOrderRefit);
-DEF_COMMAND(CmdCloneOrder);
-
-DEF_COMMAND(CmdClearArea);
-
-DEF_COMMAND(CmdGiveMoney);
-DEF_COMMAND(CmdMoneyCheat);
-DEF_COMMAND(CmdBuildCanal);
-DEF_COMMAND(CmdBuildLock);
-
-DEF_COMMAND(CmdPlayerCtrl);
-
-DEF_COMMAND(CmdLevelLand);
-
-DEF_COMMAND(CmdRefitRailVehicle);
-
-DEF_COMMAND(CmdBuildSignalTrack);
-DEF_COMMAND(CmdRemoveSignalTrack);
-
-DEF_COMMAND(CmdSetAutoReplace);
-
-DEF_COMMAND(CmdCloneVehicle);
-DEF_COMMAND(CmdMassStartStopVehicle);
-DEF_COMMAND(CmdDepotSellAllVehicles);
-DEF_COMMAND(CmdDepotMassAutoReplace);
-
-/* The master command table */
-static const Command _command_proc_table[] = {
- {CmdBuildRailroadTrack, 0}, /* 0 */
- {CmdRemoveRailroadTrack, 0}, /* 1 */
- {CmdBuildSingleRail, 0}, /* 2 */
- {CmdRemoveSingleRail, 0}, /* 3 */
- {CmdLandscapeClear, 0}, /* 4 */
- {CmdBuildBridge, 0}, /* 5 */
- {CmdBuildRailroadStation, 0}, /* 6 */
- {CmdBuildTrainDepot, 0}, /* 7 */
- {CmdBuildSingleSignal, 0}, /* 8 */
- {CmdRemoveSingleSignal, 0}, /* 9 */
- {CmdTerraformLand, 0}, /* 10 */
- {CmdPurchaseLandArea, 0}, /* 11 */
- {CmdSellLandArea, 0}, /* 12 */
- {CmdBuildTunnel, 0}, /* 13 */
- {CmdRemoveFromRailroadStation, 0}, /* 14 */
- {CmdConvertRail, 0}, /* 15 */
- {CmdBuildTrainWaypoint, 0}, /* 16 */
- {CmdRenameWaypoint, 0}, /* 17 */
- {CmdRemoveTrainWaypoint, 0}, /* 18 */
- {NULL, 0}, /* 19 */
- {NULL, 0}, /* 20 */
- {CmdBuildRoadStop, 0}, /* 21 */
- {NULL, 0}, /* 22 */
- {CmdBuildLongRoad, 0}, /* 23 */
- {CmdRemoveLongRoad, 0}, /* 24 */
- {CmdBuildRoad, 0}, /* 25 */
- {CmdRemoveRoad, 0}, /* 26 */
- {CmdBuildRoadDepot, 0}, /* 27 */
- {NULL, 0}, /* 28 */
- {CmdBuildAirport, 0}, /* 29 */
- {CmdBuildDock, 0}, /* 30 */
- {CmdBuildShipDepot, 0}, /* 31 */
- {CmdBuildBuoy, 0}, /* 32 */
- {CmdPlantTree, 0}, /* 33 */
- {CmdBuildRailVehicle, 0}, /* 34 */
- {CmdMoveRailVehicle, 0}, /* 35 */
- {CmdStartStopTrain, 0}, /* 36 */
- {NULL, 0}, /* 37 */
- {CmdSellRailWagon, 0}, /* 38 */
- {CmdSendTrainToDepot, 0}, /* 39 */
- {CmdForceTrainProceed, 0}, /* 40 */
- {CmdReverseTrainDirection, 0}, /* 41 */
-
- {CmdModifyOrder, 0}, /* 42 */
- {CmdSkipOrder, 0}, /* 43 */
- {CmdDeleteOrder, 0}, /* 44 */
- {CmdInsertOrder, 0}, /* 45 */
-
- {CmdChangeServiceInt, 0}, /* 46 */
-
- {CmdBuildIndustry, 0}, /* 47 */
- {CmdBuildCompanyHQ, 0}, /* 48 */
- {CmdSetPlayerFace, 0}, /* 49 */
- {CmdSetPlayerColor, 0}, /* 50 */
-
- {CmdIncreaseLoan, 0}, /* 51 */
- {CmdDecreaseLoan, 0}, /* 52 */
-
- {CmdWantEnginePreview, 0}, /* 53 */
-
- {CmdNameVehicle, 0}, /* 54 */
- {CmdRenameEngine, 0}, /* 55 */
-
- {CmdChangeCompanyName, 0}, /* 56 */
- {CmdChangePresidentName, 0}, /* 57 */
-
- {CmdRenameStation, 0}, /* 58 */
-
- {CmdSellAircraft, 0}, /* 59 */
- {CmdStartStopAircraft, 0}, /* 60 */
-
- {CmdBuildAircraft, 0}, /* 61 */
- {CmdSendAircraftToHangar, 0}, /* 62 */
- {NULL, 0}, /* 63 */
- {CmdRefitAircraft, 0}, /* 64 */
-
- {CmdPlaceSign, 0}, /* 65 */
- {CmdRenameSign, 0}, /* 66 */
-
- {CmdBuildRoadVeh, 0}, /* 67 */
- {CmdStartStopRoadVeh, 0}, /* 68 */
- {CmdSellRoadVeh, 0}, /* 69 */
- {CmdSendRoadVehToDepot, 0}, /* 70 */
- {CmdTurnRoadVeh, 0}, /* 71 */
- {CmdRefitRoadVeh, 0}, /* 72 */
-
- {CmdPause, CMD_SERVER}, /* 73 */
-
- {CmdBuyShareInCompany, 0}, /* 74 */
- {CmdSellShareInCompany, 0}, /* 75 */
- {CmdBuyCompany, 0}, /* 76 */
-
- {CmdBuildTown, CMD_OFFLINE}, /* 77 */
- {NULL, 0}, /* 78 */
- {NULL, 0}, /* 79 */
- {CmdRenameTown, CMD_SERVER}, /* 80 */
- {CmdDoTownAction, 0}, /* 81 */
-
- {CmdSetRoadDriveSide, CMD_SERVER}, /* 82 */
- {NULL, 0}, /* 83 */
- {NULL, 0}, /* 84 */
- {CmdChangeDifficultyLevel, CMD_SERVER}, /* 85 */
-
- {CmdStartStopShip, 0}, /* 86 */
- {CmdSellShip, 0}, /* 87 */
- {CmdBuildShip, 0}, /* 88 */
- {CmdSendShipToDepot, 0}, /* 89 */
- {NULL, 0}, /* 90 */
- {CmdRefitShip, 0}, /* 91 */
-
- {NULL, 0}, /* 92 */
- {NULL, 0}, /* 93 */
- {NULL, 0}, /* 94 */
- {NULL, 0}, /* 95 */
- {NULL, 0}, /* 96 */
- {NULL, 0}, /* 97 */
-
- {CmdOrderRefit, 0}, /* 98 */
- {CmdCloneOrder, 0}, /* 99 */
-
- {CmdClearArea, 0}, /* 100 */
- {NULL, 0}, /* 101 */
-
- {CmdMoneyCheat, CMD_OFFLINE}, /* 102 */
- {CmdBuildCanal, 0}, /* 103 */
- {CmdPlayerCtrl, 0}, /* 104 */
-
- {CmdLevelLand, 0}, /* 105 */
-
- {CmdRefitRailVehicle, 0}, /* 106 */
- {CmdRestoreOrderIndex, 0}, /* 107 */
- {CmdBuildLock, 0}, /* 108 */
- {NULL, 0}, /* 109 */
- {CmdBuildSignalTrack, 0}, /* 110 */
- {CmdRemoveSignalTrack, 0}, /* 111 */
- {NULL, 0}, /* 112 */
- {CmdGiveMoney, 0}, /* 113 */
- {CmdChangePatchSetting, CMD_SERVER}, /* 114 */
- {CmdSetAutoReplace, 0}, /* 115 */
- {CmdCloneVehicle, 0}, /* 116 */
- {CmdMassStartStopVehicle, 0}, /* 117 */
- {CmdDepotSellAllVehicles, 0}, /* 118 */
- {CmdDepotMassAutoReplace, 0}, /* 119 */
-};
-
-/* This function range-checks a cmd, and checks if the cmd is not NULL */
-bool IsValidCommand(uint cmd)
-{
- cmd &= 0xFF;
-
- return
- cmd < lengthof(_command_proc_table) &&
- _command_proc_table[cmd].proc != NULL;
-}
-
-byte GetCommandFlags(uint cmd)
-{
- return _command_proc_table[cmd & 0xFF].flags;
-}
-
-
-static int _docommand_recursive;
-
-int32 DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc)
-{
- int32 res;
- CommandProc *proc;
-
- /* Do not even think about executing out-of-bounds tile-commands */
- if (tile >= MapSize()) {
- _cmd_text = NULL;
- return CMD_ERROR;
- }
-
- proc = _command_proc_table[procc].proc;
-
- if (_docommand_recursive == 0) _error_message = INVALID_STRING_ID;
-
- _docommand_recursive++;
-
- // only execute the test call if it's toplevel, or we're not execing.
- if (_docommand_recursive == 1 || !(flags & DC_EXEC) || (flags & DC_FORCETEST) ) {
- res = proc(tile, flags & ~DC_EXEC, p1, p2);
- if (CmdFailed(res)) {
- if (res & 0xFFFF) _error_message = res & 0xFFFF;
- goto error;
- }
-
- if (_docommand_recursive == 1 &&
- !(flags & DC_QUERY_COST) &&
- res != 0 &&
- !CheckPlayerHasMoney(res)) {
- goto error;
- }
-
- if (!(flags & DC_EXEC)) {
- _docommand_recursive--;
- _cmd_text = NULL;
- return res;
- }
- }
-
- /* Execute the command here. All cost-relevant functions set the expenses type
- * themselves with "SET_EXPENSES_TYPE(...);" at the beginning of the function */
- res = proc(tile, flags, p1, p2);
- if (CmdFailed(res)) {
- if (res & 0xFFFF) _error_message = res & 0xFFFF;
-error:
- _docommand_recursive--;
- _cmd_text = NULL;
- return CMD_ERROR;
- }
-
- // if toplevel, subtract the money.
- if (--_docommand_recursive == 0) {
- SubtractMoneyFromPlayer(res);
- // XXX - Old AI hack which doesn't use DoCommandDP; update last build coord of player
- if (tile != 0 && IsValidPlayer(_current_player)) {
- GetPlayer(_current_player)->last_build_coordinate = tile;
- }
- }
-
- _cmd_text = NULL;
- return res;
-}
-
-int32 GetAvailableMoneyForCommand(void)
-{
- PlayerID pid = _current_player;
- if (!IsValidPlayer(pid)) return 0x7FFFFFFF; // max int
- return GetPlayer(pid)->player_money;
-}
-
-// toplevel network safe docommand function for the current player. must not be called recursively.
-// the callback is called when the command succeeded or failed.
-bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback, uint32 cmd)
-{
- int32 res = 0,res2;
- CommandProc *proc;
- uint32 flags;
- bool notest;
- StringID error_part1;
-
- int x = TileX(tile) * TILE_SIZE;
- int y = TileY(tile) * TILE_SIZE;
-
- /* Do not even think about executing out-of-bounds tile-commands */
- if (tile >= MapSize()) {
- _cmd_text = NULL;
- return false;
- }
-
- assert(_docommand_recursive == 0);
-
- _error_message = INVALID_STRING_ID;
- error_part1 = GB(cmd, 16, 16);
- _additional_cash_required = 0;
-
- /** Spectator has no rights except for the (dedicated) server which
- * is/can be a spectator but as the server it can do anything */
- if (_current_player == PLAYER_SPECTATOR && !_network_server) {
- ShowErrorMessage(_error_message, error_part1, x, y);
- _cmd_text = NULL;
- return false;
- }
-
- flags = 0;
- if (cmd & CMD_AUTO) flags |= DC_AUTO;
- if (cmd & CMD_NO_WATER) flags |= DC_NO_WATER;
-
- // get pointer to command handler
- assert((cmd & 0xFF) < lengthof(_command_proc_table));
- proc = _command_proc_table[cmd & 0xFF].proc;
- if (proc == NULL) {
- _cmd_text = NULL;
- return false;
- }
-
- // Some commands have a different output in dryrun than the realrun
- // e.g.: if you demolish a whole town, the dryrun would say okay.
- // but by really destroying, your rating drops and at a certain point
- // it will fail. so res and res2 are different
- // CMD_REMOVE_ROAD: This command has special local authority
- // restrictions which may cause the test run to fail (the previous
- // road fragments still stay there and the town won't let you
- // disconnect the road system), but the exec will succeed and this
- // fact will trigger an assertion failure. --pasky
- notest =
- (cmd & 0xFF) == CMD_CLEAR_AREA ||
- (cmd & 0xFF) == CMD_CONVERT_RAIL ||
- (cmd & 0xFF) == CMD_LEVEL_LAND ||
- (cmd & 0xFF) == CMD_REMOVE_ROAD ||
- (cmd & 0xFF) == CMD_REMOVE_LONG_ROAD;
-
- _docommand_recursive = 1;
-
- // cost estimation only?
- if (!IsGeneratingWorld() && _shift_pressed && IsLocalPlayer() && !(cmd & (CMD_NETWORK_COMMAND | CMD_SHOW_NO_ERROR))) {
- // estimate the cost.
- res = proc(tile, flags, p1, p2);
- if (CmdFailed(res)) {
- if (res & 0xFFFF) _error_message = res & 0xFFFF;
- ShowErrorMessage(_error_message, error_part1, x, y);
- } else {
- ShowEstimatedCostOrIncome(res, x, y);
- }
-
- _docommand_recursive = 0;
- _cmd_text = NULL;
- return false;
- }
-
-
- if (!((cmd & CMD_NO_TEST_IF_IN_NETWORK) && _networking)) {
- // first test if the command can be executed.
- res = proc(tile, flags, p1, p2);
- if (CmdFailed(res)) {
- if (res & 0xFFFF) _error_message = res & 0xFFFF;
- goto show_error;
- }
- // no money? Only check if notest is off
- if (!notest && res != 0 && !CheckPlayerHasMoney(res)) goto show_error;
- }
-
-#ifdef ENABLE_NETWORK
- /** If we are in network, and the command is not from the network
- * send it to the command-queue and abort execution
- * If we are a dedicated server temporarily switch local player, otherwise
- * the other parties won't be able to execute our command and will desync.
- * We also need to do this if the server's company has gone bankrupt
- * @todo Rewrite (dedicated) server to something more than a dirty hack!
- */
- if (_networking && !(cmd & CMD_NETWORK_COMMAND)) {
- PlayerID pbck = _local_player;
- if (_network_dedicated || (_network_server && pbck == PLAYER_SPECTATOR)) _local_player = 0;
- NetworkSend_Command(tile, p1, p2, cmd, callback);
- if (_network_dedicated || (_network_server && pbck == PLAYER_SPECTATOR)) _local_player = pbck;
- _docommand_recursive = 0;
- _cmd_text = NULL;
- return true;
- }
-#endif /* ENABLE_NETWORK */
-
- // update last build coordinate of player.
- if (tile != 0 && IsValidPlayer(_current_player)) {
- GetPlayer(_current_player)->last_build_coordinate = tile;
- }
-
- /* Actually try and execute the command. If no cost-type is given
- * use the construction one */
- _yearly_expenses_type = EXPENSES_CONSTRUCTION;
- res2 = proc(tile, flags | DC_EXEC, p1, p2);
-
- // If notest is on, it means the result of the test can be different than
- // the real command.. so ignore the test
- if (!notest && !((cmd & CMD_NO_TEST_IF_IN_NETWORK) && _networking)) {
- assert(res == res2); // sanity check
- } else {
- if (CmdFailed(res2)) {
- if (res2 & 0xFFFF) _error_message = res2 & 0xFFFF;
- goto show_error;
- }
- }
-
- SubtractMoneyFromPlayer(res2);
-
- if (IsLocalPlayer() && _game_mode != GM_EDITOR) {
- if (res2 != 0) ShowCostOrIncomeAnimation(x, y, GetSlopeZ(x, y), res2);
- if (_additional_cash_required) {
- SetDParam(0, _additional_cash_required);
- ShowErrorMessage(STR_0003_NOT_ENOUGH_CASH_REQUIRES, error_part1, x,y);
- if (res2 == 0) goto callb_err;
- }
- }
-
- _docommand_recursive = 0;
-
- if (callback) callback(true, tile, p1, p2);
- _cmd_text = NULL;
- return true;
-
-show_error:
- // show error message if the command fails?
- if (IsLocalPlayer() && error_part1 != 0) {
- ShowErrorMessage(_error_message, error_part1, x,y);
- }
-
-callb_err:
- _docommand_recursive = 0;
-
- if (callback) callback(false, tile, p1, p2);
- _cmd_text = NULL;
- return false;
-}