diff --git a/src/game/savegame.c b/src/game/savegame.c index 97966fc23..bb7da566d 100644 --- a/src/game/savegame.c +++ b/src/game/savegame.c @@ -86,7 +86,7 @@ static bool SaveGame_NeedsEvilLaraFix(GAME_INFO *game_info) assert(game_info); bool result = false; - if (game_info->current_level != 14) { + if (g_CurrentLevel != 14) { return result; } @@ -260,7 +260,6 @@ static void SaveGame_FillSaveBuffer(GAME_INFO *game_info) // Write current game information into the save buffer. assert(game_info); - game_info->current_level = g_CurrentLevel; CreateStartInfo(g_CurrentLevel); @@ -270,13 +269,13 @@ static void SaveGame_FillSaveBuffer(GAME_INFO *game_info) char title[SAVEGAME_TITLE_SIZE]; snprintf( title, SAVEGAME_TITLE_SIZE, "%s", - g_GameFlow.levels[game_info->current_level].level_title); + g_GameFlow.levels[g_CurrentLevel].level_title); SaveGame_WriteSG(title, SAVEGAME_TITLE_SIZE); SaveGame_WriteSG(&g_SaveCounter, sizeof(int32_t)); for (int i = 0; i < g_GameFlow.level_count; i++) { if (g_GameFlow.levels[i].level_type == GFL_CURRENT) { - game_info->start[i] = game_info->start[game_info->current_level]; + game_info->start[i] = game_info->start[g_CurrentLevel]; } } @@ -298,7 +297,7 @@ static void SaveGame_FillSaveBuffer(GAME_INFO *game_info) SaveGame_WriteSG(&game_info->timer, sizeof(uint32_t)); SaveGame_WriteSG(&game_info->kills, sizeof(uint32_t)); SaveGame_WriteSG(&game_info->secrets, sizeof(uint16_t)); - SaveGame_WriteSG(&game_info->current_level, sizeof(uint16_t)); + SaveGame_WriteSG(&g_CurrentLevel, sizeof(uint16_t)); SaveGame_WriteSG(&game_info->pickups, sizeof(uint8_t)); SaveGame_WriteSG(&game_info->bonus_flag, sizeof(uint8_t)); @@ -411,19 +410,19 @@ void SaveGame_ApplySaveBuffer(GAME_INFO *game_info) SaveGame_ReadSG(&start->flags, sizeof(uint16_t)); } - for (int i = 0; i < g_GameFlow.level_count; i++) { - if (g_GameFlow.levels[i].level_type == GFL_CURRENT) { - game_info->start[game_info->current_level] = game_info->start[i]; - } - } - SaveGame_ReadSG(&game_info->timer, sizeof(uint32_t)); SaveGame_ReadSG(&game_info->kills, sizeof(uint32_t)); SaveGame_ReadSG(&game_info->secrets, sizeof(uint16_t)); - SaveGame_ReadSG(&game_info->current_level, sizeof(uint16_t)); + SaveGame_ReadSG(&g_CurrentLevel, sizeof(uint16_t)); SaveGame_ReadSG(&game_info->pickups, sizeof(uint8_t)); SaveGame_ReadSG(&game_info->bonus_flag, sizeof(uint8_t)); + for (int i = 0; i < g_GameFlow.level_count; i++) { + if (g_GameFlow.levels[i].level_type == GFL_CURRENT) { + game_info->start[g_CurrentLevel] = game_info->start[i]; + } + } + InitialiseLaraInventory(g_CurrentLevel); SAVEGAME_ITEM_STATS item_stats = { 0 }; SaveGame_ReadSG(&item_stats, sizeof(item_stats)); @@ -809,7 +808,7 @@ static void SaveGame_ReadSGLOT(LOT_INFO *lot) SaveGame_ReadSG(&lot->target, sizeof(PHD_VECTOR)); } -bool SaveGame_LoadSaveBufferFromFile(GAME_INFO *game_info, int32_t slot) +int16_t SaveGame_LoadSaveBufferFromFile(GAME_INFO *game_info, int32_t slot) { assert(game_info); @@ -819,7 +818,7 @@ bool SaveGame_LoadSaveBufferFromFile(GAME_INFO *game_info, int32_t slot) MYFILE *fp = File_Open(filename, FILE_OPEN_READ); if (!fp) { - return false; + return -1; } File_Read( &game_info->savegame_buffer[0], sizeof(char), MAX_SAVEGAME_BUFFER, fp); @@ -843,9 +842,11 @@ bool SaveGame_LoadSaveBufferFromFile(GAME_INFO *game_info, int32_t slot) SaveGame_SkipSG(sizeof(uint32_t)); SaveGame_SkipSG(sizeof(uint32_t)); SaveGame_SkipSG(sizeof(uint16_t)); - SaveGame_ReadSG(&game_info->current_level, sizeof(uint16_t)); - return true; + uint16_t level_num; + SaveGame_ReadSG(&level_num, sizeof(int16_t)); + + return level_num; } bool SaveGame_SaveToFile(GAME_INFO *game_info, int32_t slot) diff --git a/src/game/savegame.h b/src/game/savegame.h index a033c0a98..5e5203f55 100644 --- a/src/game/savegame.h +++ b/src/game/savegame.h @@ -8,7 +8,7 @@ void InitialiseStartInfo(); void ModifyStartInfo(int32_t level_num); void CreateStartInfo(int level_num); -bool SaveGame_LoadSaveBufferFromFile(GAME_INFO *save, int32_t slot); +int16_t SaveGame_LoadSaveBufferFromFile(GAME_INFO *save, int32_t slot); void SaveGame_ApplySaveBuffer(GAME_INFO *save); bool SaveGame_SaveToFile(GAME_INFO *save, int32_t slot); diff --git a/src/game/shell.c b/src/game/shell.c index a75681f2f..21ad68ef3 100644 --- a/src/game/shell.c +++ b/src/game/shell.c @@ -103,11 +103,16 @@ void Shell_Main() gf_option = GameFlow_InterpretSequence(gf_param, GFL_NORMAL); break; - case GF_START_SAVED_GAME: - SaveGame_LoadSaveBufferFromFile(&g_GameInfo, gf_param); - gf_option = - GameFlow_InterpretSequence(g_GameInfo.current_level, GFL_SAVED); + case GF_START_SAVED_GAME: { + int16_t level_num = + SaveGame_LoadSaveBufferFromFile(&g_GameInfo, gf_param); + if (level_num < 0) { + gf_option = GF_EXIT_TO_TITLE; + } else { + gf_option = GameFlow_InterpretSequence(level_num, GFL_SAVED); + } break; + } case GF_START_CINE: gf_option = GameFlow_InterpretSequence(gf_param, GFL_CUTSCENE); diff --git a/src/global/types.h b/src/global/types.h index 8dcbca350..f490afc64 100644 --- a/src/global/types.h +++ b/src/global/types.h @@ -1467,7 +1467,6 @@ typedef struct GAME_INFO { uint32_t timer; uint32_t kills; uint16_t secrets; - uint16_t current_level; uint8_t pickups; uint8_t bonus_flag; char savegame_buffer[MAX_SAVEGAME_BUFFER]; diff --git a/src/global/vars.c b/src/global/vars.c index fbe621c7d..e753a5f70 100644 --- a/src/global/vars.c +++ b/src/global/vars.c @@ -57,7 +57,7 @@ CAMERA_INFO g_Camera = { 0 }; GAME_INFO g_GameInfo = { 0 }; int32_t g_SavedGamesCount = 0; int32_t g_SaveCounter = 0; -int32_t g_CurrentLevel = -1; +int16_t g_CurrentLevel = -1; uint32_t *g_DemoData = NULL; bool g_LevelComplete = false; bool g_ResetFlag = false; diff --git a/src/global/vars.h b/src/global/vars.h index bc57a9846..95b4e1739 100644 --- a/src/global/vars.h +++ b/src/global/vars.h @@ -49,7 +49,7 @@ extern CAMERA_INFO g_Camera; extern GAME_INFO g_GameInfo; extern int32_t g_SavedGamesCount; extern int32_t g_SaveCounter; -extern int32_t g_CurrentLevel; +extern int16_t g_CurrentLevel; extern uint32_t *g_DemoData; extern bool g_LevelComplete; extern bool g_ResetFlag;