From b8a6051b7d3bafc65ae394c05c9c89922efcbfcf Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Sun, 21 Jun 2026 23:18:27 +0200 Subject: [PATCH 1/6] Persist screen resolution --- CGame.cpp | 32 ++++++++++++++++++++++++++++++++ CGame.h | 3 +++ CGame_Event.cpp | 5 ++++- CMakeLists.txt | 2 +- callbacks.cpp | 1 + 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/CGame.cpp b/CGame.cpp index 2b28fd3..4c72e05 100644 --- a/CGame.cpp +++ b/CGame.cpp @@ -11,6 +11,8 @@ #include "files.h" #include "globals.h" #include "s25util/file_handle.h" +#include +#include #include #include #include @@ -156,6 +158,35 @@ void CGame::delMapObj() MapObj.reset(); } +void CGame::LoadSettings() +{ + const bfs::path settingsPath = RTTRCONFIG.ExpandPath("/s25edit.ini"); + libsiedler2::Archiv settings; + if(libsiedler2::Load(settingsPath, settings) != 0) + return; + const auto* ini = static_cast(settings.find("editor")); + if(!ini) + return; + GameResolution.x = ini->getValue("width", static_cast(GameResolution.x)); + GameResolution.y = ini->getValue("height", static_cast(GameResolution.y)); + fullscreen = ini->getValue("fullscreen", static_cast(fullscreen)) != 0; +} + +void CGame::SaveSettings() const +{ + libsiedler2::Archiv settings; + settings.alloc(1); + settings.set(0, std::make_unique("editor")); + auto* ini = static_cast(settings.find("editor")); + if(!ini) + return; + ini->setValue("width", GameResolution.x); + ini->setValue("height", GameResolution.y); + ini->setValue("fullscreen", static_cast(fullscreen)); + const bfs::path settingsPath = RTTRCONFIG.ExpandPath("/s25edit.ini"); + libsiedler2::Write(settingsPath, settings); +} + void CGame::GameLoop() { for(auto&& callback : Callbacks) @@ -309,6 +340,7 @@ int main(int argc, char* argv[]) auto s2 = std::make_unique( Extent(programOptions["width"].as(), programOptions["height"].as()), programOptions["fullscreen"].as()); + s2->LoadSettings(); result = s2->Execute(); } catch(...) { diff --git a/CGame.h b/CGame.h index f1e74eb..4da1bba 100644 --- a/CGame.h +++ b/CGame.h @@ -67,6 +67,9 @@ class CGame void SetAppIcon(); public: + void LoadSettings(); + void SaveSettings() const; + CGame(Extent GameResolution_, bool fullscreen_); ~CGame(); diff --git a/CGame_Event.cpp b/CGame_Event.cpp index 8799fcd..fe0f993 100644 --- a/CGame_Event.cpp +++ b/CGame_Event.cpp @@ -63,7 +63,10 @@ void CGame::EventHandling(SDL_Event* Event) switch(Event->key.keysym.sym) { - case SDLK_F2: fullscreen = !fullscreen; break; + case SDLK_F2: + fullscreen = !fullscreen; + SaveSettings(); + break; #ifdef _ADMINMODE case SDLK_F3: // if CTRL and ALT are pressed diff --git a/CMakeLists.txt b/CMakeLists.txt index 1cce50a..a6e3788 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,7 @@ ELSE() ENDIF() add_executable(s25edit ${MAIN_SOURCES} ${CIO_SOURCES} ${icon_RC}) -target_link_libraries(s25edit PRIVATE SGE rttrConfig s25Common gamedata endian::static Boost::nowide PUBLIC Boost::disable_autolinking Boost::program_options) +target_link_libraries(s25edit PRIVATE SGE rttrConfig s25Common gamedata siedler2 endian::static Boost::nowide PUBLIC Boost::disable_autolinking Boost::program_options) target_include_directories(s25edit PRIVATE include) target_compile_features(s25edit PRIVATE cxx_std_17) diff --git a/callbacks.cpp b/callbacks.cpp index 31ede4d..84230b6 100644 --- a/callbacks.cpp +++ b/callbacks.cpp @@ -317,6 +317,7 @@ void callback::submenuOptions(int Param) case GRAPHICS_CHANGE: assert(SubMenu); + global::s2->SaveSettings(); SubMenu->setWaste(); TextResolution = nullptr; ButtonFullscreen = nullptr; From 7b2419eae5118fba258b1b1258484a2b6ad800a2 Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Sun, 21 Jun 2026 23:21:58 +0200 Subject: [PATCH 2/6] Increase resolution list height --- callbacks.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/callbacks.cpp b/callbacks.cpp index 84230b6..308ece6 100644 --- a/callbacks.cpp +++ b/callbacks.cpp @@ -251,9 +251,9 @@ void callback::submenuOptions(int Param) if(ButtonFullscreen) SubMenu->delButton(ButtonFullscreen); ButtonFullscreen = - SubMenu->addButton(submenuOptions, FULLSCREEN, (int)(global::s2->GameResolution.x / 2 - 100), 190, 200, + SubMenu->addButton(submenuOptions, FULLSCREEN, (int)(global::s2->GameResolution.x / 2 - 100), 410, 200, 20, BUTTON_RED1, (global::s2->fullscreen ? "WINDOW" : "FULLSCREEN")); - SelectBoxRes = SubMenu->addSelectBox(ButtonFullscreen->getPos() - Point16(0, 120), Extent16(200, 110), + SelectBoxRes = SubMenu->addSelectBox(ButtonFullscreen->getPos() - Point16(0, 340), Extent16(200, 330), FontSize::Medium, FontColor::Yellow, BUTTON_GREY); SelectBoxRes->addOption("800 x 600 (SVGA)", submenuOptions, SELECTBOX_800_600); SelectBoxRes->addOption("832 x 624 (Half Megapixel)", submenuOptions, SELECTBOX_832_624); From 5d48e1a2aabcc8e4c6c72608e4ea6e01f66a20b2 Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Sun, 21 Jun 2026 23:24:15 +0200 Subject: [PATCH 3/6] Add 4K UHD resolution --- callbacks.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/callbacks.cpp b/callbacks.cpp index 308ece6..64d16e0 100644 --- a/callbacks.cpp +++ b/callbacks.cpp @@ -229,7 +229,8 @@ void callback::submenuOptions(int Param) SELECTBOX_1920_1400, SELECTBOX_1920_1440, SELECTBOX_2048_1152, - SELECTBOX_2048_1536 + SELECTBOX_2048_1536, + SELECTBOX_3840_2160 }; switch(Param) @@ -297,6 +298,7 @@ void callback::submenuOptions(int Param) SelectBoxRes->addOption("1920 x 1440", submenuOptions, SELECTBOX_1920_1440); SelectBoxRes->addOption("2048 x 1152 (QWXGA)", submenuOptions, SELECTBOX_2048_1152); SelectBoxRes->addOption("2048 x 1536 (SUXGA)", submenuOptions, SELECTBOX_2048_1536); + SelectBoxRes->addOption("3840 x 2160 (4K UHD)", submenuOptions, SELECTBOX_3840_2160); break; case MAINMENU: @@ -578,6 +580,12 @@ void callback::submenuOptions(int Param) submenuOptions(GRAPHICS_CHANGE); break; + case SELECTBOX_3840_2160: + global::s2->GameResolution.x = 3840; + global::s2->GameResolution.y = 2160; + submenuOptions(GRAPHICS_CHANGE); + break; + default: break; } } From 1e1fdcc9ec3ff31dd062d09e6df5f3415cf16caa Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Mon, 22 Jun 2026 11:16:12 +0200 Subject: [PATCH 4/6] dynamic_cast ArchivItem_Ini --- CGame.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CGame.cpp b/CGame.cpp index 4c72e05..a7c7d45 100644 --- a/CGame.cpp +++ b/CGame.cpp @@ -164,7 +164,7 @@ void CGame::LoadSettings() libsiedler2::Archiv settings; if(libsiedler2::Load(settingsPath, settings) != 0) return; - const auto* ini = static_cast(settings.find("editor")); + const auto* ini = dynamic_cast(settings.find("editor")); if(!ini) return; GameResolution.x = ini->getValue("width", static_cast(GameResolution.x)); @@ -177,7 +177,7 @@ void CGame::SaveSettings() const libsiedler2::Archiv settings; settings.alloc(1); settings.set(0, std::make_unique("editor")); - auto* ini = static_cast(settings.find("editor")); + auto* ini = dynamic_cast(settings.find("editor")); if(!ini) return; ini->setValue("width", GameResolution.x); From 97feec2f45f2a54ebfcda7885e45a339449d4892 Mon Sep 17 00:00:00 2001 From: Morgan Christiansson Date: Tue, 23 Jun 2026 14:53:34 +0200 Subject: [PATCH 5/6] Replace alloc(1)+set() with push() Co-authored-by: Alexander Grund --- CGame.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CGame.cpp b/CGame.cpp index a7c7d45..8db5d38 100644 --- a/CGame.cpp +++ b/CGame.cpp @@ -175,8 +175,7 @@ void CGame::LoadSettings() void CGame::SaveSettings() const { libsiedler2::Archiv settings; - settings.alloc(1); - settings.set(0, std::make_unique("editor")); + settings.push(std::make_unique("editor")); auto* ini = dynamic_cast(settings.find("editor")); if(!ini) return; From e27ffde755c35e80215af930fc2ec139d32406e8 Mon Sep 17 00:00:00 2001 From: morganchristiansson Date: Tue, 23 Jun 2026 16:26:32 +0200 Subject: [PATCH 6/6] Simplify fullscreen load; use ref cast in SaveSettings --- CGame.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/CGame.cpp b/CGame.cpp index 8db5d38..6f2cedd 100644 --- a/CGame.cpp +++ b/CGame.cpp @@ -169,19 +169,17 @@ void CGame::LoadSettings() return; GameResolution.x = ini->getValue("width", static_cast(GameResolution.x)); GameResolution.y = ini->getValue("height", static_cast(GameResolution.y)); - fullscreen = ini->getValue("fullscreen", static_cast(fullscreen)) != 0; + fullscreen = ini->getValue("fullscreen", fullscreen); } void CGame::SaveSettings() const { libsiedler2::Archiv settings; settings.push(std::make_unique("editor")); - auto* ini = dynamic_cast(settings.find("editor")); - if(!ini) - return; - ini->setValue("width", GameResolution.x); - ini->setValue("height", GameResolution.y); - ini->setValue("fullscreen", static_cast(fullscreen)); + auto& ini = dynamic_cast(*settings.find("editor")); + ini.setValue("width", GameResolution.x); + ini.setValue("height", GameResolution.y); + ini.setValue("fullscreen", static_cast(fullscreen)); const bfs::path settingsPath = RTTRCONFIG.ExpandPath("/s25edit.ini"); libsiedler2::Write(settingsPath, settings); }