diff options
author | celestar <celestar@openttd.org> | 2006-04-27 11:19:12 +0000 |
---|---|---|
committer | celestar <celestar@openttd.org> | 2006-04-27 11:19:12 +0000 |
commit | 1d606e73921852906d12e0f8b73aa4d40b539130 (patch) | |
tree | 664f89a3e96c91e9374d3d33438c7f9873dc946b | |
parent | 8070a68b2cfdee091077f6c093d664228b12ca98 (diff) | |
download | openttd-1d606e73921852906d12e0f8b73aa4d40b539130.tar.xz |
(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
-rw-r--r-- | main_gui.c | 21 | ||||
-rw-r--r-- | town.h | 2 | ||||
-rw-r--r-- | town_cmd.c | 24 | ||||
-rw-r--r-- | variables.h | 1 |
4 files changed, 24 insertions, 24 deletions
diff --git a/main_gui.c b/main_gui.c index fe365e59b..bcd03de08 100644 --- a/main_gui.c +++ b/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; } @@ -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, diff --git a/town_cmd.c b/town_cmd.c index ca207ad9b..766789054 100644 --- a/town_cmd.c +++ b/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; - 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 @@ 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; } diff --git a/variables.h b/variables.h index 665a452e5..7cf870205 100644 --- a/variables.h +++ b/variables.h @@ -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 { |