Index: oup/current/Code/DataStructures.pas
===================================================================
--- oup/current/Code/DataStructures.pas	(revision 86)
+++ oup/current/Code/DataStructures.pas	(revision 87)
@@ -3,5 +3,5 @@
 interface
 
-uses SysUtils, Classes, Data, Dialogs, StrUtils;
+uses SysUtils, Classes, Data, Dialogs, StrUtils, OniDataClass;
 
 type
@@ -34,5 +34,5 @@
     Subs:   array of TStructDefSub;
   end;
-  THandler = function(fileid: LongWord): TRawList;
+  THandler = function(connection: TOniData; fileid: LongWord): TRawList;
 
   TRawListHandlers = record
@@ -47,5 +47,5 @@
 
 
-function LoadStructureDefinition(fileid: LongWord): TStructDef;
+function LoadStructureDefinition(connection: TOniData; fileid: LongWord): TStructDef;
 function GetDataType(typeid: Word): String;
 function GetTypeDataLength(datatype: Word): Word;
@@ -53,5 +53,5 @@
 implementation
 
-uses Functions, OniDataClass, Forms, Template;
+uses Functions, Forms, Template;
 
 
@@ -120,5 +120,5 @@
 
 
-function AGDB(fileid: LongWord): TRawList;
+function AGDB(connection: TOniData; fileid: LongWord): TRawList;
 var
   link:  LongWord;
@@ -126,7 +126,7 @@
   i:     LongWord;
 begin
-  if not OniDataConnection.OSisMac then
-  begin
-    OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
+  if not connection.OSisMac then
+  begin
+    connection.LoadDatFilePart(fileid, $1C, 4, @links);
     links := links * 2;
     SetLength(Result, links);
@@ -134,5 +134,5 @@
     begin
       Result[i].src_offset := $20 + i * 4;
-      OniDataConnection.LoadDatFilePart(fileid, $20 + i * 4, 4, @link);
+      connection.LoadDatFilePart(fileid, $20 + i * 4, 4, @link);
       Result[i].raw_addr := link;
       Result[i].raw_size := 0{????????????????????????????????};
@@ -145,5 +145,5 @@
 
 
-function AKVA(fileid: LongWord): TRawList;
+function AKVA(connection: TOniData; fileid: LongWord): TRawList;
 var
   link:  LongWord;
@@ -151,14 +151,14 @@
   i:     LongWord;
 begin
-  if not OniDataConnection.OSisMac then
-  begin
-    OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
+  if not connection.OSisMac then
+  begin
+    connection.LoadDatFilePart(fileid, $1C, 4, @links);
     SetLength(Result, links);
     for i := 0 to links - 1 do
     begin
       Result[i].src_offset := $20 + i * $74 + $24;
-      OniDataConnection.LoadDatFilePart(fileid, $20 + i * $74 + $24, 4, @link);
+      connection.LoadDatFilePart(fileid, $20 + i * $74 + $24, 4, @link);
       Result[i].raw_addr := link;
-      OniDataConnection.LoadDatFilePart(fileid, $20 + i * $74 + $28, 4, @link);
+      connection.LoadDatFilePart(fileid, $20 + i * $74 + $28, 4, @link);
       Result[i].raw_size := link;
       Result[i].loc_sep  := False;
@@ -170,11 +170,28 @@
 
 
-function BINA(fileid: LongWord): TRawList;
+function BINA(connection: TOniData; fileid: LongWord): TRawList;
 var
   link:     LongWord;
   datasize: LongWord;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $0C, 4, @link);
-  OniDataConnection.LoadDatFilePart(fileid, $08, 4, @datasize);
+  connection.LoadDatFilePart(fileid, $0C, 4, @link);
+  connection.LoadDatFilePart(fileid, $08, 4, @datasize);
+  SetLength(Result, 1);
+  Result[0].src_offset := $0C;
+  Result[0].raw_addr   := link;
+  Result[0].raw_size   := datasize;
+  Result[0].loc_sep    := connection.OSisMac;
+end;
+
+
+
+
+function OSBD(connection: TOniData; fileid: LongWord): TRawList;
+var
+  link:     LongWord;
+  datasize: LongWord;
+begin
+  connection.LoadDatFilePart(fileid, $08, 4, @datasize);
+  connection.LoadDatFilePart(fileid, $0C, 4, @link);
   SetLength(Result, 1);
   Result[0].src_offset := $0C;
@@ -187,37 +204,20 @@
 
 
-function OSBD(fileid: LongWord): TRawList;
+function SNDD(connection: TOniData; fileid: LongWord): TRawList;
 var
   link:     LongWord;
   datasize: LongWord;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $08, 4, @datasize);
-  OniDataConnection.LoadDatFilePart(fileid, $0C, 4, @link);
   SetLength(Result, 1);
-  Result[0].src_offset := $0C;
-  Result[0].raw_addr   := link;
-  Result[0].raw_size   := datasize;
-  Result[0].loc_sep    := OniDataConnection.OSisMac;
-end;
-
-
-
-
-function SNDD(fileid: LongWord): TRawList;
-var
-  link:     LongWord;
-  datasize: LongWord;
-begin
-  SetLength(Result, 1);
-  if not OniDataConnection.OSisMac then
-  begin
-    OniDataConnection.LoadDatFilePart(fileid, $40, 4, @datasize);
-    OniDataConnection.LoadDatFilePart(fileid, $44, 4, @link);
+  if not connection.OSisMac then
+  begin
+    connection.LoadDatFilePart(fileid, $40, 4, @datasize);
+    connection.LoadDatFilePart(fileid, $44, 4, @link);
     Result[0].src_offset := $44;
   end
   else
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $10, 4, @datasize);
-    OniDataConnection.LoadDatFilePart(fileid, $14, 4, @link);
+    connection.LoadDatFilePart(fileid, $10, 4, @datasize);
+    connection.LoadDatFilePart(fileid, $14, 4, @link);
     Result[0].src_offset := $14;
   end;
@@ -230,5 +230,5 @@
 
 
-function SUBT(fileid: LongWord): TRawList;
+function SUBT(connection: TOniData; fileid: LongWord): TRawList;
 var
   baselink, lastlink: LongWord;
@@ -237,11 +237,11 @@
   Data:  Tdata;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $18, 4, @baselink);
-  OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @links);
+  connection.LoadDatFilePart(fileid, $18, 4, @baselink);
+  connection.LoadDatFilePart(fileid, $1C, 4, @links);
   if links > 0 then
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $20 + (links - 1) * 4, 4, @lastlink);
+    connection.LoadDatFilePart(fileid, $20 + (links - 1) * 4, 4, @lastlink);
     SetLength(Data, lastlink + 1024);
-    TOniDataDat(OniDataConnection).LoadRawOffset(False,
+    TOniDataDat(connection).LoadRawOffset(False,
       baselink, lastlink + 1024, Data);
     //      OniDataConnection.LoadRawFile(fileid,$1C,baselink,lastlink+1024,False,@data[0]);
@@ -274,5 +274,5 @@
 
 
-function TRAM(fileid: LongWord): TRawList;
+function TRAM(connection: TOniData; fileid: LongWord): TRawList;
 var
   i:      Integer;
@@ -287,41 +287,41 @@
 begin
   SetLength(Result, 13);
-  OniDataConnection.LoadDatFilePart(fileid, $16C, 2, @frames);
+  connection.LoadDatFilePart(fileid, $16C, 2, @frames);
   {y-pos}
-  OniDataConnection.LoadDatFilePart(fileid, $0C, 4, @link);
+  connection.LoadDatFilePart(fileid, $0C, 4, @link);
   Result[0].src_offset := $0C;
   Result[0].raw_addr   := link;
   Result[0].raw_size   := frames * 4;
   {x-z-pos}
-  OniDataConnection.LoadDatFilePart(fileid, $10, 4, @link);
+  connection.LoadDatFilePart(fileid, $10, 4, @link);
   Result[1].src_offset := $10;
   Result[1].raw_addr   := link;
   Result[1].raw_size   := frames * 8;
   {attacks}
-  OniDataConnection.LoadDatFilePart(fileid, $182, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $14, 4, @link);
+  connection.LoadDatFilePart(fileid, $182, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $14, 4, @link);
   Result[2].src_offset := $14;
   Result[2].raw_addr   := link;
   Result[2].raw_size   := tempb * 32;
   {damage}
-  OniDataConnection.LoadDatFilePart(fileid, $183, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $18, 4, @link);
+  connection.LoadDatFilePart(fileid, $183, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $18, 4, @link);
   Result[3].src_offset := $18;
   Result[3].raw_addr   := link;
   Result[3].raw_size   := tempb * 8;
   {motionblur}
-  OniDataConnection.LoadDatFilePart(fileid, $184, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $1C, 4, @link);
+  connection.LoadDatFilePart(fileid, $184, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $1C, 4, @link);
   Result[4].src_offset := $1C;
   Result[4].raw_addr   := link;
   Result[4].raw_size   := tempb * 8;
   {shortcut}
-  OniDataConnection.LoadDatFilePart(fileid, $185, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $20, 4, @link);
+  connection.LoadDatFilePart(fileid, $185, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $20, 4, @link);
   Result[5].src_offset := $20;
   Result[5].raw_addr   := link;
   Result[5].raw_size   := tempb * 8;
   {throw}
-  OniDataConnection.LoadDatFilePart(fileid, $24, 4, @link);
+  connection.LoadDatFilePart(fileid, $24, 4, @link);
   Result[6].src_offset := $24;
   Result[6].raw_addr   := link;
@@ -331,41 +331,41 @@
     Result[6].raw_size := 0;
   {footstep}
-  OniDataConnection.LoadDatFilePart(fileid, $186, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $28, 4, @link);
+  connection.LoadDatFilePart(fileid, $186, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $28, 4, @link);
   Result[7].src_offset := $28;
   Result[7].raw_addr   := link;
   Result[7].raw_size   := tempb * 4;
   {particle}
-  OniDataConnection.LoadDatFilePart(fileid, $187, 1, @tempb);
-  OniDataConnection.LoadDatFilePart(fileid, $2C, 4, @link);
+  connection.LoadDatFilePart(fileid, $187, 1, @tempb);
+  connection.LoadDatFilePart(fileid, $2C, 4, @link);
   Result[8].src_offset := $2C;
   Result[8].raw_addr   := link;
   Result[8].raw_size   := tempb * 24;
   {position}
-  OniDataConnection.LoadDatFilePart(fileid, $30, 4, @link);
+  connection.LoadDatFilePart(fileid, $30, 4, @link);
   Result[9].src_offset := $30;
   Result[9].raw_addr   := link;
   Result[9].raw_size   := frames * 8;
   {particle}
-  OniDataConnection.LoadDatFilePart(fileid, $154, 2, @tempw);
-  OniDataConnection.LoadDatFilePart(fileid, $38, 4, @link);
+  connection.LoadDatFilePart(fileid, $154, 2, @tempw);
+  connection.LoadDatFilePart(fileid, $38, 4, @link);
   Result[11].src_offset := $38;
   Result[11].raw_addr   := link;
   Result[11].raw_size   := tempw * 34;
   {extent}
-  OniDataConnection.LoadDatFilePart(fileid, $138, 4, @templ);
-  OniDataConnection.LoadDatFilePart(fileid, $13C, 4, @link);
+  connection.LoadDatFilePart(fileid, $138, 4, @templ);
+  connection.LoadDatFilePart(fileid, $13C, 4, @link);
   Result[12].src_offset := $13C;
   Result[12].raw_addr   := link;
   Result[12].raw_size   := templ * 12;
 
-  OniDataConnection.LoadDatFilePart(fileid, $34, 4, @link);
+  connection.LoadDatFilePart(fileid, $34, 4, @link);
   if link > 0 then
   begin
-    OniDataConnection.LoadDatFilePart(fileid, $160, 2, @tempw);
+    connection.LoadDatFilePart(fileid, $160, 2, @tempw);
     frame_count := 0;
     i := 0;
     SetLength(Data, $FFFF);
-    TOniDataDat(OniDataConnection).LoadRawOffset(False, link, $FFFF, Data);
+    TOniDataDat(connection).LoadRawOffset(False, link, $FFFF, Data);
     offset := Data[$24] + Data[$25] * 256;
     while (offset + i < Length(Data)) and (frame_count < frames - 1) do
@@ -392,5 +392,5 @@
 
 
-function TXMP(fileid: LongWord): TRawList;
+function TXMP(connection: TOniData; fileid: LongWord): TRawList;
 var
   link_pc:   LongWord;
@@ -400,9 +400,9 @@
   datasize:  LongWord;
 begin
-  OniDataConnection.LoadDatFilePart(fileid, $8C, SizeOf(x), @x);
-  OniDataConnection.LoadDatFilePart(fileid, $8E, SizeOf(y), @y);
-  OniDataConnection.LoadDatFilePart(fileid, $90, SizeOf(storetype), @storetype);
-  OniDataConnection.LoadDatFilePart(fileid, $9C, 4, @link_pc);
-  OniDataConnection.LoadDatFilePart(fileid, $A0, 4, @link_mac);
+  connection.LoadDatFilePart(fileid, $8C, SizeOf(x), @x);
+  connection.LoadDatFilePart(fileid, $8E, SizeOf(y), @y);
+  connection.LoadDatFilePart(fileid, $90, SizeOf(storetype), @storetype);
+  connection.LoadDatFilePart(fileid, $9C, 4, @link_pc);
+  connection.LoadDatFilePart(fileid, $A0, 4, @link_mac);
   case storetype of
     0, 1, 2:
@@ -414,5 +414,5 @@
   end;
   SetLength(Result, 1);
-  if not OniDataConnection.OSisMac then
+  if not connection.OSisMac then
   begin
     Result[0].src_offset := $9C;
@@ -425,5 +425,5 @@
   end;
   Result[0].raw_size := datasize;
-  Result[0].loc_sep  := OniDataConnection.OSisMac;
+  Result[0].loc_sep  := connection.OSisMac;
 end;
 
@@ -444,5 +444,5 @@
 
 
-function LoadStructureDefinition(fileid: LongWord): TStructDef;
+function LoadStructureDefinition(connection: TOniData; fileid: LongWord): TStructDef;
 var
   i:      LongWord;
@@ -461,9 +461,9 @@
   SetLength(Result.Subs, 0);
   Result.Data := False;
-  ext      := OniDataConnection.GetFileInfo(fileid).Extension;
+  ext      := connection.GetFileInfo(fileid).Extension;
   filename := ExtractFilePath(Application.ExeName) + '\StructDefs\' + ext + '.txt';
   if FileExists(filename) then
   begin
-    Data := OniDataConnection.LoadDatFile(fileid);
+    Data := connection.LoadDatFile(fileid);
     AssignFile(deffile, filename);
     Reset(deffile);
Index: oup/current/Code/OniDataClass.pas
===================================================================
--- oup/current/Code/OniDataClass.pas	(revision 86)
+++ oup/current/Code/OniDataClass.pas	(revision 87)
@@ -1,5 +1,5 @@
 unit OniDataClass;
 interface
-uses Data, DataStructures, Classes, SysUtils, StrUtils,
+uses Data, Classes, SysUtils, StrUtils,
   Dialogs, ABSDecUtil, ABSMain, DB, Windows;
 
@@ -21,5 +21,5 @@
     procedure Close; virtual; abstract;
 
-    function GetFileInfo(fileid: LongWord): TFileInfo; virtual; abstract;
+    function GetFileInfo(fileid: Integer): TFileInfo; virtual;
     function GetFilesList(ext: String; pattern: String;
       NoEmptyFiles: Boolean; sort: TSortType): TStringArray; virtual; abstract;
@@ -73,5 +73,5 @@
     procedure Close; override;
 
-    function GetFileInfo(fileid: LongWord): TFileInfo; override;
+    function GetFileInfo(fileid: Integer): TFileInfo; override;
     function GetFilesList(ext: String; pattern: String;
       NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override;
@@ -112,5 +112,5 @@
     procedure UpdateListCache;
     //      function GetDatLinks(srcid:LongWord):TDatLinks;
-    function GetFileInfo(fileid: LongWord): TFileInfo; override;
+    function GetFileInfo(fileid: Integer): TFileInfo; override;
     function GetFilesList(ext: String; pattern: String;
       NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override;
@@ -142,29 +142,5 @@
     constructor Create(OLDBFilename: String; var Result: Boolean); override;
     procedure Close; override;
-{
-    procedure UpdateListCache;
-    //      function GetDatLinks(srcid:LongWord):TDatLinks;
-    function GetFileInfo(fileid: LongWord): TFileInfo; override;
-    function GetFilesList(ext: String; pattern: String;
-      NoEmptyFiles: Boolean; sort: TSortType): TStringArray; override;
-    function GetFilesCount: LongWord; override;
-    function GetExtensionsList: TStringArray; override;
-    function GetExtendedExtensionsList: TExtensionsMap; override;
-    function GetNamedFilesMap: TNamedFilesMap;
-
-    function LoadDatFile(fileid: LongWord): Tdata; override;
-    procedure UpdateDatFile(fileid: LongWord; Data: Tdata); override;
-    procedure LoadDatFilePart(fileid, offset, size: LongWord; target: Pointer); override;
-    procedure UpdateDatFilePart(fileid, offset, size: LongWord; target: Pointer); override;
-
-    function GetRawList(fileid: LongWord): TRawList; override;
-    procedure LoadRawFile(fileid, dat_offset: LongWord; target: Pointer); override;
-    procedure UpdateRawFile(fileid, dat_offset: LongWord; size: LongWord;
-      target: Pointer); override;
-    procedure LoadRawFilePart(fileid, dat_offset: LongWord;
-      offset, size: LongWord; target: Pointer); override;
-    procedure UpdateRawFilePart(fileid, dat_offset: LongWord;
-      offset, size: LongWord; target: Pointer); override;
-}  published
+  published
   end;
 
@@ -181,4 +157,5 @@
 function CreateDataConnection(filename: String; backend: Integer): TOniData;
 procedure CloseDataConnection(connection: TOniData);
+function GetEmptyFileInfo: TFileInfo;
 
 
@@ -187,5 +164,5 @@
 
 implementation
-uses Functions;
+uses DataStructures, Functions;
 
 
@@ -252,4 +229,16 @@
 
 
+function TOniData.GetFileInfo(fileid: Integer): TFileInfo;
+begin
+  Result.ID := -1;
+  Result.FileName := '';
+  Result.FileNameHex := '';
+  Result.Extension := '';
+  Result.Name := '';
+  Result.Size := 0;
+  Result.FileType := 0;
+  Result.DatAddr := 0;
+  Result.opened := False;
+end;
 
 
@@ -378,6 +367,11 @@
 
 
-function TOniDataDat.GetFileInfo(fileid: LongWord): TFileInfo;
-begin
+function TOniDataDat.GetFileInfo(fileid: Integer): TFileInfo;
+begin
+  if fileid = -1 then
+  begin
+    Result := inherited GetFileInfo(fileid);
+    Exit;
+  end;
   if fileid < Self.GetFilesCount then
     Result    := Fdat_files[fileid]
@@ -592,5 +586,5 @@
       if RawListHandlers[i].needed then
       begin
-        Result := RawListHandlers[i].Handler(fileid);
+        Result := RawListHandlers[i].Handler(Self, fileid);
         Break;
       end
@@ -961,8 +955,13 @@
 
 
-function TOniDataADB.GetFileInfo(fileid: LongWord): TFileInfo;
+function TOniDataADB.GetFileInfo(fileid: Integer): TFileInfo;
 var
   i: Integer;
 begin
+  if fileid = -1 then
+  begin
+    Result := inherited GetFileInfo(fileid);
+    Exit;
+  end;
   if fileid < Self.GetFilesCount then
   begin
@@ -1484,5 +1483,5 @@
         begin
           DataConnections[i].Close;
-          DataConnections[i].Free;
+//          DataConnections[i].Free;
           DataConnections[i] := nil;
           found := True;
@@ -1500,4 +1499,18 @@
 
 
+function GetEmptyFileInfo: TFileInfo;
+begin
+  Result.ID := -1;
+  Result.FileName := '';
+  Result.FileNameHex := '';
+  Result.Extension := '';
+  Result.Name := '';
+  Result.Size := 0;
+  Result.FileType := 0;
+  Result.DatAddr := 0;
+  Result.opened := False;
+end;
+
+
 
 
