OpenTTD Source 20260208-master-g43af8e94d0
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
68 /* Town name */
69 uint32_t townnamegrfid = 0;
70 uint16_t townnametype = 0;
71 uint32_t townnameparts = 0;
72 std::string name{};
73 mutable std::string cached_name{};
74
75 TownFlags flags{};
76
77 uint16_t noise_reached = 0;
78
80
81 /* Company ratings. */
84 CompanyID exclusivity = CompanyID::Invalid();
85 uint8_t exclusive_counter = 0;
87
89 uint32_t production = 0;
90 uint32_t transported = 0;
91
92 uint8_t PctTransported() const
93 {
94 if (this->production == 0) return 0;
95 return ClampTo<uint8_t>(this->transported * 256 / this->production);
96 }
97 };
98
99 struct SuppliedCargo {
100 CargoType cargo = INVALID_CARGO;
102
103 SuppliedCargo() = default;
104 SuppliedCargo(CargoType cargo) : cargo(cargo) {}
105 };
106
107 using SuppliedCargoes = std::vector<SuppliedCargo>;
108
109 SuppliedCargoes supplied{};
110 std::array<TransportedCargoStat<uint16_t>, NUM_TAE> received{};
111 std::array<uint32_t, NUM_TAE> goal{};
113
115
116 inline SuppliedCargo &GetOrCreateCargoSupplied(CargoType cargo)
117 {
118 assert(IsValidCargoType(cargo));
119 auto it = std::ranges::lower_bound(this->supplied, cargo, std::less{}, &SuppliedCargo::cargo);
120 if (it == std::end(this->supplied) || it->cargo != cargo) it = this->supplied.emplace(it, cargo);
121 return *it;
122 }
123
124 inline SuppliedCargoes::const_iterator GetCargoSupplied(CargoType cargo) const
125 {
126 if (!IsValidCargoType(cargo)) return std::end(this->supplied);
127 auto it = std::ranges::lower_bound(this->supplied, cargo, std::less{}, &SuppliedCargo::cargo);
128 if (it == std::end(this->supplied) || it->cargo != cargo) return std::end(supplied);
129 return it;
130 }
131
132 inline uint8_t GetPercentTransported(CargoType cargo_type) const
133 {
134 auto it = this->GetCargoSupplied(cargo_type);
135 if (it == std::end(this->supplied)) return 0;
136
137 return it->history[LAST_MONTH].PctTransported();
138 }
139
141
142 uint16_t time_until_rebuild = 0;
143
144 uint16_t grow_counter = 0;
145 uint16_t growth_rate = 0;
146
148 uint8_t road_build_months = 0;
149
150 bool larger_town = false;
152
153 bool show_zone = false;
154
155 std::vector<PersistentStorage *> psa_list{};
156
162 Town(TownID index, TileIndex tile = INVALID_TILE) : TownPool::PoolItem<&_town_pool>(index), xy(tile) { }
163
165 ~Town();
166
168
175 inline uint16_t MaxTownNoise() const
176 {
177 if (this->cache.population == 0) return 0; // no population? no noise
178
179 /* 3 is added (the noise of the lowest airport), so the user can at least build a small airfield. */
180 return ClampTo<uint16_t>((this->cache.population / _settings_game.economy.town_noise_population[_settings_game.difficulty.town_council_tolerance]) + 3);
181 }
182
183 void UpdateVirtCoord();
184
185 inline const std::string &GetCachedName() const
186 {
187 if (!this->name.empty()) return this->name;
188 if (this->cached_name.empty()) this->FillCachedName();
189 return this->cached_name;
190 }
191
192 static inline Town *GetByTile(TileIndex tile)
193 {
194 return Town::Get(GetTownIndex(tile));
195 }
196
197 static Town *GetRandom();
198 static void PostDestructor(size_t index);
199
200private:
201 void FillCachedName() const;
202};
203
204uint32_t GetWorldPopulation();
205
208void ShowTownViewWindow(TownID town);
209void ExpandTown(Town *t);
210
211void RebuildTownKdtree();
212
215 TOWN_COUNCIL_LENIENT = 0,
216 TOWN_COUNCIL_TOLERANT = 1,
217 TOWN_COUNCIL_HOSTILE = 2,
218 TOWN_COUNCIL_PERMISSIVE = 3,
219};
220
230
233 TDIWD_FORCE_REBUILD,
234 TDIWD_POPULATION_CHANGE,
235 TDIWD_FORCE_RESORT,
236};
237
238CommandCost CheckforTownRating(DoCommandFlags flags, Town *t, TownRatingCheckType type);
239
240
242
243Town *CalcClosestTownFromTile(TileIndex tile, uint threshold = UINT_MAX);
244
245void ResetHouses();
246
259using TownActions = EnumBitSet<TownAction, uint8_t>;
260
262
263void ClearTownHouse(Town *t, TileIndex tile);
264void UpdateTownMaxPass(Town *t);
265void UpdateTownRadius(Town *t);
266CommandCost CheckIfAuthorityAllowsNewStation(TileIndex tile, DoCommandFlags flags);
267Town *ClosestTownFromTile(TileIndex tile, uint threshold);
268void ChangeTownRating(Town *t, int add, int max, DoCommandFlags flags);
270void SetTownRatingTestMode(bool mode);
271TownActions GetMaskOfTownActions(CompanyID cid, const Town *t);
273bool GenerateTowns(TownLayout layout, std::optional<uint> number = std::nullopt);
276
277uint8_t GetTownActionCost(TownAction action);
278
284template <class T>
285void MakeDefaultName(T *obj)
286{
287 /* We only want to set names if it hasn't been set before, or when we're calling from afterload. */
288 assert(obj->name.empty() || obj->town_cn == UINT16_MAX);
289
290 obj->town = ClosestTownFromTile(obj->xy, UINT_MAX);
291
292 /* Find first unused number belonging to this town. This can never fail,
293 * as long as there can be at most 65535 waypoints/depots in total.
294 *
295 * This does 'n * m' search, but with 32bit 'used' bitmap, it needs at
296 * most 'n * (1 + ceil(m / 32))' steps (n - number of waypoints in pool,
297 * m - number of waypoints near this town).
298 * Usually, it needs only 'n' steps.
299 *
300 * If it wasn't using 'used' and 'idx', it would just search for increasing 'next',
301 * but this way it is faster */
302
303 uint32_t used = 0; // bitmap of used waypoint numbers, sliding window with 'next' as base
304 uint32_t next = 0; // first number in the bitmap
305 uint32_t idx = 0; // index where we will stop
306 uint32_t cid = 0; // current index, goes to T::GetPoolSize()-1, then wraps to 0
307
308 do {
309 T *lobj = T::GetIfValid(cid);
310
311 /* check only valid waypoints... */
312 if (lobj != nullptr && obj != lobj) {
313 /* only objects within the same city and with the same type */
314 if (lobj->town == obj->town && lobj->IsOfType(obj)) {
315 /* if lobj->town_cn < next, uint will overflow to '+inf' */
316 uint i = (uint)lobj->town_cn - next;
317
318 if (i < 32) {
319 SetBit(used, i); // update bitmap
320 if (i == 0) {
321 /* shift bitmap while the lowest bit is '1';
322 * increase the base of the bitmap too */
323 do {
324 used >>= 1;
325 next++;
326 } while (HasBit(used, 0));
327 /* when we are at 'idx' again at end of the loop and
328 * 'next' hasn't changed, then no object had town_cn == next,
329 * so we can safely use it */
330 idx = cid;
331 }
332 }
333 }
334 }
335
336 cid++;
337 if (cid == T::GetPoolSize()) cid = 0; // wrap to zero...
338 } while (cid != idx);
339
340 obj->town_cn = (uint16_t)next; // set index...
341}
342
343/*
344 * Converts original town ticks counters to plain game ticks. Note that
345 * tick 0 is a valid tick so actual amount is one more than the counter value.
346 */
347inline uint16_t TownTicksToGameTicks(uint16_t ticks)
348{
349 return (std::min(ticks, MAX_TOWN_GROWTH_TICKS) + 1) * Ticks::TOWN_GROWTH_TICKS - 1;
350}
351
352
354bool CheckTownRoadTypes();
355std::span<const DrawBuildingsTileStruct> GetTownDrawTileData();
356
357#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:104
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 DECLARE_INCREMENT_DECREMENT_OPERATORS(enum_type)
For some enums it is useful to have pre/post increment/decrement operators.
Definition enum_type.hpp:66
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:111
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:90
uint32_t production
Total produced.
Definition town.h:89
Town data structure.
Definition town.h:63
EncodedString text
General text with additional information.
Definition town.h:114
bool larger_town
if this is a larger town and should grow more quickly
Definition town.h:150
CompanyMask statues
which companies have a statue?
Definition town.h:79
uint16_t time_until_rebuild
time until we rebuild a house
Definition town.h:142
std::string cached_name
NOSAVE: Cache of the resolved name of the town, if not using a custom town name.
Definition town.h:73
TileIndex xy
town center tile
Definition town.h:64
uint8_t fund_buildings_months
fund buildings program in action?
Definition town.h:147
uint16_t noise_reached
level of noise that all the airports are generating
Definition town.h:77
SuppliedCargoes supplied
Cargo statistics about supplied cargo.
Definition town.h:109
TownLayout layout
town specific road layout
Definition town.h:151
uint16_t MaxTownNoise() const
Calculate the max town noise.
Definition town.h:175
static Town * GetRandom()
Return a random valid town.
Definition town_cmd.cpp:203
std::string name
Custom town name. If empty, the town was not renamed and uses the generated name.
Definition town.h:72
Town(TownID index, TileIndex tile=INVALID_TILE)
Creates a new town.
Definition town.h:162
uint16_t grow_counter
counter to count when to grow, value is smaller than or equal to growth_rate
Definition town.h:144
TownFlags flags
See TownFlags.
Definition town.h:75
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:83
CompanyID exclusivity
which company has exclusivity
Definition town.h:84
ValidHistoryMask valid_history
Mask of valid history records.
Definition town.h:112
void InitializeLayout(TownLayout layout)
Assign the town layout.
Definition town_cmd.cpp:189
bool show_zone
NOSAVE: mark town to show the local authority zone in the viewports.
Definition town.h:153
uint8_t exclusive_counter
months till the exclusivity expires
Definition town.h:85
void UpdateVirtCoord()
Resize the sign (label) of the town after it changes population.
Definition town_cmd.cpp:398
CompanyMask have_ratings
which companies have a rating
Definition town.h:82
~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:86
uint16_t growth_rate
town growth rate
Definition town.h:145
StationList stations_near
NOSAVE: List of nearby stations.
Definition town.h:140
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:174
uint8_t road_build_months
fund road reconstruction in action?
Definition town.h:148
std::array< TransportedCargoStat< uint16_t >, NUM_TAE > received
Cargo statistics about received cargotypes.
Definition town.h:110
std::array< uint32_t, NUM_TAE > goal
Amount of cargo required for the town to grow.
Definition town.h:111
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.
TownRatingCheckType
Action types that a company must ask permission for to a town authority.
Definition town.h:225
@ TunnelBridgeRemove
Removal of a tunnel or bridge owned by the town.
Definition town.h:227
@ RoadRemove
Removal of a road owned by the town.
Definition town.h:226
@ End
End marker.
Definition town.h:228
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:232
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:457
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:858
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:430
RoadType GetTownRoadType()
Get the road type that towns should build at this current moment.
Definition town_cmd.cpp:965
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:248
@ RoadRebuild
Rebuild the roads.
Definition town.h:252
@ Bribe
Try to bribe the council.
Definition town.h:256
@ AdvertiseLarge
Large advertising campaign.
Definition town.h:251
@ BuildStatue
Build a statue.
Definition town.h:253
@ BuyRights
Buy exclusive transport rights.
Definition town.h:255
@ FundBuildings
Fund new buildings.
Definition town.h:254
@ AdvertiseMedium
Medium advertising campaign.
Definition town.h:250
@ AdvertiseSmall
Small advertising campaign.
Definition town.h:249
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.
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:214
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:285
void UpdateAllTownVirtCoords()
Update the virtual coords needed to draw the town sign for all towns.
Definition town_cmd.cpp:422
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.