summaryrefslogtreecommitdiff
path: root/unmovable_cmd.c
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2005-05-12 23:46:01 +0000
committerDarkvater <Darkvater@openttd.org>2005-05-12 23:46:01 +0000
commitddd4958164980954577fcca388ffeb455f3fc463 (patch)
treedde69a1afcdeffecc49a408ef9164ad83781a82f /unmovable_cmd.c
parent0727085b3b4f1fde705f307274ccf4d785a20854 (diff)
downloadopenttd-ddd4958164980954577fcca388ffeb455f3fc463.tar.xz
(svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
- CodeChange: remove cmd-misuses CmdStartScenario() and CmdDestroyCompanyHQ() - Fix (invisible): when parameter checking CmdRestoreOrderIndex() the vehicle did not have its orders yet, so it would fail. So move doing this until AFTER the orders have been added back in RestoreVehicleOrders()
Diffstat (limited to 'unmovable_cmd.c')
-rw-r--r--unmovable_cmd.c186
1 files changed, 89 insertions, 97 deletions
diff --git a/unmovable_cmd.c b/unmovable_cmd.c
index b492febd6..5a0c5345b 100644
--- a/unmovable_cmd.c
+++ b/unmovable_cmd.c
@@ -12,6 +12,94 @@
#include "town.h"
#include "sprite.h"
+/** Destroy a HQ.
+ * During normal gameplay you can only implicitely destroy a HQ when you are
+ * rebuilding it. Otherwise, only water can destroy it.
+ * @param tile tile coordinates where HQ is located to destroy
+ * @param flags docommand flags of calling function
+ */
+int32 DestroyCompanyHQ(TileIndex tile, uint32 flags)
+{
+ Player *p;
+
+ SET_EXPENSES_TYPE(EXPENSES_PROPERTY);
+
+ /* Find player that has HQ flooded, and reset their location_of_house */
+ if (_current_player == OWNER_WATER) {
+ bool dodelete = false;
+
+ FOR_ALL_PLAYERS(p) {
+ if (p->location_of_house == tile) {
+ dodelete = true;
+ break;
+ }
+ }
+ if (!dodelete) return CMD_ERROR;
+ } else /* Destruction was initiated by player */
+ p = DEREF_PLAYER(_current_player);
+
+ if (p->location_of_house == 0) return CMD_ERROR;
+
+ if (flags & DC_EXEC) {
+ DoClearSquare(p->location_of_house + TILE_XY(0,0));
+ DoClearSquare(p->location_of_house + TILE_XY(0,1));
+ DoClearSquare(p->location_of_house + TILE_XY(1,0));
+ DoClearSquare(p->location_of_house + TILE_XY(1,1));
+ p->location_of_house = 0; // reset HQ position
+ InvalidateWindow(WC_COMPANY, (int)p->index);
+ }
+
+ // cost of relocating company is 1% of company value
+ return CalculateCompanyValue(p) / 100;
+}
+
+/** Build or relocate the HQ. This depends if the HQ is already built or not
+ * @param x,y the coordinates where the HQ will be built or relocated to
+ * @param p1 relocate HQ (set to some value, usually 1 or true)
+ * @param p2 unused
+ */
+ extern int32 CheckFlatLandBelow(uint tile, uint w, uint h, uint flags, uint invalid_dirs, int *);
+int32 CmdBuildCompanyHQ(int x, int y, uint32 flags, uint32 p1, uint32 p2)
+{
+ TileIndex tile = TILE_FROM_XY(x,y);
+ Player *p = DEREF_PLAYER(_current_player);
+ int cost;
+
+ SET_EXPENSES_TYPE(EXPENSES_PROPERTY);
+
+ cost = CheckFlatLandBelow(tile, 2, 2, flags, 0, NULL);
+ if (CmdFailed(cost)) return CMD_ERROR;
+
+ if (p1) { /* Moving HQ */
+ int32 ret;
+
+ if (p->location_of_house == 0) return CMD_ERROR;
+
+ ret = DestroyCompanyHQ(p->location_of_house, flags);
+
+ if (CmdFailed(ret)) return CMD_ERROR;
+
+ cost += ret;
+ } else { /* Building new HQ */
+ if (p->location_of_house != 0) return CMD_ERROR;
+ }
+
+ if (flags & DC_EXEC) {
+ int score = UpdateCompanyRatingAndValue(p, false);
+
+ p->location_of_house = tile;
+
+ ModifyTile(tile + TILE_XY(0,0), MP_SETTYPE(MP_UNMOVABLE) | MP_MAPOWNER_CURRENT | MP_MAP5, 0x80);
+ ModifyTile(tile + TILE_XY(0,1), MP_SETTYPE(MP_UNMOVABLE) | MP_MAPOWNER_CURRENT | MP_MAP5, 0x81);
+ ModifyTile(tile + TILE_XY(1,0), MP_SETTYPE(MP_UNMOVABLE) | MP_MAPOWNER_CURRENT | MP_MAP5, 0x82);
+ ModifyTile(tile + TILE_XY(1,1), MP_SETTYPE(MP_UNMOVABLE) | MP_MAPOWNER_CURRENT | MP_MAP5, 0x83);
+ UpdatePlayerHouse(p, score);
+ InvalidateWindow(WC_COMPANY, (int)p->index);
+ }
+
+ return cost;
+}
+
typedef struct DrawTileUnmovableStruct {
uint16 image;
byte subcoord_x;
@@ -110,8 +198,7 @@ static int32 ClearTile_Unmovable(uint tile, byte flags)
byte m5 = _map5[tile];
if (m5 & 0x80) {
- if (_current_player == OWNER_WATER)
- return DoCommandByTile(tile, 0, 0, DC_EXEC, CMD_DESTROY_COMPANY_HQ);
+ if (_current_player == OWNER_WATER) return DestroyCompanyHQ(tile, DC_EXEC);
return_cmd_error(STR_5804_COMPANY_HEADQUARTERS_IN);
}
@@ -307,101 +394,6 @@ restart:
} while (--i);
}
-extern int32 CheckFlatLandBelow(uint tile, uint w, uint h, uint flags, uint invalid_dirs, int *);
-
-/** Build or relocate the HQ. This depends if the HQ is already built or not
- * @param x,y the coordinates where the HQ will be built or relocated to
- * @param p1 relocate HQ (set to some value, usually 1 or true)
- * @param p2 unused
- */
-int32 CmdBuildCompanyHQ(int x, int y, uint32 flags, uint32 p1, uint32 p2)
-{
- TileIndex tile = TILE_FROM_XY(x,y);
- Player *p = DEREF_PLAYER(_current_player);
- int cost;
-
- SET_EXPENSES_TYPE(EXPENSES_PROPERTY);
-
- cost = CheckFlatLandBelow(tile, 2, 2, flags, 0, NULL);
- if (CmdFailed(cost)) return CMD_ERROR;
-
- if (p1) { /* Moving HQ */
- int32 ret;
-
- if (p->location_of_house == 0) return CMD_ERROR;
-
- ret = DoCommandByTile(p->location_of_house, 0, 0, flags, CMD_DESTROY_COMPANY_HQ);
-
- if (CmdFailed(ret)) return CMD_ERROR;
-
- cost += ret;
- } else { /* Building new HQ */
- if (p->location_of_house != 0) return CMD_ERROR;
- }
-
- if (flags & DC_EXEC) {
- int score = UpdateCompanyRatingAndValue(p, false);
-
- p->location_of_house = tile;
-
- ModifyTile(tile + TILE_XY(0,0), MP_SETTYPE(MP_UNMOVABLE) | MP_MAPOWNER_CURRENT | MP_MAP5, 0x80);
- ModifyTile(tile + TILE_XY(0,1), MP_SETTYPE(MP_UNMOVABLE) | MP_MAPOWNER_CURRENT | MP_MAP5, 0x81);
- ModifyTile(tile + TILE_XY(1,0), MP_SETTYPE(MP_UNMOVABLE) | MP_MAPOWNER_CURRENT | MP_MAP5, 0x82);
- ModifyTile(tile + TILE_XY(1,1), MP_SETTYPE(MP_UNMOVABLE) | MP_MAPOWNER_CURRENT | MP_MAP5, 0x83);
- UpdatePlayerHouse(p, score);
- InvalidateWindow(WC_COMPANY, (int)p->index);
- }
-
- return cost;
-}
-
-/** Destroy a HQ.
- * During normal gameplay you can only implicitely destroy a HQ when you are
- * rebuilding it. Otherwise, only water can destroy it. Unfortunately there is
- * no safeguard against a hacked client to call this command, unless we also add
- * flags to the command table which commands can be called directly and which not.
- * @param x,y tile coordinates where HQ is located to destroy
- * @param p1 unused
- * @param p2 unused
- */
-int32 CmdDestroyCompanyHQ(int x, int y, uint32 flags, uint32 p1, uint32 p2)
-{
- TileIndex tile;
- Player *p;
-
- SET_EXPENSES_TYPE(EXPENSES_PROPERTY);
-
- /* Find player that has HQ flooded, and reset their location_of_house */
- if (_current_player == OWNER_WATER) {
- bool dodelete = false;
- tile = TILE_FROM_XY(x,y);
-
- FOR_ALL_PLAYERS(p) {
- if (p->location_of_house == tile) {
- dodelete = true;
- break;
- }
- }
- if (!dodelete) return CMD_ERROR;
- } else /* Destruction was initiated by player */
- p = DEREF_PLAYER(_current_player);
-
- if (p->location_of_house == 0) return CMD_ERROR;
-
- if (flags & DC_EXEC) {
- DoClearSquare(p->location_of_house + TILE_XY(0,0));
- DoClearSquare(p->location_of_house + TILE_XY(0,1));
- DoClearSquare(p->location_of_house + TILE_XY(1,0));
- DoClearSquare(p->location_of_house + TILE_XY(1,1));
- p->location_of_house = 0; // reset HQ position
- InvalidateWindow(WC_COMPANY, (int)p->index);
- }
-
- // cost of relocating company is 1% of company value
- return CalculateCompanyValue(p) / 100;
-}
-
-
static void ChangeTileOwner_Unmovable(uint tile, byte old_player, byte new_player)
{
if (_map_owner[tile] != old_player)