summaryrefslogtreecommitdiff
path: root/src/settings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings.cpp')
-rw-r--r--src/settings.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/settings.cpp b/src/settings.cpp
index 6440a7687..3a90f9651 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -68,6 +68,10 @@
#include "ai/ai_config.hpp"
#include "ai/ai_info.hpp"
+#include "tile_map.h"
+#include "void_map.h"
+#include "station_base.h"
+
#include "table/strings.h"
ClientSettings _settings_client;
@@ -1079,6 +1083,71 @@ static int32 CheckNoiseToleranceLevel(const char *value)
return 0;
}
+static int32 CheckFreeformEdges(int32 p1)
+{
+ if (_game_mode == GM_MENU) return 0;
+ if (p1 != 0) {
+ Vehicle *v;
+ FOR_ALL_VEHICLES(v) {
+ if (v->type == VEH_SHIP && (TileX(v->tile) == 0 || TileY(v->tile) == 0)) {
+ ShowErrorMessage(INVALID_STRING_ID, STR_CONFIG_PATCHES_EDGES_NOT_EMPTY, 0, 0);
+ _settings_game.construction.freeform_edges = false;
+ return 0;
+ }
+ }
+ Station *st;
+ FOR_ALL_STATIONS(st) {
+ if (TileX(st->xy) == 0 || TileY(st->xy) == 0) {
+ ShowErrorMessage(INVALID_STRING_ID, STR_CONFIG_PATCHES_EDGES_NOT_EMPTY, 0, 0);
+ _settings_game.construction.freeform_edges = false;
+ return 0;
+ }
+ }
+ for (uint i = 0; i < MapSizeX(); i++) MakeVoid(TileXY(i, 0));
+ for (uint i = 0; i < MapSizeY(); i++) MakeVoid(TileXY(0, i));
+ } else {
+ for (uint i = 0; i < MapMaxX(); i++) {
+ if (TileHeight(TileXY(i, 1)) != 0) {
+ ShowErrorMessage(INVALID_STRING_ID, STR_CONFIG_PATCHES_EDGES_NOT_WATER, 0, 0);
+ _settings_game.construction.freeform_edges = true;
+ return 0;
+ }
+ }
+ for (uint i = 1; i < MapMaxX(); i++) {
+ if (!IsTileType(TileXY(i, MapMaxY() - 1), MP_WATER) || TileHeight(TileXY(1, MapMaxY())) != 0) {
+ ShowErrorMessage(INVALID_STRING_ID, STR_CONFIG_PATCHES_EDGES_NOT_WATER, 0, 0);
+ _settings_game.construction.freeform_edges = true;
+ return 0;
+ }
+ }
+ for (uint i = 0; i < MapMaxY(); i++) {
+ if (TileHeight(TileXY(1, i)) != 0) {
+ ShowErrorMessage(INVALID_STRING_ID, STR_CONFIG_PATCHES_EDGES_NOT_WATER, 0, 0);
+ _settings_game.construction.freeform_edges = true;
+ return 0;
+ }
+ }
+ for (uint i = 1; i < MapMaxY(); i++) {
+ if (!IsTileType(TileXY(MapMaxX() - 1, i), MP_WATER) || TileHeight(TileXY(MapMaxX(), i)) != 0) {
+ ShowErrorMessage(INVALID_STRING_ID, STR_CONFIG_PATCHES_EDGES_NOT_WATER, 0, 0);
+ _settings_game.construction.freeform_edges = true;
+ return 0;
+ }
+ }
+ /* Make tiles at the border water again. */
+ for (uint i = 0; i < MapMaxX(); i++) {
+ SetTileHeight(TileXY(i, 0), 0);
+ SetTileType(TileXY(i, 0), MP_WATER);
+ }
+ for (uint i = 0; i < MapMaxY(); i++) {
+ SetTileHeight(TileXY(0, i), 0);
+ SetTileType(TileXY(0, i), MP_WATER);
+ }
+ }
+ MarkWholeScreenDirty();
+ return 0;
+}
+
#ifdef ENABLE_NETWORK
static int32 UpdateMinActiveClients(int32 p1)
@@ -1396,6 +1465,8 @@ const SettingDesc _patch_settings[] = {
SDT_VAR(GameSettings, game_creation.map_x, SLE_UINT8, S, 0, 8, 6, 11, 0, STR_CONFIG_PATCHES_MAP_X, NULL),
SDT_VAR(GameSettings, game_creation.map_y, SLE_UINT8, S, 0, 8, 6, 11, 0, STR_CONFIG_PATCHES_MAP_Y, NULL),
+ SDT_CONDBOOL(GameSettings, construction.freeform_edges, 111, SL_MAX_VERSION, 0, 0, false, STR_CONFIG_PATCHES_ENABLE_FREEFORM_EDGES, CheckFreeformEdges),
+ SDT_CONDVAR(GameSettings, game_creation.water_borders, SLE_UINT8,111, SL_MAX_VERSION, 0, 0, 15, 0, 15, 0, STR_NULL, NULL),
SDT_CONDOMANY(GameSettings, locale.currency, SLE_UINT8, 97, SL_MAX_VERSION, N, 0, 0, CUSTOM_CURRENCY_ID, "GBP|USD|EUR|YEN|ATS|BEF|CHF|CZK|DEM|DKK|ESP|FIM|FRF|GRD|HUF|ISK|ITL|NLG|NOK|PLN|ROL|RUR|SIT|SEK|YTL|SKK|BRR|custom", STR_NULL, NULL, NULL),
SDT_CONDOMANY(GameSettings, locale.units, SLE_UINT8, 97, SL_MAX_VERSION, N, 0, 1, 2, "imperial|metric|si", STR_NULL, NULL, NULL),