mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(svn r2956) - Fix: [ 1253736 ] creating many town crash to desktop. Now it 'dies' with an ingame error message informing the gamer if it couldn't generate any towns in user-space. Still if it happens during new-game generation it crashes since we don't yet have actions to do in such a circumstance.
This commit is contained in:
parent
1419244551
commit
180997534c
@ -575,6 +575,8 @@ STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}...too c
|
||||
STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}...too close to another town
|
||||
STR_0239_SITE_UNSUITABLE :{WHITE}...site unsuitable
|
||||
STR_023A_TOO_MANY_TOWNS :{WHITE}...too many towns
|
||||
STR_CANNOT_GENERATE_TOWN :{WHITE}Can't build any towns
|
||||
STR_NO_SPACE_FOR_TOWN :{WHITE}...there is no more space on the map
|
||||
STR_023B_INCREASE_SIZE_OF_TOWN :{BLACK}Increase size of town
|
||||
STR_023C_EXPAND :{BLACK}Expand
|
||||
STR_023D_RANDOM_TOWN :{BLACK}Random Town
|
||||
|
13
main_gui.c
13
main_gui.c
@ -42,7 +42,7 @@ static byte _last_built_railtype;
|
||||
extern void GenerateWorld(int mode, uint size_x, uint size_y);
|
||||
|
||||
extern void GenerateIndustries(void);
|
||||
extern void GenerateTowns(void);
|
||||
extern bool GenerateTowns(void);
|
||||
|
||||
void HandleOnEditTextCancel(void)
|
||||
{
|
||||
@ -1505,16 +1505,23 @@ static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
|
||||
_generating_world = true;
|
||||
t = CreateRandomTown(20);
|
||||
_generating_world = false;
|
||||
if (t != NULL)
|
||||
|
||||
if (t == NULL) {
|
||||
ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
|
||||
} else
|
||||
ScrollMainWindowToTile(t->xy);
|
||||
|
||||
break;
|
||||
}
|
||||
case 6: {/* many random towns */
|
||||
HandleButtonClick(w, 6);
|
||||
|
||||
_generating_world = true;
|
||||
_game_mode = GM_NORMAL; // little hack to avoid towns of the same size
|
||||
GenerateTowns();
|
||||
if (!GenerateTowns())
|
||||
ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
|
||||
_generating_world = false;
|
||||
|
||||
_game_mode = GM_EDITOR;
|
||||
break;
|
||||
}
|
||||
|
2
misc.c
2
misc.c
@ -113,7 +113,7 @@ void GenerateClearTile(void);
|
||||
|
||||
void GenerateIndustries(void);
|
||||
void GenerateUnmovables(void);
|
||||
void GenerateTowns(void);
|
||||
bool GenerateTowns(void);
|
||||
|
||||
void StartupPlayers(void);
|
||||
void StartupDisasters(void);
|
||||
|
18
town_cmd.c
18
town_cmd.c
@ -1107,25 +1107,29 @@ Town *CreateRandomTown(uint attempts)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const byte _num_initial_towns[3] = {
|
||||
11, 23, 46
|
||||
};
|
||||
static const byte _num_initial_towns[3] = {11, 23, 46};
|
||||
|
||||
void GenerateTowns(void)
|
||||
bool GenerateTowns(void)
|
||||
{
|
||||
uint num = 0;
|
||||
uint n =
|
||||
ScaleByMapSize(_num_initial_towns[_opt.diff.number_towns] + (Random() & 7));
|
||||
uint n = ScaleByMapSize(_num_initial_towns[_opt.diff.number_towns] + (Random() & 7));
|
||||
|
||||
do {
|
||||
if (CreateRandomTown(20) != NULL) //try 20 times for the first loop
|
||||
num++;
|
||||
} while (--n);
|
||||
|
||||
// give it a last try, but now more aggressive
|
||||
if (num == 0 && CreateRandomTown(10000) == NULL) {
|
||||
Town *t;
|
||||
FOR_ALL_TOWNS(t) { if (IsValidTown(t)) {num = 1; break;}}
|
||||
|
||||
//XXX can we handle that more gracefully?
|
||||
error("Could not generate any town");
|
||||
if (num == 0) error("Could not generate any town");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool CheckBuildHouseMode(Town *t1, TileIndex tile, uint tileh, int mode)
|
||||
|
Loading…
Reference in New Issue
Block a user