From ae4069ace642a386dd8651379dbfb0e6330d915b Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Wed, 30 Aug 2017 23:06:09 +0300 Subject: [PATCH] relaxed map reader, so "bloodlust", for example, is working now --- src/engine/e_log.pas | 48 ---------------------------------------- src/shared/conbuf.pas | 7 +++++- src/shared/wadreader.pas | 8 +++---- src/shared/xdynrec.pas | 10 ++++++--- src/tools/mapcvt.dpr | 34 +++++++++++++++++++++++++++- src/tools/mapgen.dpr | 8 ++++++- 6 files changed, 57 insertions(+), 58 deletions(-) diff --git a/src/engine/e_log.pas b/src/engine/e_log.pas index afc638c..3a8d0ad 100644 --- a/src/engine/e_log.pas +++ b/src/engine/e_log.pas @@ -68,54 +68,6 @@ procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTi begin e_LogWritefln('%s', [TextLine], RecordCategory, WriteTime); end; -(* -var - LogFile: TextFile; - Prefix: ShortString = ''; - OutStr: String; -begin - if driverInited and (length(TextLine) > 0) then - begin - case RecordCategory of - MSG_FATALERROR: write('FATAL: '); - MSG_WARNING: write('WARNING: '); - end; - writeln(TextLine); - end; - - if FileName = '' then Exit; - - Assign(LogFile, FileName); - try - if FileExists(FileName) then - Append(LogFile) - else - Rewrite(LogFile); - try - if FirstRecord then - begin - Writeln(LogFile, '--- Log started at '+TimeToStr(Time)+' ---'); - FirstRecord := False; - end; - case RecordCategory of - MSG_FATALERROR: Prefix := '!!!'; - MSG_WARNING: Prefix := '! '; - MSG_NOTIFY: Prefix := '***'; - end; - if WriteTime then - OutStr := '['+TimeToStr(Time)+'] '+Prefix+' '+TextLine - else - OutStr := Prefix+' '+TextLine; - Writeln(LogFile, OutStr); - if e_WriteToStdOut then - Writeln(OutStr); - finally - Close(LogFile); - end; - except // sorry - end; -end; -*) // returns formatted string if `writerCB` is `nil`, empty string otherwise diff --git a/src/shared/conbuf.pas b/src/shared/conbuf.pas index 4bb1bea..12b0a6e 100644 --- a/src/shared/conbuf.pas +++ b/src/shared/conbuf.pas @@ -41,6 +41,7 @@ procedure cbufClear (); var conbufDumpToStdOut: Boolean = false; + conbufConPrefix: Boolean = true; implementation @@ -78,7 +79,11 @@ begin begin for np := 0 to count-1 do begin - if needCon then begin write(stdout, 'CON: '); needCon := false; end; + if needCon then + begin + if conbufConPrefix then write(stdout, 'CON: '); + needCon := false; + end; write(stdout, buf[np]); needCon := (buf[np] = #10); end; diff --git a/src/shared/wadreader.pas b/src/shared/wadreader.pas index 8207f60..a916ff6 100644 --- a/src/shared/wadreader.pas +++ b/src/shared/wadreader.pas @@ -28,7 +28,7 @@ uses type SArray = array of ShortString; - TWADFile = class(TObject) + TWADFile = class private fFileName: AnsiString; // empty: not opened fIter: TSFSFileList; @@ -39,10 +39,10 @@ type function GetResourceEx (name: AnsiString; wantMap: Boolean; var pData: Pointer; var Len: Integer): 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; diff --git a/src/shared/xdynrec.pas b/src/shared/xdynrec.pas index f129dd0..456a013 100644 --- a/src/shared/xdynrec.pas +++ b/src/shared/xdynrec.pas @@ -275,7 +275,7 @@ type implementation uses - SysUtils; + SysUtils, e_log; // ////////////////////////////////////////////////////////////////////////// // @@ -1852,7 +1852,11 @@ var if (Length(fld.mRecRefId) = 0) then continue; assert(fld.mEBSType <> nil); rt := findRecordByTypeId(fld.mEBSTypeName, fld.mRecRefId); - if (rt = nil) then raise Exception.Create(Format('record of type ''%s'' with id ''%s'' links to inexistant record of type ''%s'' with id ''%d''', [rec.mName, rec.mId, fld.mEBSTypeName, fld.mRecRefId])); + if (rt = nil) then + begin + e_LogWritefln('record of type ''%s'' with id ''%s'' links to inexistant record of type ''%s'' with id ''%s''', [rec.mName, rec.mId, fld.mEBSTypeName, fld.mRecRefId], MSG_WARNING); + //raise Exception.Create(Format('record of type ''%s'' with id ''%s'' links to inexistant record of type ''%s'' with id ''%s''', [rec.mName, rec.mId, fld.mEBSTypeName, fld.mRecRefId])); + end; //writeln(' ', rec.mName, '.', rec.mId, ':', fld.mName, ' -> ', rt.mName, '.', rt.mId, ' (', fld.mEBSTypeName, '.', fld.mRecRefId, ')'); fld.mRecRefId := ''; fld.mRecRef := rt; @@ -1882,7 +1886,7 @@ begin if (btype = 0) then break; // no more blocks readLongWord(st); // reserved bsize := readLongInt(st); - //writeln('btype=', btype, '; bsize=', bsize); + {$IF DEFINED(D2D_XDYN_DEBUG)}writeln('btype=', btype, '; bsize=', bsize);{$ENDIF} if (bsize < 0) or (bsize > $1fffffff) then raise Exception.Create(Format('block of type %d has invalid size %d', [btype, bsize])); if loaded[btype] then raise Exception.Create(Format('block of type %d already loaded', [btype])); loaded[btype] := true; diff --git a/src/tools/mapcvt.dpr b/src/tools/mapcvt.dpr index cd02ab9..71784e2 100644 --- a/src/tools/mapcvt.dpr +++ b/src/tools/mapcvt.dpr @@ -3,11 +3,17 @@ uses SysUtils, Classes, + sfs in '../sfs/sfs.pas', + sfsPlainFS in '../sfs/sfsPlainFS.pas', + sfsZipFS in '../sfs/sfsZipFS.pas', xstreams in '../shared/xstreams.pas', xparser in '../shared/xparser.pas', xdynrec in '../shared/xdynrec.pas', xprofiler in '../shared/xprofiler.pas', utils in '../shared/utils.pas', + conbuf in '../shared/conbuf.pas', + e_log in '../engine/e_log.pas', + wadreader in '../shared/wadreader.pas', MAPDEF in '../shared/MAPDEF.pas'; @@ -23,6 +29,9 @@ var outname: AnsiString = ''; totext: Integer = -1; // <0: guess; force outname extension sign: packed array[0..3] of AnsiChar; + wad: TWADFile = nil; + waddata: Pointer; + waddlen: Integer; begin if (ParamCount = 0) then begin @@ -35,6 +44,11 @@ begin if (ParamCount = 1) then begin outname := forceFilenameExt(ParamStr(1), ''); + if isWadPath(outname) then + begin + outname := SFSReplacePathDelims(g_ExtractFilePathName(outname), '/'); + if (Length(outname) = 0) then begin writeln('FATAL: can''t guess output name!'); Halt(1); end; + end; end else begin @@ -47,6 +61,10 @@ begin end; //writeln('outname: [', outname, ']; totext=', totext); + e_InitWritelnDriver(); + conbufDumpToStdOut := true; + conbufConPrefix := false; + writeln('parsing "mapdef.txt"...'); //pr := TFileTextParser.Create('mapdef.txt'); pr := TStrTextParser.Create(defaultMapDef); @@ -60,7 +78,20 @@ begin end; writeln('parsing "', inname, '"...'); - st := openDiskFileRO(inname); + + if isWadPath(inname) then + begin + wad := TWADFile.Create(); + wad.ReadFile(g_ExtractWadName(inname)); + wad.GetMapResource(g_ExtractFilePathName(inname), waddata, waddlen); + st := TSFSMemoryChunkStream.Create(waddata, waddlen, true); + wad.Free(); + end + else + begin + st := openDiskFileRO(inname); + end; + st.ReadBuffer(sign, 4); st.position := 0; if (sign[0] = 'M') and (sign[1] = 'A') and (sign[2] = 'P') and (sign[3] = #1) then @@ -71,6 +102,7 @@ begin map := dfmapdef.parseBinMap(st); stt := curTimeMicro()-stt; writeln('binary map parsed in ', stt div 1000, '.', stt mod 1000, ' microseconds'); + st.Free(); end else begin diff --git a/src/tools/mapgen.dpr b/src/tools/mapgen.dpr index bb38d08..32db772 100644 --- a/src/tools/mapgen.dpr +++ b/src/tools/mapgen.dpr @@ -6,7 +6,9 @@ uses xstreams in '../shared/xstreams.pas', xparser in '../shared/xparser.pas', xdynrec in '../shared/xdynrec.pas', - utils in '../shared/utils.pas'; + utils in '../shared/utils.pas', + conbuf in '../shared/conbuf.pas', + e_log in '../engine/e_log.pas'; // ////////////////////////////////////////////////////////////////////////// // @@ -21,6 +23,10 @@ var begin //writeln(getFilenamePath(ParamStr(0)), '|'); + e_InitWritelnDriver(); + conbufDumpToStdOut := true; + conbufConPrefix := false; + writeln('parsing "mapdef.txt"...'); try st := openDiskFileRO('mapdef.txt'); -- 2.29.2