From cbd2c7b3d794e19e29c92e88a76ea28ccf4d5c0f Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 20 May 2025 23:28:40 +0200 Subject: [PATCH] Use FlagHolder for banner flags --- src/openrct2-ui/windows/Banner.cpp | 4 ++-- src/openrct2/actions/BannerPlaceAction.cpp | 2 +- src/openrct2/actions/BannerSetStyleAction.cpp | 5 ++-- .../actions/LargeSceneryPlaceAction.cpp | 4 ++-- src/openrct2/actions/SignSetNameAction.cpp | 6 ++--- src/openrct2/actions/WallPlaceAction.cpp | 4 ++-- src/openrct2/network/NetworkBase.cpp | 2 +- src/openrct2/park/ParkFile.cpp | 2 +- src/openrct2/rct1/S4Importer.cpp | 6 ++--- src/openrct2/rct12/RCT12.h | 4 +++- src/openrct2/rct2/S6Importer.cpp | 6 ++--- .../bindings/world/ScTileElement.cpp | 24 ++++++------------- src/openrct2/world/Banner.cpp | 12 +++++----- src/openrct2/world/Banner.h | 20 +++++++++------- src/openrct2/world/TileInspector.cpp | 4 ++-- 15 files changed, 49 insertions(+), 56 deletions(-) diff --git a/src/openrct2-ui/windows/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp index 149a897c3c..2751c2862f 100644 --- a/src/openrct2-ui/windows/Banner.cpp +++ b/src/openrct2-ui/windows/Banner.cpp @@ -216,7 +216,7 @@ namespace OpenRCT2::Ui::Windows { TextinputCancel(); auto bannerSetStyle = BannerSetStyleAction( - BannerSetStyleType::NoEntry, GetBannerIndex(), banner->flags ^ BANNER_FLAG_NO_ENTRY); + BannerSetStyleType::NoEntry, GetBannerIndex(), !banner->flags.has(BannerFlag::noEntry)); GameActions::Execute(&bannerSetStyle); break; } @@ -293,7 +293,7 @@ namespace OpenRCT2::Ui::Windows pressed_widgets &= ~(1uLL << WIDX_BANNER_NO_ENTRY); disabled_widgets &= ~( (1uLL << WIDX_BANNER_TEXT) | (1uLL << WIDX_TEXT_COLOUR_DROPDOWN) | (1uLL << WIDX_TEXT_COLOUR_DROPDOWN_BUTTON)); - if (banner->flags & BANNER_FLAG_NO_ENTRY) + if (banner->flags.has(BannerFlag::noEntry)) { pressed_widgets |= (1uLL << WIDX_BANNER_NO_ENTRY); disabled_widgets |= (1uLL << WIDX_BANNER_TEXT) | (1uLL << WIDX_TEXT_COLOUR_DROPDOWN) diff --git a/src/openrct2/actions/BannerPlaceAction.cpp b/src/openrct2/actions/BannerPlaceAction.cpp index 9e64b23adb..6d6209889d 100644 --- a/src/openrct2/actions/BannerPlaceAction.cpp +++ b/src/openrct2/actions/BannerPlaceAction.cpp @@ -143,7 +143,7 @@ GameActions::Result BannerPlaceAction::Execute() const return GameActions::Result( GameActions::Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_TOO_MANY_BANNERS_IN_GAME); } - banner->flags = 0; + banner->flags = {}; banner->text = {}; banner->textColour = TextColour::white; banner->type = _bannerType; // Banner must be deleted after this point in an early return diff --git a/src/openrct2/actions/BannerSetStyleAction.cpp b/src/openrct2/actions/BannerSetStyleAction.cpp index 6e2502a7c2..99089dba12 100644 --- a/src/openrct2/actions/BannerSetStyleAction.cpp +++ b/src/openrct2/actions/BannerSetStyleAction.cpp @@ -163,10 +163,9 @@ GameActions::Result BannerSetStyleAction::Execute() const GameActions::Status::Unknown, STR_CANT_REPAINT_THIS, STR_ERR_BANNER_ELEMENT_NOT_FOUND); } - banner->flags &= ~BANNER_FLAG_NO_ENTRY; - banner->flags |= (_parameter != 0) ? BANNER_FLAG_NO_ENTRY : 0; + banner->flags.set(BannerFlag::noEntry, (_parameter != 0)); uint8_t allowedEdges = 0xF; - if (banner->flags & BANNER_FLAG_NO_ENTRY) + if (banner->flags.has(BannerFlag::noEntry)) { allowedEdges &= ~(1 << bannerElement->GetPosition()); } diff --git a/src/openrct2/actions/LargeSceneryPlaceAction.cpp b/src/openrct2/actions/LargeSceneryPlaceAction.cpp index 6cab4b4806..ea3b49fb62 100644 --- a/src/openrct2/actions/LargeSceneryPlaceAction.cpp +++ b/src/openrct2/actions/LargeSceneryPlaceAction.cpp @@ -251,7 +251,7 @@ GameActions::Result LargeSceneryPlaceAction::Execute() const banner->text = {}; banner->colour = 2; banner->textColour = TextColour::white; - banner->flags = BANNER_FLAG_IS_LARGE_SCENERY; + banner->flags = { BannerFlag::isLargeScenery }; banner->type = 0; banner->position = TileCoordsXY(_loc); @@ -259,7 +259,7 @@ GameActions::Result LargeSceneryPlaceAction::Execute() const if (!rideIndex.IsNull()) { banner->ride_index = rideIndex; - banner->flags |= BANNER_FLAG_LINKED_TO_RIDE; + banner->flags.set(BannerFlag::linkedToRide); } resultData.bannerId = banner->id; diff --git a/src/openrct2/actions/SignSetNameAction.cpp b/src/openrct2/actions/SignSetNameAction.cpp index 11d1d2ae34..8f539fae27 100644 --- a/src/openrct2/actions/SignSetNameAction.cpp +++ b/src/openrct2/actions/SignSetNameAction.cpp @@ -86,7 +86,7 @@ GameActions::Result SignSetNameAction::Execute() const if (!_name.empty()) { - banner->flags &= ~BANNER_FLAG_LINKED_TO_RIDE; + banner->flags.unset(BannerFlag::linkedToRide); banner->ride_index = RideId::GetNull(); banner->text = _name; } @@ -96,13 +96,13 @@ GameActions::Result SignSetNameAction::Execute() const RideId rideIndex = BannerGetClosestRideIndex({ banner->position.ToCoordsXY(), 16 }); if (rideIndex.IsNull()) { - banner->flags &= ~BANNER_FLAG_LINKED_TO_RIDE; + banner->flags.unset(BannerFlag::linkedToRide); banner->ride_index = RideId::GetNull(); banner->text = {}; } else { - banner->flags |= BANNER_FLAG_LINKED_TO_RIDE; + banner->flags.set(BannerFlag::linkedToRide); banner->ride_index = rideIndex; banner->text = {}; } diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 937f6bdc76..5077a2c463 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -362,7 +362,7 @@ GameActions::Result WallPlaceAction::Execute() const banner->text = {}; banner->colour = COLOUR_WHITE; banner->textColour = TextColour::white; - banner->flags = BANNER_FLAG_IS_WALL; + banner->flags = { BannerFlag::isWall }; banner->type = 0; // Banner must be deleted after this point in an early return banner->position = TileCoordsXY(_loc); @@ -370,7 +370,7 @@ GameActions::Result WallPlaceAction::Execute() const if (!rideIndex.IsNull()) { banner->ride_index = rideIndex; - banner->flags |= BANNER_FLAG_LINKED_TO_RIDE; + banner->flags.set(BannerFlag::linkedToRide); } } diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index cbfdad7db5..5fb42f5eb8 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -49,7 +49,7 @@ using namespace OpenRCT2; // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -constexpr uint8_t kNetworkStreamVersion = 1; +constexpr uint8_t kNetworkStreamVersion = 2; const std::string kNetworkStreamID = std::string(kOpenRCT2Version) + "-" + std::to_string(kNetworkStreamVersion); diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index 1ecafc33b9..2034724bc2 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -1361,7 +1361,7 @@ namespace OpenRCT2 cs.ReadWrite(banner.id); } cs.ReadWrite(banner.type); - cs.ReadWrite(banner.flags); + cs.ReadWrite(banner.flags.holder); cs.ReadWrite(banner.text); cs.ReadWrite(banner.colour); cs.ReadWrite(banner.ride_index); diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 01a7793cdb..45d62be0d6 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2510,10 +2510,10 @@ namespace OpenRCT2::RCT1 type = kObjectEntryIndexNull; dst->type = type; - dst->flags = 0; - if (src->Flags & BANNER_FLAG_NO_ENTRY) + dst->flags = {}; + if (src->flags.has(BannerFlag::noEntry)) { - dst->flags |= BANNER_FLAG_NO_ENTRY; + dst->flags.set(BannerFlag::noEntry); } if (IsUserStringID(src->StringID)) diff --git a/src/openrct2/rct12/RCT12.h b/src/openrct2/rct12/RCT12.h index cc5ba44b5e..bbd5d32d95 100644 --- a/src/openrct2/rct12/RCT12.h +++ b/src/openrct2/rct12/RCT12.h @@ -380,6 +380,8 @@ constexpr uint8_t kRCT12RideNumDropsMask = 0b00111111; struct TrackDesign; struct TrackDesignTrackElement; enum class RideColourScheme : uint8_t; +enum class BannerFlag : uint8_t; +using BannerFlags = FlagHolder; enum class RCT12TrackDesignVersion : uint8_t { @@ -1191,7 +1193,7 @@ static_assert(sizeof(RCT12RideMeasurement) == 0x4B0C); struct RCT12Banner { RCT12ObjectEntryIndex Type; - uint8_t Flags; // 0x01 + BannerFlags flags; // 0x01 ::StringId StringID; // 0x02 union { diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index b52c53f35e..2d5e46a6f6 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1125,14 +1125,14 @@ namespace OpenRCT2::RCT2 *dst = {}; dst->id = id; dst->type = RCTEntryIndexToOpenRCT2EntryIndex(src->Type); - dst->flags = src->Flags; + dst->flags = src->flags; - if (!(src->Flags & BANNER_FLAG_LINKED_TO_RIDE) && IsUserStringID(src->StringID)) + if (!(src->flags.has(BannerFlag::linkedToRide)) && IsUserStringID(src->StringID)) { dst->text = GetUserString(src->StringID); } - if (src->Flags & BANNER_FLAG_LINKED_TO_RIDE) + if (src->flags.has(BannerFlag::linkedToRide)) { dst->ride_index = RCT12RideIdToOpenRCT2RideId(src->RideIndex); } diff --git a/src/openrct2/scripting/bindings/world/ScTileElement.cpp b/src/openrct2/scripting/bindings/world/ScTileElement.cpp index 1a615479b8..4ff2defd8c 100644 --- a/src/openrct2/scripting/bindings/world/ScTileElement.cpp +++ b/src/openrct2/scripting/bindings/world/ScTileElement.cpp @@ -2113,10 +2113,7 @@ namespace OpenRCT2::Scripting else banner->ride_index = RideId::GetNull(); - if (banner->ride_index.IsNull()) - banner->flags &= ~BANNER_FLAG_LINKED_TO_RIDE; - else - banner->flags |= BANNER_FLAG_LINKED_TO_RIDE; + banner->flags.set(BannerFlag::linkedToRide, !banner->ride_index.IsNull()); } } } @@ -2127,7 +2124,7 @@ namespace OpenRCT2::Scripting auto* ctx = scriptEngine.GetContext(); auto* el = _element->AsBanner(); if (el != nullptr) - duk_push_boolean(ctx, (el->GetBanner()->flags & BANNER_FLAG_NO_ENTRY) != 0); + duk_push_boolean(ctx, el->GetBanner()->flags.has(BannerFlag::noEntry)); else duk_push_null(ctx); return DukValue::take_from_stack(ctx); @@ -2138,14 +2135,7 @@ namespace OpenRCT2::Scripting auto* el = _element->AsBanner(); if (el != nullptr) { - if (value) - { - el->GetBanner()->flags |= BANNER_FLAG_NO_ENTRY; - } - else - { - el->GetBanner()->flags &= ~BANNER_FLAG_NO_ENTRY; - } + el->GetBanner()->flags.set(BannerFlag::noEntry, value); Invalidate(); } } @@ -2255,11 +2245,11 @@ namespace OpenRCT2::Scripting banner->text = {}; banner->colour = 0; banner->textColour = TextColour::black; - banner->flags = 0; + banner->flags = {}; if (_element->GetType() == TileElementType::Wall) - banner->flags = BANNER_FLAG_IS_WALL; + banner->flags.set(BannerFlag::isWall); if (_element->GetType() == TileElementType::LargeScenery) - banner->flags = BANNER_FLAG_IS_LARGE_SCENERY; + banner->flags.set(BannerFlag::isLargeScenery); banner->type = 0; banner->position = TileCoordsXY(_coords); @@ -2269,7 +2259,7 @@ namespace OpenRCT2::Scripting if (!rideIndex.IsNull()) { banner->ride_index = rideIndex; - banner->flags |= BANNER_FLAG_LINKED_TO_RIDE; + banner->flags.set(BannerFlag::linkedToRide); } } diff --git a/src/openrct2/world/Banner.cpp b/src/openrct2/world/Banner.cpp index b6781dbd7e..265f3c54ce 100644 --- a/src/openrct2/world/Banner.cpp +++ b/src/openrct2/world/Banner.cpp @@ -64,11 +64,11 @@ void Banner::FormatTextTo(Formatter& ft, bool addColour) const void Banner::FormatTextTo(Formatter& ft) const { - if (flags & BANNER_FLAG_NO_ENTRY) + if (flags.has(BannerFlag::noEntry)) { ft.Add(STR_NO_ENTRY); } - else if (flags & BANNER_FLAG_LINKED_TO_RIDE) + else if (flags.has(BannerFlag::linkedToRide)) { auto ride = GetRide(ride_index); if (ride != nullptr) @@ -378,7 +378,7 @@ void UnlinkAllRideBanners() { if (!banner.IsNull()) { - banner.flags &= ~BANNER_FLAG_LINKED_TO_RIDE; + banner.flags.unset(BannerFlag::linkedToRide); banner.ride_index = RideId::GetNull(); } } @@ -389,9 +389,9 @@ void UnlinkAllBannersForRide(RideId rideId) auto& gameState = getGameState(); for (auto& banner : gameState.banners) { - if (!banner.IsNull() && (banner.flags & BANNER_FLAG_LINKED_TO_RIDE) && banner.ride_index == rideId) + if (!banner.IsNull() && (banner.flags.has(BannerFlag::linkedToRide)) && banner.ride_index == rideId) { - banner.flags &= ~BANNER_FLAG_LINKED_TO_RIDE; + banner.flags.unset(BannerFlag::linkedToRide); banner.ride_index = RideId::GetNull(); banner.text = {}; } @@ -438,7 +438,7 @@ Banner* CreateBanner() if (banner != nullptr) { banner->id = bannerIndex; - banner->flags = 0; + banner->flags = {}; banner->type = 0; banner->text = {}; banner->colour = COLOUR_WHITE; diff --git a/src/openrct2/world/Banner.h b/src/openrct2/world/Banner.h index dfa5d125c0..dba859b6f6 100644 --- a/src/openrct2/world/Banner.h +++ b/src/openrct2/world/Banner.h @@ -10,6 +10,7 @@ #pragma once #include "../Identifiers.h" +#include "../core/FlagHolder.hpp" #include "../drawing/TextColour.h" #include "../ride/RideTypes.h" #include "Location.hpp" @@ -30,11 +31,20 @@ constexpr size_t kMaxBanners = 8192; constexpr uint8_t kScrollingModeNone = 255; +enum class BannerFlag : uint8_t +{ + noEntry = 0, + isLargeScenery = 1, + linkedToRide = 2, + isWall = 3, +}; +using BannerFlags = FlagHolder; + struct Banner { BannerIndex id = BannerIndex::GetNull(); ObjectEntryIndex type = kBannerNull; - uint8_t flags{}; + BannerFlags flags{}; std::string text; mutable std::string formattedTextBuffer; uint8_t colour{}; @@ -52,14 +62,6 @@ struct Banner void FormatTextTo(Formatter&) const; }; -enum BANNER_FLAGS -{ - BANNER_FLAG_NO_ENTRY = (1 << 0), - BANNER_FLAG_IS_LARGE_SCENERY = (1 << 1), - BANNER_FLAG_LINKED_TO_RIDE = (1 << 2), - BANNER_FLAG_IS_WALL = (1 << 3) -}; - void BannerInit(OpenRCT2::GameState_t& gameState); TileElement* BannerGetTileElement(BannerIndex bannerIndex); WallElement* BannerGetScrollingWallTileElement(BannerIndex bannerIndex); diff --git a/src/openrct2/world/TileInspector.cpp b/src/openrct2/world/TileInspector.cpp index 833102d5c4..22d5bb8815 100644 --- a/src/openrct2/world/TileInspector.cpp +++ b/src/openrct2/world/TileInspector.cpp @@ -331,9 +331,9 @@ namespace OpenRCT2::TileInspector newBanner->id = newId; // If the linked ride has been destroyed since copying, unlink the pasted banner - if (newBanner->flags & BANNER_FLAG_LINKED_TO_RIDE && GetRide(newBanner->ride_index) == nullptr) + if (newBanner->flags.has(BannerFlag::linkedToRide) && GetRide(newBanner->ride_index) == nullptr) { - newBanner->flags &= ~BANNER_FLAG_LINKED_TO_RIDE; + newBanner->flags.unset(BannerFlag::linkedToRide); newBanner->ride_index = RideId::GetNull(); }