diff --git a/src/map.cpp b/src/map.cpp index 3dfe478908..836a0a8fdc 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -34,9 +34,9 @@ TileExtended *_me = NULL; ///< Extended Tiles of the map void AllocateMap(uint size_x, uint size_y) { /* Make sure that the map size is within the limits and that - * the x axis size is a power of 2. */ - if (size_x < 64 || size_x > 2048 || - size_y < 64 || size_y > 2048 || + * size of both axes is a power of 2. */ + if (!IsInsideMM(size_x, MIN_MAP_SIZE, MAX_MAP_SIZE + 1) || + !IsInsideMM(size_y, MIN_MAP_SIZE, MAX_MAP_SIZE + 1) || (size_x & (size_x - 1)) != 0 || (size_y & (size_y - 1)) != 0) error("Invalid map size"); diff --git a/src/map_type.h b/src/map_type.h index 7098ad7622..3c403c88be 100644 --- a/src/map_type.h +++ b/src/map_type.h @@ -50,6 +50,14 @@ struct TileIndexDiffC { int16 y; ///< The y value of the coordinate }; +/** Minimal and maximal map width and height */ +enum { + MIN_MAP_SIZE_BITS = 6, ///< Minimal size of map is equal to 2 ^ MIN_MAP_SIZE_BITS + MAX_MAP_SIZE_BITS = 11, ///< Maximal size of map is equal to 2 ^ MAX_MAP_SIZE_BITS + MIN_MAP_SIZE = 1 << MIN_MAP_SIZE_BITS, ///< Minimal map size = 64 + MAX_MAP_SIZE = 1 << MAX_MAP_SIZE_BITS, ///< Maximal map size = 2048 +}; + /** * Approximation of the length of a straight track, relative to a diagonal * track (ie the size of a tile side). diff --git a/src/settings.cpp b/src/settings.cpp index 54509ac20d..c64b8a7064 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -51,6 +51,7 @@ #include "gfxinit.h" #include "gamelog.h" #include "station_func.h" +#include "map_type.h" #include "settings_func.h" #include "ini_type.h" #include "ai/ai.hpp" diff --git a/src/table/settings.h b/src/table/settings.h index 4d557b74e9..d208d76467 100644 --- a/src/table/settings.h +++ b/src/table/settings.h @@ -500,8 +500,8 @@ const SettingDesc _settings[] = { SDT_VAR(GameSettings, game_creation.heightmap_rotation, SLE_UINT8, S,MS, 0, 0, 1, 0, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION, NULL), SDT_VAR(GameSettings, game_creation.se_flat_world_height, SLE_UINT8, S, 0, 1, 0, 15, 0, STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT, NULL), - SDT_VAR(GameSettings, game_creation.map_x, SLE_UINT8, S, 0, 8, 6, 11, 0, STR_CONFIG_SETTING_MAP_X, NULL), - SDT_VAR(GameSettings, game_creation.map_y, SLE_UINT8, S, 0, 8, 6, 11, 0, STR_CONFIG_SETTING_MAP_Y, NULL), + SDT_VAR(GameSettings, game_creation.map_x, SLE_UINT8, S, 0, 8, MIN_MAP_SIZE_BITS, MAX_MAP_SIZE_BITS, 0, STR_CONFIG_SETTING_MAP_X, NULL), + SDT_VAR(GameSettings, game_creation.map_y, SLE_UINT8, S, 0, 8, MIN_MAP_SIZE_BITS, MAX_MAP_SIZE_BITS, 0, STR_CONFIG_SETTING_MAP_Y, NULL), SDT_CONDBOOL(GameSettings, construction.freeform_edges, 111, SL_MAX_VERSION, 0, 0, true, STR_CONFIG_SETTING_ENABLE_FREEFORM_EDGES, CheckFreeformEdges), SDT_CONDVAR(GameSettings, game_creation.water_borders, SLE_UINT8,111, SL_MAX_VERSION, 0, 0, 15, 0, 16, 0, STR_NULL, NULL), SDT_CONDVAR(GameSettings, game_creation.custom_town_number, SLE_UINT16,115, SL_MAX_VERSION, 0, 0, 1, 1, 5000, 0, STR_NULL, NULL),