Index: oup/current/Helper/LevelDB.pas
===================================================================
--- oup/current/Helper/LevelDB.pas	(revision 119)
+++ oup/current/Helper/LevelDB.pas	(revision 120)
@@ -1,2 +1,62 @@
+{$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
@@ -79,8 +139,14 @@
   ConRepMsg:  TStatusMessages;
 
+  FileID:     Integer;
+
   Strings:    TStrings;
   i, j:       Integer;
   temps:      String;
+  tempi:      Integer;
+  tempb:      Byte;
   FileInfo:   TFileInfo;
+  DatLinks:   TDatLinkList;
+  RawLinks:   TRawDataList;
 
   DatFileStream, RawFileStream: TMemoryStream;
@@ -271,25 +337,77 @@
 
   FileTime := Time;
-  for i := 0 to DatHeader.Files - 1 do
-  begin
-    FileInfo := Connection.GetFileInfo(i);
+  for FileID := 0 to DatHeader.Files - 1 do
+  begin
+    FileInfo := Connection.GetFileInfo(FileID);
     for j := 0 to 3 do
-      FilesHeader[i].Extension[j] := FileInfo.Extension[4 - j];
+      FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j];
     if FileInfo.Size > 0 then
     begin
-      //        DatLinks:=;
-      FilesHeader[i].DataAddr := Stream_Body.Size + 8;
+      FilesHeader[FileID].DataAddr := Stream_Body.Size + 8;
       DatFileStream := TMemoryStream.Create;
-      Connection.LoadDatFile(i, DatFileStream);
+      Connection.LoadDatFile(FileID, TStream(DatFileStream));
       DatFileStream.Seek(4, soFromBeginning);
       DatFileStream.Write(LevelID, 4);
 
-      if (Pos(UpperCase(fileinfo.Extension), UpperCase(raws)) mod 4) = 1 then
+      DatLinks := Connection.GetDatLinks(FileID);
+      if Length(DatLinks) > 0 then
       begin
-        rawlist := OniDataConnection.GetRawList(i);
-        if Length(rawlist) > 0 then
+        for i := 0 to High(DatLinks) do
         begin
-          for j := 0 to High(rawlist) do
+          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;
+
+      RawLinks := Connection.GetRawList(FileID);
+      if Length(RawLinks) > 0 then
+      begin
+        for i := 0 to High(RawLinks) do
+        begin
+          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
@@ -302,9 +420,9 @@
                 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
@@ -331,8 +449,5 @@
             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));
       //
