source: oup/releases/0.27a/Unit9_data_structures.pas @ 26

Last change on this file since 26 was 26, checked in by alloc, 15 years ago
File size: 12.4 KB
Line 
1UNIT Unit9_data_structures;
2INTERFACE
3USES SysUtils, ABSMain, DB, ABSDecUtil, Unit3_data;
4
5TYPE
6  Tstructure_entry=RECORD
7      name:String;
8      offset:LongWord;
9      datatype:Word;  // 1..4: Integer[1..4] dec; 5..8: Integer[1..4] hex; 9: float; 10: bitset; 11: raw-addr; 10000+: string[0+]
10      description:String;
11    END;
12  Tstructure_info=RECORD
13      extension:String;
14      typedesc:String;
15      entries:Array OF Tstructure_entry;
16    END;
17  Tstructures=Array OF Tstructure_info;
18  THandler=FUNCTION(fileid:LongWord):TRawList;
19  TRawListHandlers=RECORD
20    Ext:String[4];
21    needed:Boolean;
22    Handler:THandler;
23  END;
24
25VAR
26  structure_infos:Tstructures;
27  RawListHandlers:Array OF TRawListHandlers;
28
29
30FUNCTION GetDataType(typeid:Word):String;
31FUNCTION GetStructureInfoId(ext:String):Integer;
32FUNCTION GetTypeDataLength(datatype:Word):Word;
33FUNCTION GetRawInfo(fileid,dat_offset:LongWord):TRawInfo;
34FUNCTION GetRawList(fileid:LongWord):TRawList;
35
36
37
38IMPLEMENTATION
39USES Unit2_functions;
40
41FUNCTION GetTypeDataLength(datatype:Word):Word;
42  BEGIN
43    CASE datatype OF
44      1..4: Result:=datatype;
45      5..8: Result:=datatype-4;
46      9: Result:=4;
47      10: Result:=1;
48      11: Result:=4;
49      10000..65535: Result:=datatype-10000;
50    END;
51  END;
52
53
54FUNCTION GetStructureInfoId(ext:String):Integer;
55  VAR
56    i:Integer;
57  BEGIN
58    FOR i:=0 TO High(structure_infos) DO BEGIN
59      IF structure_infos[i].extension=ext THEN BEGIN
60        Result:=i;
61        Exit;
62      END;
63    END;
64    Result:=-1;
65  END;
66
67
68FUNCTION GetDataType(typeid:Word):String;
69  BEGIN
70    CASE typeid OF
71      1..4: Result:='Int'+IntToStr(typeid*8);
72      5..8: Result:='Int'+IntToStr((typeid-4)*8);
73      9: Result:='Float';
74      10: Result:='BitSet';
75      11: Result:='Raw-Address';
76      10000..65535: Result:='String('+IntToStr(typeid-10000)+')';
77    END;
78  END;
79
80
81FUNCTION GetRawInfo(fileid,dat_offset:LongWord):TRawInfo;
82  VAR
83    i:LongWord;
84    raw_list:TRawList;
85  BEGIN
86    raw_list:=GetRawList(fileid);
87    Result.src_id:=0;
88    Result.src_offset:=0;
89    Result.raw_addr:=0;
90    Result.raw_size:=0;
91    FOR i:=0 TO High(raw_list) DO BEGIN
92      IF raw_list[i].src_offset=dat_offset THEN BEGIN
93        Result.src_id:=fileid;
94        Result.src_offset:=raw_list[i].src_offset;
95        Result.raw_addr:=raw_list[i].raw_addr;
96        Result.raw_size:=raw_list[i].raw_size;
97        Result.loc_sep:=raw_list[i].loc_sep;
98        Break;
99      END;
100    END;
101  END;
102
103FUNCTION GetRawList(fileid:LongWord):TRawList;
104  VAR
105    i:LongWord;
106    Query:TABSQuery;
107  BEGIN
108    IF opened_state=opened_dat THEN BEGIN
109      FOR i:=0 TO High(RawListHandlers) DO
110        IF UpperCase(RawListHandlers[i].Ext)=UpperCase(dat_files[fileid].extension) THEN
111          IF RawListHandlers[i].needed THEN BEGIN
112            Result:=RawListHandlers[i].Handler(fileid);
113            Break;
114          END ELSE
115            Break;
116    END ELSE BEGIN
117      SetLength(Result,0);
118      Query.SQL.Text:='SELECT [src_link_offset],[size] FROM rawmap WHERE [src_id]='+IntToStr(fileid)+' ORDER BY src_link_offset ASC;';
119      Query.Open;
120      IF Query.RecordCount>0 THEN BEGIN
121        Query.First;
122        SetLength(Result,Query.RecordCount);
123        i:=0;
124        REPEAT
125          Result[i].src_id:=fileid;
126          Result[i].src_offset:=Query.FieldByName('src_link_offset').AsInteger;
127          Result[i].raw_addr:=0;
128          Result[i].raw_size:=Query.FieldByName('size').AsInteger;
129          Inc(i);
130          Query.Next;
131        UNTIL Query.EOF;
132      END;
133      Query.Close;
134    END;
135  END;
136
137
138FUNCTION AGDB(fileid:LongWord):TRawList;
139  VAR
140    link:LongWord;
141    links:LongWord;
142    i:LongWord;
143  BEGIN
144    IF NOT dat_os_mac THEN BEGIN
145      LoadDatFilePart(fileid,$1C,4,@links);
146      links:=links*2;
147      SetLength(Result,links);
148      FOR i:=0 TO links-1 DO BEGIN
149        Result[i].src_offset:=$20+i*4;
150        LoadDatFilePart(fileid,$20+i*4,4,@link);
151        Result[i].raw_addr:=link;
152        Result[i].raw_size:=0{????????????????????????????????};
153        Result[i].loc_sep:=False;
154      END;
155    END;
156  END;
157FUNCTION BINA(fileid:LongWord):TRawList;
158  VAR
159    link:LongWord;
160    datasize:LongWord;
161  BEGIN
162    LoadDatFilePart(fileid,$0C,4,@link);
163    LoadDatFilePart(fileid,$08,4,@datasize);
164    SetLength(Result,1);
165    Result[0].src_offset:=$0C;
166    Result[0].raw_addr:=link;
167    Result[0].raw_size:=datasize;
168    Result[0].loc_sep:=dat_os_mac;
169  END;
170FUNCTION OSBD(fileid:LongWord):TRawList;
171  VAR
172    link:LongWord;
173    datasize:LongWord;
174  BEGIN
175    LoadDatFilePart(fileid,$08,4,@datasize);
176    LoadDatFilePart(fileid,$0C,4,@link);
177    SetLength(Result,1);
178    Result[0].src_offset:=$0C;
179    Result[0].raw_addr:=link;
180    Result[0].raw_size:=datasize;
181    Result[0].loc_sep:=dat_os_mac;
182  END;
183FUNCTION SNDD(fileid:LongWord):TRawList;
184  VAR
185    link:LongWord;
186    datasize:LongWord;
187  BEGIN
188    LoadDatFilePart(fileid,$40,4,@datasize);
189    LoadDatFilePart(fileid,$44,4,@link);
190    SetLength(Result,1);
191    Result[0].src_offset:=$44;
192    Result[0].raw_addr:=link;
193    Result[0].raw_size:=datasize;
194  END;
195FUNCTION SUBT(fileid:LongWord):TRawList;
196  VAR
197    baselink,link:LongWord;
198    links:LongWord;
199    i,j,k:LongWord;
200    data:Tdata;
201  BEGIN
202    LoadDatFilePart(fileid,$18,4,@baselink);
203    LoadDatFilePart(fileid,$1C,4,@links);
204    IF links>0 THEN BEGIN
205      LoadDatFilePart(fileid,$20+(links-1)*4,4,@link);
206      SetLength(data,link+1024);
207      LoadRawFile(fileid,$1C,baselink,link+1024,False,@data[0]);
208      k:=0;
209      FOR j:=0 TO 1024 DO BEGIN
210        IF (data[link+j]=$00) OR (j=1024) THEN BEGIN
211          IF j<1024 THEN BEGIN
212            IF k=0 THEN BEGIN
213              k:=1;
214            END ELSE BEGIN
215              SetLength(Result,1);
216              Result[0].src_offset:=$18;
217              Result[0].raw_addr:=baselink;
218              Result[0].raw_size:=link+j;
219              Break;
220            END;
221          END;
222        END;
223      END;
224    END;
225  END;
226FUNCTION TRAM(fileid:LongWord):TRawList;
227  VAR
228    i:Byte;
229    link:LongWord;
230    frames:Word;
231    tempb:Byte;
232    tempw:Word;
233    templ:LongWord;
234    data:Tdata;
235    offset:Word;
236  BEGIN
237    SetLength(Result,13);
238    LoadDatFilePart(fileid,$16C,2,@frames);
239    {y-pos}
240    LoadDatFilePart(fileid,$0C,4,@link);
241    Result[0].src_offset:=$0C;
242    Result[0].raw_addr:=link;
243    Result[0].raw_size:=frames*4;
244    {x-z-pos}
245    LoadDatFilePart(fileid,$10,4,@link);
246    Result[1].src_offset:=$10;
247    Result[1].raw_addr:=link;
248    Result[1].raw_size:=frames*8;
249    {attacks}
250    LoadDatFilePart(fileid,$182,1,@tempb);
251    LoadDatFilePart(fileid,$14,4,@link);
252    Result[2].src_offset:=$14;
253    Result[2].raw_addr:=link;
254    Result[2].raw_size:=tempb*32;
255    {damage}
256    LoadDatFilePart(fileid,$183,1,@tempb);
257    LoadDatFilePart(fileid,$18,4,@link);
258    Result[3].src_offset:=$18;
259    Result[3].raw_addr:=link;
260    Result[3].raw_size:=tempb*8;
261    {motionblur}
262    LoadDatFilePart(fileid,$184,1,@tempb);
263    LoadDatFilePart(fileid,$1C,4,@link);
264    Result[4].src_offset:=$1C;
265    Result[4].raw_addr:=link;
266    Result[4].raw_size:=tempb*8;
267    {shortcut}
268    LoadDatFilePart(fileid,$185,1,@tempb);
269    LoadDatFilePart(fileid,$20,4,@link);
270    Result[5].src_offset:=$20;
271    Result[5].raw_addr:=link;
272    Result[5].raw_size:=tempb*8;
273    {throw}
274    LoadDatFilePart(fileid,$24,4,@link);
275    Result[6].src_offset:=$24;
276    Result[6].raw_addr:=link;
277    IF link>0 THEN
278      Result[6].raw_size:=24
279    ELSE
280      Result[6].raw_size:=0;
281    {footstep}
282    LoadDatFilePart(fileid,$186,1,@tempb);
283    LoadDatFilePart(fileid,$28,4,@link);
284    Result[7].src_offset:=$28;
285    Result[7].raw_addr:=link;
286    Result[7].raw_size:=tempb*4;
287    {particle}
288    LoadDatFilePart(fileid,$187,1,@tempb);
289    LoadDatFilePart(fileid,$2C,4,@link);
290    Result[8].src_offset:=$2C;
291    Result[8].raw_addr:=link;
292    Result[8].raw_size:=tempb*24;
293    {position}
294    LoadDatFilePart(fileid,$30,4,@link);
295    Result[9].src_offset:=$30;
296    Result[9].raw_addr:=link;
297    Result[9].raw_size:=frames*8;
298    {particle}
299    LoadDatFilePart(fileid,$154,2,@tempw);
300    LoadDatFilePart(fileid,$38,4,@link);
301    Result[11].src_offset:=$38;
302    Result[11].raw_addr:=link;
303    Result[11].raw_size:=tempw*34;
304    {extent}
305    LoadDatFilePart(fileid,$138,1,@templ);
306    LoadDatFilePart(fileid,$13C,4,@link);
307    Result[12].src_offset:=$13C;
308    Result[12].raw_addr:=link;
309    Result[12].raw_size:=templ*12;
310
311    LoadDatFilePart(fileid,$34,4,@link);
312    tempw:=0;
313    IF link>0 THEN BEGIN
314      {BODY ANIMATIONS PART DECODE!!!}
315      SetLength(data,$FFFF);
316      LoadRawFile(fileid,$34,link,$FFFF,False,@data[0]);
317      offset:=data[24]+data[25]*255;
318      {}
319    END;
320    Result[10].src_offset:=$34;
321    Result[10].raw_addr:=link;
322    Result[10].raw_size:=tempw;
323  END;
324FUNCTION TXMP(fileid:LongWord):TRawList;
325  VAR
326    link_pc:LongWord;
327    link_mac:LongWord;
328    x,y:Word;
329    storetype:Byte;
330    datasize:LongWord;
331  BEGIN
332    LoadDatFilePart(fileid,$8C,SizeOf(x),@x);
333    LoadDatFilePart(fileid,$8E,SizeOf(y),@y);
334    LoadDatFilePart(fileid,$90,SizeOf(storetype),@storetype);
335    LoadDatFilePart(fileid,$9C,4,@link_pc);
336    LoadDatFilePart(fileid,$A0,4,@link_mac);
337    CASE storetype OF
338      0,1,2: datasize:=x*y*2;
339      8: datasize:=x*y*4;
340      9: datasize:=x*y DIV 2;
341    END;
342    SetLength(Result,1);
343    IF NOT dat_os_mac THEN BEGIN
344      Result[0].src_offset:=$9C;
345      Result[0].raw_addr:=link_pc
346    END ELSE BEGIN
347      Result[0].src_offset:=$A0;
348      Result[0].raw_addr:=link_mac;
349    END;
350    Result[0].raw_size:=datasize;
351    Result[0].loc_sep:=dat_os_mac;
352  END;
353
354
355
356PROCEDURE AddEntry(_ext:String; _name:String; _offset:LongWord; _datatype:Word; _description:String);
357  VAR
358    sid:Integer;
359  BEGIN
360    sid:=GetStructureInfoId(_ext);
361    IF sid>=0 THEN BEGIN
362      WITH structure_infos[sid] DO BEGIN
363        SetLength(entries,Length(entries)+1);
364        WITH entries[High(entries)] DO BEGIN
365          name:=_name;
366          offset:=_offset;
367          datatype:=_datatype;
368          description:=_description;
369        END;
370      END;
371    END;
372  END;
373
374PROCEDURE AddExtension(_ext:String; _typedesc:String);
375  BEGIN
376    IF GetStructureInfoId(_ext)<0 THEN BEGIN
377      SetLength(structure_infos,Length(structure_infos)+1);
378      WITH structure_infos[High(structure_infos)] DO BEGIN
379        extension:=_ext;
380        typedesc:=_typedesc;
381      END;
382    END;
383  END;
384
385PROCEDURE InsertRawListHandler(ext:String; needed:Boolean; handler:THandler);
386  BEGIN
387    SetLength(RawListHandlers,Length(RawListHandlers)+1);
388    RawListHandlers[High(RawListHandlers)].Ext:=ext;
389    RawListHandlers[High(RawListHandlers)].needed:=needed;
390    RawListHandlers[High(RawListHandlers)].handler:=handler;
391  END;
392
393
394BEGIN
395  AddExtension('SUBT','Subtitles');
396  AddEntry('SUBT','ID',$00,4,'ID of this file');
397  AddEntry('SUBT','LevelID',$04,8,'ID of the level this file is in');
398  AddEntry('SUBT','Raw-Link',$18,11,'Address of the subtitle data in the .raw-file');
399  AddEntry('SUBT','Subtitle count',$1C,4,'Number of subtitles in this file');
400  AddExtension('TXMP','Texture');
401  AddEntry('TXMP','ID',$00,4,'ID of this file');
402  AddEntry('TXMP','LevelID',$04,8,'ID of the level this file is in');
403  AddEntry('TXMP','FileName',$08,10128,'');
404  AddEntry('TXMP','MIP Mapping',$88,10,'MIP Mapping Bitset');
405  AddEntry('TXMP','Depth',$89,10,'Depth-Bitset');
406  AddEntry('TXMP','Width',$8C,2,'x-resolution of image');
407  AddEntry('TXMP','Height',$8E,2,'y-resolution of image');
408  AddEntry('TXMP','Storetype',$90,10,'Storetype-Bitset');
409  AddEntry('TXMP','TXAN-Link',$94,8,'Link to the TXAN-file (if this TXMP is the first image of an animation)');
410  AddEntry('TXMP','TXMP-Link',$98,8,'Link to another TXMP-file');
411  AddEntry('TXMP','Raw-Link',$9C,11,'Address of the image data in the .raw-file (only for PC-dat-files)');
412  AddEntry('TXMP','Raw-Link',$A0,11,'Address of the image data in the .raw-file (only for MAC-dat-files)');
413
414{$I Include_DataStructureDefs.pas}
415
416//  InsertRawListHandler('AGDB',True,AGDB);
417  InsertRawListHandler('BINA',True,BINA);
418  InsertRawListHandler('OSBD',True,OSBD);
419  InsertRawListHandler('SNDD',True,SNDD);
420  InsertRawListHandler('SUBT',True,SUBT);
421  InsertRawListHandler('TRAM',True,TRAM);
422  InsertRawListHandler('TXMP',True,TXMP);
423END.
Note: See TracBrowser for help on using the repository browser.