(svn r15190) -Feature: Allow terraforming of the tiles at the edges of the map.

This commit is contained in:
Yexo
2009-01-21 02:31:55 +00:00
parent 5e7669b539
commit db3ee34b44
31 changed files with 417 additions and 171 deletions

View File

@@ -367,11 +367,13 @@ static bool ClickTile_Unmovable(TileIndex tile)
/* checks, if a radio tower is within a 9x9 tile square around tile */
static bool IsRadioTowerNearby(TileIndex tile)
{
TileIndex tile_s = tile - TileDiffXY(4, 4);
TileIndex tile_s = tile - TileDiffXY(min(TileX(tile), 4U), min(TileY(tile), 4U));
uint w = min(TileX(tile), 4U) + 1 + min(MapMaxX() - TileX(tile), 4U);
uint h = min(TileY(tile), 4U) + 1 + min(MapMaxY() - TileY(tile), 4U);
BEGIN_TILE_LOOP(tile, 9, 9, tile_s)
BEGIN_TILE_LOOP(tile, w, h, tile_s)
if (IsTransmitterTile(tile)) return true;
END_TILE_LOOP(tile, 9, 9, tile_s)
END_TILE_LOOP(tile, w, h, tile_s)
return false;
}
@@ -383,6 +385,23 @@ void GenerateUnmovables()
/* add radio tower */
int radiotowser_to_build = ScaleByMapSize(15); // maximum number of radio towers on the map
int lighthouses_to_build = _settings_game.game_creation.landscape == LT_TROPIC ? 0 : ScaleByMapSize1D((Random() & 3) + 7);
/* Scale the amount of lighthouses with the amount of land at the borders. */
if (_settings_game.construction.freeform_edges) {
uint num_water_tiles = 0;
for (uint x = 0; x < MapMaxX(); x++) {
if (IsTileType(TileXY(x, 1), MP_WATER)) num_water_tiles++;
if (IsTileType(TileXY(x, MapMaxY() - 1), MP_WATER)) num_water_tiles++;
}
for (uint y = 1; y < MapMaxY() - 1; y++) {
if (IsTileType(TileXY(1, y), MP_WATER)) num_water_tiles++;
if (IsTileType(TileXY(MapMaxX() - 1, y), MP_WATER)) num_water_tiles++;
}
/* The -6 is because the top borders are MP_VOID (-2) and all corners
* are counted twice (-4). */
lighthouses_to_build = lighthouses_to_build * num_water_tiles / (2 * MapMaxY() + 2 * MapMaxX() - 6);
}
SetGeneratingWorldProgress(GWP_UNMOVABLE, radiotowser_to_build + lighthouses_to_build);
for (uint i = ScaleByMapSize(1000); i != 0; i--) {
@@ -416,13 +435,16 @@ void GenerateUnmovables()
TileIndex tile;
switch (dir) {
default:
case DIAGDIR_NE: tile = TileXY(maxx, r % maxy); break;
case DIAGDIR_SE: tile = TileXY(r % maxx, 0); break;
case DIAGDIR_SW: tile = TileXY(0, r % maxy); break;
case DIAGDIR_NW: tile = TileXY(r % maxx, maxy); break;
case DIAGDIR_NE: tile = TileXY(maxx - 1, r % maxy); break;
case DIAGDIR_SE: tile = TileXY(r % maxx, 1); break;
case DIAGDIR_SW: tile = TileXY(1, r % maxy); break;
case DIAGDIR_NW: tile = TileXY(r % maxx, maxy - 1); break;
}
for (int j = 0; j < 20; j++) {
/* Only build lighthouses at tiles where the border is sea. */
if (!IsTileType(tile, MP_WATER)) continue;
for (int j = 0; j < 19; j++) {
uint h;
if (IsTileType(tile, MP_CLEAR) && GetTileSlope(tile, &h) == SLOPE_FLAT && h <= TILE_HEIGHT * 2 && !IsBridgeAbove(tile)) {
MakeLighthouse(tile);