annotate src/terraform_cmd.cpp @ 8816:d278baac2725 draft

(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
author smatz <smatz@openttd.org>
date Fri, 04 Apr 2008 15:48:15 +0000 (2008-04-04)
parents 9fe7640963e3
children f34f4fa2950c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
1 /* $Id$ */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
2
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
3 /** @file terraform_cmd.cpp Commands related to terraforming. */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
4
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
5 #include "stdafx.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
6 #include "openttd.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
7 #include "strings_type.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
8 #include "command_func.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
9 #include "tile_map.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
10 #include "tunnel_map.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
11 #include "bridge_map.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
12 #include "variables.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
13 #include "functions.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
14 #include "economy_func.h"
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
15
8264
2495310e220f (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium <rubidium@openttd.org>
parents: 8230
diff changeset
16 #include "table/strings.h"
2495310e220f (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium <rubidium@openttd.org>
parents: 8230
diff changeset
17
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
18 /*
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
19 * In one terraforming command all four corners of a initial tile can be raised/lowered (though this is not available to the player).
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
20 * The maximal amount of height modifications is archieved when raising a complete flat land from sea level to MAX_TILE_HEIGHT or vice versa.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
21 * This affects all corners with a manhatten distance smaller than MAX_TILE_HEIGHT to one of the initial 4 corners.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
22 * Their maximal amount is computed to 4 * \sum_{i=1}^{h_max} i = 2 * h_max * (h_max + 1).
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
23 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
24 static const int TERRAFORMER_MODHEIGHT_SIZE = 2 * MAX_TILE_HEIGHT * (MAX_TILE_HEIGHT + 1);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
25
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
26 /*
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
27 * The maximal amount of affected tiles (i.e. the tiles that incident with one of the corners above, is computed similiar to
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
28 * 1 + 4 * \sum_{i=1}^{h_max} (i+1) = 1 + 2 * h_max + (h_max + 3).
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
29 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
30 static const int TERRAFORMER_TILE_TABLE_SIZE = 1 + 2 * MAX_TILE_HEIGHT * (MAX_TILE_HEIGHT + 3);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
31
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
32 struct TerraformerHeightMod {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
33 TileIndex tile; ///< Referenced tile.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
34 byte height; ///< New TileHeight (height of north corner) of the tile.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
35 };
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
36
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
37 struct TerraformerState {
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
38 int modheight_count; ///< amount of entries in "modheight".
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
39 int tile_table_count; ///< amount of entries in "tile_table".
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
40
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
41 /**
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
42 * Dirty tiles, i.e.\ at least one corner changed.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
43 *
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
44 * This array contains the tiles which are or will be marked as dirty.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
45 *
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
46 * @ingroup dirty
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
47 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
48 TileIndex tile_table[TERRAFORMER_TILE_TABLE_SIZE];
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
49 TerraformerHeightMod modheight[TERRAFORMER_MODHEIGHT_SIZE]; ///< Height modifications.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
50 };
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
51
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
52 TileIndex _terraform_err_tile; ///< first tile we couldn't terraform
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
53
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
54 /**
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
55 * Gets the TileHeight (height of north corner) of a tile as of current terraforming progress.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
56 *
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
57 * @param ts TerraformerState.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
58 * @param tile Tile.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
59 * @return TileHeight.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
60 */
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
61 static int TerraformGetHeightOfTile(const TerraformerState *ts, TileIndex tile)
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
62 {
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
63 const TerraformerHeightMod *mod = ts->modheight;
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
64
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
65 for (int count = ts->modheight_count; count != 0; count--, mod++) {
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
66 if (mod->tile == tile) return mod->height;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
67 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
68
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
69 /* TileHeight unchanged so far, read value from map. */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
70 return TileHeight(tile);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
71 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
72
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
73 /**
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
74 * Stores the TileHeight (height of north corner) of a tile in a TerraformerState.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
75 *
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
76 * @param ts TerraformerState.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
77 * @param tile Tile.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
78 * @param height New TileHeight.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
79 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
80 static void TerraformSetHeightOfTile(TerraformerState *ts, TileIndex tile, int height)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
81 {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
82 /* Find tile in the "modheight" table.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
83 * Note: In a normal user-terraform command the tile will not be found in the "modheight" table.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
84 * But during house- or industry-construction multiple corners can be terraformed at once. */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
85 TerraformerHeightMod *mod = ts->modheight;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
86 int count = ts->modheight_count;
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
87
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
88 while ((count > 0) && (mod->tile != tile)) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
89 mod++;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
90 count--;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
91 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
92
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
93 /* New entry? */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
94 if (count == 0) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
95 assert(ts->modheight_count < TERRAFORMER_MODHEIGHT_SIZE);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
96 ts->modheight_count++;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
97 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
98
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
99 /* Finally store the new value */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
100 mod->tile = tile;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
101 mod->height = (byte)height;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
102 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
103
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
104 /**
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
105 * Adds a tile to the "tile_table" in a TerraformerState.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
106 *
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
107 * @param ts TerraformerState.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
108 * @param tile Tile.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
109 * @ingroup dirty
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
110 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
111 static void TerraformAddDirtyTile(TerraformerState *ts, TileIndex tile)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
112 {
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
113 int count = ts->tile_table_count;
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
114
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
115 for (TileIndex *t = ts->tile_table; count != 0; count--, t++) {
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
116 if (*t == tile) return;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
117 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
118
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
119 assert(ts->tile_table_count < TERRAFORMER_TILE_TABLE_SIZE);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
120
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
121 ts->tile_table[ts->tile_table_count++] = tile;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
122 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
123
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
124 /**
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
125 * Adds all tiles that incident with the north corner of a specific tile to the "tile_table" in a TerraformerState.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
126 *
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
127 * @param ts TerraformerState.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
128 * @param tile Tile.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
129 * @ingroup dirty
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
130 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
131 static void TerraformAddDirtyTileAround(TerraformerState *ts, TileIndex tile)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
132 {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
133 TerraformAddDirtyTile(ts, tile + TileDiffXY( 0, -1));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
134 TerraformAddDirtyTile(ts, tile + TileDiffXY(-1, -1));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
135 TerraformAddDirtyTile(ts, tile + TileDiffXY(-1, 0));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
136 TerraformAddDirtyTile(ts, tile);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
137 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
138
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
139 /**
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
140 * Terraform the north corner of a tile to a specific height.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
141 *
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
142 * @param ts TerraformerState.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
143 * @param tile Tile.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
144 * @param height Aimed height.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
145 * @param return Error code or cost.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
146 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
147 static CommandCost TerraformTileHeight(TerraformerState *ts, TileIndex tile, int height)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
148 {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
149 assert(tile < MapSize());
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
150
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
151 /* Check range of destination height */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
152 if (height < 0) return_cmd_error(STR_1003_ALREADY_AT_SEA_LEVEL);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
153 if (height > MAX_TILE_HEIGHT) return_cmd_error(STR_1004_TOO_HIGH);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
154
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
155 /*
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
156 * Check if the terraforming has any effect.
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
157 * This can only be true, if multiple corners of the start-tile are terraformed (i.e. the terraforming is done by towns/industries etc.).
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
158 * In this case the terraforming should fail. (Don't know why.)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
159 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
160 if (height == TerraformGetHeightOfTile(ts, tile)) return CMD_ERROR;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
161
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
162 /* Check "too close to edge of map" */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
163 uint x = TileX(tile);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
164 uint y = TileY(tile);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
165 if ((x <= 1) || (y <= 1) || (x >= MapMaxX() - 1) || (y >= MapMaxY() - 1)) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
166 /*
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
167 * Determine a sensible error tile
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
168 * Note: If x and y are both zero this will disable the error tile. (Tile 0 cannot be highlighted :( )
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
169 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
170 if ((x == 1) && (y != 0)) x = 0;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
171 if ((y == 1) && (x != 0)) y = 0;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
172 _terraform_err_tile = TileXY(x, y);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
173 return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
174 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
175
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
176 /* Mark incident tiles, that are involved in the terraforming */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
177 TerraformAddDirtyTileAround(ts, tile);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
178
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
179 /* Store the height modification */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
180 TerraformSetHeightOfTile(ts, tile, height);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
181
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
182 CommandCost total_cost(EXPENSES_CONSTRUCTION);
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
183
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
184 /* Increment cost */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
185 total_cost.AddCost(_price.terraform);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
186
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
187 /* Recurse to neighboured corners if height difference is larger than 1 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
188 {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
189 const TileIndexDiffC *ttm;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
190
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
191 static const TileIndexDiffC _terraform_tilepos[] = {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
192 { 1, 0}, // move to tile in SE
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
193 {-2, 0}, // undo last move, and move to tile in NW
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
194 { 1, 1}, // undo last move, and move to tile in SW
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
195 { 0, -2} // undo last move, and move to tile in NE
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
196 };
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
197
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
198 for (ttm = _terraform_tilepos; ttm != endof(_terraform_tilepos); ttm++) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
199 tile += ToTileIndexDiff(*ttm);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
200
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
201 /* Get TileHeight of neighboured tile as of current terraform progress */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
202 int r = TerraformGetHeightOfTile(ts, tile);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
203 int height_diff = height - r;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
204
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
205 /* Is the height difference to the neighboured corner greater than 1? */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
206 if (abs(height_diff) > 1) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
207 /* Terraform the neighboured corner. The resulting height difference should be 1. */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
208 height_diff += (height_diff < 0 ? 1 : -1);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
209 CommandCost cost = TerraformTileHeight(ts, tile, r + height_diff);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
210 if (CmdFailed(cost)) return cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
211 total_cost.AddCost(cost);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
212 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
213 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
214 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
215
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
216 return total_cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
217 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
218
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
219 /** Terraform land
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
220 * @param tile tile to terraform
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
221 * @param flags for this command type
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
222 * @param p1 corners to terraform (SLOPE_xxx)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
223 * @param p2 direction; eg up (non-zero) or down (zero)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
224 * @return error or cost of terraforming
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
225 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
226 CommandCost CmdTerraformLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
227 {
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
228 /* Make an extra check for map-bounds cause we add tiles to the originating tile */
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
229 if (tile + TileDiffXY(1, 1) >= MapSize()) return CMD_ERROR;
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
230
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
231 _terraform_err_tile = INVALID_TILE;
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
232
8230
5b61305fcdd4 (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium <rubidium@openttd.org>
parents: 8210
diff changeset
233 CommandCost total_cost(EXPENSES_CONSTRUCTION);
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
234 int direction = (p2 != 0 ? 1 : -1);
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
235 TerraformerState ts;
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
236
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
237 ts.modheight_count = ts.tile_table_count = 0;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
238
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
239 /* Compute the costs and the terraforming result in a model of the landscape */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
240 if ((p1 & SLOPE_W) != 0) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
241 TileIndex t = tile + TileDiffXY(1, 0);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
242 CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
243 if (CmdFailed(cost)) return cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
244 total_cost.AddCost(cost);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
245 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
246
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
247 if ((p1 & SLOPE_S) != 0) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
248 TileIndex t = tile + TileDiffXY(1, 1);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
249 CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
250 if (CmdFailed(cost)) return cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
251 total_cost.AddCost(cost);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
252 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
253
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
254 if ((p1 & SLOPE_E) != 0) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
255 TileIndex t = tile + TileDiffXY(0, 1);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
256 CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
257 if (CmdFailed(cost)) return cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
258 total_cost.AddCost(cost);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
259 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
260
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
261 if ((p1 & SLOPE_N) != 0) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
262 TileIndex t = tile + TileDiffXY(0, 0);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
263 CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
264 if (CmdFailed(cost)) return cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
265 total_cost.AddCost(cost);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
266 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
267
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
268 /* Check if the terraforming is valid wrt. tunnels, bridges and objects on the surface */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
269 {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
270 TileIndex *ti = ts.tile_table;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
271
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
272 for (int count = ts.tile_table_count; count != 0; count--, ti++) {
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
273 TileIndex tile = *ti;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
274
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
275 /* Find new heights of tile corners */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
276 uint z_N = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 0));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
277 uint z_W = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 0));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
278 uint z_S = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 1));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
279 uint z_E = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 1));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
280
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
281 /* Find min and max height of tile */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
282 uint z_min = min(min(z_N, z_W), min(z_S, z_E));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
283 uint z_max = max(max(z_N, z_W), max(z_S, z_E));
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
284
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
285 /* Compute tile slope */
8801
9fe7640963e3 (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch <frosch@openttd.org>
parents: 8264
diff changeset
286 Slope tileh = (z_max > z_min + 1 ? SLOPE_STEEP : SLOPE_FLAT);
9fe7640963e3 (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch <frosch@openttd.org>
parents: 8264
diff changeset
287 if (z_W > z_min) tileh |= SLOPE_W;
9fe7640963e3 (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch <frosch@openttd.org>
parents: 8264
diff changeset
288 if (z_S > z_min) tileh |= SLOPE_S;
9fe7640963e3 (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch <frosch@openttd.org>
parents: 8264
diff changeset
289 if (z_E > z_min) tileh |= SLOPE_E;
9fe7640963e3 (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch <frosch@openttd.org>
parents: 8264
diff changeset
290 if (z_N > z_min) tileh |= SLOPE_N;
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
291
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
292 /* Check if bridge would take damage */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
293 if (direction == 1 && MayHaveBridgeAbove(tile) && IsBridgeAbove(tile) &&
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
294 GetBridgeHeight(GetSouthernBridgeEnd(tile)) <= z_max * TILE_HEIGHT) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
295 _terraform_err_tile = tile; // highlight the tile under the bridge
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
296 return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
297 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
298 /* Check if tunnel would take damage */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
299 if (direction == -1 && IsTunnelInWay(tile, z_min * TILE_HEIGHT)) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
300 _terraform_err_tile = tile; // highlight the tile above the tunnel
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
301 return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
302 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
303 /* Check tiletype-specific things, and add extra-cost */
8801
9fe7640963e3 (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch <frosch@openttd.org>
parents: 8264
diff changeset
304 CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags | DC_AUTO, z_min * TILE_HEIGHT, tileh);
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
305 if (CmdFailed(cost)) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
306 _terraform_err_tile = tile;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
307 return cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
308 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
309 total_cost.AddCost(cost);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
310 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
311 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
312
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
313 if (flags & DC_EXEC) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
314 /* change the height */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
315 {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
316 int count;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
317 TerraformerHeightMod *mod;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
318
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
319 mod = ts.modheight;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
320 for (count = ts.modheight_count; count != 0; count--, mod++) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
321 TileIndex til = mod->tile;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
322
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
323 SetTileHeight(til, mod->height);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
324 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
325 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
326
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
327 /* finally mark the dirty tiles dirty */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
328 {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
329 int count;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
330 TileIndex *ti = ts.tile_table;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
331 for (count = ts.tile_table_count; count != 0; count--, ti++) {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
332 MarkTileDirtyByTile(*ti);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
333 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
334 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
335 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
336 return total_cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
337 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
338
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
339
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
340 /** Levels a selected (rectangle) area of land
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
341 * @param tile end tile of area-drag
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
342 * @param flags for this command type
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
343 * @param p1 start tile of area drag
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
344 * @param p2 height difference; eg raise (+1), lower (-1) or level (0)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
345 * @return error or cost of terraforming
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
346 */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
347 CommandCost CmdLevelLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
348 {
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
349 if (p1 >= MapSize()) return CMD_ERROR;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
350
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
351 /* remember level height */
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
352 uint oldh = TileHeight(p1);
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
353
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
354 /* compute new height */
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
355 uint h = oldh + p2;
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
356
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
357 /* Check range of destination height */
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
358 if (h > MAX_TILE_HEIGHT) return_cmd_error((oldh == 0) ? STR_1003_ALREADY_AT_SEA_LEVEL : STR_1004_TOO_HIGH);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
359
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
360 /* make sure sx,sy are smaller than ex,ey */
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
361 int ex = TileX(tile);
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
362 int ey = TileY(tile);
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
363 int sx = TileX(p1);
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
364 int sy = TileY(p1);
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
365 if (ex < sx) Swap(ex, sx);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
366 if (ey < sy) Swap(ey, sy);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
367 tile = TileXY(sx, sy);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
368
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
369 int size_x = ex - sx + 1;
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
370 int size_y = ey - sy + 1;
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
371
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
372 Money money = GetAvailableMoneyForCommand();
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
373 CommandCost cost(EXPENSES_CONSTRUCTION);
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
374
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
375 BEGIN_TILE_LOOP(tile2, size_x, size_y, tile) {
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
376 uint curh = TileHeight(tile2);
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
377 while (curh != h) {
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
378 CommandCost ret = DoCommand(tile2, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND);
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
379 if (CmdFailed(ret)) break;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
380
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
381 if (flags & DC_EXEC) {
8816
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
382 money -= ret.GetCost();
d278baac2725 (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents: 8801
diff changeset
383 if (money < 0) {
8210
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
384 _additional_cash_required = ret.GetCost();
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
385 return cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
386 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
387 DoCommand(tile2, SLOPE_N, (curh > h) ? 0 : 1, flags, CMD_TERRAFORM_LAND);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
388 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
389
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
390 cost.AddCost(ret);
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
391 curh += (curh > h) ? -1 : 1;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
392 }
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
393 } END_TILE_LOOP(tile2, size_x, size_y, tile)
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
394
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
395 return (cost.GetCost() == 0) ? CMD_ERROR : cost;
2191f47ab047 (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff changeset
396 }