diff --git a/CGame.cpp b/CGame.cpp index 2b28fd3..6f2cedd 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,32 @@ 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 = dynamic_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", fullscreen); +} + +void CGame::SaveSettings() const +{ + libsiedler2::Archiv settings; + settings.push(std::make_unique("editor")); + 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); +} + void CGame::GameLoop() { for(auto&& callback : Callbacks) @@ -309,6 +337,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 20e66c8..25e6ff0 100644 --- a/CGame.h +++ b/CGame.h @@ -69,6 +69,9 @@ class CGame void RecreateDisplayResources(); public: + void LoadSettings(); + void SaveSettings() const; + CGame(Extent GameResolution_, bool fullscreen_); ~CGame(); diff --git a/CGame_Event.cpp b/CGame_Event.cpp index 2292f5d..ed9570c 100644 --- a/CGame_Event.cpp +++ b/CGame_Event.cpp @@ -66,7 +66,10 @@ void CGame::EventHandling(SDL_Event* Event) case SDLK_RETURN: case SDLK_KP_ENTER: if(Event->key.keysym.mod & KMOD_ALT) + { fullscreen = !fullscreen; + SaveSettings(); + } break; #ifdef _ADMINMODE 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 6cde216..9ca6dbf 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) @@ -251,9 +252,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); @@ -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: @@ -317,6 +319,7 @@ void callback::submenuOptions(int Param) case GRAPHICS_CHANGE: assert(SubMenu); + global::s2->SaveSettings(); SubMenu->setWaste(); TextResolution = nullptr; ButtonFullscreen = nullptr; @@ -577,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; } }