X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2Fwadreader.pas;h=3f13946bcb1dea1532c6805ad57af2ae4854449a;hb=cde380b2a554f452f7c2e2c6694bc29ce597ece9;hp=8207f602fcac68605e3d9d58194b117ddb4cc65c;hpb=6d6df4e3427cd01e03e172984c9d0d391ff38032;p=d2df-sdl.git diff --git a/src/shared/wadreader.pas b/src/shared/wadreader.pas index 8207f60..3f13946 100644 --- a/src/shared/wadreader.pas +++ b/src/shared/wadreader.pas @@ -22,13 +22,13 @@ unit wadreader; interface uses - sfs, xstreams, Classes; + mempool, sfs, xstreams, Classes; type SArray = array of ShortString; - TWADFile = class(TObject) + TWADFile = class(TPoolObject) private fFileName: AnsiString; // empty: not opened fIter: TSFSFileList; @@ -36,19 +36,19 @@ type function getIsOpen (): Boolean; function isMapResource (idx: Integer): Boolean; - function GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer): Boolean; + function GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean; public - constructor Create(); - destructor Destroy(); override; + constructor Create (); + destructor Destroy (); override; - procedure FreeWAD(); + procedure FreeWAD (); function ReadFile (FileName: AnsiString): Boolean; function ReadMemory (Data: Pointer; Len: LongWord): Boolean; - function GetResource (name: AnsiString; var pData: Pointer; var Len: Integer): Boolean; - function GetMapResource (name: AnsiString; var pData: Pointer; var Len: Integer): Boolean; + function GetResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean; + function GetMapResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean; function GetMapResources (): SArray; // returns `nil` if file wasn't found @@ -76,7 +76,7 @@ var implementation uses - SysUtils, e_log, utils, MAPDEF; + SysUtils, e_log, utils, MAPDEF, xdynrec; function findDiskWad (fname: AnsiString): AnsiString; @@ -238,7 +238,7 @@ end; //FIXME: detect text maps properly here function TWADFile.isMapResource (idx: Integer): Boolean; var - sign: packed array [0..2] of Char; + //sign: packed array [0..2] of Char; fs: TStream = nil; begin result := false; @@ -246,11 +246,15 @@ begin if (idx < 0) or (idx >= fIter.Count) then exit; try fs := fIter.volume.OpenFileByIndex(idx); + result := TDynMapDef.canBeMap(fs); + (* fs.readBuffer(sign, 3); result := (sign = MAP_SIGNATURE); if not result then result := (sign[0] = 'm') and (sign[1] = 'a') and (sign[2] = 'p'); + *) except - if fs <> nil then fs.Free(); + fs.Free(); + result := false; // just in case exit; end; fs.Free(); @@ -297,15 +301,18 @@ begin end; -function TWADFile.GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer): Boolean; +function TWADFile.GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean; var f, lastSlash: Integer; fi: TSFSFileInfo; fs: TStream; fpp: Pointer; rpath, rname: AnsiString; - sign: packed array [0..2] of Char; + //sign: packed array [0..2] of Char; goodMap: Boolean; + {$IFNDEF SFS_MAPDETECT_FX} + wst: TSFSMemoryChunkStream; + {$ENDIF} begin Result := False; if not isOpen or (fIter = nil) then Exit; @@ -355,7 +362,7 @@ begin if fs = nil then begin if wantMap then continue; - e_WriteLog(Format('DFWAD: can''t open file [%s] in [%s]', [name, fFileName]), MSG_WARNING); + if logError then e_WriteLog(Format('DFWAD: can''t open file [%s] in [%s]', [name, fFileName]), MSG_WARNING); break; end; // if we want only maps, check if this is map @@ -367,9 +374,10 @@ begin e_LogWritefln('DFWAD: checking for good map in wad [%s], file [%s] (#%d)', [fFileName, fi.fname, f]); {$ENDIF} try - fs.readBuffer(sign, 3); - goodMap := (sign = MAP_SIGNATURE); - if not goodMap then goodMap := (sign[0] = 'm') and (sign[1] = 'a') and (sign[2] = 'p'); + //fs.readBuffer(sign, 3); + //goodMap := (sign = MAP_SIGNATURE); + //if not goodMap then goodMap := (sign[0] = 'm') and (sign[1] = 'a') and (sign[2] = 'p'); + goodMap := TDynMapDef.canBeMap(fs); {$IF DEFINED(D2D_NEW_MAP_READER_DBG)} if goodMap then e_LogWritefln(' GOOD map in wad [%s], file [%s] (#%d)', [fFileName, fi.fname, f]) @@ -410,8 +418,15 @@ begin goodMap := false; if Len >= 3 then begin - Move(pData^, sign, 3); - goodMap := (sign = MAP_SIGNATURE); + //Move(pData^, sign, 3); + //goodMap := (sign = MAP_SIGNATURE); + wst := TSFSMemoryChunkStream.Create(pData, Len); + try + goodMap := TDynMapDef.canBeMap(wst); + except + goodMap := false; + end; + wst.Free(); end; if not goodMap then begin @@ -431,17 +446,17 @@ begin exit; end; end; - e_WriteLog(Format('DFWAD: file [%s] not found in [%s]', [name, fFileName]), MSG_WARNING); + if logError then e_WriteLog(Format('DFWAD: file [%s] not found in [%s]', [name, fFileName]), MSG_WARNING); end; -function TWADFile.GetResource (name: AnsiString; var pData: Pointer; var Len: Integer): Boolean; +function TWADFile.GetResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean; begin - result := GetResourceEx(name, false, pData, Len); + result := GetResourceEx(name, false, pData, Len, logError); end; -function TWADFile.GetMapResource (name: AnsiString; var pData: Pointer; var Len: Integer): Boolean; +function TWADFile.GetMapResource (name: AnsiString; var pData: Pointer; var Len: Integer; logError: Boolean=true): Boolean; begin - result := GetResourceEx(name, true, pData, Len); + result := GetResourceEx(name, true, pData, Len, logError); end; function TWADFile.GetMapResources (): SArray;