DEADSOFTWARE

Game: Handle load errors correctly
[d2df-sdl.git] / src / game / g_saveload.pas
index dec46f1ec720c21b68354583873296986d5f161a..17a186698a26ed0c5cccb2ce8d4f336c4bbb1fd2 100644 (file)
@@ -1,4 +1,4 @@
-(* Copyright (C)  DooM 2D:Forever Developers
+(* Copyright (C)  Doom 2D: Forever Developers
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -113,21 +113,33 @@ var
   st: TStream = nil;
   ver: Byte;
   stlen: Word;
+  filename: AnsiString;
 begin
   valid := false;
   result := '';
   if (n < 0) or (n > 65535) then exit;
   try
     // Îòêðûâàåì ôàéë ñîõðàíåíèé
-    st := openDiskFileRO(buildSaveName(n));
+    filename := buildSaveName(n);
+    st := openDiskFileRO(filename);
     try
-      if not utils.checkSign(st, 'DFSV') then raise XStreamError.Create('invalid save game signature');
+      if not utils.checkSign(st, 'DFSV') then
+      begin
+        e_LogWritefln('GetSaveName: not a save file: ''%s''', [st], TMsgType.Warning);
+        //raise XStreamError.Create('invalid save game signature');
+        exit;
+      end;
       ver := utils.readByte(st);
       if (ver < 7) then
       begin
         utils.readLongWord(st); // section size
         stlen := utils.readWord(st);
-        if (stlen < 1) or (stlen > 64) then raise XStreamError.Create('invalid save game version');
+        if (stlen < 1) or (stlen > 64) then
+        begin
+          e_LogWritefln('GetSaveName: not a save file: ''%s''', [st], TMsgType.Warning);
+          //raise XStreamError.Create('invalid save game version');
+          exit;
+        end;
         // Èìÿ ñýéâà
         SetLength(result, stlen);
         st.ReadBuffer(result[1], stlen);
@@ -144,10 +156,9 @@ begin
       st.Free();
     end;
   except
-    on e: Exception do
     begin
-      e_WriteLog('GetSaveName Error: '+e.message, MSG_WARNING);
-      {$IF DEFINED(D2F_DEBUG)}e_WriteStackTrace(e.message);{$ENDIF}
+      //e_WriteLog('GetSaveName Error: '+e.message, MSG_WARNING);
+      //{$IF DEFINED(D2F_DEBUG)}e_WriteStackTrace(e.message);{$ENDIF}
       result := '';
     end;
   end;
@@ -267,7 +278,7 @@ begin
       begin
         st.Free();
         g_Console_Add(_lc[I_GAME_ERROR_SAVE]);
-        e_WriteLog('SaveState Error: '+e.message, MSG_WARNING);
+        e_WriteLog('SaveState Error: '+e.message, TMsgType.Warning);
         if deleteOnError then DeleteFile(filename);
         {$IF DEFINED(D2F_DEBUG)}e_WriteStackTrace(e.message);{$ENDIF}
         result := false;
@@ -306,7 +317,7 @@ begin
       if not utils.checkSign(st, 'DFSV') then raise XStreamError.Create('invalid save game signature');
       if (utils.readByte(st) <> SAVE_VERSION) then raise XStreamError.Create('invalid save game version');
 
-      e_WriteLog('Loading saved game...', MSG_NOTIFY);
+      e_WriteLog('Loading saved game...', TMsgType.Notify);
 
       {$IF DEFINED(D2F_DEBUG)}try{$ENDIF}
         //g_Game_Free(false); // don't free textures for the same map
@@ -490,14 +501,26 @@ begin
       st.Free();
     end;
   except
+    on e: EFileNotFoundException do
+      begin
+        g_Console_Add(_lc[I_GAME_ERROR_LOAD]);
+        g_Console_Add('LoadState Error: '+e.message);
+        e_WriteLog('LoadState Error: '+e.message, TMsgType.Warning);
+        gLoadGameMode := false;
+        result := false;
+      end;
     on e: Exception do
       begin
         g_Console_Add(_lc[I_GAME_ERROR_LOAD]);
-        e_WriteLog('LoadState Error: '+e.message, MSG_WARNING);
-        {$IF DEFINED(D2F_DEBUG)}e_LogWritefln('stream error position: 0x%08x', [errpos], MSG_WARNING);{$ENDIF}
+        g_Console_Add('LoadState Error: '+e.message);
+        e_WriteLog('LoadState Error: '+e.message, TMsgType.Warning);
+        {$IF DEFINED(D2F_DEBUG)}e_LogWritefln('stream error position: 0x%08x', [errpos], TMsgType.Warning);{$ENDIF}
         gLoadGameMode := false;
-        result := true;
-        if not gameCleared then g_Game_Free();
+        result := false;
+        if gState <> STATE_MENU then
+          g_FatalError(_lc[I_GAME_ERROR_LOAD])
+        else if not gameCleared then
+          g_Game_Free();
         {$IF DEFINED(D2F_DEBUG)}e_WriteStackTrace(e.message);{$ENDIF}
       end;
   end;