1
0
Fork 0

Codechange: Remove terminator from airport tile lists. (#14306)

pull/12097/head
Peter Nelson 2025-05-27 20:23:59 +01:00 committed by GitHub
parent 808af15975
commit 7c9393e822
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 19 additions and 33 deletions

View File

@ -93,10 +93,8 @@ static ChangeInfoResult AirportChangeInfo(uint first, uint last, int prop, ByteR
tile.ti.x = buf.ReadByte();
tile.ti.y = buf.ReadByte();
if (tile.ti.x == 0 && tile.ti.y == 0x80) {
/* Convert terminator to our own. */
tile.ti.x = -0x80;
tile.ti.y = 0;
tile.gfx = 0;
/* Terminator, remove and finish up. */
layout.tiles.pop_back();
break;
}

View File

@ -25,14 +25,15 @@ typedef uint8_t StationGfx;
/** Tile-offset / AirportTileID pair. */
struct AirportTileTable {
TileIndexDiffC ti; ///< Tile offset from the top-most airport tile.
StationGfx gfx; ///< AirportTile to use for this tile.
StationGfx gfx; ///< AirportTile to use for this tile.
};
/** Iterator to iterate over all tiles belonging to an airport spec. */
class AirportTileTableIterator : public TileIterator {
private:
const AirportTileTable *att; ///< The offsets.
TileIndex base_tile; ///< The tile we base the offsets off.
std::span<const AirportTileTable> att; ///< The offsets.
TileIndex base_tile; ///< The tile we base the offsets off.
std::span<const AirportTileTable>::iterator iter;
public:
/**
@ -40,17 +41,19 @@ public:
* @param att The TileTable we want to iterate over.
* @param base_tile The basetile for all offsets.
*/
AirportTileTableIterator(const AirportTileTable *att, TileIndex base_tile) : TileIterator(base_tile + ToTileIndexDiff(att->ti)), att(att), base_tile(base_tile)
AirportTileTableIterator(std::span<const AirportTileTable> att, TileIndex base_tile)
: TileIterator(base_tile + ToTileIndexDiff(att.front().ti))
, att(att), base_tile(base_tile), iter(att.begin())
{
}
inline TileIterator& operator ++() override
{
this->att++;
if (this->att->ti.x == -0x80) {
++this->iter;
if (this->iter == std::end(att)) {
this->tile = INVALID_TILE;
} else {
this->tile = this->base_tile + ToTileIndexDiff(this->att->ti);
this->tile = this->base_tile + ToTileIndexDiff(this->iter->ti);
}
return *this;
}
@ -58,7 +61,7 @@ public:
/** Get the StationGfx for the current tile. */
StationGfx GetStationGfx() const
{
return this->att->gfx;
return this->iter->gfx;
}
std::unique_ptr<TileIterator> Clone() const override

View File

@ -139,7 +139,7 @@
if (_settings_game.economy.station_noise_level) {
uint dist;
const auto &layout = as->layouts[0];
AirportGetNearestTown(as, layout.rotation, tile, AirportTileTableIterator(layout.tiles.data(), tile), dist);
AirportGetNearestTown(as, layout.rotation, tile, AirportTileTableIterator(layout.tiles, tile), dist);
return GetAirportNoiseLevelForDistance(as, dist);
}
@ -156,7 +156,7 @@
uint dist;
const auto &layout = as->layouts[0];
return AirportGetNearestTown(as, layout.rotation, tile, AirportTileTableIterator(layout.tiles.data(), tile), dist)->index;
return AirportGetNearestTown(as, layout.rotation, tile, AirportTileTableIterator(layout.tiles, tile), dist)->index;
}
/* static */ SQInteger ScriptAirport::GetMaintenanceCostFactor(AirportType type)

View File

@ -2541,7 +2541,7 @@ CommandCost CmdBuildAirport(DoCommandFlags flags, TileIndex tile, uint8_t airpor
return CommandCost(STR_ERROR_STATION_TOO_SPREAD_OUT);
}
AirportTileTableIterator tile_iter(as->layouts[layout].tiles.data(), tile);
AirportTileTableIterator tile_iter(as->layouts[layout].tiles, tile);
CommandCost cost = CheckFlatLandAirport(tile_iter, flags);
if (cost.Failed()) return cost;
@ -2590,7 +2590,7 @@ CommandCost CmdBuildAirport(DoCommandFlags flags, TileIndex tile, uint8_t airpor
return CommandCost(STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT);
}
for (AirportTileTableIterator iter(as->layouts[layout].tiles.data(), tile); iter != INVALID_TILE; ++iter) {
for (AirportTileTableIterator iter(as->layouts[layout].tiles, tile); iter != INVALID_TILE; ++iter) {
cost.AddCost(_price[PR_BUILD_STATION_AIRPORT]);
}
@ -2606,7 +2606,7 @@ CommandCost CmdBuildAirport(DoCommandFlags flags, TileIndex tile, uint8_t airpor
st->rect.BeforeAddRect(tile, w, h, StationRect::ADD_TRY);
for (AirportTileTableIterator iter(as->layouts[layout].tiles.data(), tile); iter != INVALID_TILE; ++iter) {
for (AirportTileTableIterator iter(as->layouts[layout].tiles, tile); iter != INVALID_TILE; ++iter) {
Tile t(iter);
MakeAirport(t, st->owner, st->index, iter.GetStationGfx(), WATER_CLASS_INVALID);
SetStationTileRandomBits(t, GB(Random(), 0, 4));
@ -2616,7 +2616,7 @@ CommandCost CmdBuildAirport(DoCommandFlags flags, TileIndex tile, uint8_t airpor
}
/* Only call the animation trigger after all tiles have been built */
for (AirportTileTableIterator iter(as->layouts[layout].tiles.data(), tile); iter != INVALID_TILE; ++iter) {
for (AirportTileTableIterator iter(as->layouts[layout].tiles, tile); iter != INVALID_TILE; ++iter) {
TriggerAirportTileAnimation(st, iter, AirportAnimationTrigger::Built);
}

View File

@ -22,11 +22,6 @@
*/
#define MK(x, y, m) {{x, y}, m}
/**
* Terminator of airport tiles layout definition
*/
#define MKEND {{-0x80, 0}, 0}
/** Tiles for Country Airfield (small) */
static const std::initializer_list<AirportTileTable> _tile_table_country_0 = {
MK(0, 0, APT_SMALL_BUILDING_1),
@ -41,7 +36,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_country_0 = {
MK(1, 2, APT_RUNWAY_SMALL_MIDDLE),
MK(2, 2, APT_RUNWAY_SMALL_MIDDLE),
MK(3, 2, APT_RUNWAY_SMALL_NEAR_END),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_country = {
@ -70,7 +64,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_commuter_0 = {
MK(2, 3, APT_RUNWAY_2),
MK(3, 3, APT_RUNWAY_2),
MK(4, 3, APT_RUNWAY_END_FENCE_SE),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_commuter = {
@ -115,7 +108,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_city_0 = {
MK(3, 5, APT_RUNWAY_3),
MK(4, 5, APT_RUNWAY_4),
MK(5, 5, APT_RUNWAY_END_FENCE_SE),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_city = {
@ -160,7 +152,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_metropolitan_0
MK(3, 5, APT_RUNWAY_2),
MK(4, 5, APT_RUNWAY_2),
MK(5, 5, APT_RUNWAY_END_FENCE_SE),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_metropolitan = {
@ -218,7 +209,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_international_0
MK(4, 6, APT_RUNWAY_2),
MK(5, 6, APT_RUNWAY_2),
MK(6, 6, APT_RUNWAY_END_FENCE_SE),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_international = {
@ -326,7 +316,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_intercontinenta
MK(6, 10, APT_RUNWAY_2),
MK(7, 10, APT_RUNWAY_END_FENCE_SE_SW),
MK(8, 10, APT_EMPTY),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_intercontinental = {
@ -336,7 +325,6 @@ static const std::initializer_list<AirportTileLayout> _tile_table_intercontinent
/** Tiles for Heliport */
static const std::initializer_list<AirportTileTable> _tile_table_heliport_0 = {
MK(0, 0, APT_HELIPORT),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_heliport = {
@ -349,7 +337,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_helidepot_0 = {
MK(1, 0, APT_DEPOT_SE),
MK(0, 1, APT_HELIPAD_2_FENCE_NE_SE),
MK(1, 1, APT_APRON_FENCE_SE_SW),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_helidepot = {
@ -366,7 +353,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_helistation_0 =
MK(1, 1, APT_APRON_FENCE_SE),
MK(2, 1, APT_APRON_FENCE_SE),
MK(3, 1, APT_HELIPAD_3_FENCE_SE_SW),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_helistation = {
@ -374,7 +360,6 @@ static const std::initializer_list<AirportTileLayout> _tile_table_helistation =
};
#undef MK
#undef MKEND
/** General AirportSpec definition. */
#define AS_GENERIC(fsm, layouts, depots, size_x, size_y, noise, catchment, min_year, max_year, maint_cost, ttdpatch_type, class_id, name, preview, enabled) \