Index: /oup/current/DataAccess/Access_OUP_ADB.pas
===================================================================
--- /oup/current/DataAccess/Access_OUP_ADB.pas	(revision 240)
+++ /oup/current/DataAccess/Access_OUP_ADB.pas	(revision 241)
@@ -35,4 +35,5 @@
     function GetRawList(FileID: Integer): TRawDataList; override;
     function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override;
+    function GetRawsForType(RawType: String): TRawDataList; override;
 
     procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override;
@@ -268,4 +269,6 @@
   else
     list.Sorted := True;
+  if ext = '*' then
+    ext := '';
   for i := 0 to GetFileCount - 1 do
   begin
@@ -490,5 +493,5 @@
 begin
   SetLength(Result, 0);
-  FQuery.SQL.Text := 'SELECT [src_link_offset],[size],[sep] FROM rawmap WHERE [src_id]=' +
+  FQuery.SQL.Text := 'SELECT [src_link_offset],[name],[size],[sep],[type] FROM rawmap WHERE [src_id]=' +
     IntToStr(fileid) + ' ORDER BY src_link_offset ASC;';
   FQuery.Open;
@@ -499,4 +502,5 @@
     i := 0;
     repeat
+      Result[i].Name      := FQuery.FieldByName('name').AsString;
       Result[i].SrcID     := fileid;
       Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger;
@@ -504,4 +508,5 @@
       Result[i].RawSize   := FQuery.FieldByName('size').AsInteger;
       Result[i].LocSep    := FQuery.FieldByName('sep').AsBoolean;
+      Result[i].RawType   := FQuery.FieldByName('type').AsString;
       Inc(i);
       FQuery.Next;
@@ -526,11 +531,44 @@
       Result := rawlist[i]
     else begin
+      Result.Name      := '';
       Result.SrcID     := -1;
       Result.SrcOffset := -1;
       Result.RawAddr   := -1;
       Result.RawSize   := -1;
-    end;
-  end;
-end;
+      Result.RawType   := '';
+    end;
+  end;
+end;
+
+
+function TAccess_OUP_ADB.GetRawsForType(RawType: String): TRawDataList;
+var
+  i: Integer;
+  rawlist: TRawDataList;
+begin
+  SetLength(Result, 0);
+  FQuery.SQL.Text := 'SELECT [src_id],[src_link_offset],[name],[size],[sep] FROM rawmap ' +
+    'WHERE [type]="' + RawType + '" ORDER BY src_id ASC, src_link_offset ASC;';
+  FQuery.Open;
+  if FQuery.RecordCount > 0 then
+  begin
+    FQuery.First;
+    SetLength(Result, FQuery.RecordCount);
+    i := 0;
+    repeat
+      Result[i].Name      := FQuery.FieldByName('name').AsString;
+      Result[i].SrcID     := FQuery.FieldByName('src_id').AsInteger;
+      Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger;
+      Result[i].RawAddr   := 0;
+      Result[i].RawSize   := FQuery.FieldByName('size').AsInteger;
+      Result[i].LocSep    := FQuery.FieldByName('sep').AsBoolean;
+      Result[i].RawType   := RawType;
+      Inc(i);
+      FQuery.Next;
+    until FQuery.EOF;
+  end;
+  FQuery.Close;
+end;
+
 
 
Index: /oup/current/DataAccess/Access_OniArchive.pas
===================================================================
--- /oup/current/DataAccess/Access_OniArchive.pas	(revision 240)
+++ /oup/current/DataAccess/Access_OniArchive.pas	(revision 241)
@@ -39,4 +39,5 @@
     function GetRawList(FileID: Integer): TRawDataList; override;
     function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override;
+    function GetRawsForType(RawType: String): TRawDataList; override;
 
     procedure LoadRawOffset(LocSep: Boolean; RawAddr, Size: Integer; var target: TStream); overload;
@@ -285,4 +286,6 @@
   list := TStringList.Create;
   list.Sorted := True;
+  if ext = '*' then
+    ext := '';
   for i := 0 to GetFileCount - 1 do
   begin
@@ -489,4 +492,27 @@
 begin
   Result := RawLists.GetRawList(FConnectionID, FileID);
+end;
+
+
+function TAccess_OniArchive.GetRawsForType(RawType: String): TRawDataList;
+var
+  i, j: Integer;
+  dats: TStrings;
+  list: TRawDataList;
+begin
+  dats := nil;
+  dats := GetFilesList(MidStr(RawType, 1, 4), '', True, ST_IDAsc);
+  for i := 0 to dats.Count - 1 do
+  begin
+    list := GetRawList(StrToInt(MidStr(dats.Strings[i], 1, 5)));
+    for j := 0 to Length(list) - 1 do
+    begin
+      if list[j].RawType = RawType then
+      begin
+        SetLength(Result, Length(Result)+1);
+        Result[High(Result)] := list[j];
+      end;
+    end;
+  end;
 end;
 
Index: /oup/current/DataAccess/DataAccess.pas
===================================================================
--- /oup/current/DataAccess/DataAccess.pas	(revision 240)
+++ /oup/current/DataAccess/DataAccess.pas	(revision 241)
@@ -50,4 +50,5 @@
     function GetRawList(FileID: Integer): TRawDataList; virtual; abstract;
     function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; virtual; abstract;
+    function GetRawsForType(RawType: String): TRawDataList; virtual; abstract;
 
     procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; virtual; abstract;
Index: /oup/current/FileClasses/AKVA.pas
===================================================================
--- /oup/current/FileClasses/AKVA.pas	(revision 240)
+++ /oup/current/FileClasses/AKVA.pas	(revision 241)
@@ -41,5 +41,5 @@
         AddField(TInt, 'X-tiles', 'size of pathfinding grid', [4]);
         AddField(TInt, 'Z-tiles', 'size of pathfinding grid', [4]);
-        AddField(TRawLink, 'RAW offset', 'offset of grid data', []);
+        AddField(TRawLink, 'RAW offset', 'offset of grid data', ['AKVA']);
         AddField(TInt, 'RAW size', 'size of grid data', [4]);
         AddField(TFloat, 'Tile size', 'usually 4 world units', []);
Index: /oup/current/FileClasses/SUBT.pas
===================================================================
--- /oup/current/FileClasses/SUBT.pas	(revision 240)
+++ /oup/current/FileClasses/SUBT.pas	(revision 241)
@@ -35,5 +35,5 @@
     AddField(TUnused, 'Unused data', '', [16]);
 
-    AddField(TRawLink, 'Raw Address', '', []);
+    AddField(TRawLink, 'Raw Address', '', ['SUBT']);
 
     with TArray(AddField(TArray, 'SUBT offsets array', '', [4])) do
Index: /oup/current/FileClasses/TXAN.pas
===================================================================
--- /oup/current/FileClasses/TXAN.pas	(revision 240)
+++ /oup/current/FileClasses/TXAN.pas	(revision 241)
@@ -36,5 +36,5 @@
     with TArray(AddField(TArray, 'AnimTextures array', '', [4])) do
     begin
-      AddField(TLinkByID, 'Texture', '', ['*']);
+      AddField(TLinkByID, 'Texture', '', ['TXMP']);
       SetCount;
     end;
Index: /oup/current/FileClasses/TXMP.pas
===================================================================
--- /oup/current/FileClasses/TXMP.pas	(revision 240)
+++ /oup/current/FileClasses/TXMP.pas	(revision 241)
@@ -53,8 +53,8 @@
     AddField(TInt, 'Height', '', [2]);
     AddField(TInt, 'StoreType', '', [4]);
-    AddField(TLinkByID, 'TXAN', '', ['*']);
+    AddField(TLinkByID, 'TXAN', '', ['TXAN']);
     AddField(TLinkByID, 'TXMP', '', ['TXMP']);
-    AddField(TRawLink, 'RawLink', '', []);
-    AddField(TRawLink, 'SepLink', '', []);
+    AddField(TRawLink, 'RawLink', '', ['TXMP']);
+    AddField(TRawLink, 'SepLink', '', ['TXMP']);
     AddField(TUnused, 'Unused', '', [$1C]);
   end;
Index: /oup/current/FileClasses/_DataTypes.pas
===================================================================
--- /oup/current/FileClasses/_DataTypes.pas	(revision 240)
+++ /oup/current/FileClasses/_DataTypes.pas	(revision 241)
@@ -10,10 +10,8 @@
   
   TDataField = class(TTreeElement)
-      function GetChildCount: Integer; override;
-      function GetChild(ID: Integer): TTreeElement; override;
-      function GetCaption: String; override;
     protected
       FOffset: Integer;
       FName:   String;
+      FType:   String;
       FDescription: String;
       FDataLength: Integer;
@@ -22,4 +20,8 @@
       FChanged: Boolean;
       FExtraArgs: array of TVarRec;
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
+      function GetCaption: String; override;
+      function GetType: String; override;
       function GetValueAsString: String; virtual;
     public
@@ -47,5 +49,5 @@
 
   TBlock = class(TContainer)
-    private
+    protected
       FDataFields: array of TDataField;
       function GetChildCount: Integer; override;
@@ -67,5 +69,5 @@
 
   TInt = class(TDataField)
-    private
+    protected
       FInt: Integer;
       function GetValueAsString: String; override;
@@ -80,5 +82,5 @@
 
   TFloat = class(TDataField)
-    private
+    protected
       FFloat: Single;
       function GetValueAsString: String; override;
@@ -93,5 +95,5 @@
 
   TBitSet = class(TDataField)
-    private
+    protected
       FBits: Byte;
       FNames: TStringList;
@@ -107,5 +109,5 @@
 
   TLevelID = class(TDataField)
-    private
+    protected
       FLevelID: Integer;
       function GetValueAsString: String; override;
@@ -120,5 +122,5 @@
 
   TFileID = class(TDataField)
-    private
+    protected
       FFileID: Integer;
       function GetValueAsString: String; override;
@@ -133,7 +135,9 @@
 
   TDatLink = class(TDataField)
-    private
+    protected
+      FPosExts: String;
       function GetTarget: TObject; virtual; abstract;
     public
+      property PosExts: String read FPosExts;
       property TargetFile: TObject read GetTarget;
   end;
@@ -141,9 +145,8 @@
 
   TLinkByID = class(TDatLink)
+    protected
+      FFileID: Integer;
       function GetChildCount: Integer; override;
       function GetChild(ID: Integer): TTreeElement; override;
-    private
-      FFileID: Integer;
-      FPosExts: String;
       function GetValueAsString: String; override;
       function GetTarget: TObject; override;
@@ -158,5 +161,5 @@
 
   TString = class(TDataField)
-    private
+    protected
       FString: String;
       function GetValueAsString: String; override;
@@ -171,5 +174,5 @@
 
   TArray = class(TContainer)
-    private
+    protected
       FDataFields: array of TBlock;
       FTemplate: TBlock;
@@ -197,18 +200,22 @@
 
   TRawLink = class(TDataField)
-    private
+    protected
       FRawAddress: Integer;
+      FRawType:    String;
+      FSep:        Boolean;
       function GetValueAsString: String; override;
     public
-      // ExtraArgs: keine
-      constructor Create(ParentFile: TObject; ParentBlock: TContainer;
-          Name, Description: String; ExtraArgs: array of const); override;
-      procedure Update(Offset, Length: Integer); override;
-      procedure WriteData(stream: TStream); override;
+      // ExtraArgs: String: RawType; Bool: Sep
+      constructor Create(ParentFile: TObject; ParentBlock: TContainer;
+          Name, Description: String; ExtraArgs: array of const); override;
+      procedure Update(Offset, Length: Integer); override;
+      procedure WriteData(stream: TStream); override;
+
+      property RawType: String read FRawType;
   end;
 
 
   TUnused = class(TDataField)
-    private
+    protected
       function GetValueAsString: String; override;
     public
@@ -268,4 +275,9 @@
 end;
 
+function TDataField.GetType: String;
+begin
+  Result := FType;
+end;
+
 function TDataField.GetValueAsString: String;
 begin
@@ -280,4 +292,5 @@
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
   FDataLength := ExtraArgs[0].VInteger;
+  FType := 'String[' + IntToStr(FDataLength) + ']';
 end;
 
@@ -325,4 +338,5 @@
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
   FDataLength := ExtraArgs[0].VInteger;
+  FType := 'Int' + IntToStr(FDataLength * 8);
   FInt := 0;
 end;
@@ -364,4 +378,5 @@
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
   FCounterSize := ExtraArgs[0].VInteger;
+  FType := '';
   if Length(ExtraArgs) = 2 then
     FBlockCount := ExtraArgs[1].VInteger
@@ -521,4 +536,5 @@
 begin
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
+  FType := '';
 end;
 
@@ -593,4 +609,5 @@
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
   FDataLength := 4;
+  FType := 'LevelID';
   FLevelID := 0;
 end;
@@ -628,4 +645,5 @@
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
   FDataLength := 4;
+  FType := 'FileID';
   FFileID := -1;
 end;
@@ -673,4 +691,5 @@
     vtAnsiString: FPosExts := String(ExtraArgs[0].VAnsiString);
   end;
+  FType := 'LinkByID(' + FPosExts + ')';
   FFileID := -1;
 end;
@@ -740,4 +759,11 @@
 begin
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
+  case ExtraArgs[0].VType of
+    vtChar: FRawType := ExtraArgs[0].VChar;
+    vtAnsiString: FRawType := String(ExtraArgs[0].VAnsiString);
+  end;
+  if Length(ExtraArgs) > 1 then
+    FSep := ExtraArgs[1].VBoolean;
+  FType := 'RawLink(' + FRawType + ')';
   FDataLength := 4;
 end;
@@ -774,4 +800,5 @@
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
   FDataLength := ExtraArgs[0].VInteger;
+  FType := 'Unused';
 end;
 
@@ -813,4 +840,5 @@
     end;
   FDataLength := 1;
+  FType := 'BitSet';
   FBits := 0;
 end;
@@ -854,4 +882,5 @@
   inherited Create(ParentFile, ParentBlock, Name, Description, ExtraArgs);
   FDataLength := 4;
+  FType := 'Float';
   FFloat := 0;
 end;
Index: /oup/current/FileClasses/_Extensions.pas
===================================================================
--- /oup/current/FileClasses/_Extensions.pas	(revision 240)
+++ /oup/current/FileClasses/_Extensions.pas	(revision 241)
@@ -8,7 +8,9 @@
 type
   TExtension = class(TTreeElement)
+    protected
       function GetChildCount: Integer; override;
       function GetChild(ID: Integer): TTreeElement; override;
       function GetCaption: String; override;
+      function GetType: String; override;
     private
       FExt: String;
@@ -64,4 +66,9 @@
 begin
   Result := Length(FFiles);
+end;
+
+function TExtension.GetType: String;
+begin
+  Result := '';
 end;
 
Index: /oup/current/FileClasses/_FileTypes.pas
===================================================================
--- /oup/current/FileClasses/_FileTypes.pas	(revision 240)
+++ /oup/current/FileClasses/_FileTypes.pas	(revision 241)
@@ -9,7 +9,4 @@
 type
   TFile = class(TTreeElement)
-      function GetChildCount: Integer; override;
-      function GetChild(ID: Integer): TTreeElement; override;
-      function GetCaption: String; override;
     protected
       FFileInfo: TFileInfo;
@@ -25,4 +22,8 @@
       FOpened: Boolean;
 
+      function GetChildCount: Integer; override;
+      function GetChild(ID: Integer): TTreeElement; override;
+      function GetCaption: String; override;
+      function GetType: String; override;
       function GetEditor: TFrame;
       function GetFieldByOffset(Offset: Integer): TDataField;
@@ -61,5 +62,6 @@
 
 uses
-  DatLinks, RawList, ConnectionManager, Dialogs, _MetaTypes, _MetaManager;
+  DatLinks, RawList, ConnectionManager, Dialogs, _MetaTypes, _MetaManager,
+  SysUtils;
 
 { TFileType }
@@ -134,4 +136,9 @@
 
 
+function TFile.GetType: String;
+begin
+  Result := FFileInfo.Extension;
+end;
+
 function TFile.GetCaption: String;
 begin
@@ -139,4 +146,5 @@
   if Result = '' then
     Result := 'Unnamed';
+  Result := Result + ' (' + IntToStr(FFileInfo.ID) + ')';
 end;
 
Index: /oup/current/FileClasses/_MetaTypes.pas
===================================================================
--- /oup/current/FileClasses/_MetaTypes.pas	(revision 240)
+++ /oup/current/FileClasses/_MetaTypes.pas	(revision 241)
@@ -4,5 +4,5 @@
 
 uses
-  _FileTypes, _EmptyFile, _Unlinked, _DataTypes, _Extensions, _TreeElement,
+  _FileTypes, _EmptyFile, _DataTypes, _Extensions, _TreeElement,
   AKVA, SUBT, TXAN, TXMP;
 //  ABNA, AGDB, AGQC, AGQG, AGQM, AGQR, AISA, AITR, AIWA, AKAA, AKBA, AKBP, AKDA,
@@ -20,9 +20,22 @@
   TFile = _FileTypes.TFile;
   TFile_Empty = _EmptyFile.TFile_Empty;
-  TFile_Unlinked = _Unlinked.TFile_Unlinked;
   TExtension = _Extensions.TExtension;
   TExtensions = _Extensions.TExtensions;
+
   TDataField = _DataTypes.TDataField;
+  TContainer = _DataTypes.TContainer;
+  TBlock = _DataTypes.TBlock;
+  TArray = _DataTypes.TArray;
+
+  TFileID = _DataTypes.TFileID;
+  TLevelID = _DataTypes.TLevelID;
+  TInt = _DataTypes.TInt;
+  TFloat = _DataTypes.TFloat;
+  TString = _DataTypes.TString;
+  TBitSet = _DataTypes.TBitSet;
   TDatLink = _DataTypes.TDatLink;
+  TLinkByID = _DataTypes.TLinkByID;
+  TRawLink = _DataTypes.TRawLink;
+  TUnused = _DataTypes.TUnused;
 
   TFileClass = class of TFile;
Index: /oup/current/FileClasses/_TreeElement.pas
===================================================================
--- /oup/current/FileClasses/_TreeElement.pas	(revision 240)
+++ /oup/current/FileClasses/_TreeElement.pas	(revision 241)
@@ -5,9 +5,10 @@
 type
   TTreeElement = class
+    protected
       FConnectionID: Integer;
       function GetChildCount: Integer; virtual; abstract;
       function GetChild(ID: Integer): TTreeElement; virtual; abstract;
       function GetCaption: String; virtual; abstract;
-    private
+      function GetType: String; virtual; abstract;
     public
       property ConnectionID: Integer read FConnectionID;
@@ -15,4 +16,5 @@
       property Child[ID: Integer]: TTreeElement read GetChild;
       property Caption: String read GetCaption;
+      property VType: String read GetType;
   end;
 
Index: /oup/current/Global/DatLinks.pas
===================================================================
--- /oup/current/Global/DatLinks.pas	(revision 240)
+++ /oup/current/Global/DatLinks.pas	(revision 241)
@@ -359,5 +359,5 @@
 const
   types: array[0..0] of String[4] =
-      ('*');
+      ('Impt');
 var
   i: Integer;
@@ -426,11 +426,11 @@
 function M3GM(Connection: TDataAccess; FileID: Integer): TDatLinkList;
 const
-  types: array[0..7] of String[4] =
-      ('PNTA', 'VCRA', 'VCRA', 'TXCA', 'IDXA', 'IDXA', 'TXMP', '*');
+  types: array[0..6] of String[4] =
+      ('PNTA', 'VCRA', 'VCRA', 'TXCA', 'IDXA', 'IDXA', 'TXMP');
 var
   i: Integer;
 begin
   SetLength(Result, 8);
-  for i := 0 to 7 do
+  for i := 0 to 6 do
   begin
     Result[i].SrcOffset := $0C + i*4;
@@ -444,5 +444,5 @@
 const
   types: array[0..0] of String[4] =
-      ('*');
+      ('Mtrl');
 var
   i: Integer;
@@ -587,5 +587,5 @@
   Result[0].SrcOffset := $8;
   Result[0].DestID := -1;
-  Result[0].PosDestExts := '*';
+  Result[0].PosDestExts := 'ONCV';
 end;
 
@@ -730,5 +730,5 @@
   Result[0].SrcOffset := $50;
   Result[0].DestID := -1;
-  Result[0].PosDestExts := '*';
+  Result[0].PosDestExts := 'TXMP';
 end;
 
@@ -748,5 +748,5 @@
       Result[i].SrcOffset := $20 + i*8 + 4;
       Result[i].DestID := -1;
-      Result[i].PosDestExts := '*';
+      Result[i].PosDestExts := 'PSpc';
     end;
   end;
@@ -1104,5 +1104,5 @@
   Result[0].SrcOffset := $94;
   Result[0].DestID := -1;
-  Result[0].PosDestExts := '*';
+  Result[0].PosDestExts := 'TXAN';
   Result[1].SrcOffset := $98;
   Result[1].DestID := -1;
@@ -1134,5 +1134,5 @@
       Result[i].SrcOffset := $20 + i*8 + 4;
       Result[i].DestID := -1;
-      Result[i].PosDestExts := '*';
+      Result[i].PosDestExts := 'PSpc';
     end;
   end;
Index: /oup/current/Global/Data.pas
===================================================================
--- /oup/current/Global/Data.pas	(revision 240)
+++ /oup/current/Global/Data.pas	(revision 241)
@@ -5,5 +5,5 @@
 const
   Version:   String    = 'v0.35a';
-  DBVersion: String    = '0.4';
+  DBVersion: String    = '0.5';
   CrLf:      String[2] = #13 + #10;
 
Index: /oup/current/Global/RawList.pas
===================================================================
--- /oup/current/Global/RawList.pas	(revision 240)
+++ /oup/current/Global/RawList.pas	(revision 241)
@@ -44,5 +44,5 @@
   for i := 0 to links - 1 do
   begin
-    Result[i].Name := '<TBD>';
+    Result[i].Name    := '<TBD>';
     Result[i].SrcOffset := $20 + i * 4;
     ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * 4, 4, @link);
@@ -50,4 +50,5 @@
     Result[i].RawSize := 32;
     Result[i].LocSep  := False;
+    Result[i].RawType := 'AGDB' + IntToStr(i mod 2);
   end;
 end;
@@ -66,5 +67,5 @@
   for i := 0 to links - 1 do
   begin
-    Result[i].Name := '<TBD>';
+    Result[i].Name    := '<TBD>';
     Result[i].SrcOffset := $20 + i * $74 + $24;
     ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * $74 + $24, 4, @link);
@@ -73,4 +74,5 @@
     Result[i].RawSize := link;
     Result[i].LocSep  := False;
+    Result[i].RawType := 'AKVA';
   end;
 end;
@@ -87,9 +89,10 @@
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $08, 4, @datasize);
   SetLength(Result, 1);
-  Result[0].Name := 'BinaryData';
+  Result[0].Name      := 'Binary data';
   Result[0].SrcOffset := $0C;
   Result[0].RawAddr   := link;
   Result[0].RawSize   := datasize;
   Result[0].LocSep    := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN);
+  Result[0].RawType   := 'BINA';
 end;
 
@@ -105,9 +108,10 @@
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $0C, 4, @link);
   SetLength(Result, 1);
-  Result[0].Name := 'SoundBinaryData';
+  Result[0].Name      := 'Sound Binary Data';
   Result[0].SrcOffset := $0C;
   Result[0].RawAddr   := link;
   Result[0].RawSize   := datasize;
-  Result[0].LocSep     := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN);
+  Result[0].LocSep    := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN);
+  Result[0].RawType   := 'OSBD';
 end;
 
@@ -133,8 +137,9 @@
     Result[0].SrcOffset := $44;
   end;
-  Result[0].Name := 'SoundData';
+  Result[0].Name    := 'Sound data';
   Result[0].RawAddr := link;
   Result[0].RawSize := datasize;
   Result[0].LocSep  := False;
+  Result[0].RawType := 'SNDD';
 end;
 
@@ -181,4 +186,5 @@
       Result[0].RawSize   := Data.Position;
       Result[0].LocSep    := False;
+      Result[0].RawType   := 'SUBT';
     end;
   end;
@@ -208,4 +214,5 @@
   Result[0].RawAddr   := link;
   Result[0].RawSize   := frames * 4;
+  Result[0].RawType   := 'TRAM0';
   {x-z-pos}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $10, 4, @link);
@@ -214,4 +221,5 @@
   Result[1].RawAddr   := link;
   Result[1].RawSize   := frames * 8;
+  Result[1].RawType   := 'TRAM1';
   {attacks}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $182, 1, @tempb);
@@ -221,4 +229,5 @@
   Result[2].RawAddr   := link;
   Result[2].RawSize   := tempb * 32;
+  Result[2].RawType   := 'TRAM2';
   {damage}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $183, 1, @tempb);
@@ -228,4 +237,5 @@
   Result[3].RawAddr   := link;
   Result[3].RawSize   := tempb * 8;
+  Result[3].RawType   := 'TRAM3';
   {motionblur}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $184, 1, @tempb);
@@ -235,4 +245,5 @@
   Result[4].RawAddr   := link;
   Result[4].RawSize   := tempb * 12;
+  Result[4].RawType   := 'TRAM4';
   {shortcut}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $185, 1, @tempb);
@@ -242,4 +253,5 @@
   Result[5].RawAddr   := link;
   Result[5].RawSize   := tempb * 8;
+  Result[5].RawType   := 'TRAM5';
   {throw}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $24, 4, @link);
@@ -248,4 +260,5 @@
   Result[6].RawAddr   := link;
   Result[6].RawSize := 24;
+  Result[6].RawType   := 'TRAM6';
   {footstep}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $186, 1, @tempb);
@@ -255,4 +268,5 @@
   Result[7].RawAddr   := link;
   Result[7].RawSize   := tempb * 4;
+  Result[7].RawType   := 'TRAM7';
   {particle}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $187, 1, @tempb);
@@ -262,4 +276,5 @@
   Result[8].RawAddr   := link;
   Result[8].RawSize   := tempb * 24;
+  Result[8].RawType   := 'TRAM8';
   {position}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $30, 4, @link);
@@ -268,4 +283,5 @@
   Result[9].RawAddr   := link;
   Result[9].RawSize   := frames * 8;
+  Result[9].RawType   := 'TRAM9';
   {sound}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $154, 2, @tempw);
@@ -275,4 +291,5 @@
   Result[11].RawAddr   := link;
   Result[11].RawSize   := tempw * 34;
+  Result[11].RawType   := 'TRAM11';
   {extent}
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $138, 4, @templ);
@@ -282,4 +299,5 @@
   Result[12].RawAddr   := link;
   Result[12].RawSize   := templ * 12;
+  Result[12].RawType   := 'TRAM12';
 
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $34, 4, @link);
@@ -312,4 +330,5 @@
   Result[10].SrcOffset := $34;
   Result[10].RawAddr   := link;
+  Result[10].RawType   := 'TRAM10';
 end;
 
@@ -373,4 +392,5 @@
   Result[0].RawSize := datasize;
   Result[0].LocSep  := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN);
+  Result[0].RawType   := 'TXMP';
 end;
 
@@ -390,4 +410,5 @@
   Result.RawAddr   := -1;
   Result.RawSize   := -1;
+  Result.RawType   := '';
   if Length(RawList) > 0 then
   begin
@@ -402,4 +423,5 @@
         Result.RawSize   := RawList[i].RawSize;
         Result.LocSep    := RawList[i].LocSep;
+        Result.RawType   := RawList[i].RawType;
         Break;
       end;
Index: /oup/current/Global/TypeDefs.pas
===================================================================
--- /oup/current/Global/TypeDefs.pas	(revision 240)
+++ /oup/current/Global/TypeDefs.pas	(revision 241)
@@ -82,4 +82,5 @@
       RawSize:       Integer;
       LocSep:        Boolean;
+      RawType:       String;
   end;
   TRawDataList = array of TRawDataInfo;
Index: /oup/current/Helper/LevelDB.pas
===================================================================
--- /oup/current/Helper/LevelDB.pas	(revision 240)
+++ /oup/current/Helper/LevelDB.pas	(revision 241)
@@ -594,10 +594,12 @@
   Query.ExecSQL;
   Query.SQL.Text :=
-    'CREATE TABLE rawmap  ( id AUTOINC PRIMARY KEY, src_id INTEGER, ' +
-    'src_link_offset INTEGER, sep BOOLEAN, size INTEGER, ' +
+    'CREATE TABLE rawmap  ( id AUTOINC PRIMARY KEY, name STRING(32), src_id INTEGER, ' +
+    'src_link_offset INTEGER, sep BOOLEAN, type STRING(8), size INTEGER, ' +
     'data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib);';
   //    Query.SQL.Text:='CREATE TABLE rawmap  ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, size INTEGER, data BLOB BlobCompressionAlgorithm None );';
   Query.ExecSQL;
   Query.SQL.Text := 'CREATE INDEX idsrcid ON rawmap (src_id);';
+  Query.ExecSQL;
+  Query.SQL.Text := 'CREATE INDEX idtype ON rawmap (type);';
   Query.ExecSQL;
   Query.SQL.Text :=
@@ -667,7 +669,9 @@
             mimecoder      := TStringFormat_MIME64.Create;
             Query.SQL.Text :=
-              'INSERT INTO rawmap (src_id,src_link_offset,sep,size,data) VALUES (' +
+              'INSERT INTO rawmap (name,src_id,src_link_offset,sep,type,size,data) VALUES (' +
+              '"' + RawLinks[i].Name + '", ' +
               IntToStr(FileID) + ', ' + IntToStr(RawLinks[i].SrcOffset) + ',' +
               BoolToStr(RawLinks[i].LocSep) + ', ' +
+              '"' + RawLinks[i].RawType + '", ' +
               IntToStr(RawLinks[i].RawSize) + ', ' +
               'MimeToBin("' + MimeCoder.StrTo(@tempdata[0], RawLinks[i].RawSize) + '") );';
@@ -678,7 +682,10 @@
           begin
             Query.SQL.Text :=
-              'INSERT INTO rawmap (src_id,src_link_offset,sep,size) VALUES (' +
+              'INSERT INTO rawmap (name,src_id,src_link_offset,sep,type,size) VALUES (' +
+              '"' + RawLinks[i].Name + '", ' +
               IntToStr(FileID) + ', ' + IntToStr(RawLinks[i].SrcOffset) + ', ' +
-              BoolToStr(RawLinks[i].LocSep) + ', 0);';
+              BoolToStr(RawLinks[i].LocSep) + ', ' +
+              '"' + RawLinks[i].RawType + '", ' +
+              '0);';
             Query.ExecSQL;
           end;
Index: /oup/current/Main.pas
===================================================================
--- /oup/current/Main.pas	(revision 240)
+++ /oup/current/Main.pas	(revision 241)
@@ -254,4 +254,7 @@
   ConManager.OnCoonnectionListChanged := UpdateConLists;
 
+  Application.HintPause := 250;
+  Application.HintHidePause := 5000;
+
   if FileExists(ExtractFilepath(Application.EXEname) + '\oniunpacker.ini') then
   begin
Index: /oup/current/OniUnPacker.bdsproj
===================================================================
--- /oup/current/OniUnPacker.bdsproj	(revision 240)
+++ /oup/current/OniUnPacker.bdsproj	(revision 241)
@@ -176,6 +176,5 @@
 			<Language Name="ProjectLang">$00000000</Language>
 			<Language Name="RootDir"></Language>
-		</Language>  
-    <Excluded_Packages>
+		</Language>  <Excluded_Packages>
       <Excluded_Packages Name="d:\programme\borland\bds\3.0\Bin\dbwebxprt.bpl">Borland Web Wizard Package</Excluded_Packages>
     </Excluded_Packages>
Index: /oup/current/OniUnPacker.dpr
===================================================================
--- /oup/current/OniUnPacker.dpr	(revision 240)
+++ /oup/current/OniUnPacker.dpr	(revision 241)
@@ -44,6 +44,5 @@
   _Extensions in 'FileClasses\_Extensions.pas',
   _MetaTypes in 'FileClasses\_MetaTypes.pas',
-  _TreeElement in 'FileClasses\_TreeElement.pas',
-  _Unlinked in 'FileClasses\_Unlinked.pas';
+  _TreeElement in 'FileClasses\_TreeElement.pas';
 
 {$R *.res}
Index: /oup/current/Tools/BinEdit.dfm
===================================================================
--- /oup/current/Tools/BinEdit.dfm	(revision 240)
+++ /oup/current/Tools/BinEdit.dfm	(revision 241)
@@ -19,8 +19,7 @@
         end
         inherited tab_meta: TTabSheet
-          ExplicitLeft = 0
-          ExplicitTop = 0
-          ExplicitWidth = 0
-          ExplicitHeight = 0
+          inherited filelist_meta: TVirtualStringTree
+            Height = 443
+          end
         end
       end
Index: /oup/current/Tools/MetaEditor.dfm
===================================================================
--- /oup/current/Tools/MetaEditor.dfm	(revision 240)
+++ /oup/current/Tools/MetaEditor.dfm	(revision 241)
@@ -40,4 +40,8 @@
       Header.Font.Style = []
       Header.Options = [hoColumnResize, hoDrag, hoVisible]
+      HintAnimation = hatNone
+      HintMode = hmHint
+      ParentShowHint = False
+      ShowHint = True
       TabOrder = 0
       TreeOptions.AutoOptions = [toAutoDropExpand, toAutoScrollOnExpand, toAutoDeleteMovedNodes]
@@ -47,4 +51,5 @@
       OnGetText = VSTGetText
       OnPaintText = VSTPaintText
+      OnGetHint = VSTGetHint
       OnGetPopupMenu = VSTGetPopupMenu
       OnInitChildren = VSTInitChildren
@@ -53,18 +58,15 @@
           Position = 0
           Width = 250
-          WideText = 'FName'
+          WideText = 'Name'
         end
         item
           Position = 1
-          WideText = 'FType'
+          Width = 100
+          WideText = 'Type'
         end
         item
           Position = 2
-          WideText = 'FID'
-        end
-        item
-          Position = 3
           Width = 150
-          WideText = 'Data'
+          WideText = 'Value'
         end>
     end
@@ -74,5 +76,5 @@
       Width = 400
       Height = 424
-      ActivePage = tab_hex
+      ActivePage = tab_meta
       Align = alRight
       TabOrder = 1
Index: /oup/current/Tools/MetaEditor.pas
===================================================================
--- /oup/current/Tools/MetaEditor.pas	(revision 240)
+++ /oup/current/Tools/MetaEditor.pas	(revision 241)
@@ -53,4 +53,7 @@
     procedure vst_setRootClick(Sender: TObject);
     procedure vst_newRootClick(Sender: TObject);
+    procedure VSTGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode;
+      Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle;
+      var HintText: WideString);
   private
     root: TTreeElement;
@@ -63,5 +66,6 @@
 implementation
 {$R *.dfm}
-uses _MetaManager, _MetaTypes, ConnectionManager, Data, _FileTypes, Main;
+uses _MetaManager, _MetaTypes, ConnectionManager, Data, _FileTypes, Main, 
+  TypeDefs;
 
 type
@@ -88,4 +92,5 @@
   if ID >= 0 then
     SetRoot(ConManager.Connection[FConnectionID].MetaData.Root);
+//SetRoot(ConManager.Connection[FConnectionID].MetaData.FileById[454]);
 end;
 
@@ -119,8 +124,6 @@
   newnode: PVirtualNode;
   i: Integer;
-  Meta: TMetaManager;
 begin
   data := Sender.GetNodeData(node);
-  Meta := ConManager.Connection[ConnectionID].MetaData;
 
   if data.Field.ChildCount > 0 then
@@ -152,7 +155,7 @@
   if data.Field is TFile then
     ffile := TFile(data.Field);
-  if data.Field is TDatLink then
-    if Assigned(TDatLink(data.Field).TargetFile) then
-      ffile := TFile(TDatLink(data.Field).TargetFile);
+  if data.Field is _MetaTypes.TDatLink then
+    if Assigned(_MetaTypes.TDatLink(data.Field).TargetFile) then
+      ffile := TFile(_MetaTypes.TDatLink(data.Field).TargetFile);
   if Assigned(ffile) then
   begin
@@ -214,19 +217,7 @@
   begin
     case Column of
-      0:
-        begin
-          CellText := Data.Field.GetCaption;
-        end;
-      1:
-        begin
-          if Data.Field is TFile then
-            CellText := TFile(Data.Field).FileInfo.Extension;
-        end;
+      0: CellText := Data.Field.Caption;
+      1: CellText := data.Field.VType;
       2:
-        begin
-          if Data.Field is TFile then
-            CellText := IntToStr(TFile(Data.Field).FileInfo.ID);
-        end;
-      3:
         begin
           if Data.Field is TDataField then
@@ -264,4 +255,46 @@
 
 
+procedure TForm_Meta.VSTGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode;
+  Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle;
+  var HintText: WideString);
+var
+  data: PNodeData;
+  CellText: WideString;
+
+  i: Integer;
+  links: TStrings;
+begin
+  inherited;
+  if Assigned(Node) then
+  begin
+    VSTGetText(Sender, Node, Column, ttNormal, CellText);
+    if Length(CellText) > 0 then
+    begin
+      data := Sender.GetNodeData(Node);
+      if data.Field is TDataField then
+      begin
+        case Column of
+          0,1: HintText := TDataField(data.Field).Description;
+          2: HintText := '';
+        end;
+      end;
+      if (data.Field is _MetaTypes.TDatLink) and (Column = 2) then
+      begin
+        links := nil;
+        links := ConManager.Connection[FConnectionID].GetFilesList(_MetaTypes.TDatLink(data.Field).PosExts, '', False, ST_NameAsc);
+        HintText := IntToStr(links.Count);
+        for i := 0 to Min(links.Count - 1, 99) do
+        begin
+          if (i mod 5) = 0 then
+            HintText := HintText + #13+#10;
+          HintText := HintText + links.Strings[i] + '       ';
+        end;
+      end;
+    end;
+  end
+  else
+    HintText := '';
+end;
+
 procedure TForm_Meta.VSTGetPopupMenu(Sender: TBaseVirtualTree;
   Node: PVirtualNode; Column: TColumnIndex; const P: TPoint;
@@ -279,5 +312,5 @@
     if Column = 0 then
     begin
-      if TTreeElement(data.Field).GetChildCount > 0 then
+      if TTreeElement(data.Field).ChildCount > 0 then
         PopupMenu := vst_popup
       else
Index: /oup/current/Tools/_TemplateFileList.dfm
===================================================================
--- /oup/current/Tools/_TemplateFileList.dfm	(revision 240)
+++ /oup/current/Tools/_TemplateFileList.dfm	(revision 241)
@@ -33,5 +33,5 @@
         Margins.Right = 1
         Margins.Bottom = 0
-        ActivePage = tab_meta
+        ActivePage = tab_files
         Align = alClient
         TabOrder = 0
@@ -261,4 +261,5 @@
             Align = alClient
             ItemHeight = 13
+            PopupMenu = filepopup
             TabOrder = 1
             OnClick = listClick
@@ -269,8 +270,4 @@
           Caption = 'Tree'
           ImageIndex = 1
-          ExplicitLeft = 0
-          ExplicitTop = 0
-          ExplicitWidth = 0
-          ExplicitHeight = 0
           object filelist_meta: TVirtualStringTree
             Left = 0
@@ -309,4 +306,5 @@
   end
   object filepopup: TPopupMenu
+    OnPopup = filepopupPopup
     Left = 72
     Top = 216
@@ -316,4 +314,5 @@
     object popup_linkshere: TMenuItem
       Caption = 'What links here? Where does this file link to?'
+      OnClick = popup_linkshereClick
     end
     object popup_separator: TMenuItem
@@ -322,7 +321,9 @@
     object popup_import: TMenuItem
       Caption = 'Import binary .dat-file'
+      OnClick = popup_importClick
     end
     object popup_export: TMenuItem
       Caption = 'Export binary .dat-file'
+      OnClick = popup_exportClick
     end
   end
