diff --git a/src/bridge.h b/src/bridge.h index ee26a2d369..fdddffe32c 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -13,6 +13,7 @@ #include "gfx_type.h" #include "tile_cmd.h" #include "timer/timer_game_calendar.h" +#include /** * This enum is related to the definition of bridge pieces, @@ -40,7 +41,7 @@ typedef uint BridgeType; ///< Bridge spec number. /** * Actions that can be performed when the vehicle enters the depot. */ -enum BridgePiecePillarFlags { +enum class BridgePiecePillarFlag : uint8_t { BPPF_CORNER_W = 1 << 0, BPPF_CORNER_S = 1 << 1, BPPF_CORNER_E = 1 << 2, @@ -51,14 +52,15 @@ enum BridgePiecePillarFlags { BPPF_EDGE_SW = 1 << 6, BPPF_EDGE_NW = 1 << 7, }; -DECLARE_ENUM_AS_BIT_SET(BridgePiecePillarFlags) +using BridgePiecePillarFlags = EnumBitSet; -enum BridgeSpecCtrlFlags { +enum class BridgeSpecCtrlFlag : uint8_t{ BSCF_CUSTOM_PILLAR_FLAGS, BSCF_INVALID_PILLAR_FLAGS, BSCF_NOT_AVAILABLE_TOWN, BSCF_NOT_AVAILABLE_AI_GS, }; +using BridgeSpecCtrlFlags = EnumBitSet; /** * Struct containing information about a single bridge type @@ -75,7 +77,7 @@ struct BridgeSpec { StringID transport_name[2]; ///< description of the bridge, when built for road or rail std::vector> sprite_table; ///< table of sprites for drawing the bridge uint8_t flags; ///< bit 0 set: disable drawing of far pillars. - uint8_t ctrl_flags; ///< control flags + BridgeSpecCtrlFlags ctrl_flags; ///< control flags uint8_t pillar_flags[12]; ///< bridge pillar flags: 6 x pairs of x and y flags }; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 235fc98a00..bfffd323e8 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -7,6 +7,7 @@ /** @file station_cmd.cpp Handling of station tiles. */ +#include "core/enum_type.hpp" #include "stdafx.h" #include "core/flatset_type.hpp" #include "aircraft.h" @@ -1229,8 +1230,18 @@ CommandCost IsRailStationBridgeAboveOk(TileIndex tile, const StationSpec *statsp } else if (!statspec) { /* Default stations/waypoints */ if (layout < 8) { - static const uint8_t st_flags[8] = { 0x50, 0xA0, 0x50, 0xA0, 0x50 | 0x26, 0xA0 | 0x1C, 0x50 | 0x89, 0xA0 | 0x43 }; - disallowed_pillar_flags = (BridgePiecePillarFlags) st_flags[layout]; + static const BridgePiecePillarFlags st_flags[8] = { + {BridgePiecePillarFlag::BPPF_EDGE_SW, BridgePiecePillarFlag::BPPF_EDGE_NE}, //0x50, + {BridgePiecePillarFlag::BPPF_EDGE_NW, BridgePiecePillarFlag::BPPF_EDGE_SE}, //0xA0, + {BridgePiecePillarFlag::BPPF_EDGE_SW, BridgePiecePillarFlag::BPPF_EDGE_NE}, //0x50, + {BridgePiecePillarFlag::BPPF_EDGE_NW, BridgePiecePillarFlag::BPPF_EDGE_SE}, //0xA0, + {BridgePiecePillarFlag::BPPF_EDGE_SW, BridgePiecePillarFlag::BPPF_EDGE_NE, BridgePiecePillarFlag::BPPF_EDGE_SE, BridgePiecePillarFlag::BPPF_CORNER_E, BridgePiecePillarFlag::BPPF_CORNER_S}, //0x50 | 0x26, + {BridgePiecePillarFlag::BPPF_EDGE_NW, BridgePiecePillarFlag::BPPF_EDGE_SE, BridgePiecePillarFlag::BPPF_EDGE_NE, BridgePiecePillarFlag::BPPF_CORNER_N, BridgePiecePillarFlag::BPPF_CORNER_E}, //0xA0 | 0x1C, + {BridgePiecePillarFlag::BPPF_EDGE_NW, BridgePiecePillarFlag::BPPF_EDGE_SE, BridgePiecePillarFlag::BPPF_EDGE_NW, BridgePiecePillarFlag::BPPF_CORNER_N, BridgePiecePillarFlag::BPPF_CORNER_W}, //0x50 | 0x89, + {BridgePiecePillarFlag::BPPF_EDGE_NW, BridgePiecePillarFlag::BPPF_EDGE_SE, BridgePiecePillarFlag::BPPF_EDGE_SW, BridgePiecePillarFlag::BPPF_CORNER_S, BridgePiecePillarFlag::BPPF_CORNER_W} //0xA0 | 0x43 + }; + + disallowed_pillar_flags = st_flags[layout]; } else { disallowed_pillar_flags = (BridgePiecePillarFlags) 0; } @@ -1243,7 +1254,7 @@ CommandCost IsRailStationBridgeAboveOk(TileIndex tile, const StationSpec *statsp disallowed_pillar_flags = (BridgePiecePillarFlags) (axis == AXIS_X ? 0x50 : 0xA0); } - if ((GetBridgeTilePillarFlags(tile, northern_bridge_end, southern_bridge_end, bridge_type, bridge_transport_type) & disallowed_pillar_flags) == 0) { + if ((GetBridgeTilePillarFlags(tile, northern_bridge_end, southern_bridge_end, bridge_type, bridge_transport_type) & disallowed_pillar_flags).Any()) { return CommandCost(); } else { return CommandCost(STR_ERROR_BRIDGE_PILLARS_OBSTRUCT_STATION); @@ -1284,9 +1295,9 @@ CommandCost IsRoadStopBridgeAboveOK(TileIndex tile, const RoadStopSpec *spec, bo } else if (drive_through) { disallowed_pillar_flags = (BridgePiecePillarFlags) (DiagDirToAxis(entrance) == AXIS_X ? 0x50 : 0xA0); } else { - SetBit(disallowed_pillar_flags, 4 + entrance); + disallowed_pillar_flags.Set((BridgePiecePillarFlags) (4 + entrance)); } - if ((GetBridgeTilePillarFlags(tile, northern_bridge_end, southern_bridge_end, bridge_type, bridge_transport_type) & disallowed_pillar_flags) == 0) { + if ((GetBridgeTilePillarFlags(tile, northern_bridge_end, southern_bridge_end, bridge_type, bridge_transport_type) & disallowed_pillar_flags).Any()) { return CommandCost(); } else { return CommandCost(STR_ERROR_BRIDGE_PILLARS_OBSTRUCT_STATION); diff --git a/src/table/bridge_land.h b/src/table/bridge_land.h index 6a9ca8d677..390c87288f 100644 --- a/src/table/bridge_land.h +++ b/src/table/bridge_land.h @@ -741,7 +741,7 @@ static const std::span> _bridge_sprite_table[ * @param nrd description of the road bridge in query tool */ #define MBR(y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd, pillars) \ - {TimerGameCalendar::Year{y}, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, {}, 0, 0, pillars} + {TimerGameCalendar::Year{y}, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, {}, 0, BridgeSpecCtrlFlags(), pillars} #define ALL_PILLARS { 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F } #define SUSP_PILLARS { 0x03, 0x06, 0x0C, 0x09, 0x0C, 0x09, 0x03, 0x06, 0x0F, 0x0F, 0x00, 0x00 } diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index c19f9e8dad..5ea9a10907 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1613,7 +1613,7 @@ static BridgePieces CalcBridgePiece(uint north, uint south) BridgePiecePillarFlags GetBridgeTilePillarFlags(TileIndex tile, TileIndex northern_bridge_end, TileIndex southern_bridge_end, BridgeType bridge_type, TransportType bridge_transport_type) { - if (bridge_transport_type == TRANSPORT_WATER) return BPPF_ALL_CORNERS; + if (bridge_transport_type == TRANSPORT_WATER) return BridgePiecePillarFlag::BPPF_ALL_CORNERS; BridgePieces piece = CalcBridgePiece( GetTunnelBridgeLength(tile, northern_bridge_end) + 1, @@ -1623,7 +1623,7 @@ BridgePiecePillarFlags GetBridgeTilePillarFlags(TileIndex tile, TileIndex northe const BridgeSpec *spec = GetBridgeSpec(bridge_type); const Axis axis = TileX(northern_bridge_end) == TileX(southern_bridge_end) ? AXIS_Y : AXIS_X; - if (!HasBit(spec->ctrl_flags, BSCF_INVALID_PILLAR_FLAGS)) { + if (!spec->ctrl_flags.Test(BridgeSpecCtrlFlag::BSCF_INVALID_PILLAR_FLAGS)) { return (BridgePiecePillarFlags) spec->pillar_flags[piece * 2 + (axis == AXIS_Y ? 1 : 0)]; } else { uint base_offset; @@ -1635,7 +1635,7 @@ BridgePiecePillarFlags GetBridgeTilePillarFlags(TileIndex tile, TileIndex northe const PalSpriteID *psid = &GetBridgeSpriteTable(bridge_type, piece)[base_offset]; if (axis == AXIS_Y) psid += 4; - return (BridgePiecePillarFlags) (psid[2].sprite != 0 ? BPPF_ALL_CORNERS : 0); + return psid[2].sprite != 0 ? BridgePiecePillarFlag::BPPF_ALL_CORNERS : BridgePiecePillarFlags(); } }