OpenTTD Source  1.10.3
town_cmd.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "stdafx.h"
11 #include "road.h"
12 #include "road_internal.h" /* Cleaning up road bits */
13 #include "road_cmd.h"
14 #include "landscape.h"
15 #include "viewport_func.h"
16 #include "viewport_kdtree.h"
17 #include "cmd_helper.h"
18 #include "command_func.h"
19 #include "industry.h"
20 #include "station_base.h"
21 #include "station_kdtree.h"
22 #include "company_base.h"
23 #include "news_func.h"
24 #include "error.h"
25 #include "object.h"
26 #include "genworld.h"
27 #include "newgrf_debug.h"
28 #include "newgrf_house.h"
29 #include "newgrf_text.h"
30 #include "autoslope.h"
31 #include "tunnelbridge_map.h"
32 #include "strings_func.h"
33 #include "window_func.h"
34 #include "string_func.h"
35 #include "newgrf_cargo.h"
36 #include "cheat_type.h"
37 #include "animated_tile_func.h"
38 #include "date_func.h"
39 #include "subsidy_func.h"
40 #include "core/pool_func.hpp"
41 #include "town.h"
42 #include "town_kdtree.h"
43 #include "townname_func.h"
44 #include "core/random_func.hpp"
45 #include "core/backup_type.hpp"
46 #include "depot_base.h"
47 #include "object_map.h"
48 #include "object_base.h"
49 #include "ai/ai.hpp"
50 #include "game/game.hpp"
51 
52 #include "table/strings.h"
53 #include "table/town_land.h"
54 
55 #include "safeguards.h"
56 
57 TownID _new_town_id;
58 
59 /* Initialize the town-pool */
60 TownPool _town_pool("Town");
62 
63 
64 TownKdtree _town_kdtree(&Kdtree_TownXYFunc);
65 
66 void RebuildTownKdtree()
67 {
68  std::vector<TownID> townids;
69  for (const Town *town : Town::Iterate()) {
70  townids.push_back(town->index);
71  }
72  _town_kdtree.Build(townids.begin(), townids.end());
73 }
74 
75 
85 static bool TestTownOwnsBridge(TileIndex tile, const Town *t)
86 {
87  if (!IsTileOwner(tile, OWNER_TOWN)) return false;
88 
90  bool town_owned = IsTileType(adjacent, MP_ROAD) && IsTileOwner(adjacent, OWNER_TOWN) && GetTownIndex(adjacent) == t->index;
91 
92  if (!town_owned) {
93  /* Or other adjacent road */
95  town_owned = IsTileType(adjacent, MP_ROAD) && IsTileOwner(adjacent, OWNER_TOWN) && GetTownIndex(adjacent) == t->index;
96  }
97 
98  return town_owned;
99 }
100 
102 {
103  free(this->name);
104  free(this->text);
105 
106  if (CleaningPool()) return;
107 
108  /* Delete town authority window
109  * and remove from list of sorted towns */
111 
112  /* Check no industry is related to us. */
113  for (const Industry *i : Industry::Iterate()) assert(i->town != this);
114 
115  /* ... and no object is related to us. */
116  for (const Object *o : Object::Iterate()) assert(o->town != this);
117 
118  /* Check no tile is related to us. */
119  for (TileIndex tile = 0; tile < MapSize(); ++tile) {
120  switch (GetTileType(tile)) {
121  case MP_HOUSE:
122  assert(GetTownIndex(tile) != this->index);
123  break;
124 
125  case MP_ROAD:
126  assert(!HasTownOwnedRoad(tile) || GetTownIndex(tile) != this->index);
127  break;
128 
129  case MP_TUNNELBRIDGE:
130  assert(!TestTownOwnsBridge(tile, this));
131  break;
132 
133  default:
134  break;
135  }
136  }
137 
138  /* Clear the persistent storage list. */
139  this->psa_list.clear();
140 
145 }
146 
147 
154 {
155  InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_FORCE_REBUILD);
157 
158  /* Give objects a new home! */
159  for (Object *o : Object::Iterate()) {
160  if (o->town == nullptr) o->town = CalcClosestTownFromTile(o->location.tile, UINT_MAX);
161  }
162 }
163 
168 {
169  if (layout != TL_RANDOM) {
170  this->layout = layout;
171  return;
172  }
173 
174  this->layout = static_cast<TownLayout>(TileHash(TileX(this->xy), TileY(this->xy)) % (NUM_TLS - 1));
175 }
176 
181 /* static */ Town *Town::GetRandom()
182 {
183  if (Town::GetNumItems() == 0) return nullptr;
184  int num = RandomRange((uint16)Town::GetNumItems());
185  size_t index = MAX_UVALUE(size_t);
186 
187  while (num >= 0) {
188  num--;
189  index++;
190 
191  /* Make sure we have a valid town */
192  while (!Town::IsValidID(index)) {
193  index++;
194  assert(index < Town::GetPoolSize());
195  }
196  }
197 
198  return Town::Get(index);
199 }
200 
201 void Town::FillCachedName() const
202 {
204  char *end = GetTownName(buf, this, lastof(buf));
205  this->cached_name.assign(buf, end);
206 }
207 
213 {
214  return (_price[PR_CLEAR_HOUSE] * this->removal_cost) >> 8;
215 }
216 
217 /* Local */
218 static int _grow_town_result;
219 
220 /* Describe the possible states */
221 enum TownGrowthResult {
222  GROWTH_SUCCEED = -1,
223  GROWTH_SEARCH_STOPPED = 0
224 // GROWTH_SEARCH_RUNNING >= 1
225 };
226 
227 static bool BuildTownHouse(Town *t, TileIndex tile);
228 static Town *CreateRandomTown(uint attempts, uint32 townnameparts, TownSize size, bool city, TownLayout layout);
229 
230 static void TownDrawHouseLift(const TileInfo *ti)
231 {
232  AddChildSpriteScreen(SPR_LIFT, PAL_NONE, 14, 60 - GetLiftPosition(ti->tile));
233 }
234 
235 typedef void TownDrawTileProc(const TileInfo *ti);
236 static TownDrawTileProc * const _town_draw_tile_procs[1] = {
237  TownDrawHouseLift
238 };
239 
246 {
247  return (DiagDirection)(3 & Random());
248 }
249 
255 static void DrawTile_Town(TileInfo *ti)
256 {
257  HouseID house_id = GetHouseType(ti->tile);
258 
259  if (house_id >= NEW_HOUSE_OFFSET) {
260  /* Houses don't necessarily need new graphics. If they don't have a
261  * spritegroup associated with them, then the sprite for the substitute
262  * house id is drawn instead. */
263  if (HouseSpec::Get(house_id)->grf_prop.spritegroup[0] != nullptr) {
264  DrawNewHouseTile(ti, house_id);
265  return;
266  } else {
267  house_id = HouseSpec::Get(house_id)->grf_prop.subst_id;
268  }
269  }
270 
271  /* Retrieve pointer to the draw town tile struct */
272  const DrawBuildingsTileStruct *dcts = &_town_draw_tile_data[house_id << 4 | TileHash2Bit(ti->x, ti->y) << 2 | GetHouseBuildingStage(ti->tile)];
273 
275 
276  DrawGroundSprite(dcts->ground.sprite, dcts->ground.pal);
277 
278  /* If houses are invisible, do not draw the upper part */
279  if (IsInvisibilitySet(TO_HOUSES)) return;
280 
281  /* Add a house on top of the ground? */
282  SpriteID image = dcts->building.sprite;
283  if (image != 0) {
284  AddSortableSpriteToDraw(image, dcts->building.pal,
285  ti->x + dcts->subtile_x,
286  ti->y + dcts->subtile_y,
287  dcts->width,
288  dcts->height,
289  dcts->dz,
290  ti->z,
292  );
293 
294  if (IsTransparencySet(TO_HOUSES)) return;
295  }
296 
297  {
298  int proc = dcts->draw_proc - 1;
299 
300  if (proc >= 0) _town_draw_tile_procs[proc](ti);
301  }
302 }
303 
304 static int GetSlopePixelZ_Town(TileIndex tile, uint x, uint y)
305 {
306  return GetTileMaxPixelZ(tile);
307 }
308 
311 {
312  HouseID hid = GetHouseType(tile);
313 
314  /* For NewGRF house tiles we might not be drawing a foundation. We need to
315  * account for this, as other structures should
316  * draw the wall of the foundation in this case.
317  */
318  if (hid >= NEW_HOUSE_OFFSET) {
319  const HouseSpec *hs = HouseSpec::Get(hid);
320  if (hs->grf_prop.spritegroup[0] != nullptr && HasBit(hs->callback_mask, CBM_HOUSE_DRAW_FOUNDATIONS)) {
321  uint32 callback_res = GetHouseCallback(CBID_HOUSE_DRAW_FOUNDATIONS, 0, 0, hid, Town::GetByTile(tile), tile);
322  if (callback_res != CALLBACK_FAILED && !ConvertBooleanCallback(hs->grf_prop.grffile, CBID_HOUSE_DRAW_FOUNDATIONS, callback_res)) return FOUNDATION_NONE;
323  }
324  }
325  return FlatteningFoundation(tileh);
326 }
327 
334 static void AnimateTile_Town(TileIndex tile)
335 {
336  if (GetHouseType(tile) >= NEW_HOUSE_OFFSET) {
337  AnimateNewHouseTile(tile);
338  return;
339  }
340 
341  if (_tick_counter & 3) return;
342 
343  /* If the house is not one with a lift anymore, then stop this animating.
344  * Not exactly sure when this happens, but probably when a house changes.
345  * Before this was just a return...so it'd leak animated tiles..
346  * That bug seems to have been here since day 1?? */
347  if (!(HouseSpec::Get(GetHouseType(tile))->building_flags & BUILDING_IS_ANIMATED)) {
348  DeleteAnimatedTile(tile);
349  return;
350  }
351 
352  if (!LiftHasDestination(tile)) {
353  uint i;
354 
355  /* Building has 6 floors, number 0 .. 6, where 1 is illegal.
356  * This is due to the fact that the first floor is, in the graphics,
357  * the height of 2 'normal' floors.
358  * Furthermore, there are 6 lift positions from floor N (incl) to floor N + 1 (excl) */
359  do {
360  i = RandomRange(7);
361  } while (i == 1 || i * 6 == GetLiftPosition(tile));
362 
363  SetLiftDestination(tile, i);
364  }
365 
366  int pos = GetLiftPosition(tile);
367  int dest = GetLiftDestination(tile) * 6;
368  pos += (pos < dest) ? 1 : -1;
369  SetLiftPosition(tile, pos);
370 
371  if (pos == dest) {
372  HaltLift(tile);
373  DeleteAnimatedTile(tile);
374  }
375 
376  MarkTileDirtyByTile(tile);
377 }
378 
385 static bool IsCloseToTown(TileIndex tile, uint dist)
386 {
387  if (_town_kdtree.Count() == 0) return false;
388  Town *t = Town::Get(_town_kdtree.FindNearest(TileX(tile), TileY(tile)));
389  return DistanceManhattan(tile, t->xy) < dist;
390 }
391 
397 {
398  Point pt = RemapCoords2(TileX(this->xy) * TILE_SIZE, TileY(this->xy) * TILE_SIZE);
399 
400  if (this->cache.sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(this->index));
401 
402  SetDParam(0, this->index);
403  SetDParam(1, this->cache.population);
404  this->cache.sign.UpdatePosition(pt.x, pt.y - 24 * ZOOM_LVL_BASE,
405  _settings_client.gui.population_in_label ? STR_VIEWPORT_TOWN_POP : STR_VIEWPORT_TOWN,
406  STR_VIEWPORT_TOWN);
407 
408  _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(this->index));
409 
411 }
412 
415 {
416  for (Town *t : Town::Iterate()) {
417  t->UpdateVirtCoord();
418  }
419 }
420 
421 void ClearAllTownCachedNames()
422 {
423  for (Town *t : Town::Iterate()) {
424  t->cached_name.clear();
425  }
426 }
427 
433 static void ChangePopulation(Town *t, int mod)
434 {
435  t->cache.population += mod;
436  InvalidateWindowData(WC_TOWN_VIEW, t->index); // Cargo requirements may appear/vanish for small populations
438 
439  InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_POPULATION_CHANGE);
440 }
441 
448 {
449  uint32 pop = 0;
450  for (const Town *t : Town::Iterate()) pop += t->cache.population;
451  return pop;
452 }
453 
461 static void RemoveNearbyStations(Town *t, TileIndex tile, BuildingFlags flags)
462 {
463  for (StationList::iterator it = t->stations_near.begin(); it != t->stations_near.end(); /* incremented inside loop */) {
464  const Station *st = *it;
465 
466  bool covers_area = st->TileIsInCatchment(tile);
467  if (flags & BUILDING_2_TILES_Y) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(0, 1));
468  if (flags & BUILDING_2_TILES_X) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(1, 0));
469  if (flags & BUILDING_HAS_4_TILES) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(1, 1));
470 
471  if (covers_area && !st->CatchmentCoversTown(t->index)) {
472  it = t->stations_near.erase(it);
473  } else {
474  ++it;
475  }
476  }
477 }
478 
484 {
485  assert(IsTileType(tile, MP_HOUSE));
486 
487  /* progress in construction stages */
489  if (GetHouseConstructionTick(tile) != 0) return;
490 
491  AnimateNewHouseConstruction(tile);
492 
493  if (IsHouseCompleted(tile)) {
494  /* Now that construction is complete, we can add the population of the
495  * building to the town. */
496  ChangePopulation(Town::GetByTile(tile), HouseSpec::Get(GetHouseType(tile))->population);
497  ResetHouseAge(tile);
498  }
499  MarkTileDirtyByTile(tile);
500 }
501 
507 {
508  uint flags = HouseSpec::Get(GetHouseType(tile))->building_flags;
509  if (flags & BUILDING_HAS_1_TILE) MakeSingleHouseBigger(TILE_ADDXY(tile, 0, 0));
510  if (flags & BUILDING_2_TILES_Y) MakeSingleHouseBigger(TILE_ADDXY(tile, 0, 1));
511  if (flags & BUILDING_2_TILES_X) MakeSingleHouseBigger(TILE_ADDXY(tile, 1, 0));
512  if (flags & BUILDING_HAS_4_TILES) MakeSingleHouseBigger(TILE_ADDXY(tile, 1, 1));
513 }
514 
521 static void TileLoop_Town(TileIndex tile)
522 {
523  HouseID house_id = GetHouseType(tile);
524 
525  /* NewHouseTileLoop returns false if Callback 21 succeeded, i.e. the house
526  * doesn't exist any more, so don't continue here. */
527  if (house_id >= NEW_HOUSE_OFFSET && !NewHouseTileLoop(tile)) return;
528 
529  if (!IsHouseCompleted(tile)) {
530  /* Construction is not completed. See if we can go further in construction*/
531  MakeTownHouseBigger(tile);
532  return;
533  }
534 
535  const HouseSpec *hs = HouseSpec::Get(house_id);
536 
537  /* If the lift has a destination, it is already an animated tile. */
538  if ((hs->building_flags & BUILDING_IS_ANIMATED) &&
539  house_id < NEW_HOUSE_OFFSET &&
540  !LiftHasDestination(tile) &&
541  Chance16(1, 2)) {
542  AddAnimatedTile(tile);
543  }
544 
545  Town *t = Town::GetByTile(tile);
546  uint32 r = Random();
547 
548  StationFinder stations(TileArea(tile, 1, 1));
549 
551  for (uint i = 0; i < 256; i++) {
552  uint16 callback = GetHouseCallback(CBID_HOUSE_PRODUCE_CARGO, i, r, house_id, t, tile);
553 
554  if (callback == CALLBACK_FAILED || callback == CALLBACK_HOUSEPRODCARGO_END) break;
555 
556  CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grf_prop.grffile);
557  if (cargo == CT_INVALID) continue;
558 
559  uint amt = GB(callback, 0, 8);
560  if (amt == 0) continue;
561 
562  uint moved = MoveGoodsToStation(cargo, amt, ST_TOWN, t->index, stations.GetStations());
563 
564  const CargoSpec *cs = CargoSpec::Get(cargo);
565  t->supplied[cs->Index()].new_max += amt;
566  t->supplied[cs->Index()].new_act += moved;
567  }
568  } else {
570  case TCGM_ORIGINAL:
571  /* Original (quadratic) cargo generation algorithm */
572  if (GB(r, 0, 8) < hs->population) {
573  uint amt = GB(r, 0, 8) / 8 + 1;
574 
575  if (EconomyIsInRecession()) amt = (amt + 1) >> 1;
576  t->supplied[CT_PASSENGERS].new_max += amt;
577  t->supplied[CT_PASSENGERS].new_act += MoveGoodsToStation(CT_PASSENGERS, amt, ST_TOWN, t->index, stations.GetStations());
578  }
579 
580  if (GB(r, 8, 8) < hs->mail_generation) {
581  uint amt = GB(r, 8, 8) / 8 + 1;
582 
583  if (EconomyIsInRecession()) amt = (amt + 1) >> 1;
584  t->supplied[CT_MAIL].new_max += amt;
585  t->supplied[CT_MAIL].new_act += MoveGoodsToStation(CT_MAIL, amt, ST_TOWN, t->index, stations.GetStations());
586  }
587  break;
588 
589  case TCGM_BITCOUNT:
590  /* Binomial distribution per tick, by a series of coin flips */
591  /* Reduce generation rate to a 1/4, using tile bits to spread out distribution.
592  * As tick counter is incremented by 256 between each call, we ignore the lower 8 bits. */
593  if (GB(_tick_counter, 8, 2) == GB(tile, 0, 2)) {
594  /* Make a bitmask with up to 32 bits set, one for each potential pax */
595  int genmax = (hs->population + 7) / 8;
596  uint32 genmask = (genmax >= 32) ? 0xFFFFFFFF : ((1 << genmax) - 1);
597  /* Mask random value by potential pax and count number of actual pax */
598  uint amt = CountBits(r & genmask);
599  /* Adjust and apply */
600  if (EconomyIsInRecession()) amt = (amt + 1) >> 1;
601  t->supplied[CT_PASSENGERS].new_max += amt;
602  t->supplied[CT_PASSENGERS].new_act += MoveGoodsToStation(CT_PASSENGERS, amt, ST_TOWN, t->index, stations.GetStations());
603 
604  /* Do the same for mail, with a fresh random */
605  r = Random();
606  genmax = (hs->mail_generation + 7) / 8;
607  genmask = (genmax >= 32) ? 0xFFFFFFFF : ((1 << genmax) - 1);
608  amt = CountBits(r & genmask);
609  if (EconomyIsInRecession()) amt = (amt + 1) >> 1;
610  t->supplied[CT_MAIL].new_max += amt;
611  t->supplied[CT_MAIL].new_act += MoveGoodsToStation(CT_MAIL, amt, ST_TOWN, t->index, stations.GetStations());
612  }
613  break;
614 
615  default:
616  NOT_REACHED();
617  }
618  }
619 
620  Backup<CompanyID> cur_company(_current_company, OWNER_TOWN, FILE_LINE);
621 
622  if ((hs->building_flags & BUILDING_HAS_1_TILE) &&
624  CanDeleteHouse(tile) &&
625  GetHouseAge(tile) >= hs->minimum_life &&
626  --t->time_until_rebuild == 0) {
627  t->time_until_rebuild = GB(r, 16, 8) + 192;
628 
629  ClearTownHouse(t, tile);
630 
631  /* Rebuild with another house? */
632  if (GB(r, 24, 8) >= 12) BuildTownHouse(t, tile);
633  }
634 
635  cur_company.Restore();
636 }
637 
638 static CommandCost ClearTile_Town(TileIndex tile, DoCommandFlag flags)
639 {
640  if (flags & DC_AUTO) return_cmd_error(STR_ERROR_BUILDING_MUST_BE_DEMOLISHED);
641  if (!CanDeleteHouse(tile)) return CMD_ERROR;
642 
643  const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
644 
646  cost.AddCost(hs->GetRemovalCost());
647 
648  int rating = hs->remove_rating_decrease;
649  Town *t = Town::GetByTile(tile);
650 
652  if (rating > t->ratings[_current_company] && !(flags & DC_NO_TEST_TOWN_RATING) && !_cheats.magic_bulldozer.value) {
653  SetDParam(0, t->index);
654  return_cmd_error(STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS);
655  }
656  }
657 
658  ChangeTownRating(t, -rating, RATING_HOUSE_MINIMUM, flags);
659  if (flags & DC_EXEC) {
660  ClearTownHouse(t, tile);
661  }
662 
663  return cost;
664 }
665 
666 static void AddProducedCargo_Town(TileIndex tile, CargoArray &produced)
667 {
668  HouseID house_id = GetHouseType(tile);
669  const HouseSpec *hs = HouseSpec::Get(house_id);
670  Town *t = Town::GetByTile(tile);
671 
673  for (uint i = 0; i < 256; i++) {
674  uint16 callback = GetHouseCallback(CBID_HOUSE_PRODUCE_CARGO, i, 0, house_id, t, tile);
675 
676  if (callback == CALLBACK_FAILED || callback == CALLBACK_HOUSEPRODCARGO_END) break;
677 
678  CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grf_prop.grffile);
679 
680  if (cargo == CT_INVALID) continue;
681  produced[cargo]++;
682  }
683  } else {
684  if (hs->population > 0) {
685  produced[CT_PASSENGERS]++;
686  }
687  if (hs->mail_generation > 0) {
688  produced[CT_MAIL]++;
689  }
690  }
691 }
692 
693 static inline void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, CargoTypes *always_accepted)
694 {
695  if (cargo == CT_INVALID || amount == 0) return;
696  acceptance[cargo] += amount;
697  SetBit(*always_accepted, cargo);
698 }
699 
700 static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted)
701 {
702  const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
703  CargoID accepts[lengthof(hs->accepts_cargo)];
704 
705  /* Set the initial accepted cargo types */
706  for (uint8 i = 0; i < lengthof(accepts); i++) {
707  accepts[i] = hs->accepts_cargo[i];
708  }
709 
710  /* Check for custom accepted cargo types */
712  uint16 callback = GetHouseCallback(CBID_HOUSE_ACCEPT_CARGO, 0, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
713  if (callback != CALLBACK_FAILED) {
714  /* Replace accepted cargo types with translated values from callback */
715  accepts[0] = GetCargoTranslation(GB(callback, 0, 5), hs->grf_prop.grffile);
716  accepts[1] = GetCargoTranslation(GB(callback, 5, 5), hs->grf_prop.grffile);
717  accepts[2] = GetCargoTranslation(GB(callback, 10, 5), hs->grf_prop.grffile);
718  }
719  }
720 
721  /* Check for custom cargo acceptance */
723  uint16 callback = GetHouseCallback(CBID_HOUSE_CARGO_ACCEPTANCE, 0, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
724  if (callback != CALLBACK_FAILED) {
725  AddAcceptedCargoSetMask(accepts[0], GB(callback, 0, 4), acceptance, always_accepted);
726  AddAcceptedCargoSetMask(accepts[1], GB(callback, 4, 4), acceptance, always_accepted);
727  if (_settings_game.game_creation.landscape != LT_TEMPERATE && HasBit(callback, 12)) {
728  /* The 'S' bit indicates food instead of goods */
729  AddAcceptedCargoSetMask(CT_FOOD, GB(callback, 8, 4), acceptance, always_accepted);
730  } else {
731  AddAcceptedCargoSetMask(accepts[2], GB(callback, 8, 4), acceptance, always_accepted);
732  }
733  return;
734  }
735  }
736 
737  /* No custom acceptance, so fill in with the default values */
738  for (uint8 i = 0; i < lengthof(accepts); i++) {
739  AddAcceptedCargoSetMask(accepts[i], hs->cargo_acceptance[i], acceptance, always_accepted);
740  }
741 }
742 
743 static void GetTileDesc_Town(TileIndex tile, TileDesc *td)
744 {
745  const HouseID house = GetHouseType(tile);
746  const HouseSpec *hs = HouseSpec::Get(house);
747  bool house_completed = IsHouseCompleted(tile);
748 
749  td->str = hs->building_name;
750 
751  uint16 callback_res = GetHouseCallback(CBID_HOUSE_CUSTOM_NAME, house_completed ? 1 : 0, 0, house, Town::GetByTile(tile), tile);
752  if (callback_res != CALLBACK_FAILED && callback_res != 0x400) {
753  if (callback_res > 0x400) {
755  } else {
756  StringID new_name = GetGRFStringID(hs->grf_prop.grffile->grfid, 0xD000 + callback_res);
757  if (new_name != STR_NULL && new_name != STR_UNDEFINED) {
758  td->str = new_name;
759  }
760  }
761  }
762 
763  if (!house_completed) {
764  SetDParamX(td->dparam, 0, td->str);
765  td->str = STR_LAI_TOWN_INDUSTRY_DESCRIPTION_UNDER_CONSTRUCTION;
766  }
767 
768  if (hs->grf_prop.grffile != nullptr) {
769  const GRFConfig *gc = GetGRFConfig(hs->grf_prop.grffile->grfid);
770  td->grf = gc->GetName();
771  }
772 
773  td->owner[0] = OWNER_TOWN;
774 }
775 
776 static TrackStatus GetTileTrackStatus_Town(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
777 {
778  /* not used */
779  return 0;
780 }
781 
782 static void ChangeTileOwner_Town(TileIndex tile, Owner old_owner, Owner new_owner)
783 {
784  /* not used */
785 }
786 
787 static bool GrowTown(Town *t);
788 
789 static void TownTickHandler(Town *t)
790 {
791  if (HasBit(t->flags, TOWN_IS_GROWING)) {
792  int i = (int)t->grow_counter - 1;
793  if (i < 0) {
794  if (GrowTown(t)) {
795  i = t->growth_rate;
796  } else {
797  /* If growth failed wait a bit before retrying */
798  i = min(t->growth_rate, TOWN_GROWTH_TICKS - 1);
799  }
800  }
801  t->grow_counter = i;
802  }
803 }
804 
805 void OnTick_Town()
806 {
807  if (_game_mode == GM_EDITOR) return;
808 
809  for (Town *t : Town::Iterate()) {
810  TownTickHandler(t);
811  }
812 }
813 
823 {
824  if (IsRoadDepotTile(tile) || IsStandardRoadStopTile(tile)) return ROAD_NONE;
825 
826  return GetAnyRoadBits(tile, RTT_ROAD, true);
827 }
828 
829 RoadType GetTownRoadType(const Town *t)
830 {
831  RoadType best_rt = ROADTYPE_ROAD;
832  const RoadTypeInfo *best = nullptr;
833  const uint16 assume_max_speed = 50;
834 
835  for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) {
836  if (RoadTypeIsTram(rt)) continue;
837 
838  const RoadTypeInfo *rti = GetRoadTypeInfo(rt);
839 
840  /* Unused road type. */
841  if (rti->label == 0) continue;
842 
843  /* Can town build this road. */
844  if (!HasBit(rti->flags, ROTF_TOWN_BUILD)) continue;
845 
846  /* Not yet introduced at this date. */
847  if (IsInsideMM(rti->introduction_date, 0, MAX_DAY) && rti->introduction_date > _date) continue;
848 
849  if (best != nullptr) {
850  if ((rti->max_speed == 0 ? assume_max_speed : rti->max_speed) < (best->max_speed == 0 ? assume_max_speed : best->max_speed)) continue;
851  }
852 
853  best_rt = rt;
854  best = rti;
855  }
856 
857  return best_rt;
858 }
859 
870 static bool IsNeighborRoadTile(TileIndex tile, const DiagDirection dir, uint dist_multi)
871 {
872  if (!IsValidTile(tile)) return false;
873 
874  /* Lookup table for the used diff values */
875  const TileIndexDiff tid_lt[3] = {
879  };
880 
881  dist_multi = (dist_multi + 1) * 4;
882  for (uint pos = 4; pos < dist_multi; pos++) {
883  /* Go (pos / 4) tiles to the left or the right */
884  TileIndexDiff cur = tid_lt[(pos & 1) ? 0 : 1] * (pos / 4);
885 
886  /* Use the current tile as origin, or go one tile backwards */
887  if (pos & 2) cur += tid_lt[2];
888 
889  /* Test for roadbit parallel to dir and facing towards the middle axis */
890  if (IsValidTile(tile + cur) &&
891  GetTownRoadBits(TILE_ADD(tile, cur)) & DiagDirToRoadBits((pos & 2) ? dir : ReverseDiagDir(dir))) return true;
892  }
893  return false;
894 }
895 
904 static bool IsRoadAllowedHere(Town *t, TileIndex tile, DiagDirection dir)
905 {
906  if (DistanceFromEdge(tile) == 0) return false;
907 
908  /* Prevent towns from building roads under bridges along the bridge. Looks silly. */
909  if (IsBridgeAbove(tile) && GetBridgeAxis(tile) == DiagDirToAxis(dir)) return false;
910 
911  /* Check if there already is a road at this point? */
912  if (GetTownRoadBits(tile) == ROAD_NONE) {
913  /* No, try if we are able to build a road piece there.
914  * If that fails clear the land, and if that fails exit.
915  * This is to make sure that we can build a road here later. */
916  RoadType rt = GetTownRoadType(t);
917  if (DoCommand(tile, ((dir == DIAGDIR_NW || dir == DIAGDIR_SE) ? ROAD_Y : ROAD_X) | (rt << 4), 0, DC_AUTO, CMD_BUILD_ROAD).Failed() &&
918  DoCommand(tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR).Failed()) {
919  return false;
920  }
921  }
922 
924  bool ret = !IsNeighborRoadTile(tile, dir, t->layout == TL_ORIGINAL ? 1 : 2);
925  if (cur_slope == SLOPE_FLAT) return ret;
926 
927  /* If the tile is not a slope in the right direction, then
928  * maybe terraform some. */
929  Slope desired_slope = (dir == DIAGDIR_NW || dir == DIAGDIR_SE) ? SLOPE_NW : SLOPE_NE;
930  if (desired_slope != cur_slope && ComplementSlope(desired_slope) != cur_slope) {
931  if (Chance16(1, 8)) {
932  CommandCost res = CMD_ERROR;
933  if (!_generating_world && Chance16(1, 10)) {
934  /* Note: Do not replace "^ SLOPE_ELEVATED" with ComplementSlope(). The slope might be steep. */
935  res = DoCommand(tile, Chance16(1, 16) ? cur_slope : cur_slope ^ SLOPE_ELEVATED, 0,
937  }
938  if (res.Failed() && Chance16(1, 3)) {
939  /* We can consider building on the slope, though. */
940  return ret;
941  }
942  }
943  return false;
944  }
945  return ret;
946 }
947 
948 static bool TerraformTownTile(TileIndex tile, int edges, int dir)
949 {
950  assert(tile < MapSize());
951 
952  CommandCost r = DoCommand(tile, edges, dir, DC_AUTO | DC_NO_WATER, CMD_TERRAFORM_LAND);
953  if (r.Failed() || r.GetCost() >= (_price[PR_TERRAFORM] + 2) * 8) return false;
954  DoCommand(tile, edges, dir, DC_AUTO | DC_NO_WATER | DC_EXEC, CMD_TERRAFORM_LAND);
955  return true;
956 }
957 
958 static void LevelTownLand(TileIndex tile)
959 {
960  assert(tile < MapSize());
961 
962  /* Don't terraform if land is plain or if there's a house there. */
963  if (IsTileType(tile, MP_HOUSE)) return;
964  Slope tileh = GetTileSlope(tile);
965  if (tileh == SLOPE_FLAT) return;
966 
967  /* First try up, then down */
968  if (!TerraformTownTile(tile, ~tileh & SLOPE_ELEVATED, 1)) {
969  TerraformTownTile(tile, tileh & SLOPE_ELEVATED, 0);
970  }
971 }
972 
983 {
984  /* align the grid to the downtown */
985  TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile); // Vector from downtown to the tile
986  RoadBits rcmd = ROAD_NONE;
987 
988  switch (t->layout) {
989  default: NOT_REACHED();
990 
991  case TL_2X2_GRID:
992  if ((grid_pos.x % 3) == 0) rcmd |= ROAD_Y;
993  if ((grid_pos.y % 3) == 0) rcmd |= ROAD_X;
994  break;
995 
996  case TL_3X3_GRID:
997  if ((grid_pos.x % 4) == 0) rcmd |= ROAD_Y;
998  if ((grid_pos.y % 4) == 0) rcmd |= ROAD_X;
999  break;
1000  }
1001 
1002  /* Optimise only X-junctions */
1003  if (rcmd != ROAD_ALL) return rcmd;
1004 
1005  RoadBits rb_template;
1006 
1007  switch (GetTileSlope(tile)) {
1008  default: rb_template = ROAD_ALL; break;
1009  case SLOPE_W: rb_template = ROAD_NW | ROAD_SW; break;
1010  case SLOPE_SW: rb_template = ROAD_Y | ROAD_SW; break;
1011  case SLOPE_S: rb_template = ROAD_SW | ROAD_SE; break;
1012  case SLOPE_SE: rb_template = ROAD_X | ROAD_SE; break;
1013  case SLOPE_E: rb_template = ROAD_SE | ROAD_NE; break;
1014  case SLOPE_NE: rb_template = ROAD_Y | ROAD_NE; break;
1015  case SLOPE_N: rb_template = ROAD_NE | ROAD_NW; break;
1016  case SLOPE_NW: rb_template = ROAD_X | ROAD_NW; break;
1017  case SLOPE_STEEP_W:
1018  case SLOPE_STEEP_S:
1019  case SLOPE_STEEP_E:
1020  case SLOPE_STEEP_N:
1021  rb_template = ROAD_NONE;
1022  break;
1023  }
1024 
1025  /* Stop if the template is compatible to the growth dir */
1026  if (DiagDirToRoadBits(ReverseDiagDir(dir)) & rb_template) return rb_template;
1027  /* If not generate a straight road in the direction of the growth */
1029 }
1030 
1042 {
1043  /* We can't look further than that. */
1044  if (DistanceFromEdge(tile) == 0) return false;
1045 
1046  uint counter = 0; // counts the house neighbor tiles
1047 
1048  /* Check the tiles E,N,W and S of the current tile for houses */
1049  for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
1050  /* Count both void and house tiles for checking whether there
1051  * are enough houses in the area. This to make it likely that
1052  * houses get build up to the edge of the map. */
1053  switch (GetTileType(TileAddByDiagDir(tile, dir))) {
1054  case MP_HOUSE:
1055  case MP_VOID:
1056  counter++;
1057  break;
1058 
1059  default:
1060  break;
1061  }
1062 
1063  /* If there are enough neighbors stop here */
1064  if (counter >= 3) {
1065  if (BuildTownHouse(t, tile)) {
1066  _grow_town_result = GROWTH_SUCCEED;
1067  return true;
1068  }
1069  return false;
1070  }
1071  }
1072  return false;
1073 }
1074 
1083 static bool GrowTownWithRoad(const Town *t, TileIndex tile, RoadBits rcmd)
1084 {
1085  RoadType rt = GetTownRoadType(t);
1086  if (DoCommand(tile, rcmd | (rt << 4), t->index, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD).Succeeded()) {
1087  _grow_town_result = GROWTH_SUCCEED;
1088  return true;
1089  }
1090  return false;
1091 }
1092 
1103 static bool GrowTownWithBridge(const Town *t, const TileIndex tile, const DiagDirection bridge_dir)
1104 {
1105  assert(bridge_dir < DIAGDIR_END);
1106 
1107  const Slope slope = GetTileSlope(tile);
1108 
1109  /* Make sure the direction is compatible with the slope.
1110  * Well we check if the slope has an up bit set in the
1111  * reverse direction. */
1112  if (slope != SLOPE_FLAT && slope & InclinedSlope(bridge_dir)) return false;
1113 
1114  /* Assure that the bridge is connectable to the start side */
1115  if (!(GetTownRoadBits(TileAddByDiagDir(tile, ReverseDiagDir(bridge_dir))) & DiagDirToRoadBits(bridge_dir))) return false;
1116 
1117  /* We are in the right direction */
1118  uint8 bridge_length = 0; // This value stores the length of the possible bridge
1119  TileIndex bridge_tile = tile; // Used to store the other waterside
1120 
1121  const int delta = TileOffsByDiagDir(bridge_dir);
1122 
1123  if (slope == SLOPE_FLAT) {
1124  /* Bridges starting on flat tiles are only allowed when crossing rivers, rails or one-way roads. */
1125  do {
1126  if (bridge_length++ >= 4) {
1127  /* Allow to cross rivers, not big lakes, nor large amounts of rails or one-way roads. */
1128  return false;
1129  }
1130  bridge_tile += delta;
1131  } while (IsValidTile(bridge_tile) && ((IsWaterTile(bridge_tile) && !IsSea(bridge_tile)) || IsPlainRailTile(bridge_tile) || (IsNormalRoadTile(bridge_tile) && GetDisallowedRoadDirections(bridge_tile) != DRD_NONE)));
1132  } else {
1133  do {
1134  if (bridge_length++ >= 11) {
1135  /* Max 11 tile long bridges */
1136  return false;
1137  }
1138  bridge_tile += delta;
1139  } while (IsValidTile(bridge_tile) && (IsWaterTile(bridge_tile) || IsPlainRailTile(bridge_tile) || (IsNormalRoadTile(bridge_tile) && GetDisallowedRoadDirections(bridge_tile) != DRD_NONE)));
1140  }
1141 
1142  /* no water tiles in between? */
1143  if (bridge_length == 1) return false;
1144 
1145  for (uint8 times = 0; times <= 22; times++) {
1146  byte bridge_type = RandomRange(MAX_BRIDGES - 1);
1147 
1148  /* Can we actually build the bridge? */
1149  RoadType rt = GetTownRoadType(t);
1150  if (DoCommand(tile, bridge_tile, bridge_type | rt << 8 | TRANSPORT_ROAD << 15, CommandFlagsToDCFlags(GetCommandFlags(CMD_BUILD_BRIDGE)), CMD_BUILD_BRIDGE).Succeeded()) {
1151  DoCommand(tile, bridge_tile, bridge_type | rt << 8 | TRANSPORT_ROAD << 15, DC_EXEC | CommandFlagsToDCFlags(GetCommandFlags(CMD_BUILD_BRIDGE)), CMD_BUILD_BRIDGE);
1152  _grow_town_result = GROWTH_SUCCEED;
1153  return true;
1154  }
1155  }
1156  /* Quit if it selecting an appropriate bridge type fails a large number of times. */
1157  return false;
1158 }
1159 
1160 
1167 static inline bool RoadTypesAllowHouseHere(TileIndex t)
1168 {
1169  static const TileIndexDiffC tiles[] = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };
1170  bool allow = false;
1171 
1172  for (const TileIndexDiffC *ptr = tiles; ptr != endof(tiles); ++ptr) {
1173  TileIndex cur_tile = t + ToTileIndexDiff(*ptr);
1174  if (!IsValidTile(cur_tile)) continue;
1175 
1176  if (!(IsTileType(cur_tile, MP_ROAD) || IsTileType(cur_tile, MP_STATION))) continue;
1177  allow = true;
1178 
1179  RoadType road_rt = GetRoadTypeRoad(cur_tile);
1180  RoadType tram_rt = GetRoadTypeTram(cur_tile);
1181  if (road_rt != INVALID_ROADTYPE && !HasBit(GetRoadTypeInfo(road_rt)->flags, ROTF_NO_HOUSES)) return true;
1182  if (tram_rt != INVALID_ROADTYPE && !HasBit(GetRoadTypeInfo(tram_rt)->flags, ROTF_NO_HOUSES)) return true;
1183  }
1184 
1185  /* If no road was found surrounding the tile we can allow building the house since there is
1186  * nothing which forbids it, if a road was found but the execution reached this point, then
1187  * all the found roads don't allow houses to be built */
1188  return !allow;
1189 }
1190 
1208 static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection target_dir, Town *t1)
1209 {
1210  RoadBits rcmd = ROAD_NONE; // RoadBits for the road construction command
1211  TileIndex tile = *tile_ptr; // The main tile on which we base our growth
1212 
1213  assert(tile < MapSize());
1214 
1215  if (cur_rb == ROAD_NONE) {
1216  /* Tile has no road. First reset the status counter
1217  * to say that this is the last iteration. */
1218  _grow_town_result = GROWTH_SEARCH_STOPPED;
1219 
1222 
1223  /* Remove hills etc */
1224  if (!_settings_game.construction.build_on_slopes || Chance16(1, 6)) LevelTownLand(tile);
1225 
1226  /* Is a road allowed here? */
1227  switch (t1->layout) {
1228  default: NOT_REACHED();
1229 
1230  case TL_3X3_GRID:
1231  case TL_2X2_GRID:
1232  rcmd = GetTownRoadGridElement(t1, tile, target_dir);
1233  if (rcmd == ROAD_NONE) return;
1234  break;
1235 
1236  case TL_BETTER_ROADS:
1237  case TL_ORIGINAL:
1238  if (!IsRoadAllowedHere(t1, tile, target_dir)) return;
1239 
1240  DiagDirection source_dir = ReverseDiagDir(target_dir);
1241 
1242  if (Chance16(1, 4)) {
1243  /* Randomize a new target dir */
1244  do target_dir = RandomDiagDir(); while (target_dir == source_dir);
1245  }
1246 
1247  if (!IsRoadAllowedHere(t1, TileAddByDiagDir(tile, target_dir), target_dir)) {
1248  /* A road is not allowed to continue the randomized road,
1249  * return if the road we're trying to build is curved. */
1250  if (target_dir != ReverseDiagDir(source_dir)) return;
1251 
1252  /* Return if neither side of the new road is a house */
1255  return;
1256  }
1257 
1258  /* That means that the road is only allowed if there is a house
1259  * at any side of the new road. */
1260  }
1261 
1262  rcmd = DiagDirToRoadBits(target_dir) | DiagDirToRoadBits(source_dir);
1263  break;
1264  }
1265 
1266  } else if (target_dir < DIAGDIR_END && !(cur_rb & DiagDirToRoadBits(ReverseDiagDir(target_dir)))) {
1267  /* Continue building on a partial road.
1268  * Should be always OK, so we only generate
1269  * the fitting RoadBits */
1270  _grow_town_result = GROWTH_SEARCH_STOPPED;
1271 
1273 
1274  switch (t1->layout) {
1275  default: NOT_REACHED();
1276 
1277  case TL_3X3_GRID:
1278  case TL_2X2_GRID:
1279  rcmd = GetTownRoadGridElement(t1, tile, target_dir);
1280  break;
1281 
1282  case TL_BETTER_ROADS:
1283  case TL_ORIGINAL:
1284  rcmd = DiagDirToRoadBits(ReverseDiagDir(target_dir));
1285  break;
1286  }
1287  } else {
1288  bool allow_house = true; // Value which decides if we want to construct a house
1289 
1290  /* Reached a tunnel/bridge? Then continue at the other side of it, unless
1291  * it is the starting tile. Half the time, we stay on this side then.*/
1292  if (IsTileType(tile, MP_TUNNELBRIDGE)) {
1293  if (GetTunnelBridgeTransportType(tile) == TRANSPORT_ROAD && (target_dir != DIAGDIR_END || Chance16(1, 2))) {
1294  *tile_ptr = GetOtherTunnelBridgeEnd(tile);
1295  }
1296  return;
1297  }
1298 
1299  /* Possibly extend the road in a direction.
1300  * Randomize a direction and if it has a road, bail out. */
1301  target_dir = RandomDiagDir();
1302  RoadBits target_rb = DiagDirToRoadBits(target_dir);
1303  TileIndex house_tile; // position of a possible house
1304 
1305  if (cur_rb & target_rb) {
1306  /* If it's a road turn possibly build a house in a corner.
1307  * Use intersection with straight road as an indicator
1308  * that we randomed corner house position.
1309  * A turn (and we check for that later) always has only
1310  * one common bit with a straight road so it has the same
1311  * chance to be chosen as the house on the side of a road.
1312  */
1313  if ((cur_rb & ROAD_X) != target_rb) return;
1314 
1315  /* Check whether it is a turn and if so determine
1316  * position of the corner tile */
1317  switch (cur_rb) {
1318  case ROAD_N:
1319  house_tile = TileAddByDir(tile, DIR_S);
1320  break;
1321  case ROAD_S:
1322  house_tile = TileAddByDir(tile, DIR_N);
1323  break;
1324  case ROAD_E:
1325  house_tile = TileAddByDir(tile, DIR_W);
1326  break;
1327  case ROAD_W:
1328  house_tile = TileAddByDir(tile, DIR_E);
1329  break;
1330  default:
1331  return; // not a turn
1332  }
1333  target_dir = DIAGDIR_END;
1334  } else {
1335  house_tile = TileAddByDiagDir(tile, target_dir);
1336  }
1337 
1338  /* Don't walk into water. */
1339  if (HasTileWaterGround(house_tile)) return;
1340 
1341  if (!IsValidTile(house_tile)) return;
1342 
1344  switch (t1->layout) {
1345  default: NOT_REACHED();
1346 
1347  case TL_3X3_GRID: // Use 2x2 grid afterwards!
1348  GrowTownWithExtraHouse(t1, TileAddByDiagDir(house_tile, target_dir));
1349  FALLTHROUGH;
1350 
1351  case TL_2X2_GRID:
1352  rcmd = GetTownRoadGridElement(t1, tile, target_dir);
1353  allow_house = (rcmd & target_rb) == ROAD_NONE;
1354  break;
1355 
1356  case TL_BETTER_ROADS: // Use original afterwards!
1357  GrowTownWithExtraHouse(t1, TileAddByDiagDir(house_tile, target_dir));
1358  FALLTHROUGH;
1359 
1360  case TL_ORIGINAL:
1361  /* Allow a house at the edge. 60% chance or
1362  * always ok if no road allowed. */
1363  rcmd = target_rb;
1364  allow_house = (!IsRoadAllowedHere(t1, house_tile, target_dir) || Chance16(6, 10));
1365  break;
1366  }
1367  }
1368 
1369  allow_house &= RoadTypesAllowHouseHere(house_tile);
1370 
1371  if (allow_house) {
1372  /* Build a house, but not if there already is a house there. */
1373  if (!IsTileType(house_tile, MP_HOUSE)) {
1374  /* Level the land if possible */
1375  if (Chance16(1, 6)) LevelTownLand(house_tile);
1376 
1377  /* And build a house.
1378  * Set result to -1 if we managed to build it. */
1379  if (BuildTownHouse(t1, house_tile)) {
1380  _grow_town_result = GROWTH_SUCCEED;
1381  }
1382  }
1383  return;
1384  }
1385 
1386  _grow_town_result = GROWTH_SEARCH_STOPPED;
1387  }
1388 
1389  /* Return if a water tile */
1390  if (HasTileWaterGround(tile)) return;
1391 
1392  /* Make the roads look nicer */
1393  rcmd = CleanUpRoadBits(tile, rcmd);
1394  if (rcmd == ROAD_NONE) return;
1395 
1396  /* Only use the target direction for bridges to ensure they're connected.
1397  * The target_dir is as computed previously according to town layout, so
1398  * it will match it perfectly. */
1399  if (GrowTownWithBridge(t1, tile, target_dir)) return;
1400 
1401  GrowTownWithRoad(t1, tile, rcmd);
1402 }
1403 
1411 static bool CanFollowRoad(TileIndex tile, DiagDirection dir)
1412 {
1413  TileIndex target_tile = tile + TileOffsByDiagDir(dir);
1414  if (!IsValidTile(target_tile)) return false;
1415  if (HasTileWaterGround(target_tile)) return false;
1416 
1417  RoadBits target_rb = GetTownRoadBits(target_tile);
1419  /* Check whether a road connection exists or can be build. */
1420  switch (GetTileType(target_tile)) {
1421  case MP_ROAD:
1422  return target_rb != ROAD_NONE;
1423 
1424  case MP_STATION:
1425  return IsDriveThroughStopTile(target_tile);
1426 
1427  case MP_TUNNELBRIDGE:
1428  return GetTunnelBridgeTransportType(target_tile) == TRANSPORT_ROAD;
1429 
1430  case MP_HOUSE:
1431  case MP_INDUSTRY:
1432  case MP_OBJECT:
1433  return false;
1434 
1435  default:
1436  /* Checked for void and water earlier */
1437  return true;
1438  }
1439  } else {
1440  /* Check whether a road connection already exists,
1441  * and it leads somewhere else. */
1442  RoadBits back_rb = DiagDirToRoadBits(ReverseDiagDir(dir));
1443  return (target_rb & back_rb) != 0 && (target_rb & ~back_rb) != 0;
1444  }
1445 }
1446 
1453 static bool GrowTownAtRoad(Town *t, TileIndex tile)
1454 {
1455  /* Special case.
1456  * @see GrowTownInTile Check the else if
1457  */
1458  DiagDirection target_dir = DIAGDIR_END; // The direction in which we want to extend the town
1459 
1460  assert(tile < MapSize());
1461 
1462  /* Number of times to search.
1463  * Better roads, 2X2 and 3X3 grid grow quite fast so we give
1464  * them a little handicap. */
1465  switch (t->layout) {
1466  case TL_BETTER_ROADS:
1467  _grow_town_result = 10 + t->cache.num_houses * 2 / 9;
1468  break;
1469 
1470  case TL_3X3_GRID:
1471  case TL_2X2_GRID:
1472  _grow_town_result = 10 + t->cache.num_houses * 1 / 9;
1473  break;
1474 
1475  default:
1476  _grow_town_result = 10 + t->cache.num_houses * 4 / 9;
1477  break;
1478  }
1479 
1480  do {
1481  RoadBits cur_rb = GetTownRoadBits(tile); // The RoadBits of the current tile
1482 
1483  /* Try to grow the town from this point */
1484  GrowTownInTile(&tile, cur_rb, target_dir, t);
1485  if (_grow_town_result == GROWTH_SUCCEED) return true;
1486 
1487  /* Exclude the source position from the bitmask
1488  * and return if no more road blocks available */
1489  if (IsValidDiagDirection(target_dir)) cur_rb &= ~DiagDirToRoadBits(ReverseDiagDir(target_dir));
1490  if (cur_rb == ROAD_NONE) return false;
1491 
1492  if (IsTileType(tile, MP_TUNNELBRIDGE)) {
1493  /* Only build in the direction away from the tunnel or bridge. */
1494  target_dir = ReverseDiagDir(GetTunnelBridgeDirection(tile));
1495  } else {
1496  /* Select a random bit from the blockmask, walk a step
1497  * and continue the search from there. */
1498  do {
1499  if (cur_rb == ROAD_NONE) return false;
1500  RoadBits target_bits;
1501  do {
1502  target_dir = RandomDiagDir();
1503  target_bits = DiagDirToRoadBits(target_dir);
1504  } while (!(cur_rb & target_bits));
1505  cur_rb &= ~target_bits;
1506  } while (!CanFollowRoad(tile, target_dir));
1507  }
1508  tile = TileAddByDiagDir(tile, target_dir);
1509 
1510  if (IsTileType(tile, MP_ROAD) && !IsRoadDepot(tile) && HasTileRoadType(tile, RTT_ROAD)) {
1511  /* Don't allow building over roads of other cities */
1512  if (IsRoadOwner(tile, RTT_ROAD, OWNER_TOWN) && Town::GetByTile(tile) != t) {
1513  return false;
1514  } else if (IsRoadOwner(tile, RTT_ROAD, OWNER_NONE) && _game_mode == GM_EDITOR) {
1515  /* If we are in the SE, and this road-piece has no town owner yet, it just found an
1516  * owner :) (happy happy happy road now) */
1517  SetRoadOwner(tile, RTT_ROAD, OWNER_TOWN);
1518  SetTownIndex(tile, t->index);
1519  }
1520  }
1521 
1522  /* Max number of times is checked. */
1523  } while (--_grow_town_result >= 0);
1524 
1525  return false;
1526 }
1527 
1536 {
1537  uint32 r = Random();
1538  uint a = GB(r, 0, 2);
1539  uint b = GB(r, 8, 2);
1540  if (a == b) b ^= 2;
1541  return (RoadBits)((ROAD_NW << a) + (ROAD_NW << b));
1542 }
1543 
1549 static bool GrowTown(Town *t)
1550 {
1551  static const TileIndexDiffC _town_coord_mod[] = {
1552  {-1, 0},
1553  { 1, 1},
1554  { 1, -1},
1555  {-1, -1},
1556  {-1, 0},
1557  { 0, 2},
1558  { 2, 0},
1559  { 0, -2},
1560  {-1, -1},
1561  {-2, 2},
1562  { 2, 2},
1563  { 2, -2},
1564  { 0, 0}
1565  };
1566 
1567  /* Current "company" is a town */
1568  Backup<CompanyID> cur_company(_current_company, OWNER_TOWN, FILE_LINE);
1569 
1570  TileIndex tile = t->xy; // The tile we are working with ATM
1571 
1572  /* Find a road that we can base the construction on. */
1573  const TileIndexDiffC *ptr;
1574  for (ptr = _town_coord_mod; ptr != endof(_town_coord_mod); ++ptr) {
1575  if (GetTownRoadBits(tile) != ROAD_NONE) {
1576  bool success = GrowTownAtRoad(t, tile);
1577  cur_company.Restore();
1578  return success;
1579  }
1580  tile = TILE_ADD(tile, ToTileIndexDiff(*ptr));
1581  }
1582 
1583  /* No road available, try to build a random road block by
1584  * clearing some land and then building a road there. */
1586  tile = t->xy;
1587  for (ptr = _town_coord_mod; ptr != endof(_town_coord_mod); ++ptr) {
1588  /* Only work with plain land that not already has a house */
1589  if (!IsTileType(tile, MP_HOUSE) && IsTileFlat(tile)) {
1590  if (DoCommand(tile, 0, 0, DC_AUTO | DC_NO_WATER, CMD_LANDSCAPE_CLEAR).Succeeded()) {
1591  RoadType rt = GetTownRoadType(t);
1592  DoCommand(tile, GenRandomRoadBits() | (rt << 4), t->index, DC_EXEC | DC_AUTO, CMD_BUILD_ROAD);
1593  cur_company.Restore();
1594  return true;
1595  }
1596  }
1597  tile = TILE_ADD(tile, ToTileIndexDiff(*ptr));
1598  }
1599  }
1600 
1601  cur_company.Restore();
1602  return false;
1603 }
1604 
1605 void UpdateTownRadius(Town *t)
1606 {
1607  static const uint32 _town_squared_town_zone_radius_data[23][5] = {
1608  { 4, 0, 0, 0, 0}, // 0
1609  { 16, 0, 0, 0, 0},
1610  { 25, 0, 0, 0, 0},
1611  { 36, 0, 0, 0, 0},
1612  { 49, 0, 4, 0, 0},
1613  { 64, 0, 4, 0, 0}, // 20
1614  { 64, 0, 9, 0, 1},
1615  { 64, 0, 9, 0, 4},
1616  { 64, 0, 16, 0, 4},
1617  { 81, 0, 16, 0, 4},
1618  { 81, 0, 16, 0, 4}, // 40
1619  { 81, 0, 25, 0, 9},
1620  { 81, 36, 25, 0, 9},
1621  { 81, 36, 25, 16, 9},
1622  { 81, 49, 0, 25, 9},
1623  { 81, 64, 0, 25, 9}, // 60
1624  { 81, 64, 0, 36, 9},
1625  { 81, 64, 0, 36, 16},
1626  {100, 81, 0, 49, 16},
1627  {100, 81, 0, 49, 25},
1628  {121, 81, 0, 49, 25}, // 80
1629  {121, 81, 0, 49, 25},
1630  {121, 81, 0, 49, 36}, // 88
1631  };
1632 
1633  if (t->cache.num_houses < 92) {
1634  memcpy(t->cache.squared_town_zone_radius, _town_squared_town_zone_radius_data[t->cache.num_houses / 4], sizeof(t->cache.squared_town_zone_radius));
1635  } else {
1636  int mass = t->cache.num_houses / 8;
1637  /* Actually we are proportional to sqrt() but that's right because we are covering an area.
1638  * The offsets are to make sure the radii do not decrease in size when going from the table
1639  * to the calculated value.*/
1640  t->cache.squared_town_zone_radius[0] = mass * 15 - 40;
1641  t->cache.squared_town_zone_radius[1] = mass * 9 - 15;
1642  t->cache.squared_town_zone_radius[2] = 0;
1643  t->cache.squared_town_zone_radius[3] = mass * 5 - 5;
1644  t->cache.squared_town_zone_radius[4] = mass * 3 + 5;
1645  }
1646 }
1647 
1648 void UpdateTownMaxPass(Town *t)
1649 {
1650  t->supplied[CT_PASSENGERS].old_max = t->cache.population >> 3;
1651  t->supplied[CT_MAIL].old_max = t->cache.population >> 4;
1652 }
1653 
1654 static void UpdateTownGrowthRate(Town *t);
1655 static void UpdateTownGrowth(Town *t);
1656 
1668 static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize size, bool city, TownLayout layout, bool manual)
1669 {
1670  t->xy = tile;
1671  t->cache.num_houses = 0;
1672  t->time_until_rebuild = 10;
1673  UpdateTownRadius(t);
1674  t->flags = 0;
1675  t->cache.population = 0;
1676  /* Spread growth across ticks so even if there are many
1677  * similar towns they're unlikely to grow all in one tick */
1679  t->growth_rate = TownTicksToGameTicks(250);
1680  t->show_zone = false;
1681 
1682  _town_kdtree.Insert(t->index);
1683 
1684  /* Set the default cargo requirement for town growth */
1686  case LT_ARCTIC:
1688  break;
1689 
1690  case LT_TROPIC:
1693  break;
1694  }
1695 
1696  t->fund_buildings_months = 0;
1697 
1698  for (uint i = 0; i != MAX_COMPANIES; i++) t->ratings[i] = RATING_INITIAL;
1699 
1700  t->have_ratings = 0;
1702  t->exclusive_counter = 0;
1703  t->statues = 0;
1704 
1705  extern int _nb_orig_names;
1707  /* Original town name */
1708  t->townnamegrfid = 0;
1709  t->townnametype = SPECSTR_TOWNNAME_START + _settings_game.game_creation.town_name;
1710  } else {
1711  /* Newgrf town name */
1712  t->townnamegrfid = GetGRFTownNameId(_settings_game.game_creation.town_name - _nb_orig_names);
1713  t->townnametype = GetGRFTownNameType(_settings_game.game_creation.town_name - _nb_orig_names);
1714  }
1715  t->townnameparts = townnameparts;
1716 
1717  t->UpdateVirtCoord();
1718  InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_FORCE_REBUILD);
1719 
1720  t->InitializeLayout(layout);
1721 
1722  t->larger_town = city;
1723 
1724  int x = (int)size * 16 + 3;
1725  if (size == TSZ_RANDOM) x = (Random() & 0xF) + 8;
1726  /* Don't create huge cities when founding town in-game */
1727  if (city && (!manual || _game_mode == GM_EDITOR)) x *= _settings_game.economy.initial_city_size;
1728 
1729  t->cache.num_houses += x;
1730  UpdateTownRadius(t);
1731 
1732  int i = x * 4;
1733  do {
1734  GrowTown(t);
1735  } while (--i);
1736 
1737  t->cache.num_houses -= x;
1738  UpdateTownRadius(t);
1740  UpdateTownMaxPass(t);
1742 }
1743 
1750 {
1751  /* Check if too close to the edge of map */
1752  if (DistanceFromEdge(tile) < 12) {
1753  return_cmd_error(STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB);
1754  }
1755 
1756  /* Check distance to all other towns. */
1757  if (IsCloseToTown(tile, 20)) {
1758  return_cmd_error(STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN);
1759  }
1760 
1761  /* Can only build on clear flat areas, possibly with trees. */
1762  if ((!IsTileType(tile, MP_CLEAR) && !IsTileType(tile, MP_TREES)) || !IsTileFlat(tile)) {
1763  return_cmd_error(STR_ERROR_SITE_UNSUITABLE);
1764  }
1765 
1766  return CommandCost(EXPENSES_OTHER);
1767 }
1768 
1774 static bool IsUniqueTownName(const char *name)
1775 {
1776  for (const Town *t : Town::Iterate()) {
1777  if (t->name != nullptr && strcmp(t->name, name) == 0) return false;
1778  }
1779 
1780  return true;
1781 }
1782 
1795 CommandCost CmdFoundTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
1796 {
1797  TownSize size = Extract<TownSize, 0, 2>(p1);
1798  bool city = HasBit(p1, 2);
1799  TownLayout layout = Extract<TownLayout, 3, 3>(p1);
1801  bool random = HasBit(p1, 6);
1802  uint32 townnameparts = p2;
1803 
1804  if (size >= TSZ_END) return CMD_ERROR;
1805  if (layout >= NUM_TLS) return CMD_ERROR;
1806 
1807  /* Some things are allowed only in the scenario editor and for game scripts. */
1808  if (_game_mode != GM_EDITOR && _current_company != OWNER_DEITY) {
1810  if (size == TSZ_LARGE) return CMD_ERROR;
1811  if (random) return CMD_ERROR;
1813  return CMD_ERROR;
1814  }
1815  } else if (_current_company == OWNER_DEITY && random) {
1816  /* Random parameter is not allowed for Game Scripts. */
1817  return CMD_ERROR;
1818  }
1819 
1820  if (StrEmpty(text)) {
1821  /* If supplied name is empty, townnameparts has to generate unique automatic name */
1822  if (!VerifyTownName(townnameparts, &par)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE);
1823  } else {
1824  /* If name is not empty, it has to be unique custom name */
1826  if (!IsUniqueTownName(text)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE);
1827  }
1828 
1829  /* Allocate town struct */
1830  if (!Town::CanAllocateItem()) return_cmd_error(STR_ERROR_TOO_MANY_TOWNS);
1831 
1832  if (!random) {
1833  CommandCost ret = TownCanBePlacedHere(tile);
1834  if (ret.Failed()) return ret;
1835  }
1836 
1837  static const byte price_mult[][TSZ_RANDOM + 1] = {{ 15, 25, 40, 25 }, { 20, 35, 55, 35 }};
1838  /* multidimensional arrays have to have defined length of non-first dimension */
1839  assert_compile(lengthof(price_mult[0]) == 4);
1840 
1841  CommandCost cost(EXPENSES_OTHER, _price[PR_BUILD_TOWN]);
1842  byte mult = price_mult[city][size];
1843 
1844  cost.MultiplyCost(mult);
1845 
1846  /* Create the town */
1847  if (flags & DC_EXEC) {
1848  if (cost.GetCost() > GetAvailableMoneyForCommand()) {
1849  _additional_cash_required = cost.GetCost();
1850  return CommandCost(EXPENSES_OTHER);
1851  }
1852 
1853  Backup<bool> old_generating_world(_generating_world, true, FILE_LINE);
1855  Town *t;
1856  if (random) {
1857  t = CreateRandomTown(20, townnameparts, size, city, layout);
1858  if (t == nullptr) {
1859  cost = CommandCost(STR_ERROR_NO_SPACE_FOR_TOWN);
1860  } else {
1861  _new_town_id = t->index;
1862  }
1863  } else {
1864  t = new Town(tile);
1865  DoCreateTown(t, tile, townnameparts, size, city, layout, true);
1866  }
1868  old_generating_world.Restore();
1869 
1870  if (t != nullptr && !StrEmpty(text)) {
1871  t->name = stredup(text);
1872  t->UpdateVirtCoord();
1873  }
1874 
1875  if (_game_mode != GM_EDITOR) {
1876  /* 't' can't be nullptr since 'random' is false outside scenedit */
1877  assert(!random);
1878 
1879  if (_current_company == OWNER_DEITY) {
1880  SetDParam(0, t->index);
1881  AddTileNewsItem(STR_NEWS_NEW_TOWN_UNSPONSORED, NT_INDUSTRY_OPEN, tile);
1882  } else {
1883  char company_name[MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH];
1885  GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
1886 
1887  char *cn = stredup(company_name);
1888  SetDParamStr(0, cn);
1889  SetDParam(1, t->index);
1890 
1891  AddTileNewsItem(STR_NEWS_NEW_TOWN, NT_INDUSTRY_OPEN, tile, cn);
1892  }
1893  AI::BroadcastNewEvent(new ScriptEventTownFounded(t->index));
1894  Game::NewEvent(new ScriptEventTownFounded(t->index));
1895  }
1896  }
1897  return cost;
1898 }
1899 
1910 {
1911  switch (layout) {
1912  case TL_2X2_GRID: return TileXY(TileX(tile) - TileX(tile) % 3, TileY(tile) - TileY(tile) % 3);
1913  case TL_3X3_GRID: return TileXY(TileX(tile) & ~3, TileY(tile) & ~3);
1914  default: return tile;
1915  }
1916 }
1917 
1927 static bool IsTileAlignedToGrid(TileIndex tile, TownLayout layout)
1928 {
1929  switch (layout) {
1930  case TL_2X2_GRID: return TileX(tile) % 3 == 0 && TileY(tile) % 3 == 0;
1931  case TL_3X3_GRID: return TileX(tile) % 4 == 0 && TileY(tile) % 4 == 0;
1932  default: return true;
1933  }
1934 }
1935 
1939 struct SpotData {
1941  uint max_dist;
1943 };
1944 
1961 static bool FindFurthestFromWater(TileIndex tile, void *user_data)
1962 {
1963  SpotData *sp = (SpotData*)user_data;
1964  uint dist = GetClosestWaterDistance(tile, true);
1965 
1966  if (IsTileType(tile, MP_CLEAR) &&
1967  IsTileFlat(tile) &&
1968  IsTileAlignedToGrid(tile, sp->layout) &&
1969  dist > sp->max_dist) {
1970  sp->tile = tile;
1971  sp->max_dist = dist;
1972  }
1973 
1974  return false;
1975 }
1976 
1983 static bool FindNearestEmptyLand(TileIndex tile, void *user_data)
1984 {
1985  return IsTileType(tile, MP_CLEAR);
1986 }
1987 
2001 {
2002  SpotData sp = { INVALID_TILE, 0, layout };
2003 
2004  TileIndex coast = tile;
2005  if (CircularTileSearch(&coast, 40, FindNearestEmptyLand, nullptr)) {
2006  CircularTileSearch(&coast, 10, FindFurthestFromWater, &sp);
2007  return sp.tile;
2008  }
2009 
2010  /* if we get here just give up */
2011  return INVALID_TILE;
2012 }
2013 
2014 static Town *CreateRandomTown(uint attempts, uint32 townnameparts, TownSize size, bool city, TownLayout layout)
2015 {
2016  assert(_game_mode == GM_EDITOR || _generating_world); // These are the preconditions for CMD_DELETE_TOWN
2017 
2018  if (!Town::CanAllocateItem()) return nullptr;
2019 
2020  do {
2021  /* Generate a tile index not too close from the edge */
2022  TileIndex tile = AlignTileToGrid(RandomTile(), layout);
2023 
2024  /* if we tried to place the town on water, slide it over onto
2025  * the nearest likely-looking spot */
2026  if (IsTileType(tile, MP_WATER)) {
2027  tile = FindNearestGoodCoastalTownSpot(tile, layout);
2028  if (tile == INVALID_TILE) continue;
2029  }
2030 
2031  /* Make sure town can be placed here */
2032  if (TownCanBePlacedHere(tile).Failed()) continue;
2033 
2034  /* Allocate a town struct */
2035  Town *t = new Town(tile);
2036 
2037  DoCreateTown(t, tile, townnameparts, size, city, layout, false);
2038 
2039  /* if the population is still 0 at the point, then the
2040  * placement is so bad it couldn't grow at all */
2041  if (t->cache.population > 0) return t;
2042 
2043  Backup<CompanyID> cur_company(_current_company, OWNER_TOWN, FILE_LINE);
2045  cur_company.Restore();
2046  assert(rc.Succeeded());
2047 
2048  /* We already know that we can allocate a single town when
2049  * entering this function. However, we create and delete
2050  * a town which "resets" the allocation checks. As such we
2051  * need to check again when assertions are enabled. */
2052  assert(Town::CanAllocateItem());
2053  } while (--attempts != 0);
2054 
2055  return nullptr;
2056 }
2057 
2058 static const byte _num_initial_towns[4] = {5, 11, 23, 46}; // very low, low, normal, high
2059 
2068 {
2069  uint current_number = 0;
2070  uint difficulty = (_game_mode != GM_EDITOR) ? _settings_game.difficulty.number_towns : 0;
2071  uint total = (difficulty == (uint)CUSTOM_TOWN_NUMBER_DIFFICULTY) ? _settings_game.game_creation.custom_town_number : ScaleByMapSize(_num_initial_towns[difficulty] + (Random() & 7));
2072  total = min(TownPool::MAX_SIZE, total);
2073  uint32 townnameparts;
2074  TownNames town_names;
2075 
2077 
2078  /* First attempt will be made at creating the suggested number of towns.
2079  * Note that this is really a suggested value, not a required one.
2080  * We would not like the system to lock up just because the user wanted 100 cities on a 64*64 map, would we? */
2081  do {
2084  /* Get a unique name for the town. */
2085  if (!GenerateTownName(&townnameparts, &town_names)) continue;
2086  /* try 20 times to create a random-sized town for the first loop. */
2087  if (CreateRandomTown(20, townnameparts, TSZ_RANDOM, city, layout) != nullptr) current_number++; // If creation was successful, raise a flag.
2088  } while (--total);
2089 
2090  town_names.clear();
2091 
2092  /* Build the town k-d tree again to make sure it's well balanced */
2093  RebuildTownKdtree();
2094 
2095  if (current_number != 0) return true;
2096 
2097  /* If current_number is still zero at this point, it means that not a single town has been created.
2098  * So give it a last try, but now more aggressive */
2099  if (GenerateTownName(&townnameparts) &&
2100  CreateRandomTown(10000, townnameparts, TSZ_RANDOM, _settings_game.economy.larger_towns != 0, layout) != nullptr) {
2101  return true;
2102  }
2103 
2104  /* If there are no towns at all and we are generating new game, bail out */
2105  if (Town::GetNumItems() == 0 && _game_mode != GM_EDITOR) {
2106  ShowErrorMessage(STR_ERROR_COULD_NOT_CREATE_TOWN, INVALID_STRING_ID, WL_CRITICAL);
2107  }
2108 
2109  return false; // we are still without a town? we failed, simply
2110 }
2111 
2112 
2119 HouseZonesBits GetTownRadiusGroup(const Town *t, TileIndex tile)
2120 {
2121  uint dist = DistanceSquare(tile, t->xy);
2122 
2123  if (t->fund_buildings_months && dist <= 25) return HZB_TOWN_CENTRE;
2124 
2125  HouseZonesBits smallest = HZB_TOWN_EDGE;
2126  for (HouseZonesBits i = HZB_BEGIN; i < HZB_END; i++) {
2127  if (dist < t->cache.squared_town_zone_radius[i]) smallest = i;
2128  }
2129 
2130  return smallest;
2131 }
2132 
2143 static inline void ClearMakeHouseTile(TileIndex tile, Town *t, byte counter, byte stage, HouseID type, byte random_bits)
2144 {
2146 
2147  assert(cc.Succeeded());
2148 
2149  IncreaseBuildingCount(t, type);
2150  MakeHouseTile(tile, t->index, counter, stage, type, random_bits);
2151  if (HouseSpec::Get(type)->building_flags & BUILDING_IS_ANIMATED) AddAnimatedTile(tile);
2152 
2153  MarkTileDirtyByTile(tile);
2154 }
2155 
2156 
2167 static void MakeTownHouse(TileIndex t, Town *town, byte counter, byte stage, HouseID type, byte random_bits)
2168 {
2169  BuildingFlags size = HouseSpec::Get(type)->building_flags;
2170 
2171  ClearMakeHouseTile(t, town, counter, stage, type, random_bits);
2172  if (size & BUILDING_2_TILES_Y) ClearMakeHouseTile(t + TileDiffXY(0, 1), town, counter, stage, ++type, random_bits);
2173  if (size & BUILDING_2_TILES_X) ClearMakeHouseTile(t + TileDiffXY(1, 0), town, counter, stage, ++type, random_bits);
2174  if (size & BUILDING_HAS_4_TILES) ClearMakeHouseTile(t + TileDiffXY(1, 1), town, counter, stage, ++type, random_bits);
2175 
2176  if (!_generating_world) {
2177  ForAllStationsAroundTiles(TileArea(t, (size & BUILDING_2_TILES_X) ? 2 : 1, (size & BUILDING_2_TILES_Y) ? 2 : 1), [town](Station *st, TileIndex tile) {
2178  town->stations_near.insert(st);
2179  return true;
2180  });
2181  }
2182 }
2183 
2184 
2192 static inline bool CanBuildHouseHere(TileIndex tile, bool noslope)
2193 {
2194  /* cannot build on these slopes... */
2195  Slope slope = GetTileSlope(tile);
2196  if ((noslope && slope != SLOPE_FLAT) || IsSteepSlope(slope)) return false;
2197 
2198  /* at least one RoadTypes allow building the house here? */
2199  if (!RoadTypesAllowHouseHere(tile)) return false;
2200 
2201  /* building under a bridge? */
2202  if (IsBridgeAbove(tile)) return false;
2203 
2204  /* can we clear the land? */
2205  return DoCommand(tile, 0, 0, DC_AUTO | DC_NO_WATER, CMD_LANDSCAPE_CLEAR).Succeeded();
2206 }
2207 
2208 
2217 static inline bool CheckBuildHouseSameZ(TileIndex tile, int z, bool noslope)
2218 {
2219  if (!CanBuildHouseHere(tile, noslope)) return false;
2220 
2221  /* if building on slopes is allowed, there will be flattening foundation (to tile max z) */
2222  if (GetTileMaxZ(tile) != z) return false;
2223 
2224  return true;
2225 }
2226 
2227 
2236 static bool CheckFree2x2Area(TileIndex tile, int z, bool noslope)
2237 {
2238  /* we need to check this tile too because we can be at different tile now */
2239  if (!CheckBuildHouseSameZ(tile, z, noslope)) return false;
2240 
2241  for (DiagDirection d = DIAGDIR_SE; d < DIAGDIR_END; d++) {
2242  tile += TileOffsByDiagDir(d);
2243  if (!CheckBuildHouseSameZ(tile, z, noslope)) return false;
2244  }
2245 
2246  return true;
2247 }
2248 
2249 
2257 static inline bool TownLayoutAllowsHouseHere(Town *t, TileIndex tile)
2258 {
2259  /* Allow towns everywhere when we don't build roads */
2261 
2262  TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile);
2263 
2264  switch (t->layout) {
2265  case TL_2X2_GRID:
2266  if ((grid_pos.x % 3) == 0 || (grid_pos.y % 3) == 0) return false;
2267  break;
2268 
2269  case TL_3X3_GRID:
2270  if ((grid_pos.x % 4) == 0 || (grid_pos.y % 4) == 0) return false;
2271  break;
2272 
2273  default:
2274  break;
2275  }
2276 
2277  return true;
2278 }
2279 
2280 
2288 static inline bool TownLayoutAllows2x2HouseHere(Town *t, TileIndex tile)
2289 {
2290  /* Allow towns everywhere when we don't build roads */
2292 
2293  /* Compute relative position of tile. (Positive offsets are towards north) */
2294  TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile);
2295 
2296  switch (t->layout) {
2297  case TL_2X2_GRID:
2298  grid_pos.x %= 3;
2299  grid_pos.y %= 3;
2300  if ((grid_pos.x != 2 && grid_pos.x != -1) ||
2301  (grid_pos.y != 2 && grid_pos.y != -1)) return false;
2302  break;
2303 
2304  case TL_3X3_GRID:
2305  if ((grid_pos.x & 3) < 2 || (grid_pos.y & 3) < 2) return false;
2306  break;
2307 
2308  default:
2309  break;
2310  }
2311 
2312  return true;
2313 }
2314 
2315 
2325 static bool CheckTownBuild2House(TileIndex *tile, Town *t, int maxz, bool noslope, DiagDirection second)
2326 {
2327  /* 'tile' is already checked in BuildTownHouse() - CanBuildHouseHere() and slope test */
2328 
2329  TileIndex tile2 = *tile + TileOffsByDiagDir(second);
2330  if (TownLayoutAllowsHouseHere(t, tile2) && CheckBuildHouseSameZ(tile2, maxz, noslope)) return true;
2331 
2332  tile2 = *tile + TileOffsByDiagDir(ReverseDiagDir(second));
2333  if (TownLayoutAllowsHouseHere(t, tile2) && CheckBuildHouseSameZ(tile2, maxz, noslope)) {
2334  *tile = tile2;
2335  return true;
2336  }
2337 
2338  return false;
2339 }
2340 
2341 
2350 static bool CheckTownBuild2x2House(TileIndex *tile, Town *t, int maxz, bool noslope)
2351 {
2352  TileIndex tile2 = *tile;
2353 
2354  for (DiagDirection d = DIAGDIR_SE;; d++) { // 'd' goes through DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_END
2355  if (TownLayoutAllows2x2HouseHere(t, tile2) && CheckFree2x2Area(tile2, maxz, noslope)) {
2356  *tile = tile2;
2357  return true;
2358  }
2359  if (d == DIAGDIR_END) break;
2360  tile2 += TileOffsByDiagDir(ReverseDiagDir(d)); // go clockwise
2361  }
2362 
2363  return false;
2364 }
2365 
2366 
2373 static bool BuildTownHouse(Town *t, TileIndex tile)
2374 {
2375  /* forbidden building here by town layout */
2376  if (!TownLayoutAllowsHouseHere(t, tile)) return false;
2377 
2378  /* no house allowed at all, bail out */
2379  if (!CanBuildHouseHere(tile, false)) return false;
2380 
2381  Slope slope = GetTileSlope(tile);
2382  int maxz = GetTileMaxZ(tile);
2383 
2384  /* Get the town zone type of the current tile, as well as the climate.
2385  * This will allow to easily compare with the specs of the new house to build */
2386  HouseZonesBits rad = GetTownRadiusGroup(t, tile);
2387 
2388  /* Above snow? */
2390  if (land == LT_ARCTIC && maxz > HighestSnowLine()) land = -1;
2391 
2392  uint bitmask = (1 << rad) + (1 << (land + 12));
2393 
2394  /* bits 0-4 are used
2395  * bits 11-15 are used
2396  * bits 5-10 are not used. */
2397  HouseID houses[NUM_HOUSES];
2398  uint num = 0;
2399  uint probs[NUM_HOUSES];
2400  uint probability_max = 0;
2401 
2402  /* Generate a list of all possible houses that can be built. */
2403  for (uint i = 0; i < NUM_HOUSES; i++) {
2404  const HouseSpec *hs = HouseSpec::Get(i);
2405 
2406  /* Verify that the candidate house spec matches the current tile status */
2407  if ((~hs->building_availability & bitmask) != 0 || !hs->enabled || hs->grf_prop.override != INVALID_HOUSE_ID) continue;
2408 
2409  /* Don't let these counters overflow. Global counters are 32bit, there will never be that many houses. */
2410  if (hs->class_id != HOUSE_NO_CLASS) {
2411  /* id_count is always <= class_count, so it doesn't need to be checked */
2412  if (t->cache.building_counts.class_count[hs->class_id] == UINT16_MAX) continue;
2413  } else {
2414  /* If the house has no class, check id_count instead */
2415  if (t->cache.building_counts.id_count[i] == UINT16_MAX) continue;
2416  }
2417 
2418  /* Without NewHouses, all houses have probability '1' */
2419  uint cur_prob = (_loaded_newgrf_features.has_newhouses ? hs->probability : 1);
2420  probability_max += cur_prob;
2421  probs[num] = cur_prob;
2422  houses[num++] = (HouseID)i;
2423  }
2424 
2425  TileIndex baseTile = tile;
2426 
2427  while (probability_max > 0) {
2428  /* Building a multitile building can change the location of tile.
2429  * The building would still be built partially on that tile, but
2430  * its northern tile would be elsewhere. However, if the callback
2431  * fails we would be basing further work from the changed tile.
2432  * So a next 1x1 tile building could be built on the wrong tile. */
2433  tile = baseTile;
2434 
2435  uint r = RandomRange(probability_max);
2436  uint i;
2437  for (i = 0; i < num; i++) {
2438  if (probs[i] > r) break;
2439  r -= probs[i];
2440  }
2441 
2442  HouseID house = houses[i];
2443  probability_max -= probs[i];
2444 
2445  /* remove tested house from the set */
2446  num--;
2447  houses[i] = houses[num];
2448  probs[i] = probs[num];
2449 
2450  const HouseSpec *hs = HouseSpec::Get(house);
2451 
2453  _game_mode != GM_EDITOR && (hs->extra_flags & BUILDING_IS_HISTORICAL) != 0) {
2454  continue;
2455  }
2456 
2457  if (_cur_year < hs->min_year || _cur_year > hs->max_year) continue;
2458 
2459  /* Special houses that there can be only one of. */
2460  uint oneof = 0;
2461 
2462  if (hs->building_flags & BUILDING_IS_CHURCH) {
2463  SetBit(oneof, TOWN_HAS_CHURCH);
2464  } else if (hs->building_flags & BUILDING_IS_STADIUM) {
2465  SetBit(oneof, TOWN_HAS_STADIUM);
2466  }
2467 
2468  if (t->flags & oneof) continue;
2469 
2470  /* Make sure there is no slope? */
2471  bool noslope = (hs->building_flags & TILE_NOT_SLOPED) != 0;
2472  if (noslope && slope != SLOPE_FLAT) continue;
2473 
2474  if (hs->building_flags & TILE_SIZE_2x2) {
2475  if (!CheckTownBuild2x2House(&tile, t, maxz, noslope)) continue;
2476  } else if (hs->building_flags & TILE_SIZE_2x1) {
2477  if (!CheckTownBuild2House(&tile, t, maxz, noslope, DIAGDIR_SW)) continue;
2478  } else if (hs->building_flags & TILE_SIZE_1x2) {
2479  if (!CheckTownBuild2House(&tile, t, maxz, noslope, DIAGDIR_SE)) continue;
2480  } else {
2481  /* 1x1 house checks are already done */
2482  }
2483 
2484  byte random_bits = Random();
2485 
2487  uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, 0, house, t, tile, true, random_bits);
2488  if (callback_res != CALLBACK_FAILED && !Convert8bitBooleanCallback(hs->grf_prop.grffile, CBID_HOUSE_ALLOW_CONSTRUCTION, callback_res)) continue;
2489  }
2490 
2491  /* build the house */
2492  t->cache.num_houses++;
2493 
2494  /* Special houses that there can be only one of. */
2495  t->flags |= oneof;
2496 
2497  byte construction_counter = 0;
2498  byte construction_stage = 0;
2499 
2500  if (_generating_world || _game_mode == GM_EDITOR) {
2501  uint32 r = Random();
2502 
2503  construction_stage = TOWN_HOUSE_COMPLETED;
2504  if (Chance16(1, 7)) construction_stage = GB(r, 0, 2);
2505 
2506  if (construction_stage == TOWN_HOUSE_COMPLETED) {
2507  ChangePopulation(t, hs->population);
2508  } else {
2509  construction_counter = GB(r, 2, 2);
2510  }
2511  }
2512 
2513  MakeTownHouse(tile, t, construction_counter, construction_stage, house, random_bits);
2514  UpdateTownRadius(t);
2516 
2517  return true;
2518  }
2519 
2520  return false;
2521 }
2522 
2529 static void DoClearTownHouseHelper(TileIndex tile, Town *t, HouseID house)
2530 {
2531  assert(IsTileType(tile, MP_HOUSE));
2532  DecreaseBuildingCount(t, house);
2533  DoClearSquare(tile);
2534  DeleteAnimatedTile(tile);
2535 
2536  DeleteNewGRFInspectWindow(GSF_HOUSES, tile);
2537 }
2538 
2547 {
2548  if (house >= 3) { // house id 0,1,2 MUST be single tile houses, or this code breaks.
2549  if (HouseSpec::Get(house - 1)->building_flags & TILE_SIZE_2x1) {
2550  house--;
2551  return TileDiffXY(-1, 0);
2552  } else if (HouseSpec::Get(house - 1)->building_flags & BUILDING_2_TILES_Y) {
2553  house--;
2554  return TileDiffXY(0, -1);
2555  } else if (HouseSpec::Get(house - 2)->building_flags & BUILDING_HAS_4_TILES) {
2556  house -= 2;
2557  return TileDiffXY(-1, 0);
2558  } else if (HouseSpec::Get(house - 3)->building_flags & BUILDING_HAS_4_TILES) {
2559  house -= 3;
2560  return TileDiffXY(-1, -1);
2561  }
2562  }
2563  return 0;
2564 }
2565 
2566 void ClearTownHouse(Town *t, TileIndex tile)
2567 {
2568  assert(IsTileType(tile, MP_HOUSE));
2569 
2570  HouseID house = GetHouseType(tile);
2571 
2572  /* need to align the tile to point to the upper left corner of the house */
2573  tile += GetHouseNorthPart(house); // modifies house to the ID of the north tile
2574 
2575  const HouseSpec *hs = HouseSpec::Get(house);
2576 
2577  /* Remove population from the town if the house is finished. */
2578  if (IsHouseCompleted(tile)) {
2579  ChangePopulation(t, -hs->population);
2580  }
2581 
2582  t->cache.num_houses--;
2583 
2584  /* Clear flags for houses that only may exist once/town. */
2585  if (hs->building_flags & BUILDING_IS_CHURCH) {
2587  } else if (hs->building_flags & BUILDING_IS_STADIUM) {
2589  }
2590 
2591  /* Do the actual clearing of tiles */
2592  DoClearTownHouseHelper(tile, t, house);
2593  if (hs->building_flags & BUILDING_2_TILES_Y) DoClearTownHouseHelper(tile + TileDiffXY(0, 1), t, ++house);
2594  if (hs->building_flags & BUILDING_2_TILES_X) DoClearTownHouseHelper(tile + TileDiffXY(1, 0), t, ++house);
2595  if (hs->building_flags & BUILDING_HAS_4_TILES) DoClearTownHouseHelper(tile + TileDiffXY(1, 1), t, ++house);
2596 
2597  RemoveNearbyStations(t, tile, hs->building_flags);
2598 
2599  UpdateTownRadius(t);
2600 }
2601 
2611 CommandCost CmdRenameTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
2612 {
2613  Town *t = Town::GetIfValid(p1);
2614  if (t == nullptr) return CMD_ERROR;
2615 
2616  bool reset = StrEmpty(text);
2617 
2618  if (!reset) {
2620  if (!IsUniqueTownName(text)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE);
2621  }
2622 
2623  if (flags & DC_EXEC) {
2624  t->cached_name.clear();
2625  free(t->name);
2626  t->name = reset ? nullptr : stredup(text);
2627 
2628  t->UpdateVirtCoord();
2629  InvalidateWindowData(WC_TOWN_DIRECTORY, 0, TDIWD_FORCE_RESORT);
2630  ClearAllStationCachedNames();
2631  ClearAllIndustryCachedNames();
2633  }
2634  return CommandCost();
2635 }
2636 
2643 {
2644  const CargoSpec *cs;
2645  FOR_ALL_CARGOSPECS(cs) {
2646  if (cs->town_effect == effect) return cs;
2647  }
2648  return nullptr;
2649 }
2650 
2662 CommandCost CmdTownCargoGoal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
2663 {
2664  if (_current_company != OWNER_DEITY) return CMD_ERROR;
2665 
2666  TownEffect te = (TownEffect)GB(p1, 16, 8);
2667  if (te < TE_BEGIN || te >= TE_END) return CMD_ERROR;
2668 
2669  uint16 index = GB(p1, 0, 16);
2670  Town *t = Town::GetIfValid(index);
2671  if (t == nullptr) return CMD_ERROR;
2672 
2673  /* Validate if there is a cargo which is the requested TownEffect */
2674  const CargoSpec *cargo = FindFirstCargoWithTownEffect(te);
2675  if (cargo == nullptr) return CMD_ERROR;
2676 
2677  if (flags & DC_EXEC) {
2678  t->goal[te] = p2;
2679  UpdateTownGrowth(t);
2681  }
2682 
2683  return CommandCost();
2684 }
2685 
2695 CommandCost CmdTownSetText(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
2696 {
2697  if (_current_company != OWNER_DEITY) return CMD_ERROR;
2698  Town *t = Town::GetIfValid(p1);
2699  if (t == nullptr) return CMD_ERROR;
2700 
2701  if (flags & DC_EXEC) {
2702  free(t->text);
2703  t->text = StrEmpty(text) ? nullptr : stredup(text);
2705  }
2706 
2707  return CommandCost();
2708 }
2709 
2719 CommandCost CmdTownGrowthRate(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
2720 {
2721  if (_current_company != OWNER_DEITY) return CMD_ERROR;
2722  if (GB(p2, 16, 16) != 0) return CMD_ERROR;
2723 
2724  Town *t = Town::GetIfValid(p1);
2725  if (t == nullptr) return CMD_ERROR;
2726 
2727  if (flags & DC_EXEC) {
2728  if (p2 == 0) {
2729  /* Just clear the flag, UpdateTownGrowth will determine a proper growth rate */
2731  } else {
2732  uint old_rate = t->growth_rate;
2733  if (t->grow_counter >= old_rate) {
2734  /* This also catches old_rate == 0 */
2735  t->grow_counter = p2;
2736  } else {
2737  /* Scale grow_counter, so half finished houses stay half finished */
2738  t->grow_counter = t->grow_counter * p2 / old_rate;
2739  }
2740  t->growth_rate = p2;
2742  }
2743  UpdateTownGrowth(t);
2745  }
2746 
2747  return CommandCost();
2748 }
2749 
2759 CommandCost CmdTownRating(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
2760 {
2761  if (_current_company != OWNER_DEITY) return CMD_ERROR;
2762 
2763  TownID town_id = (TownID)GB(p1, 0, 16);
2764  Town *t = Town::GetIfValid(town_id);
2765  if (t == nullptr) return CMD_ERROR;
2766 
2767  CompanyID company_id = (CompanyID)GB(p1, 16, 8);
2768  if (!Company::IsValidID(company_id)) return CMD_ERROR;
2769 
2770  int16 new_rating = Clamp((int16)GB(p2, 0, 16), RATING_MINIMUM, RATING_MAXIMUM);
2771  if (flags & DC_EXEC) {
2772  t->ratings[company_id] = new_rating;
2774  }
2775 
2776  return CommandCost();
2777 }
2778 
2788 CommandCost CmdExpandTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
2789 {
2790  if (_game_mode != GM_EDITOR && _current_company != OWNER_DEITY) return CMD_ERROR;
2791  Town *t = Town::GetIfValid(p1);
2792  if (t == nullptr) return CMD_ERROR;
2793 
2794  if (flags & DC_EXEC) {
2795  /* The more houses, the faster we grow */
2796  if (p2 == 0) {
2797  uint amount = RandomRange(ClampToU16(t->cache.num_houses / 10)) + 3;
2798  t->cache.num_houses += amount;
2799  UpdateTownRadius(t);
2800 
2801  uint n = amount * 10;
2802  do GrowTown(t); while (--n);
2803 
2804  t->cache.num_houses -= amount;
2805  } else {
2806  for (; p2 > 0; p2--) {
2807  /* Try several times to grow, as we are really suppose to grow */
2808  for (uint i = 0; i < 25; i++) if (GrowTown(t)) break;
2809  }
2810  }
2811  UpdateTownRadius(t);
2812 
2813  UpdateTownMaxPass(t);
2814  }
2815 
2816  return CommandCost();
2817 }
2818 
2828 CommandCost CmdDeleteTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
2829 {
2830  if (_game_mode != GM_EDITOR && !_generating_world) return CMD_ERROR;
2831  Town *t = Town::GetIfValid(p1);
2832  if (t == nullptr) return CMD_ERROR;
2833 
2834  /* Stations refer to towns. */
2835  for (const Station *st : Station::Iterate()) {
2836  if (st->town == t) {
2837  /* Non-oil rig stations are always a problem. */
2838  if (!(st->facilities & FACIL_AIRPORT) || st->airport.type != AT_OILRIG) return CMD_ERROR;
2839  /* We can only automatically delete oil rigs *if* there's no vehicle on them. */
2840  CommandCost ret = DoCommand(st->airport.tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
2841  if (ret.Failed()) return ret;
2842  }
2843  }
2844 
2845  /* Depots refer to towns. */
2846  for (const Depot *d : Depot::Iterate()) {
2847  if (d->town == t) return CMD_ERROR;
2848  }
2849 
2850  /* Check all tiles for town ownership. First check for bridge tiles, as
2851  * these do not directly have an owner so we need to check adjacent
2852  * tiles. This won't work correctly in the same loop if the adjacent
2853  * tile was already deleted earlier in the loop. */
2854  for (TileIndex tile = 0; tile < MapSize(); ++tile) {
2855  if (IsTileType(tile, MP_TUNNELBRIDGE) && TestTownOwnsBridge(tile, t)) {
2856  CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
2857  if (ret.Failed()) return ret;
2858  }
2859  }
2860 
2861  /* Check all remaining tiles for town ownership. */
2862  for (TileIndex tile = 0; tile < MapSize(); ++tile) {
2863  bool try_clear = false;
2864  switch (GetTileType(tile)) {
2865  case MP_ROAD:
2866  try_clear = HasTownOwnedRoad(tile) && GetTownIndex(tile) == t->index;
2867  break;
2868 
2869  case MP_HOUSE:
2870  try_clear = GetTownIndex(tile) == t->index;
2871  break;
2872 
2873  case MP_INDUSTRY:
2874  try_clear = Industry::GetByTile(tile)->town == t;
2875  break;
2876 
2877  case MP_OBJECT:
2878  if (Town::GetNumItems() == 1) {
2879  /* No towns will be left, remove it! */
2880  try_clear = true;
2881  } else {
2882  Object *o = Object::GetByTile(tile);
2883  if (o->town == t) {
2884  if (o->type == OBJECT_STATUE) {
2885  /* Statue... always remove. */
2886  try_clear = true;
2887  } else {
2888  /* Tell to find a new town. */
2889  if (flags & DC_EXEC) o->town = nullptr;
2890  }
2891  }
2892  }
2893  break;
2894 
2895  default:
2896  break;
2897  }
2898  if (try_clear) {
2899  CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
2900  if (ret.Failed()) return ret;
2901  }
2902  }
2903 
2904  /* The town destructor will delete the other things related to the town. */
2905  if (flags & DC_EXEC) {
2906  _town_kdtree.Remove(t->index);
2907  if (t->cache.sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index));
2908  delete t;
2909  }
2910 
2911  return CommandCost();
2912 }
2913 
2919  2, 4, 9, 35, 48, 53, 117, 175
2920 };
2921 
2922 static CommandCost TownActionAdvertiseSmall(Town *t, DoCommandFlag flags)
2923 {
2924  if (flags & DC_EXEC) {
2925  ModifyStationRatingAround(t->xy, _current_company, 0x40, 10);
2926  }
2927  return CommandCost();
2928 }
2929 
2930 static CommandCost TownActionAdvertiseMedium(Town *t, DoCommandFlag flags)
2931 {
2932  if (flags & DC_EXEC) {
2933  ModifyStationRatingAround(t->xy, _current_company, 0x70, 15);
2934  }
2935  return CommandCost();
2936 }
2937 
2938 static CommandCost TownActionAdvertiseLarge(Town *t, DoCommandFlag flags)
2939 {
2940  if (flags & DC_EXEC) {
2941  ModifyStationRatingAround(t->xy, _current_company, 0xA0, 20);
2942  }
2943  return CommandCost();
2944 }
2945 
2946 static CommandCost TownActionRoadRebuild(Town *t, DoCommandFlag flags)
2947 {
2948  /* Check if the company is allowed to fund new roads. */
2950 
2951  if (flags & DC_EXEC) {
2952  t->road_build_months = 6;
2953 
2954  char company_name[MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH];
2956  GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
2957 
2958  char *cn = stredup(company_name);
2959  SetDParam(0, t->index);
2960  SetDParamStr(1, cn);
2961 
2962  AddNewsItem(STR_NEWS_ROAD_REBUILDING, NT_GENERAL, NF_NORMAL, NR_TOWN, t->index, NR_NONE, UINT32_MAX, cn);
2963  AI::BroadcastNewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
2964  Game::NewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
2965  }
2966  return CommandCost();
2967 }
2968 
2974 static bool TryClearTile(TileIndex tile)
2975 {
2976  Backup<CompanyID> cur_company(_current_company, OWNER_NONE, FILE_LINE);
2978  cur_company.Restore();
2979  return r.Succeeded();
2980 }
2981 
2986 
2987  StatueBuildSearchData(TileIndex best_pos, int count) : best_position(best_pos), tile_count(count) { }
2988 };
2989 
2996 static bool SearchTileForStatue(TileIndex tile, void *user_data)
2997 {
2998  static const int STATUE_NUMBER_INNER_TILES = 25; // Number of tiles int the center of the city, where we try to protect houses.
2999 
3000  StatueBuildSearchData *statue_data = (StatueBuildSearchData *)user_data;
3001  statue_data->tile_count++;
3002 
3003  /* Statues can be build on slopes, just like houses. Only the steep slopes is a no go. */
3004  if (IsSteepSlope(GetTileSlope(tile))) return false;
3005  /* Don't build statues under bridges. */
3006  if (IsBridgeAbove(tile)) return false;
3007 
3008  /* A clear-able open space is always preferred. */
3009  if ((IsTileType(tile, MP_CLEAR) || IsTileType(tile, MP_TREES)) && TryClearTile(tile)) {
3010  statue_data->best_position = tile;
3011  return true;
3012  }
3013 
3014  bool house = IsTileType(tile, MP_HOUSE);
3015 
3016  /* Searching inside the inner circle. */
3017  if (statue_data->tile_count <= STATUE_NUMBER_INNER_TILES) {
3018  /* Save first house in inner circle. */
3019  if (house && statue_data->best_position == INVALID_TILE && TryClearTile(tile)) {
3020  statue_data->best_position = tile;
3021  }
3022 
3023  /* If we have reached the end of the inner circle, and have a saved house, terminate the search. */
3024  return statue_data->tile_count == STATUE_NUMBER_INNER_TILES && statue_data->best_position != INVALID_TILE;
3025  }
3026 
3027  /* Searching outside the circle, just pick the first possible spot. */
3028  statue_data->best_position = tile; // Is optimistic, the condition below must also hold.
3029  return house && TryClearTile(tile);
3030 }
3031 
3040 {
3041  if (!Object::CanAllocateItem()) return_cmd_error(STR_ERROR_TOO_MANY_OBJECTS);
3042 
3043  TileIndex tile = t->xy;
3044  StatueBuildSearchData statue_data(INVALID_TILE, 0);
3045  if (!CircularTileSearch(&tile, 9, SearchTileForStatue, &statue_data)) return_cmd_error(STR_ERROR_STATUE_NO_SUITABLE_PLACE);
3046 
3047  if (flags & DC_EXEC) {
3048  Backup<CompanyID> cur_company(_current_company, OWNER_NONE, FILE_LINE);
3049  DoCommand(statue_data.best_position, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
3050  cur_company.Restore();
3052  SetBit(t->statues, _current_company); // Once found and built, "inform" the Town.
3053  MarkTileDirtyByTile(statue_data.best_position);
3054  }
3055  return CommandCost();
3056 }
3057 
3058 static CommandCost TownActionFundBuildings(Town *t, DoCommandFlag flags)
3059 {
3060  /* Check if it's allowed to buy the rights */
3062 
3063  if (flags & DC_EXEC) {
3064  /* And grow for 3 months */
3065  t->fund_buildings_months = 3;
3066 
3067  /* Enable growth (also checking GameScript's opinion) */
3068  UpdateTownGrowth(t);
3069 
3070  /* Build a new house, but add a small delay to make sure
3071  * that spamming funding doesn't let town grow any faster
3072  * than 1 house per 2 * TOWN_GROWTH_TICKS ticks.
3073  * Also emulate original behaviour when town was only growing in
3074  * TOWN_GROWTH_TICKS intervals, to make sure that it's not too
3075  * tick-perfect and gives player some time window where he can
3076  * spam funding with the exact same efficiency.
3077  */
3079 
3081  }
3082  return CommandCost();
3083 }
3084 
3085 static CommandCost TownActionBuyRights(Town *t, DoCommandFlag flags)
3086 {
3087  /* Check if it's allowed to buy the rights */
3089 
3090  if (flags & DC_EXEC) {
3091  t->exclusive_counter = 12;
3093 
3094  ModifyStationRatingAround(t->xy, _current_company, 130, 17);
3095 
3097 
3098  /* Spawn news message */
3099  CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
3101  SetDParam(0, STR_NEWS_EXCLUSIVE_RIGHTS_TITLE);
3102  SetDParam(1, STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION);
3103  SetDParam(2, t->index);
3104  SetDParamStr(3, cni->company_name);
3105  AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_GENERAL, NF_COMPANY, NR_TOWN, t->index, NR_NONE, UINT32_MAX, cni);
3106  AI::BroadcastNewEvent(new ScriptEventExclusiveTransportRights((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
3107  Game::NewEvent(new ScriptEventExclusiveTransportRights((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
3108  }
3109  return CommandCost();
3110 }
3111 
3112 static CommandCost TownActionBribe(Town *t, DoCommandFlag flags)
3113 {
3114  if (flags & DC_EXEC) {
3115  if (Chance16(1, 14)) {
3116  /* set as unwanted for 6 months */
3117  t->unwanted[_current_company] = 6;
3118 
3119  /* set all close by station ratings to 0 */
3120  for (Station *st : Station::Iterate()) {
3121  if (st->town == t && st->owner == _current_company) {
3122  for (CargoID i = 0; i < NUM_CARGO; i++) st->goods[i].rating = 0;
3123  }
3124  }
3125 
3126  /* only show error message to the executing player. All errors are handled command.c
3127  * but this is special, because it can only 'fail' on a DC_EXEC */
3128  if (IsLocalCompany()) ShowErrorMessage(STR_ERROR_BRIBE_FAILED, INVALID_STRING_ID, WL_INFO);
3129 
3130  /* decrease by a lot!
3131  * ChangeTownRating is only for stuff in demolishing. Bribe failure should
3132  * be independent of any cheat settings
3133  */
3134  if (t->ratings[_current_company] > RATING_BRIBE_DOWN_TO) {
3135  t->ratings[_current_company] = RATING_BRIBE_DOWN_TO;
3137  }
3138  } else {
3139  ChangeTownRating(t, RATING_BRIBE_UP_STEP, RATING_BRIBE_MAXIMUM, DC_EXEC);
3140  }
3141  }
3142  return CommandCost();
3143 }
3144 
3145 typedef CommandCost TownActionProc(Town *t, DoCommandFlag flags);
3146 static TownActionProc * const _town_action_proc[] = {
3147  TownActionAdvertiseSmall,
3148  TownActionAdvertiseMedium,
3149  TownActionAdvertiseLarge,
3150  TownActionRoadRebuild,
3152  TownActionFundBuildings,
3153  TownActionBuyRights,
3154  TownActionBribe
3155 };
3156 
3164 uint GetMaskOfTownActions(int *nump, CompanyID cid, const Town *t)
3165 {
3166  int num = 0;
3167  TownActions buttons = TACT_NONE;
3168 
3169  /* Spectators and unwanted have no options */
3170  if (cid != COMPANY_SPECTATOR && !(_settings_game.economy.bribe && t->unwanted[cid])) {
3171 
3172  /* Things worth more than this are not shown */
3173  Money avail = Company::Get(cid)->money + _price[PR_STATION_VALUE] * 200;
3174 
3175  /* Check the action bits for validity and
3176  * if they are valid add them */
3177  for (uint i = 0; i != lengthof(_town_action_costs); i++) {
3178  const TownActions cur = (TownActions)(1 << i);
3179 
3180  /* Is the company not able to bribe ? */
3181  if (cur == TACT_BRIBE && (!_settings_game.economy.bribe || t->ratings[cid] >= RATING_BRIBE_MAXIMUM)) continue;
3182 
3183  /* Is the company not able to buy exclusive rights ? */
3184  if (cur == TACT_BUY_RIGHTS && !_settings_game.economy.exclusive_rights) continue;
3185 
3186  /* Is the company not able to fund buildings ? */
3187  if (cur == TACT_FUND_BUILDINGS && !_settings_game.economy.fund_buildings) continue;
3188 
3189  /* Is the company not able to fund local road reconstruction? */
3190  if (cur == TACT_ROAD_REBUILD && !_settings_game.economy.fund_roads) continue;
3191 
3192  /* Is the company not able to build a statue ? */
3193  if (cur == TACT_BUILD_STATUE && HasBit(t->statues, cid)) continue;
3194 
3195  if (avail >= _town_action_costs[i] * _price[PR_TOWN_ACTION] >> 8) {
3196  buttons |= cur;
3197  num++;
3198  }
3199  }
3200  }
3201 
3202  if (nump != nullptr) *nump = num;
3203  return buttons;
3204 }
3205 
3217 CommandCost CmdDoTownAction(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
3218 {
3219  Town *t = Town::GetIfValid(p1);
3220  if (t == nullptr || p2 >= lengthof(_town_action_proc)) return CMD_ERROR;
3221 
3222  if (!HasBit(GetMaskOfTownActions(nullptr, _current_company, t), p2)) return CMD_ERROR;
3223 
3224  CommandCost cost(EXPENSES_OTHER, _price[PR_TOWN_ACTION] * _town_action_costs[p2] >> 8);
3225 
3226  CommandCost ret = _town_action_proc[p2](t, flags);
3227  if (ret.Failed()) return ret;
3228 
3229  if (flags & DC_EXEC) {
3231  }
3232 
3233  return cost;
3234 }
3235 
3236 template <typename Func>
3237 static void ForAllStationsNearTown(Town *t, Func func)
3238 {
3239  /* Ideally the search radius should be close to the actual town zone 0 radius.
3240  * The true radius is not stored or calculated anywhere, only the squared radius. */
3241  /* The efficiency of this search might be improved for large towns and many stations on the map,
3242  * by using an integer square root approximation giving a value not less than the true square root. */
3243  uint search_radius = t->cache.squared_town_zone_radius[0] / 2;
3244  ForAllStationsRadius(t->xy, search_radius, [&](const Station * st) {
3245  if (DistanceSquare(st->xy, t->xy) <= t->cache.squared_town_zone_radius[0]) {
3246  func(st);
3247  }
3248  });
3249 }
3250 
3251 static void UpdateTownRating(Town *t)
3252 {
3253  /* Increase company ratings if they're low */
3254  for (const Company *c : Company::Iterate()) {
3255  if (t->ratings[c->index] < RATING_GROWTH_MAXIMUM) {
3256  t->ratings[c->index] = min((int)RATING_GROWTH_MAXIMUM, t->ratings[c->index] + RATING_GROWTH_UP_STEP);
3257  }
3258  }
3259 
3260  ForAllStationsNearTown(t, [&](const Station *st) {
3261  if (st->time_since_load <= 20 || st->time_since_unload <= 20) {
3262  if (Company::IsValidID(st->owner)) {
3263  int new_rating = t->ratings[st->owner] + RATING_STATION_UP_STEP;
3264  t->ratings[st->owner] = min(new_rating, INT16_MAX); // do not let it overflow
3265  }
3266  } else {
3267  if (Company::IsValidID(st->owner)) {
3268  int new_rating = t->ratings[st->owner] + RATING_STATION_DOWN_STEP;
3269  t->ratings[st->owner] = max(new_rating, INT16_MIN);
3270  }
3271  }
3272  });
3273 
3274  /* clamp all ratings to valid values */
3275  for (uint i = 0; i < MAX_COMPANIES; i++) {
3276  t->ratings[i] = Clamp(t->ratings[i], RATING_MINIMUM, RATING_MAXIMUM);
3277  }
3278 
3280 }
3281 
3282 
3289 static void UpdateTownGrowCounter(Town *t, uint16 prev_growth_rate)
3290 {
3291  if (t->growth_rate == TOWN_GROWTH_RATE_NONE) return;
3292  if (prev_growth_rate == TOWN_GROWTH_RATE_NONE) {
3294  return;
3295  }
3296  t->grow_counter = RoundDivSU((uint32)t->grow_counter * (t->growth_rate + 1), prev_growth_rate + 1);
3297 }
3298 
3305 {
3306  int n = 0;
3307  ForAllStationsNearTown(t, [&](const Station * st) {
3308  if (st->time_since_load <= 20 || st->time_since_unload <= 20) {
3309  n++;
3310  }
3311  });
3312  return n;
3313 }
3314 
3321 static uint GetNormalGrowthRate(Town *t)
3322 {
3328  static const uint16 _grow_count_values[2][6] = {
3329  { 120, 120, 120, 100, 80, 60 }, // Fund new buildings has been activated
3330  { 320, 420, 300, 220, 160, 100 } // Normal values
3331  };
3332 
3333  int n = CountActiveStations(t);
3334  uint16 m = _grow_count_values[t->fund_buildings_months != 0 ? 0 : 1][min(n, 5)];
3335 
3336  uint growth_multiplier = _settings_game.economy.town_growth_rate != 0 ? _settings_game.economy.town_growth_rate - 1 : 1;
3337 
3338  m >>= growth_multiplier;
3339  if (t->larger_town) m /= 2;
3340 
3341  return TownTicksToGameTicks(m / (t->cache.num_houses / 50 + 1));
3342 }
3343 
3349 {
3350  if (HasBit(t->flags, TOWN_CUSTOM_GROWTH)) return;
3351  uint old_rate = t->growth_rate;
3353  UpdateTownGrowCounter(t, old_rate);
3355 }
3356 
3361 static void UpdateTownGrowth(Town *t)
3362 {
3364 
3367 
3368  if (_settings_game.economy.town_growth_rate == 0 && t->fund_buildings_months == 0) return;
3369 
3370  if (t->fund_buildings_months == 0) {
3371  /* Check if all goals are reached for this town to grow (given we are not funding it) */
3372  for (int i = TE_BEGIN; i < TE_END; i++) {
3373  switch (t->goal[i]) {
3374  case TOWN_GROWTH_WINTER:
3375  if (TileHeight(t->xy) >= GetSnowLine() && t->received[i].old_act == 0 && t->cache.population > 90) return;
3376  break;
3377  case TOWN_GROWTH_DESERT:
3378  if (GetTropicZone(t->xy) == TROPICZONE_DESERT && t->received[i].old_act == 0 && t->cache.population > 60) return;
3379  break;
3380  default:
3381  if (t->goal[i] > t->received[i].old_act) return;
3382  break;
3383  }
3384  }
3385  }
3386 
3387  if (HasBit(t->flags, TOWN_CUSTOM_GROWTH)) {
3390  return;
3391  }
3392 
3393  if (t->fund_buildings_months == 0 && CountActiveStations(t) == 0 && !Chance16(1, 12)) return;
3394 
3397 }
3398 
3399 static void UpdateTownAmounts(Town *t)
3400 {
3401  for (CargoID i = 0; i < NUM_CARGO; i++) t->supplied[i].NewMonth();
3402  for (int i = TE_BEGIN; i < TE_END; i++) t->received[i].NewMonth();
3403  if (t->fund_buildings_months != 0) t->fund_buildings_months--;
3404 
3406 }
3407 
3408 static void UpdateTownUnwanted(Town *t)
3409 {
3410  for (const Company *c : Company::Iterate()) {
3411  if (t->unwanted[c->index] > 0) t->unwanted[c->index]--;
3412  }
3413 }
3414 
3422 {
3424 
3426  if (t == nullptr) return CommandCost();
3427 
3428  if (t->ratings[_current_company] > RATING_VERYPOOR) return CommandCost();
3429 
3430  SetDParam(0, t->index);
3431  return_cmd_error(STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS);
3432 }
3433 
3443 {
3444  if (Town::GetNumItems() == 0) return nullptr;
3445 
3446  TownID tid = _town_kdtree.FindNearest(TileX(tile), TileY(tile));
3447  Town *town = Town::Get(tid);
3448  if (DistanceManhattan(tile, town->xy) < threshold) return town;
3449  return nullptr;
3450 }
3451 
3460 Town *ClosestTownFromTile(TileIndex tile, uint threshold)
3461 {
3462  switch (GetTileType(tile)) {
3463  case MP_ROAD:
3464  if (IsRoadDepot(tile)) return CalcClosestTownFromTile(tile, threshold);
3465 
3466  if (!HasTownOwnedRoad(tile)) {
3467  TownID tid = GetTownIndex(tile);
3468 
3469  if (tid == INVALID_TOWN) {
3470  /* in the case we are generating "many random towns", this value may be INVALID_TOWN */
3471  if (_generating_world) return CalcClosestTownFromTile(tile, threshold);
3472  assert(Town::GetNumItems() == 0);
3473  return nullptr;
3474  }
3475 
3476  assert(Town::IsValidID(tid));
3477  Town *town = Town::Get(tid);
3478 
3479  if (DistanceManhattan(tile, town->xy) >= threshold) town = nullptr;
3480 
3481  return town;
3482  }
3483  FALLTHROUGH;
3484 
3485  case MP_HOUSE:
3486  return Town::GetByTile(tile);
3487 
3488  default:
3489  return CalcClosestTownFromTile(tile, threshold);
3490  }
3491 }
3492 
3493 static bool _town_rating_test = false;
3495 
3501 void SetTownRatingTestMode(bool mode)
3502 {
3503  static int ref_count = 0; // Number of times test-mode is switched on.
3504  if (mode) {
3505  if (ref_count == 0) {
3506  _town_test_ratings.clear();
3507  }
3508  ref_count++;
3509  } else {
3510  assert(ref_count > 0);
3511  ref_count--;
3512  }
3513  _town_rating_test = !(ref_count == 0);
3514 }
3515 
3521 static int GetRating(const Town *t)
3522 {
3523  if (_town_rating_test) {
3524  SmallMap<const Town *, int>::iterator it = _town_test_ratings.Find(t);
3525  if (it != _town_test_ratings.End()) {
3526  return it->second;
3527  }
3528  }
3529  return t->ratings[_current_company];
3530 }
3531 
3540 {
3541  /* if magic_bulldozer cheat is active, town doesn't penalize for removing stuff */
3542  if (t == nullptr || (flags & DC_NO_MODIFY_TOWN_RATING) ||
3544  (_cheats.magic_bulldozer.value && add < 0)) {
3545  return;
3546  }
3547 
3548  int rating = GetRating(t);
3549  if (add < 0) {
3550  if (rating > max) {
3551  rating += add;
3552  if (rating < max) rating = max;
3553  }
3554  } else {
3555  if (rating < max) {
3556  rating += add;
3557  if (rating > max) rating = max;
3558  }
3559  }
3560  if (_town_rating_test) {
3561  _town_test_ratings[t] = rating;
3562  } else {
3564  t->ratings[_current_company] = rating;
3566  }
3567 }
3568 
3577 {
3578  /* if magic_bulldozer cheat is active, town doesn't restrict your destructive actions */
3579  if (t == nullptr || !Company::IsValidID(_current_company) ||
3581  return CommandCost();
3582  }
3583 
3584  /* minimum rating needed to be allowed to remove stuff */
3585  static const int needed_rating[][TOWN_RATING_CHECK_TYPE_COUNT] = {
3586  /* ROAD_REMOVE, TUNNELBRIDGE_REMOVE */
3590  };
3591 
3592  /* check if you're allowed to remove the road/bridge/tunnel
3593  * owned by a town no removal if rating is lower than ... depends now on
3594  * difficulty setting. Minimum town rating selected by difficulty level
3595  */
3596  int needed = needed_rating[_settings_game.difficulty.town_council_tolerance][type];
3597 
3598  if (GetRating(t) < needed) {
3599  SetDParam(0, t->index);
3600  return_cmd_error(STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS);
3601  }
3602 
3603  return CommandCost();
3604 }
3605 
3606 void TownsMonthlyLoop()
3607 {
3608  for (Town *t : Town::Iterate()) {
3609  if (t->road_build_months != 0) t->road_build_months--;
3610 
3611  if (t->exclusive_counter != 0) {
3612  if (--t->exclusive_counter == 0) t->exclusivity = INVALID_COMPANY;
3613  }
3614 
3615  UpdateTownAmounts(t);
3616  UpdateTownGrowth(t);
3617  UpdateTownRating(t);
3618  UpdateTownUnwanted(t);
3619  }
3620 
3621 }
3622 
3623 void TownsYearlyLoop()
3624 {
3625  /* Increment house ages */
3626  for (TileIndex t = 0; t < MapSize(); t++) {
3627  if (!IsTileType(t, MP_HOUSE)) continue;
3628  IncrementHouseAge(t);
3629  }
3630 }
3631 
3632 static CommandCost TerraformTile_Town(TileIndex tile, DoCommandFlag flags, int z_new, Slope tileh_new)
3633 {
3634  if (AutoslopeEnabled()) {
3635  HouseID house = GetHouseType(tile);
3636  GetHouseNorthPart(house); // modifies house to the ID of the north tile
3637  const HouseSpec *hs = HouseSpec::Get(house);
3638 
3639  /* Here we differ from TTDP by checking TILE_NOT_SLOPED */
3640  if (((hs->building_flags & TILE_NOT_SLOPED) == 0) && !IsSteepSlope(tileh_new) &&
3641  (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) {
3642  bool allow_terraform = true;
3643 
3644  /* Call the autosloping callback per tile, not for the whole building at once. */
3645  house = GetHouseType(tile);
3646  hs = HouseSpec::Get(house);
3648  /* If the callback fails, allow autoslope. */
3649  uint16 res = GetHouseCallback(CBID_HOUSE_AUTOSLOPE, 0, 0, house, Town::GetByTile(tile), tile);
3650  if (res != CALLBACK_FAILED && ConvertBooleanCallback(hs->grf_prop.grffile, CBID_HOUSE_AUTOSLOPE, res)) allow_terraform = false;
3651  }
3652 
3653  if (allow_terraform) return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_FOUNDATION]);
3654  }
3655  }
3656 
3657  return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
3658 }
3659 
3661 extern const TileTypeProcs _tile_type_town_procs = {
3662  DrawTile_Town, // draw_tile_proc
3663  GetSlopePixelZ_Town, // get_slope_z_proc
3664  ClearTile_Town, // clear_tile_proc
3665  AddAcceptedCargo_Town, // add_accepted_cargo_proc
3666  GetTileDesc_Town, // get_tile_desc_proc
3667  GetTileTrackStatus_Town, // get_tile_track_status_proc
3668  nullptr, // click_tile_proc
3669  AnimateTile_Town, // animate_tile_proc
3670  TileLoop_Town, // tile_loop_proc
3671  ChangeTileOwner_Town, // change_tile_owner_proc
3672  AddProducedCargo_Town, // add_produced_cargo_proc
3673  nullptr, // vehicle_enter_tile_proc
3674  GetFoundation_Town, // get_foundation_proc
3675  TerraformTile_Town, // terraform_tile_proc
3676 };
3677 
3678 
3679 HouseSpec _house_specs[NUM_HOUSES];
3680 
3681 void ResetHouses()
3682 {
3683  memset(&_house_specs, 0, sizeof(_house_specs));
3684  memcpy(&_house_specs, &_original_house_specs, sizeof(_original_house_specs));
3685 
3686  /* Reset any overrides that have been set. */
3687  _house_mngr.ResetOverride();
3688 }
bool enabled
the house is available to build (true by default, but can be disabled by newgrf)
Definition: house.h:111
Functions related to OTTD&#39;s strings.
static TileType GetTileType(TileIndex tile)
Get the tiletype of a given tile.
Definition: tile_map.h:96
Owner
Enum for all companies/owners.
Definition: company_type.h:18
static const uint TOWN_GROWTH_WINTER
The town only needs this cargo in the winter (any amount)
Definition: town.h:31
don&#39;t allow building on structures
Definition: command_type.h:347
Functions/types related to NewGRF debugging.
the north corner of the tile is raised
Definition: slope_type.h:53
do not change town rating
Definition: command_type.h:356
uint16 custom_town_number
manually entered number of towns
#define RandomTile()
Get a valid random tile.
Definition: map_func.h:435
static bool IsLocalCompany()
Is the current company the local company?
Definition: company_func.h:43
Source/destination is a town.
Definition: cargo_type.h:148
static const int TOWN_GROWTH_TICKS
cycle duration for towns trying to grow. (this originates from the size of the town array in TTD ...
Definition: date_type.h:37
TownRatingCheckType
Action types that a company must ask permission for to a town authority.
Definition: town.h:160
There can be only one stadium by town.
Definition: town.h:183
static Year GetHouseAge(TileIndex t)
Get the age of the house.
Definition: town_map.h:249
byte probability
Relative probability of appearing (16 is the standard value)
Definition: house.h:117
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:80
static void NewEvent(class ScriptEvent *event)
Queue a new event for a Game Script.
Definition: game_core.cpp:141
Definition of stuff that is very close to a company, like the company struct itself.
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:340
static void ChangePopulation(Town *t, int mod)
Change the towns population.
Definition: town_cmd.cpp:433
void UpdateNearestTownForRoadTiles(bool invalidate)
Updates cached nearest town for all road tiles.
Definition: road_cmd.cpp:1827
static bool GrowTownWithExtraHouse(Town *t, TileIndex tile)
Grows the town with an extra house.
Definition: town_cmd.cpp:1041
Number of town layouts.
Definition: town_type.h:87
static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection target_dir, Town *t1)
Grows the given town.
Definition: town_cmd.cpp:1208
static TropicZone GetTropicZone(TileIndex tile)
Get the tropic zone.
Definition: tile_map.h:238
static const uint CALLBACK_FAILED
Different values for Callback result evaluations.
static TransportType GetTunnelBridgeTransportType(TileIndex t)
Tunnel: Get the transport type of the tunnel (road or rail) Bridge: Get the transport type of the bri...
static RoadBits GetTownRoadBits(TileIndex tile)
Return the RoadBits of a tile.
Definition: town_cmd.cpp:822
TransportedCargoStat< uint16 > received[NUM_TE]
Cargo statistics about received cargotypes.
Definition: town.h:76
Geometric 2x2 grid algorithm.
Definition: town_type.h:82
Tile information, used while rendering the tile.
Definition: tile_cmd.h:42
bool bribe
enable bribing the local authority
static const byte TOWN_HOUSE_COMPLETED
Simple value that indicates the house has reached the final stage of construction.
Definition: house.h:23
void ForAllStationsAroundTiles(const TileArea &ta, Func func)
Call a function on all stations that have any part of the requested area within their catchment...
Definition: station_base.h:569
CompanyMask statues
which companies have a statue?
Definition: town.h:66
south and east corner are raised
Definition: slope_type.h:57
static bool GrowTownWithBridge(const Town *t, const TileIndex tile, const DiagDirection bridge_dir)
Grows the town with a bridge.
Definition: town_cmd.cpp:1103
bool VerifyTownName(uint32 r, const TownNameParams *par, TownNames *town_names)
Verifies the town name is valid and unique.
Definition: townname.cpp:82
void InitializeLayout(TownLayout layout)
Assigns town layout.
Definition: town_cmd.cpp:167
bool GenerateTowns(TownLayout layout)
This function will generate a certain amount of towns, with a certain layout It can be called from th...
Definition: town_cmd.cpp:2067
the west corner of the tile is raised
Definition: slope_type.h:50
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition: window.cpp:3218
byte landscape
the landscape we&#39;re currently in
void AddAnimatedTile(TileIndex tile)
Add the given tile to the animated tile table (if it does not exist on that table yet)...
decides accepted types
Tile is desert.
Definition: tile_type.h:71
Sprites to use and how to display them for town tiles.
static void ClearMakeHouseTile(TileIndex tile, Town *t, byte counter, byte stage, HouseID type, byte random_bits)
Clears tile and builds a house or house part.
Definition: town_cmd.cpp:2143
TownLayout layout
tells us what kind of town we&#39;re building
Definition: town_cmd.cpp:1942
Part of an industry.
Definition: tile_type.h:49
RoadBits GetAnyRoadBits(TileIndex tile, RoadTramType rtt, bool straight_tunnel_bridge_entrance)
Returns the RoadBits on an arbitrary tile Special behaviour:
Definition: road_map.cpp:33
EconomySettings economy
settings to change the economy
uint32 squared_town_zone_radius[HZB_END]
UpdateTownRadius updates this given the house count.
Definition: town.h:45
int32 TileIndexDiff
An offset value between to tiles.
Definition: map_func.h:154
static Titem * Get(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:329
Money GetAvailableMoneyForCommand()
Definition: command.cpp:523
Declarations for accessing the k-d tree of towns.
static bool TownLayoutAllows2x2HouseHere(Town *t, TileIndex tile)
Checks if current town layout allows 2x2 building here.
Definition: town_cmd.cpp:2288
Functions related to dates.
Town * town
Town the object is built in.
Definition: object_base.h:25
const char * grf
newGRF used for the tile contents
Definition: tile_cmd.h:61
byte fund_buildings_months
fund buildings program in action?
Definition: town.h:90
Northwest.
Basic road type.
Definition: road_type.h:24
Random town layout.
Definition: town_type.h:85
West.
Called to determine if one can alter the ground below a house tile.
static bool TownLayoutAllowsHouseHere(Town *t, TileIndex tile)
Checks if current town layout allows building here.
Definition: town_cmd.cpp:2257
std::string cached_name
NOSAVE: Cache of the resolved name of the town, if not using a custom town name.
Definition: town.h:60
Town * town
Nearest town.
Definition: industry.h:42
static bool HasTileRoadType(TileIndex t, RoadTramType rtt)
Check if a tile has a road or a tram road type.
Definition: road_map.h:210
Used for iterations.
TileIndex best_position
Best position found so far.
Definition: town_cmd.cpp:2984
static T SetBit(T &x, const uint8 y)
Set a bit in a variable.
void UpdateAllTownVirtCoords()
Update the virtual coords needed to draw the town sign for all towns.
Definition: town_cmd.cpp:414
byte flags
See TownFlags.
Definition: town.h:62
terraform a tile
Definition: command_type.h:186
uint8 unwanted[MAX_COMPANIES]
how many months companies aren&#39;t wanted by towns (bribe)
Definition: town.h:70
RoadTypeFlags flags
Bit mask of road type flags.
Definition: road.h:124
static void UpdateTownGrowth(Town *t)
Updates town growth state (whether it is growing or not).
Definition: town_cmd.cpp:3361
CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile, bool usebit)
Translate a GRF-local cargo slot/bitnum into a CargoID.
static bool _town_rating_test
If true, town rating is in test-mode.
Definition: town_cmd.cpp:3493
A tile with road (or tram tracks)
Definition: tile_type.h:43
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
Definition: command_func.h:23
Slope tileh
Slope of the tile.
Definition: tile_cmd.h:45
static const ObjectType OBJECT_STATUE
Statue in towns.
Definition: object_type.h:18
Maximal number of cargo types in a game.
Definition: cargo_type.h:64
static uint ScaleByMapSize(uint n)
Scales the given value by the map size, where the given value is for a 256 by 256 map...
Definition: map_func.h:122
Full road along the x-axis (south-west + north-east)
Definition: road_type.h:56
byte cargo_acceptance[HOUSE_NUM_ACCEPTS]
acceptance level for the cargo slots
Definition: house.h:107
Functions used internally by the roads.
no flag is set
Definition: command_type.h:345
A town owns the tile, or a town is expanding.
Definition: company_type.h:24
Used for iterations.
Definition: road_type.h:26
Specification of a cargo type.
Definition: cargotype.h:55
std::vector< Pair >::const_iterator Find(const T &key) const
Finds given key in this map.
Road specific functions.
static void UpdateTownGrowthRate(Town *t)
Updates town growth rate.
Definition: town_cmd.cpp:3348
static bool IsCloseToTown(TileIndex tile, uint dist)
Determines if a town is close to a tile.
Definition: town_cmd.cpp:385
bool CatchmentCoversTown(TownID t) const
Test if the given town ID is covered by our catchment area.
Definition: station.cpp:394
bool population_in_label
show the population of a town in his label?
Implementation of simple mapping class.
CargoID accepts_cargo[HOUSE_NUM_ACCEPTS]
input cargo slots
Definition: house.h:108
bool GenerateTownName(uint32 *townnameparts, TownNames *town_names)
Generates valid town name.
Definition: townname.cpp:119
static bool HasTileWaterGround(TileIndex t)
Checks whether the tile has water at the ground.
Definition: water_map.h:344
TownLayout
Town Layouts.
Definition: town_type.h:78
Build a statue.
Definition: town.h:216
static void MakeHouseTile(TileIndex t, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
Make the tile a house.
Definition: town_map.h:352
static uint TileX(TileIndex tile)
Get the X component of a tile.
Definition: map_func.h:205
South-west part.
Definition: road_type.h:53
Town(TileIndex tile=INVALID_TILE)
Creates a new town.
Definition: town.h:104
static TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
Adds a DiagDir to a tile.
Definition: map_func.h:382
TownFounding found_town
town founding.
static int GetSlopeMaxZ(Slope s)
Returns the height of the highest corner of a slope relative to TileZ (= minimal height) ...
Definition: slope_func.h:160
Base for all depots (except hangars)
static const DrawBuildingsTileStruct _town_draw_tile_data[]
structure of houses graphics
Definition: town_land.h:27
Opening of industries.
Definition: news_type.h:26
Defines the internal data of a functional industry.
Definition: industry.h:40
static SmallMap< const Town *, int > _town_test_ratings
Map of towns to modified ratings, while in town rating test-mode.
Definition: town_cmd.cpp:3494
demolish a tile
Definition: command_type.h:180
Tile description for the &#39;land area information&#39; tool.
Definition: tile_cmd.h:51
DifficultySettings difficulty
settings related to the difficulty
static void BroadcastNewEvent(ScriptEvent *event, CompanyID skip_company=MAX_COMPANIES)
Broadcast a new event to all active AIs.
Definition: ai_core.cpp:259
Tindex index
Index of this pool item.
Definition: pool_type.hpp:227
static bool CheckFree2x2Area(TileIndex tile, int z, bool noslope)
Checks if a house of size 2x2 can be built at this tile.
Definition: town_cmd.cpp:2236
the east corner of the tile is raised
Definition: slope_type.h:52
flag for invalid roadtype
Definition: road_type.h:27
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x=0, int y=0, const GRFFile *textref_stack_grffile=nullptr, uint textref_stack_size=0, const uint32 *textref_stack=nullptr)
Display an error message in a window.
Definition: error_gui.cpp:380
static bool IsSteepSlope(Slope s)
Checks if a slope is steep.
Definition: slope_func.h:36
bool show_zone
NOSAVE: mark town to show the local authority zone in the viewports.
Definition: town.h:96
void UpdatePosition(int center, int top, StringID str, StringID str_small=STR_NULL)
Update the position of the viewport sign.
Definition: viewport_type.h:64
Declarations for accessing the k-d tree of stations.
uint16 time_until_rebuild
time until we rebuild a house
Definition: town.h:85
CommandCost CmdDoTownAction(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Do a town action.
Definition: town_cmd.cpp:3217
Helper functions to extract data from command parameters.
static bool IsRoadOwner(TileIndex t, RoadTramType rtt, Owner o)
Check if a specific road type is owned by an owner.
Definition: road_map.h:267
Cargo behaves water-like.
Definition: cargotype.h:30
build a "half" road
Definition: command_type.h:201
Other expenses.
Definition: economy_type.h:161
Used as the user_data for FindFurthestFromWater.
Definition: town_cmd.cpp:1939
void NewMonth()
Update stats for a new month.
Definition: town_type.h:121
TownLayout town_layout
select town layout,
#define lastof(x)
Get the last element of an fixed size array.
Definition: depend.cpp:48
void UpdateVirtCoord()
Resize the sign(label) of the town after changes in population (creation or growth or else) ...
Definition: town_cmd.cpp:396
T FindNearest(CoordT x, CoordT y) const
Find the element closest to given coordinate, in Manhattan distance.
Definition: kdtree.hpp:444
StringID GetGRFStringID(uint32 grfid, StringID stringid)
Returns the index for this stringid associated with its grfID.
Data that needs to be stored for company news messages.
Definition: news_type.h:148
A railway.
Definition: tile_type.h:42
Called to determine which cargoes a town building should accept.
byte dist_local_authority
distance for town local authority, default 20
static Pool::IterateWrapper< Station > Iterate(size_t from=0)
Returns an iterable ensemble of all valid stations of type T.
Functions related to world/map generation.
initial rating
Definition: town_type.h:44
Money GetCost() const
The costs as made up to this moment.
Definition: command_type.h:82
Contains objects such as transmitters and owned land.
Definition: tile_type.h:51
static bool BuildTownHouse(Town *t, TileIndex tile)
Tries to build a house at this tile.
Definition: town_cmd.cpp:2373
Construction costs.
Definition: economy_type.h:149
south and west corner are raised
Definition: slope_type.h:56
Common return value for all commands.
Definition: command_type.h:23
static bool LiftHasDestination(TileIndex t)
Check if the lift of this animated house has a destination.
Definition: town_map.h:82
static bool IsStandardRoadStopTile(TileIndex t)
Is tile t a standard (non-drive through) road stop station?
Definition: station_map.h:223
uint16 callback_mask
Bitmask of house callbacks that have to be called.
Definition: house.h:115
CommandFlags GetCommandFlags(uint32 cmd)
Definition: command.cpp:388
RoadType
The different roadtypes we support.
Definition: road_type.h:22
static T max(const T a, const T b)
Returns the maximum of two values.
Definition: math_func.hpp:24
static bool IsDriveThroughStopTile(TileIndex t)
Is tile t a drive through road stop station?
Definition: station_map.h:233
bool allow_town_roads
towns are allowed to build roads (always allowed when generating world / in SE)
Town directory; Window numbers:
Definition: window_type.h:247
uint16 HouseID
OpenTTD ID of house types.
Definition: house_type.h:13
static void InvalidateAllFrom(SourceType src_type, SourceID src)
Invalidates (sets source_id to INVALID_SOURCE) all cargo packets from given source.
void ForAllStationsRadius(TileIndex center, uint radius, Func func)
Call a function on all stations whose sign is within a radius of a center tile.
uint32 population
Current population of people.
Definition: town.h:42
Year _cur_year
Current year, starting at 0.
Definition: date.cpp:25
void MultiplyCost(int factor)
Multiplies the cost of the command by the given factor.
Definition: command_type.h:73
static RoadBits GenRandomRoadBits()
Generate a random road block.
Definition: town_cmd.cpp:1535
Tstorage new_act
Actually transported this month.
Definition: town_type.h:116
bool IsTileFlat(TileIndex tile, int *h)
Check if a given tile is flat.
Definition: tile_map.cpp:100
decides amount of cargo acceptance
static TileIndex FindNearestGoodCoastalTownSpot(TileIndex tile, TownLayout layout)
Given a spot on the map (presumed to be a water tile), find a good coastal spot to build a city...
Definition: town_cmd.cpp:2000
void DeleteSubsidyWith(SourceType type, SourceID index)
Delete the subsidies associated with a given cargo source type and id.
Definition: subsidy.cpp:148
a flat tile
Definition: slope_type.h:49
int z
Height.
Definition: tile_cmd.h:47
static const uint TILE_SIZE
Tile size in world coordinates.
Definition: tile_type.h:13
static byte GetLiftDestination(TileIndex t)
Get the current destination for this lift.
Definition: town_map.h:104
static uint32 RandomRange(uint32 limit)
Pick a random number between 0 and limit - 1, inclusive.
Definition: random_func.hpp:81
static const HouseID NUM_HOUSES
Total number of houses.
Definition: house.h:29
void DrawFoundation(TileInfo *ti, Foundation f)
Draw foundation f at tile ti.
Definition: landscape.cpp:470
Forbidden.
Definition: town_type.h:94
void AddCost(const Money &cost)
Adds the given cost to the cost of the command.
Definition: command_type.h:62
Owner owner[4]
Name of the owner(s)
Definition: tile_cmd.h:53
static int RoundDivSU(int a, uint b)
Computes round(a / b) for signed a and unsigned b.
Definition: math_func.hpp:336
North.
static bool IsNeighborRoadTile(TileIndex tile, const DiagDirection dir, uint dist_multi)
Check for parallel road inside a given distance.
Definition: town_cmd.cpp:870
Rebuild the roads.
Definition: town.h:215
this house will only appear during town generation in random games, thus the historical ...
Definition: house.h:90
north and east corner are raised
Definition: slope_type.h:58
static void DoClearTownHouseHelper(TileIndex tile, Town *t, HouseID house)
Update data structures when a house is removed.
Definition: town_cmd.cpp:2529
HouseZones building_availability
where can it be built (climates, zones)
Definition: house.h:110
Class to backup a specific variable and restore it later.
Definition: backup_type.hpp:21
Called to determine the type (if any) of foundation to draw for house tile.
static void RemoveNearbyStations(Town *t, TileIndex tile, BuildingFlags flags)
Remove stations from nearby station list if a town is no longer in the catchment area of each...
Definition: town_cmd.cpp:461
Functions related to (drawing on) viewports.
Pseudo random number generator.
char company_name[64]
The name of the company.
Definition: news_type.h:149
byte population
population (Zero on other tiles in multi tile house.)
Definition: house.h:102
static byte GetHouseBuildingStage(TileIndex t)
House Construction Scheme.
Definition: town_map.h:183
uint32 goal[NUM_TE]
Amount of cargo required for the town to grow.
Definition: town.h:77
Invalid cargo type.
Definition: cargo_type.h:68
CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlag flags)
Checks whether the local authority allows construction of a new station (rail, road, airport, dock) on the given tile.
Definition: town_cmd.cpp:3421
static bool IsHouseCompleted(TileIndex t)
Get the completion of this house.
Definition: town_map.h:145
int16 y
The y value of the coordinate.
Definition: map_type.h:59
Slope GetTileSlope(TileIndex tile, int *h)
Return the slope of a given tile inside the map.
Definition: tile_map.cpp:59
CommandCost CmdExpandTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Expand a town (scenario editor only).
Definition: town_cmd.cpp:2788
static void AnimateTile_Town(TileIndex tile)
Animate a tile for a town Only certain houses can be animated The newhouses animation supersedes regu...
Definition: town_cmd.cpp:334
static const size_t MAX_SIZE
Make template parameter accessible from outside.
Definition: pool_type.hpp:85
static bool IsValidTile(TileIndex tile)
Checks if a tile is valid.
Definition: tile_map.h:161
bool exclusive_rights
allow buying exclusive rights
static bool IsInsideMM(const T x, const size_t min, const size_t max)
Checks if a value is in an interval.
Definition: math_func.hpp:264
static bool IsBridgeAbove(TileIndex t)
checks if a bridge is set above the ground of this tile
Definition: bridge_map.h:45
TownActions
Town actions of a company.
Definition: town.h:209
Bit number for setting this roadtype as not house friendly.
Definition: road.h:41
Fake town GrfSpecFeature for NewGRF debugging (parent scope)
Definition: newgrf.h:89
Critical errors, the MessageBox is shown in all cases.
Definition: error.h:24
town buildings
Definition: transparency.h:25
static bool IsTileOwner(TileIndex tile, Owner owner)
Checks if a tile belongs to the given owner.
Definition: tile_map.h:214
static void DrawTile_Town(TileInfo *ti)
House Tile drawing handler.
Definition: town_cmd.cpp:255
static uint TileHash2Bit(uint x, uint y)
Get the last two bits of the TileHash from a tile position.
Definition: tile_map.h:334
void UpdateAirportsNoise()
Recalculate the noise generated by the airports of each town.
uint max_dist
holds the distance that tile is from the water
Definition: town_cmd.cpp:1941
Base for all objects.
static bool GrowTownWithRoad(const Town *t, TileIndex tile, RoadBits rcmd)
Grows the town with a road piece.
Definition: town_cmd.cpp:1083
Header of Action 04 "universal holder" structure and functions.
void SetDParamStr(uint n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
Definition: strings.cpp:279
90 degrees right
static byte GetHouseConstructionTick(TileIndex t)
Gets the construction stage of a house.
Definition: town_map.h:195
Tile animation!
static const RoadTypeInfo * GetRoadTypeInfo(RoadType roadtype)
Returns a pointer to the Roadtype information for a given roadtype.
Definition: road.h:224
static Slope ComplementSlope(Slope s)
Return the complement of a slope.
Definition: slope_func.h:76
TownEffect
Town growth effect when delivering cargo.
Definition: cargotype.h:24
Functions related to low-level strings.
Some methods of Pool are placed here in order to reduce compilation time and binary size...
static RoadBits DiagDirToRoadBits(DiagDirection d)
Create the road-part which belongs to the given DiagDirection.
Definition: road_func.h:96
static const int MAX_CHAR_LENGTH
Max. length of UTF-8 encoded unicode character.
Definition: strings_type.h:18
uint x
X position of the tile in unit coordinates.
Definition: tile_cmd.h:43
None of the directions are disallowed.
Definition: road_map.h:286
The tile has no ownership.
Definition: company_type.h:25
Full 4-way crossing.
Definition: road_type.h:64
static TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition: map_func.h:341
Called on the Get Tile Description for an house tile.
OrthogonalTileArea TileArea
Shorthand for the much more common orthogonal tile area.
Definition: tilearea_type.h:96
Foundation
Enumeration for Foundations.
Definition: slope_type.h:93
Types related to cheating.
Bit number for allowing towns to build this roadtype.
Definition: road.h:43
TileIndex xy
town center tile
Definition: town.h:51
static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize size, bool city, TownLayout layout, bool manual)
Does the actual town creation.
Definition: town_cmd.cpp:1668
byte mail_generation
mail generation multiplier (tile based, as the acceptances below)
Definition: house.h:106
static bool IsTileType(TileIndex tile, TileType type)
Checks if a tile is a given tiletype.
Definition: tile_map.h:150
Southeast.
static CommandCost TownCanBePlacedHere(TileIndex tile)
Checks if it&#39;s possible to place a town at given tile.
Definition: town_cmd.cpp:1749
TileIndex tile
Tile index.
Definition: tile_cmd.h:46
Functions related to errors.
static bool CheckTownBuild2x2House(TileIndex *tile, Town *t, int maxz, bool noslope)
Checks if 2x2 building is allowed here, also takes into account current town layout Also...
Definition: town_cmd.cpp:2350
CommandCost DoCommand(const CommandContainer *container, DoCommandFlag flags)
Shorthand for calling the long DoCommand with a container.
Definition: command.cpp:445
static bool CheckBuildHouseSameZ(TileIndex tile, int z, bool noslope)
Checks if a house can be built at this tile, must have the same max z as parameter.
Definition: town_cmd.cpp:2217
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold...
Definition: town_cmd.cpp:3460
The tile is leveled up to a flat slope.
Definition: slope_type.h:95
static bool CheckTownBuild2House(TileIndex *tile, Town *t, int maxz, bool noslope, DiagDirection second)
Checks if 1x2 or 2x1 building is allowed here, also takes into account current town layout Also...
Definition: town_cmd.cpp:2325
static DiagDirection RandomDiagDir()
Return a random direction.
Definition: town_cmd.cpp:245
TownSize
Supported initial town sizes.
Definition: town_type.h:19
The client is spectating.
Definition: company_type.h:35
static size_t GetPoolSize()
Returns first unused index.
Definition: pool_type.hpp:350
HouseClassID class_id
defines the class this house has (not grf file based)
Definition: house.h:119
void ChangeTownRating(Town *t, int add, int max, DoCommandFlag flags)
Changes town rating of the current company.
Definition: town_cmd.cpp:3539
Information about GRF, used in the game and (part of it) in savegames.
Original algorithm (quadratic cargo by population)
Definition: town_type.h:103
Simple pair of data.
static bool IsUniqueTownName(const char *name)
Verifies this custom name is unique.
Definition: town_cmd.cpp:1774
size_t Count() const
Get number of elements stored in tree.
Definition: kdtree.hpp:433
int16 ratings[MAX_COMPANIES]
ratings of each company for this town
Definition: town.h:73
Generate towns.
Definition: genworld.h:72
Fund new buildings.
Definition: town.h:217
static bool HasTownOwnedRoad(TileIndex t)
Checks if given tile has town owned road.
Definition: road_map.h:279
East.
static TownID GetTownIndex(TileIndex t)
Get the index of which town this house/street is attached to.
Definition: town_map.h:22
const StationList * GetStations()
Run a tile loop to find stations around a tile, on demand.
Functions related to NewGRF houses.
bool ConvertBooleanCallback(const GRFFile *grffile, uint16 cbid, uint16 cb_res)
Converts a callback result into a boolean.
static DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
custom cargo production
DoCommandFlag
List of flags for a command.
Definition: command_type.h:344
char * GetTownName(char *buff, const TownNameParams *par, uint32 townnameparts, const char *last)
Fills buffer with specified town name.
Definition: townname.cpp:49
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:79
bool Succeeded() const
Did this command succeed?
Definition: command_type.h:150
rating needed, "Permissive" difficulty settings
Definition: town_type.h:66
General news (from towns)
Definition: news_type.h:36
static uint GetNormalGrowthRate(Town *t)
Calculates town growth rate in normal conditions (custom growth rate not set).
Definition: town_cmd.cpp:3321
void DeleteAnimatedTile(TileIndex tile)
Removes the given tile from the animated tile table.
Definition of base types and functions in a cross-platform compatible way.
when a town grows, all companies have rating increased a bit ...
Definition: town_type.h:52
static void PostDestructor(size_t index)
Invalidating of the "nearest town cache" has to be done after removing item from the pool...
Definition: town_cmd.cpp:153
Road at the two southern edges.
Definition: road_type.h:61
static const uint MAX_LENGTH_COMPANY_NAME_CHARS
The maximum length of a company name in characters including &#39;\0&#39;.
Definition: company_type.h:40
Map accessors for object tiles.
#define TILE_ADDXY(tile, x, y)
Adds a given offset to a tile.
Definition: map_func.h:258
A number of safeguards to prevent using unsafe methods.
StationList stations_near
NOSAVE: List of nearby stations.
Definition: town.h:83
Road at the two eastern edges.
Definition: road_type.h:60
bool value
tells if the bool cheat is active or not
Definition: cheat_type.h:18
int16 x
The x value of the coordinate.
Definition: map_type.h:58
Number of available town sizes.
Definition: town_type.h:25
bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, void *user_data)
Function performing a search around a center tile and going outward, thus in circle.
Definition: map.cpp:258
static Town * GetRandom()
Return a random valid town.
Definition: town_cmd.cpp:181
Water tile.
Definition: tile_type.h:47
Allowed, with custom town layout.
Definition: town_type.h:96
uint y
Y position of the tile in unit coordinates.
Definition: tile_cmd.h:44
static bool RoadTypesAllowHouseHere(TileIndex t)
Checks whether at least one surrounding roads allows to build a house here.
Definition: town_cmd.cpp:1167
static byte GetLiftPosition(TileIndex t)
Get the position of the lift on this animated house.
Definition: town_map.h:125
static bool IsRoadDepotTile(TileIndex t)
Return whether a tile is a road depot tile.
Definition: road_map.h:115
RoadBits
Enumeration for the road parts on a tile.
Definition: road_type.h:50
Geometric 3x3 grid algorithm.
Definition: town_type.h:83
BuildingCounts< uint16 > building_counts
The number of each type of building in the town.
Definition: town.h:46
An object, such as transmitter, on the map.
Definition: object_base.h:23
rating needed, "Permissive" difficulty settings
Definition: town_type.h:59
Bit-counted algorithm (normal distribution from individual house population)
Definition: town_type.h:104
Empty reference.
Definition: news_type.h:50
static bool IsValidDiagDirection(DiagDirection d)
Checks if an integer value is a valid DiagDirection.
No road-part is build.
Definition: road_type.h:51
bool fund_roads
allow funding local road reconstruction
char * stredup(const char *s, const char *last)
Create a duplicate of the given string.
Definition: string.cpp:136
delete a town
Definition: command_type.h:269
Number of available town actions.
Definition: town.h:221
CommandCost CmdTownGrowthRate(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Change the growth rate of the town.
Definition: town_cmd.cpp:2719
Extended original algorithm (min. 2 distance between roads)
Definition: town_type.h:81
Normal news item. (Newspaper with text only)
Definition: news_type.h:78
decides allowance of autosloping
static DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta)
Applies a difference on a DiagDirection.
don&#39;t allow building on water
Definition: command_type.h:349
... up to RATING_MEDIOCRE
Definition: town_type.h:53
static bool FindFurthestFromWater(TileIndex tile, void *user_data)
CircularTileSearch callback; finds the tile furthest from any water.
Definition: town_cmd.cpp:1961
uint16 max_speed
Maximum speed for vehicles travelling on this road type.
Definition: road.h:139
North-east part.
Definition: road_type.h:55
static void IncHouseConstructionTick(TileIndex t)
Sets the increment stage of a house It is working with the whole counter + stage 5 bits...
Definition: town_map.h:208
uint32 GetWorldPopulation()
Determines the world population Basically, count population of all towns, one by one.
Definition: town_cmd.cpp:447
South.
Tstorage new_max
Maximum amount this month.
Definition: town_type.h:114
This structure is the same for both Industries and Houses.
Definition: sprite.h:67
Money GetRemovalCost() const
Get the cost for removing this house.
Definition: town_cmd.cpp:212
static bool GrowTown(Town *t)
Grow the town.
Definition: town_cmd.cpp:1549
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
Definition: viewport.cpp:1938
static DoCommandFlag CommandFlagsToDCFlags(CommandFlags cmd_flags)
Extracts the DC flags needed for DoCommand from the flags returned by GetCommandFlags.
Definition: command_func.h:58
TileIndexDiff GetHouseNorthPart(HouseID &house)
Determines if a given HouseID is part of a multitile house.
Definition: town_cmd.cpp:2546
Structure for storing data while searching the best place to build a statue.
Definition: town_cmd.cpp:2983
Station view; Window numbers:
Definition: window_type.h:338
StringID building_name
building name
Definition: house.h:104
static bool TestTownOwnsBridge(TileIndex tile, const Town *t)
Check if a town &#39;owns&#39; a bridge.
Definition: town_cmd.cpp:85
CommandCost CmdDeleteTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Delete a town (scenario editor or worldgen only).
Definition: town_cmd.cpp:2828
#define lengthof(x)
Return the length of an fixed size array.
Definition: depend.cpp:40
bit mask containing all &#39;simple&#39; slopes
Definition: slope_type.h:61
static uint TileHash(uint x, uint y)
Calculate a hash value from a tile position.
Definition: tile_map.h:316
static bool IsWaterTile(TileIndex t)
Is it a water tile with plain water?
Definition: water_map.h:184
CommandCost CmdTownRating(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Change the rating of a company in a town.
Definition: town_cmd.cpp:2759
static T min(const T a, const T b)
Returns the minimum of two values.
Definition: math_func.hpp:40
#define MAX_UVALUE(type)
The largest value that can be entered in a variable.
Definition: stdafx.h:469
static Foundation FlatteningFoundation(Slope s)
Returns the foundation needed to flatten a slope.
Definition: slope_func.h:369
static bool EconomyIsInRecession()
Is the economy in recession?
Definition: economy_func.h:47
void FillData(const struct Company *c, const struct Company *other=nullptr)
Fill the CompanyNewsInformation struct with the required data.
static void SetLiftDestination(TileIndex t, byte dest)
Set the new destination of the lift for this animated house, and activate the LiftHasDestination bit...
Definition: town_map.h:93
RoadBits CleanUpRoadBits(const TileIndex tile, RoadBits org_rb)
Clean up unnecessary RoadBits of a planned tile.
Definition: road.cpp:47
Functions related to autoslope.
Year max_year
last year it can be built
Definition: house.h:101
static DiagDirection GetTunnelBridgeDirection(TileIndex t)
Get the direction pointing to the other end.
static bool IsPlainRailTile(TileIndex t)
Checks whether the tile is a rail tile or rail tile with signals.
Definition: rail_map.h:60
byte number_towns
the amount of towns
Definition: settings_type.h:55
bool Convert8bitBooleanCallback(const GRFFile *grffile, uint16 cbid, uint16 cb_res)
Converts a callback result into a boolean.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
static bool AutoslopeEnabled()
Tests if autoslope is enabled for _current_company.
Definition: autoslope.h:44
uint DistanceFromEdge(TileIndex tile)
Param the minimum distance to an edge.
Definition: map.cpp:217
static bool GrowTownAtRoad(Town *t, TileIndex tile)
Returns "growth" if a house was built, or no if the build failed.
Definition: town_cmd.cpp:1453
bool build_on_slopes
allow building on slopes
bool Failed() const
Did this command fail?
Definition: command_type.h:159
const struct SpriteGroup * spritegroup[Tcnt]
pointer to the different sprites of the entity
HouseZonesBits GetTownRadiusGroup(const Town *t, TileIndex tile)
Returns the bit corresponding to the town zone of the specified tile.
Definition: town_cmd.cpp:2119
BuildingFlags building_flags
some flags that describe the house (size, stadium etc...)
Definition: house.h:109
a steep slope falling to east (from west)
Definition: slope_type.h:66
static Axis GetBridgeAxis(TileIndex t)
Get the axis of the bridge that goes over the tile.
Definition: bridge_map.h:68
void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int w, int h, int dz, int z, bool transparent, int bb_offset_x, int bb_offset_y, int bb_offset_z, const SubSprite *sub)
Draw a (transparent) sprite at given coordinates with a given bounding box.
Definition: viewport.cpp:659
uint8 town_growth_rate
town growth rate
bool has_newhouses
Set if there are any newhouses loaded.
Definition: newgrf.h:177
Empty action set.
Definition: town.h:210
#define return_cmd_error(errcode)
Returns from a function with a specific StringID as error.
Definition: command_func.h:33
static void SetRoadOwner(TileIndex t, RoadTramType rtt, Owner o)
Set the owner of a specific road type.
Definition: road_map.h:250
Town * CalcClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest to the given tile within threshold.
Definition: town_cmd.cpp:3442
Number of town checking action types.
Definition: town.h:163
Base class for all pools.
Definition: pool_type.hpp:81
static T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition: math_func.hpp:137
North-west part.
Definition: road_type.h:52
static bool IsSea(TileIndex t)
Is it a sea water tile?
Definition: water_map.h:152
Company news item. (Newspaper with face)
Definition: news_type.h:80
Road related functions.
static bool IsRoadAllowedHere(Town *t, TileIndex tile, DiagDirection dir)
Check if a Road is allowed on a given tile.
Definition: town_cmd.cpp:904
Determine whether the house can be built on the specified tile.
static bool Chance16(const uint a, const uint b)
Flips a coin with given probability.
South-east part.
Definition: road_type.h:54
int tile_count
Number of tiles tried.
Definition: town_cmd.cpp:2985
uint16 override
id of the entity been replaced by
uint16 _tick_counter
Ever incrementing (and sometimes wrapping) tick counter for setting off various events.
Definition: date.cpp:29
uint64 dparam[2]
Parameters of the str string.
Definition: tile_cmd.h:62
uint GetClosestWaterDistance(TileIndex tile, bool water)
Finds the distance for the closest tile with water/land given a tile.
Definition: map.cpp:340
A pair-construct of a TileIndexDiff.
Definition: map_type.h:57
void UpdateAllStationVirtCoords()
Update the virtual coords needed to draw the station sign for all stations.
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don&#39;t get linker errors.
Definition: pool_func.hpp:224
void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
Delete a window by its class and window number (if it is open).
Definition: window.cpp:1165
static void MakeTownHouse(TileIndex t, Town *town, byte counter, byte stage, HouseID type, byte random_bits)
Write house information into the map.
Definition: town_cmd.cpp:2167
static Axis DiagDirToAxis(DiagDirection d)
Convert a DiagDirection to the axis.
static void MakeTownHouseBigger(TileIndex tile)
Make the house advance in its construction stages until completion.
Definition: town_cmd.cpp:506
static TileIndexDiff ToTileIndexDiff(TileIndexDiffC tidc)
Return the offset between to tiles from a TileIndexDiffC struct.
Definition: map_func.h:230
static TileIndex GetOtherTunnelBridgeEnd(TileIndex t)
Determines type of the wormhole and returns its other end.
char * text
General text with additional information.
Definition: town.h:79
static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY
value for custom town number in difficulty settings
Definition: town.h:26
execute the given command
Definition: command_type.h:346
Station with an airport.
Definition: station_type.h:55
Slope GetFoundationSlope(TileIndex tile, int *z)
Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation, the function returns the same as GetTileSlope.
Definition: landscape.cpp:422
static bool CleaningPool()
Returns current state of pool cleaning - yes or no.
Definition: pool_type.hpp:308
static void MakeSingleHouseBigger(TileIndex tile)
Helper function for house completion stages progression.
Definition: town_cmd.cpp:483
CommandCost CmdTownCargoGoal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Change the cargo goal of a town.
Definition: town_cmd.cpp:2662
static const uint TOWN_GROWTH_DESERT
The town needs the cargo for growth when on desert (any amount)
Definition: town.h:32
static Slope InclinedSlope(DiagDirection dir)
Returns the slope that is inclined in a specific direction.
Definition: slope_func.h:256
uint16 growth_rate
town growth rate
Definition: town.h:88
static CommandCost TownActionBuildStatue(Town *t, DoCommandFlag flags)
Perform a 9x9 tiles circular search from the center of the town in order to find a free tile to place...
Definition: town_cmd.cpp:3039
static void HaltLift(TileIndex t)
Stop the lift of this animated house from moving.
Definition: town_map.h:115
An invalid company.
Definition: company_type.h:30
Tile got trees.
Definition: tile_type.h:45
static bool CanFollowRoad(TileIndex tile, DiagDirection dir)
Checks whether a road can be followed or is a dead end, that can not be extended to the next tile...
Definition: town_cmd.cpp:1411
GRFConfig * GetGRFConfig(uint32 grfid, uint32 mask)
Retrieve a NewGRF from the current config by its grfid.
Tstorage old_max
Maximum amount last month.
Definition: town_type.h:113
static uint MapSize()
Get the size of the map.
Definition: map_func.h:92
TownEffect town_effect
The effect that delivering this cargo type has on towns. Also affects destination of subsidies...
Definition: cargotype.h:66
void ErrorUnknownCallbackResult(uint32 grfid, uint16 cbid, uint16 cb_res)
Record that a NewGRF returned an unknown/invalid callback result.
Class for storing amounts of cargo.
Definition: cargo_type.h:81
bool _generating_world
Whether we are generating the map or not.
Definition: genworld.cpp:60
Used for iterations.
Definition: road_type.h:23
TownLayout layout
town specific road layout
Definition: town.h:94
static bool IsNormalRoadTile(TileIndex t)
Return whether a tile is a normal road tile.
Definition: road_map.h:73
static void TileLoop_Town(TileIndex tile)
Tile callback function.
Definition: town_cmd.cpp:521
void DecreaseBuildingCount(Town *t, HouseID house_id)
DecreaseBuildingCount() Decrease the number of a building when it is deleted.
static T ClrBit(T &x, const uint8 y)
Clears a bit in a variable.
There can be only one church by town.
Definition: town.h:182
Town authority; Window numbers:
Definition: window_type.h:187
GUISettings gui
settings related to the GUI
Tunnel entry/exit and bridge heads.
Definition: tile_type.h:50
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:378
HouseExtraFlags extra_flags
some more flags
Definition: house.h:118
Invisible tiles at the SW and SE border.
Definition: tile_type.h:48
Reference town. Scroll to town when clicking on the news.
Definition: news_type.h:55
void Build(It begin, It end)
Clear and rebuild the tree from a new sequence of elements,.
Definition: kdtree.hpp:365
uint32 SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition: gfx_type.h:17
static bool StrEmpty(const char *s)
Check if a string buffer is empty.
Definition: string_func.h:57
int GetTileMaxZ(TileIndex t)
Get top height of the tile inside the map.
Definition: tile_map.cpp:141
static void SetLiftPosition(TileIndex t, byte pos)
Set the position of the lift on this animated house.
Definition: town_map.h:135
size_t Utf8StringLength(const char *s)
Get the length of an UTF-8 encoded string in number of characters and thus not the number of bytes th...
Definition: string.cpp:310
static CargoSpec * Get(size_t index)
Retrieve cargo details for the given cargo ID.
Definition: cargotype.h:117
Set of callback functions for performing tile operations of a given tile type.
Definition: tile_cmd.h:145
Oilrig airport.
Definition: airport.h:38
uint32 TileIndex
The index/ID of a Tile.
Definition: tile_type.h:78
Functions related to objects.
Used for iterations.
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
Definition: map.cpp:157
Cargo support for NewGRFs.
static int GetRating(const Town *t)
Get the rating of a town for the _current_company.
Definition: town_cmd.cpp:3521
static size_t GetNumItems()
Returns number of valid items in the pool.
Definition: pool_type.hpp:359
static bool FindNearestEmptyLand(TileIndex tile, void *user_data)
CircularTileSearch callback; finds the nearest land tile.
Definition: town_cmd.cpp:1983
byte minimum_life
The minimum number of years this house will survive before the town rebuilds it.
Definition: house.h:122
Buy exclusive transport rights.
Definition: town.h:218
uint16 remove_rating_decrease
rating decrease if removed
Definition: house.h:105
static HouseID GetHouseType(TileIndex t)
Get the type of this house, which is an index into the house spec array.
Definition: town_map.h:59
north and west corner are raised
Definition: slope_type.h:55
void Remove(const T &element)
Remove a single element from the tree, if it exists.
Definition: kdtree.hpp:420
static uint TileY(TileIndex tile)
Get the Y component of a tile.
Definition: map_func.h:215
Random size, bigger than small, smaller than large.
Definition: town_type.h:23
Cheat magic_bulldozer
dynamite industries, objects
Definition: cheat_type.h:27
byte town_council_tolerance
minimum required town ratings to be allowed to demolish stuff
Definition: settings_type.h:69
Date introduction_date
Introduction date.
Definition: road.h:163
The tile has no foundation, the slope remains unchanged.
Definition: slope_type.h:94
CommandCost CheckforTownRating(DoCommandFlag flags, Town *t, TownRatingCheckType type)
Does the town authority allow the (destructive) action of the current company?
Definition: town_cmd.cpp:3576
static const uint MAX_BRIDGES
Maximal number of available bridge specs.
Definition: bridge.h:34
TransportType
Available types of transport.
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
uint8 initial_city_size
multiplier for the initial size of the cities compared to towns
ObjectType type
Type of the object.
Definition: object_base.h:24
Slope
Enumeration for the slope-type.
Definition: slope_type.h:48
static bool CanBuildHouseHere(TileIndex tile, bool noslope)
Checks if a house can be built here.
Definition: town_cmd.cpp:2192
Town view; Window numbers:
Definition: window_type.h:326
Growth rate is controlled by GS.
Definition: town.h:184
A tile of a station.
Definition: tile_type.h:46
const byte _town_action_costs[TACT_COUNT]
Factor in the cost of each town action.
Definition: town_cmd.cpp:2918
TownCache cache
Container for all cacheable data.
Definition: town.h:53
uint8 larger_towns
the number of cities to build. These start off larger and grow twice as fast
static const HouseID NEW_HOUSE_OFFSET
Offset for new houses.
Definition: house.h:28
Maximum number of companies.
Definition: company_type.h:23
#define endof(x)
Get the end element of an fixed size array.
Definition: stdafx.h:384
Town data structure.
Definition: town.h:50
static RoadBits GetTownRoadGridElement(Town *t, TileIndex tile, DiagDirection dir)
Generate the RoadBits of a grid tile.
Definition: town_cmd.cpp:982
#define MAX_DAY
The number of days till the last day.
Definition: date_type.h:97
uint8 exclusive_counter
months till the exclusivity expires
Definition: town.h:72
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function() ...
Definition: pool_type.hpp:299
Transport by road vehicle.
static const uint16 TOWN_GROWTH_RATE_NONE
Special value for Town::growth_rate to disable town growth.
Definition: town.h:33
Functions related to OTTD&#39;s landscape.
static void ResetHouseAge(TileIndex t)
Sets the age of the house to zero.
Definition: town_map.h:226
byte town_name
the town name generator used for town names
static uint CountBits(T value)
Counts the number of set bits in a variable.
Base functions for all Games.
End of town effects.
Definition: cargotype.h:32
Functions related to commands.
Original algorithm (min. 1 distance between roads)
Definition: town_type.h:80
bool larger_town
if this is a larger town and should grow more quickly
Definition: town.h:93
char * name
Custom town name. If nullptr, the town was not renamed and uses the generated name.
Definition: town.h:59
Coordinates of a point in 2D.
a steep slope falling to south (from north)
Definition: slope_type.h:69
Large town.
Definition: town_type.h:22
CompanyID _current_company
Company currently doing an action.
Definition: company_cmd.cpp:45
Struct holding parameters used to generate town name.
Definition: townname_type.h:27
void DrawGroundSprite(SpriteID image, PaletteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
Draws a ground sprite for the current tile.
Definition: viewport.cpp:575
TrackedViewportSign sign
Location of name sign, UpdateVirtCoord updates this.
Definition: town.h:43
Owner owner
The owner of this station.
byte GetSnowLine()
Get the current snow line, either variable or static.
Definition: landscape.cpp:644
TownCargoGenMode town_cargogen_mode
algorithm for generating cargo from houses,
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Definition: pool_type.hpp:318
static uint TileHeight(TileIndex tile)
Returns the height of a tile.
Definition: tile_map.h:29
decides if default foundations need to be drawn
static Object * GetByTile(TileIndex tile)
Get the object associated with a tile.
Definition: object_cmd.cpp:50
build a bridge
Definition: command_type.h:181
Cargo behaves food/fizzy-drinks-like.
Definition: cargotype.h:31
static const uint MAX_LENGTH_TOWN_NAME_CHARS
The maximum length of a town name in characters including &#39;\0&#39;.
Definition: town_type.h:108
void BuildObject(ObjectType type, TileIndex tile, CompanyID owner=OWNER_NONE, struct Town *town=nullptr, uint8 view=0)
Actually build the object.
Definition: object_cmd.cpp:83
static bool TryClearTile(TileIndex tile)
Check whether the land can be cleared.
Definition: town_cmd.cpp:2974
ConstructionSettings construction
construction of things in-game
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Definition: strings_type.h:17
Functions that have tunnels and bridges in common.
static TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
Definition: map_func.h:179
static const HouseSpec _original_house_specs[]
House specifications from original data.
Definition: town_land.h:1819
Base of all industries.
static DisallowedRoadDirections GetDisallowedRoadDirections(TileIndex t)
Gets the disallowed directions.
Definition: road_map.h:301
const char * GetName() const
Get the name of this grf.
static TileIndex TileAddByDir(TileIndex tile, Direction dir)
Adds a Direction to a tile.
Definition: map_func.h:370
K-dimensional tree, specialised for 2-dimensional space.
Definition: kdtree.hpp:38
void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool transparent, const SubSprite *sub, bool scale)
Add a child sprite to a parent sprite.
Definition: viewport.cpp:815
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
Definition: depend.cpp:129
GRFFileProps grf_prop
Properties related the the grf file.
Definition: house.h:114
void ResetOverride()
Resets the override, which is used while initializing game.
const struct GRFFile * grffile
grf file that introduced this entity
StringID str
Description of the tile.
Definition: tile_cmd.h:52
Used for DoCommand-like (and some non-fatal AI GUI) errors/information.
Definition: error.h:21
uint GetMaskOfTownActions(int *nump, CompanyID cid, const Town *t)
Get a list of available actions to do at a town.
Definition: town_cmd.cpp:3164
static Foundation GetFoundation_Town(TileIndex tile, Slope tileh)
Tile callback routine.
Definition: town_cmd.cpp:310
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
Town name generator stuff.
void Restore()
Restore the variable.
DiagDirection
Enumeration for diagonal directions.
Base functions for all AIs.
Try to bribe the council.
Definition: town.h:219
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1=NR_NONE, uint32 ref1=UINT32_MAX, NewsReferenceType reftype2=NR_NONE, uint32 ref2=UINT32_MAX, void *free_data=nullptr)
Add a new newsitem to be shown.
Definition: news_gui.cpp:800
static TileIndex AlignTileToGrid(TileIndex tile, TownLayout layout)
Towns must all be placed on the same grid or when they eventually interpenetrate their road networks ...
Definition: town_cmd.cpp:1909
static const TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition: tile_type.h:83
Base of the town class.
TileIndex tile
holds the tile that was found
Definition: town_cmd.cpp:1940
static int CountActiveStations(Town *t)
Calculates amount of active stations in the range of town (HZB_TOWN_EDGE).
Definition: town_cmd.cpp:3304
TransportedCargoStat< uint32 > supplied[NUM_CARGO]
Cargo statistics about supplied cargo.
Definition: town.h:75
GameCreationSettings game_creation
settings used during the creation of a game (map)
A tile without any structures, i.e. grass, rocks, farm fields etc.
Definition: tile_type.h:41
int _nb_orig_names
Number of original town names.
A house by a town.
Definition: tile_type.h:44
Full road along the y-axis (north-west + south-east)
Definition: road_type.h:57
byte CargoID
Cargo slots to indicate a cargo type within a game.
Definition: cargo_type.h:20
bool fund_buildings
allow funding new buildings
uint DistanceSquare(TileIndex t0, TileIndex t1)
Gets the &#39;Square&#39; distance between the two given tiles.
Definition: map.cpp:174
static bool IsInvisibilitySet(TransparencyOption to)
Check if the invisibility option bit is set and if we aren&#39;t in the game menu (there&#39;s never transpar...
Definition: transparency.h:59
static Industry * GetByTile(TileIndex tile)
Get the industry of the given tile.
Definition: industry.h:114
void IncreaseBuildingCount(Town *t, HouseID house_id)
IncreaseBuildingCount() Increase the count of a building when it has been added by a town...
Window functions not directly related to making/drawing windows.
~Town()
Destroy the town.
Definition: town_cmd.cpp:101
Called to determine how much cargo a town building produces.
void SetGeneratingWorldProgress(GenWorldProgress cls, uint total)
Set the total of a stage of the world generation.
uint32 num_houses
Amount of houses.
Definition: town.h:41
a steep slope falling to west (from east)
Definition: slope_type.h:68
GRFLoadedFeatures _loaded_newgrf_features
Indicates which are the newgrf features currently loaded ingame.
Definition: newgrf.cpp:81
Conditions for town growth are met. Grow according to Town::growth_rate.
Definition: town.h:181
town rating does not disallow you from building
Definition: command_type.h:351
decide whether the house can be built on a given tile
#define TILE_ADD(x, y)
Adds to tiles together.
Definition: map_func.h:244
SpriteID sprite
The &#39;real&#39; sprite.
Definition: gfx_type.h:23
Called to decide how much cargo a town building can accept.
static bool SearchTileForStatue(TileIndex tile, void *user_data)
Search callback function for TownActionBuildStatue.
Definition: town_cmd.cpp:2996
void SetWindowClassesDirty(WindowClass cls)
Mark all windows of a particular class as dirty (in need of repainting)
Definition: window.cpp:3246
static void SetDParamX(uint64 *s, uint n, uint64 v)
Set a string parameter v at index n in a given array s.
Definition: strings_func.h:189
static const uint CALLBACK_HOUSEPRODCARGO_END
Sentinel indicating that the loop for CBID_HOUSE_PRODUCE_CARGO has ended.
Functions related to news.
Structure contains cached list of stations nearby.
Definition: station_type.h:100
CommandCost CmdTownSetText(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Set a custom text in the Town window.
Definition: town_cmd.cpp:2695
byte road_build_months
fund road reconstruction in action?
Definition: town.h:91
CommandCost CmdRenameTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Rename a town (server-only).
Definition: town_cmd.cpp:2611
Base classes/functions for stations.
bool kdtree_valid
Are the sign data valid for use with the _viewport_sign_kdtree?
Definition: viewport_type.h:58
static void SetTownIndex(TileIndex t, TownID index)
Set the town index for a road or house tile.
Definition: town_map.h:34
void IncreaseGeneratingWorldProgress(GenWorldProgress cls)
Increases the current stage of the world generation with one.
Date _date
Current date in days (day counter)
Definition: date.cpp:27
void Insert(const T &element)
Insert a single element in the tree.
Definition: kdtree.hpp:401
90 degrees left
static Point RemapCoords2(int x, int y)
Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap...
Definition: landscape.h:98
CompanyID exclusivity
which company has exclusivity
Definition: town.h:71
bool allow_town_level_crossings
towns are allowed to build level crossings
the south corner of the tile is raised
Definition: slope_type.h:51
uint16 grow_counter
counter to count when to grow, value is smaller than or equal to growth_rate
Definition: town.h:87
The object is owned by a superuser / goal script.
Definition: company_type.h:27
void DeleteNewGRFInspectWindow(GrfSpecFeature feature, uint index)
Delete inspect window for a given feature and index.
Class for backupping variables and making sure they are restored later.
static uint16 ClampToU16(const uint64 a)
Reduce an unsigned 64-bit int to an unsigned 16-bit one.
Definition: math_func.hpp:213
Station data structure.
Definition: station_base.h:450
static bool IsTransparencySet(TransparencyOption to)
Check if the transparency option bit is set and if we aren&#39;t in the game menu (there&#39;s never transpar...
Definition: transparency.h:48
static bool IsRoadDepot(TileIndex t)
Return whether a tile is a road depot.
Definition: road_map.h:105
Functions related to subsidies.
CommandCost CmdFoundTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Create a new town.
Definition: town_cmd.cpp:1795
static bool IsTileAlignedToGrid(TileIndex tile, TownLayout layout)
Towns must all be placed on the same grid or when they eventually interpenetrate their road networks ...
Definition: town_cmd.cpp:1927
static TileIndex TileXY(uint x, uint y)
Returns the TileIndex of a coordinate.
Definition: map_func.h:163
static TileIndexDiffC TileIndexToTileIndexDiffC(TileIndex tile_a, TileIndex tile_b)
Returns the diff between two tiles.
Definition: map_func.h:316
static void UpdateTownGrowCounter(Town *t, uint16 prev_growth_rate)
Updates town grow counter after growth rate change.
Definition: town_cmd.cpp:3289
static void IncrementHouseAge(TileIndex t)
Increments the age of the house.
Definition: town_map.h:237
const CargoSpec * FindFirstCargoWithTownEffect(TownEffect effect)
Determines the first cargo with a certain town effect.
Definition: town_cmd.cpp:2642
a steep slope falling to north (from south)
Definition: slope_type.h:67
const TileTypeProcs _tile_type_town_procs
Tile callback functions for a town.
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
Definition: window.cpp:3319
RoadTypeLabel label
Unique 32 bit road type identifier.
Definition: road.h:144
Tstorage old_act
Actually transported last month.
Definition: town_type.h:115
CompanyMask have_ratings
which companies have a rating
Definition: town.h:69
byte HighestSnowLine()
Get the highest possible snow line height, either variable or static.
Definition: landscape.cpp:658
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition: gfx.cpp:1600
Southwest.
Cheats _cheats
All the cheats.
Definition: cheat.cpp:16
static int GetTileMaxPixelZ(TileIndex tile)
Get top height of the tile.
Definition: tile_map.h:304
Road at the two northern edges.
Definition: road_type.h:59
Road at the two western edges.
Definition: road_type.h:62
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings_func.h:199
PaletteID pal
The palette (use PAL_NONE) if not needed)
Definition: gfx_type.h:24
void SetTownRatingTestMode(bool mode)
Switch the town rating to test-mode, to allow commands to be tested without affecting current ratings...
Definition: town_cmd.cpp:3501