OpenTTD Source 20260311-master-g511d3794ce
town.h
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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#ifndef TOWN_H
11#define TOWN_H
12
13#include "misc/history_type.hpp"
14#include "viewport_type.h"
16#include "town_map.h"
17#include "subsidy_type.h"
18#include "newgrf_storage.h"
19#include "cargotype.h"
20
21template <typename T>
23 std::vector<T> id_count{};
24 std::vector<T> class_count{};
25
26 auto operator<=>(const BuildingCounts &) const = default;
27};
28
29static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY = 4;
30static const uint CUSTOM_TOWN_MAX_NUMBER = 5000;
31
32static const uint TOWN_GROWTH_WINTER = 0xFFFFFFFE;
33static const uint TOWN_GROWTH_DESERT = 0xFFFFFFFF;
34static const uint16_t TOWN_GROWTH_RATE_NONE = 0xFFFF;
35static const uint16_t MAX_TOWN_GROWTH_TICKS = 930;
36
37typedef Pool<Town, TownID, 64> TownPool;
38extern TownPool _town_pool;
39
41enum class TownFlag : uint8_t {
46};
47
48using TownFlags = EnumBitSet<TownFlag, uint8_t>;
49
51struct TownCache {
52 uint32_t num_houses = 0;
53 uint32_t population = 0;
55 PartsOfSubsidy part_of_subsidy{};
56 std::array<uint32_t, NUM_HOUSE_ZONES> squared_town_zone_radius{};
58
59 auto operator<=>(const TownCache &) const = default;
60};
61
63struct Town : TownPool::PoolItem<&_town_pool> {
65
67
70 uint32_t townnamegrfid = 0;
71 uint16_t townnametype = 0;
72 uint32_t townnameparts = 0;
73 std::string name{};
74 mutable std::string cached_name{};
76
77 TownFlags flags{};
78
79 uint16_t noise_reached = 0;
80
82
83 /* Company ratings. */
86 CompanyID exclusivity = CompanyID::Invalid();
87 uint8_t exclusive_counter = 0;
89
91 uint32_t production = 0;
92 uint32_t transported = 0;
93
94 uint8_t PctTransported() const
95 {
96 if (this->production == 0) return 0;
97 return ClampTo<uint8_t>(this->transported * 256 / this->production);
98 }
99 };
100
101 struct SuppliedCargo {
102 CargoType cargo = INVALID_CARGO;
104
105 SuppliedCargo() = default;
106 SuppliedCargo(CargoType cargo) : cargo(cargo) {}
107 };
108
109 using SuppliedCargoes = std::vector<SuppliedCargo>;
110
111 SuppliedCargoes supplied{};
112 std::array<TransportedCargoStat<uint16_t>, NUM_TAE> received{};
113 std::array<uint32_t, NUM_TAE> goal{};
115
117
118 inline SuppliedCargo &GetOrCreateCargoSupplied(CargoType cargo)
119 {
120 assert(IsValidCargoType(cargo));
121 auto it = std::ranges::lower_bound(this->supplied, cargo, std::less{}, &SuppliedCargo::cargo);
122 if (it == std::end(this->supplied) || it->cargo != cargo) it = this->supplied.emplace(it, cargo);
123 return *it;
124 }
125
126 inline SuppliedCargoes::const_iterator GetCargoSupplied(CargoType cargo) const
127 {
128 if (!IsValidCargoType(cargo)) return std::end(this->supplied);
129 auto it = std::ranges::lower_bound(this->supplied, cargo, std::less{}, &SuppliedCargo::cargo);
130 if (it == std::end(this->supplied) || it->cargo != cargo) return std::end(supplied);
131 return it;
132 }
133
134 inline uint8_t GetPercentTransported(CargoType cargo_type) const
135 {
136 auto it = this->GetCargoSupplied(cargo_type);
137 if (it == std::end(this->supplied)) return 0;
138
139 return it->history[LAST_MONTH].PctTransported();
140 }
141
143
144 uint16_t time_until_rebuild = 0;
145
146 uint16_t grow_counter = 0;
147 uint16_t growth_rate = 0;
148
150 uint8_t road_build_months = 0;
151
152 bool larger_town = false;
154
155 bool show_zone = false;
156
157 std::vector<PersistentStorage *> psa_list{};
158
164 Town(TownID index, TileIndex tile = INVALID_TILE) : TownPool::PoolItem<&_town_pool>(index), xy(tile) { }
165
167 ~Town();
168
170
177 inline uint16_t MaxTownNoise() const
178 {
179 if (this->cache.population == 0) return 0; // no population? no noise
180
181 /* 3 is added (the noise of the lowest airport), so the user can at least build a small airfield. */
182 return ClampTo<uint16_t>((this->cache.population / _settings_game.economy.town_noise_population[_settings_game.difficulty.town_council_tolerance]) + 3);
183 }
184
185 void UpdateVirtCoord();
186
187 inline const std::string &GetCachedName() const
188 {
189 if (!this->name.empty()) return this->name;
190 if (this->cached_name.empty()) this->FillCachedName();
191 return this->cached_name;
192 }
193
194 static inline Town *GetByTile(TileIndex tile)
195 {
196 return Town::Get(GetTownIndex(tile));
197 }
198
199 static Town *GetRandom();
200 static void PostDestructor(size_t index);
201
202private:
203 void FillCachedName() const;
204};
205
206uint32_t GetWorldPopulation();
207
210void ShowTownViewWindow(TownID town);
211void ExpandTown(Town *t);
212
213void RebuildTownKdtree();
214
217 TOWN_COUNCIL_LENIENT = 0,
218 TOWN_COUNCIL_TOLERANT = 1,
219 TOWN_COUNCIL_HOSTILE = 2,
220 TOWN_COUNCIL_PERMISSIVE = 3,
221};
222
232
235 TDIWD_FORCE_REBUILD,
236 TDIWD_POPULATION_CHANGE,
237 TDIWD_FORCE_RESORT,
238};
239
240CommandCost CheckforTownRating(DoCommandFlags flags, Town *t, TownRatingCheckType type);
241
242
244
245Town *CalcClosestTownFromTile(TileIndex tile, uint threshold = UINT_MAX);
246
247void ResetHouses();
248
261using TownActions = EnumBitSet<TownAction, uint8_t>;
262
264
265void ClearTownHouse(Town *t, TileIndex tile);
266void UpdateTownMaxPass(Town *t);
267void UpdateTownRadius(Town *t);
268CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlags flags);
269Town *ClosestTownFromTile(TileIndex tile, uint threshold);
270void ChangeTownRating(Town *t, int add, int max, DoCommandFlags flags);
272void SetTownRatingTestMode(bool mode);
273TownActions GetMaskOfTownActions(CompanyID cid, const Town *t);
275bool GenerateTowns(TownLayout layout, std::optional<uint> number = std::nullopt);
278
279uint8_t GetTownActionCost(TownAction action);
280
286template <class T>
288{
289 /* We only want to set names if it hasn't been set before, or when we're calling from afterload. */
290 assert(obj->name.empty() || obj->town_cn == UINT16_MAX);
291
292 obj->town = ClosestTownFromTile(obj->xy, UINT_MAX);
293
294 /* Find first unused number belonging to this town. This can never fail,
295 * as long as there can be at most 65535 waypoints/depots in total.
296 *
297 * This does 'n * m' search, but with 32bit 'used' bitmap, it needs at
298 * most 'n * (1 + ceil(m / 32))' steps (n - number of waypoints in pool,
299 * m - number of waypoints near this town).
300 * Usually, it needs only 'n' steps.
301 *
302 * If it wasn't using 'used' and 'idx', it would just search for increasing 'next',
303 * but this way it is faster */
304
305 uint32_t used = 0; // bitmap of used waypoint numbers, sliding window with 'next' as base
306 uint32_t next = 0; // first number in the bitmap
307 uint32_t idx = 0; // index where we will stop
308 uint32_t cid = 0; // current index, goes to T::GetPoolSize()-1, then wraps to 0
309
310 do {
311 T *lobj = T::GetIfValid(cid);
312
313 /* check only valid waypoints... */
314 if (lobj != nullptr && obj != lobj) {
315 /* only objects within the same city and with the same type */
316 if (lobj->town == obj->town && lobj->IsOfType(obj)) {
317 /* if lobj->town_cn < next, uint will overflow to '+inf' */
318 uint i = (uint)lobj->town_cn - next;
319
320 if (i < 32) {
321 SetBit(used, i); // update bitmap
322 if (i == 0) {
323 /* shift bitmap while the lowest bit is '1';
324 * increase the base of the bitmap too */
325 do {
326 used >>= 1;
327 next++;
328 } while (HasBit(used, 0));
329 /* when we are at 'idx' again at end of the loop and
330 * 'next' hasn't changed, then no object had town_cn == next,
331 * so we can safely use it */
332 idx = cid;
333 }
334 }
335 }
336 }
337
338 cid++;
339 if (cid == T::GetPoolSize()) cid = 0; // wrap to zero...
340 } while (cid != idx);
341
342 obj->town_cn = (uint16_t)next; // set index...
343}
344
345/*
346 * Converts original town ticks counters to plain game ticks. Note that
347 * tick 0 is a valid tick so actual amount is one more than the counter value.
348 */
349inline uint16_t TownTicksToGameTicks(uint16_t ticks)
350{
351 return (std::min(ticks, MAX_TOWN_GROWTH_TICKS) + 1) * Ticks::TOWN_GROWTH_TICKS - 1;
352}
353
354
356bool CheckTownRoadTypes();
357std::span<const DrawBuildingsTileStruct> GetTownDrawTileData();
358
359#endif /* TOWN_H */
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
uint8_t CargoType
Cargo slots to indicate a cargo type within a game.
Definition cargo_type.h:21
bool IsValidCargoType(CargoType cargo)
Test whether cargo type is not INVALID_CARGO.
Definition cargo_type.h:108
Types/functions related to cargoes.
TownAcceptanceEffect
Town growth effect when delivering cargo.
Definition cargotype.h:22
@ NUM_TAE
Amount of town effects.
Definition cargotype.h:31
Common return value for all commands.
Container for an encoded string, created by GetEncodedString.
Enum-as-bit-set wrapper.
static constexpr TimerGameTick::Ticks TOWN_GROWTH_TICKS
Cycle duration for towns trying to grow (this originates from the size of the town array in TTD).
A sort-of mixin that implements 'at(pos)' and 'operator[](pos)' only for a specific type.
#define T
Climate temperate.
Definition engines.h:91
#define DECLARE_INCREMENT_DECREMENT_OPERATORS(enum_type)
For some enums it is useful to have pre/post increment/decrement operators.
Definition enum_type.hpp:86
Types for storing historical data.
std::array< T, HISTORY_RECORDS > HistoryData
Container type for storing history data.
uint64_t ValidHistoryMask
Mask of valid history records.
HouseZone
Concentric rings of zoning around the centre of a town.
Definition house.h:57
uint16_t HouseID
OpenTTD ID of house types.
Definition house_type.h:15
int32_t TileIndexDiff
An offset value between two tiles.
Definition map_type.h:23
constexpr To ClampTo(From value)
Clamp the given value down to lie within the requested type.
Functionality related to the temporary and persistent storage arrays for NewGRFs.
RoadType
The different roadtypes we support.
Definition road_type.h:23
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
std::set< Station *, StationCompare > StationList
List of stations.
Class for storing amounts of cargo.
Definition cargo_type.h:115
Specification of a cargo type.
Definition cargotype.h:74
static Town * Get(auto index)
Base class for all pools.
Data structure with cached data of towns.
Definition town.h:51
uint32_t population
Current population of people.
Definition town.h:53
uint32_t num_houses
Amount of houses.
Definition town.h:52
TrackedViewportSign sign
Location of name sign, UpdateVirtCoord updates this.
Definition town.h:54
BuildingCounts< uint16_t > building_counts
The number of each type of building in the town.
Definition town.h:57
std::array< uint32_t, NUM_HOUSE_ZONES > squared_town_zone_radius
UpdateTownRadius updates this given the house count.
Definition town.h:56
PartsOfSubsidy part_of_subsidy
Is this town a source/destination of a subsidy?
Definition town.h:55
uint32_t transported
Total transported.
Definition town.h:92
uint32_t production
Total produced.
Definition town.h:91
Town data structure.
Definition town.h:63
EncodedString text
General text with additional information.
Definition town.h:116
bool larger_town
if this is a larger town and should grow more quickly
Definition town.h:152
CompanyMask statues
which companies have a statue?
Definition town.h:81
uint16_t time_until_rebuild
time until we rebuild a house
Definition town.h:144
std::string cached_name
NOSAVE: Cache of the resolved name of the town, if not using a custom town name.
Definition town.h:74
TileIndex xy
town center tile
Definition town.h:64
uint8_t fund_buildings_months
fund buildings program in action?
Definition town.h:149
uint16_t noise_reached
level of noise that all the airports are generating
Definition town.h:79
SuppliedCargoes supplied
Cargo statistics about supplied cargo.
Definition town.h:111
TownLayout layout
town specific road layout
Definition town.h:153
uint16_t MaxTownNoise() const
Calculate the max town noise.
Definition town.h:177
static Town * GetRandom()
Return a random valid town.
Definition town_cmd.cpp:204
std::string name
Custom town name. If empty, the town was not renamed and uses the generated name.
Definition town.h:73
Town(TownID index, TileIndex tile=INVALID_TILE)
Creates a new town.
Definition town.h:164
uint16_t grow_counter
counter to count when to grow, value is smaller than or equal to growth_rate
Definition town.h:146
uint32_t townnameparts
Custom town name. If empty, the town was not renamed and uses the generated name.
Definition town.h:72
TownFlags flags
See TownFlags.
Definition town.h:77
TownCache cache
Container for all cacheable data.
Definition town.h:66
TypedIndexContainer< std::array< uint8_t, MAX_COMPANIES >, CompanyID > unwanted
how many months companies aren't wanted by towns (bribe)
Definition town.h:85
CompanyID exclusivity
which company has exclusivity
Definition town.h:86
ValidHistoryMask valid_history
Mask of valid history records.
Definition town.h:114
void InitializeLayout(TownLayout layout)
Assign the town layout.
Definition town_cmd.cpp:190
bool show_zone
NOSAVE: mark town to show the local authority zone in the viewports.
Definition town.h:155
uint8_t exclusive_counter
months till the exclusivity expires
Definition town.h:87
void UpdateVirtCoord()
Resize the sign (label) of the town after it changes population.
Definition town_cmd.cpp:387
CompanyMask have_ratings
which companies have a rating
Definition town.h:84
~Town()
Destroy the town.
Definition town_cmd.cpp:115
TypedIndexContainer< std::array< int16_t, MAX_COMPANIES >, CompanyID > ratings
ratings of each company for this town
Definition town.h:88
uint16_t growth_rate
town growth rate
Definition town.h:147
uint32_t townnamegrfid
Custom town name. If empty, the town was not renamed and uses the generated name.
Definition town.h:70
StationList stations_near
NOSAVE: List of nearby stations.
Definition town.h:142
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:175
uint8_t road_build_months
fund road reconstruction in action?
Definition town.h:150
uint16_t townnametype
Custom town name. If empty, the town was not renamed and uses the generated name.
Definition town.h:71
std::array< TransportedCargoStat< uint16_t >, NUM_TAE > received
Cargo statistics about received cargotypes.
Definition town.h:112
std::array< uint32_t, NUM_TAE > goal
Amount of cargo required for the town to grow.
Definition town.h:113
Specialised ViewportSign that tracks whether it is valid for entering into a Kdtree.
Basic types related to subsidies.
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition tile_type.h:92
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
Definition tile_type.h:100
Definition of the tick-based game-timer.
static const uint TOWN_GROWTH_WINTER
The town only needs this cargo in the winter (any amount).
Definition town.h:32
void ChangeTownRating(Town *t, int add, int max, DoCommandFlags flags)
Changes town rating of the current company.
void ResetHouses()
Reset and initialise house specs.
TownRatingCheckType
Action types that a company must ask permission for to a town authority.
Definition town.h:227
@ TunnelBridgeRemove
Removal of a tunnel or bridge owned by the town.
Definition town.h:229
@ RoadRemove
Removal of a road owned by the town.
Definition town.h:228
@ End
End marker.
Definition town.h:230
TileIndexDiff GetHouseNorthPart(HouseID &house)
Determines if a given HouseID is part of a multitile house.
uint GetDefaultTownsForMapSize()
Calculate the number of towns which should be on the map according to the current "town density" newg...
void ClearTownHouse(Town *t, TileIndex tile)
Clear a town house.
TownActions GetMaskOfTownActions(CompanyID cid, const Town *t)
Get a list of available town authority actions.
const CargoSpec * FindFirstCargoWithTownAcceptanceEffect(TownAcceptanceEffect effect)
Determines the first cargo with a certain town effect.
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold.
static const uint TOWN_GROWTH_DESERT
The town needs the cargo for growth when on desert (any amount).
Definition town.h:33
TownDirectoryInvalidateWindowData
Special values for town list window for the data parameter of InvalidateWindowData.
Definition town.h:234
bool GenerateTowns(TownLayout layout, std::optional< uint > number=std::nullopt)
Generate a number of towns with a given layout.
uint32_t GetWorldPopulation()
Get the total population, the sum of all towns in the world.
Definition town_cmd.cpp:446
static const uint CUSTOM_TOWN_MAX_NUMBER
this is the maximum number of towns a user can specify in customisation
Definition town.h:30
void UpdateTownMaxPass(Town *t)
Update the maximum amount of monthly passengers and mail for a town, based on its population.
CargoArray GetAcceptedCargoOfHouse(const HouseSpec *hs)
Get accepted cargo of a house prototype.
Definition town_cmd.cpp:839
uint8_t GetTownActionCost(TownAction action)
Get cost factors for a TownAction.
static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY
value for custom town number in difficulty settings
Definition town.h:29
void ClearAllTownCachedNames()
Clear the cached_name of all towns.
Definition town_cmd.cpp:419
RoadType GetTownRoadType()
Get the road type that towns should build at this current moment.
Definition town_cmd.cpp:937
Town * CalcClosestTownFromTile(TileIndex tile, uint threshold=UINT_MAX)
Return the town closest to the given tile within threshold.
TownAction
Town actions of a company.
Definition town.h:250
@ RoadRebuild
Rebuild the roads.
Definition town.h:254
@ Bribe
Try to bribe the council.
Definition town.h:258
@ AdvertiseLarge
Large advertising campaign.
Definition town.h:253
@ BuildStatue
Build a statue.
Definition town.h:255
@ BuyRights
Buy exclusive transport rights.
Definition town.h:257
@ FundBuildings
Fund new buildings.
Definition town.h:256
@ AdvertiseMedium
Medium advertising campaign.
Definition town.h:252
@ AdvertiseSmall
Small advertising campaign.
Definition town.h:251
CommandCost CheckforTownRating(DoCommandFlags flags, Town *t, TownRatingCheckType type)
Does the town authority allow the (destructive) action of the current company?
HouseZone GetTownRadiusGroup(const Town *t, TileIndex tile)
Returns the bit corresponding to the town zone of the specified tile.
bool CheckTownRoadTypes()
Check if towns are able to build road.
Definition town_cmd.cpp:987
static const uint16_t MAX_TOWN_GROWTH_TICKS
Max amount of original town ticks that still fit into uint16_t, about equal to UINT16_MAX / TOWN_GROW...
Definition town.h:35
TownCouncilAttitudes
Settings for town council attitudes.
Definition town.h:216
void SetTownRatingTestMode(bool mode)
Switch the town rating to test-mode, to allow commands to be tested without affecting current ratings...
void UpdateTownRadius(Town *t)
Update the cached town zone radii of a town, based on the number of houses.
TownFlag
Flags controlling various town behaviours.
Definition town.h:41
@ HasChurch
There can be only one church by town.
Definition town.h:43
@ CustomGrowth
Growth rate is controlled by GS.
Definition town.h:45
@ HasStadium
There can be only one stadium by town.
Definition town.h:44
@ IsGrowing
Conditions for town growth are met. Grow according to Town::growth_rate.
Definition town.h:42
static const uint16_t TOWN_GROWTH_RATE_NONE
Special value for Town::growth_rate to disable town growth.
Definition town.h:34
CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlags flags)
Checks whether the local authority allows construction of a new station (rail, road,...
void MakeDefaultName(T *obj)
Set the default name for a depot/waypoint.
Definition town.h:287
void UpdateAllTownVirtCoords()
Update the virtual coords needed to draw the town sign for all towns.
Definition town_cmd.cpp:411
Map accessors for towns.
TownID GetTownIndex(Tile t)
Get the index of which town this house/street is attached to.
Definition town_map.h:23
TownLayout
Town Layouts.
Definition town_type.h:84
Types related to viewports.