(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:
Darkvater 2005-09-16 00:33:33 +00:00
parent 1419244551
commit 180997534c
4 changed files with 24 additions and 11 deletions

View File

@ -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

View File

@ -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
View File

@ -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);

View File

@ -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)