From 9688d93e46be7835c7aef961ca27b73fd530b2b7 Mon Sep 17 00:00:00 2001 From: Rik Smeets <30838294+rik-smeets@users.noreply.github.com> Date: Fri, 18 Nov 2022 13:26:52 +0100 Subject: [PATCH] Open campaign tab from finished campaign news MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a marketing campaign is finished, it is likely the player wants to renew it. This change allows the ‘Campaigns’ tab in the 'Finances' window to be opened from the news item of the finished campaign. --- distribution/changelog.txt | 1 + distribution/openrct2.d.ts | 2 +- src/openrct2-ui/WindowManager.cpp | 2 ++ src/openrct2-ui/windows/Finances.cpp | 22 ++++++++++++++----- src/openrct2-ui/windows/GameBottomToolbar.cpp | 1 + src/openrct2-ui/windows/News.cpp | 1 + src/openrct2-ui/windows/Window.h | 1 + src/openrct2/interface/InteractiveConsole.cpp | 3 ++- src/openrct2/interface/Window.h | 1 + src/openrct2/management/Marketing.cpp | 2 +- src/openrct2/management/NewsItem.cpp | 3 +++ src/openrct2/management/NewsItem.h | 2 ++ .../bindings/world/ScParkMessage.hpp | 2 +- 13 files changed, 33 insertions(+), 10 deletions(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index b40dd3d030..1bd3ed6120 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -13,6 +13,7 @@ - Improved: [#18428] [Plugin] Add widget description interfaces to documentation. - Improved: [#18487] Mini Helicopters track can now draw spinning tunnels. - Improved: [#18013, #18016, #18018, #18019, #18514] Added colour presets to Spiral Slide, Dodgems, Boat Hire, Flying Saucers, and Car Ride. +- Change: [#17677] Open campaign window from finished campaign news. - Change: [#17998] Show cursor when using inverted mouse dragging. - Change: [#18230] Make the large flat to steep pieces available on the corkscrew roller coaster without cheats. - Change: [#18381] Convert custom invisible paths to the built-in ones. diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 8f1e66176a..77f16b7575 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -1915,7 +1915,7 @@ declare global { * The type of park message, including icon and behaviour. */ type ParkMessageType = - "attraction" | "peep_on_attraction" | "peep" | "money" | "blank" | "research" | "guests" | "award" | "chart"; + "attraction" | "peep_on_attraction" | "peep" | "money" | "blank" | "research" | "guests" | "award" | "chart" | "campaign"; interface ParkMessage { /** diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index c5c565d4f2..3fcb5f44e8 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -174,6 +174,8 @@ public: return WindowChangelogOpen(WV_CHANGELOG); case WV_NEW_VERSION_INFO: return WindowChangelogOpen(WV_NEW_VERSION_INFO); + case WV_FINANCE_MARKETING: + return WindowFinancesMarketingOpen(); default: return nullptr; } diff --git a/src/openrct2-ui/windows/Finances.cpp b/src/openrct2-ui/windows/Finances.cpp index 7089d18f2c..988383a7d2 100644 --- a/src/openrct2-ui/windows/Finances.cpp +++ b/src/openrct2-ui/windows/Finances.cpp @@ -1014,6 +1014,16 @@ public: } }; +static FinancesWindow* FinancesWindowOpen(uint8_t page) +{ + auto* window = WindowFocusOrCreate(WindowClass::Finances, WW_OTHER_TABS, WH_SUMMARY, WF_10); + + if (window != nullptr && page != WINDOW_FINANCES_PAGE_SUMMARY) + window->SetPage(page); + + return window; +} + rct_window* WindowFinancesOpen() { return WindowFocusOrCreate(WindowClass::Finances, WW_OTHER_TABS, WH_SUMMARY, WF_10); @@ -1021,10 +1031,10 @@ rct_window* WindowFinancesOpen() rct_window* WindowFinancesResearchOpen() { - auto* window = WindowFocusOrCreate(WindowClass::Finances, WW_OTHER_TABS, WH_SUMMARY, WF_10); - - if (window != nullptr) - window->SetPage(WINDOW_FINANCES_PAGE_RESEARCH); - - return window; + return FinancesWindowOpen(WINDOW_FINANCES_PAGE_RESEARCH); +} + +rct_window* WindowFinancesMarketingOpen() +{ + return FinancesWindowOpen(WINDOW_FINANCES_PAGE_MARKETING); } diff --git a/src/openrct2-ui/windows/GameBottomToolbar.cpp b/src/openrct2-ui/windows/GameBottomToolbar.cpp index 668a13aef0..2e1f9ec5b3 100644 --- a/src/openrct2-ui/windows/GameBottomToolbar.cpp +++ b/src/openrct2-ui/windows/GameBottomToolbar.cpp @@ -630,6 +630,7 @@ static void WindowGameBottomToolbarDrawNewsItem(rct_drawpixelinfo* dpi, rct_wind break; } case News::ItemType::Money: + case News::ItemType::Campaign: gfx_draw_sprite(dpi, ImageId(SPR_FINANCE), screenCoords); break; case News::ItemType::Research: diff --git a/src/openrct2-ui/windows/News.cpp b/src/openrct2-ui/windows/News.cpp index cd21f03765..9d2e123d64 100644 --- a/src/openrct2-ui/windows/News.cpp +++ b/src/openrct2-ui/windows/News.cpp @@ -264,6 +264,7 @@ public: break; } case News::ItemType::Money: + case News::ItemType::Campaign: gfx_draw_sprite(&dpi, ImageId(SPR_FINANCE), screenCoords); break; case News::ItemType::Research: diff --git a/src/openrct2-ui/windows/Window.h b/src/openrct2-ui/windows/Window.h index e186b1efe6..a33e6b91c5 100644 --- a/src/openrct2-ui/windows/Window.h +++ b/src/openrct2-ui/windows/Window.h @@ -79,6 +79,7 @@ rct_window* WindowAssetPacksOpen(); // WC_FINANCES rct_window* WindowFinancesOpen(); rct_window* WindowFinancesResearchOpen(); +rct_window* WindowFinancesMarketingOpen(); // WC_PARK_INFORMATION rct_window* WindowParkAwardsOpen(); diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index a2216ab991..c11ebf8609 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -1828,7 +1828,7 @@ static int32_t cc_add_news_item([[maybe_unused]] InteractiveConsole& console, [[ if (argv.size() < 2) { console.WriteLineWarning("Too few arguments"); - static_assert(News::ItemTypeCount == 10, "News::ItemType::Count changed, update console command!"); + static_assert(News::ItemTypeCount == 11, "News::ItemType::Count changed, update console command!"); console.WriteLine("add_news_item [assoc]"); console.WriteLine("type is one of:"); console.WriteLine(" 0 (News::ItemType::Null)"); @@ -1841,6 +1841,7 @@ static int32_t cc_add_news_item([[maybe_unused]] InteractiveConsole& console, [[ console.WriteLine(" 7 (News::ItemType::Peeps)"); console.WriteLine(" 8 (News::ItemType::Award)"); console.WriteLine(" 9 (News::ItemType::Graph)"); + console.WriteLine(" 10 (News::ItemType::Campaign)"); console.WriteLine("message is the message to display, wrapped in quotes for multiple words"); console.WriteLine("assoc is the associated id of ride/peep/tile/etc. If the selected ItemType doesn't need an assoc " "(Null, Money, Award, Graph), you can leave this field blank"); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index a850da4865..02909a72e8 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -375,6 +375,7 @@ enum WV_EDITOR_BOTTOM_TOOLBAR, WV_CHANGELOG, WV_NEW_VERSION_INFO, + WV_FINANCE_MARKETING, }; enum WindowDetail diff --git a/src/openrct2/management/Marketing.cpp b/src/openrct2/management/Marketing.cpp index eda58db551..215cc5037a 100644 --- a/src/openrct2/management/Marketing.cpp +++ b/src/openrct2/management/Marketing.cpp @@ -88,7 +88,7 @@ static void marketing_raise_finished_notification(const MarketingCampaign& campa ft.Add(GetShopItemDescriptor(campaign.ShopItemType).Naming.Plural); } - News::AddItemToQueue(News::ItemType::Money, MarketingCampaignNames[campaign.Type][2], 0, ft); + News::AddItemToQueue(News::ItemType::Campaign, MarketingCampaignNames[campaign.Type][2], 0, ft); } } diff --git a/src/openrct2/management/NewsItem.cpp b/src/openrct2/management/NewsItem.cpp index 1f4ee7bc25..52ec2c704e 100644 --- a/src/openrct2/management/NewsItem.cpp +++ b/src/openrct2/management/NewsItem.cpp @@ -385,6 +385,9 @@ void News::OpenSubject(News::ItemType type, int32_t subject) case News::ItemType::Money: ContextOpenWindow(WindowClass::Finances); break; + case News::ItemType::Campaign: + ContextOpenWindowView(WV_FINANCE_MARKETING); + break; case News::ItemType::Research: { auto item = ResearchItem(subject, ResearchCategory::Transport, 0); diff --git a/src/openrct2/management/NewsItem.h b/src/openrct2/management/NewsItem.h index 1102f6ddcb..c07e438b4d 100644 --- a/src/openrct2/management/NewsItem.h +++ b/src/openrct2/management/NewsItem.h @@ -36,6 +36,7 @@ namespace News Peeps, Award, Graph, + Campaign, Count }; @@ -81,6 +82,7 @@ namespace News case News::ItemType::Peeps: case News::ItemType::Award: case News::ItemType::Graph: + case News::ItemType::Campaign: return News::ItemTypeProperty::HasSubject; case News::ItemType::Ride: case News::ItemType::PeepOnRide: diff --git a/src/openrct2/scripting/bindings/world/ScParkMessage.hpp b/src/openrct2/scripting/bindings/world/ScParkMessage.hpp index 927d0f1e8b..8a607e5294 100644 --- a/src/openrct2/scripting/bindings/world/ScParkMessage.hpp +++ b/src/openrct2/scripting/bindings/world/ScParkMessage.hpp @@ -23,7 +23,7 @@ namespace OpenRCT2::Scripting { static constexpr const char* ParkMessageTypeStrings[] = { - "attraction", "peep_on_attraction", "peep", "money", "blank", "research", "guests", "award", "chart", + "attraction", "peep_on_attraction", "peep", "money", "blank", "research", "guests", "award", "chart", "campaign", }; inline News::ItemType GetParkMessageType(const std::string& key)