diff --git a/src/newgrf/newgrf_act0_stations.cpp b/src/newgrf/newgrf_act0_stations.cpp index d5336665ea..38a2df7c05 100644 --- a/src/newgrf/newgrf_act0_stations.cpp +++ b/src/newgrf/newgrf_act0_stations.cpp @@ -184,12 +184,12 @@ static ChangeInfoResult StationChangeInfo(uint first, uint last, int prop, ByteR case 0x11: { // Pylon placement uint8_t pylons = buf.ReadByte(); - if (statspec->tileflags.size() < 8) statspec->tileflags.resize(8); + if (statspec->tilespecs.size() < 8) statspec->tilespecs.resize(8); for (int j = 0; j < 8; ++j) { if (HasBit(pylons, j)) { - statspec->tileflags[j].Set(StationSpec::TileFlag::Pylons); + statspec->tilespecs[j].flags.Set(StationSpec::TileFlag::Pylons); } else { - statspec->tileflags[j].Reset(StationSpec::TileFlag::Pylons); + statspec->tilespecs[j].flags.Reset(StationSpec::TileFlag::Pylons); } } break; @@ -209,12 +209,12 @@ static ChangeInfoResult StationChangeInfo(uint first, uint last, int prop, ByteR case 0x14: { // Overhead wire placement uint8_t wires = buf.ReadByte(); - if (statspec->tileflags.size() < 8) statspec->tileflags.resize(8); + if (statspec->tilespecs.size() < 8) statspec->tilespecs.resize(8); for (int j = 0; j < 8; ++j) { if (HasBit(wires, j)) { - statspec->tileflags[j].Set(StationSpec::TileFlag::NoWires); + statspec->tilespecs[j].flags.Set(StationSpec::TileFlag::NoWires); } else { - statspec->tileflags[j].Reset(StationSpec::TileFlag::NoWires); + statspec->tilespecs[j].flags.Reset(StationSpec::TileFlag::NoWires); } } break; @@ -222,12 +222,12 @@ static ChangeInfoResult StationChangeInfo(uint first, uint last, int prop, ByteR case 0x15: { // Blocked tiles uint8_t blocked = buf.ReadByte(); - if (statspec->tileflags.size() < 8) statspec->tileflags.resize(8); + if (statspec->tilespecs.size() < 8) statspec->tilespecs.resize(8); for (int j = 0; j < 8; ++j) { if (HasBit(blocked, j)) { - statspec->tileflags[j].Set(StationSpec::TileFlag::Blocked); + statspec->tilespecs[j].flags.Set(StationSpec::TileFlag::Blocked); } else { - statspec->tileflags[j].Reset(StationSpec::TileFlag::Blocked); + statspec->tilespecs[j].flags.Reset(StationSpec::TileFlag::Blocked); } } break; @@ -285,8 +285,10 @@ static ChangeInfoResult StationChangeInfo(uint first, uint last, int prop, ByteR case 0x1E: { // Extended tile flags (replaces prop 11, 14 and 15) uint16_t tiles = buf.ReadExtendedByte(); - auto flags = reinterpret_cast(buf.ReadBytes(tiles)); - statspec->tileflags.assign(flags, flags + tiles); + if (statspec->tilespecs.size() < tiles) statspec->tilespecs.resize(tiles); + for (uint j = 0; j != tiles; ++j) { + statspec->tilespecs[j].flags = StationSpec::TileFlags{buf.ReadByte()}; + } break; } diff --git a/src/newgrf_station.h b/src/newgrf_station.h index 1b74f90e80..52e0a53200 100644 --- a/src/newgrf_station.h +++ b/src/newgrf_station.h @@ -168,7 +168,11 @@ struct StationSpec : NewGRFSpecBase { Blocked = 2, ///< Tile is blocked to vehicles. }; using TileFlags = EnumBitSet; - std::vector tileflags; ///< List of tile flags. + + struct TileSpec { + TileFlags flags{}; ///< Tile flags. + }; + std::vector tilespecs; ///< Per-layout-tile information. AnimationInfo animation; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 6bde45d1fe..8fd127c248 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1307,8 +1307,8 @@ static CommandCost CalculateRailStationCost(TileArea tile_area, DoCommandFlags f static StationSpec::TileFlags GetStationTileFlags(StationGfx gfx, const StationSpec *statspec) { /* Default stations do not draw pylons under roofs (gfx >= 4) */ - if (statspec == nullptr || gfx >= statspec->tileflags.size()) return gfx < 4 ? StationSpec::TileFlag::Pylons : StationSpec::TileFlags{}; - return statspec->tileflags[gfx]; + if (statspec == nullptr || gfx >= statspec->tilespecs.size()) return gfx < 4 ? StationSpec::TileFlag::Pylons : StationSpec::TileFlags{}; + return statspec->tilespecs[gfx].flags; } /**