DEADSOFTWARE

476179c3713545b0fa8418190d56e750d29cfe4b
[d2df-sdl.git] / src / tools / mapcvt.dpr
1 {$INCLUDE ../shared/a_modes.inc}
2 {$IFDEF WINDOWS}
3 {$APPTYPE CONSOLE}
4 {$ENDIF}
6 uses
7 SysUtils, Classes,
8 sfs in '../sfs/sfs.pas',
9 sfsPlainFS in '../sfs/sfsPlainFS.pas',
10 sfsZipFS in '../sfs/sfsZipFS.pas',
11 xstreams in '../shared/xstreams.pas',
12 xparser in '../shared/xparser.pas',
13 xdynrec in '../shared/xdynrec.pas',
14 xprofiler in '../shared/xprofiler.pas',
15 utils in '../shared/utils.pas',
16 hashtable in '../shared/hashtable.pas',
17 conbuf in '../shared/conbuf.pas',
18 e_log in '../engine/e_log.pas',
19 wadreader in '../shared/wadreader.pas',
20 MAPDEF in '../shared/MAPDEF.pas';
23 // ////////////////////////////////////////////////////////////////////////// //
24 var
25 pr: TTextParser;
26 dfmapdef: TDynMapDef;
27 wr: TTextWriter;
28 map: TDynRecord;
29 st: TStream;
30 stt: UInt64;
31 inname: AnsiString = '';
32 outname: AnsiString = '';
33 totext: Integer = -1; // <0: guess; force outname extension
34 sign: packed array[0..3] of AnsiChar;
35 wad: TWADFile = nil;
36 waddata: Pointer;
37 waddlen: Integer;
38 wasbin: Boolean = false;
39 lostdata: Boolean;
40 begin
41 if (ParamCount = 0) then
42 begin
43 writeln('usage: mapcvt inname outname');
44 Halt(1);
45 end;
47 inname := ParamStr(1);
48 //writeln('inname: [', inname, ']');
49 if (ParamCount = 1) then
50 begin
51 outname := forceFilenameExt(ParamStr(1), '');
52 if isWadPath(outname) then
53 begin
54 outname := SFSReplacePathDelims(g_ExtractFilePathName(outname), '/');
55 if (Length(outname) = 0) then begin writeln('FATAL: can''t guess output name!'); Halt(1); end;
56 end;
57 end
58 else
59 begin
60 outname := ParamStr(2);
61 if StrEquCI1251(getFilenameExt(outname), '.txt') then totext := 1
62 else if StrEquCI1251(getFilenameExt(outname), '.map') then totext := 0
63 else if StrEquCI1251(getFilenameExt(outname), '.dfmap') then totext := 0
64 else if (Length(getFilenameExt(outname)) = 0) then totext := -1
65 else begin writeln('FATAL: can''t guess output format!'); Halt(1); end;
66 end;
67 //writeln('outname: [', outname, ']; totext=', totext);
69 e_InitWritelnDriver();
70 conbufDumpToStdOut := true;
71 conbufConPrefix := false;
73 writeln('parsing "mapdef.txt"...');
74 //pr := TFileTextParser.Create('mapdef.txt');
75 pr := TStrTextParser.Create(defaultMapDef);
76 try
77 dfmapdef := TDynMapDef.Create(pr);
78 except on e: Exception do
79 begin
80 writeln('ERROR at (', pr.line, ',', pr.col, '): ', e.message);
81 Halt(1);
82 end;
83 end;
85 writeln('parsing "', inname, '"...');
87 if isWadPath(inname) then
88 begin
89 wad := TWADFile.Create();
90 wad.ReadFile(g_ExtractWadName(inname));
91 wad.GetMapResource(g_ExtractFilePathName(inname), waddata, waddlen);
92 st := TSFSMemoryChunkStream.Create(waddata, waddlen, true);
93 wad.Free();
94 end
95 else
96 begin
97 st := openDiskFileRO(inname);
98 end;
100 try
101 stt := curTimeMicro();
102 map := dfmapdef.parseMap(st, @wasbin);
103 stt := curTimeMicro()-stt;
104 if wasbin then write('binary') else write('text');
105 writeln(' map parsed in ', stt div 1000, '.', stt mod 1000, ' milliseconds');
106 except
107 on e: TDynParseException do
108 begin
109 writeln('ERROR at (', e.tokLine, ',', e.tokCol, '): ', e.message);
110 Halt(1);
111 end;
112 on E: Exception do
113 begin
114 writeln('ERROR: ', e.message);
115 Halt(1);
116 end;
117 end;
119 {$IF DEFINED(D2D_DYNREC_PROFILER)}xdynDumpProfiles();{$ENDIF}
121 if (totext < 0) then
122 begin
123 if wasbin then begin outname := forceFilenameExt(outname, '.txt'); totext := 1; end
124 else begin outname := forceFilenameExt(outname, '.map'); totext := 0; end;
125 end;
127 assert(totext >= 0);
129 writeln('writing "', outname, '"...');
130 st := createDiskFile(outname);
131 if (totext = 0) then
132 begin
133 // write binary map
134 lostdata := false;
135 stt := curTimeMicro();
136 map.writeBinTo(lostdata, st);
137 stt := curTimeMicro()-stt;
138 if lostdata then writeln('***WARNING! some data was lost due to binary format limitations!');
139 write('binary');
140 end
141 else
142 begin
143 // write text map
144 wr := TFileTextWriter.Create(st);
145 stt := curTimeMicro();
146 map.writeTo(wr);
147 stt := curTimeMicro()-stt;
148 wr.Free();
149 write('text');
150 end;
151 writeln(' map written in ', stt div 1000, '.', stt mod 1000, ' milliseconds');
152 end.