index 8207f602fcac68605e3d9d58194b117ddb4cc65c..db73d456e9b4d5335cf715b022cd2f306fc10e66 100644 (file)
--- a/src/shared/wadreader.pas
+++ b/src/shared/wadreader.pas
-(* 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
interface
uses
- sfs, xstreams, Classes;
+ Classes,
+ {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
+ sfs, xstreams, utils;
type
- SArray = array of ShortString;
-
- TWADFile = class(TObject)
+ TWADFile = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
private
fFileName: AnsiString; // empty: not opened
fIter: TSFSFileList;
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 GetMapResources (): SArray;
+ 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 (): SSArray;
// returns `nil` if file wasn't found
function openFileStream (name: AnsiString): TStream;
function g_ExtractFileName (resourceStr: AnsiString): AnsiString; // without path
function g_ExtractFilePathName (resourceStr: AnsiString): AnsiString;
-// return fixed AnsiString or empty AnsiString
-function findDiskWad (fname: AnsiString): AnsiString;
-
var
wadoptDebug: Boolean = false;
implementation
uses
- SysUtils, e_log, utils, MAPDEF;
-
-
-function findDiskWad (fname: AnsiString): AnsiString;
-begin
- result := '';
- if not findFileCI(fname) then
- begin
- //e_WriteLog(Format('findDiskWad: error looking for [%s]', [fname]), MSG_NOTIFY);
- if StrEquCI1251(ExtractFileExt(fname), '.wad') then
- begin
- fname := ChangeFileExt(fname, '.pk3');
- //e_WriteLog(Format(' looking for [%s]', [fname]), MSG_NOTIFY);
- if not findFileCI(fname) then
- begin
- fname := ChangeFileExt(fname, '.zip');
- //e_WriteLog(Format(' looking for [%s]', [fname]), MSG_NOTIFY);
- if not findFileCI(fname) then exit;
- end;
- end
- else
- begin
- exit;
- end;
- end;
- //e_WriteLog(Format('findDiskWad: FOUND [%s]', [fname]), MSG_NOTIFY);
- result := fname;
-end;
+ SysUtils, e_log, MAPDEF, xdynrec;
function normSlashes (s: AnsiString): AnsiString;
//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;
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();
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;
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]), TMsgType.Warning);
break;
end;
// if we want only maps, check if this is map
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])
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
result := true;
{$IFDEF SFS_DFWAD_DEBUG}
if wadoptDebug then
- e_WriteLog(Format('DFWAD: file [%s] FOUND in [%s]; size is %d bytes', [name, fFileName, Len]), MSG_NOTIFY);
+ e_WriteLog(Format('DFWAD: file [%s] FOUND in [%s]; size is %d bytes', [name, fFileName, Len]), TMsgType.Notify);
{$ENDIF}
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]), TMsgType.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;
+function TWADFile.GetMapResources (): SSArray;
var
f, c: Integer;
fi: TSFSFileInfo;
rfn := findDiskWad(FileName);
if length(rfn) = 0 then
begin
- e_WriteLog(Format('TWADFile.ReadFile: error looking for [%s]', [FileName]), MSG_NOTIFY);
+ e_WriteLog(Format('TWADFile.ReadFile: error looking for [%s]', [FileName]), TMsgType.Notify);
exit;
end;
{$IFDEF SFS_DFWAD_DEBUG}
- if wadoptDebug then e_WriteLog(Format('TWADFile.ReadFile: FOUND [%s]', [rfn]), MSG_NOTIFY);
+ if wadoptDebug then e_WriteLog(Format('TWADFile.ReadFile: FOUND [%s]', [rfn]), TMsgType.Notify);
{$ENDIF}
// cache this wad
try
if fIter = nil then Exit;
fFileName := rfn;
{$IFDEF SFS_DFWAD_DEBUG}
- if wadoptDebug then e_WriteLog(Format('TWADFile.ReadFile: [%s] opened', [fFileName]), MSG_NOTIFY);
+ if wadoptDebug then e_WriteLog(Format('TWADFile.ReadFile: [%s] opened', [fFileName]), TMsgType.Notify);
{$ENDIF}
Result := True;
end;
FreeWAD();
if (Data = nil) or (Len = 0) then
begin
- e_WriteLog('TWADFile.ReadMemory: EMPTY SUBWAD!', MSG_WARNING);
+ e_WriteLog('TWADFile.ReadMemory: EMPTY SUBWAD!', TMsgType.Warning);
Exit;
end;
fn := Format(' -- memwad %d -- ', [uniqueCounter]);
Inc(uniqueCounter);
{$IFDEF SFS_DFWAD_DEBUG}
- if wadoptDebug then e_WriteLog(Format('TWADFile.ReadMemory: [%s]', [fn]), MSG_NOTIFY);
+ if wadoptDebug then e_WriteLog(Format('TWADFile.ReadMemory: [%s]', [fn]), TMsgType.Notify);
{$ENDIF}
try
fFileName := fn;
{$IFDEF SFS_DFWAD_DEBUG}
- if wadoptDebug then e_WriteLog(Format('TWADFile.ReadMemory: [%s] opened', [fFileName]), MSG_NOTIFY);
+ if wadoptDebug then e_WriteLog(Format('TWADFile.ReadMemory: [%s] opened', [fFileName]), TMsgType.Notify);
{$ENDIF}
{