# HG changeset patch # User celestar # Date 1146136752 0 # Node ID d6c991bdcbe1c81f60aa0b272e5e42b3551dce7a # Parent 00ba3772ca2006195217d5884cc3f94b99db5e7e (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 diff -r 00ba3772ca20 -r d6c991bdcbe1 main_gui.c --- a/main_gui.c Thu Apr 27 08:24:48 2006 +0000 +++ b/main_gui.c Thu Apr 27 11:19:12 2006 +0000 @@ -1452,7 +1452,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)); } @@ -1474,11 +1475,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 */ @@ -1489,7 +1493,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) { @@ -1504,18 +1508,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; } @@ -1528,7 +1527,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; } diff -r 00ba3772ca20 -r d6c991bdcbe1 town.h --- a/town.h Thu Apr 27 08:24:48 2006 +0000 +++ b/town.h Thu Apr 27 11:19:12 2006 +0000 @@ -83,7 +83,7 @@ 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, diff -r 00ba3772ca20 -r d6c991bdcbe1 town_cmd.c --- a/town_cmd.c Thu Apr 27 08:24:48 2006 +0000 +++ b/town_cmd.c Thu Apr 27 11:19:12 2006 +0000 @@ -887,7 +887,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; @@ -935,9 +935,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); @@ -980,7 +982,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 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 @@ // 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 @@ 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 @@ 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; } diff -r 00ba3772ca20 -r d6c991bdcbe1 variables.h --- a/variables.h Thu Apr 27 08:24:48 2006 +0000 +++ b/variables.h Thu Apr 27 11:19:12 2006 +0000 @@ -287,7 +287,6 @@ 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 {