DEADSOFTWARE

moved tools to separate directory; moved "mapdef.txt" to separate directory
[d2df-sdl.git] / src / tools / mapcvt.dpr
1 {$INCLUDE ../shared/a_modes.inc}
2 {$APPTYPE CONSOLE}
4 uses
5 SysUtils, Classes,
6 xstreams in '../shared/xstreams.pas',
7 xparser in '../shared/xparser.pas',
8 xdynrec in '../shared/xdynrec.pas',
9 xprofiler in '../shared/xprofiler.pas',
10 utils in '../shared/utils.pas',
11 MAPDEF in '../shared/MAPDEF.pas';
14 // ////////////////////////////////////////////////////////////////////////// //
15 var
16 pr: TTextParser;
17 dfmapdef: TDynMapDef;
18 wr: TTextWriter;
19 map: TDynRecord;
20 st: TStream;
21 stt: UInt64;
22 inname: AnsiString = '';
23 outname: AnsiString = '';
24 totext: Integer = -1; // <0: guess; force outname extension
25 sign: packed array[0..3] of AnsiChar;
26 begin
27 if (ParamCount = 0) then
28 begin
29 writeln('usage: mapcvt inname outname');
30 Halt(1);
31 end;
33 inname := ParamStr(1);
34 //writeln('inname: [', inname, ']');
35 if (ParamCount = 1) then
36 begin
37 outname := forceFilenameExt(ParamStr(1), '');
38 end
39 else
40 begin
41 outname := ParamStr(2);
42 if StrEquCI1251(getFilenameExt(outname), '.txt') then totext := 1
43 else if StrEquCI1251(getFilenameExt(outname), '.map') then totext := 0
44 else if StrEquCI1251(getFilenameExt(outname), '.dfmap') then totext := 0
45 else if (Length(getFilenameExt(outname)) = 0) then totext := -1
46 else begin writeln('FATAL: can''t guess output format!'); Halt(1); end;
47 end;
48 //writeln('outname: [', outname, ']; totext=', totext);
50 writeln('parsing "mapdef.txt"...');
51 //pr := TFileTextParser.Create('mapdef.txt');
52 pr := TStrTextParser.Create(defaultMapDef);
53 try
54 dfmapdef := TDynMapDef.Create(pr);
55 except on e: Exception do
56 begin
57 writeln('ERROR at (', pr.line, ',', pr.col, '): ', e.message);
58 Halt(1);
59 end;
60 end;
62 writeln('parsing "', inname, '"...');
63 st := openDiskFileRO(inname);
64 st.ReadBuffer(sign, 4);
65 st.position := 0;
66 if (sign[0] = 'M') and (sign[1] = 'A') and (sign[2] = 'P') and (sign[3] = #1) then
67 begin
68 // binary map
69 if (totext < 0) then begin outname := forceFilenameExt(outname, '.txt'); totext := 1; end;
70 stt := curTimeMicro();
71 map := dfmapdef.parseBinMap(st);
72 stt := curTimeMicro()-stt;
73 writeln('binary map parsed in ', stt div 1000, '.', stt mod 1000, ' microseconds');
74 end
75 else
76 begin
77 // text map
78 if (totext < 0) then begin outname := forceFilenameExt(outname, '.map'); totext := 0; end;
79 pr := TFileTextParser.Create(st);
80 try
81 stt := curTimeMicro();
82 map := dfmapdef.parseMap(pr);
83 stt := curTimeMicro()-stt;
84 writeln('text map parsed in ', stt div 1000, '.', stt mod 1000, ' microseconds');
85 except on e: Exception do
86 begin
87 writeln('ERROR at (', pr.line, ',', pr.col, '): ', e.message);
88 Halt(1);
89 end;
90 end;
91 pr.Free();
92 end;
94 assert(totext >= 0);
96 writeln('writing "', outname, '"...');
97 st := createDiskFile(outname);
98 if (totext = 0) then
99 begin
100 // write binary map
101 stt := curTimeMicro();
102 map.writeBinTo(st);
103 stt := curTimeMicro()-stt;
104 writeln('binary map written in ', stt div 1000, '.', stt mod 1000, ' microseconds');
105 end
106 else
107 begin
108 // write text map
109 wr := TFileTextWriter.Create(st);
110 stt := curTimeMicro();
111 map.writeTo(wr);
112 stt := curTimeMicro()-stt;
113 writeln('text map written in ', stt div 1000, '.', stt mod 1000, ' microseconds');
114 wr.Free();
115 end;
116 end.