1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-11 01:52:32 +01:00

Refactor MarketingCampaignFlags into a FlagHolder

This commit is contained in:
Gymnasiast
2025-07-02 19:58:07 +02:00
parent 600a65b5bf
commit 8468f87a87
5 changed files with 16 additions and 11 deletions

View File

@@ -70,7 +70,7 @@ GameActions::Result ParkMarketingAction::Execute() const
MarketingCampaign campaign{}; MarketingCampaign campaign{};
campaign.Type = _type; campaign.Type = _type;
campaign.WeeksLeft = _numWeeks; campaign.WeeksLeft = _numWeeks;
campaign.Flags = MarketingCampaignFlags::FIRST_WEEK; campaign.flags = { MarketingCampaignFlag::firstWeek };
if (campaign.Type == ADVERTISING_CAMPAIGN_RIDE_FREE || campaign.Type == ADVERTISING_CAMPAIGN_RIDE) if (campaign.Type == ADVERTISING_CAMPAIGN_RIDE_FREE || campaign.Type == ADVERTISING_CAMPAIGN_RIDE)
{ {
campaign.RideId = RideId::FromUnderlying(_item); campaign.RideId = RideId::FromUnderlying(_item);

View File

@@ -120,11 +120,11 @@ void MarketingUpdate()
for (auto it = gameState.marketingCampaigns.begin(); it != gameState.marketingCampaigns.end();) for (auto it = gameState.marketingCampaigns.begin(); it != gameState.marketingCampaigns.end();)
{ {
auto& campaign = *it; auto& campaign = *it;
if (campaign.Flags & MarketingCampaignFlags::FIRST_WEEK) if (campaign.flags.has(MarketingCampaignFlag::firstWeek))
{ {
// This ensures the campaign is active for x full weeks if started within the // This ensures the campaign is active for x full weeks if started within the
// middle of a week. // middle of a week.
campaign.Flags &= ~MarketingCampaignFlags::FIRST_WEEK; campaign.flags.unset(MarketingCampaignFlag::firstWeek);
} }
else if (campaign.WeeksLeft > 0) else if (campaign.WeeksLeft > 0)
{ {

View File

@@ -10,6 +10,7 @@
#pragma once #pragma once
#include "../Cheats.h" #include "../Cheats.h"
#include "../core/FlagHolder.hpp"
#include "../localisation/StringIdType.h" #include "../localisation/StringIdType.h"
#include "../ride/RideTypes.h" #include "../ride/RideTypes.h"
#include "../ride/ShopItem.h" #include "../ride/ShopItem.h"
@@ -41,11 +42,20 @@ enum
CAMPAIGN_ACTIVE_FLAG = (1 << 7) CAMPAIGN_ACTIVE_FLAG = (1 << 7)
}; };
namespace OpenRCT2
{
enum class MarketingCampaignFlag : uint8_t
{
firstWeek,
};
using MarketingCampaignFlags = FlagHolder<uint8_t, MarketingCampaignFlag>;
} // namespace OpenRCT2
struct MarketingCampaign struct MarketingCampaign
{ {
uint8_t Type{}; uint8_t Type{};
uint8_t WeeksLeft{}; uint8_t WeeksLeft{};
uint8_t Flags{}; OpenRCT2::MarketingCampaignFlags flags{};
union union
{ {
::RideId RideId{}; ::RideId RideId{};
@@ -53,11 +63,6 @@ struct MarketingCampaign
}; };
}; };
namespace OpenRCT2::MarketingCampaignFlags
{
constexpr uint8_t FIRST_WEEK = 1 << 0;
}
extern const money64 AdvertisingCampaignPricePerWeek[ADVERTISING_CAMPAIGN_COUNT]; extern const money64 AdvertisingCampaignPricePerWeek[ADVERTISING_CAMPAIGN_COUNT];
extern const StringId kMarketingCampaignNames[ADVERTISING_CAMPAIGN_COUNT][3]; extern const StringId kMarketingCampaignNames[ADVERTISING_CAMPAIGN_COUNT][3];

View File

@@ -947,7 +947,7 @@ namespace OpenRCT2
cs.ReadWriteVector(gameState.marketingCampaigns, [&cs](MarketingCampaign& campaign) { cs.ReadWriteVector(gameState.marketingCampaigns, [&cs](MarketingCampaign& campaign) {
cs.ReadWrite(campaign.Type); cs.ReadWrite(campaign.Type);
cs.ReadWrite(campaign.WeeksLeft); cs.ReadWrite(campaign.WeeksLeft);
cs.ReadWrite(campaign.Flags); cs.ReadWrite(campaign.flags.holder);
cs.ReadWrite(campaign.RideId); cs.ReadWrite(campaign.RideId);
}); });

View File

@@ -1615,7 +1615,7 @@ namespace OpenRCT2::RCT2
campaign.WeeksLeft = _s6.CampaignWeeksLeft[i] & ~(CAMPAIGN_ACTIVE_FLAG | CAMPAIGN_FIRST_WEEK_FLAG); campaign.WeeksLeft = _s6.CampaignWeeksLeft[i] & ~(CAMPAIGN_ACTIVE_FLAG | CAMPAIGN_FIRST_WEEK_FLAG);
if ((_s6.CampaignWeeksLeft[i] & CAMPAIGN_FIRST_WEEK_FLAG) != 0) if ((_s6.CampaignWeeksLeft[i] & CAMPAIGN_FIRST_WEEK_FLAG) != 0)
{ {
campaign.Flags |= MarketingCampaignFlags::FIRST_WEEK; campaign.flags.set(MarketingCampaignFlag::firstWeek);
} }
if (campaign.Type == ADVERTISING_CAMPAIGN_RIDE_FREE || campaign.Type == ADVERTISING_CAMPAIGN_RIDE) if (campaign.Type == ADVERTISING_CAMPAIGN_RIDE_FREE || campaign.Type == ADVERTISING_CAMPAIGN_RIDE)
{ {