OpenTTD Source 20260331-master-g915bc00ea0
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
111 uint32_t accepted = 0;
112 };
113
115 struct AcceptedCargo {
116 CargoType cargo = INVALID_CARGO;
118
119 AcceptedCargo() = default;
125 };
126
127 using SuppliedCargoes = std::vector<SuppliedCargo>;
128 using AcceptedCargoes = std::vector<AcceptedCargo>;
129
132 std::array<TransportedCargoStat<uint16_t>, NUM_TAE> received{};
133 std::array<uint32_t, NUM_TAE> goal{};
135
137
138 inline SuppliedCargo &GetOrCreateCargoSupplied(CargoType cargo)
139 {
140 assert(IsValidCargoType(cargo));
141 auto it = std::ranges::lower_bound(this->supplied, cargo, std::less{}, &SuppliedCargo::cargo);
142 if (it == std::end(this->supplied) || it->cargo != cargo) it = this->supplied.emplace(it, cargo);
143 return *it;
144 }
145
146 inline SuppliedCargoes::const_iterator GetCargoSupplied(CargoType cargo) const
147 {
148 if (!IsValidCargoType(cargo)) return std::end(this->supplied);
149 auto it = std::ranges::lower_bound(this->supplied, cargo, std::less{}, &SuppliedCargo::cargo);
150 if (it == std::end(this->supplied) || it->cargo != cargo) return std::end(this->supplied);
151 return it;
152 }
153
160 {
161 assert(IsValidCargoType(cargo));
162 auto it = std::ranges::lower_bound(this->accepted, cargo, std::less{}, &AcceptedCargo::cargo);
163 if (it == std::end(this->accepted) || it->cargo != cargo) it = this->accepted.emplace(it, cargo);
164 return *it;
165 }
166
172 inline AcceptedCargoes::const_iterator GetCargoAccepted(CargoType cargo) const
173 {
174 if (!IsValidCargoType(cargo)) return std::end(this->accepted);
175 auto it = std::ranges::lower_bound(this->accepted, cargo, std::less{}, &AcceptedCargo::cargo);
176 if (it == std::end(this->accepted) || it->cargo != cargo) return std::end(this->accepted);
177 return it;
178 }
179
180 inline uint8_t GetPercentTransported(CargoType cargo_type) const
181 {
182 auto it = this->GetCargoSupplied(cargo_type);
183 if (it == std::end(this->supplied)) return 0;
184
185 return it->history[LAST_MONTH].PctTransported();
186 }
187
189
190 uint16_t time_until_rebuild = 0;
191
192 uint16_t grow_counter = 0;
193 uint16_t growth_rate = 0;
194
196 uint8_t road_build_months = 0;
197
198 bool larger_town = false;
200
201 bool show_zone = false;
202
203 std::vector<PersistentStorage *> psa_list{};
204
210 Town(TownID index, TileIndex tile = INVALID_TILE) : TownPool::PoolItem<&_town_pool>(index), xy(tile) { }
211
213 ~Town();
214
216
223 inline uint16_t MaxTownNoise() const
224 {
225 if (this->cache.population == 0) return 0; // no population? no noise
226
227 /* 3 is added (the noise of the lowest airport), so the user can at least build a small airfield. */
228 return ClampTo<uint16_t>((this->cache.population / _settings_game.economy.town_noise_population[_settings_game.difficulty.town_council_tolerance]) + 3);
229 }
230
231 void UpdateVirtCoord();
232
233 inline const std::string &GetCachedName() const
234 {
235 if (!this->name.empty()) return this->name;
236 if (this->cached_name.empty()) this->FillCachedName();
237 return this->cached_name;
238 }
239
240 static inline Town *GetByTile(TileIndex tile)
241 {
242 return Town::Get(GetTownIndex(tile));
243 }
244
245 static Town *GetRandom();
246 static void PostDestructor(size_t index);
247
248private:
249 void FillCachedName() const;
250};
251
252uint32_t GetWorldPopulation();
253
256void ShowTownViewWindow(TownID town);
257void ExpandTown(Town *t);
258
259void RebuildTownKdtree();
260
263 TOWN_COUNCIL_LENIENT = 0,
264 TOWN_COUNCIL_TOLERANT = 1,
265 TOWN_COUNCIL_HOSTILE = 2,
266 TOWN_COUNCIL_PERMISSIVE = 3,
267};
268
278
281 TDIWD_FORCE_REBUILD,
282 TDIWD_POPULATION_CHANGE,
283 TDIWD_FORCE_RESORT,
284};
285
286CommandCost CheckforTownRating(DoCommandFlags flags, Town *t, TownRatingCheckType type);
287
288
290
291Town *CalcClosestTownFromTile(TileIndex tile, uint threshold = UINT_MAX);
292
293void ResetHouses();
294
307using TownActions = EnumBitSet<TownAction, uint8_t>;
308
310
311void ClearTownHouse(Town *t, TileIndex tile);
312void UpdateTownMaxPass(Town *t);
313void UpdateTownRadius(Town *t);
314CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlags flags);
315Town *ClosestTownFromTile(TileIndex tile, uint threshold);
316void ChangeTownRating(Town *t, int add, int max, DoCommandFlags flags);
318void SetTownRatingTestMode(bool mode);
319TownActions GetMaskOfTownActions(CompanyID cid, const Town *t);
321bool GenerateTowns(TownLayout layout, std::optional<uint> number = std::nullopt);
324
325uint8_t GetTownActionCost(TownAction action);
326
332template <class T>
334{
335 /* We only want to set names if it hasn't been set before, or when we're calling from afterload. */
336 assert(obj->name.empty() || obj->town_cn == UINT16_MAX);
337
338 obj->town = ClosestTownFromTile(obj->xy, UINT_MAX);
339
340 /* Find first unused number belonging to this town. This can never fail,
341 * as long as there can be at most 65535 waypoints/depots in total.
342 *
343 * This does 'n * m' search, but with 32bit 'used' bitmap, it needs at
344 * most 'n * (1 + ceil(m / 32))' steps (n - number of waypoints in pool,
345 * m - number of waypoints near this town).
346 * Usually, it needs only 'n' steps.
347 *
348 * If it wasn't using 'used' and 'idx', it would just search for increasing 'next',
349 * but this way it is faster */
350
351 uint32_t used = 0; // bitmap of used waypoint numbers, sliding window with 'next' as base
352 uint32_t next = 0; // first number in the bitmap
353 uint32_t idx = 0; // index where we will stop
354 uint32_t cid = 0; // current index, goes to T::GetPoolSize()-1, then wraps to 0
355
356 do {
357 T *lobj = T::GetIfValid(cid);
358
359 /* check only valid waypoints... */
360 if (lobj != nullptr && obj != lobj) {
361 /* only objects within the same city and with the same type */
362 if (lobj->town == obj->town && lobj->IsOfType(obj)) {
363 /* if lobj->town_cn < next, uint will overflow to '+inf' */
364 uint i = (uint)lobj->town_cn - next;
365
366 if (i < 32) {
367 SetBit(used, i); // update bitmap
368 if (i == 0) {
369 /* shift bitmap while the lowest bit is '1';
370 * increase the base of the bitmap too */
371 do {
372 used >>= 1;
373 next++;
374 } while (HasBit(used, 0));
375 /* when we are at 'idx' again at end of the loop and
376 * 'next' hasn't changed, then no object had town_cn == next,
377 * so we can safely use it */
378 idx = cid;
379 }
380 }
381 }
382 }
383
384 cid++;
385 if (cid == T::GetPoolSize()) cid = 0; // wrap to zero...
386 } while (cid != idx);
387
388 obj->town_cn = (uint16_t)next; // set index...
389}
390
391/*
392 * Converts original town ticks counters to plain game ticks. Note that
393 * tick 0 is a valid tick so actual amount is one more than the counter value.
394 */
395inline uint16_t TownTicksToGameTicks(uint16_t ticks)
396{
397 return (std::min(ticks, MAX_TOWN_GROWTH_TICKS) + 1) * Ticks::TOWN_GROWTH_TICKS - 1;
398}
399
400
402bool CheckTownRoadTypes();
403std::span<const DrawBuildingsTileStruct> GetTownDrawTileData();
404
405#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
Storage for accepted cargo history.
Definition town.h:115
AcceptedCargo(CargoType cargo)
Construct AcceptedCargo.
Definition town.h:124
CargoType cargo
Cargo type of accepted cargo.
Definition town.h:116
HistoryData< AcceptedHistory > history
Histor data of accepted cargo.
Definition town.h:117
Individual data point for accepted cargo history.
Definition town.h:110
uint32_t accepted
Total accepted.
Definition town.h:111
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:136
bool larger_town
if this is a larger town and should grow more quickly
Definition town.h:198
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:190
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:195
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:130
TownLayout layout
town specific road layout
Definition town.h:199
AcceptedCargo & GetOrCreateCargoAccepted(CargoType cargo)
Get or create the storage for an accepted cargo.
Definition town.h:159
uint16_t MaxTownNoise() const
Calculate the max town noise.
Definition town.h:223
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:210
uint16_t grow_counter
counter to count when to grow, value is smaller than or equal to growth_rate
Definition town.h:192
std::vector< AcceptedCargo > AcceptedCargoes
Type for storage of all accepted cargo history.
Definition town.h:128
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:134
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:201
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
AcceptedCargoes::const_iterator GetCargoAccepted(CargoType cargo) const
Get iterator to the storage for an accepted cargo.
Definition town.h:172
CompanyMask have_ratings
which companies have a rating
Definition town.h:84
~Town()
Destroy the town.
Definition town_cmd.cpp:115
AcceptedCargoes accepted
Cargo statistics about accepted cargo.
Definition town.h:131
TypedIndexContainer< std::array< int16_t, MAX_COMPANIES >, CompanyID > ratings
ratings of each company for this town
Definition town.h:88
std::vector< SuppliedCargo > SuppliedCargoes
Type for storage of all supplied cargo history.
Definition town.h:127
uint16_t growth_rate
town growth rate
Definition town.h:193
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:188
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:196
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:132
std::array< uint32_t, NUM_TAE > goal
Amount of cargo required for the town to grow.
Definition town.h:133
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:273
@ TunnelBridgeRemove
Removal of a tunnel or bridge owned by the town.
Definition town.h:275
@ RoadRemove
Removal of a road owned by the town.
Definition town.h:274
@ End
End marker.
Definition town.h:276
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:280
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:296
@ RoadRebuild
Rebuild the roads.
Definition town.h:300
@ Bribe
Try to bribe the council.
Definition town.h:304
@ AdvertiseLarge
Large advertising campaign.
Definition town.h:299
@ BuildStatue
Build a statue.
Definition town.h:301
@ BuyRights
Buy exclusive transport rights.
Definition town.h:303
@ FundBuildings
Fund new buildings.
Definition town.h:302
@ AdvertiseMedium
Medium advertising campaign.
Definition town.h:298
@ AdvertiseSmall
Small advertising campaign.
Definition town.h:297
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:262
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:333
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.