Import extra large maps patch.

http://www.tt-forums.net/viewtopic.php?f=33&t=33137
pull/3/head
patch-import 9 years ago committed by Jonathan G Rennison
parent 2816a65365
commit 7d2b4bd3ea

@ -20,6 +20,7 @@
#include "sound_func.h"
#include "fios.h"
#include "string_func.h"
#include "gui.h"
#include "widgets/dropdown_type.h"
#include "widgets/dropdown_func.h"
#include "querystring_gui.h"
@ -277,12 +278,37 @@ static void LandscapeGenerationCallback(Window *w, bool confirmed)
if (confirmed) StartGeneratingLandscape((GenenerateLandscapeWindowMode)w->window_number);
}
static DropDownList *BuildMapsizeDropDown()
/**
* Check if map size set lies in allowed boundaries.
* @param print_warning If set to true, messagebox with warning is printed out if size is outside limits.
* @return true if size is ok, false otherwise.
*/
static bool CheckMapSize(bool print_warning = true)
{
uint64 tiles = 1ULL << (_settings_newgame.game_creation.map_x + _settings_newgame.game_creation.map_y);
if (_settings_newgame.game_creation.map_x + _settings_newgame.game_creation.map_y > MAX_MAP_TILES_BITS) {
if (print_warning) {
SetDParam(0, MAX_MAP_TILES);
SetDParam(1, tiles);
ShowErrorMessage(STR_MAPGEN_TOO_MANY_TILES_MESSAGE, INVALID_STRING_ID, WL_ERROR, 0, 0);
}
return false;
}
return true;
}
/**
* Build dropdown list with map sizes
* Dimension selected in the other dropdown is used to suggest which choices are 'valid'
* @param other_dimension Dimension specified by the second dropdown.
*/
static DropDownList *BuildMapsizeDropDown(int other_dimension)
{
DropDownList *list = new DropDownList();
for (uint i = MIN_MAP_SIZE_BITS; i <= MAX_MAP_SIZE_BITS; i++) {
DropDownListParamStringItem *item = new DropDownListParamStringItem(STR_JUST_INT, i, false);
DropDownListParamStringItem *item = new DropDownListParamStringItem((i + other_dimension > MAX_MAP_TILES_BITS) ? STR_RED_INT : STR_JUST_INT, i, false);
item->SetParam(0, 1 << i);
list->push_back(item);
}
@ -310,6 +336,14 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
char name[64];
GenenerateLandscapeWindowMode mode;
void SetDropDownColor()
{
/* Draw sizes in mapsize selection dropdowns in red if too large size is selected */
bool mapsize_valid = CheckMapSize(false);
this->GetWidget<NWidgetCore>(WID_GL_MAPSIZE_X_PULLDOWN)->widget_data = mapsize_valid ? STR_JUST_INT : STR_RED_INT;
this->GetWidget<NWidgetCore>(WID_GL_MAPSIZE_Y_PULLDOWN)->widget_data = mapsize_valid ? STR_JUST_INT : STR_RED_INT;
}
GenerateLandscapeWindow(const WindowDesc *desc, WindowNumber number = 0) : QueryStringBaseWindow(11)
{
this->InitNested(desc, number);
@ -324,6 +358,8 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
this->mode = (GenenerateLandscapeWindowMode)this->window_number;
SetDropDownColor();
/* Disable town, industry and trees in SE */
this->SetWidgetDisabledState(WID_GL_TOWN_PULLDOWN, _game_mode == GM_EDITOR);
this->SetWidgetDisabledState(WID_GL_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
@ -538,11 +574,11 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
break;
case WID_GL_MAPSIZE_X_PULLDOWN: // Mapsize X
ShowDropDownList(this, BuildMapsizeDropDown(), _settings_newgame.game_creation.map_x, WID_GL_MAPSIZE_X_PULLDOWN);
ShowDropDownList(this, BuildMapsizeDropDown(_settings_newgame.game_creation.map_y), _settings_newgame.game_creation.map_x, WID_GL_MAPSIZE_X_PULLDOWN);
break;
case WID_GL_MAPSIZE_Y_PULLDOWN: // Mapsize Y
ShowDropDownList(this, BuildMapsizeDropDown(), _settings_newgame.game_creation.map_y, WID_GL_MAPSIZE_Y_PULLDOWN);
ShowDropDownList(this, BuildMapsizeDropDown(_settings_newgame.game_creation.map_x), _settings_newgame.game_creation.map_y, WID_GL_MAPSIZE_Y_PULLDOWN);
break;
case WID_GL_TOWN_PULLDOWN: // Number of towns
@ -561,6 +597,7 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
break;
case WID_GL_GENERATE_BUTTON: { // Generate
if (!CheckMapSize()) break;
/* Get rotated map size. */
uint map_x;
uint map_y;
@ -720,8 +757,14 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
virtual void OnDropdownSelect(int widget, int index)
{
switch (widget) {
case WID_GL_MAPSIZE_X_PULLDOWN: _settings_newgame.game_creation.map_x = index; break;
case WID_GL_MAPSIZE_Y_PULLDOWN: _settings_newgame.game_creation.map_y = index; break;
case WID_GL_MAPSIZE_X_PULLDOWN:
_settings_newgame.game_creation.map_x = index;
SetDropDownColor();
break;
case WID_GL_MAPSIZE_Y_PULLDOWN:
_settings_newgame.game_creation.map_y = index;
SetDropDownColor();
break;
case WID_GL_TREE_PULLDOWN: _settings_newgame.game_creation.tree_placer = index; break;
case WID_GL_RIVER_PULLDOWN: _settings_newgame.game_creation.amount_of_rivers = index; break;
case WID_GL_SMOOTHNESS_PULLDOWN: _settings_newgame.game_creation.tgen_smoothness = index; break;
@ -883,10 +926,19 @@ struct CreateScenarioWindow : public Window
{
uint widget_id;
void SetDropDownColor()
{
/* Draw sizes in mapsize selection dropdowns in red if too large size is selected */
bool mapsize_valid = CheckMapSize(false);
this->GetWidget<NWidgetCore>(WID_CS_MAPSIZE_X_PULLDOWN)->widget_data = mapsize_valid ? STR_JUST_INT : STR_RED_INT;
this->GetWidget<NWidgetCore>(WID_CS_MAPSIZE_Y_PULLDOWN)->widget_data = mapsize_valid ? STR_JUST_INT : STR_RED_INT;
}
CreateScenarioWindow(const WindowDesc *desc, WindowNumber window_number) : Window()
{
this->InitNested(desc, window_number);
this->LowerWidget(_settings_newgame.game_creation.landscape + WID_CS_TEMPERATE);
SetDropDownColor();
}
virtual void SetStringParameters(int widget) const
@ -910,6 +962,8 @@ struct CreateScenarioWindow : public Window
}
}
virtual void OnPaint()
{
this->SetWidgetDisabledState(WID_CS_START_DATE_DOWN, _settings_newgame.game_creation.starting_year <= MIN_YEAR);
@ -963,18 +1017,20 @@ struct CreateScenarioWindow : public Window
break;
case WID_CS_MAPSIZE_X_PULLDOWN: // Mapsize X
ShowDropDownList(this, BuildMapsizeDropDown(), _settings_newgame.game_creation.map_x, WID_CS_MAPSIZE_X_PULLDOWN);
ShowDropDownList(this, BuildMapsizeDropDown(_settings_newgame.game_creation.map_y), _settings_newgame.game_creation.map_x, WID_CS_MAPSIZE_X_PULLDOWN);
break;
case WID_CS_MAPSIZE_Y_PULLDOWN: // Mapsize Y
ShowDropDownList(this, BuildMapsizeDropDown(), _settings_newgame.game_creation.map_y, WID_CS_MAPSIZE_Y_PULLDOWN);
ShowDropDownList(this, BuildMapsizeDropDown(_settings_newgame.game_creation.map_x), _settings_newgame.game_creation.map_y, WID_CS_MAPSIZE_Y_PULLDOWN);
break;
case WID_CS_EMPTY_WORLD: // Empty world / flat world
if (!CheckMapSize()) break;
StartGeneratingLandscape(GLWM_SCENARIO);
break;
case WID_CS_RANDOM_WORLD: // Generate
if (!CheckMapSize()) break;
ShowGenerateLandscape();
break;
@ -1033,6 +1089,8 @@ struct CreateScenarioWindow : public Window
case WID_CS_MAPSIZE_X_PULLDOWN: _settings_newgame.game_creation.map_x = index; break;
case WID_CS_MAPSIZE_Y_PULLDOWN: _settings_newgame.game_creation.map_y = index; break;
}
SetDropDownColor();
this->SetDirty();
}

@ -2399,6 +2399,7 @@ STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Heightma
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Heightmap name:
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Size:
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
STR_MAPGEN_TOO_MANY_TILES_MESSAGE :{YELLOW}Too many tiles in map. Maximum number of tiles is {NUM}, you have selected {NUM}
STR_MAPGEN_RANDOM_SEED_OSKTITLE :{BLACK}Enter a random seed
STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Change snow line height
@ -4449,6 +4450,7 @@ STR_DATE_LONG_SMALL :{TINY_FONT}{BLA
STR_TINY_GROUP :{TINY_FONT}{GROUP}
STR_BLACK_INT :{BLACK}{NUM}
STR_ORANGE_INT :{ORANGE}{NUM}
STR_RED_INT :{RED}{NUM}
STR_WHITE_SIGN :{WHITE}{SIGN}
STR_TINY_BLACK_STATION :{TINY_FONT}{BLACK}{STATION}
STR_BLACK_STRING :{BLACK}{STRING}

@ -37,17 +37,19 @@ TileExtended *_me = NULL; ///< Extended Tiles of the map
*/
void AllocateMap(uint size_x, uint size_y)
{
DEBUG(map, 2, "Min/max map size %d/%d, max map tiles %d", MIN_MAP_SIZE, MAX_MAP_SIZE, MAX_MAP_TILES);
DEBUG(map, 1, "Allocating map of size %dx%d", size_x, size_y);
/* Make sure that the map size is within the limits and that
* 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) ||
if (size_x * size_y > MAX_MAP_TILES ||
size_x < MIN_MAP_SIZE ||
size_y < MIN_MAP_SIZE ||
(size_x & (size_x - 1)) != 0 ||
(size_y & (size_y - 1)) != 0) {
error("Invalid map size");
}
DEBUG(map, 1, "Allocating map of size %dx%d", size_x, size_y);
_map_log_x = FindFirstBit(size_x);
_map_log_y = FindFirstBit(size_y);
_map_size_x = size_x;

@ -59,9 +59,11 @@ struct TileIndexDiffC {
/** Minimal and maximal map width and height */
static const uint MIN_MAP_SIZE_BITS = 6; ///< Minimal size of map is equal to 2 ^ MIN_MAP_SIZE_BITS
static const uint MAX_MAP_SIZE_BITS = 11; ///< Maximal size of map is equal to 2 ^ MAX_MAP_SIZE_BITS
static const uint MAX_MAP_SIZE_BITS = 20; ///< Maximal size of map is equal to 2 ^ MAX_MAP_SIZE_BITS
static const uint MAX_MAP_TILES_BITS = 26; ///< Maximal number of tiles in a map is equal to 2 ^ MAX_MAP_TILES_BITS.
static const uint MIN_MAP_SIZE = 1 << MIN_MAP_SIZE_BITS; ///< Minimal map size = 64
static const uint MAX_MAP_SIZE = 1 << MAX_MAP_SIZE_BITS; ///< Maximal map size = 2048
static const uint MAX_MAP_SIZE = 1 << MAX_MAP_SIZE_BITS; ///< Maximal map size = 8192
static const uint MAX_MAP_TILES = 1 << MAX_MAP_TILES_BITS;///< Maximal number of tiles in a map = 2048 * 2048
/**
* Approximation of the length of a straight track, relative to a diagonal

@ -47,7 +47,7 @@ NewGrfDebugSpritePicker _newgrf_debug_sprite_picker = { SPM_NONE, NULL, 0, Small
*/
static inline uint GetFeatureIndex(uint window_number)
{
return GB(window_number, 0, 24);
return GB(window_number, 0, 27);
}
/**
@ -59,8 +59,8 @@ static inline uint GetFeatureIndex(uint window_number)
*/
static inline uint GetInspectWindowNumber(GrfSpecFeature feature, uint index)
{
assert((index >> 24) == 0);
return (feature << 24) | index;
assert((index >> 27) == 0);
return (feature << 27) | index;
}
/**
@ -251,7 +251,7 @@ struct NIFeature {
*/
static inline GrfSpecFeature GetFeatureNum(uint window_number)
{
return (GrfSpecFeature)GB(window_number, 24, 8);
return (GrfSpecFeature)GB(window_number, 27, 5);
}
/**
@ -470,7 +470,7 @@ struct NewGRFInspectWindow : Window {
case WID_NGRFI_PARENT: {
const NIHelper *nih = GetFeatureHelper(this->window_number);
uint index = nih->GetParent(GetFeatureIndex(this->window_number));
::ShowNewGRFInspectWindow((GrfSpecFeature)GB(index, 24, 8), GetFeatureIndex(index), nih->GetGRFID(GetFeatureIndex(this->window_number)));
::ShowNewGRFInspectWindow((GrfSpecFeature)GB(index, 27, 5), GetFeatureIndex(index), nih->GetGRFID(GetFeatureIndex(this->window_number)));
break;
}

@ -902,6 +902,24 @@ static void MakeNewGameDone()
MarkWholeScreenDirty();
}
/*
* Too large size may be stored in settings (especially if switching between between OpenTTD
* versions with different map size limits), we have to check if it is valid before generating world.
* Simple separate checking of X and Y map sizes is not enough, as their sum is what counts for the limit.
* Check the size and decrease the larger of the sizes till the size is in limit.
*/
static void FixConfigMapSize()
{
while (_settings_game.game_creation.map_x + _settings_game.game_creation.map_y > MAX_MAP_TILES_BITS) {
/* Repeat reducing larger of X/Y dimensions until the map size is within allowable limits */
if (_settings_game.game_creation.map_x > _settings_game.game_creation.map_y) {
_settings_game.game_creation.map_x--;
} else {
_settings_game.game_creation.map_y--;
}
}
}
static void MakeNewGame(bool from_heightmap, bool reset_settings)
{
_game_mode = GM_NORMAL;
@ -909,6 +927,7 @@ static void MakeNewGame(bool from_heightmap, bool reset_settings)
ResetGRFConfig(true);
GenerateWorldSetCallback(&MakeNewGameDone);
FixConfigMapSize();
GenerateWorld(from_heightmap ? GWM_HEIGHTMAP : GWM_NEWGAME, 1 << _settings_game.game_creation.map_x, 1 << _settings_game.game_creation.map_y, reset_settings);
}
@ -924,6 +943,7 @@ static void MakeNewEditorWorld()
ResetGRFConfig(true);
GenerateWorldSetCallback(&MakeNewEditorWorldDone);
FixConfigMapSize();
GenerateWorld(GWM_EMPTY, 1 << _settings_game.game_creation.map_x, 1 << _settings_game.game_creation.map_y);
}
@ -1068,6 +1088,7 @@ void SwitchToMode(SwitchMode new_mode)
case SM_LOAD_HEIGHTMAP: // Load heightmap from scenario editor
SetLocalCompany(OWNER_NONE);
FixConfigMapSize();
GenerateWorld(GWM_HEIGHTMAP, 1 << _settings_game.game_creation.map_x, 1 << _settings_game.game_creation.map_y);
MarkWholeScreenDirty();
break;
@ -1110,6 +1131,7 @@ void SwitchToMode(SwitchMode new_mode)
case SM_GENRANDLAND: // Generate random land within scenario editor
SetLocalCompany(OWNER_NONE);
FixConfigMapSize();
GenerateWorld(GWM_RANDOM, 1 << _settings_game.game_creation.map_x, 1 << _settings_game.game_creation.map_y);
/* XXX: set date */
MarkWholeScreenDirty();

Loading…
Cancel
Save