--- oup/current/Helper/LevelDB.pas 2007/02/22 00:37:39 112 +++ oup/current/Helper/LevelDB.pas 2007/03/23 00:59:01 120 @@ -1,7 +1,65 @@ +{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1} +{$MINSTACKSIZE $00004000} +{$MAXSTACKSIZE $00100000} +{$IMAGEBASE $00400000} +{$APPTYPE GUI} +{$WARN SYMBOL_DEPRECATED ON} +{$WARN SYMBOL_LIBRARY ON} +{$WARN SYMBOL_PLATFORM ON} +{$WARN SYMBOL_EXPERIMENTAL ON} +{$WARN UNIT_LIBRARY ON} +{$WARN UNIT_PLATFORM ON} +{$WARN UNIT_DEPRECATED ON} +{$WARN UNIT_EXPERIMENTAL ON} +{$WARN HRESULT_COMPAT ON} +{$WARN HIDING_MEMBER ON} +{$WARN HIDDEN_VIRTUAL ON} +{$WARN GARBAGE ON} +{$WARN BOUNDS_ERROR ON} +{$WARN ZERO_NIL_COMPAT ON} +{$WARN STRING_CONST_TRUNCED ON} +{$WARN FOR_LOOP_VAR_VARPAR ON} +{$WARN TYPED_CONST_VARPAR ON} +{$WARN ASG_TO_TYPED_CONST ON} +{$WARN CASE_LABEL_RANGE ON} +{$WARN FOR_VARIABLE ON} +{$WARN CONSTRUCTING_ABSTRACT ON} +{$WARN COMPARISON_FALSE ON} +{$WARN COMPARISON_TRUE ON} +{$WARN COMPARING_SIGNED_UNSIGNED ON} +{$WARN COMBINING_SIGNED_UNSIGNED ON} +{$WARN UNSUPPORTED_CONSTRUCT ON} +{$WARN FILE_OPEN ON} +{$WARN FILE_OPEN_UNITSRC ON} +{$WARN BAD_GLOBAL_SYMBOL ON} +{$WARN DUPLICATE_CTOR_DTOR ON} +{$WARN INVALID_DIRECTIVE ON} +{$WARN PACKAGE_NO_LINK ON} +{$WARN PACKAGED_THREADVAR ON} +{$WARN IMPLICIT_IMPORT ON} +{$WARN HPPEMIT_IGNORED ON} +{$WARN NO_RETVAL ON} +{$WARN USE_BEFORE_DEF ON} +{$WARN FOR_LOOP_VAR_UNDEF ON} +{$WARN UNIT_NAME_MISMATCH ON} +{$WARN NO_CFG_FILE_FOUND ON} +{$WARN IMPLICIT_VARIANTS ON} +{$WARN UNICODE_TO_LOCALE ON} +{$WARN LOCALE_TO_UNICODE ON} +{$WARN IMAGEBASE_MULTIPLE ON} +{$WARN SUSPICIOUS_TYPECAST ON} +{$WARN PRIVATE_PROPACCESSOR ON} +{$WARN UNSAFE_TYPE OFF} +{$WARN UNSAFE_CODE OFF} +{$WARN UNSAFE_CAST OFF} +{$WARN OPTION_TRUNCATED ON} +{$WARN WIDECHAR_REDUCED ON} +{$WARN DUPLICATES_IGNORED ON} +{$WARN UNIT_INIT_SEQ ON} +{$WARN LOCAL_PINVOKE ON} +{$WARN MESSAGE_DIRECTIVE ON} unit LevelDB; - interface - uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, StrUtils; @@ -27,11 +85,9 @@ var Form_LevelDB: TForm_LevelDB; implementation - {$R *.dfm} - uses ABSMain, ABSDecUtil, Main, - ConnectionManager, TypeDefs, DataAccess, OniImgClass; + ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data; type THandler = procedure(FileID: Integer); @@ -69,14 +125,10 @@ var Stream_Body, Stream_Names: TMemoryStream; Stream_Dat, Stream_Raw, Stream_Sep: TFileStream; -// FileCount: Integer; -// temps, temps2: String; // Data, rawdata: Tdata; BeginTime, FileTime: Double; Step: Integer; // rawlist: TRawDataList; -// extlist: TExtensionsMap; -// fileinfo: TFileInfo; // datlinks: TDatLinks; OniImage: TOniImage; LevelID: Integer; @@ -86,8 +138,18 @@ var Connection: TDataAccess; ConRepMsg: TStatusMessages; + FileID: Integer; + Strings: TStrings; i, j: Integer; + temps: String; + tempi: Integer; + tempb: Byte; + FileInfo: TFileInfo; + DatLinks: TDatLinkList; + RawLinks: TRawDataList; + + DatFileStream, RawFileStream: TMemoryStream; const Steps: Byte = 3; @@ -208,13 +270,20 @@ begin end; end; - - extlist := OniDataConnection.GetExtendedExtensionsList; - for i := 0 to High(DatHeader.Ident) do - DatHeader.Ident[i] := OniDataConnection.LevelInfo.Ident[i]; - DatHeader.Files := OniDataConnection.GetFilesCount; + for i := 0 to High(DatHeader.OSIdent) do + case Connection.DataOS of + DOS_WIN: DatHeader.OSIdent[i] := HeaderOSIdentWin[i]; + DOS_MAC: DatHeader.OSIdent[i] := HeaderOSIdentMac[i]; + DOS_MACBETA: DatHeader.OSIdent[i] := HeaderOSIdentMacBeta[i]; + end; + for i := 0 to High(DatHeader.GlobalIdent) do + DatHeader.GlobalIdent[i] := HeaderGlobalIdent[i]; + DatHeader.Files := Connection.GetFileCount; DatHeader.NamedFiles := Length(NamedFilesHeader); - DatHeader.Extensions := Length(extlist); + + Strings := Connection.GetExtensionsList(EF_ExtCount); + + DatHeader.Extensions := Strings.Count; DatHeader.DataAddr := 0; DatHeader.DataSize := 0; DatHeader.NamesAddr := 0; @@ -226,25 +295,39 @@ begin DoStep('Writing extensions-header'); - progress.Max := Length(OniDataConnection.GetExtensionsList); + progress.Max := Strings.Count; Application.ProcessMessages; - - for i := 0 to High(ExtensionsHeader) do + for i := 0 to Strings.Count - 1 do begin - ExtensionsHeader[i].Ident := extlist[i].Ident; - ExtensionsHeader[i].Extension := extlist[i].Extension; - SetLength(temps, 4); + temps := Strings.Strings[i]; + ExtensionsHeader[i].ExtCount := StrToInt( MidStr( + temps, + Pos('(', temps) + 1, + Pos(')', temps) - Pos('(', temps) - 1 ) ); + temps := MidStr(temps, 1, 4); for j := 0 to 3 do - temps[j + 1] := ExtensionsHeader[i].Extension[3 - j]; - ExtensionsHeader[i].ExtCount := - Length(OniDataConnection.GetFilesList(temps, '', False, stIDAsc)); + ExtensionsHeader[i].Extension[j] := temps[4-j]; + for j := 0 to High(FileTypes) do + if FileTypes[j].Extension = temps then + Break; + if j < Length(FileTypes) then + begin + case Connection.DataOS of + DOS_WIN: ExtensionsHeader[i].Ident := FileTypes[j].IdentWin; + DOS_WINDEMO: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac; + DOS_MAC: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac; + DOS_MACBETA: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac; + end; + end else begin + ShowMessage('Unknown Extension: ' + Strings.Strings[i]); + Exit; + end; progress.Position := i + 1; lbl_progress.Caption := 'Extensions done: ' + IntToStr(i + 1) + '/' + - IntToStr(Length(extlist)); + IntToStr(Strings.Count); Application.ProcessMessages; end; - DoStep('Storing files-data'); progress.Position := 0; progress.Max := DatHeader.Files; @@ -252,29 +335,80 @@ begin lbl_estimation.Caption := 'Estimated finishing time: unknown'; Application.ProcessMessages; - begintime := Time; - for i := 0 to DatHeader.Files - 1 do + FileTime := Time; + for FileID := 0 to DatHeader.Files - 1 do begin - fileinfo := OniDataConnection.GetFileInfo(i); + FileInfo := Connection.GetFileInfo(FileID); for j := 0 to 3 do - FilesHeader[i].Extension[j] := fileinfo.Extension[4 - j]; - if fileinfo.Size > 0 then + FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j]; + if FileInfo.Size > 0 then begin - // DatLinks:=; - FilesHeader[i].DataAddr := Stream_Body.Size + 8; - Data := OniDataConnection.LoadDatFile(i); - Data[4] := (levelid) and $FF; - Data[5] := (levelid shr 8) and $FF; - Data[6] := (levelid shr 16) and $FF; - Data[7] := (levelid shr 24) and $FF; + FilesHeader[FileID].DataAddr := Stream_Body.Size + 8; + DatFileStream := TMemoryStream.Create; + Connection.LoadDatFile(FileID, TStream(DatFileStream)); + DatFileStream.Seek(4, soFromBeginning); + DatFileStream.Write(LevelID, 4); + + DatLinks := Connection.GetDatLinks(FileID); + if Length(DatLinks) > 0 then + begin + for i := 0 to High(DatLinks) do + begin + DatFileStream.Seek(DatLinks[i].SrcOffset, soFromBeginning); + if DatLinks[i].DestID < 0 then + tempi := 0 + else + tempi := DatLinks[i].DestID * 256 + 1; + DatFileStream.Write(tempi, 4); + end; + end; - if (Pos(UpperCase(fileinfo.Extension), UpperCase(raws)) mod 4) = 1 then + RawLinks := Connection.GetRawList(FileID); + if Length(RawLinks) > 0 then begin - rawlist := OniDataConnection.GetRawList(i); - if Length(rawlist) > 0 then + for i := 0 to High(RawLinks) do begin - for j := 0 to High(rawlist) do + if RawLinks[i].RawSize > 0 then begin + RawFileStream := TMemoryStream.Create; + if UpperCase(fileinfo.Extension) = 'TXMP' then + begin + DatFileStream.Seek($88, soFromBeginning); + DatFileStream.Read(tempb, 1); + if (tempb and $01) > 0 then + begin + OniImage.Load(Connection.ConnectionID, FileID); + if not OniImage.GetMipMappedImage(TStream(RawFileStream)) then + begin + ShowMessage('MipMapping-Error'); + RawFileStream.Seek(0, soFromBeginning); + tempb := tempb and $FE; + DatFileStream.Seek($88, soFromBeginning); + DatFileStream.Write(tempb, 1); + OniImage.Load(Connection.ConnectionID, FileID); + OniImage.GetAsData(TStream(RawFileStream)); + end else + begin + // Change of Depth($89), Storetype ($90) + DatFileStream.Seek($89, soFromBeginning); + DatFileStream.Read(tempb, 1); + + DatFileStream.Seek($90, soFromBeginning); + DatFileStream.Read(tempb, 1); + Exit; + end; + end else + OniImage.GetAsData(TStream(RawFileStream)); + end else begin + Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, TStream(RawFileStream)); + end; + RawFileStream.Seek(0, soFromBeginning); + end else + RawLinks[i].RawAddr := 0; + end; + end; + +{ if rawlist[j].raw_size > 0 then begin if (UpperCase(fileinfo.Extension) = 'TXMP') and @@ -285,11 +419,11 @@ begin rawlist[j].raw_size := OniImage.GetImageDataSize(True); Data[$90] := $08; Data[$89] := 32; -{ if data[$90]<>OniImage.StoreType then begin +(* if data[$90]<>OniImage.StoreType then begin data[$90]:=OniImage.StoreType; data[$89]:=(data[$89] and $CF) or $20; end; -} end +*) end else begin SetLength(rawdata, rawlist[j].raw_size); @@ -314,10 +448,7 @@ begin Data[rawlist[j].src_offset + 1] := (rawlist[j].raw_addr shr 8) and $FF; Data[rawlist[j].src_offset + 2] := (rawlist[j].raw_addr shr 16) and $FF; Data[rawlist[j].src_offset + 3] := (rawlist[j].raw_addr shr 24) and $FF; - end; - end; - end; - +} Stream_Body.Write(Data[0], Length(Data)); // end @@ -336,7 +467,7 @@ begin if ((i mod 10) = 0) and (i >= 100) then lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr( - (Time - begintime) / i * (progress.Max - i + 1) * 1.1, timeformat ); + (Time - FileTime) / i * (progress.Max - i + 1) * 1.1, TimeFormat ); progress.Position := i + 1; lbl_progress.Caption := 'Files done: ' + IntToStr(i + 1) + '/' + IntToStr(progress.Max); Application.ProcessMessages; @@ -372,7 +503,7 @@ begin progress.Position := progress.Max; lbl_progress.Caption := 'Files done: ' + IntToStr(progress.Max) + '/' + IntToStr(progress.Max); - lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - absolutebegintime, timeformat) + ')'; + lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - Begintime, TimeFormat) + ')'; DoStep('FIN'); btn_abortok.Caption := '&OK';