mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-09 15:41:15 +00:00
(svn r18723) -Codechange: also simplify looping over an area when building trees, desert, rocky areas or leveling land
This commit is contained in:
parent
76bf94bf00
commit
b42e76d858
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -345,26 +345,13 @@ 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);
|
||||
|
||||
TileArea ta(tile, p2);
|
||||
TILE_AREA_LOOP(tile, ta) {
|
||||
switch (GetTileType(tile)) {
|
||||
case MP_TREES:
|
||||
/* no more space for trees? */
|
||||
@ -438,7 +425,6 @@ CommandCost CmdPlantTree(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cost.GetCost() == 0) {
|
||||
return_cmd_error(msg);
|
||||
|
Loading…
Reference in New Issue
Block a user