DEADSOFTWARE

particles: fixed "in liquid" check bug
[d2df-sdl.git] / src / tools / mapcvt.dpr
index cd02ab9b5d1c4fdf259d4bd281345745eb6bdccb..de1c0a36427acbfc0d0d6e84b07ea8c8230228f7 100644 (file)
@@ -1,13 +1,22 @@
 {$INCLUDE ../shared/a_modes.inc}
-{$APPTYPE CONSOLE}
+{$IFDEF WINDOWS}
+  {$APPTYPE CONSOLE}
+{$ENDIF}
 
 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',
+  hashtable in '../shared/hashtable.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 +32,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 +47,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 +64,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 +81,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
@@ -70,7 +104,8 @@ begin
     stt := curTimeMicro();
     map := dfmapdef.parseBinMap(st);
     stt := curTimeMicro()-stt;
-    writeln('binary map parsed in ', stt div 1000, '.', stt mod 1000, ' microseconds');
+    writeln('binary map parsed in ', stt div 1000, '.', stt mod 1000, ' milliseconds');
+    st.Free();
   end
   else
   begin
@@ -81,7 +116,7 @@ begin
       stt := curTimeMicro();
       map := dfmapdef.parseMap(pr);
       stt := curTimeMicro()-stt;
-      writeln('text map parsed in ', stt div 1000, '.', stt mod 1000, ' microseconds');
+      writeln('text map parsed in ', stt div 1000, '.', stt mod 1000, ' milliseconds');
     except on e: Exception do
       begin
         writeln('ERROR at (', pr.line, ',', pr.col, '): ', e.message);
@@ -91,6 +126,8 @@ begin
     pr.Free();
   end;
 
+  {$IF DEFINED(D2D_DYNREC_PROFILER)}xdynDumpProfiles();{$ENDIF}
+
   assert(totext >= 0);
 
   writeln('writing "', outname, '"...');
@@ -101,7 +138,7 @@ begin
     stt := curTimeMicro();
     map.writeBinTo(st);
     stt := curTimeMicro()-stt;
-    writeln('binary map written in ', stt div 1000, '.', stt mod 1000, ' microseconds');
+    writeln('binary map written in ', stt div 1000, '.', stt mod 1000, ' milliseconds');
   end
   else
   begin
@@ -110,7 +147,7 @@ begin
     stt := curTimeMicro();
     map.writeTo(wr);
     stt := curTimeMicro()-stt;
-    writeln('text map written in ', stt div 1000, '.', stt mod 1000, ' microseconds');
+    writeln('text map written in ', stt div 1000, '.', stt mod 1000, ' milliseconds');
     wr.Free();
   end;
 end.