source: oup/current/Global/RawList.pas@ 299

Last change on this file since 299 was 241, checked in by alloc, 17 years ago
File size: 14.5 KB
Line 
1unit RawList;
2interface
3uses TypeDefs;
4
5type
6 THandler = function(ConnectionID, FileID: Integer): TRawDataList;
7 TRawListHandler = record
8 Ext: String[4];
9 needed: Boolean;
10 Handler: THandler;
11 end;
12 TRawListHandlers = array of TRawListHandler;
13
14 TRawLists = class
15 private
16 FRawListHandlers: TRawListHandlers;
17 public
18 property RawListHandlers: TRawListHandlers read FRawListHandlers;
19 procedure InsertRawListHandler(ext: String; needed: Boolean; handler: THandler);
20 function GetRawList(ConnectionID, FileID: Integer): TRawDataList;
21 function GetRawInfo(ConnectionID, FileID, DatOffset: Integer): TRawDataInfo;
22 end;
23
24
25var
26 RawLists: TRawLists;
27
28
29implementation
30
31uses
32 ConnectionManager, Access_OniArchive, Classes, SysUtils, Math, _TemplateFile;
33
34
35function AGDB(ConnectionID, FileID: Integer): TRawDataList;
36var
37 link: Integer;
38 links: Integer;
39 i: Integer;
40begin
41 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @links);
42 links := links * 2;
43 SetLength(Result, links);
44 for i := 0 to links - 1 do
45 begin
46 Result[i].Name := '<TBD>';
47 Result[i].SrcOffset := $20 + i * 4;
48 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * 4, 4, @link);
49 Result[i].RawAddr := link;
50 Result[i].RawSize := 32;
51 Result[i].LocSep := False;
52 Result[i].RawType := 'AGDB' + IntToStr(i mod 2);
53 end;
54end;
55
56
57
58
59function AKVA(ConnectionID, FileID: Integer): TRawDataList;
60var
61 link: Integer;
62 links: Integer;
63 i: Integer;
64begin
65 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @links);
66 SetLength(Result, links);
67 for i := 0 to links - 1 do
68 begin
69 Result[i].Name := '<TBD>';
70 Result[i].SrcOffset := $20 + i * $74 + $24;
71 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * $74 + $24, 4, @link);
72 Result[i].RawAddr := link;
73 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * $74 + $28, 4, @link);
74 Result[i].RawSize := link;
75 Result[i].LocSep := False;
76 Result[i].RawType := 'AKVA';
77 end;
78end;
79
80
81
82
83function BINA(ConnectionID, FileID: Integer): TRawDataList;
84var
85 link: Integer;
86 datasize: Integer;
87begin
88 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $0C, 4, @link);
89 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $08, 4, @datasize);
90 SetLength(Result, 1);
91 Result[0].Name := 'Binary data';
92 Result[0].SrcOffset := $0C;
93 Result[0].RawAddr := link;
94 Result[0].RawSize := datasize;
95 Result[0].LocSep := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN);
96 Result[0].RawType := 'BINA';
97end;
98
99
100
101
102function OSBD(ConnectionID, FileID: Integer): TRawDataList;
103var
104 link: Integer;
105 datasize: Integer;
106begin
107 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $08, 4, @datasize);
108 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $0C, 4, @link);
109 SetLength(Result, 1);
110 Result[0].Name := 'Sound Binary Data';
111 Result[0].SrcOffset := $0C;
112 Result[0].RawAddr := link;
113 Result[0].RawSize := datasize;
114 Result[0].LocSep := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN);
115 Result[0].RawType := 'OSBD';
116end;
117
118
119
120
121function SNDD(ConnectionID, FileID: Integer): TRawDataList;
122var
123 link: Integer;
124 datasize: Integer;
125begin
126 SetLength(Result, 1);
127 if ConManager.Connection[ConnectionID].DataOS in [DOS_MACBETA, DOS_MAC] then
128 begin
129 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $10, 4, @datasize);
130 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $14, 4, @link);
131 Result[0].SrcOffset := $14;
132 end
133 else
134 begin
135 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $40, 4, @datasize);
136 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $44, 4, @link);
137 Result[0].SrcOffset := $44;
138 end;
139 Result[0].Name := 'Sound data';
140 Result[0].RawAddr := link;
141 Result[0].RawSize := datasize;
142 Result[0].LocSep := False;
143 Result[0].RawType := 'SNDD';
144end;
145
146
147
148
149function SUBT(ConnectionID, FileID: Integer): TRawDataList;
150var
151 baselink, lastlink: Integer;
152 links: Integer;
153 Data: TStream;
154 read: Integer;
155 char: Byte;
156 foundzeros: Byte;
157begin
158 SetLength(Result, 0);
159
160 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $18, 4, @baselink);
161 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @links);
162 if links > 0 then
163 begin
164 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + (links - 1) * 4, 4, @lastlink);
165 Data := nil;
166 TAccess_OniArchive(ConManager.Connection[ConnectionID]).LoadRawOffset(
167 False, baselink, lastlink + 1024, Data);
168 Data.Seek(lastlink, soFromBeginning);
169
170 foundzeros := 0;
171 repeat
172 read := Data.Read(char, 1);
173 if (read > 0) and (char = 0) then
174 begin
175 Inc(foundzeros);
176 end;
177 until (read = 0) or (foundzeros = 2);
178
179 if foundzeros = 2 then
180 begin
181 SetLength(Result, 1);
182 Result[0].Name := 'Subtitles';
183 Result[0].SrcID := FileID;
184 Result[0].SrcOffset := $18;
185 Result[0].RawAddr := baselink;
186 Result[0].RawSize := Data.Position;
187 Result[0].LocSep := False;
188 Result[0].RawType := 'SUBT';
189 end;
190 end;
191end;
192
193
194
195
196function TRAM(ConnectionID, FileID: Integer): TRawDataList;
197var
198 i: Integer;
199 link: Integer;
200 frames: Word;
201 tempb: Byte;
202 tempw: Word;
203 templ: Integer;
204 Data: TByteData;
205 offset: Word;
206 frame_count: Integer;
207begin
208 SetLength(Result, 13);
209 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $16C, 2, @frames);
210 {y-pos}
211 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $0C, 4, @link);
212 Result[0].Name := 'y-pos';
213 Result[0].SrcOffset := $0C;
214 Result[0].RawAddr := link;
215 Result[0].RawSize := frames * 4;
216 Result[0].RawType := 'TRAM0';
217 {x-z-pos}
218 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $10, 4, @link);
219 Result[1].Name := 'x-z-pos';
220 Result[1].SrcOffset := $10;
221 Result[1].RawAddr := link;
222 Result[1].RawSize := frames * 8;
223 Result[1].RawType := 'TRAM1';
224 {attacks}
225 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $182, 1, @tempb);
226 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $14, 4, @link);
227 Result[2].Name := 'Attacks';
228 Result[2].SrcOffset := $14;
229 Result[2].RawAddr := link;
230 Result[2].RawSize := tempb * 32;
231 Result[2].RawType := 'TRAM2';
232 {damage}
233 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $183, 1, @tempb);
234 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $18, 4, @link);
235 Result[3].Name := 'Damage';
236 Result[3].SrcOffset := $18;
237 Result[3].RawAddr := link;
238 Result[3].RawSize := tempb * 8;
239 Result[3].RawType := 'TRAM3';
240 {motionblur}
241 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $184, 1, @tempb);
242 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @link);
243 Result[4].Name := 'MotionBlur';
244 Result[4].SrcOffset := $1C;
245 Result[4].RawAddr := link;
246 Result[4].RawSize := tempb * 12;
247 Result[4].RawType := 'TRAM4';
248 {shortcut}
249 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $185, 1, @tempb);
250 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20, 4, @link);
251 Result[5].Name := 'Shortcut';
252 Result[5].SrcOffset := $20;
253 Result[5].RawAddr := link;
254 Result[5].RawSize := tempb * 8;
255 Result[5].RawType := 'TRAM5';
256 {throw}
257 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $24, 4, @link);
258 Result[6].Name := 'Throw';
259 Result[6].SrcOffset := $24;
260 Result[6].RawAddr := link;
261 Result[6].RawSize := 24;
262 Result[6].RawType := 'TRAM6';
263 {footstep}
264 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $186, 1, @tempb);
265 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $28, 4, @link);
266 Result[7].Name := 'Footstep';
267 Result[7].SrcOffset := $28;
268 Result[7].RawAddr := link;
269 Result[7].RawSize := tempb * 4;
270 Result[7].RawType := 'TRAM7';
271 {particle}
272 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $187, 1, @tempb);
273 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $2C, 4, @link);
274 Result[8].Name := 'Particle';
275 Result[8].SrcOffset := $2C;
276 Result[8].RawAddr := link;
277 Result[8].RawSize := tempb * 24;
278 Result[8].RawType := 'TRAM8';
279 {position}
280 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $30, 4, @link);
281 Result[9].Name := 'Position';
282 Result[9].SrcOffset := $30;
283 Result[9].RawAddr := link;
284 Result[9].RawSize := frames * 8;
285 Result[9].RawType := 'TRAM9';
286 {sound}
287 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $154, 2, @tempw);
288 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $38, 4, @link);
289 Result[11].Name := 'Sound';
290 Result[11].SrcOffset := $38;
291 Result[11].RawAddr := link;
292 Result[11].RawSize := tempw * 34;
293 Result[11].RawType := 'TRAM11';
294 {extent}
295 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $138, 4, @templ);
296 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $13C, 4, @link);
297 Result[12].Name := 'Extent';
298 Result[12].SrcOffset := $13C;
299 Result[12].RawAddr := link;
300 Result[12].RawSize := templ * 12;
301 Result[12].RawType := 'TRAM12';
302
303 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $34, 4, @link);
304 if link > 0 then
305 begin
306 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $160, 2, @tempw);
307 frame_count := 0;
308 i := 0;
309 SetLength(Data, $FFFF);
310 TAccess_OniArchive(ConManager.Connection[ConnectionID]).LoadRawOffset(
311 False, link, $FFFF, Data);
312 offset := Data[$24] + Data[$25] * 256;
313 while (offset + i < Length(Data)) and (frame_count < frames - 1) do
314 begin
315 Inc(i, tempw);
316 frame_count := frame_count + Data[offset + i];
317 Inc(i);
318 end;
319 if offset + i < Length(Data) then
320 begin
321 Inc(i, tempw);
322 Result[10].RawSize := offset + i;
323 end
324 else
325 begin
326 Result[10].RawSize := 0;
327 end;
328 end;
329 Result[10].Name := 'BodyParts Animation';
330 Result[10].SrcOffset := $34;
331 Result[10].RawAddr := link;
332 Result[10].RawType := 'TRAM10';
333end;
334
335
336
337
338function TXMP(ConnectionID, FileID: Integer): TRawDataList;
339var
340 link_pc: Integer;
341 link_mac: Integer;
342 x, y: Word;
343 storetype: Byte;
344 datasize: Integer;
345 mipmap: Byte;
346
347 function GetImgSize(w,h, storetype: Integer): Integer;
348 begin
349 case storetype of
350 0, 1, 2:
351 Result := w*h*2;
352 8:
353 Result := w*h*4;
354 9:
355 Result := Max(1, w div 4) * Max(1, h div 4) * 8;
356 else
357 Result := -1;
358 end;
359 end;
360
361begin
362 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $88, SizeOf(mipmap), @mipmap);
363 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8C, SizeOf(x), @x);
364 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8E, SizeOf(y), @y);
365 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $90, SizeOf(storetype), @storetype);
366 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $9C, 4, @link_pc);
367 ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $A0, 4, @link_mac);
368
369
370 datasize := GetImgSize(x, y, storetype);
371 if (mipmap and $01) > 0 then
372 begin
373 repeat
374 x := Max(x div 2, 1);
375 y := Max(y div 2, 1);
376 datasize := datasize + GetImgSize(x, y, storetype);
377 until (x = 1) and (y = 1);
378 end;
379
380 SetLength(Result, 1);
381 if ConManager.Connection[ConnectionID].DataOS = DOS_WIN then
382 begin
383 Result[0].SrcOffset := $9C;
384 Result[0].RawAddr := link_pc;
385 end
386 else
387 begin
388 Result[0].SrcOffset := $A0;
389 Result[0].RawAddr := link_mac;
390 end;
391 Result[0].Name := 'ImageData';
392 Result[0].RawSize := datasize;
393 Result[0].LocSep := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN);
394 Result[0].RawType := 'TXMP';
395end;
396
397
398
399
400function TRawLists.GetRawInfo(ConnectionID, FileID,
401 DatOffset: Integer): TRawDataInfo;
402var
403 i: Integer;
404 RawList: TRawDataList;
405begin
406 RawList := GetRawList(ConnectionID, FileID);
407 Result.Name := '';
408 Result.SrcID := -1;
409 Result.SrcOffset := -1;
410 Result.RawAddr := -1;
411 Result.RawSize := -1;
412 Result.RawType := '';
413 if Length(RawList) > 0 then
414 begin
415 for i := 0 to High(RawList) do
416 begin
417 if RawList[i].SrcOffset = DatOffset then
418 begin
419 Result.Name := RawList[i].Name;
420 Result.SrcID := FileID;
421 Result.SrcOffset := RawList[i].SrcOffset;
422 Result.RawAddr := RawList[i].RawAddr;
423 Result.RawSize := RawList[i].RawSize;
424 Result.LocSep := RawList[i].LocSep;
425 Result.RawType := RawList[i].RawType;
426 Break;
427 end;
428 end;
429 end;
430end;
431
432
433function TRawLists.GetRawList(ConnectionID, FileID: Integer): TRawDataList;
434var
435 i: Integer;
436 fileinfo: TFileInfo;
437begin
438 SetLength(Result, 0);
439 fileinfo := ConManager.Connection[ConnectionID].GetFileInfo(FileID);
440 for i := 0 to High(FRawListHandlers) do
441 if UpperCase(FRawListHandlers[i].Ext) = UpperCase(fileinfo.extension) then
442 begin
443 if FRawListHandlers[i].needed then
444 Result := FRawListHandlers[i].Handler(ConnectionID, FileID);
445 Break;
446 end;
447 if Length(Result) > 0 then
448 for i := 0 to High(Result) do
449 if Result[i].RawAddr = 0 then
450 Result[i].RawSize := 0;
451end;
452
453procedure TRawLists.InsertRawListHandler(ext: String; needed: Boolean; handler: THandler);
454begin
455 SetLength(FRawListHandlers, Length(FRawListHandlers) + 1);
456 FRawListHandlers[High(FRawListHandlers)].Ext := ext;
457 FRawListHandlers[High(FRawListHandlers)].needed := needed;
458 FRawListHandlers[High(FRawListHandlers)].handler := handler;
459// Raws := Raws + ext;
460 AddToolListEntry('rawedit', '', ext);
461end;
462
463
464
465
466initialization
467 RawLists := TRawLists.Create;
468 RawLists.InsertRawListHandler('AGDB', False, AGDB);
469 RawLists.InsertRawListHandler('AKVA', True, AKVA);
470 RawLists.InsertRawListHandler('BINA', True, BINA);
471 RawLists.InsertRawListHandler('OSBD', True, OSBD);
472 RawLists.InsertRawListHandler('SNDD', True, SNDD);
473 RawLists.InsertRawListHandler('SUBT', True, SUBT);
474 RawLists.InsertRawListHandler('TRAM', True, TRAM);
475 RawLists.InsertRawListHandler('TXMP', True, TXMP);
476end.
Note: See TracBrowser for help on using the repository browser.