mirror of https://github.com/OpenTTD/OpenTTD
(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.
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_0238_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}...too close to another town
|
||||||
STR_0239_SITE_UNSUITABLE :{WHITE}...site unsuitable
|
STR_0239_SITE_UNSUITABLE :{WHITE}...site unsuitable
|
||||||
STR_023A_TOO_MANY_TOWNS :{WHITE}...too many towns
|
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_023B_INCREASE_SIZE_OF_TOWN :{BLACK}Increase size of town
|
||||||
STR_023C_EXPAND :{BLACK}Expand
|
STR_023C_EXPAND :{BLACK}Expand
|
||||||
STR_023D_RANDOM_TOWN :{BLACK}Random Town
|
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 GenerateWorld(int mode, uint size_x, uint size_y);
|
||||||
|
|
||||||
extern void GenerateIndustries(void);
|
extern void GenerateIndustries(void);
|
||||||
extern void GenerateTowns(void);
|
extern bool GenerateTowns(void);
|
||||||
|
|
||||||
void HandleOnEditTextCancel(void)
|
void HandleOnEditTextCancel(void)
|
||||||
{
|
{
|
||||||
|
@ -1505,16 +1505,23 @@ static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
|
||||||
_generating_world = true;
|
_generating_world = true;
|
||||||
t = CreateRandomTown(20);
|
t = CreateRandomTown(20);
|
||||||
_generating_world = false;
|
_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);
|
ScrollMainWindowToTile(t->xy);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 6: {/* many random towns */
|
case 6: {/* many random towns */
|
||||||
HandleButtonClick(w, 6);
|
HandleButtonClick(w, 6);
|
||||||
|
|
||||||
_generating_world = true;
|
_generating_world = true;
|
||||||
_game_mode = GM_NORMAL; // little hack to avoid towns of the same size
|
_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;
|
_generating_world = false;
|
||||||
|
|
||||||
_game_mode = GM_EDITOR;
|
_game_mode = GM_EDITOR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
2
misc.c
2
misc.c
|
@ -113,7 +113,7 @@ void GenerateClearTile(void);
|
||||||
|
|
||||||
void GenerateIndustries(void);
|
void GenerateIndustries(void);
|
||||||
void GenerateUnmovables(void);
|
void GenerateUnmovables(void);
|
||||||
void GenerateTowns(void);
|
bool GenerateTowns(void);
|
||||||
|
|
||||||
void StartupPlayers(void);
|
void StartupPlayers(void);
|
||||||
void StartupDisasters(void);
|
void StartupDisasters(void);
|
||||||
|
|
18
town_cmd.c
18
town_cmd.c
|
@ -1107,25 +1107,29 @@ Town *CreateRandomTown(uint attempts)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const byte _num_initial_towns[3] = {
|
static const byte _num_initial_towns[3] = {11, 23, 46};
|
||||||
11, 23, 46
|
|
||||||
};
|
|
||||||
|
|
||||||
void GenerateTowns(void)
|
bool GenerateTowns(void)
|
||||||
{
|
{
|
||||||
uint num = 0;
|
uint num = 0;
|
||||||
uint n =
|
uint n = ScaleByMapSize(_num_initial_towns[_opt.diff.number_towns] + (Random() & 7));
|
||||||
ScaleByMapSize(_num_initial_towns[_opt.diff.number_towns] + (Random() & 7));
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (CreateRandomTown(20) != NULL) //try 20 times for the first loop
|
if (CreateRandomTown(20) != NULL) //try 20 times for the first loop
|
||||||
num++;
|
num++;
|
||||||
} while (--n);
|
} while (--n);
|
||||||
|
|
||||||
|
// give it a last try, but now more aggressive
|
||||||
if (num == 0 && CreateRandomTown(10000) == NULL) {
|
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?
|
//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)
|
static bool CheckBuildHouseMode(Town *t1, TileIndex tile, uint tileh, int mode)
|
||||||
|
|
Loading…
Reference in New Issue