From e9ad2c7a6c22661bdb81b94a8cc14cc418515009 Mon Sep 17 00:00:00 2001 From: SheridanR Date: Mon, 25 Sep 2023 15:53:10 -0700 Subject: [PATCH] Holiday banners + holiday credits Signed-off-by: SheridanR --- lang/en.txt | 99 +++++++++++++- src/files.cpp | 12 +- src/files.hpp | 4 +- src/interface/drawminimap.cpp | 9 +- src/ui/MainMenu.cpp | 239 +++++++++++++++++++++++++--------- 5 files changed, 289 insertions(+), 74 deletions(-) diff --git a/lang/en.txt b/lang/en.txt index 27881d2ad1..de5dda9f30 100644 --- a/lang/en.txt +++ b/lang/en.txt @@ -7730,7 +7730,102 @@ Upload# 6025 Credits# 6026 Display# 6027 View credits for holiday content.# -6028 Credits go here# -6029 Okay# +6028 Next +Page# +6029 Close# + +# Scarony Barony Credits: + +6030 caves00 - Among Us by Myuu +caves01 - Fatal Shrine by Myuu +caves02 - Tormented Souls by Myuu +citadel00 - Evil Returns by Myuu +citadel01 - Friday the 13th by Myuu +citadel02 - October 31st by Myuu# + +6031 endgame - The Order's Theme by Myuu +herxboss - Soul Rail by Myuu +intermission - Echo by Myuu +intro - Ghost Town by Myuu +intro01 - Countdown by Myuu +intro02 - Untold Secrets by Myuu# + +6032 labyrinth00 - Final Showdown by Myuu +labyrinth01 - Living in the Dark by Myuu +labyrinth02 - Silent Turmoil by Myuu +library - Countdown by Myuu +mines00 - Look Out by Myuu +mines01 - Haunted House by Myuu# + +6033 mines02 - Nebula by Myuu +mines03 - Strange Vision by Myuu +mines04 - The Crypt by Myuu +minetown - Haunted By Screams by Myuu +minotaur00 - Run! by Myuu +minotaur01 - Cornered by Myuu# + +6034 ruins00 - You're Next by Myuu +ruins01 - Into the Depths by Myuu +ruins02 - The Backrooms by Myuu +sanctum - Metamorphosis by Myuu +shop - Carnival Freaks by Myuu +swamp00 - Poltergeist by Myuu# + +6035 swamp01 - Abyss by Myuu +swamp02 - Danger by Myuu +swamp03 - Growing Shadows +temple - Extinction by Myuu# + +# Merry Barony credits: + +6036 caves00 - Sleigh Bells by Myuu +caves01 - Deck the Halls by Myuu +caves02 - Snow Wonders by Myuu +citadel00 - Jingle Bells by Myuu +citadel01 - Underneath the Christmas Tree by Myuu +citadel02 - God Rest Ye Merry Gentlemen by Myuu# + +6037 endgame - Disintegrating by Myuu +escape - Deck the Halls by Myuu +hell00 - Deck the Halls by Myuu +hell01 - Santa's Tricks by Myuu +hell02 - Winter Trouble by Myuu +herxboss - Krampus is Here by Myuu# + +6038 intermission - Disintegrating by Myuu +introduction - Disintegrating by Myuu +labyrinth00 - Ice Land (Part 1) by Myuu +labyrinth01 - Holiday Macabre by Myuu +labyrinth02 - Disintegrating by Myuu +library - Santa's Tricks by Myuu# + +6039 mines00 - Sleigh Bells by Myuu +mines01 - God Rest Ye Merry Gentlemen by Myuu +mines02 - Silent Night by Myuu +mines03 - Carol of the Bells by Myuu +mines04 - Angels We Have Heard on High by Myuu +minetown - Underneath the Christmas Tree by Myuu# + +6040 minotaur00 - Krampus is Here by Myuu +minotaur01 - Deck the Halls by Myuu +ruins00 - Ice Land (Part 2) by Myuu +ruins01 - Winter Trouble by Myuu +ruins02 - Snow Wonders by Myuu +sanctum - Krampus is Here by Myuu# + +6041 shop - Sleigh Bells by Myuu +swamp00 - Jingle Bells by Myuu +swamp01 - Rudolph the Red Nosed Reindeer by Myuu +swamp02 - Dance of the Sugar Plum Fairy by Myuu +swamp03 - What Child is This by Myuu +temple - Santa's Tricks by Myuu# + +6042 underworld00 - Ice Land (Part 1) by Myuu +underworld01 - Deck the Halls by Myuu +underworld02 - Winter Trouble by Myuu# + +6043 No holiday currently active.# + +6044 Show Player Callouts# 6100 end# diff --git a/src/files.cpp b/src/files.cpp index 2df4280e60..741ad49771 100644 --- a/src/files.cpp +++ b/src/files.cpp @@ -39,17 +39,17 @@ char outputdir[PATH_MAX]; const char* holidayThemeDirs[HolidayTheme::THEME_MAX] = { "", "themes/scarony/", - "themes/christmas/" + "themes/merry/" }; #ifndef EDITOR -ConsoleVariable cvar_forceHoliday("/force_holiday", 0); +ConsoleVariable cvar_forceHoliday("/force_holiday", 2); ConsoleVariable cvar_disableHoliday("/disable_holiday", false); #endif -HolidayTheme getCurrentHoliday() { +HolidayTheme getCurrentHoliday(bool force) { #ifndef EDITOR - if (*cvar_disableHoliday) { + if (*cvar_disableHoliday && !force) { return HolidayTheme::THEME_NONE; } if (*cvar_forceHoliday) { @@ -75,8 +75,8 @@ HolidayTheme getCurrentHoliday() { } } -bool isCurrentHoliday() { - return getCurrentHoliday() != HolidayTheme::THEME_NONE; +bool isCurrentHoliday(bool force) { + return getCurrentHoliday(force) != HolidayTheme::THEME_NONE; } std::unordered_map mapHashes = { diff --git a/src/files.hpp b/src/files.hpp index 17c210b5d1..e3b1ea32e5 100644 --- a/src/files.hpp +++ b/src/files.hpp @@ -276,8 +276,8 @@ enum HolidayTheme { THEME_MAX }; extern const char* holidayThemeDirs[HolidayTheme::THEME_MAX]; -HolidayTheme getCurrentHoliday(); -bool isCurrentHoliday(); +HolidayTheme getCurrentHoliday(bool force = false); +bool isCurrentHoliday(bool force = false); #ifndef EDITOR #include "interface/consolecommand.hpp" diff --git a/src/interface/drawminimap.cpp b/src/interface/drawminimap.cpp index 0d84dfa70e..d24f22a5af 100644 --- a/src/interface/drawminimap.cpp +++ b/src/interface/drawminimap.cpp @@ -45,12 +45,6 @@ static Mesh circle_mesh; static Mesh triangle_mesh = { { 1.f, .0f, 0.f, - -.5f, .5f, 0.f, - 0.f, .0f, 0.f, - 1.f, .0f, 0.f, - 0.f, 0.f, 0.f, - -.5f, -.5f, 0.f, - 0.f, 0.f, 0.f, -.5f, .5f, 0.f, -.5f, -.5f, 0.f, }, // positions @@ -889,6 +883,9 @@ void drawMinimap(const int player, SDL_Rect rect, bool drawingSharedMap) // draw triangle_mesh.draw(); + + // for outline: + //triangle_mesh.draw(GL_LINE_LOOP); }; const real_t size = entity->sprite == 239 ? 2.0 : 1.0; diff --git a/src/ui/MainMenu.cpp b/src/ui/MainMenu.cpp index 046d375b06..3cb2897651 100644 --- a/src/ui/MainMenu.cpp +++ b/src/ui/MainMenu.cpp @@ -843,6 +843,7 @@ namespace MainMenu { static void settingsVideo(Button&); static void settingsAudio(Button&); static void settingsControls(Button&); + static void settingsOnlinePopulate(Button&, bool); static void settingsOnline(Button&); static void settingsGame(Button&); @@ -1447,30 +1448,33 @@ namespace MainMenu { return field->getText(); // note: this will only be valid for one frame! } - static Frame* binaryPrompt( + static Frame* binaryPromptGeneric( const char* window_text, const char* okay_text, const char* cancel_text, void (*okay_callback)(Button&), void (*cancel_callback)(Button&), - bool leftRed = true, - bool rightRed = false + bool leftRed, + bool rightRed, + bool isSmall ) { soundActivate(); - Frame* frame = createPrompt("binary_prompt"); + Frame* frame = createPrompt("binary_prompt", isSmall); if (!frame) { return nullptr; } auto text = frame->addField("text", 1024); - text->setSize(SDL_Rect{30, 28, 304, 46}); + text->setSize(SDL_Rect{30, 28, frame->getSize().w - 60, isSmall ? 46 : 134}); text->setFont(smallfont_no_outline); text->setText(window_text); text->setJustify(Field::justify_t::CENTER); + + const int buttonsWidth = (leftRed ? 130 : 108) + (rightRed ? 130 : 108) + 4; auto okay = frame->addButton("okay"); - okay->setSize(SDL_Rect{leftRed ? 58 : 72, 78, leftRed ? 130 : 108, 52}); + okay->setSize(SDL_Rect{(frame->getSize().w - buttonsWidth) / 2, frame->getSize().h - 98, leftRed ? 130 : 108, 52}); okay->setBackground(leftRed ? "*images/ui/Main Menus/Disconnect/UI_Disconnect_Button_Abandon00.png" : "*images/ui/Main Menus/Disconnect/UI_Disconnect_Button_GoBack00.png"); @@ -1503,7 +1507,7 @@ namespace MainMenu { }); auto cancel = frame->addButton("cancel"); - cancel->setSize(SDL_Rect{leftRed ? 196 : 188, 78, rightRed ? 130 : 108, 52}); + cancel->setSize(SDL_Rect{(frame->getSize().w - buttonsWidth) / 2 + (leftRed ? 130 : 108) + 4, frame->getSize().h - 98, rightRed ? 130 : 108, 52}); cancel->setBackground(rightRed ? "*images/ui/Main Menus/Disconnect/UI_Disconnect_Button_Abandon00.png" : "*images/ui/Main Menus/Disconnect/UI_Disconnect_Button_GoBack00.png"); @@ -1527,6 +1531,32 @@ namespace MainMenu { return frame; } + static Frame* binaryPrompt( + const char* window_text, + const char* okay_text, + const char* cancel_text, + void (*okay_callback)(Button&), + void (*cancel_callback)(Button&), + bool leftRed = true, + bool rightRed = false + ) { + return binaryPromptGeneric(window_text, okay_text, cancel_text, + okay_callback, cancel_callback, leftRed, rightRed, true); + } + + static Frame* binaryPromptXL( + const char* window_text, + const char* okay_text, + const char* cancel_text, + void (*okay_callback)(Button&), + void (*cancel_callback)(Button&), + bool leftRed = true, + bool rightRed = false + ) { + return binaryPromptGeneric(window_text, okay_text, cancel_text, + okay_callback, cancel_callback, leftRed, rightRed, false); + } + static void closeBinary() { closePrompt("binary_prompt"); } @@ -4887,8 +4917,8 @@ namespace MainMenu { return result; } - static Frame* settingsSubwindowSetup(const char* tab) { - if (!video_refresh) { + static Frame* settingsSubwindowSetup(const char* tab, bool quiet) { + if (!quiet) { soundActivate(); } settings_tab_name = tab; @@ -5869,7 +5899,7 @@ namespace MainMenu { static void settingsGeneral(Button& button) { Frame* settings_subwindow; - if ((settings_subwindow = settingsSubwindowSetup(button.getName())) == nullptr) { + if ((settings_subwindow = settingsSubwindowSetup(button.getName(), false)) == nullptr) { auto settings = main_menu_frame->findFrame("settings"); assert(settings); auto settings_subwindow = settings->findFrame("settings_subwindow"); assert(settings_subwindow); settingsSelect(*settings_subwindow, {Setting::Type::Boolean, "fast_restart"}); @@ -6024,7 +6054,7 @@ namespace MainMenu { static void settingsVideo(Button& button) { Frame* settings_subwindow; - if ((settings_subwindow = settingsSubwindowSetup(button.getName())) == nullptr) { + if ((settings_subwindow = settingsSubwindowSetup(button.getName(), video_refresh != 0)) == nullptr) { auto settings = main_menu_frame->findFrame("settings"); assert(settings); auto settings_subwindow = settings->findFrame("settings_subwindow"); assert(settings_subwindow); #ifdef NINTENDO @@ -6158,7 +6188,7 @@ namespace MainMenu { static void settingsAudio(Button& button) { Frame* settings_subwindow; - if ((settings_subwindow = settingsSubwindowSetup(button.getName())) == nullptr) { + if ((settings_subwindow = settingsSubwindowSetup(button.getName(), false)) == nullptr) { auto settings = main_menu_frame->findFrame("settings"); assert(settings); auto settings_subwindow = settings->findFrame("settings_subwindow"); assert(settings_subwindow); #if defined(NINTENDO) || !defined(USE_FMOD) @@ -6287,7 +6317,7 @@ namespace MainMenu { bound_profile = profile; Frame* settings_subwindow; - if ((settings_subwindow = settingsSubwindowSetup("Controls")) == nullptr) { + if ((settings_subwindow = settingsSubwindowSetup("Controls", false)) == nullptr) { auto settings = main_menu_frame->findFrame("settings"); assert(settings); auto settings_subwindow = settings->findFrame("settings_subwindow"); assert(settings_subwindow); settingsSelect(*settings_subwindow, {Setting::Type::Customize, "bindings"}); @@ -6761,9 +6791,9 @@ namespace MainMenu { settingsControlsPopulate(player, device, profile, {Setting::Type::Dropdown, "player_dropdown_button"}); } - static void settingsOnline(Button& button) { + static void settingsOnlinePopulate(Button& button, bool quiet) { Frame* settings_subwindow; - if ((settings_subwindow = settingsSubwindowSetup(button.getName())) == nullptr) { + if ((settings_subwindow = settingsSubwindowSetup(button.getName(), quiet)) == nullptr) { auto settings = main_menu_frame->findFrame("settings"); assert(settings); auto settings_subwindow = settings->findFrame("settings_subwindow"); assert(settings_subwindow); settingsSelect(*settings_subwindow, {Setting::Type::Field, "port_number"}); @@ -6772,7 +6802,45 @@ namespace MainMenu { int y = 0; auto holiday_credits_fn = [](Button& button){ - monoPromptXL(Language::get(6028), Language::get(6029), [](Button&){soundCancel(); closeMono();}); + static int page_num, page_start; + + const auto holiday = getCurrentHoliday(); + switch (holiday) { + default: + case HolidayTheme::THEME_NONE: page_num = page_start = 6043; break; + case HolidayTheme::THEME_HALLOWEEN: page_num = page_start = 6030; break; + case HolidayTheme::THEME_XMAS: page_num = page_start = 6036; break; + } + + auto next_page_fn = [](Button& button){ + soundActivate(); + ++page_num; + + int page_limit; + const auto holiday = getCurrentHoliday(); + switch (holiday) { + default: + case HolidayTheme::THEME_NONE: page_num = page_limit = 6044; break; + case HolidayTheme::THEME_HALLOWEEN: page_limit = 6036; break; + case HolidayTheme::THEME_XMAS: page_limit = 6043; break; + } + if (page_num >= page_limit) { + page_num = page_start; + } + + auto frame = static_cast(button.getParent()); assert(frame); + auto text = frame->findField("text"); assert(text); + text->setText(Language::get(page_num)); + }; + + binaryPromptXL(Language::get(page_num), Language::get(6028), Language::get(6029), + next_page_fn, [](Button&){ + soundCancel(); + closeBinary(); + auto settings = main_menu_frame->findFrame("settings"); assert(settings); + auto settings_subwindow = settings->findFrame("settings_subwindow"); assert(settings_subwindow); + settingsSelect(*settings_subwindow, {Setting::Type::Customize, "holiday_credits"}); + }, false, true); }; y += settingsAddSubHeader(*settings_subwindow, y, "holiday_themes", Language::get(6022)); @@ -6842,14 +6910,17 @@ namespace MainMenu { {Setting::Type::Customize, "holiday_credits"}, }); #endif - - settingsSubwindowFinalize(*settings_subwindow, y, {Setting::Type::Field, "port_number"}); - settingsSelect(*settings_subwindow, {Setting::Type::Field, "port_number"}); + settingsSubwindowFinalize(*settings_subwindow, y, {Setting::Type::Boolean, "holiday_themes"}); + settingsSelect(*settings_subwindow, {Setting::Type::Boolean, "holiday_themes"}); } + + static void settingsOnline(Button& button) { + settingsOnlinePopulate(button, false); + } static void settingsGame(Button& button) { Frame* settings_subwindow; - if ((settings_subwindow = settingsSubwindowSetup(button.getName())) == nullptr) { + if ((settings_subwindow = settingsSubwindowSetup(button.getName(), false)) == nullptr) { auto settings = main_menu_frame->findFrame("settings"); assert(settings); auto settings_subwindow = settings->findFrame("settings_subwindow"); assert(settings_subwindow); settingsSelect(*settings_subwindow, {Setting::Type::Boolean, "hunger"}); @@ -22407,6 +22478,11 @@ namespace MainMenu { }); int back = c - 1 < 0 ? num_options - 1 : c - 1; int forward = c + 1 >= num_options ? 0 : c + 1; + if (!ingame && c == 0 && isCurrentHoliday(true)) { + button->setWidgetUp("holiday_banner"); + } else { + button->setWidgetUp(options[back].name); + } #ifdef NINTENDO if (ingame || c + 1 < num_options || (enabledDLCPack1 && enabledDLCPack2)) { button->setWidgetDown(options[forward].name); @@ -22420,7 +22496,6 @@ namespace MainMenu { button->setWidgetDown("banner1"); } #endif - button->setWidgetUp(options[back].name); if (!ingame) { button->setWidgetBack("back_button"); } else { @@ -22502,38 +22577,80 @@ namespace MainMenu { ); if (!ingame) { + // holiday notification + const char* holiday_banner_images[2] = { "", "" }; + const auto holiday = getCurrentHoliday(true); + switch (holiday) { + default: break; + case HolidayTheme::THEME_HALLOWEEN: + holiday_banner_images[0] = "*#images/ui/Main Menus/Banners/banner_halloween.png"; + holiday_banner_images[1] = "*#images/ui/Main Menus/Banners/banner_halloween_hover.png"; + break; + case HolidayTheme::THEME_XMAS: + holiday_banner_images[0] = "*#images/ui/Main Menus/Banners/banner_holidays.png"; + holiday_banner_images[1] = "*#images/ui/Main Menus/Banners/banner_holidays_hover.png"; + break; + } + if (holiday != HolidayTheme::THEME_NONE) { + auto notification = main_menu_frame->findFrame("notification"); assert(notification); + const int note_y = notification->getSize().y; + notification->removeSelf(); + notification = main_menu_frame->addFrame("notification"); + notification->setSize(SDL_Rect{(Frame::virtualScreenX - 472) / 2, note_y, 472, 76}); + notification->setActualSize(SDL_Rect{0, 0, notification->getSize().w, notification->getSize().h}); + + auto banner_fn = [](Button& button){ + mainSettings(button); + settingsOnlinePopulate(button, true); + }; + + auto banner = notification->addButton("holiday_banner"); + banner->setBackground(holiday_banner_images[0]); + banner->setBackgroundHighlighted(holiday_banner_images[1]); + banner->setSize(SDL_Rect{0, 0, 472, 76}); + banner->setCallback(banner_fn); + banner->setButtonsOffset(SDL_Rect{0, 8, 0, 0}); + banner->setColor(uint32ColorWhite); + banner->setHighlightColor(uint32ColorWhite); + banner->setWidgetBack("back_button"); + banner->setWidgetDown("Play Game"); +#ifdef NINTENDO + banner->setWidgetUp("Settings"); +#else + banner->setWidgetUp("Quit"); +#endif + } + #ifdef NINTENDO const char* banner_images[][2] = { { "*#images/ui/Main Menus/Banners/UI_MainMenu_QoDPatchNotes1_base.png", "*#images/ui/Main Menus/Banners/UI_MainMenu_QoDPatchNotes1_high.png", }, - { - "#images/ui/Main Menus/Banners/UI_MainMenu_DiscordLink_base.png", - "#images/ui/Main Menus/Banners/UI_MainMenu_DiscordLink_high.png", - }, }; - if (!enabledDLCPack1 && !enabledDLCPack2) { - banner_images[0][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_base.png"; - banner_images[0][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_high.png"; - } - else if (!enabledDLCPack1) { - banner_images[0][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_MnOBanner1_base.png"; - banner_images[0][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_MnOBanner1_high.png"; - } - else if (!enabledDLCPack2) { - banner_images[0][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_LnPBanner1_base.png"; - banner_images[0][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_LnPBanner1_high.png"; - } - void(*banner_funcs[])(Button&) = { - [](Button&){ // banner #1 - if (enabledDLCPack1 && enabledDLCPack2) { - openURLTryWithOverlay("https://www.baronygame.com/blog/qod-update-launched"); - } else { - openDLCPrompt(enabledDLCPack1 ? 1 : 0); - } + + // customize DLC banner. + { + if (!enabledDLCPack1 && !enabledDLCPack2) { + banner_images[0][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_base.png"; + banner_images[0][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_high.png"; + } + else if (!enabledDLCPack1) { + banner_images[0][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_MnOBanner1_base.png"; + banner_images[0][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_MnOBanner1_high.png"; + } + else if (!enabledDLCPack2) { + banner_images[0][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_LnPBanner1_base.png"; + banner_images[0][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_LnPBanner1_high.png"; + } + } + + void(*banner_func[])(Button&) = { + [](Button&){ + openDLCPrompt(enabledDLCPack1 ? 1 : 0); } }; + const int num_banners = (enabledDLCPack1 && enabledDLCPack2) ? 0 : 1; #else @@ -22547,26 +22664,32 @@ namespace MainMenu { "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_high.png", } }; - if ( !enabledDLCPack1 && !enabledDLCPack2 ) { - banner_images[1][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_base.png"; - banner_images[1][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_high.png"; - } - else if ( !enabledDLCPack1 ) { - banner_images[1][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_MnOBanner1_base.png"; - banner_images[1][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_MnOBanner1_high.png"; - } - else if ( !enabledDLCPack2 ) { - banner_images[1][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_LnPBanner1_base.png"; - banner_images[1][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_LnPBanner1_high.png"; - } + + // customize DLC banner. + { + if (!enabledDLCPack1 && !enabledDLCPack2) { + banner_images[1][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_base.png"; + banner_images[1][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_ComboBanner1_high.png"; + } + else if (!enabledDLCPack1) { + banner_images[1][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_MnOBanner1_base.png"; + banner_images[1][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_MnOBanner1_high.png"; + } + else if (!enabledDLCPack2) { + banner_images[1][0] = "*#images/ui/Main Menus/Banners/UI_MainMenu_LnPBanner1_base.png"; + banner_images[1][1] = "*#images/ui/Main Menus/Banners/UI_MainMenu_LnPBanner1_high.png"; + } + } + void(*banner_funcs[])(Button&) = { - [](Button&) { // banner #1 - openURLTryWithOverlay("https://www.baronygame.com/blog/qod-update-launched"); + [](Button& button) { // banner #1 + openURLTryWithOverlay("https://www.baronygame.com/blog/qod-update-launched"); }, [](Button&) { // banner #2 openDLCPrompt(enabledDLCPack1 ? 1 : 0); }, }; + const int num_banners = (enabledDLCPack1 && enabledDLCPack2) ? 1 : sizeof(banner_funcs) / sizeof(banner_funcs[0]); #endif auto banners = main_menu_frame->addFrame("banners");