Skip to content

Commit

Permalink
Game saving system compatibility with CS and SOC (#382 and #392)
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed May 20, 2019
1 parent 3443832 commit 9338f3a
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 32 deletions.
59 changes: 39 additions & 20 deletions src/xrGame/alife_storage_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,23 @@ extern string_path g_last_saved_game;
CALifeStorageManager::~CALifeStorageManager() { *g_last_saved_game = 0; }
void CALifeStorageManager::save(LPCSTR save_name_no_check, bool update_name)
{
pcstr gameSaveExtension = SAVE_EXTENSION;
if (ShadowOfChernobylMode || ClearSkyMode)
gameSaveExtension = SAVE_EXTENSION_LEGACY;

LPCSTR game_saves_path = FS.get_path("$game_saves$")->m_Path;

string_path save_name;
strncpy_s(save_name, sizeof(save_name), save_name_no_check,
sizeof(save_name) - 5 - xr_strlen(SAVE_EXTENSION) - xr_strlen(game_saves_path));
sizeof(save_name) - 5 - xr_strlen(gameSaveExtension) - xr_strlen(game_saves_path));

xr_strcpy(g_last_saved_game, save_name);

string_path save;
xr_strcpy(save, m_save_name);
if (save_name)
string_path saveBackup;
xr_strcpy(saveBackup, m_save_name);
if (save_name[0])
{
strconcat(sizeof(m_save_name), m_save_name, save_name, SAVE_EXTENSION);
strconcat(sizeof(m_save_name), m_save_name, save_name, gameSaveExtension);
}
else
{
Expand Down Expand Up @@ -90,7 +94,7 @@ void CALifeStorageManager::save(LPCSTR save_name_no_check, bool update_name)
#endif // DEBUG

if (!update_name)
xr_strcpy(m_save_name, save);
xr_strcpy(m_save_name, saveBackup);
}

void CALifeStorageManager::load(void* buffer, const u32& buffer_size, LPCSTR file_name)
Expand Down Expand Up @@ -128,47 +132,62 @@ void CALifeStorageManager::load(void* buffer, const u32& buffer_size, LPCSTR fil

bool CALifeStorageManager::load(LPCSTR save_name_no_check)
{
pcstr gameSaveExtension = SAVE_EXTENSION;
if (ShadowOfChernobylMode || ClearSkyMode)
gameSaveExtension = SAVE_EXTENSION_LEGACY;

LPCSTR game_saves_path = FS.get_path("$game_saves$")->m_Path;

string_path save_name;
strncpy_s(save_name, sizeof(save_name), save_name_no_check,
sizeof(save_name) - 5 - xr_strlen(SAVE_EXTENSION) - xr_strlen(game_saves_path));
sizeof(save_name) - 5 - xr_strlen(gameSaveExtension) - xr_strlen(game_saves_path));

CTimer timer;
timer.Start();

string_path save;
xr_strcpy(save, m_save_name);
if (!save_name)
string_path saveBackup;
xr_strcpy(saveBackup, m_save_name);
if (!save_name[0])
{
if (!xr_strlen(m_save_name))
R_ASSERT2(false, "There is no file name specified!");
{
Log("There is no file name specified!");
return false;
}
}
else
{
strconcat(sizeof(m_save_name), m_save_name, save_name, SAVE_EXTENSION);
strconcat(sizeof(m_save_name), m_save_name, save_name, gameSaveExtension);
}
string_path file_name;
FS.update_path(file_name, "$game_saves$", m_save_name);

xr_strcpy(g_last_saved_game, save_name);
xrDebug::SetBugReportFile(file_name);

IReader* stream;
stream = FS.r_open(file_name);
IReader* stream = FS.r_open(file_name);
if (!stream)
{
Msg("* Cannot find saved game %s", file_name);
xr_strcpy(m_save_name, save);
return (false);
Msg("* Cannot open saved game %s", file_name);
xr_strcpy(m_save_name, saveBackup);
return false;
}

CHECK_OR_EXIT(CSavedGameWrapper::valid_saved_game(*stream),
make_string("%s\nSaved game version mismatch or saved game is corrupted", file_name));
constexpr pcstr mismatch = "Saved game version mismatch or saved game is corrupted";
const bool gameSaveIsValid = CSavedGameWrapper::valid_saved_game(*stream);
VERIFY2(gameSaveIsValid, mismatch, file_name);

if (!gameSaveIsValid)
{
Msg("! %s [%s]", mismatch, file_name);

xr_strcpy(m_save_name, saveBackup);
return false;
}

string512 temp;
strconcat(sizeof(temp), temp, StringTable().translate("st_loading_saved_game").c_str(),
" \"", save_name,SAVE_EXTENSION, "\"");
" \"", save_name, gameSaveExtension, "\"");

g_pGamePersistent->SetLoadStageTitle(temp);
g_pGamePersistent->LoadTitle();
Expand Down
10 changes: 8 additions & 2 deletions src/xrGame/alife_update_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -287,10 +287,16 @@ bool CALifeUpdateManager::load_game(LPCSTR game_name, bool no_assert)
FS.update_path(file_name, "$game_saves$", temp);
if (!FS.exist(file_name))
{
R_ASSERT3(no_assert, "There is no saved game ", file_name);
return (false);
strconcat(sizeof(temp), temp, game_name, SAVE_EXTENSION_LEGACY);
FS.update_path(file_name, "$game_saves$", temp);
if (!FS.exist(file_name))
{
R_ASSERT3(no_assert, "There is no saved game ", game_name);
return (false);
}
}
}

string512 S, S1;
xr_strcpy(S, **m_server_command_line);
LPSTR temp = strchr(S, '/');
Expand Down
16 changes: 14 additions & 2 deletions src/xrGame/console_commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,13 @@ class CCC_ALifeSave : public IConsole_Command
#endif
} // virtual void Execute

virtual void fill_tips(vecTips& tips, u32 mode) { get_files_list(tips, "$game_saves$", SAVE_EXTENSION); }
virtual void fill_tips(vecTips& tips, u32 mode)
{
if (ShadowOfChernobylMode || ClearSkyMode)
get_files_list(tips, "$game_saves$", SAVE_EXTENSION_LEGACY);
else
get_files_list(tips, "$game_saves$", SAVE_EXTENSION);
}
}; // CCC_ALifeSave

class CCC_ALifeLoadFrom : public IConsole_Command
Expand Down Expand Up @@ -696,7 +702,13 @@ class CCC_ALifeLoadFrom : public IConsole_Command
Level().Send(net_packet, net_flags(TRUE));
}

virtual void fill_tips(vecTips& tips, u32 mode) { get_files_list(tips, "$game_saves$", SAVE_EXTENSION); }
virtual void fill_tips(vecTips& tips, u32 mode)
{
if (ShadowOfChernobylMode || ClearSkyMode)
get_files_list(tips, "$game_saves$", SAVE_EXTENSION_LEGACY);
else
get_files_list(tips, "$game_saves$", SAVE_EXTENSION);
}
}; // CCC_ALifeLoadFrom

class CCC_LoadLastSave : public IConsole_Command
Expand Down
20 changes: 13 additions & 7 deletions src/xrGame/saved_game_wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,20 @@

extern LPCSTR alife_section;

LPCSTR CSavedGameWrapper::saved_game_full_name(LPCSTR saved_game_name, string_path& result)
pcstr CSavedGameWrapper::saved_game_full_name(pcstr saved_game_name, string_path& result, pcstr extension)
{
string_path temp;
strconcat(sizeof(temp), temp, saved_game_name, SAVE_EXTENSION);
strconcat(sizeof(temp), temp, saved_game_name, extension);
FS.update_path(result, "$game_saves$", temp);
return (result);
}

bool CSavedGameWrapper::saved_game_exist(LPCSTR saved_game_name)
{
string_path file_name;
return (!!FS.exist(saved_game_full_name(saved_game_name, file_name)));
if (FS.exist(saved_game_full_name(saved_game_name, file_name, SAVE_EXTENSION)))
return true;
return FS.exist(saved_game_full_name(saved_game_name, file_name, SAVE_EXTENSION_LEGACY));
}

bool CSavedGameWrapper::valid_saved_game(IReader& stream)
Expand All @@ -50,8 +52,9 @@ bool CSavedGameWrapper::valid_saved_game(IReader& stream)
bool CSavedGameWrapper::valid_saved_game(LPCSTR saved_game_name)
{
string_path file_name;
if (!FS.exist(saved_game_full_name(saved_game_name, file_name)))
return (false);
if (!FS.exist(saved_game_full_name(saved_game_name, file_name, SAVE_EXTENSION)))
if (!FS.exist(saved_game_full_name(saved_game_name, file_name, SAVE_EXTENSION_LEGACY)))
return false;

IReader* stream = FS.r_open(file_name);
bool result = valid_saved_game(*stream);
Expand All @@ -62,8 +65,11 @@ bool CSavedGameWrapper::valid_saved_game(LPCSTR saved_game_name)
CSavedGameWrapper::CSavedGameWrapper(LPCSTR saved_game_name)
{
string_path file_name;
saved_game_full_name(saved_game_name, file_name);
R_ASSERT3(FS.exist(file_name), "There is no saved game ", file_name);
saved_game_full_name(saved_game_name, file_name, SAVE_EXTENSION);
if (!FS.exist(file_name))
saved_game_full_name(saved_game_name, file_name, SAVE_EXTENSION_LEGACY);

R_ASSERT3(FS.exist(file_name), "There is no saved game ", saved_game_name);

IReader* stream = FS.r_open(file_name);
if (!valid_saved_game(*stream))
Expand Down
2 changes: 1 addition & 1 deletion src/xrGame/saved_game_wrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class CSavedGameWrapper

public:
CSavedGameWrapper(LPCSTR saved_game_name);
static LPCSTR saved_game_full_name(LPCSTR saved_game_name, string_path& result);
static pcstr saved_game_full_name(pcstr saved_game_name, string_path& result, pcstr extension);
static bool saved_game_exist(LPCSTR saved_game_name);
static bool valid_saved_game(IReader& stream);
static bool valid_saved_game(LPCSTR saved_game_name);
Expand Down

0 comments on commit 9338f3a

Please sign in to comment.