(svn r4684) - Backport from trunk (r4591): 0.4
authorDarkvater
Tue, 02 May 2006 14:02:23 +0000
branch0.4
changeset 9998 8f0c2fe1797c
parent 9997 3265e9e4b8d7
child 9999 8d647eb13996
(svn r4684) - Backport from trunk (r4591):
Fix: Game no longer errors out when "Many random towns" is selected
in the scenario editor.
main_gui.c
town.h
town_cmd.c
variables.h
--- a/main_gui.c	Tue May 02 14:00:26 2006 +0000
+++ b/main_gui.c	Tue May 02 14:02:23 2006 +0000
@@ -1448,7 +1448,8 @@
 
 static void PlaceProc_Town(TileIndex tile)
 {
-	DoCommandP(tile, 0, 0, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
+	Window *w = FindWindowById(WC_SCEN_TOWN_GEN, 0);
+	DoCommandP(tile, 1 + FIND_FIRST_BIT(w->click_state >> 7), 0, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
 }
 
 
@@ -1470,11 +1471,14 @@
 {
 	switch (e->event) {
 	case WE_PAINT:
-		w->click_state = (w->click_state & ~(1<<7 | 1<<8 | 1<<9) ) | (1 << (_new_town_size + 7));
 		DrawWindowWidgets(w);
 		DrawStringCentered(80, 56, STR_02A5_TOWN_SIZE, 0);
 		break;
 
+	case WE_CREATE:
+		w->click_state = 1 << 8; /* medium town size selected */
+		break;
+
 	case WE_CLICK:
 		switch (e->click.widget) {
 		case 4: /* new town */
@@ -1485,7 +1489,7 @@
 
 			HandleButtonClick(w, 5);
 			_generating_world = true;
-			t = CreateRandomTown(20);
+			t = CreateRandomTown(20, 1 + FIND_FIRST_BIT(w->click_state >> 7));
 			_generating_world = false;
 
 			if (t == NULL) {
@@ -1500,18 +1504,13 @@
 			HandleButtonClick(w, 6);
 
 			_generating_world = true;
-			_game_mode = GM_NORMAL; // little hack to avoid towns of the same size
-			if (!GenerateTowns()) {
-				ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
-			}
+			if (!GenerateTowns()) ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
 			_generating_world = false;
-
-			_game_mode = GM_EDITOR;
 			break;
 		}
 
 		case 7: case 8: case 9:
-			_new_town_size = e->click.widget - 7;
+			w->click_state = 1 << e->click.widget;
 			SetWindowDirty(w);
 			break;
 		}
@@ -1524,7 +1523,7 @@
 		_place_proc(e->place.tile);
 		break;
 	case WE_ABORT_PLACE_OBJ:
-		w->click_state = 0;
+		w->click_state &= (1 << 7 | 1 << 8 | 1 << 9);
 		SetWindowDirty(w);
 		break;
 	}
--- a/town.h	Tue May 02 14:00:26 2006 +0000
+++ b/town.h	Tue May 02 14:02:23 2006 +0000
@@ -83,7 +83,7 @@
 void ShowTownViewWindow(uint town);
 void DeleteTown(Town *t);
 void ExpandTown(Town *t);
-Town *CreateRandomTown(uint attempts);
+Town *CreateRandomTown(uint attempts, uint size_mode);
 
 enum {
 	ROAD_REMOVE = 0,
--- a/town_cmd.c	Tue May 02 14:00:26 2006 +0000
+++ b/town_cmd.c	Tue May 02 14:02:23 2006 +0000
@@ -920,7 +920,7 @@
 	t->max_mail = t->population >> 4;
 }
 
-static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts)
+static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, uint size_mode)
 {
 	int x, i;
 
@@ -968,9 +968,11 @@
 	UpdateTownVirtCoord(t);
 	_town_sort_dirty = true;
 
-	x = (Random() & 0xF) + 8;
-	if (_game_mode == GM_EDITOR)
-		x = _new_town_size * 16 + 3;
+	if (size_mode == 0) {
+		x = (Random() & 0xF) + 8;
+	} else {
+		x = (size_mode - 1) * 16 + 3;
+	}
 
 	t->num_houses += x;
 	UpdateTownRadius(t);
@@ -1013,7 +1015,7 @@
  * This obviously only works in the scenario editor. Function not removed
  * as it might be possible in the future to fund your own town :)
  * @param x,y coordinates where town is built
- * @param p1 unused
+ * @param p1 size of the town (1 = small, 2 = medium, 3 = large)
  * @param p2 unused
  */
 int32 CmdBuildTown(int x, int y, uint32 flags, uint32 p1, uint32 p2)
@@ -1052,13 +1054,13 @@
 	// Create the town
 	if (flags & DC_EXEC) {
 		_generating_world = true;
-		DoCreateTown(t, tile, townnameparts);
+		DoCreateTown(t, tile, townnameparts, p1);
 		_generating_world = false;
 	}
 	return 0;
 }
 
-Town *CreateRandomTown(uint attempts)
+Town *CreateRandomTown(uint attempts, uint size_mode)
 {
 	TileIndex tile;
 	TileInfo ti;
@@ -1089,7 +1091,7 @@
 		if (t == NULL)
 			break;
 
-		DoCreateTown(t, tile, townnameparts);
+		DoCreateTown(t, tile, townnameparts, size_mode);
 		return t;
 	} while (--attempts);
 	return NULL;
@@ -1103,17 +1105,17 @@
 	uint n = ScaleByMapSize(_num_initial_towns[_opt.diff.number_towns] + (Random() & 7));
 
 	do {
-		if (CreateRandomTown(20) != NULL) 	//try 20 times for the first loop
+		if (CreateRandomTown(20, 0) != NULL) 	//try 20 times to create a random-sized town for the first loop.
 			num++;
 	} while (--n);
 
 	// give it a last try, but now more aggressive
-	if (num == 0 && CreateRandomTown(10000) == NULL) {
+	if (num == 0 && CreateRandomTown(10000, 0) == NULL) {
 		Town *t;
 		FOR_ALL_TOWNS(t) { if (IsValidTown(t)) {num = 1; break;}}
 
 		//XXX can we handle that more gracefully?
-		if (num == 0) error("Could not generate any town");
+		if (num == 0 && _game_mode != GM_EDITOR) error("Could not generate any town");
 		return false;
 	}
 
--- a/variables.h	Tue May 02 14:00:26 2006 +0000
+++ b/variables.h	Tue May 02 14:02:23 2006 +0000
@@ -292,7 +292,6 @@
 VARDEF TileIndex _terraform_err_tile;
 VARDEF TileIndex _build_tunnel_endtile;
 VARDEF bool _generating_world;
-VARDEF int _new_town_size;
 VARDEF uint _returned_refit_amount;
 
 // Deals with the type of the savegame, independent of extension