(svn r4591) -Fix (FS#122) Game no longer errors out when "Many random towns" is selected in the scenario editor.
-Side effects: - Removed one global variable from variables.h - Remove an ugly hack for the "many random towns" function
This commit is contained in:
		
							
								
								
									
										21
									
								
								main_gui.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								main_gui.c
									
									
									
									
									
								
							@@ -1452,7 +1452,8 @@ void CcBuildTown(bool success, TileIndex tile, uint32 p1, uint32 p2)
 | 
			
		||||
 | 
			
		||||
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));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1474,11 +1475,14 @@ static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
 | 
			
		||||
{
 | 
			
		||||
	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 */
 | 
			
		||||
@@ -1489,7 +1493,7 @@ static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
 | 
			
		||||
 | 
			
		||||
			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) {
 | 
			
		||||
@@ -1504,18 +1508,13 @@ static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
 | 
			
		||||
			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;
 | 
			
		||||
		}
 | 
			
		||||
@@ -1528,7 +1527,7 @@ static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
 | 
			
		||||
		_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;
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								town.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								town.h
									
									
									
									
									
								
							@@ -83,7 +83,7 @@ void InitializeTown(void);
 | 
			
		||||
void ShowTownViewWindow(TownID town);
 | 
			
		||||
void DeleteTown(Town *t);
 | 
			
		||||
void ExpandTown(Town *t);
 | 
			
		||||
Town *CreateRandomTown(uint attempts);
 | 
			
		||||
Town *CreateRandomTown(uint attempts, uint size_mode);
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
	ROAD_REMOVE = 0,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								town_cmd.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								town_cmd.c
									
									
									
									
									
								
							@@ -887,7 +887,7 @@ void UpdateTownMaxPass(Town *t)
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
@@ -935,9 +935,11 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts)
 | 
			
		||||
	UpdateTownVirtCoord(t);
 | 
			
		||||
	_town_sort_dirty = true;
 | 
			
		||||
 | 
			
		||||
	if (size_mode == 0) {
 | 
			
		||||
		x = (Random() & 0xF) + 8;
 | 
			
		||||
	if (_game_mode == GM_EDITOR)
 | 
			
		||||
		x = _new_town_size * 16 + 3;
 | 
			
		||||
	} else {
 | 
			
		||||
		x = (size_mode - 1) * 16 + 3;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t->num_houses += x;
 | 
			
		||||
	UpdateTownRadius(t);
 | 
			
		||||
@@ -980,7 +982,7 @@ static Town *AllocateTown(void)
 | 
			
		||||
 * 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 tile 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(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 | 
			
		||||
@@ -1017,13 +1019,13 @@ int32 CmdBuildTown(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 | 
			
		||||
	// 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;
 | 
			
		||||
	Town *t;
 | 
			
		||||
@@ -1047,7 +1049,7 @@ Town *CreateRandomTown(uint attempts)
 | 
			
		||||
		t = AllocateTown();
 | 
			
		||||
		if (t == NULL) break;
 | 
			
		||||
 | 
			
		||||
		DoCreateTown(t, tile, townnameparts);
 | 
			
		||||
		DoCreateTown(t, tile, townnameparts, size_mode);
 | 
			
		||||
		return t;
 | 
			
		||||
	} while (--attempts);
 | 
			
		||||
	return NULL;
 | 
			
		||||
@@ -1061,17 +1063,17 @@ bool GenerateTowns(void)
 | 
			
		||||
	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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -287,7 +287,6 @@ VARDEF byte _yearly_expenses_type;
 | 
			
		||||
VARDEF TileIndex _terraform_err_tile;
 | 
			
		||||
VARDEF TileIndex _build_tunnel_endtile;
 | 
			
		||||
VARDEF bool _generating_world;
 | 
			
		||||
VARDEF int _new_town_size;
 | 
			
		||||
 | 
			
		||||
// Deals with the type of the savegame, independent of extension
 | 
			
		||||
typedef struct {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user