Mercurial > hg > openttd
annotate src/terraform_cmd.cpp @ 20618:8dedb76a6fbb draft
(svn r25564) -Add: a simple clipping rule to decide whether a string without linebreaks is visible before computing the layouting. This skips around 2/3 of layout computations in usual-sized list-like windows.
author | frosch <frosch@openttd.org> |
---|---|
date | Sat, 06 Jul 2013 12:18:20 +0000 |
parents | 0dba7f49118c |
children |
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" |
15531
93093fe9137c
(svn r20190) -Codechange: unVARDEF _generate_world and move it to genworld
rubidium <rubidium@openttd.org>
parents:
15187
diff
changeset
|
17 #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
|
18 #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
|
19 #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
|
20 #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
|
21 |
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
|
22 #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
|
23 |
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
|
24 /* |
2191f47ab047
(svn 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 * In one terraforming command all four corners of a initial tile can be raised/lowered (though this is not available to the player). |
19968
0dba7f49118c
(svn r24900) -Fix [FS#5389]: Comments with typos (most fixes supplied by Eagle_rainbow)
planetmaker <planetmaker@openttd.org>
parents:
18891
diff
changeset
|
26 * The maximal amount of height modifications is achieved when raising a complete flat land from sea level to MAX_TILE_HEIGHT or vice versa. |
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
|
27 * 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
|
28 * 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
|
29 */ |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
30 static const int TERRAFORMER_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
|
31 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
32 /* |
19968
0dba7f49118c
(svn r24900) -Fix [FS#5389]: Comments with typos (most fixes supplied by Eagle_rainbow)
planetmaker <planetmaker@openttd.org>
parents:
18891
diff
changeset
|
33 * The maximal amount of affected tiles (i.e. the tiles that incident with one of the corners above, is computed similar to |
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
|
34 * 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
|
35 */ |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
36 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
|
37 |
2191f47ab047
(svn 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 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
|
39 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
|
40 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
|
41 }; |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
42 |
2191f47ab047
(svn 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 struct TerraformerState { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
44 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
|
45 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
|
46 |
2191f47ab047
(svn 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 * 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
|
49 * |
2191f47ab047
(svn 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 * 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
|
51 * |
2191f47ab047
(svn 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 * @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
|
53 */ |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
54 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
|
55 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
|
56 }; |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
57 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
58 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
|
59 |
2191f47ab047
(svn 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 * 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
|
62 * |
2191f47ab047
(svn 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 * @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
|
64 * @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
|
65 * @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
|
66 */ |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
67 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
|
68 { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
69 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
|
70 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
71 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
|
72 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
|
73 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
74 |
2191f47ab047
(svn 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 /* 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
|
76 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
|
77 } |
2191f47ab047
(svn 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 * 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
|
81 * |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
82 * @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
|
83 * @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
|
84 * @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
|
85 */ |
2191f47ab047
(svn 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 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
|
87 { |
2191f47ab047
(svn 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 /* 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
|
89 * 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
|
90 * 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
|
91 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
|
92 int count = ts->modheight_count; |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
93 |
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
|
94 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
|
95 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
|
96 count--; |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
97 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
98 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
99 /* 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
|
100 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
|
101 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
|
102 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
|
103 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
104 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
105 /* 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
|
106 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
|
107 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
|
108 } |
2191f47ab047
(svn 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 * 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
|
112 * |
2191f47ab047
(svn 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 * @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
|
114 * @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
|
115 * @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
|
116 */ |
2191f47ab047
(svn 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 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
|
118 { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
119 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
|
120 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
121 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
|
122 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
|
123 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
124 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
125 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
|
126 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
127 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
|
128 } |
2191f47ab047
(svn 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 * 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
|
132 * |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
133 * @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
|
134 * @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
|
135 * @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
|
136 */ |
2191f47ab047
(svn 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 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
|
138 { |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
139 /* 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
|
140 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
|
141 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
|
142 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
|
143 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
|
144 } |
2191f47ab047
(svn 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 * 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
|
148 * |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
149 * @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
|
150 * @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
|
151 * @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
|
152 * @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
|
153 */ |
2191f47ab047
(svn 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 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
|
155 { |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
156 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
|
157 |
2191f47ab047
(svn 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 /* 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
|
159 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
|
160 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
|
161 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
162 /* |
2191f47ab047
(svn 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 * 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
|
164 * 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
|
165 * 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
|
166 */ |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
167 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
|
168 |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
169 /* 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
|
170 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
|
171 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
|
172 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
|
173 /* |
2191f47ab047
(svn 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 * 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
|
175 */ |
10816
35b3e8e25590
(svn r15151) -Fix: tile 0 can now be highlighted as error tile
Yexo <Yexo@openttd.org>
parents:
10804
diff
changeset
|
176 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
|
177 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
|
178 _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
|
179 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
|
180 } |
2191f47ab047
(svn 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 |
16349
b1fc0cfd2943
(svn r21060) -Doc: Improved wording of comments (mostly by __ln__)
alberth <alberth@openttd.org>
parents:
16055
diff
changeset
|
182 /* 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
|
183 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
|
184 |
2191f47ab047
(svn 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 /* 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
|
186 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
|
187 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
188 CommandCost total_cost(EXPENSES_CONSTRUCTION); |
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
189 |
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
|
190 /* 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
|
191 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
|
192 |
2191f47ab047
(svn 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 /* 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
|
194 { |
2191f47ab047
(svn 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 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
|
196 |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
197 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
|
198 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
|
199 { 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
|
200 {-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
|
201 { 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
|
202 { 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
|
203 }; |
2191f47ab047
(svn 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 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
|
206 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
|
207 |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
208 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
|
209 /* 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
|
210 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
|
211 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
|
212 |
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
|
213 /* 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
|
214 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
|
215 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
|
216 |
2191f47ab047
(svn 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 /* 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
|
218 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
|
219 /* 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
|
220 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
|
221 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
|
222 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
|
223 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
|
224 } |
2191f47ab047
(svn 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 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
|
229 } |
2191f47ab047
(svn 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 |
15620
f8e9a3f0c140
(svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents:
15533
diff
changeset
|
231 /** |
f8e9a3f0c140
(svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents:
15533
diff
changeset
|
232 * 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
|
233 * @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
|
234 * @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
|
235 * @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
|
236 * @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
|
237 * @param text unused |
082cdb4504ac
(svn r17567) -Fix: some doxygen warnings
rubidium <rubidium@openttd.org>
parents:
12778
diff
changeset
|
238 * @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
|
239 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
240 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
|
241 { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
242 _terraform_err_tile = INVALID_TILE; |
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
243 |
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
|
244 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
|
245 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
|
246 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
|
247 |
2191f47ab047
(svn 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 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
|
249 |
2191f47ab047
(svn 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 /* 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
|
251 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
|
252 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
|
253 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
|
254 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
|
255 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
|
256 } |
2191f47ab047
(svn 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 |
10868
54ff22c7986f
(svn r15203) -Fix (r15190): CmdTerraformLand didn't check it's parameters good enough.
Yexo <Yexo@openttd.org>
parents:
10855
diff
changeset
|
258 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 } |
2191f47ab047
(svn 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 |
10868
54ff22c7986f
(svn r15203) -Fix (r15190): CmdTerraformLand didn't check it's parameters good enough.
Yexo <Yexo@openttd.org>
parents:
10855
diff
changeset
|
265 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
|
266 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
|
267 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
|
268 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
|
269 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
|
270 } |
2191f47ab047
(svn 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 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
|
273 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
|
274 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
|
275 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
|
276 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
|
277 } |
2191f47ab047
(svn 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 |
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
|
279 /* 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
|
280 * 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
|
281 * 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
|
282 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
|
283 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
|
284 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
285 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
|
286 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
|
287 |
10855
7881d9cd55ab
(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.
Yexo <Yexo@openttd.org>
parents:
10816
diff
changeset
|
288 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
|
289 /* 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
|
290 * 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
|
291 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
|
292 |
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
|
293 /* Find new heights of tile corners */ |
18270
432112453b2e
(svn r23106) -Codechange: pass int* to GetTileSlope and friends
rubidium <rubidium@openttd.org>
parents:
18264
diff
changeset
|
294 int z_N = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 0)); |
432112453b2e
(svn r23106) -Codechange: pass int* to GetTileSlope and friends
rubidium <rubidium@openttd.org>
parents:
18264
diff
changeset
|
295 int z_W = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 0)); |
432112453b2e
(svn r23106) -Codechange: pass int* to GetTileSlope and friends
rubidium <rubidium@openttd.org>
parents:
18264
diff
changeset
|
296 int z_S = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 1)); |
432112453b2e
(svn r23106) -Codechange: pass int* to GetTileSlope and friends
rubidium <rubidium@openttd.org>
parents:
18264
diff
changeset
|
297 int z_E = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 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
|
298 |
2191f47ab047
(svn 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 /* Find min and max height of tile */ |
18270
432112453b2e
(svn r23106) -Codechange: pass int* to GetTileSlope and friends
rubidium <rubidium@openttd.org>
parents:
18264
diff
changeset
|
300 int z_min = min(min(z_N, z_W), min(z_S, z_E)); |
432112453b2e
(svn r23106) -Codechange: pass int* to GetTileSlope and friends
rubidium <rubidium@openttd.org>
parents:
18264
diff
changeset
|
301 int z_max = max(max(z_N, z_W), max(z_S, z_E)); |
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
|
302 |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
303 /* 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
|
304 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 |
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
|
310 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
|
311 /* 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
|
312 if (direction == 1 && MayHaveBridgeAbove(tile) && IsBridgeAbove(tile) && |
18261
9cdb7965ac4a
(svn r23097) -Codechange: remove pointless multiplications by TILE_HEIGHT from the bridge code
rubidium <rubidium@openttd.org>
parents:
18255
diff
changeset
|
313 GetBridgeHeight(GetSouthernBridgeEnd(tile)) <= z_max) { |
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
|
314 _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
|
315 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
|
316 } |
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 /* Check if tunnel would take damage */ |
18262
9fcde0b48dcd
(svn r23098) -Codechange: remove pointless multiplications by TILE_HEIGHT from the tunnel code
rubidium <rubidium@openttd.org>
parents:
18261
diff
changeset
|
318 if (direction == -1 && IsTunnelInWay(tile, z_min)) { |
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
|
319 _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
|
320 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
|
321 } |
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
|
322 } |
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
|
323 |
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 /* 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
|
325 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
|
326 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
|
327 |
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
|
328 /* 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
|
329 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
|
330 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
|
331 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
|
332 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
|
333 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
|
334 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
|
335 } |
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 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
|
337 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
|
338 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
|
339 } else { |
18264
e33480209002
(svn r23100) -Codechange: remove pointless multiplications by TILE_HEIGHT for the terraform code
rubidium <rubidium@openttd.org>
parents:
18262
diff
changeset
|
340 cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, tile_flags, z_min, tileh); |
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
|
341 } |
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
|
342 _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
|
343 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
|
344 _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
|
345 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
|
346 } |
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
|
347 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
|
348 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
349 } |
2191f47ab047
(svn 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 |
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
|
351 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
|
352 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
|
353 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
|
354 } |
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 |
8210
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
356 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
|
357 /* 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
|
358 { |
2191f47ab047
(svn 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 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
|
360 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
|
361 |
2191f47ab047
(svn 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 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
|
363 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
|
364 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
|
365 |
2191f47ab047
(svn 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 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
|
367 } |
2191f47ab047
(svn 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 /* 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
|
371 { |
2191f47ab047
(svn 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 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
|
373 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
|
374 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
|
375 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
|
376 } |
2191f47ab047
(svn 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 } |
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
|
378 |
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 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
|
380 } |
2191f47ab047
(svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium <rubidium@openttd.org>
parents:
diff
changeset
|
381 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
|
382 } |
2191f47ab047
(svn 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 |
15620
f8e9a3f0c140
(svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents:
15533
diff
changeset
|
385 /** |
f8e9a3f0c140
(svn r20283) -Codechange: Unify start of doygen comments.
frosch <frosch@openttd.org>
parents:
15533
diff
changeset
|
386 * 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
|
387 * @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
|
388 * @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
|
389 * @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
|
390 * @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
|
391 * 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
|
392 * bits 1 - 2: Mode of leveling \c LevelMode. |
13067
082cdb4504ac
(svn r17567) -Fix: some doxygen warnings
rubidium <rubidium@openttd.org>
parents:
12778
diff
changeset
|
393 * @param text unused |
082cdb4504ac
(svn r17567) -Fix: some doxygen warnings
rubidium <rubidium@openttd.org>
parents:
12778
diff
changeset
|
394 * @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
|
395 */ |
11090
df23c4e04638
(svn r15434) -Codechange: bit of type safety for the DC_xxx flags.
rubidium <rubidium@openttd.org>
parents:
10960
diff
changeset
|
396 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
|
397 { |
2191f47ab047
(svn 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 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
|
399 |
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
|
400 _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
|
401 |
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
|
402 /* remember level height */ |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
403 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
|
404 |
2191f47ab047
(svn 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 /* 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
|
406 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
|
407 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
|
408 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
|
409 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
|
410 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
|
411 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
|
412 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
|
413 } |
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
|
414 |
2191f47ab047
(svn 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 /* 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
|
416 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
|
417 |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
418 Money money = GetAvailableMoneyForCommand(); |
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
419 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
|
420 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
|
421 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
|
422 |
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
|
423 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
|
424 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
|
425 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
|
426 |
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
|
427 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
|
428 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
|
429 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
|
430 TileIndex t = *iter; |
16762
c0ddbaaeb487
(svn r21495) -Codechange: don't hide a local variable
rubidium <rubidium@openttd.org>
parents:
16760
diff
changeset
|
431 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
|
432 while (curh != h) { |
16762
c0ddbaaeb487
(svn r21495) -Codechange: don't hide a local variable
rubidium <rubidium@openttd.org>
parents:
16760
diff
changeset
|
433 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
|
434 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
|
435 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
|
436 |
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 /* 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
|
438 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
|
439 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
|
440 } |
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
|
441 |
2191f47ab047
(svn 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 if (flags & DC_EXEC) { |
8816
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
443 money -= ret.GetCost(); |
d278baac2725
(svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz <smatz@openttd.org>
parents:
8801
diff
changeset
|
444 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
|
445 _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
|
446 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
|
447 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
|
448 } |
16762
c0ddbaaeb487
(svn r21495) -Codechange: don't hide a local variable
rubidium <rubidium@openttd.org>
parents:
16760
diff
changeset
|
449 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
|
450 } 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
|
451 /* 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
|
452 * 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
|
453 * 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
|
454 * 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
|
455 * 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
|
456 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
|
457 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
|
458 break; |
edf90c14dda2
(svn r21791) -Fix [FS#4407]: off-by-one-ish for the terraforming limit
rubidium <rubidium@openttd.org>
parents:
16996
diff
changeset
|
459 } |
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
|
460 } |
2191f47ab047
(svn 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 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
|
463 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
|
464 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
|
465 } |
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
|
466 |
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 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
|
468 } |
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
|
469 |
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
|
470 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
|
471 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
|
472 } |