Difference between revisions of "TTDTownGrowth"
m (2 revisions) |
m (Bot: Automated text replacement (--= +==)) |
||
Line 1: | Line 1: | ||
− | '''''How towns grow in regular TTD''''' |
||
=TTD Town Growth= |
=TTD Town Growth= |
||
Line 8: | Line 7: | ||
This is very technical, and only required if you want to fine-tune your town growth. Otherwise, you can skip over this and the next section. |
This is very technical, and only required if you want to fine-tune your town growth. Otherwise, you can skip over this and the next section. |
||
− | The basic time unit in TTD is a |
+ | The basic time unit in TTD is a "tick". In the following, it will be used to describe how often something happens. A tick of the simulation engine takes ca. 27 ms, if your computer is fast enough, otherwise it takes as long as necessary. One TTD day is ca. 74 ticks, which is about 2 seconds of real time on fast enough computers. |
− | The |
+ | The "expansion state" of a town is determined by two fields in town structure: bit 0 in the word at the offset 0x12 (I'll call it the <tt>growth_flag</tt>) and the byte at 0x0A (<tt>idle_countdown</tt>): |
+ | {| |
||
− | + | !<tt>growth_flag</tt> !!<tt>idle_countdown</tt> !!state |
|
+ | |- |
||
− | 0 |any |blocked |
+ | |0 ||any ||blocked |
+ | |- |
||
− | 1 |0 |expanding |
+ | |1 ||0 ||expanding |
+ | |- |
||
− | 1 |nonzero |
+ | |1 ||nonzero ||idle |
+ | |} |
||
− | Town status update (including expansion) is performed on every tick in a |
+ | Town status update (including expansion) is performed on every tick in a round-robin fashion; since the town array can hold 70 entries, the main town status update procedure is called every 70 ticks for each town. If the town is blocked, nothing happens. If it's idle, <tt>idle_countdown</tt> is decremented. If it's expanding, an attempt to place a new building or a piece of road (or a bridge) is taken; if it succeeds, the expansion state is changed to idle by setting <tt>idle_countdown</tt> to the byte at 0x39, from now on referred to as <tt>growth_delay</tt> (extension of an existing road usually doesn't change the state to idle). Therefore, <tt>growth_delay</tt> determines how often the town will be in the expanding state, and thus is the ''inverse'' growth rate of the town. Smaller values of <tt>growth_delay</tt> mean faster growth. |
− | + | <tt>growth_delay</tt> is reset each month, and depends on the number of "active" stations within town's transport zone as follows: |
|
+ | {| |
||
− | + | !number of !!<tt>growth_delay</tt> |
|
+ | |- |
||
− | "active" stations |normal |funded<nowiki><nowiki>[1]</nowiki></nowiki> |funded<nowiki><nowiki>[2]</nowiki></nowiki> |
||
+ | |"active" stations ||normal ||funded[1] ||funded[2] |
||
+ | |- |
||
− | 0 | 160 <nowiki><nowiki>[3]</nowiki></nowiki> | 60 | 60 |
||
+ | | 0 || 160 [3] || 60 || 60 |
||
+ | |- |
||
− | 1 | 210 | 60 | 60 |
||
+ | | 1 || 210 || 60 || 60 |
||
+ | |- |
||
− | 2 | 150 | 60 | 60 |
||
+ | | 2 || 150 || 60 || 60 |
||
+ | |- |
||
− | 3 | 110 | 60 | 50 |
||
+ | | 3 || 110 || 60 || 50 |
||
+ | |- |
||
− | 4 | 80 | 60 | 40 |
||
+ | | 4 || 80 || 60 || 40 |
||
+ | |- |
||
− | 5 or more | 11 <nowiki><nowiki>[4]</nowiki></nowiki> | 60 | 30|| |
||
+ | | 5 or more || 11 [4] || 60 || 30 |
||
+ | |} |
||
Footnotes: |
Footnotes: |
||
+ | {| |
||
− | + | ![1] !!When a town building fund is active (i.e., up to 3 months after using the "Fund new buildings" option). |
|
+ | |- |
||
− | + | |[2] ||When a town building fund is active and "towngrowthratemode" is set to 1. |
|
+ | |- |
||
− | + | |[3] ||In this case the town is blocked with a 11/12 probability, so the effective mean <tt>growth_delay</tt> is 1920. |
|
+ | |- |
||
− | + | |[4] ||This is a bug in TTD (array overrun). TTDPatch now fixes this if any of "generalfixes", "towngrowthratemode" or "towngrowthlimit" is active. If "towngrowthratemode" is 0 or off, <tt>growth_delay</tt> is set to 80 (which seems to be the original programmer's intention); if "towngrowthratemode" is 1, it's set to 55. |
|
+ | |} |
||
− | Apart from the random blocking in the case |
+ | Apart from the random blocking in the case [3], town growth is also blocked: |
− | *in the sub-arctic climate, if the central tile of the town is above |
+ | *in the sub-arctic climate, if the central tile of the town is above the snow line, and no food has been delivered to the town in the last month; |
− | *in the sub-tropical climate, if the central tile of the town is in |
+ | *in the sub-tropical climate, if the central tile of the town is in desert, and no food or no water has been delivered to the town in the last month. |
− | The switches townminpopulationsnow and townminpopulationdesert |
+ | The switches townminpopulationsnow and townminpopulationdesert may be used to prevent blocking of towns with population less than some threshold, so they get a chance to grow enough to accept food. |
− | If |
+ | If "largertowns" is active, <tt>growth_delay</tt> is halved for selected towns, making them grow twice as fast (except in the case [3] above, so transport is still necessary to make towns grow; this is different if "towngrowthratemode" is 2, as explained in the next section). |
− | A station is |
+ | A station is "active" if any cargo has been picked up or accepted there within the last 50 days. The type of cargo is irrelevant, so if there's a coal mine in the middle of a town and you're picking up coal there, it will contribute to the growth of the town. This also means that many single-facility stations make a town grow faster than one multi-facility station, as long as they're serviced regularly. |
− | The town's transport zone is a circular area around the town's central |
+ | The town's transport zone is a circular area around the town's central tile. Its radius (in tiles) is a function of the number of town buildings as follows: |
+ | {| |
||
− | + | !number of town buildings !! radius of transport zone |
|
+ | |- |
||
− | 0--3 |2 |
||
+ | |0--3 ||2 |
||
+ | |- |
||
− | 4--7 |4 |
||
+ | |4--7 ||4 |
||
+ | |- |
||
− | 8--11 |5 |
||
+ | |8--11 ||5 |
||
+ | |- |
||
− | 12--15 |6 |
||
+ | |12--15 ||6 |
||
+ | |- |
||
− | 16--19 |7 |
||
+ | |16--19 ||7 |
||
+ | |- |
||
− | 20--35 |8 |
||
+ | |20--35 ||8 |
||
+ | |- |
||
− | 36--71 |9 |
||
+ | |36--71 ||9 |
||
+ | |- |
||
− | 72 or more |0|| |
||
+ | |72 or more ||0 |
||
+ | |} |
||
− | Notice the last row. |
+ | Notice the last row. If there are more than 71 town buildings, the transport zone vanishes and stations no longer contribute to the growth. However, if "towngrowthlimit" is enabled, TTDPatch changes this by extrapolating the function for larger values. |
− | Also note that the internal number of buildings may be incorrect |
+ | Also note that the internal number of buildings may be incorrect in games save under old versions of TTDPatch or without TTDPatch, due to the bugs mentioned in [[GeneralFixes| General Fixes]]. However, this is not a big problem since TTDPatch recalculates these numbers (and populations) if the extended town data are enabled (see [[MoreTownStatistics| More Town Statistics]]) and the game without those data is loaded, and all the new town growth switches do enable the extended town data. |
− | The function called if a town is in the expanding state starts by |
+ | The function called if a town is in the expanding state starts by searching for a piece of road in the vicinity of town's centre. If no road is found, an attempt is made to create it. If a road piece is found, the function randomly `walks' along the roads trying to find a place to create a new house, or possibly branch out a new street or extend an existing one. Normally, this walk is limited to 20 steps (where a tunnel counts as one step), which limits the maximum possible extents of a town. The "towngrowthlimit" switch modifies this value. |
− | Regardless of all the town growth processing mentioned above, each town |
+ | Regardless of all the town growth processing mentioned above, each town building's status is updated periodically (every 256 ticks). This includes construction progress and "production" of passengers and mail. If the town the building belongs to is not blocked, this also includes destroying the building (and, with 61/64 probability, immediately building a new one in its place) at random intervals. This process is not controlled by <tt>growth_delay</tt> or any of the new town growth switches, althought is does indirectly affect the growth of a town. |
Revision as of 11:27, 15 June 2011
TTD Town Growth
How towns grow in regular TTD
This is very technical, and only required if you want to fine-tune your town growth. Otherwise, you can skip over this and the next section.
The basic time unit in TTD is a "tick". In the following, it will be used to describe how often something happens. A tick of the simulation engine takes ca. 27 ms, if your computer is fast enough, otherwise it takes as long as necessary. One TTD day is ca. 74 ticks, which is about 2 seconds of real time on fast enough computers.
The "expansion state" of a town is determined by two fields in town structure: bit 0 in the word at the offset 0x12 (I'll call it the growth_flag) and the byte at 0x0A (idle_countdown):
growth_flag | idle_countdown | state |
---|---|---|
0 | any | blocked |
1 | 0 | expanding |
1 | nonzero | idle |
Town status update (including expansion) is performed on every tick in a round-robin fashion; since the town array can hold 70 entries, the main town status update procedure is called every 70 ticks for each town. If the town is blocked, nothing happens. If it's idle, idle_countdown is decremented. If it's expanding, an attempt to place a new building or a piece of road (or a bridge) is taken; if it succeeds, the expansion state is changed to idle by setting idle_countdown to the byte at 0x39, from now on referred to as growth_delay (extension of an existing road usually doesn't change the state to idle). Therefore, growth_delay determines how often the town will be in the expanding state, and thus is the inverse growth rate of the town. Smaller values of growth_delay mean faster growth.
growth_delay is reset each month, and depends on the number of "active" stations within town's transport zone as follows:
number of | growth_delay | ||
---|---|---|---|
"active" stations | normal | funded[1] | funded[2] |
0 | 160 [3] | 60 | 60 |
1 | 210 | 60 | 60 |
2 | 150 | 60 | 60 |
3 | 110 | 60 | 50 |
4 | 80 | 60 | 40 |
5 or more | 11 [4] | 60 | 30 |
Footnotes:
[1] | When a town building fund is active (i.e., up to 3 months after using the "Fund new buildings" option). |
---|---|
[2] | When a town building fund is active and "towngrowthratemode" is set to 1. |
[3] | In this case the town is blocked with a 11/12 probability, so the effective mean growth_delay is 1920. |
[4] | This is a bug in TTD (array overrun). TTDPatch now fixes this if any of "generalfixes", "towngrowthratemode" or "towngrowthlimit" is active. If "towngrowthratemode" is 0 or off, growth_delay is set to 80 (which seems to be the original programmer's intention); if "towngrowthratemode" is 1, it's set to 55. |
Apart from the random blocking in the case [3], town growth is also blocked:
- in the sub-arctic climate, if the central tile of the town is above the snow line, and no food has been delivered to the town in the last month;
- in the sub-tropical climate, if the central tile of the town is in desert, and no food or no water has been delivered to the town in the last month.
The switches townminpopulationsnow and townminpopulationdesert may be used to prevent blocking of towns with population less than some threshold, so they get a chance to grow enough to accept food.
If "largertowns" is active, growth_delay is halved for selected towns, making them grow twice as fast (except in the case [3] above, so transport is still necessary to make towns grow; this is different if "towngrowthratemode" is 2, as explained in the next section).
A station is "active" if any cargo has been picked up or accepted there within the last 50 days. The type of cargo is irrelevant, so if there's a coal mine in the middle of a town and you're picking up coal there, it will contribute to the growth of the town. This also means that many single-facility stations make a town grow faster than one multi-facility station, as long as they're serviced regularly.
The town's transport zone is a circular area around the town's central tile. Its radius (in tiles) is a function of the number of town buildings as follows:
number of town buildings | radius of transport zone |
---|---|
0--3 | 2 |
4--7 | 4 |
8--11 | 5 |
12--15 | 6 |
16--19 | 7 |
20--35 | 8 |
36--71 | 9 |
72 or more | 0 |
Notice the last row. If there are more than 71 town buildings, the transport zone vanishes and stations no longer contribute to the growth. However, if "towngrowthlimit" is enabled, TTDPatch changes this by extrapolating the function for larger values.
Also note that the internal number of buildings may be incorrect in games save under old versions of TTDPatch or without TTDPatch, due to the bugs mentioned in General Fixes. However, this is not a big problem since TTDPatch recalculates these numbers (and populations) if the extended town data are enabled (see More Town Statistics) and the game without those data is loaded, and all the new town growth switches do enable the extended town data.
The function called if a town is in the expanding state starts by searching for a piece of road in the vicinity of town's centre. If no road is found, an attempt is made to create it. If a road piece is found, the function randomly `walks' along the roads trying to find a place to create a new house, or possibly branch out a new street or extend an existing one. Normally, this walk is limited to 20 steps (where a tunnel counts as one step), which limits the maximum possible extents of a town. The "towngrowthlimit" switch modifies this value.
Regardless of all the town growth processing mentioned above, each town building's status is updated periodically (every 256 ticks). This includes construction progress and "production" of passengers and mail. If the town the building belongs to is not blocked, this also includes destroying the building (and, with 61/64 probability, immediately building a new one in its place) at random intervals. This process is not controlled by growth_delay or any of the new town growth switches, althought is does indirectly affect the growth of a town.