summaryrefslogtreecommitdiff
path: root/src/tree_cmd.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-01-04 18:49:27 +0000
committerrubidium <rubidium@openttd.org>2010-01-04 18:49:27 +0000
commitb42e76d85897af64c7b2ca5c58e15c1286ea639c (patch)
tree1fdd445654e0732c63926e69bf4ab8eb23861c96 /src/tree_cmd.cpp
parent76bf94bf0028eeb9b147c8b1ec23101e5f611bac (diff)
downloadopenttd-b42e76d85897af64c7b2ca5c58e15c1286ea639c.tar.xz
(svn r18723) -Codechange: also simplify looping over an area when building trees, desert, rocky areas or leveling land
Diffstat (limited to 'src/tree_cmd.cpp')
-rw-r--r--src/tree_cmd.cpp140
1 files changed, 63 insertions, 77 deletions
diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp
index 1754acf14..f0f149db7 100644
--- a/src/tree_cmd.cpp
+++ b/src/tree_cmd.cpp
@@ -345,98 +345,84 @@ CommandCost CmdPlantTree(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
{
StringID msg = INVALID_STRING_ID;
CommandCost cost(EXPENSES_OTHER);
- int ex;
- int ey;
- int sx, sy, x, y;
if (p2 >= MapSize()) return CMD_ERROR;
/* Check the tree type. It can be random or some valid value within the current climate */
if (p1 != UINT_MAX && p1 - _tree_base_by_landscape[_settings_game.game_creation.landscape] >= _tree_count_by_landscape[_settings_game.game_creation.landscape]) return CMD_ERROR;
- /* make sure sx,sy are smaller than ex, ey */
- ex = TileX(tile);
- ey = TileY(tile);
- sx = TileX(p2);
- sy = TileY(p2);
- if (ex < sx) Swap(ex, sx);
- if (ey < sy) Swap(ey, sy);
-
- for (x = sx; x <= ex; x++) {
- for (y = sy; y <= ey; y++) {
- TileIndex tile = TileXY(x, y);
-
- switch (GetTileType(tile)) {
- case MP_TREES:
- /* no more space for trees? */
- if (_game_mode != GM_EDITOR && GetTreeCount(tile) == 4) {
- msg = STR_ERROR_TREE_ALREADY_HERE;
- continue;
- }
+ TileArea ta(tile, p2);
+ TILE_AREA_LOOP(tile, ta) {
+ switch (GetTileType(tile)) {
+ case MP_TREES:
+ /* no more space for trees? */
+ if (_game_mode != GM_EDITOR && GetTreeCount(tile) == 4) {
+ msg = STR_ERROR_TREE_ALREADY_HERE;
+ continue;
+ }
- if (flags & DC_EXEC) {
- AddTreeCount(tile, 1);
- MarkTileDirtyByTile(tile);
- }
- /* 2x as expensive to add more trees to an existing tile */
- cost.AddCost(_price[PR_BUILD_TREES] * 2);
- break;
-
- case MP_WATER:
- if (!IsCoast(tile) || IsSlopeWithOneCornerRaised(GetTileSlope(tile, NULL))) {
- msg = STR_ERROR_CAN_T_BUILD_ON_WATER;
- continue;
- }
- /* FALL THROUGH */
- case MP_CLEAR:
- if (IsBridgeAbove(tile)) {
- msg = STR_ERROR_SITE_UNSUITABLE;
- continue;
- }
+ if (flags & DC_EXEC) {
+ AddTreeCount(tile, 1);
+ MarkTileDirtyByTile(tile);
+ }
+ /* 2x as expensive to add more trees to an existing tile */
+ cost.AddCost(_price[PR_BUILD_TREES] * 2);
+ break;
+
+ case MP_WATER:
+ if (!IsCoast(tile) || IsSlopeWithOneCornerRaised(GetTileSlope(tile, NULL))) {
+ msg = STR_ERROR_CAN_T_BUILD_ON_WATER;
+ continue;
+ }
+ /* FALL THROUGH */
+ case MP_CLEAR:
+ if (IsBridgeAbove(tile)) {
+ msg = STR_ERROR_SITE_UNSUITABLE;
+ continue;
+ }
- if (IsTileType(tile, MP_CLEAR)) {
- /* Remove fields or rocks. Note that the ground will get barrened */
- switch (GetClearGround(tile)) {
- case CLEAR_FIELDS:
- case CLEAR_ROCKS: {
- CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
- if (CmdFailed(ret)) return ret;
- cost.AddCost(ret);
- break;
- }
-
- default: break;
+ if (IsTileType(tile, MP_CLEAR)) {
+ /* Remove fields or rocks. Note that the ground will get barrened */
+ switch (GetClearGround(tile)) {
+ case CLEAR_FIELDS:
+ case CLEAR_ROCKS: {
+ CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
+ if (CmdFailed(ret)) return ret;
+ cost.AddCost(ret);
+ break;
}
- }
- if (_game_mode != GM_EDITOR && Company::IsValidID(_current_company)) {
- Town *t = ClosestTownFromTile(tile, _settings_game.economy.dist_local_authority);
- if (t != NULL) ChangeTownRating(t, RATING_TREE_UP_STEP, RATING_TREE_MAXIMUM, flags);
+ default: break;
}
+ }
- if (flags & DC_EXEC) {
- TreeType treetype;
-
- treetype = (TreeType)p1;
- if (treetype == TREE_INVALID) {
- treetype = GetRandomTreeType(tile, GB(Random(), 24, 8));
- if (treetype == TREE_INVALID) treetype = TREE_CACTUS;
- }
+ if (_game_mode != GM_EDITOR && Company::IsValidID(_current_company)) {
+ Town *t = ClosestTownFromTile(tile, _settings_game.economy.dist_local_authority);
+ if (t != NULL) ChangeTownRating(t, RATING_TREE_UP_STEP, RATING_TREE_MAXIMUM, flags);
+ }
- /* Plant full grown trees in scenario editor */
- PlantTreesOnTile(tile, treetype, 0, _game_mode == GM_EDITOR ? 3 : 0);
- MarkTileDirtyByTile(tile);
+ if (flags & DC_EXEC) {
+ TreeType treetype;
- /* When planting rainforest-trees, set tropiczone to rainforest in editor. */
- if (_game_mode == GM_EDITOR && IsInsideMM(treetype, TREE_RAINFOREST, TREE_CACTUS))
- SetTropicZone(tile, TROPICZONE_RAINFOREST);
+ treetype = (TreeType)p1;
+ if (treetype == TREE_INVALID) {
+ treetype = GetRandomTreeType(tile, GB(Random(), 24, 8));
+ if (treetype == TREE_INVALID) treetype = TREE_CACTUS;
}
- cost.AddCost(_price[PR_BUILD_TREES]);
- break;
- default:
- msg = STR_ERROR_SITE_UNSUITABLE;
- break;
- }
+ /* Plant full grown trees in scenario editor */
+ PlantTreesOnTile(tile, treetype, 0, _game_mode == GM_EDITOR ? 3 : 0);
+ MarkTileDirtyByTile(tile);
+
+ /* When planting rainforest-trees, set tropiczone to rainforest in editor. */
+ if (_game_mode == GM_EDITOR && IsInsideMM(treetype, TREE_RAINFOREST, TREE_CACTUS))
+ SetTropicZone(tile, TROPICZONE_RAINFOREST);
+ }
+ cost.AddCost(_price[PR_BUILD_TREES]);
+ break;
+
+ default:
+ msg = STR_ERROR_SITE_UNSUITABLE;
+ break;
}
}