X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_saveload.pas;h=09f5076c9b919fc95d9f96a09f672f20193bc24b;hb=a959696d242bc66e6890d281eb6e5d627c2588e9;hp=4391bf51b1bda3f9b76d5b02beb706ddf46c4a05;hpb=94a927ca673a2d8af4b8449d434f3c70f38b11c1;p=d2df-sdl.git diff --git a/src/game/g_saveload.pas b/src/game/g_saveload.pas index 4391bf5..09f5076 100644 --- a/src/game/g_saveload.pas +++ b/src/game/g_saveload.pas @@ -1,9 +1,8 @@ -(* 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 - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -42,7 +41,7 @@ uses g_game, g_items, g_map, g_monsters, g_triggers, g_basic, g_main, Math, wadreader, g_weapons, g_player, g_console, - e_log, g_language; + e_log, e_res, g_language; const SAVE_SIGNATURE = $56534644; // 'DFSV' @@ -102,9 +101,7 @@ end; function buildSaveName (n: Integer): AnsiString; begin - result := ''; - if (n < 0) or (n > 65535) then exit; - result := formatstrf('%sSAVGAME%s.DAT', [DataDir, n]); + result := 'SAVGAME' + IntToStr(n) + '.DAT' end; @@ -113,21 +110,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 := e_OpenResourceRO(SaveDirs, 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 +153,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; @@ -162,7 +170,7 @@ var begin result := false; try - st := createDiskFile(filename); + st := e_CreateResource(SaveDirs, filename); try utils.writeSign(st, 'DFSV'); utils.writeInt(st, Byte(SAVE_VERSION)); @@ -267,9 +275,10 @@ 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} +e_WriteStackTrace(e.message); result := false; end; end; @@ -294,19 +303,21 @@ var i: Integer; gameCleared: Boolean = false; curmapfile: AnsiString = ''; + {$IF DEFINED(D2F_DEBUG)} errpos: LongWord = 0; + {$ENDIF} begin result := false; try - st := openDiskFileRO(filename); + st := e_OpenResourceRO(SaveDirs, filename); try 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); - try + {$IF DEFINED(D2F_DEBUG)}try{$ENDIF} //g_Game_Free(false); // don't free textures for the same map g_Game_ClearLoading(); g_Game_SetLoadingText(_lc[I_LOAD_SAVE_FILE], 0, False); @@ -392,7 +403,8 @@ begin g_Game_SetupScreenSize(); // Çàãðóçêà è çàïóñê êàðòû - if not g_Game_StartMap(WAD_Path+':\'+Map_Name, True, curmapfile) then + //FIXME: save/load `asMegawad` + if not g_Game_StartMap(false{asMegawad}, WAD_Path+':\'+Map_Name, True, curmapfile) then begin g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [WAD_Path + ':\' + Map_Name])); exit; @@ -476,24 +488,38 @@ begin // done gLoadGameMode := false; result := true; + {$IF DEFINED(D2F_DEBUG)} except begin errpos := LongWord(st.position); raise; end; end; + {$ENDIF} finally 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; @@ -502,16 +528,12 @@ end; function g_SaveGame (n: Integer; const aname: AnsiString): Boolean; begin - result := false; - if (n < 0) or (n > 65535) then exit; result := g_SaveGameTo(buildSaveName(n), aname, true); end; function g_LoadGame (n: Integer): Boolean; begin - result := false; - if (n < 0) or (n > 65535) then exit; result := g_LoadGameFrom(buildSaveName(n)); end;