Mercurial > hg > openttd
annotate src/terraform_cmd.cpp @ 17676:3be3d8523223 draft
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
author | alberth <alberth@openttd.org> |
---|---|
date | Sat, 14 May 2011 09:26:16 +0000 |
parents | 5b204f51b151 |
children | b3cb40aab91b |
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 |
12778
bc7926153e19
(svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents:
12632
diff
changeset
|
3 /* |
bc7926153e19
(svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents:
12632
diff
changeset
|
4 * This file is part of OpenTTD. |
bc7926153e19
(svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents:
12632
diff
changeset
|
5 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. |
bc7926153e19
(svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents:
12632
diff
changeset
|
6 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
bc7926153e19
(svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents:
12632
diff
changeset
|
7 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. |
bc7926153e19
(svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents:
12632
diff
changeset
|
8 */ |
bc7926153e19
(svn r17248) -Fix: add GPL license notice where appropriate
rubidium <rubidium@openttd.org>
parents:
12632
diff
changeset
|
9 |
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
|
10 /** @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
|
11 |
2191f47ab047
(svn 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 "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
|
13 #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
|
14 #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
|
15 #include "bridge_map.h" |
17277
5b204f51b151
(svn r22017) -Codechange: move MarkTileDirtyByTile to viewport_func.h
rubidium <rubidium@openttd.org>
parents:
17152
diff
changeset
|
16 #include "viewport_func.h" |
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
|
17 #include "economy_func.h" |
15531
93093fe9137c
(svn r20190) -Codechange: unVARDEF _generate_world and move it to genworld
rubidium <rubidium@openttd.org>
parents:
15187
diff
changeset
|
18 #include "genworld.h" |
16561
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
19 #include "object_base.h" |
16992
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
20 #include "company_base.h" |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
21 #include "company_func.h" |
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
|
22 |
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
|
23 #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
|
24 |
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
|
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 * 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
|
27 * 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
|
28 * 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
|
29 * 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
|
30 */ |
2191f47ab047
(svn 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 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
|
32 |
2191f47ab047
(svn 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 /* |
2191f47ab047
(svn 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 * 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
|
35 * 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
|
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 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
|
38 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
39 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
|
40 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
|
41 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
|
42 }; |
2191f47ab047
(svn 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 struct TerraformerState { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
45 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
|
46 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
|
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 /** |
2191f47ab047
(svn 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 * 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
|
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 * 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
|
52 * |
2191f47ab047
(svn 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 * @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
|
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 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
|
56 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
|
57 }; |
2191f47ab047
(svn 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 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
59 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
|
60 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
61 /** |
2191f47ab047
(svn 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 * 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
|
63 * |
2191f47ab047
(svn 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 * @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
|
65 * @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
|
66 * @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
|
67 */ |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
68 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
|
69 { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
70 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
|
71 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
72 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
|
73 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
|
74 } |
2191f47ab047
(svn 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 /* 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
|
77 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
|
78 } |
2191f47ab047
(svn 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 /** |
2191f47ab047
(svn 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 * 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
|
82 * |
2191f47ab047
(svn 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 * @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
|
84 * @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
|
85 * @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
|
86 */ |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
87 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
|
88 { |
2191f47ab047
(svn 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 /* 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
|
90 * 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
|
91 * 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
|
92 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
|
93 int count = ts->modheight_count; |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
94 |
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
|
95 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
|
96 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
|
97 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
|
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 |
2191f47ab047
(svn 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 /* 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
|
101 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
|
102 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
|
103 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
|
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 |
2191f47ab047
(svn 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 /* 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
|
107 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
|
108 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
|
109 } |
2191f47ab047
(svn 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 /** |
2191f47ab047
(svn 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 * 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
|
113 * |
2191f47ab047
(svn 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 * @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
|
115 * @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
|
116 * @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
|
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 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
|
119 { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
120 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
|
121 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
122 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
|
123 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
|
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 |
2191f47ab047
(svn 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 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
|
127 |
2191f47ab047
(svn 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 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
|
129 } |
2191f47ab047
(svn 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 /** |
2191f47ab047
(svn 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 * 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
|
133 * |
2191f47ab047
(svn 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 * @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
|
135 * @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
|
136 * @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
|
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 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
|
139 { |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
140 /* Make sure all tiles passed to TerraformAddDirtyTile are within [0, MapSize()] */ |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
141 if (TileY(tile) >= 1) TerraformAddDirtyTile(ts, tile + TileDiffXY( 0, -1)); |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
142 if (TileY(tile) >= 1 && TileX(tile) >= 1) TerraformAddDirtyTile(ts, tile + TileDiffXY(-1, -1)); |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
143 if (TileX(tile) >= 1) TerraformAddDirtyTile(ts, tile + TileDiffXY(-1, 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
|
144 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
|
145 } |
2191f47ab047
(svn 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 /** |
2191f47ab047
(svn 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 * 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
|
149 * |
2191f47ab047
(svn 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 * @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
|
151 * @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
|
152 * @param height Aimed height. |
13079
090bac35e7e4
(svn r17579) -Fix: remove doxygen docs for removed parameters, or change @param to @tparam if necessary
rubidium <rubidium@openttd.org>
parents:
13067
diff
changeset
|
153 * @return Error code or cost. |
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
|
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 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
|
156 { |
2191f47ab047
(svn 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 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
|
158 |
2191f47ab047
(svn 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 /* Check range of destination height */ |
11730
a39da1e4c1f5
(svn r16118) -Change/cleanup: remove the hexadecimal 'in TTD the string had this ID' from 'some' strings and replace the string name with something more sensible.
rubidium <rubidium@openttd.org>
parents:
11090
diff
changeset
|
160 if (height < 0) return_cmd_error(STR_ERROR_ALREADY_AT_SEA_LEVEL); |
15187
03033976eab9
(svn r19816) -Codechange: use static const uint for the unnamed 'tile consts' enum as well
rubidium <rubidium@openttd.org>
parents:
15018
diff
changeset
|
161 if (height > (int)MAX_TILE_HEIGHT) return_cmd_error(STR_ERROR_TOO_HIGH); |
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
|
162 |
2191f47ab047
(svn 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 /* |
2191f47ab047
(svn 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 * 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
|
165 * 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
|
166 * 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
|
167 */ |
2191f47ab047
(svn 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 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
|
169 |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
170 /* Check "too close to edge of map". Only possible when freeform-edges is off. */ |
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
|
171 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
|
172 uint y = TileY(tile); |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
173 if (!_settings_game.construction.freeform_edges && ((x <= 1) || (y <= 1) || (x >= MapMaxX() - 1) || (y >= MapMaxY() - 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
|
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 * 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
|
176 */ |
10816
35b3e8e25590
(svn r15151) -Fix: tile 0 can now be highlighted as error tile
Yexo <Yexo@openttd.org>
parents:
10804
diff
changeset
|
177 if (x == 1) x = 0; |
35b3e8e25590
(svn r15151) -Fix: tile 0 can now be highlighted as error tile
Yexo <Yexo@openttd.org>
parents:
10804
diff
changeset
|
178 if (y == 1) y = 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
|
179 _terraform_err_tile = TileXY(x, y); |
11730
a39da1e4c1f5
(svn r16118) -Change/cleanup: remove the hexadecimal 'in TTD the string had this ID' from 'some' strings and replace the string name with something more sensible.
rubidium <rubidium@openttd.org>
parents:
11090
diff
changeset
|
180 return_cmd_error(STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP); |
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
|
181 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
182 |
16349
b1fc0cfd2943
(svn r21060) -Doc: Improved wording of comments (mostly by __ln__)
alberth <alberth@openttd.org>
parents:
16055
diff
changeset
|
183 /* Mark incident tiles that are involved in the terraforming. */ |
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 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
|
185 |
2191f47ab047
(svn 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 /* 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
|
187 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
|
188 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
189 CommandCost total_cost(EXPENSES_CONSTRUCTION); |
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
190 |
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
|
191 /* Increment cost */ |
13486
f2535c5098a0
(svn r18005) -Codechange: Convert the Prices struct into an array and an enum.
frosch <frosch@openttd.org>
parents:
13186
diff
changeset
|
192 total_cost.AddCost(_price[PR_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
|
193 |
2191f47ab047
(svn 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 /* 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
|
195 { |
2191f47ab047
(svn 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 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
|
197 |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
198 TileIndex orig_tile = 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
|
199 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
|
200 { 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
|
201 {-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
|
202 { 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
|
203 { 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
|
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 |
2191f47ab047
(svn 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 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
|
207 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
|
208 |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
209 if (tile >= MapSize()) continue; |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
210 /* Make sure we don't wrap around the map */ |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
211 if (Delta(TileX(orig_tile), TileX(tile)) == MapSizeX() - 1) continue; |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
212 if (Delta(TileY(orig_tile), TileY(tile)) == MapSizeY() - 1) continue; |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
213 |
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
|
214 /* 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
|
215 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
|
216 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
|
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 /* 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
|
219 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
|
220 /* 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
|
221 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
|
222 CommandCost cost = TerraformTileHeight(ts, tile, r + height_diff); |
14314
60d313b887b8
(svn r18866) -Codechange: remove the CmdFailed(ret)/CmdSucceeded(ret) wrapper functions
rubidium <rubidium@openttd.org>
parents:
14175
diff
changeset
|
223 if (cost.Failed()) return cost; |
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
|
224 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
|
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 } |
2191f47ab047
(svn 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 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
228 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
229 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
|
230 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
231 |
15620
f8e9a3f0c140
(svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents:
15533
diff
changeset
|
232 /** |
f8e9a3f0c140
(svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents:
15533
diff
changeset
|
233 * 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
|
234 * @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
|
235 * @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
|
236 * @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
|
237 * @param p2 direction; eg up (non-zero) or down (zero) |
13067
082cdb4504ac
(svn r17567) -Fix: some doxygen warnings
rubidium <rubidium@openttd.org>
parents:
12778
diff
changeset
|
238 * @param text unused |
082cdb4504ac
(svn r17567) -Fix: some doxygen warnings
rubidium <rubidium@openttd.org>
parents:
12778
diff
changeset
|
239 * @return the cost of this operation or an error |
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
|
240 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
241 CommandCost CmdTerraformLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) |
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
|
242 { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
243 _terraform_err_tile = INVALID_TILE; |
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
244 |
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
|
245 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
|
246 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
|
247 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
|
248 |
2191f47ab047
(svn 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 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
|
250 |
2191f47ab047
(svn 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 /* Compute the costs and the terraforming result in a model of the landscape */ |
10868
54ff22c7986f
(svn r15203) -Fix (r15190): CmdTerraformLand didn't check it's parameters good enough.
Yexo <Yexo@openttd.org>
parents:
10855
diff
changeset
|
252 if ((p1 & SLOPE_W) != 0 && tile + TileDiffXY(1, 0) < MapSize()) { |
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
|
253 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
|
254 CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction); |
14314
60d313b887b8
(svn r18866) -Codechange: remove the CmdFailed(ret)/CmdSucceeded(ret) wrapper functions
rubidium <rubidium@openttd.org>
parents:
14175
diff
changeset
|
255 if (cost.Failed()) return cost; |
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
|
256 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
|
257 } |
2191f47ab047
(svn 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 |
10868
54ff22c7986f
(svn r15203) -Fix (r15190): CmdTerraformLand didn't check it's parameters good enough.
Yexo <Yexo@openttd.org>
parents:
10855
diff
changeset
|
259 if ((p1 & SLOPE_S) != 0 && tile + TileDiffXY(1, 1) < MapSize()) { |
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
|
260 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
|
261 CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction); |
14314
60d313b887b8
(svn r18866) -Codechange: remove the CmdFailed(ret)/CmdSucceeded(ret) wrapper functions
rubidium <rubidium@openttd.org>
parents:
14175
diff
changeset
|
262 if (cost.Failed()) return cost; |
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
|
263 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
|
264 } |
2191f47ab047
(svn 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 |
10868
54ff22c7986f
(svn r15203) -Fix (r15190): CmdTerraformLand didn't check it's parameters good enough.
Yexo <Yexo@openttd.org>
parents:
10855
diff
changeset
|
266 if ((p1 & SLOPE_E) != 0 && tile + TileDiffXY(0, 1) < MapSize()) { |
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
|
267 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
|
268 CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction); |
14314
60d313b887b8
(svn r18866) -Codechange: remove the CmdFailed(ret)/CmdSucceeded(ret) wrapper functions
rubidium <rubidium@openttd.org>
parents:
14175
diff
changeset
|
269 if (cost.Failed()) return cost; |
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
|
270 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
|
271 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
272 |
2191f47ab047
(svn 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 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
|
274 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
|
275 CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction); |
14314
60d313b887b8
(svn r18866) -Codechange: remove the CmdFailed(ret)/CmdSucceeded(ret) wrapper functions
rubidium <rubidium@openttd.org>
parents:
14175
diff
changeset
|
276 if (cost.Failed()) return cost; |
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
|
277 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
|
278 } |
2191f47ab047
(svn 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 |
16561
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
280 /* Check if the terraforming is valid wrt. tunnels, bridges and objects on the surface |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
281 * Pass == 0: Collect tileareas which are caused to be auto-cleared. |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
282 * Pass == 1: Collect the actual cost. */ |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
283 for (int pass = 0; pass < 2; pass++) { |
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
|
284 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
|
285 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
286 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
|
287 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
|
288 |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
289 assert(tile < MapSize()); |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
290 /* MP_VOID tiles can be terraformed but as tunnels and bridges |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
291 * cannot go under / over these tiles they don't need checking. */ |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
292 if (IsTileType(tile, MP_VOID)) continue; |
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
293 |
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
|
294 /* 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
|
295 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
|
296 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
|
297 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
|
298 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
|
299 |
2191f47ab047
(svn 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 /* 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
|
301 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
|
302 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
|
303 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
304 /* 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 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
|
310 |
17676
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
311 if (pass == 0) { |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
312 /* Check if bridge would take damage */ |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
313 if (direction == 1 && MayHaveBridgeAbove(tile) && IsBridgeAbove(tile) && |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
314 GetBridgeHeight(GetSouthernBridgeEnd(tile)) <= z_max * TILE_HEIGHT) { |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
315 _terraform_err_tile = tile; // highlight the tile under the bridge |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
316 return_cmd_error(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
317 } |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
318 /* Check if tunnel would take damage */ |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
319 if (direction == -1 && IsTunnelInWay(tile, z_min * TILE_HEIGHT)) { |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
320 _terraform_err_tile = tile; // highlight the tile above the tunnel |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
321 return_cmd_error(STR_ERROR_EXCAVATION_WOULD_DAMAGE); |
3be3d8523223
(svn r22451) -Codechange: Test for bridges and tunnels during the first pass only while terraforming (HackaLittleBit)
alberth <alberth@openttd.org>
parents:
17277
diff
changeset
|
322 } |
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
|
323 } |
16561
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
324 |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
325 /* Is the tile already cleared? */ |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
326 const ClearedObjectArea *coa = FindClearedObject(tile); |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
327 bool indirectly_cleared = coa != NULL && coa->first_tile != tile; |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
328 |
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
|
329 /* Check tiletype-specific things, and add extra-cost */ |
9309
f34f4fa2950c
(svn r13177) -Fix[FS#2002]: Using level tool in scenario editor makes tiles brown. That is the only tool that does so in Scenario Editor (apart dynamite, of course).Report and Fix by Roujin
belugas <belugas@openttd.org>
parents:
8816
diff
changeset
|
330 const bool curr_gen = _generating_world; |
f34f4fa2950c
(svn r13177) -Fix[FS#2002]: Using level tool in scenario editor makes tiles brown. That is the only tool that does so in Scenario Editor (apart dynamite, of course).Report and Fix by Roujin
belugas <belugas@openttd.org>
parents:
8816
diff
changeset
|
331 if (_game_mode == GM_EDITOR) _generating_world = true; // used to create green terraformed land |
16561
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
332 DoCommandFlag tile_flags = flags | DC_AUTO | DC_FORCE_CLEAR_TILE; |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
333 if (pass == 0) { |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
334 tile_flags &= ~DC_EXEC; |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
335 tile_flags |= DC_NO_MODIFY_TOWN_RATING; |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
336 } |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
337 CommandCost cost; |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
338 if (indirectly_cleared) { |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
339 cost = DoCommand(tile, 0, 0, tile_flags, CMD_LANDSCAPE_CLEAR); |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
340 } else { |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
341 cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, tile_flags, z_min * TILE_HEIGHT, tileh); |
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
342 } |
9309
f34f4fa2950c
(svn r13177) -Fix[FS#2002]: Using level tool in scenario editor makes tiles brown. That is the only tool that does so in Scenario Editor (apart dynamite, of course).Report and Fix by Roujin
belugas <belugas@openttd.org>
parents:
8816
diff
changeset
|
343 _generating_world = curr_gen; |
14314
60d313b887b8
(svn r18866) -Codechange: remove the CmdFailed(ret)/CmdSucceeded(ret) wrapper functions
rubidium <rubidium@openttd.org>
parents:
14175
diff
changeset
|
344 if (cost.Failed()) { |
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
|
345 _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
|
346 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
|
347 } |
16561
7ca019b56d4e
(svn r21289) -Fix [FS#4133]: Make terraforming and tunnel-excavation handle DC_AUTO-clearable multitile objects.
frosch <frosch@openttd.org>
parents:
16349
diff
changeset
|
348 if (pass == 1) total_cost.AddCost(cost); |
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
|
349 } |
2191f47ab047
(svn 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 |
16992
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
352 Company *c = Company::GetIfValid(_current_company); |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
353 if (c != NULL && (int)GB(c->terraform_limit, 16, 16) < ts.modheight_count) { |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
354 return_cmd_error(STR_ERROR_TERRAFORM_LIMIT_REACHED); |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
355 } |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
356 |
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
|
357 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
|
358 /* 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
|
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 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
|
361 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
|
362 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
363 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
|
364 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
|
365 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
|
366 |
2191f47ab047
(svn 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 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
|
368 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
369 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
370 |
2191f47ab047
(svn 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 /* 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
|
372 { |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
373 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
|
374 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
|
375 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
|
376 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
|
377 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
378 } |
16992
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
379 |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
380 if (c != NULL) c->terraform_limit -= ts.modheight_count << 16; |
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
|
381 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
382 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
|
383 } |
2191f47ab047
(svn 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 |
2191f47ab047
(svn 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 |
15620
f8e9a3f0c140
(svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents:
15533
diff
changeset
|
386 /** |
f8e9a3f0c140
(svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents:
15533
diff
changeset
|
387 * Levels a selected (rectangle) area of 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
|
388 * @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
|
389 * @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
|
390 * @param p1 start tile of area drag |
16760
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
391 * @param p2 various bitstuffed data. |
16767
3a5666e0d4bc
(svn r21500) -Feature [FS#730]: diagonal tile clearing and terraforming. Based on patch by fonsinchen
rubidium <rubidium@openttd.org>
parents:
16762
diff
changeset
|
392 * bit 0: Whether to use the Orthogonal (0) or Diagonal (1) iterator. |
16760
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
393 * bits 1 - 2: Mode of leveling \c LevelMode. |
13067
082cdb4504ac
(svn r17567) -Fix: some doxygen warnings
rubidium <rubidium@openttd.org>
parents:
12778
diff
changeset
|
394 * @param text unused |
082cdb4504ac
(svn r17567) -Fix: some doxygen warnings
rubidium <rubidium@openttd.org>
parents:
12778
diff
changeset
|
395 * @return the cost of this operation or an error |
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
|
396 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
397 CommandCost CmdLevelLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) |
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
|
398 { |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
399 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
|
400 |
10804
2c9373a99b65
(svn r15138) -Fix [FS#2542]: tile error location not reset when leveling land causing a tile to be highlighted when there was nothing to flatten.
rubidium <rubidium@openttd.org>
parents:
10499
diff
changeset
|
401 _terraform_err_tile = INVALID_TILE; |
2c9373a99b65
(svn r15138) -Fix [FS#2542]: tile error location not reset when leveling land causing a tile to be highlighted when there was nothing to flatten.
rubidium <rubidium@openttd.org>
parents:
10499
diff
changeset
|
402 |
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
|
403 /* remember level height */ |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
404 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
|
405 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
406 /* compute new height */ |
16760
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
407 uint h = oldh; |
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
408 LevelMode lm = (LevelMode)GB(p2, 1, 2); |
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
409 switch (lm) { |
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
410 case LM_LEVEL: break; |
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
411 case LM_RAISE: h++; break; |
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
412 case LM_LOWER: h--; break; |
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
413 default: return CMD_ERROR; |
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
414 } |
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
|
415 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
416 /* Check range of destination height */ |
11730
a39da1e4c1f5
(svn r16118) -Change/cleanup: remove the hexadecimal 'in TTD the string had this ID' from 'some' strings and replace the string name with something more sensible.
rubidium <rubidium@openttd.org>
parents:
11090
diff
changeset
|
417 if (h > MAX_TILE_HEIGHT) return_cmd_error((oldh == 0) ? STR_ERROR_ALREADY_AT_SEA_LEVEL : STR_ERROR_TOO_HIGH); |
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
|
418 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
419 Money money = GetAvailableMoneyForCommand(); |
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
420 CommandCost cost(EXPENSES_CONSTRUCTION); |
16760
9e31dde37aed
(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
rubidium <rubidium@openttd.org>
parents:
16561
diff
changeset
|
421 CommandCost last_error(lm == LM_LEVEL ? STR_ERROR_ALREADY_LEVELLED : INVALID_STRING_ID); |
14894
d91811686eca
(svn r19490) -Fix: Return to old behaviour of CmdLevelLand() by keeping track of last error.
alberth <alberth@openttd.org>
parents:
14728
diff
changeset
|
422 bool had_success = false; |
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
|
423 |
16992
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
424 const Company *c = Company::GetIfValid(_current_company); |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
425 int limit = (c == NULL ? INT32_MAX : GB(c->terraform_limit, 16, 16)); |
16996
0c0473c260b1
(svn r21732) -Fix (r21728): show the "proper" error that the landscaping limit is reached instead of "already flat"
rubidium <rubidium@openttd.org>
parents:
16992
diff
changeset
|
426 if (limit == 0) return_cmd_error(STR_ERROR_TERRAFORM_LIMIT_REACHED); |
16992
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
427 |
14175
f1393258ecd5
(svn r18723) -Codechange: also simplify looping over an area when building trees, desert, rocky areas or leveling land
rubidium <rubidium@openttd.org>
parents:
13486
diff
changeset
|
428 TileArea ta(tile, p1); |
16767
3a5666e0d4bc
(svn r21500) -Feature [FS#730]: diagonal tile clearing and terraforming. Based on patch by fonsinchen
rubidium <rubidium@openttd.org>
parents:
16762
diff
changeset
|
429 TileIterator *iter = HasBit(p2, 0) ? (TileIterator *)new DiagonalTileIterator(tile, p1) : new OrthogonalTileIterator(ta); |
3a5666e0d4bc
(svn r21500) -Feature [FS#730]: diagonal tile clearing and terraforming. Based on patch by fonsinchen
rubidium <rubidium@openttd.org>
parents:
16762
diff
changeset
|
430 for (; *iter != INVALID_TILE; ++(*iter)) { |
3a5666e0d4bc
(svn r21500) -Feature [FS#730]: diagonal tile clearing and terraforming. Based on patch by fonsinchen
rubidium <rubidium@openttd.org>
parents:
16762
diff
changeset
|
431 TileIndex t = *iter; |
16762
c0ddbaaeb487
(svn r21495) -Codechange: don't hide a local variable
rubidium <rubidium@openttd.org>
parents:
16760
diff
changeset
|
432 uint curh = TileHeight(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
|
433 while (curh != h) { |
16762
c0ddbaaeb487
(svn r21495) -Codechange: don't hide a local variable
rubidium <rubidium@openttd.org>
parents:
16760
diff
changeset
|
434 CommandCost ret = DoCommand(t, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND); |
14894
d91811686eca
(svn r19490) -Fix: Return to old behaviour of CmdLevelLand() by keeping track of last error.
alberth <alberth@openttd.org>
parents:
14728
diff
changeset
|
435 if (ret.Failed()) { |
d91811686eca
(svn r19490) -Fix: Return to old behaviour of CmdLevelLand() by keeping track of last error.
alberth <alberth@openttd.org>
parents:
14728
diff
changeset
|
436 last_error = ret; |
16992
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
437 |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
438 /* Did we reach the limit? */ |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
439 if (ret.GetErrorMessage() == STR_ERROR_TERRAFORM_LIMIT_REACHED) limit = 0; |
14894
d91811686eca
(svn r19490) -Fix: Return to old behaviour of CmdLevelLand() by keeping track of last error.
alberth <alberth@openttd.org>
parents:
14728
diff
changeset
|
440 break; |
d91811686eca
(svn r19490) -Fix: Return to old behaviour of CmdLevelLand() by keeping track of last error.
alberth <alberth@openttd.org>
parents:
14728
diff
changeset
|
441 } |
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
|
442 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
443 if (flags & DC_EXEC) { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
444 money -= ret.GetCost(); |
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
445 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
|
446 _additional_cash_required = ret.GetCost(); |
16767
3a5666e0d4bc
(svn r21500) -Feature [FS#730]: diagonal tile clearing and terraforming. Based on patch by fonsinchen
rubidium <rubidium@openttd.org>
parents:
16762
diff
changeset
|
447 delete iter; |
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
|
448 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
|
449 } |
16762
c0ddbaaeb487
(svn r21495) -Codechange: don't hide a local variable
rubidium <rubidium@openttd.org>
parents:
16760
diff
changeset
|
450 DoCommand(t, SLOPE_N, (curh > h) ? 0 : 1, flags, CMD_TERRAFORM_LAND); |
16992
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
451 } else { |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
452 /* When we're at the terraform limit we better bail (unneeded) testing as well. |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
453 * This will probably cause the terraforming cost to be underestimated, but only |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
454 * when it's near the terraforming limit. Even then, the estimation is |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
455 * completely off due to it basically counting terraforming double, so it being |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
456 * cut off earlier might even give a better estimate in some cases. */ |
17054
edf90c14dda2
(svn r21791) -Fix [FS#4407]: off-by-one-ish for the terraforming limit
rubidium <rubidium@openttd.org>
parents:
16996
diff
changeset
|
457 if (--limit <= 0) { |
edf90c14dda2
(svn r21791) -Fix [FS#4407]: off-by-one-ish for the terraforming limit
rubidium <rubidium@openttd.org>
parents:
16996
diff
changeset
|
458 had_success = true; |
edf90c14dda2
(svn r21791) -Fix [FS#4407]: off-by-one-ish for the terraforming limit
rubidium <rubidium@openttd.org>
parents:
16996
diff
changeset
|
459 break; |
edf90c14dda2
(svn r21791) -Fix [FS#4407]: off-by-one-ish for the terraforming limit
rubidium <rubidium@openttd.org>
parents:
16996
diff
changeset
|
460 } |
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
|
461 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
462 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
463 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
|
464 curh += (curh > h) ? -1 : 1; |
14894
d91811686eca
(svn r19490) -Fix: Return to old behaviour of CmdLevelLand() by keeping track of last error.
alberth <alberth@openttd.org>
parents:
14728
diff
changeset
|
465 had_success = true; |
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
|
466 } |
16992
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
467 |
e364b524e15a
(svn r21728) -Fix/Feature [FS#4331]: (configurably) limit amount of tiles that can be cleared/terraformed by a company
rubidium <rubidium@openttd.org>
parents:
16767
diff
changeset
|
468 if (limit <= 0) break; |
12529
f24901a2ad84
(svn r16966) -Codechange: BEGIN_TILE_LOOP and END_TILE_LOOP reworked into TILE_LOOP, which means no more duplication of parameters between BEGIN_TILE_LOOP and END_TILE_LOOP
rubidium <rubidium@openttd.org>
parents:
11730
diff
changeset
|
469 } |
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
|
470 |
16767
3a5666e0d4bc
(svn r21500) -Feature [FS#730]: diagonal tile clearing and terraforming. Based on patch by fonsinchen
rubidium <rubidium@openttd.org>
parents:
16762
diff
changeset
|
471 delete iter; |
14894
d91811686eca
(svn r19490) -Fix: Return to old behaviour of CmdLevelLand() by keeping track of last error.
alberth <alberth@openttd.org>
parents:
14728
diff
changeset
|
472 return had_success ? cost : last_error; |
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
|
473 } |