diff --git a/rwengine/src/engine/GameState.cpp b/rwengine/src/engine/GameState.cpp index ad447879..01d9f3c8 100644 --- a/rwengine/src/engine/GameState.cpp +++ b/rwengine/src/engine/GameState.cpp @@ -1,7 +1,7 @@ #include BasicState::BasicState() - : saveName { "" } + : saveName { 0 } , saveTime { 0, 0, 0, 0, 0, 0, 0, 0 } , islandNumber { 0 } , cameraPosition { } diff --git a/rwengine/src/engine/GameState.hpp b/rwengine/src/engine/GameState.hpp index c8c1149a..7152f379 100644 --- a/rwengine/src/engine/GameState.hpp +++ b/rwengine/src/engine/GameState.hpp @@ -33,8 +33,7 @@ struct SystemTime /** Block 0 State */ struct BasicState { - /// /!\ This is wchar_t[24] in the original format /!\ we convert on load for convenience - char saveName[48]; + GameStringChar saveName[24]; SystemTime saveTime; uint32_t unknown; uint16_t islandNumber; diff --git a/rwengine/src/engine/SaveGame.cpp b/rwengine/src/engine/SaveGame.cpp index fc42ec4a..ad4e9da7 100644 --- a/rwengine/src/engine/SaveGame.cpp +++ b/rwengine/src/engine/SaveGame.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -528,24 +527,6 @@ bool SaveGame::loadGame(GameState& state, const std::string& file) static_assert(sizeof(BasicState) == 0xBC, "BasicState is not the right size"); READ_VALUE(state.basic) - // Convert utf-16 to utf-8 - size_t bytes = 0; - for(;; bytes++ ) { - if(state.basic.saveName[bytes-1] == 0 && state.basic.saveName[bytes] == 0) break; - } - size_t outSize = 24; - char outBuff[48]; - char* outCur = outBuff; - auto icv = iconv_open("UTF-8", "UTF-16"); - char* saveName = (char*)state.basic.saveName; - -#if defined(RW_NETBSD) - iconv(icv, (const char**)&saveName, &bytes, &outCur, &outSize); -#else - iconv(icv, &saveName, &bytes, &outCur, &outSize); -#endif - strcpy(state.basic.saveName, outBuff); - BlockDword scriptBlockSize; READ_SIZE(scriptBlockSize) @@ -1244,24 +1225,6 @@ bool SaveGame::getSaveInfo(const std::string& file, BasicState *basicState) std::fclose(loadFile); - size_t bytes = 0; - for(;; bytes++ ) { - if(basicState->saveName[bytes-1] == 0 && basicState->saveName[bytes] == 0) break; - } - size_t outSize = 24; - char outBuff[48]; - char* outCur = outBuff; - auto icv = iconv_open("UTF-8", "UTF-16"); - char* saveName = (char*)basicState->saveName; - - // Convert to UTF-8 and copy back to the return struct -#if defined(RW_NETBSD) - iconv(icv, (const char**)&saveName, &bytes, &outCur, &outSize); -#else - iconv(icv, &saveName, &bytes, &outCur, &outSize); -#endif - strcpy(basicState->saveName, outBuff); - return true; } diff --git a/rwgame/states/MenuState.cpp b/rwgame/states/MenuState.cpp index 2678cccd..d79337c4 100644 --- a/rwgame/states/MenuState.cpp +++ b/rwgame/states/MenuState.cpp @@ -34,8 +34,10 @@ void MenuState::enterLoadMenu() if (save.valid) { std::stringstream ss; ss << save.basicState.saveTime.year << "/" << save.basicState.saveTime.month << "/" << save.basicState.saveTime.day - << " " << save.basicState.saveTime.hour << ":" << save.basicState.saveTime.minute << " " << save.basicState.saveName; - m->addEntry(Menu::lambda(ss.str(), [=] { + << " " << save.basicState.saveTime.hour << ":" << save.basicState.saveTime.minute << " "; + auto name = GameStringUtil::fromString(ss.str()); + name += save.basicState.saveName; + m->addEntry(Menu::lambda(name, [=] { StateManager::get().enter(new IngameState(game, false)); game->loadGame(save.savePath); }, 20.f));