From b42e76d85897af64c7b2ca5c58e15c1286ea639c Mon Sep 17 00:00:00 2001 From: rubidium Date: Mon, 4 Jan 2010 18:49:27 +0000 Subject: [PATCH] (svn r18723) -Codechange: also simplify looping over an area when building trees, desert, rocky areas or leveling land --- src/terraform_cmd.cpp | 21 ++---- src/terraform_gui.cpp | 30 ++------ src/tree_cmd.cpp | 154 +++++++++++++++++++----------------------- 3 files changed, 81 insertions(+), 124 deletions(-) diff --git a/src/terraform_cmd.cpp b/src/terraform_cmd.cpp index f9b227be32..7ad1ad9234 100644 --- a/src/terraform_cmd.cpp +++ b/src/terraform_cmd.cpp @@ -378,25 +378,14 @@ CommandCost CmdLevelLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if (h > MAX_TILE_HEIGHT) return_cmd_error((oldh == 0) ? STR_ERROR_ALREADY_AT_SEA_LEVEL : STR_ERROR_TOO_HIGH); if (p2 == 0) _error_message = STR_ERROR_ALREADY_LEVELLED; - /* make sure sx,sy are smaller than ex,ey */ - int ex = TileX(tile); - int ey = TileY(tile); - int sx = TileX(p1); - int sy = TileY(p1); - if (ex < sx) Swap(ex, sx); - if (ey < sy) Swap(ey, sy); - tile = TileXY(sx, sy); - - int size_x = ex - sx + 1; - int size_y = ey - sy + 1; - Money money = GetAvailableMoneyForCommand(); CommandCost cost(EXPENSES_CONSTRUCTION); - TILE_LOOP(tile2, size_x, size_y, tile) { - uint curh = TileHeight(tile2); + TileArea ta(tile, p1); + TILE_AREA_LOOP(tile, ta) { + uint curh = TileHeight(tile); while (curh != h) { - CommandCost ret = DoCommand(tile2, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND); + CommandCost ret = DoCommand(tile, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND); if (CmdFailed(ret)) break; if (flags & DC_EXEC) { @@ -405,7 +394,7 @@ CommandCost CmdLevelLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 _additional_cash_required = ret.GetCost(); return cost; } - DoCommand(tile2, SLOPE_N, (curh > h) ? 0 : 1, flags, CMD_TERRAFORM_LAND); + DoCommand(tile, SLOPE_N, (curh > h) ? 0 : 1, flags, CMD_TERRAFORM_LAND); } cost.AddCost(ret); diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index c13a94872f..7ce150317a 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -50,21 +50,12 @@ void CcTerraform(bool success, TileIndex tile, uint32 p1, uint32 p2) /** Scenario editor command that generates desert areas */ static void GenerateDesertArea(TileIndex end, TileIndex start) { - int size_x, size_y; - int sx = TileX(start); - int sy = TileY(start); - int ex = TileX(end); - int ey = TileY(end); - if (_game_mode != GM_EDITOR) return; - if (ex < sx) Swap(ex, sx); - if (ey < sy) Swap(ey, sy); - size_x = (ex - sx) + 1; - size_y = (ey - sy) + 1; - _generating_world = true; - TILE_LOOP(tile, size_x, size_y, TileXY(sx, sy)) { + + TileArea ta(start, end); + TILE_AREA_LOOP(tile, ta) { SetTropicZone(tile, (_ctrl_pressed) ? TROPICZONE_NORMAL : TROPICZONE_DESERT); DoCommandP(tile, 0, 0, CMD_LANDSCAPE_CLEAR); MarkTileDirtyByTile(tile); @@ -75,21 +66,12 @@ static void GenerateDesertArea(TileIndex end, TileIndex start) /** Scenario editor command that generates rocky areas */ static void GenerateRockyArea(TileIndex end, TileIndex start) { - int size_x, size_y; - bool success = false; - int sx = TileX(start); - int sy = TileY(start); - int ex = TileX(end); - int ey = TileY(end); - if (_game_mode != GM_EDITOR) return; - if (ex < sx) Swap(ex, sx); - if (ey < sy) Swap(ey, sy); - size_x = (ex - sx) + 1; - size_y = (ey - sy) + 1; + bool success = false; + TileArea ta(start, end); - TILE_LOOP(tile, size_x, size_y, TileXY(sx, sy)) { + TILE_AREA_LOOP(tile, ta) { switch (GetTileType(tile)) { case MP_TREES: if (GetTreeGround(tile) == TREE_GROUND_SHORE) continue; diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp index 1754acf149..f0f149db70 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); + 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; + } - for (x = sx; x <= ex; x++) { - for (y = sy; y <= ey; y++) { - TileIndex tile = TileXY(x, y); + 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; - 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 (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 (_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); - } - - 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; - } - - /* 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: + 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; - break; - } + 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 (_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); + } + + 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; + } + + /* 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; } }