- fixed savegame validation and recursive ticker calls.

This commit is contained in:
Christoph Oelckers 2019-11-30 23:33:04 +01:00
parent 41b116e2f2
commit c36402eb5c
3 changed files with 23 additions and 10 deletions

View file

@ -52,10 +52,17 @@ ATTRIBUTE((flatten)) void timerUpdateClock(void)
totalclock += n; totalclock += n;
timerlastsample += n*nanoseconds(1000000000/timerticspersec); timerlastsample += n*nanoseconds(1000000000/timerticspersec);
// This function can get called from deep within processing loops.
// The callbacks in here may not be called recursively, though.
static bool recursion;
if (recursion) return;
recursion = true;
for (; n > 0; n--) for (; n > 0; n--)
{ {
for (auto cb : callbacks) cb(); for (auto cb : callbacks) cb();
} }
recursion = false;
} }
void(*timerSetCallback(void(*callback)(void)))(void) void(*timerSetCallback(void(*callback)(void)))(void)

View file

@ -205,8 +205,8 @@ void FSavegameManager::ReadSaveStrings()
{ {
FSaveGameNode *node = new FSaveGameNode; FSaveGameNode *node = new FSaveGameNode;
node->Filename = filepath; node->Filename = filepath;
node->bOldVersion = true; node->bOldVersion = check == -1;
node->bMissingWads = false; node->bMissingWads = check == -2;
node->SaveTitle = title; node->SaveTitle = title;
InsertSaveNode(node); InsertSaveNode(node);
} }
@ -281,13 +281,17 @@ void FSavegameManager::NotifyNewSave(const FString &file, const FString &title,
void FSavegameManager::LoadSavegame(int Selected) void FSavegameManager::LoadSavegame(int Selected)
{ {
savegameManager.LoadGame(SaveGames[Selected]); auto sel = savegameManager.GetSavegame(Selected);
if (quickSaveSlot == (FSaveGameNode*)1) if (sel && !sel->bOldVersion && !sel->bMissingWads)
{ {
quickSaveSlot = SaveGames[Selected]; savegameManager.LoadGame(SaveGames[Selected]);
if (quickSaveSlot == (FSaveGameNode*)1)
{
quickSaveSlot = SaveGames[Selected];
}
M_ClearMenus();
LastAccessed = Selected;
} }
M_ClearMenus();
LastAccessed = Selected;
} }
@ -365,6 +369,7 @@ unsigned FSavegameManager::ExtractSaveData(int index)
} }
auto fr = info->NewReader(); auto fr = info->NewReader();
auto data = fr.ReadPadded(1); auto data = fr.ReadPadded(1);
fr.Close();
sjson_context* ctx = sjson_create_context(0, 0, NULL); sjson_context* ctx = sjson_create_context(0, 0, NULL);
if (ctx) if (ctx)
{ {
@ -372,8 +377,9 @@ unsigned FSavegameManager::ExtractSaveData(int index)
FString comment = sjson_get_string(root, "Creation Time", ""); FString comment = sjson_get_string(root, "Creation Time", "");
FString pcomment = sjson_get_string(root, "Comment", ""); FString fcomment = sjson_get_string(root, "Map File", "");
if (comment.Len() > 0) comment += "\n"; FString ncomment = sjson_get_string(root, "Map Name", "");
FStringf pcomment("%s - %s\n", fcomment.GetChars(), ncomment.GetChars());
comment += pcomment; comment += pcomment;
SaveCommentString = comment; SaveCommentString = comment;

View file

@ -665,7 +665,7 @@ bool GameInterface::SaveGame(FSaveGameNode* sv)
{ {
videoNextPage(); // no idea if this is needed here. videoNextPage(); // no idea if this is needed here.
g_screenCapture = 1; g_screenCapture = 1;
G_DrawRooms(myconnectindex, 65536); //G_DrawRooms(myconnectindex, 65536);
g_screenCapture = 0; g_screenCapture = 0;
return G_SavePlayer(sv); return G_SavePlayer(sv);