diff --git a/main_gui.c b/main_gui.c index eaf17f75b2..e7fc6fb93b 100644 --- a/main_gui.c +++ b/main_gui.c @@ -1448,7 +1448,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)); } @@ -1470,11 +1471,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 */ @@ -1485,7 +1489,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) { @@ -1500,18 +1504,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; } @@ -1524,7 +1523,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; } diff --git a/town.h b/town.h index 99567bcb8c..de9dfcad4e 100644 --- a/town.h +++ b/town.h @@ -83,7 +83,7 @@ void InitializeTown(void); 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, diff --git a/town_cmd.c b/town_cmd.c index aab43ac4bb..b0332cfd21 100644 --- a/town_cmd.c +++ b/town_cmd.c @@ -920,7 +920,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; @@ -968,9 +968,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); @@ -1013,7 +1015,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 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 @@ int32 CmdBuildTown(int x, int y, 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; TileInfo ti; @@ -1089,7 +1091,7 @@ Town *CreateRandomTown(uint attempts) if (t == NULL) break; - DoCreateTown(t, tile, townnameparts); + DoCreateTown(t, tile, townnameparts, size_mode); return t; } while (--attempts); return NULL; @@ -1103,17 +1105,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 7bf4a30bc1..cb5042345c 100644 --- a/variables.h +++ b/variables.h @@ -292,7 +292,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; VARDEF uint _returned_refit_amount; // Deals with the type of the savegame, independent of extension