(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.
authorDarkvater
Fri, 16 Sep 2005 00:33:33 +0000
changeset 2430 e1da54e6bf91
parent 2429 94cc76052d36
child 2431 c720f620253e
(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.
lang/english.txt
main_gui.c
misc.c
town_cmd.c
--- a/lang/english.txt	Thu Sep 15 22:42:59 2005 +0000
+++ b/lang/english.txt	Fri Sep 16 00:33:33 2005 +0000
@@ -575,6 +575,8 @@
 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
--- a/main_gui.c	Thu Sep 15 22:42:59 2005 +0000
+++ b/main_gui.c	Fri Sep 16 00:33:33 2005 +0000
@@ -42,7 +42,7 @@
 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 @@
 			_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;
 		}
--- a/misc.c	Thu Sep 15 22:42:59 2005 +0000
+++ b/misc.c	Fri Sep 16 00:33:33 2005 +0000
@@ -113,7 +113,7 @@
 
 void GenerateIndustries(void);
 void GenerateUnmovables(void);
-void GenerateTowns(void);
+bool GenerateTowns(void);
 
 void StartupPlayers(void);
 void StartupDisasters(void);
--- a/town_cmd.c	Thu Sep 15 22:42:59 2005 +0000
+++ b/town_cmd.c	Fri Sep 16 00:33:33 2005 +0000
@@ -1107,25 +1107,29 @@
 	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)