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)