src/terraform_cmd.cpp
author terom@frrb.lan
Fri, 19 Dec 2008 01:32:07 +0200
changeset 10438 51bff16a04c9
parent 10331 3357af7bbe52
permissions -rw-r--r--
initial mini-map stuff
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     1
/* $Id$ */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     2
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     3
/** @file terraform_cmd.cpp Commands related to terraforming. */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     4
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     5
#include "stdafx.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     6
#include "openttd.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     7
#include "strings_type.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     8
#include "command_func.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
     9
#include "tile_map.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    10
#include "tunnel_map.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    11
#include "bridge_map.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    12
#include "variables.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    13
#include "functions.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    14
#include "economy_func.h"
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    15
8264
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8230
diff changeset
    16
#include "table/strings.h"
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8230
diff changeset
    17
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    18
/*
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    19
 * In one terraforming command all four corners of a initial tile can be raised/lowered (though this is not available to the player).
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    20
 * The maximal amount of height modifications is archieved when raising a complete flat land from sea level to MAX_TILE_HEIGHT or vice versa.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    21
 * This affects all corners with a manhatten distance smaller than MAX_TILE_HEIGHT to one of the initial 4 corners.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    22
 * Their maximal amount is computed to 4 * \sum_{i=1}^{h_max} i  =  2 * h_max * (h_max + 1).
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    23
 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    24
static const int TERRAFORMER_MODHEIGHT_SIZE = 2 * MAX_TILE_HEIGHT * (MAX_TILE_HEIGHT + 1);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    25
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    26
/*
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    27
 * The maximal amount of affected tiles (i.e. the tiles that incident with one of the corners above, is computed similiar to
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    28
 * 1 + 4 * \sum_{i=1}^{h_max} (i+1)  =  1 + 2 * h_max + (h_max + 3).
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    29
 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    30
static const int TERRAFORMER_TILE_TABLE_SIZE = 1 + 2 * MAX_TILE_HEIGHT * (MAX_TILE_HEIGHT + 3);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    31
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    32
struct TerraformerHeightMod {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    33
	TileIndex tile;   ///< Referenced tile.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    34
	byte height;      ///< New TileHeight (height of north corner) of the tile.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    35
};
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    36
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    37
struct TerraformerState {
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
    38
	int modheight_count;  ///< amount of entries in "modheight".
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
    39
	int tile_table_count; ///< amount of entries in "tile_table".
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    40
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    41
	/**
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    42
	 * Dirty tiles, i.e.\ at least one corner changed.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    43
	 *
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    44
	 * This array contains the tiles which are or will be marked as dirty.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    45
	 *
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    46
	 * @ingroup dirty
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    47
	 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    48
	TileIndex tile_table[TERRAFORMER_TILE_TABLE_SIZE];
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    49
	TerraformerHeightMod modheight[TERRAFORMER_MODHEIGHT_SIZE];  ///< Height modifications.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    50
};
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    51
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
    52
TileIndex _terraform_err_tile; ///< first tile we couldn't terraform
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    53
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    54
/**
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    55
 * Gets the TileHeight (height of north corner) of a tile as of current terraforming progress.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    56
 *
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    57
 * @param ts TerraformerState.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    58
 * @param tile Tile.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    59
 * @return TileHeight.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    60
 */
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
    61
static int TerraformGetHeightOfTile(const TerraformerState *ts, TileIndex tile)
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    62
{
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
    63
	const TerraformerHeightMod *mod = ts->modheight;
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    64
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
    65
	for (int count = ts->modheight_count; count != 0; count--, mod++) {
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    66
		if (mod->tile == tile) return mod->height;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    67
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    68
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    69
	/* TileHeight unchanged so far, read value from map. */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    70
	return TileHeight(tile);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    71
}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    72
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    73
/**
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    74
 * Stores the TileHeight (height of north corner) of a tile in a TerraformerState.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    75
 *
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    76
 * @param ts TerraformerState.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    77
 * @param tile Tile.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    78
 * @param height New TileHeight.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    79
 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    80
static void TerraformSetHeightOfTile(TerraformerState *ts, TileIndex tile, int height)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    81
{
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    82
	/* Find tile in the "modheight" table.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    83
	 * Note: In a normal user-terraform command the tile will not be found in the "modheight" table.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    84
	 *       But during house- or industry-construction multiple corners can be terraformed at once. */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    85
	TerraformerHeightMod *mod = ts->modheight;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    86
	int count = ts->modheight_count;
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
    87
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    88
	while ((count > 0) && (mod->tile != tile)) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    89
		mod++;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    90
		count--;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    91
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    92
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    93
	/* New entry? */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    94
	if (count == 0) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    95
		assert(ts->modheight_count < TERRAFORMER_MODHEIGHT_SIZE);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    96
		ts->modheight_count++;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    97
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    98
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
    99
	/* Finally store the new value */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   100
	mod->tile = tile;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   101
	mod->height = (byte)height;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   102
}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   103
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   104
/**
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   105
 * Adds a tile to the "tile_table" in a TerraformerState.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   106
 *
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   107
 * @param ts TerraformerState.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   108
 * @param tile Tile.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   109
 * @ingroup dirty
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   110
 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   111
static void TerraformAddDirtyTile(TerraformerState *ts, TileIndex tile)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   112
{
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   113
	int count = ts->tile_table_count;
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   114
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   115
	for (TileIndex *t = ts->tile_table; count != 0; count--, t++) {
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   116
		if (*t == tile) return;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   117
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   118
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   119
	assert(ts->tile_table_count < TERRAFORMER_TILE_TABLE_SIZE);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   120
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   121
	ts->tile_table[ts->tile_table_count++] = tile;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   122
}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   123
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   124
/**
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   125
 * Adds all tiles that incident with the north corner of a specific tile to the "tile_table" in a TerraformerState.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   126
 *
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   127
 * @param ts TerraformerState.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   128
 * @param tile Tile.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   129
 * @ingroup dirty
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   130
 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   131
static void TerraformAddDirtyTileAround(TerraformerState *ts, TileIndex tile)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   132
{
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   133
	TerraformAddDirtyTile(ts, tile + TileDiffXY( 0, -1));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   134
	TerraformAddDirtyTile(ts, tile + TileDiffXY(-1, -1));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   135
	TerraformAddDirtyTile(ts, tile + TileDiffXY(-1,  0));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   136
	TerraformAddDirtyTile(ts, tile);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   137
}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   138
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   139
/**
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   140
 * Terraform the north corner of a tile to a specific height.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   141
 *
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   142
 * @param ts TerraformerState.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   143
 * @param tile Tile.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   144
 * @param height Aimed height.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   145
 * @param return Error code or cost.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   146
 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   147
static CommandCost TerraformTileHeight(TerraformerState *ts, TileIndex tile, int height)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   148
{
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   149
	assert(tile < MapSize());
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   150
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   151
	/* Check range of destination height */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   152
	if (height < 0) return_cmd_error(STR_1003_ALREADY_AT_SEA_LEVEL);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   153
	if (height > MAX_TILE_HEIGHT) return_cmd_error(STR_1004_TOO_HIGH);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   154
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   155
	/*
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   156
	 * Check if the terraforming has any effect.
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   157
	 * This can only be true, if multiple corners of the start-tile are terraformed (i.e. the terraforming is done by towns/industries etc.).
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   158
	 * In this case the terraforming should fail. (Don't know why.)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   159
	 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   160
	if (height == TerraformGetHeightOfTile(ts, tile)) return CMD_ERROR;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   161
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   162
	/* Check "too close to edge of map" */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   163
	uint x = TileX(tile);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   164
	uint y = TileY(tile);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   165
	if ((x <= 1) || (y <= 1) || (x >= MapMaxX() - 1) || (y >= MapMaxY() - 1)) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   166
		/*
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   167
		 * Determine a sensible error tile
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   168
		 * Note: If x and y are both zero this will disable the error tile. (Tile 0 cannot be highlighted :( )
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   169
		 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   170
		if ((x == 1) && (y != 0)) x = 0;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   171
		if ((y == 1) && (x != 0)) y = 0;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   172
		_terraform_err_tile = TileXY(x, y);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   173
		return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   174
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   175
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   176
	/* Mark incident tiles, that are involved in the terraforming */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   177
	TerraformAddDirtyTileAround(ts, tile);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   178
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   179
	/* Store the height modification */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   180
	TerraformSetHeightOfTile(ts, tile, height);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   181
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   182
	CommandCost total_cost(EXPENSES_CONSTRUCTION);
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   183
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   184
	/* Increment cost */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   185
	total_cost.AddCost(_price.terraform);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   186
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   187
	/* Recurse to neighboured corners if height difference is larger than 1 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   188
	{
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   189
		const TileIndexDiffC *ttm;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   190
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   191
		static const TileIndexDiffC _terraform_tilepos[] = {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   192
			{ 1,  0}, // move to tile in SE
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   193
			{-2,  0}, // undo last move, and move to tile in NW
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   194
			{ 1,  1}, // undo last move, and move to tile in SW
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   195
			{ 0, -2}  // undo last move, and move to tile in NE
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   196
		};
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   197
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   198
		for (ttm = _terraform_tilepos; ttm != endof(_terraform_tilepos); ttm++) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   199
			tile += ToTileIndexDiff(*ttm);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   200
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   201
			/* Get TileHeight of neighboured tile as of current terraform progress */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   202
			int r = TerraformGetHeightOfTile(ts, tile);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   203
			int height_diff = height - r;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   204
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   205
			/* Is the height difference to the neighboured corner greater than 1? */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   206
			if (abs(height_diff) > 1) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   207
				/* Terraform the neighboured corner. The resulting height difference should be 1. */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   208
				height_diff += (height_diff < 0 ? 1 : -1);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   209
				CommandCost cost = TerraformTileHeight(ts, tile, r + height_diff);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   210
				if (CmdFailed(cost)) return cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   211
				total_cost.AddCost(cost);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   212
			}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   213
		}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   214
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   215
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   216
	return total_cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   217
}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   218
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   219
/** Terraform land
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   220
 * @param tile tile to terraform
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   221
 * @param flags for this command type
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   222
 * @param p1 corners to terraform (SLOPE_xxx)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   223
 * @param p2 direction; eg up (non-zero) or down (zero)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   224
 * @return error or cost of terraforming
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   225
 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   226
CommandCost CmdTerraformLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   227
{
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   228
	/* Make an extra check for map-bounds cause we add tiles to the originating tile */
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   229
	if (tile + TileDiffXY(1, 1) >= MapSize()) return CMD_ERROR;
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   230
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   231
	_terraform_err_tile = INVALID_TILE;
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   232
8230
64f28fe2d5c8 (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8210
diff changeset
   233
	CommandCost total_cost(EXPENSES_CONSTRUCTION);
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   234
	int direction = (p2 != 0 ? 1 : -1);
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   235
	TerraformerState ts;
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   236
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   237
	ts.modheight_count = ts.tile_table_count = 0;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   238
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   239
	/* Compute the costs and the terraforming result in a model of the landscape */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   240
	if ((p1 & SLOPE_W) != 0) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   241
		TileIndex t = tile + TileDiffXY(1, 0);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   242
		CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   243
		if (CmdFailed(cost)) return cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   244
		total_cost.AddCost(cost);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   245
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   246
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   247
	if ((p1 & SLOPE_S) != 0) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   248
		TileIndex t = tile + TileDiffXY(1, 1);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   249
		CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   250
		if (CmdFailed(cost)) return cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   251
		total_cost.AddCost(cost);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   252
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   253
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   254
	if ((p1 & SLOPE_E) != 0) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   255
		TileIndex t = tile + TileDiffXY(0, 1);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   256
		CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   257
		if (CmdFailed(cost)) return cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   258
		total_cost.AddCost(cost);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   259
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   260
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   261
	if ((p1 & SLOPE_N) != 0) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   262
		TileIndex t = tile + TileDiffXY(0, 0);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   263
		CommandCost cost = TerraformTileHeight(&ts, t, TileHeight(t) + direction);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   264
		if (CmdFailed(cost)) return cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   265
		total_cost.AddCost(cost);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   266
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   267
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   268
	/* Check if the terraforming is valid wrt. tunnels, bridges and objects on the surface */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   269
	{
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   270
		TileIndex *ti = ts.tile_table;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   271
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   272
		for (int count = ts.tile_table_count; count != 0; count--, ti++) {
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   273
			TileIndex tile = *ti;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   274
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   275
			/* Find new heights of tile corners */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   276
			uint z_N = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 0));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   277
			uint z_W = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 0));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   278
			uint z_S = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 1));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   279
			uint z_E = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 1));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   280
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   281
			/* Find min and max height of tile */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   282
			uint z_min = min(min(z_N, z_W), min(z_S, z_E));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   283
			uint z_max = max(max(z_N, z_W), max(z_S, z_E));
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   284
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   285
			/* Compute tile slope */
8801
8c4b104b39ac (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch
parents: 8264
diff changeset
   286
			Slope tileh = (z_max > z_min + 1 ? SLOPE_STEEP : SLOPE_FLAT);
8c4b104b39ac (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch
parents: 8264
diff changeset
   287
			if (z_W > z_min) tileh |= SLOPE_W;
8c4b104b39ac (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch
parents: 8264
diff changeset
   288
			if (z_S > z_min) tileh |= SLOPE_S;
8c4b104b39ac (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch
parents: 8264
diff changeset
   289
			if (z_E > z_min) tileh |= SLOPE_E;
8c4b104b39ac (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch
parents: 8264
diff changeset
   290
			if (z_N > z_min) tileh |= SLOPE_N;
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   291
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   292
			/* Check if bridge would take damage */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   293
			if (direction == 1 && MayHaveBridgeAbove(tile) && IsBridgeAbove(tile) &&
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   294
					GetBridgeHeight(GetSouthernBridgeEnd(tile)) <= z_max * TILE_HEIGHT) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   295
				_terraform_err_tile = tile; // highlight the tile under the bridge
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   296
				return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   297
			}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   298
			/* Check if tunnel would take damage */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   299
			if (direction == -1 && IsTunnelInWay(tile, z_min * TILE_HEIGHT)) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   300
				_terraform_err_tile = tile; // highlight the tile above the tunnel
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   301
				return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   302
			}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   303
			/* Check tiletype-specific things, and add extra-cost */
9309
7e9af4c58963 (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
parents: 8816
diff changeset
   304
			const bool curr_gen = _generating_world;
7e9af4c58963 (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
parents: 8816
diff changeset
   305
			if (_game_mode == GM_EDITOR) _generating_world = true; // used to create green terraformed land
8801
8c4b104b39ac (svn r12541) -Codechange: Declare Slope enum as bit set, and remove some (then) unneeded casts.
frosch
parents: 8264
diff changeset
   306
			CommandCost cost = _tile_type_procs[GetTileType(tile)]->terraform_tile_proc(tile, flags | DC_AUTO, z_min * TILE_HEIGHT, tileh);
9309
7e9af4c58963 (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
parents: 8816
diff changeset
   307
			_generating_world = curr_gen;
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   308
			if (CmdFailed(cost)) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   309
				_terraform_err_tile = tile;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   310
				return cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   311
			}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   312
			total_cost.AddCost(cost);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   313
		}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   314
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   315
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   316
	if (flags & DC_EXEC) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   317
		/* change the height */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   318
		{
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   319
			int count;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   320
			TerraformerHeightMod *mod;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   321
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   322
			mod = ts.modheight;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   323
			for (count = ts.modheight_count; count != 0; count--, mod++) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   324
				TileIndex til = mod->tile;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   325
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   326
				SetTileHeight(til, mod->height);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   327
			}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   328
		}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   329
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   330
		/* finally mark the dirty tiles dirty */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   331
		{
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   332
			int count;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   333
			TileIndex *ti = ts.tile_table;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   334
			for (count = ts.tile_table_count; count != 0; count--, ti++) {
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   335
				MarkTileDirtyByTile(*ti);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   336
			}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   337
		}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   338
	}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   339
	return total_cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   340
}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   341
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   342
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   343
/** Levels a selected (rectangle) area of land
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   344
 * @param tile end tile of area-drag
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   345
 * @param flags for this command type
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   346
 * @param p1 start tile of area drag
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   347
 * @param p2 height difference; eg raise (+1), lower (-1) or level (0)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   348
 * @return  error or cost of terraforming
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   349
 */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   350
CommandCost CmdLevelLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   351
{
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   352
	if (p1 >= MapSize()) return CMD_ERROR;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   353
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   354
	/* remember level height */
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   355
	uint oldh = TileHeight(p1);
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   356
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   357
	/* compute new height */
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   358
	uint h = oldh + p2;
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   359
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   360
	/* Check range of destination height */
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   361
	if (h > MAX_TILE_HEIGHT) return_cmd_error((oldh == 0) ? STR_1003_ALREADY_AT_SEA_LEVEL : STR_1004_TOO_HIGH);
10331
3357af7bbe52 (svn r14582) -Fix [FS#2392]: blank box on cost estimation of levelling a flat area.
rubidium
parents: 9309
diff changeset
   362
	if (p2 == 0) _error_message = STR_ALREADY_LEVELLED;
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   363
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   364
	/* make sure sx,sy are smaller than ex,ey */
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   365
	int ex = TileX(tile);
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   366
	int ey = TileY(tile);
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   367
	int sx = TileX(p1);
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   368
	int sy = TileY(p1);
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   369
	if (ex < sx) Swap(ex, sx);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   370
	if (ey < sy) Swap(ey, sy);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   371
	tile = TileXY(sx, sy);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   372
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   373
	int size_x = ex - sx + 1;
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   374
	int size_y = ey - sy + 1;
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   375
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   376
	Money money = GetAvailableMoneyForCommand();
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   377
	CommandCost cost(EXPENSES_CONSTRUCTION);
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   378
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   379
	BEGIN_TILE_LOOP(tile2, size_x, size_y, tile) {
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   380
		uint curh = TileHeight(tile2);
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   381
		while (curh != h) {
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   382
			CommandCost ret = DoCommand(tile2, SLOPE_N, (curh > h) ? 0 : 1, flags & ~DC_EXEC, CMD_TERRAFORM_LAND);
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   383
			if (CmdFailed(ret)) break;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   384
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   385
			if (flags & DC_EXEC) {
8816
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   386
				money -= ret.GetCost();
9f99611177eb (svn r12562) -Cleanup: variable scope in terraform_cmd.cpp
smatz
parents: 8801
diff changeset
   387
				if (money < 0) {
8210
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   388
					_additional_cash_required = ret.GetCost();
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   389
					return cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   390
				}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   391
				DoCommand(tile2, SLOPE_N, (curh > h) ? 0 : 1, flags, CMD_TERRAFORM_LAND);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   392
			}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   393
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   394
			cost.AddCost(ret);
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   395
			curh += (curh > h) ? -1 : 1;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   396
		}
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   397
	} END_TILE_LOOP(tile2, size_x, size_y, tile)
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   398
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   399
	return (cost.GetCost() == 0) ? CMD_ERROR : cost;
cc873256f63a (svn r11773) -Codechange: move some non-clear-land functions from clear_cmd.cpp to a more correct location.
rubidium
parents:
diff changeset
   400
}