diff options
Diffstat (limited to 'src/unmovable_cmd.cpp')
-rw-r--r-- | src/unmovable_cmd.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/unmovable_cmd.cpp b/src/unmovable_cmd.cpp index 71e514c2f..f6eb3ea70 100644 --- a/src/unmovable_cmd.cpp +++ b/src/unmovable_cmd.cpp @@ -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); |