From 7c9393e822ad706f6b0078c5af4150d4b186d78b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 27 May 2025 20:23:59 +0100 Subject: [PATCH] Codechange: Remove terminator from airport tile lists. (#14306) --- src/newgrf/newgrf_act0_airports.cpp | 6 ++---- src/newgrf_airport.h | 19 +++++++++++-------- src/script/api/script_airport.cpp | 4 ++-- src/station_cmd.cpp | 8 ++++---- src/table/airport_defaults.h | 15 --------------- 5 files changed, 19 insertions(+), 33 deletions(-) diff --git a/src/newgrf/newgrf_act0_airports.cpp b/src/newgrf/newgrf_act0_airports.cpp index 3a11d3d079..62c0f4c61b 100644 --- a/src/newgrf/newgrf_act0_airports.cpp +++ b/src/newgrf/newgrf_act0_airports.cpp @@ -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; } diff --git a/src/newgrf_airport.h b/src/newgrf_airport.h index b21e265e1f..b6ac05ab0a 100644 --- a/src/newgrf_airport.h +++ b/src/newgrf_airport.h @@ -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 att; ///< The offsets. + TileIndex base_tile; ///< The tile we base the offsets off. + std::span::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 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 Clone() const override diff --git a/src/script/api/script_airport.cpp b/src/script/api/script_airport.cpp index 054c3f4add..05e5a7d728 100644 --- a/src/script/api/script_airport.cpp +++ b/src/script/api/script_airport.cpp @@ -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) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index d997e37080..db141507e0 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -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); } diff --git a/src/table/airport_defaults.h b/src/table/airport_defaults.h index 0afa91a7b6..f7b1fb7f7c 100644 --- a/src/table/airport_defaults.h +++ b/src/table/airport_defaults.h @@ -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 _tile_table_country_0 = { MK(0, 0, APT_SMALL_BUILDING_1), @@ -41,7 +36,6 @@ static const std::initializer_list _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 _tile_table_country = { @@ -70,7 +64,6 @@ static const std::initializer_list _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 _tile_table_commuter = { @@ -115,7 +108,6 @@ static const std::initializer_list _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 _tile_table_city = { @@ -160,7 +152,6 @@ static const std::initializer_list _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 _tile_table_metropolitan = { @@ -218,7 +209,6 @@ static const std::initializer_list _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 _tile_table_international = { @@ -326,7 +316,6 @@ static const std::initializer_list _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 _tile_table_intercontinental = { @@ -336,7 +325,6 @@ static const std::initializer_list _tile_table_intercontinent /** Tiles for Heliport */ static const std::initializer_list _tile_table_heliport_0 = { MK(0, 0, APT_HELIPORT), - MKEND }; static const std::initializer_list _tile_table_heliport = { @@ -349,7 +337,6 @@ static const std::initializer_list _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 _tile_table_helidepot = { @@ -366,7 +353,6 @@ static const std::initializer_list _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 _tile_table_helistation = { @@ -374,7 +360,6 @@ static const std::initializer_list _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) \