Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move gNewsItems to GameState #21403

Merged
merged 3 commits into from
Feb 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions src/openrct2-ui/windows/News.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <openrct2-ui/interface/Widget.h>
#include <openrct2-ui/windows/Window.h>
#include <openrct2/Context.h>
#include <openrct2/GameState.h>
#include <openrct2/audio/audio.h>
#include <openrct2/drawing/Drawing.h>
#include <openrct2/entity/EntityRegistry.h>
Expand All @@ -21,6 +22,8 @@
#include <openrct2/management/NewsItem.h>
#include <openrct2/sprites.h>

using namespace OpenRCT2;

static constexpr StringId WINDOW_TITLE = STR_RECENT_MESSAGES;
static constexpr int32_t WH = 300;
static constexpr int32_t WW = 400;
Expand Down Expand Up @@ -92,13 +95,14 @@ class NewsWindow final : public Window

size_t j = _pressedNewsItemIndex;
_pressedNewsItemIndex = -1;
auto& gameState = GetGameState();

if (j >= gNewsItems.GetArchived().size())
if (j >= gameState.NewsItems.GetArchived().size())
{
return;
}

const auto& newsItem = gNewsItems.GetArchived()[j];
const auto& newsItem = gameState.NewsItems.GetArchived()[j];
if (newsItem.HasButton())
{
return;
Expand All @@ -121,7 +125,7 @@ class NewsWindow final : public Window

ScreenSize OnScrollGetSize(int32_t scrollIndex) override
{
int32_t scrollHeight = static_cast<int32_t>(gNewsItems.GetArchived().size()) * CalculateItemHeight();
int32_t scrollHeight = static_cast<int32_t>(GetGameState().NewsItems.GetArchived().size()) * CalculateItemHeight();
return { WW, scrollHeight };
}

Expand All @@ -131,7 +135,7 @@ class NewsWindow final : public Window
int32_t i = 0;
int32_t buttonIndex = 0;
auto mutableScreenCoords = screenCoords;
for (const auto& newsItem : gNewsItems.GetArchived())
for (const auto& newsItem : GetGameState().NewsItems.GetArchived())
{
if (mutableScreenCoords.y < itemHeight)
{
Expand Down Expand Up @@ -178,7 +182,7 @@ class NewsWindow final : public Window
int32_t y = 0;
int32_t i = 0;

for (const auto& newsItem : gNewsItems.GetArchived())
for (const auto& newsItem : GetGameState().NewsItems.GetArchived())
{
if (y >= dpi.y + dpi.height)
break;
Expand Down
3 changes: 3 additions & 0 deletions src/openrct2/GameState.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include "Date.h"
#include "management/Finance.h"
#include "management/NewsItem.h"
#include "scenario/Scenario.h"
#include "world/Banner.h"
#include "world/Climate.h"
Expand Down Expand Up @@ -73,6 +74,8 @@ namespace OpenRCT2

std::vector<Banner> Banners;

News::ItemQueues NewsItems;

colour_t StaffHandymanColour;
colour_t StaffMechanicColour;
colour_t StaffSecurityColour;
Expand Down
41 changes: 23 additions & 18 deletions src/openrct2/management/NewsItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "NewsItem.h"

#include "../Context.h"
#include "../GameState.h"
#include "../Input.h"
#include "../OpenRCT2.h"
#include "../audio/audio.h"
Expand All @@ -29,7 +30,7 @@
#include "../windows/Intent.h"
#include "../world/Location.hpp"

News::ItemQueues gNewsItems;
using namespace OpenRCT2;

News::Item& News::ItemQueues::Current()
{
Expand All @@ -53,7 +54,7 @@ bool News::IsValidIndex(int32_t index)

News::Item* News::GetItem(int32_t index)
{
return gNewsItems.At(index);
return GetGameState().NewsItems.At(index);
}

News::Item& News::ItemQueues::operator[](size_t index)
Expand Down Expand Up @@ -86,7 +87,7 @@ const News::Item* News::ItemQueues::At(int32_t index) const

bool News::IsQueueEmpty()
{
return gNewsItems.IsEmpty();
return GetGameState().NewsItems.IsEmpty();
}

bool News::ItemQueues::IsEmpty() const
Expand All @@ -106,8 +107,9 @@ void News::ItemQueues::Clear()

void News::InitQueue()
{
gNewsItems.Clear();
assert(gNewsItems.IsEmpty());
auto& gameState = GetGameState();
gameState.NewsItems.Clear();
assert(gameState.NewsItems.IsEmpty());

// Throttles for warning types (PEEP_*_WARNING)
for (auto& warningThrottle : gPeepWarningThrottle)
Expand All @@ -126,7 +128,7 @@ uint16_t News::ItemQueues::IncrementTicks()

static void TickCurrent()
{
int32_t ticks = gNewsItems.IncrementTicks();
int32_t ticks = GetGameState().NewsItems.IncrementTicks();
// Only play news item sound when in normal playing mode
if (ticks == 1 && (gScreenFlags == SCREEN_FLAGS_PLAYING))
{
Expand Down Expand Up @@ -157,8 +159,9 @@ void News::UpdateCurrentItem()
{
PROFILED_FUNCTION();

auto& gameState = GetGameState();
// Check if there is a current news item
if (gNewsItems.IsEmpty())
if (gameState.NewsItems.IsEmpty())
return;

auto intent = Intent(INTENT_ACTION_INVALIDATE_TICKER_NEWS);
Expand All @@ -168,8 +171,8 @@ void News::UpdateCurrentItem()
TickCurrent();

// Removal of current news item
if (gNewsItems.CurrentShouldBeArchived())
gNewsItems.ArchiveCurrent();
if (gameState.NewsItems.CurrentShouldBeArchived())
gameState.NewsItems.ArchiveCurrent();
}

/**
Expand All @@ -178,7 +181,7 @@ void News::UpdateCurrentItem()
*/
void News::CloseCurrentItem()
{
gNewsItems.ArchiveCurrent();
GetGameState().NewsItems.ArchiveCurrent();
}

void News::ItemQueues::ArchiveCurrent()
Expand Down Expand Up @@ -324,7 +327,7 @@ News::Item* News::AddItemToQueue(ItemType type, StringId string_id, EntityId ass
News::Item* News::AddItemToQueue(News::ItemType type, const utf8* text, uint32_t assoc)
{
auto& date = GetDate();
News::Item* newsItem = gNewsItems.FirstOpenOrNewSlot();
News::Item* newsItem = GetGameState().NewsItems.FirstOpenOrNewSlot();
newsItem->Type = type;
newsItem->Flags = 0;
newsItem->Assoc = assoc; // Make optional for Award, Money, Graph and Null
Expand Down Expand Up @@ -434,20 +437,21 @@ void News::OpenSubject(News::ItemType type, int32_t subject)
*/
void News::DisableNewsItems(News::ItemType type, uint32_t assoc)
{
auto& gameState = GetGameState();
// TODO: write test invalidating windows
gNewsItems.ForeachRecentNews([type, assoc](auto& newsItem) {
gameState.NewsItems.ForeachRecentNews([type, assoc, gameState](auto& newsItem) {
if (type == newsItem.Type && assoc == newsItem.Assoc)
{
newsItem.SetFlags(News::ItemFlags::HasButton);
if (&newsItem == &gNewsItems.Current())
if (&newsItem == &gameState.NewsItems.Current())
{
auto intent = Intent(INTENT_ACTION_INVALIDATE_TICKER_NEWS);
ContextBroadcastIntent(&intent);
}
}
});

gNewsItems.ForeachArchivedNews([type, assoc](auto& newsItem) {
gameState.NewsItems.ForeachArchivedNews([type, assoc](auto& newsItem) {
if (type == newsItem.Type && assoc == newsItem.Assoc)
{
newsItem.SetFlags(News::ItemFlags::HasButton);
Expand All @@ -458,7 +462,7 @@ void News::DisableNewsItems(News::ItemType type, uint32_t assoc)

void News::AddItemToQueue(News::Item* newNewsItem)
{
News::Item* newsItem = gNewsItems.FirstOpenOrNewSlot();
News::Item* newsItem = GetGameState().NewsItems.FirstOpenOrNewSlot();
*newsItem = *newNewsItem;
}

Expand All @@ -467,14 +471,15 @@ void News::RemoveItem(int32_t index)
if (index < 0 || index >= News::MaxItems)
return;

auto& gameState = GetGameState();
// News item is already null, no need to remove it
if (gNewsItems[index].Type == News::ItemType::Null)
if (gameState.NewsItems[index].Type == News::ItemType::Null)
return;

size_t newsBoundary = index < News::ItemHistoryStart ? News::ItemHistoryStart : News::MaxItems;
for (size_t i = index; i < newsBoundary - 1; i++)
{
gNewsItems[i] = gNewsItems[i + 1];
gameState.NewsItems[i] = gameState.NewsItems[i + 1];
}
gNewsItems[newsBoundary - 1].Type = News::ItemType::Null;
gameState.NewsItems[newsBoundary - 1].Type = News::ItemType::Null;
}
2 changes: 0 additions & 2 deletions src/openrct2/management/NewsItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,5 +313,3 @@ namespace News
void AddItemToQueue(News::Item* newNewsItem);
void RemoveItem(int32_t index);
} // namespace News

extern News::ItemQueues gNewsItems;
16 changes: 9 additions & 7 deletions src/openrct2/park/ParkFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1000,36 +1000,38 @@ namespace OpenRCT2

void ReadWriteNotificationsChunk(GameState_t& gameState, OrcaStream& os)
{
os.ReadWriteChunk(ParkFileChunkType::NOTIFICATIONS, [](OrcaStream::ChunkStream& cs) {
os.ReadWriteChunk(ParkFileChunkType::NOTIFICATIONS, [&gameState](OrcaStream::ChunkStream& cs) {
if (cs.GetMode() == OrcaStream::Mode::READING)
{
gNewsItems.Clear();
gameState.NewsItems.Clear();

std::vector<News::Item> recent;
cs.ReadWriteVector(recent, [&cs](News::Item& item) { ReadWriteNewsItem(cs, item); });
for (size_t i = 0; i < std::min<size_t>(recent.size(), News::ItemHistoryStart); i++)
{
gNewsItems[i] = recent[i];
gameState.NewsItems[i] = recent[i];
}

std::vector<News::Item> archived;
cs.ReadWriteVector(archived, [&cs](News::Item& item) { ReadWriteNewsItem(cs, item); });
size_t offset = News::ItemHistoryStart;
for (size_t i = 0; i < std::min<size_t>(archived.size(), News::MaxItemsArchive); i++)
{
gNewsItems[offset + i] = archived[i];
gameState.NewsItems[offset + i] = archived[i];
}

// Still need to set the correct type to properly terminate the queue
if (archived.size() < News::MaxItemsArchive)
gNewsItems[offset + archived.size()].Type = News::ItemType::Null;
gameState.NewsItems[offset + archived.size()].Type = News::ItemType::Null;
}
else
{
std::vector<News::Item> recent(std::begin(gNewsItems.GetRecent()), std::end(gNewsItems.GetRecent()));
std::vector<News::Item> recent(
std::begin(gameState.NewsItems.GetRecent()), std::end(gameState.NewsItems.GetRecent()));
cs.ReadWriteVector(recent, [&cs](News::Item& item) { ReadWriteNewsItem(cs, item); });

std::vector<News::Item> archived(std::begin(gNewsItems.GetArchived()), std::end(gNewsItems.GetArchived()));
std::vector<News::Item> archived(
std::begin(gameState.NewsItems.GetArchived()), std::end(gameState.NewsItems.GetArchived()));
cs.ReadWriteVector(archived, [&cs](News::Item& item) { ReadWriteNewsItem(cs, item); });
}
});
Expand Down
2 changes: 1 addition & 1 deletion src/openrct2/rct1/S4Importer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2165,7 +2165,7 @@ namespace RCT1
for (size_t i = 0; i < Limits::MaxNewsItems; i++)
{
const RCT12NewsItem* src = &_s4.Messages[i];
News::Item* dst = &gNewsItems[i];
News::Item* dst = &gameState.NewsItems[i];

dst->Type = static_cast<News::ItemType>(src->Type);
dst->Flags = src->Flags;
Expand Down
2 changes: 1 addition & 1 deletion src/openrct2/rct2/S6Importer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ namespace RCT2
for (size_t i = 0; i < Limits::MaxNewsItems; i++)
{
const RCT12NewsItem* src = &_s6.NewsItems[i];
News::Item* dst = &gNewsItems[i];
News::Item* dst = &gameState.NewsItems[i];
if (src->Type < News::ItemTypeCount)
{
dst->Type = static_cast<News::ItemType>(src->Type);
Expand Down
14 changes: 8 additions & 6 deletions src/openrct2/scripting/bindings/world/ScPark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -315,11 +315,12 @@ namespace OpenRCT2::Scripting
std::vector<std::shared_ptr<ScParkMessage>> ScPark::messages_get() const
{
std::vector<std::shared_ptr<ScParkMessage>> result;
for (size_t i = 0, newsSize = gNewsItems.GetRecent().size(); i < newsSize; i++)
auto& gameState = GetGameState();
for (size_t i = 0, newsSize = gameState.NewsItems.GetRecent().size(); i < newsSize; i++)
{
result.push_back(std::make_shared<ScParkMessage>(i));
}
for (size_t i = 0, newsSize = gNewsItems.GetArchived().size(); i < newsSize; i++)
for (size_t i = 0, newsSize = gameState.NewsItems.GetArchived().size(); i < newsSize; i++)
{
result.push_back(std::make_shared<ScParkMessage>(i + News::ItemHistoryStart));
}
Expand All @@ -330,6 +331,7 @@ namespace OpenRCT2::Scripting
{
int32_t index = 0;
int32_t archiveIndex = News::ItemHistoryStart;
auto& gameState = GetGameState();
for (const auto& item : value)
{
auto isArchived = item["isArchived"].as_bool();
Expand All @@ -338,15 +340,15 @@ namespace OpenRCT2::Scripting
{
if (archiveIndex < News::MaxItems)
{
gNewsItems[archiveIndex] = newsItem;
gameState.NewsItems[archiveIndex] = newsItem;
archiveIndex++;
}
}
else
{
if (index < News::ItemHistoryStart)
{
gNewsItems[index] = newsItem;
gameState.NewsItems[index] = newsItem;
index++;
}
}
Expand All @@ -355,11 +357,11 @@ namespace OpenRCT2::Scripting
// End the lists by setting next item to null
if (index < News::ItemHistoryStart)
{
gNewsItems[index].Type = News::ItemType::Null;
gameState.NewsItems[index].Type = News::ItemType::Null;
}
if (archiveIndex < News::MaxItems)
{
gNewsItems[archiveIndex].Type = News::ItemType::Null;
gameState.NewsItems[archiveIndex].Type = News::ItemType::Null;
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/openrct2/scripting/bindings/world/ScParkMessage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ namespace OpenRCT2::Scripting

News::Item* ScParkMessage::GetMessage() const
{
return &gNewsItems[_index];
return &GetGameState().NewsItems[_index];
}

bool ScParkMessage::isArchived_get() const
Expand Down
Loading