ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/Helper/LevelDB.pas
(Generate patch)

Comparing oup/current/Helper/LevelDB.pas (file contents):
Revision 112 by alloc, Thu Feb 22 00:37:39 2007 UTC vs.
Revision 130 by alloc, Wed Mar 28 01:17:24 2007 UTC

# Line 1 | Line 1
1   unit LevelDB;
2
2   interface
4
3   uses
4    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
5    Dialogs, ComCtrls, StdCtrls, StrUtils;
# Line 27 | Line 25 | var
25    Form_LevelDB: TForm_LevelDB;
26  
27   implementation
30
28   {$R *.dfm}
32
29   uses ABSMain, ABSDecUtil, Main,
30 <    ConnectionManager, TypeDefs, DataAccess, OniImgClass;
30 >    ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data;
31  
32   type
33    THandler = procedure(FileID: Integer);
# Line 69 | Line 65 | var
65    Stream_Body, Stream_Names:          TMemoryStream;
66    Stream_Dat, Stream_Raw, Stream_Sep: TFileStream;
67  
72 //  FileCount: Integer;
73 //  temps, temps2: String;
68   //  Data, rawdata: Tdata;
69    BeginTime, FileTime: Double;
70    Step:     Integer;
71   //  rawlist:  TRawDataList;
78 //  extlist:  TExtensionsMap;
79 //  fileinfo: TFileInfo;
72   //  datlinks: TDatLinks;
73    OniImage:   TOniImage;
74    LevelID:    Integer;
# Line 86 | Line 78 | var
78    Connection: TDataAccess;
79    ConRepMsg:  TStatusMessages;
80  
81 +  FileID:     Integer;
82 +
83    Strings:    TStrings;
84    i, j:       Integer;
85 +  temps:      String;
86 +  tempi:      Integer;
87 +  tempb:      Byte;
88 +  FileInfo:   TFileInfo;
89 +  DatLinks:   TDatLinkList;
90 +  RawLinks:   TRawDataList;
91 +
92 +  DatFileStream, RawFileStream: TMemoryStream;
93   const
94    Steps: Byte = 3;
95  
# Line 153 | Line 155 | begin
155        begin
156          ShowMessage('Couldn''t delete file. Aborting');
157          Exit;
158 <      end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then
158 >      end else if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
159        begin
160 <        ShowMessage('Couldn''t delete file. Aborting');
161 <        Exit;
160 >        if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then
161 >        begin
162 >          ShowMessage('Couldn''t delete file. Aborting');
163 >          Exit;
164 >        end;
165        end;
166      end else begin
167        ShowMessage('Aborting');
# Line 208 | Line 213 | begin
213      end;
214    end;
215  
216 <  
217 <  extlist := OniDataConnection.GetExtendedExtensionsList;
218 <  for i := 0 to High(DatHeader.Ident) do
219 <    DatHeader.Ident[i] := OniDataConnection.LevelInfo.Ident[i];
220 <  DatHeader.Files := OniDataConnection.GetFilesCount;
216 >  for i := 0 to High(DatHeader.OSIdent) do
217 >    case Connection.DataOS of
218 >      DOS_WIN: DatHeader.OSIdent[i] := HeaderOSIdentWin[i];
219 >      DOS_MAC: DatHeader.OSIdent[i] := HeaderOSIdentMac[i];
220 >      DOS_MACBETA: DatHeader.OSIdent[i] := HeaderOSIdentMacBeta[i];
221 >    end;
222 >  for i := 0 to High(DatHeader.GlobalIdent) do
223 >    DatHeader.GlobalIdent[i] := HeaderGlobalIdent[i];
224 >  DatHeader.Files := Connection.GetFileCount;
225    DatHeader.NamedFiles := Length(NamedFilesHeader);
226 <  DatHeader.Extensions := Length(extlist);
226 >
227 >  Strings := Connection.GetExtensionsList(EF_ExtCount);
228 >
229 >  DatHeader.Extensions := Strings.Count;
230    DatHeader.DataAddr   := 0;
231    DatHeader.DataSize   := 0;
232    DatHeader.NamesAddr  := 0;
# Line 226 | Line 238 | begin
238  
239  
240    DoStep('Writing extensions-header');
241 <  progress.Max := Length(OniDataConnection.GetExtensionsList);
241 >  progress.Max := Strings.Count;
242    Application.ProcessMessages;
243 <
232 <  for i := 0 to High(ExtensionsHeader) do
243 >  for i := 0 to Strings.Count - 1 do
244    begin
245 <    ExtensionsHeader[i].Ident     := extlist[i].Ident;
246 <    ExtensionsHeader[i].Extension := extlist[i].Extension;
247 <    SetLength(temps, 4);
245 >    temps := Strings.Strings[i];
246 >    ExtensionsHeader[i].ExtCount := StrToInt( MidStr(
247 >            temps,
248 >            Pos('(', temps) + 1,
249 >            Pos(')', temps) - Pos('(', temps) - 1 ) );
250 >    temps := MidStr(temps, 1, 4);
251      for j := 0 to 3 do
252 <      temps[j + 1] := ExtensionsHeader[i].Extension[3 - j];
253 <    ExtensionsHeader[i].ExtCount :=
254 <      Length(OniDataConnection.GetFilesList(temps, '', False, stIDAsc));
252 >      ExtensionsHeader[i].Extension[j] := temps[4-j];
253 >    for j := 0 to High(FileTypes) do
254 >      if FileTypes[j].Extension = temps then
255 >        Break;
256 >    if j < Length(FileTypes) then
257 >    begin
258 >      case Connection.DataOS of
259 >        DOS_WIN:     ExtensionsHeader[i].Ident := FileTypes[j].IdentWin;
260 >        DOS_WINDEMO: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
261 >        DOS_MAC:     ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
262 >        DOS_MACBETA: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
263 >      end;
264 >    end else begin
265 >      ShowMessage('Unknown Extension: ' + Strings.Strings[i]);
266 >      Exit;
267 >    end;
268      progress.Position    := i + 1;
269      lbl_progress.Caption := 'Extensions done: ' + IntToStr(i + 1) + '/' +
270 <      IntToStr(Length(extlist));
270 >      IntToStr(Strings.Count);
271      Application.ProcessMessages;
272    end;
273  
247
274    DoStep('Storing files-data');
275    progress.Position := 0;
276    progress.Max      := DatHeader.Files;
# Line 252 | Line 278 | begin
278    lbl_estimation.Caption := 'Estimated finishing time: unknown';
279    Application.ProcessMessages;
280  
281 <  begintime := Time;
282 <  for i := 0 to DatHeader.Files - 1 do
281 >  FileTime := Time;
282 >  for FileID := 0 to DatHeader.Files - 1 do
283    begin
284 <    fileinfo := OniDataConnection.GetFileInfo(i);
284 >    FileInfo := Connection.GetFileInfo(FileID);
285      for j := 0 to 3 do
286 <      FilesHeader[i].Extension[j] := fileinfo.Extension[4 - j];
287 <    if fileinfo.Size > 0 then
286 >      FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j];
287 >    if FileInfo.Size > 0 then
288      begin
289 <      //        DatLinks:=;
290 <      FilesHeader[i].DataAddr := Stream_Body.Size + 8;
291 <      Data    := OniDataConnection.LoadDatFile(i);
292 <      Data[4] := (levelid) and $FF;
293 <      Data[5] := (levelid shr 8) and $FF;
294 <      Data[6] := (levelid shr 16) and $FF;
295 <      Data[7] := (levelid shr 24) and $FF;
289 >      FilesHeader[FileID].DataAddr := Stream_Body.Size + 8;
290 >      DatFileStream := TMemoryStream.Create;
291 >      Connection.LoadDatFile(FileID, TStream(DatFileStream));
292 >      DatFileStream.Seek(4, soFromBeginning);
293 >      DatFileStream.Write(LevelID, 4);
294 >
295 >      DatLinks := Connection.GetDatLinks(FileID);
296 >      if Length(DatLinks) > 0 then
297 >      begin
298 >        for i := 0 to High(DatLinks) do
299 >        begin
300 >          DatFileStream.Seek(DatLinks[i].SrcOffset, soFromBeginning);
301 >          if DatLinks[i].DestID < 0 then
302 >            tempi := 0
303 >          else
304 >            tempi := DatLinks[i].DestID * 256 + 1;
305 >          DatFileStream.Write(tempi, 4);
306 >        end;
307 >      end;
308  
309 <      if (Pos(UpperCase(fileinfo.Extension), UpperCase(raws)) mod 4) = 1 then
309 >      RawLinks := Connection.GetRawList(FileID);
310 >      if Length(RawLinks) > 0 then
311        begin
312 <        rawlist := OniDataConnection.GetRawList(i);
274 <        if Length(rawlist) > 0 then
312 >        for i := 0 to High(RawLinks) do
313          begin
314 <          for j := 0 to High(rawlist) do
314 >          if RawLinks[i].RawSize > 0 then
315            begin
316 <            if rawlist[j].raw_size > 0 then
316 >            RawFileStream := TMemoryStream.Create;
317 >            Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, TStream(RawFileStream));
318 >            RawFileStream.Seek(0, soFromBeginning);
319 >            if RawLinks[i].LocSep then
320              begin
321 <              if (UpperCase(fileinfo.Extension) = 'TXMP') and
322 <                ((Data[$88] and $01) > 0) then
323 <              begin
324 <                OniImage.LoadFromTXMP(Connection, i);
325 <                OniImage.GetMipMappedImage(rawdata);
326 <                rawlist[j].raw_size := OniImage.GetImageDataSize(True);
327 <                Data[$90] := $08;
328 <                Data[$89] := 32;
329 < {                  if data[$90]<>OniImage.StoreType then begin
330 <                    data[$90]:=OniImage.StoreType;
290 <                    data[$89]:=(data[$89] and $CF) or $20;
291 <                  end;
292 < }                end
293 <              else
294 <              begin
295 <                SetLength(rawdata, rawlist[j].raw_size);
296 <                OniDataConnection.LoadRawFile(i, rawlist[j].src_offset, @rawdata[0]);
297 <              end;
298 <              //                data[$88]:=data[$88] and $FE;
299 <
300 <              if rawlist[j].loc_sep then
301 <              begin
302 <                rawlist[j].raw_addr := Stream_Sep.Size;
303 <                Stream_Sep.Write(rawdata[0], Length(rawdata));
304 <              end
305 <              else
306 <              begin
307 <                rawlist[j].raw_addr := Stream_Raw.Size;
308 <                Stream_Raw.Write(rawdata[0], Length(rawdata));
309 <              end;
310 <            end
311 <            else
312 <              rawlist[j].raw_addr := 0;
313 <            Data[rawlist[j].src_offset + 0] := (rawlist[j].raw_addr) and $FF;
314 <            Data[rawlist[j].src_offset + 1] := (rawlist[j].raw_addr shr 8) and $FF;
315 <            Data[rawlist[j].src_offset + 2] := (rawlist[j].raw_addr shr 16) and $FF;
316 <            Data[rawlist[j].src_offset + 3] := (rawlist[j].raw_addr shr 24) and $FF;
317 <          end;
321 >              RawLinks[i].RawAddr := Stream_Sep.Size;
322 >              Stream_sep.CopyFrom(RawFileStream, RawFileStream.Size);
323 >            end else begin
324 >              RawLinks[i].RawAddr := Stream_Raw.Size;
325 >              Stream_Raw.CopyFrom(RawFileStream, RawFileStream.Size);
326 >            end;
327 >          end else
328 >            RawLinks[i].RawAddr := 0;
329 >          DatFileStream.Seek(RawLinks[i].SrcOffset, soFromBeginning);
330 >          DatFileStream.Write(RawLinks[i].RawAddr, 4);
331          end;
332        end;
333 <
334 <      Stream_Body.Write(Data[0], Length(Data));
322 <      //
333 >      DatFileStream.Seek(0, soFromBeginning);
334 >      Stream_Body.CopyFrom(DatFileStream, DatFileStream.Size);
335      end
336      else
337        FilesHeader[i].DataAddr := 0;
# Line 334 | Line 346 | begin
346      FilesHeader[i].FileSize := fileinfo.Size;
347      FilesHeader[i].FileType := fileinfo.FileType;
348  
349 <    if ((i mod 10) = 0) and (i >= 100) then
349 >    if ((FileID mod 10) = 0) and (FileID >= 100) then
350        lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr(
351 <        (Time - begintime) / i * (progress.Max - i + 1) * 1.1, timeformat );
352 <    progress.Position := i + 1;
353 <    lbl_progress.Caption := 'Files done: ' + IntToStr(i + 1) + '/' + IntToStr(progress.Max);
351 >        (Time - FileTime) / FileID * (progress.Max - FileID + 1) * 1.1, TimeFormat );
352 >    progress.Position := FileID + 1;
353 >    lbl_progress.Caption := 'Files done: ' + IntToStr(FileID + 1) + '/' + IntToStr(progress.Max);
354      Application.ProcessMessages;
355    end;
356  
# Line 366 | Line 378 | begin
378    Stream_Body.Free;
379    Stream_Names.Free;
380    Stream_Raw.Free;
381 <  if OniDataConnection.OSisMac then
381 >
382 >  if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
383      Stream_Sep.Free;
384  
385    progress.Position      := progress.Max;
386    lbl_progress.Caption   := 'Files done: ' + IntToStr(progress.Max) + '/' +
387      IntToStr(progress.Max);
388 <  lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - absolutebegintime, timeformat) + ')';
388 >  lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - Begintime, TimeFormat) + ')';
389  
390    DoStep('FIN');
391    btn_abortok.Caption := '&OK';
# Line 382 | Line 395 | begin
395  
396    converting := False;
397  
398 <  CloseDataConnection(DataConnections[conIndex]);
398 > //  CloseDataConnection(DataConnections[conIndex]);
399   end;
400  
401  
# Line 392 | Line 405 | procedure TForm_LevelDB.HandleFile;
405   var
406    i: Byte;
407   begin
408 <  for i := 1 to Length(ConvertHandlers) do
408 > {  for i := 1 to Length(ConvertHandlers) do
409      if UpperCase(ConvertHandlers[i].Ext) = UpperCase(ext) then
410        if ConvertHandlers[i].needed then
411        begin
# Line 401 | Line 414 | begin
414        end
415        else
416          Break;
417 < end;
417 > }end;
418  
419  
420  
421  
422   procedure TForm_LevelDB.CreateDatabase(Source, target: String);
423 + {
424   var
425    DataBase:    TABSDatabase;
426    Query:       TABSQuery;
# Line 438 | Line 452 | const
452      else
453        group_progress.Caption := 'Creating DB (FINISHED)';
454    end;
455 + }
456  
457   begin
458 <  if CreateDataConnection(Source, ODB_Dat) = nil then
458 > {  if CreateDataConnection(Source, ODB_Dat) = nil then
459    begin
460      ShowMessage('Could not connect to .dat-file');
461      Exit;
# Line 643 | Line 658 | begin
658    database.Free;
659  
660    CloseDataConnection(DataConnections[conIndex]);
661 + }
662   end;
663  
664  
665  
666  
667 < procedure TForm_LevelDB.stop_convert;
667 > procedure TForm_LevelDB.StopConvert;
668   begin
669 <  btn_abortok.Caption := '&Close';
669 > {  btn_abortok.Caption := '&Close';
670    btn_abortok.Default := True;
671    converting := False;
672    lbl_estimation.Caption := 'ABORTED';
# Line 661 | Line 677 | begin
677    begin
678      DeleteFile(loaded_filename);
679    end;
680 < end;
680 > }end;
681  
682  
683  
# Line 684 | Line 700 | end;
700  
701  
702  
703 <
703 > {
704   procedure InsertDatLinkToDB(fileid: LongWord; offset: LongWord);
705   var
706    link: LongWord;
# Line 1716 | Line 1732 | begin
1732    begin
1733    end;
1734   end;
1735 + }
1736  
1737  
1738 <
1722 <
1738 > {
1739   procedure InsertHandler(ext: String; needed: Boolean; handler: THandler);
1740   begin
1741    SetLength(ConvertHandlers, Length(ConvertHandlers) + 1);
# Line 1727 | Line 1743 | begin
1743    ConvertHandlers[High(ConvertHandlers)].needed  := needed;
1744    ConvertHandlers[High(ConvertHandlers)].handler := handler;
1745   end;
1746 <
1746 > }
1747   begin
1748 <  InsertHandler('ABNA', False, nil);
1748 > {  InsertHandler('ABNA', False, nil);
1749    //  InsertHandler('AGDB',True,AGDB);
1750    InsertHandler('AGDB', False, nil);
1751    InsertHandler('AGQC', False, nil);
# Line 1827 | Line 1843 | begin
1843    InsertHandler('WMM_', False, nil);
1844    InsertHandler('WMMB', True, WMMB);
1845    InsertHandler('WPGE', True, WPGE);
1846 < end.
1846 > }end.

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)