Add town variable for town tile X and Y coordinates

pull/510/head
Jonathan G Rennison 1 year ago
parent ce9480ee20
commit 64925aedf8

@ -51,6 +51,8 @@
<tr><td>town_zone_2_radius_square_uncapped</td><td>0..4294967295</td><td>Town zone 2 radius squared (not clamped to 0xFFFF)</td><td><font face="monospace">town_uncapped_variables</font>, version 1</td></tr>
<tr><td>town_zone_3_radius_square_uncapped</td><td>0..4294967295</td><td>Town zone 3 radius squared (not clamped to 0xFFFF)</td><td><font face="monospace">town_uncapped_variables</font>, version 1</td></tr>
<tr><td>town_zone_4_radius_square_uncapped</td><td>0..4294967295</td><td>Town zone 4 radius squared (not clamped to 0xFFFF)</td><td><font face="monospace">town_uncapped_variables</font>, version 1</td></tr>
<tr><td>x_coordinate</td><td>0..65535</td><td>X coordinate of town tile</td><td><font face="monospace">varaction2_towns_town_xy</font>, version 1</td></tr>
<tr><td>y_coordinate</td><td>0..65535</td><td>Y coordinate of town tile</td><td><font face="monospace">varaction2_towns_town_xy</font>, version 1</td></tr>
</table>
<h3 id="town_generic_callbacks">Town Generic Callbacks</h3>

@ -54,6 +54,7 @@
<tr><td><a href="#town_zone_N_radius_square">town_zone_2_radius_square</a></td><td>Town zone 2 radius squared</td></tr>
<tr><td><a href="#town_zone_N_radius_square">town_zone_3_radius_square</a></td><td>Town zone 3 radius squared</td></tr>
<tr><td><a href="#town_zone_N_radius_square">town_zone_4_radius_square</a></td><td>Town zone 4 radius squared</td></tr>
<tr><td><a href="#town_xy">town_xy</a></td><td>Town tile X and Y coordinates</td></tr>
</table>
<h4 id="town_house_count">Number of town house (mappable variable: town_house_count)</h4>
@ -68,6 +69,16 @@
<p>This is the same as <a href="https://newgrf-specs.tt-wiki.net/wiki/VariationalAction2/Towns">town variables 94, 96, 98, 9A, 9C</a>, except 32 bits and not clamped to a maximum value of 0xFFFF.</p>
<p>This requires <font face="monospace">town_uncapped_variables</font>, version 1.</p>
<h4 id="town_xy">Town tile X and Y coordinates (mappable variable: town_xy)</h4>
<table>
<tr><th>Bits</th><th>Meaning</th></tr>
<tr><td>0 - 15</td><td>X coordinate of town tile</td></tr>
<tr><td>16 - 31</td><td>Y coordinate of town tile</td></tr>
</table>
<p>This is similar to town variable 80, except the Y part is in the upper 16 bits and the X part is in the lower 16 bits.</p>
<p>This is the same format as <a href="https://newgrf-specs.tt-wiki.net/wiki/VariationalAction2/Houses#XY_Coordinate_of_the_building_.2847.29">house variable 47</a>.</p>
<p>This requires <font face="monospace">varaction2_towns_town_xy</font>, version 1.</p>
<br />
<h3 id="a3town">Action 3 - Town</h3>

@ -67,6 +67,7 @@ extern const GRFFeatureInfo _grf_feature_list[] = {
GRFFeatureInfo("town_feature", 1),
GRFFeatureInfo("town_uncapped_variables", 1),
GRFFeatureInfo("town_zone_callback", 1, GFTOF_TOWN_ZONE_CALLBACK),
GRFFeatureInfo("varaction2_towns_town_xy", 1),
GRFFeatureInfo("more_varaction2_types", 1, GFTOF_MORE_VARACTION2_TYPES),
GRFFeatureInfo("multi_part_ships", 1, GFTOF_MULTI_PART_SHIPS),
GRFFeatureInfo(),
@ -182,6 +183,7 @@ extern const GRFVariableMapDefinition _grf_action2_remappable_variables[] = {
GRFVariableMapDefinition(GSF_FAKE_TOWNS, A2VRI_TOWNS_ZONE_2, "town_zone_2_radius_square"),
GRFVariableMapDefinition(GSF_FAKE_TOWNS, A2VRI_TOWNS_ZONE_3, "town_zone_3_radius_square"),
GRFVariableMapDefinition(GSF_FAKE_TOWNS, A2VRI_TOWNS_ZONE_4, "town_zone_4_radius_square"),
GRFVariableMapDefinition(GSF_FAKE_TOWNS, A2VRI_TOWNS_XY, "town_xy"),
GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x40, "newlandscape_terrain_type"),
GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x41, "newlandscape_tile_slope"),
GRFVariableMapDefinition(GSF_NEWLANDSCAPE, 0x42, "newlandscape_tile_height"),

@ -96,6 +96,7 @@ enum Action2VariableRemapIds {
A2VRI_TOWNS_ZONE_2,
A2VRI_TOWNS_ZONE_3,
A2VRI_TOWNS_ZONE_4,
A2VRI_TOWNS_XY,
};
enum GRFFeatureTestObservationFlag : uint8 {

@ -119,6 +119,9 @@
case A2VRI_TOWNS_ZONE_3:
case A2VRI_TOWNS_ZONE_4:
return this->t->cache.squared_town_zone_radius[variable - A2VRI_TOWNS_ZONE_0];
case A2VRI_TOWNS_XY:
return TileY(this->t->xy) << 16 | (TileX(this->t->xy) & 0xFFFF);
}
DEBUG(grf, 1, "Unhandled town variable 0x%X", variable);
@ -180,6 +183,7 @@
case A2VRI_TOWNS_ZONE_2:
case A2VRI_TOWNS_ZONE_3:
case A2VRI_TOWNS_ZONE_4:
case A2VRI_TOWNS_XY:
return 0;
}

@ -1639,6 +1639,7 @@ static const NIVariable _niv_towns[] = {
NIV(A2VRI_TOWNS_ZONE_2, "zone radius 2 (uncapped)"),
NIV(A2VRI_TOWNS_ZONE_3, "zone radius 3 (uncapped)"),
NIV(A2VRI_TOWNS_ZONE_4, "zone radius 4 (uncapped)"),
NIV(A2VRI_TOWNS_XY, "town tile xy"),
NIV_END()
};

Loading…
Cancel
Save