Index: oup/current/DataAccess/Access_OniArchive.pas
===================================================================
--- oup/current/DataAccess/Access_OniArchive.pas	(revision 247)
+++ oup/current/DataAccess/Access_OniArchive.pas	(revision 248)
@@ -12,13 +12,6 @@
     Fdat_files:          TFiles;
     Fdat_extensionsmap:  TExtensionsMap;
-    FUnloadWhenUnused:   Boolean;
-    FDatOpened:          Boolean;
-    FRawOpened:          Boolean;
-    FSepOpened:          Boolean;
-    procedure SetUnloadWhenUnused(doit: Boolean);
   protected
   public
-    property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write SetUnloadWhenUnused;
-
     constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override;
     procedure Close; override;
@@ -72,7 +65,4 @@
   Fdat_namedfilesmap: TNamedFilesMap;
 begin
-  FUnloadWhenUnused := True;
-  FDatOpened := False;
-  FRawOpened := False;
   Msg := SM_UnknownError;
   if not FileExists(DatFilename) then
@@ -156,5 +146,9 @@
   FLevelNumber := FLevelNumber div 2;
 
-  Fdat_file.Free;
+  Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
+    fmOpenReadWrite);
+  if not (FDataOS = DOS_WIN) then
+    Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
+      fmOpenReadWrite);
 
   Msg := SM_OK;
@@ -169,58 +163,11 @@
 
 
-procedure TAccess_OniArchive.SetUnloadWhenUnused(doit: Boolean);
-begin
-  FUnloadWhenUnused := doit;
-  if FUnloadWhenUnused then
-  begin
-    if FDatOpened then
-    begin
-      FDatOpened := False;
-      Fdat_file.Free;
-    end;
-    if FRawOpened then
-    begin
-      FRawOpened := False;
-      Fraw_file.Free;
-    end;
-    if FSepOpened then
-    begin
-      FSepOpened := False;
-      Fsep_file.Free;
-    end;
-  end
-  else
-  begin
-    if not FDatOpened then
-    begin
-      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
-      FDatOpened := True;
-    end;
-    if not FRawOpened then
-    begin
-      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
-        fmOpenReadWrite);
-      FRawOpened := True;
-    end;
-    if (not FSepOpened) and (FDataOS <> DOS_WIN) then
-    begin
-      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
-        fmOpenReadWrite);
-      FSepOpened := True;
-    end;
-  end;
-end;
-
-
-
-
-
 procedure TAccess_OniArchive.Close;
 begin
-  if FDatOpened then
+  if Assigned(Fdat_file) then
     Fdat_file.Free;
-  if FRawOpened then
+  if Assigned(Fraw_file) then
     Fraw_file.Free;
-  if FSepOpened then
+  if Assigned(Fsep_file) then
     Fsep_file.Free;
   Self.Free;
@@ -373,21 +320,12 @@
   if fileid < GetFileCount then
   begin
+    if not Assigned(Target) then
+      Target := TMemoryStream.Create;
     if GetFileInfo(FileID).Size > 0 then
     begin
-      if not Assigned(Target) then
-        Target := TMemoryStream.Create;
-      if not FDatOpened then
-        Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
       Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning);
       streampos := Target.Position;
       Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size);
       Target.Seek(streampos, soFromBeginning);
-      if UnloadWhenUnused then
-      begin
-        Fdat_file.Free;
-        FDatOpened := False;
-      end
-      else
-        FDatOpened := True;
     end;
   end;
@@ -398,15 +336,6 @@
   if fileid < GetFileCount then
   begin
-    if not FDatOpened then
-      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
     Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning);
     Fdat_file.CopyFrom(Src, Fdat_files[fileid].Size);
-    if UnloadWhenUnused then
-    begin
-      Fdat_file.Free;
-      FDatOpened := False;
-    end
-    else
-      FDatOpened := True;
   end;
 end;
@@ -420,17 +349,8 @@
     if not Assigned(Target) then
       Target := TMemoryStream.Create;
-    if not FDatOpened then
-      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
     Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning);
     streampos := Target.Position;
     Target.CopyFrom(Fdat_file, size);
     Target.Seek(streampos, soFromBeginning);
-    if UnloadWhenUnused then
-    begin
-      FDatOpened := False;
-      Fdat_file.Free;
-    end
-    else
-      FDatOpened := True;
   end;
 end;
@@ -440,15 +360,6 @@
   if fileid < GetFileCount then
   begin
-    if not FDatOpened then
-      Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite);
     Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning);
     Fdat_file.CopyFrom(Src, Size);
-    if UnloadWhenUnused then
-    begin
-      Fdat_file.Free;
-      FDatOpened := False;
-    end
-    else
-      FDatOpened := True;
   end;
 end;
@@ -531,7 +442,4 @@
   if not LocSep then
   begin
-    if not FRawOpened then
-      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
-        fmOpenReadWrite);
     if RawAddr <= Fraw_file.Size then
     begin
@@ -540,17 +448,7 @@
       Target.Seek(0, soFromBeginning);
     end;
-    if UnloadWhenUnused then
-    begin
-      FRawOpened := False;
-      Fraw_file.Free;
-    end
-    else
-      FRawOpened := True;
   end
   else
   begin
-    if not FSepOpened then
-      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
-        fmOpenReadWrite);
     if RawAddr <= Fsep_file.Size then
     begin
@@ -559,11 +457,4 @@
       Target.Seek(0, soFromBeginning);
     end;
-    if UnloadWhenUnused then
-    begin
-      FSepOpened := False;
-      Fsep_file.Free;
-    end
-    else
-      FSepOpened := True;
   end;
 end;
@@ -591,35 +482,15 @@
     if not raw_info.LocSep then
     begin
-      if not FRawOpened then
-        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
-          fmOpenReadWrite);
       Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
       streampos := Target.Position;
       Target.CopyFrom(Fraw_file, raw_info.RawSize);
       Target.Seek(streampos, soFromBeginning);
-      if UnloadWhenUnused then
-      begin
-        FRawOpened := False;
-        Fraw_file.Free;
-      end
-      else
-        FRawOpened := True;
     end
     else
     begin
-      if FUnloadWhenUnused or not FSepOpened then
-        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
-          fmOpenReadWrite);
       Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
       streampos := Target.Position;
       Target.CopyFrom(Fsep_file, raw_info.RawSize);
       Target.Seek(streampos, soFromBeginning);
-      if UnloadWhenUnused then
-      begin
-        FSepOpened := False;
-        Fsep_file.Free;
-      end
-      else
-        FSepOpened := True;
     end;
   end;
@@ -635,31 +506,11 @@
     if not raw_info.LocSep then
     begin
-      if not FRawOpened then
-        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
-          fmOpenReadWrite);
       Fraw_file.Seek(raw_info.RawAddr, soFromBeginning);
       Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size));
-      if UnloadWhenUnused then
-      begin
-        FRawOpened := False;
-        Fraw_file.Free;
-      end
-      else
-        FRawOpened := True;
     end
     else
     begin
-      if not FSepOpened then
-        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
-          fmOpenReadWrite);
       Fsep_file.Seek(raw_info.RawAddr, soFromBeginning);
       Fsep_file.CopyFrom(Src, raw_info.RawSize);
-      if UnloadWhenUnused then
-      begin
-        FSepOpened := False;
-        Fsep_file.Free;
-      end
-      else
-        FSepOpened := True;
     end;
   end;
@@ -694,31 +545,11 @@
     if not raw_info.LocSep then
     begin
-      if not FRawOpened then
-        Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
-          fmOpenReadWrite);
       Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
       Fraw_file.CopyFrom(Src, Size);
-      if UnloadWhenUnused then
-      begin
-        FRawOpened := False;
-        Fraw_file.Free;
-      end
-      else
-        FRawOpened := True;
     end
     else
     begin
-      if not FSepOpened then
-        Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
-          fmOpenReadWrite);
       Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning);
       Fsep_file.CopyFrom(Src, Size);
-      if UnloadWhenUnused then
-      begin
-        FSepOpened := False;
-        Fsep_file.Free;
-      end
-      else
-        FSepOpened := True;
     end;
   end;
@@ -732,7 +563,4 @@
   if not LocSep then
   begin
-    if not FRawOpened then
-      Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'),
-        fmOpenReadWrite);
     if (Fraw_file.Size mod 32) > 0 then
       Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
@@ -742,17 +570,7 @@
     if (Fraw_file.Size mod 32) > 0 then
       Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32));
-    if UnloadWhenUnused then
-    begin
-      FRawOpened := False;
-      Fraw_file.Free;
-    end
-    else
-      FRawOpened := True;
   end
   else
   begin
-    if not FSepOpened then
-      Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'),
-        fmOpenReadWrite);
     if (Fsep_file.Size mod 32) > 0 then
       Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
@@ -762,11 +580,4 @@
     if (Fsep_file.Size mod 32) > 0 then
       Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32));
-    if UnloadWhenUnused then
-    begin
-      FSepOpened := False;
-      Fsep_file.Free;
-    end
-    else
-      FSepOpened := True;
   end;
 end;
Index: oup/current/FileClasses/AKEV.pas
===================================================================
--- oup/current/FileClasses/AKEV.pas	(revision 247)
+++ oup/current/FileClasses/AKEV.pas	(revision 248)
@@ -7,5 +7,5 @@
 
 type
-  TFile_AKEV = class(TFile)
+  TFile_AKEV = class(TResource)
     public
       procedure InitDataFields; override;
@@ -23,5 +23,5 @@
   with FDataFields do
   begin
-    AddField(TFileID, 'FileID', '', []);
+    AddField(TResourceID, 'FileID', '', []);
     AddField(TLevelID, 'LevelID', '', []);
 
Index: oup/current/FileClasses/AKVA.pas
===================================================================
--- oup/current/FileClasses/AKVA.pas	(revision 247)
+++ oup/current/FileClasses/AKVA.pas	(revision 248)
@@ -7,5 +7,5 @@
 
 type
-  TFile_AKVA = class(TFile)
+  TFile_AKVA = class(TResource)
     public
       procedure InitDataFields; override;
@@ -23,5 +23,5 @@
   with FDataFields do
   begin
-    AddField(TFileID, 'FileID', '', []);
+    AddField(TResourceID, 'FileID', '', []);
     AddField(TLevelID, 'LevelID', '', []);
 
Index: oup/current/FileClasses/BINA.pas
===================================================================
--- oup/current/FileClasses/BINA.pas	(revision 247)
+++ oup/current/FileClasses/BINA.pas	(revision 248)
@@ -7,5 +7,5 @@
 
 type
-  TFile_BINA = class(TFile)
+  TFile_BINA = class(TResource)
       procedure SetOpened(Opened: Boolean); override;
     private
@@ -33,5 +33,5 @@
   with FDataFields do
   begin
-    AddField(TFileID, 'FileID', '', []);
+    AddField(TResourceID, 'FileID', '', []);
     AddField(TLevelID, 'LevelID', '', []);
 
Index: oup/current/FileClasses/SUBT.pas
===================================================================
--- oup/current/FileClasses/SUBT.pas	(revision 247)
+++ oup/current/FileClasses/SUBT.pas	(revision 248)
@@ -7,5 +7,5 @@
 
 type
-  TFile_SUBT = class(TFile)
+  TFile_SUBT = class(TResource)
       procedure SetOpened(Opened: Boolean); override;
     private
@@ -31,5 +31,5 @@
   with FDataFields do
   begin
-    AddField(TFileID, 'FileID', '', []);
+    AddField(TResourceID, 'FileID', '', []);
     AddField(TLevelID, 'LevelID', '', []);
     AddField(TUnused, 'Unused data', '', [16]);
Index: oup/current/FileClasses/TXAN.pas
===================================================================
--- oup/current/FileClasses/TXAN.pas	(revision 247)
+++ oup/current/FileClasses/TXAN.pas	(revision 248)
@@ -7,5 +7,5 @@
 
 type
-  TFile_TXAN = class(TFile)
+  TFile_TXAN = class(TResource)
     public
       procedure InitDataFields; override;
@@ -23,5 +23,5 @@
   with FDataFields do
   begin
-    AddField(TFileID, 'FileID', '', []);
+    AddField(TResourceID, 'FileID', '', []);
 
     AddField(TLevelID, 'LevelID', '', []);
Index: oup/current/FileClasses/TXMP.pas
===================================================================
--- oup/current/FileClasses/TXMP.pas	(revision 247)
+++ oup/current/FileClasses/TXMP.pas	(revision 248)
@@ -7,5 +7,5 @@
 
 type
-  TFile_TXMP = class(TFile)
+  TFile_TXMP = class(TResource)
     public
       procedure InitDataFields; override;
@@ -27,5 +27,5 @@
   with FDataFields do
   begin
-    AddField(TFileID, 'FileID', '', []);
+    AddField(TResourceID, 'FileID', '', []);
     AddField(TLevelID, 'LevelID', '', []);
 
Index: oup/current/FileClasses/_DataTypes.pas
===================================================================
--- oup/current/FileClasses/_DataTypes.pas	(revision 247)
+++ oup/current/FileClasses/_DataTypes.pas	(revision 248)
@@ -121,5 +121,5 @@
 
 
-  TFileID = class(TDataField)
+  TResourceID = class(TDataField)
     protected
       FFileID: Integer;
@@ -257,5 +257,5 @@
     for i := 0 to High(ExtraArgs) do
       FExtraArgs[i] := ExtraArgs[i];
-  FConnectionID := TFile(ParentFile).ConnectionID;
+  FConnectionID := TResource(ParentFile).ConnectionID;
 end;
 
@@ -305,5 +305,5 @@
   i: Integer;
 begin
-  fstream := TFile(FParentFile).FileStream;
+  fstream := TResource(FParentFile).FileStream;
   fstream.Seek(FOffset, soFromBeginning);
   SetLength(FString, FDataLength); 
@@ -351,5 +351,5 @@
   fstream: TMemoryStream;
 begin
-  fstream := TFile(FParentFile).FileStream;
+  fstream := TResource(FParentFile).FileStream;
   fstream.Seek(FOffset, soFromBeginning);
   fstream.Read(FInt, FDataLength);
@@ -428,5 +428,5 @@
   if FCounterSize > 0 then
   begin
-    fstream := TFile(FParentFile).FileStream;
+    fstream := TResource(FParentFile).FileStream;
     fstream.Seek(Offset, soFromBeginning);
     FBlockCount := 0;
@@ -463,5 +463,5 @@
   if FCounterSize > 0 then
   begin
-    fstream := TFile(FParentFile).FileStream;
+    fstream := TResource(FParentFile).FileStream;
     fstream.Seek(Offset, soFromBeginning);
     fstream.Write(FBlockCount, FCounterSize);
@@ -622,5 +622,5 @@
   fstream: TMemoryStream;
 begin
-  fstream := TFile(FParentFile).FileStream;
+  fstream := TResource(FParentFile).FileStream;
   fstream.Seek(FOffset, soFromBeginning);
   fstream.Read(FLevelID, 4);
@@ -640,5 +640,5 @@
 { TFileID }
 
-constructor TFileID.Create(ParentFile: TObject; ParentBlock: TContainer;
+constructor TResourceID.Create(ParentFile: TObject; ParentBlock: TContainer;
     Name, Description: String; ExtraArgs: array of const);
 begin
@@ -649,14 +649,14 @@
 end;
 
-function TFileID.GetValueAsString: String;
+function TResourceID.GetValueAsString: String;
 begin
   Result := IntToStr(FFileID);
 end;
 
-procedure TFileID.Update(Offset, Length: Integer);
+procedure TResourceID.Update(Offset, Length: Integer);
 var
   fstream: TMemoryStream;
 begin
-  fstream := TFile(FParentFile).FileStream;
+  fstream := TResource(FParentFile).FileStream;
   fstream.Seek(FOffset, soFromBeginning);
   fstream.Read(FFileID, 4);
@@ -667,5 +667,5 @@
 end;
 
-procedure TFileID.WriteData(stream: TStream);
+procedure TResourceID.WriteData(stream: TStream);
 var
   tempi: Integer;
@@ -731,5 +731,5 @@
   fstream: TMemoryStream;
 begin
-  fstream := TFile(FParentFile).FileStream;
+  fstream := TResource(FParentFile).FileStream;
   fstream.Seek(FOffset, soFromBeginning);
   fstream.Read(FFileID, 4);
@@ -781,5 +781,5 @@
   fstream: TMemoryStream;
 begin
-  fstream := TFile(FParentFile).FileStream;
+  fstream := TResource(FParentFile).FileStream;
   fstream.Seek(FOffset, soFromBeginning);
   fstream.Read(FRawAddress, 4);
@@ -868,5 +868,5 @@
   fstream: TMemoryStream;
 begin
-  fstream := TFile(FParentFile).FileStream;
+  fstream := TResource(FParentFile).FileStream;
   fstream.Seek(FOffset, soFromBeginning);
   fstream.Read(FBits, FDataLength);
@@ -900,5 +900,5 @@
   fstream: TMemoryStream;
 begin
-  fstream := TFile(FParentFile).FileStream;
+  fstream := TResource(FParentFile).FileStream;
   fstream.Seek(FOffset, soFromBeginning);
   fstream.Read(FFloat, FDataLength);
Index: oup/current/FileClasses/_EmptyFile.pas
===================================================================
--- oup/current/FileClasses/_EmptyFile.pas	(revision 247)
+++ oup/current/FileClasses/_EmptyFile.pas	(revision 248)
@@ -7,5 +7,5 @@
 
 type
-  TFile_Empty = class(TFile)
+  TFile_Empty = class(TResource)
   end;
 
Index: oup/current/FileClasses/_FileTypes.pas
===================================================================
--- oup/current/FileClasses/_FileTypes.pas	(revision 247)
+++ oup/current/FileClasses/_FileTypes.pas	(revision 248)
@@ -13,5 +13,5 @@
   end;
 
-  TFile = class(TTreeElement)
+  TResource = class(TTreeElement)
     protected
       FFileInfo: TFileInfo;
@@ -21,4 +21,5 @@
       FCached: Boolean;
       FChanged: Boolean;
+      FReplaced: Boolean;
 
       FDataFields: TBlock;
@@ -67,6 +68,6 @@
   end;
 
-
-  TFileType = class of TFile;
+type
+  TFileType = class of TResource;
 
 
@@ -80,5 +81,5 @@
 { TFileType }
 
-procedure TFile.CacheFile;
+procedure TResource.CacheFile;
 begin
   if not Assigned(FFileStream) then
@@ -90,5 +91,5 @@
 
 
-procedure TFile.CacheRawFile(Offset: Integer);
+procedure TResource.CacheRawFile(Offset: Integer);
 var
   i: Integer;
@@ -107,5 +108,5 @@
 end;
 
-procedure TFile.CacheAllRawFiles;
+procedure TResource.CacheAllRawFiles;
 var
   i: Integer;
@@ -117,5 +118,5 @@
 
 
-procedure TFile.DiscardFileCache;
+procedure TResource.DiscardFileCache;
 begin
   if Assigned(FFileStream) then
@@ -124,5 +125,5 @@
 end;
 
-procedure TFile.DiscardRawCache(Offset: Integer);
+procedure TResource.DiscardRawCache(Offset: Integer);
 var
   i: Integer;
@@ -139,5 +140,5 @@
 end;
 
-procedure TFile.DiscardAllRawCaches;
+procedure TResource.DiscardAllRawCaches;
 var
   i: Integer;
@@ -147,15 +148,15 @@
 end;
 
-procedure TFile.StoreFileCache;
+procedure TResource.StoreFileCache;
 begin
   Exit;
 end;
 
-procedure TFile.StoreRawCache(Offset: Integer);
+procedure TResource.StoreRawCache(Offset: Integer);
 begin
   Exit;
 end;
 
-procedure TFile.StoreAllRawCaches;
+procedure TResource.StoreAllRawCaches;
 var
   i: Integer;
@@ -169,5 +170,5 @@
 
 
-procedure TFile.SetOpened(Opened: Boolean);
+procedure TResource.SetOpened(Opened: Boolean);
 begin
   FOpened := Opened;
@@ -175,5 +176,5 @@
 
 
-constructor TFile.Create(ConnectionID, FileID: Integer);
+constructor TResource.Create(ConnectionID, FileID: Integer);
 var
   rawlist: TRawDataList;
@@ -199,5 +200,5 @@
 
 
-procedure TFile.Free;
+procedure TResource.Free;
 begin
   FDataFields.Free;
@@ -205,5 +206,5 @@
 
 
-function TFile.GetFieldByOffset(Offset: Integer): TDataField;
+function TResource.GetFieldByOffset(Offset: Integer): TDataField;
 begin
   Result := FDataFields.FieldByOffset[Offset];
@@ -211,5 +212,5 @@
 
 
-function TFile.GetRawCacheID(Offset: Integer): Integer;
+function TResource.GetRawCacheID(Offset: Integer): Integer;
 var
   i: Integer;
@@ -221,10 +222,10 @@
 end;
 
-function TFile.GetType: String;
+function TResource.GetType: String;
 begin
   Result := FFileInfo.Extension;
 end;
 
-function TFile.GetCaption: String;
+function TResource.GetCaption: String;
 begin
   Result := FFileInfo.Name;
@@ -234,10 +235,10 @@
 end;
 
-function TFile.GetChild(ID: Integer): TTreeElement;
+function TResource.GetChild(ID: Integer): TTreeElement;
 begin
   Result := FDataFields.Child[ID];
 end;
 
-function TFile.GetChildCount: Integer;
+function TResource.GetChildCount: Integer;
 begin
   if FDataFields <> nil then
@@ -248,5 +249,5 @@
 
 
-function TFile.GetEditor: TFrame;
+function TResource.GetEditor: TFrame;
 begin
   if not Assigned(FEditor) then
@@ -256,5 +257,5 @@
 
 
-procedure TFile.InitDataFields;
+procedure TResource.InitDataFields;
 begin
   if Assigned(FDataFields) then
@@ -265,5 +266,5 @@
 
 
-procedure TFile.InitEditor;
+procedure TResource.InitEditor;
 begin
   Exit;
@@ -274,5 +275,5 @@
 //*********************************************************
 //*********************************************************
-procedure TFile.ReCreateFile(fs: TStream);
+procedure TResource.ReCreateFile(fs: TStream);
 const
   temp0: array[0..31] of Byte =
Index: oup/current/FileClasses/_MetaManager.pas
===================================================================
--- oup/current/FileClasses/_MetaManager.pas	(revision 247)
+++ oup/current/FileClasses/_MetaManager.pas	(revision 248)
@@ -7,10 +7,10 @@
   TMetaManager = class
     protected
-      FFiles: array of TFile;
+      FFiles: array of TResource;
       FRoot: TExtensions;
       FConnectionID: Integer;
       FDataAccess: TObject;
       function GetFileCount: Integer;
-      function GetFileById(Id: Integer): TFile;
+      function GetFileById(Id: Integer): TResource;
     private
     public
@@ -21,5 +21,5 @@
       property Root: TExtensions read FRoot;
       property FileCount: Integer read GetFileCount;
-      property FileById[Id: Integer]: TFile read GetFileById;
+      property FileById[Id: Integer]: TResource read GetFileById;
   end;
 
@@ -41,5 +41,5 @@
 
 
-function TMetaManager.GetFileById(Id: Integer): TFile;
+function TMetaManager.GetFileById(Id: Integer): TResource;
 begin
   InitFile(Id);
@@ -64,13 +64,13 @@
       if finfo.Size > 0 then
       begin
-        for typei := 0 to High(FileDescs) do
+        for typei := 0 to High(ResourceDescs) do
         begin
-          if FileDescs[typei].ext = finfo.Extension then
+          if ResourceDescs[typei].ext = finfo.Extension then
           begin
-            FFiles[id] := TFileClass(FileDescs[typei].ftype).Create(FConnectionID, id);
+            FFiles[id] := TResourceClass(ResourceDescs[typei].ftype).Create(FConnectionID, id);
             Break;
           end;
         end;
-        if typei > High(FileDescs) then
+        if typei > High(ResourceDescs) then
           FFiles[id] := TFile_Empty.Create(FConnectionID, id);
       end else
Index: oup/current/FileClasses/_MetaTypes.pas
===================================================================
--- oup/current/FileClasses/_MetaTypes.pas	(revision 247)
+++ oup/current/FileClasses/_MetaTypes.pas	(revision 248)
@@ -18,5 +18,5 @@
 type
   TTreeElement = _TreeElement.TTreeElement;
-  TFile = _FileTypes.TFile;
+  TResource = _FileTypes.TResource;
   TFile_Empty = _EmptyFile.TFile_Empty;
   TExtension = _Extensions.TExtension;
@@ -28,5 +28,5 @@
   TArray = _DataTypes.TArray;
 
-  TFileID = _DataTypes.TFileID;
+  TResourceID = _DataTypes.TResourceID;
   TLevelID = _DataTypes.TLevelID;
   TInt = _DataTypes.TInt;
@@ -39,12 +39,12 @@
   TUnused = _DataTypes.TUnused;
 
-  TFileClass = class of TFile;
-  TFileDesc = record
+  TResourceClass = class of TResource;
+  TResourceDesc = record
     ext: String;
-    ftype: TFileClass;
+    ftype: TResourceClass;
   end;
 
 const
-  FileDescs: array[0..5] of TFileDesc = (
+  ResourceDescs: array[0..5] of TResourceDesc = (
     (ext: 'AKEV'; ftype: TFile_AKEV),
     (ext: 'AKVA'; ftype: TFile_AKVA),
Index: oup/current/Helper/LevelDB.pas
===================================================================
--- oup/current/Helper/LevelDB.pas	(revision 247)
+++ oup/current/Helper/LevelDB.pas	(revision 248)
@@ -639,6 +639,4 @@
   Application.ProcessMessages;
 
-  TAccess_OniArchive(Connection).UnloadWhenUnused := False;
-
   FileTime := Time;
   Database.StartTransaction;
@@ -743,5 +741,4 @@
 
   converting := False;
-  TAccess_OniArchive(Connection).UnloadWhenUnused := True;
 
   Query.Close;
Index: oup/current/Main.pas
===================================================================
--- oup/current/Main.pas	(revision 247)
+++ oup/current/Main.pas	(revision 248)
@@ -509,5 +509,4 @@
       entry.OnClick := menu_conns_itemClick;
       menu_conns.Add(entry);
-      entry := nil;
     end;
   end;
@@ -522,5 +521,5 @@
   opend.Filter     := 'Compatible level files|*.dat;*.oni;*.oldb|Oni level (*.dat)|*.dat|OniSplit Archive (*.oni)|*.oni|OUP level database (*.oldb)|*.oldb|Any (*.*)|*';
   if typedb then
-    opend.FilterIndex := 3
+    opend.FilterIndex := 4
   else
     opend.FilterIndex := 2;
Index: oup/current/Settings.dfm
===================================================================
--- oup/current/Settings.dfm	(revision 247)
+++ oup/current/Settings.dfm	(revision 248)
@@ -4,5 +4,5 @@
   BorderStyle = bsToolWindow
   Caption = 'Settings'
-  ClientHeight = 197
+  ClientHeight = 216
   ClientWidth = 321
   Color = clBtnFace
@@ -16,4 +16,7 @@
   OnCloseQuery = FormCloseQuery
   OnShow = FormShow
+  DesignSize = (
+    321
+    216)
   PixelsPerInch = 96
   TextHeight = 13
@@ -29,21 +32,25 @@
   object btn_ok: TButton
     Left = 8
-    Top = 168
+    Top = 187
     Width = 57
     Height = 23
+    Anchors = [akLeft, akBottom]
     Caption = 'OK'
     Default = True
     TabOrder = 0
     OnClick = btn_okClick
+    ExplicitTop = 168
   end
   object btn_cancel: TButton
     Left = 112
-    Top = 168
+    Top = 187
     Width = 57
     Height = 23
+    Anchors = [akLeft, akBottom]
     Cancel = True
     Caption = 'Cancel'
     TabOrder = 1
     OnClick = btn_cancelClick
+    ExplicitTop = 168
   end
   object combo_charset: TComboBox
@@ -86,5 +93,5 @@
   object check_reg_oldb: TCheckBox
     Left = 8
-    Top = 110
+    Top = 133
     Width = 180
     Height = 17
@@ -94,5 +101,5 @@
   object check_reg_opf: TCheckBox
     Left = 8
-    Top = 133
+    Top = 156
     Width = 180
     Height = 17
@@ -100,3 +107,11 @@
     TabOrder = 6
   end
+  object check_reg_oni: TCheckBox
+    Left = 8
+    Top = 110
+    Width = 180
+    Height = 17
+    Caption = 'Register .oni files with OUP'
+    TabOrder = 7
+  end
 end
Index: oup/current/Settings.pas
===================================================================
--- oup/current/Settings.pas	(revision 247)
+++ oup/current/Settings.pas	(revision 248)
@@ -15,4 +15,5 @@
     check_reg_oldb: TCheckBox;
     check_reg_opf: TCheckBox;
+    check_reg_oni: TCheckBox;
     procedure btn_cancelClick(Sender: TObject);
     procedure btn_okClick(Sender: TObject);
@@ -118,4 +119,18 @@
     RegisterExtension('.dat', 2, False);
 
+  if check_reg_oni.Checked then
+  begin
+    if ExtensionRegistered('.oni', temps) then
+    begin
+      if temps <> 'ONI.oni' then
+        if MessageBox(Self.Handle, PChar('.oni-files already registered to "' +
+              temps+'". Reregister?'), PChar('Reregister?'),
+              MB_YESNO + MB_ICONQUESTION) = ID_YES then
+          RegisterExtension('.oni', 2, True);
+    end else
+      RegisterExtension('.oni', 2, True);
+  end else
+    RegisterExtension('.oni', 2, False);
+
   if check_reg_oldb.Checked then
   begin
@@ -168,4 +183,9 @@
   if ExtensionRegistered('.dat', temps) then
     check_reg_dat.Checked := temps = 'ONI.dat'
+  else
+    check_reg_dat.Checked := False;
+
+  if ExtensionRegistered('.oni', temps) then
+    check_reg_dat.Checked := temps = 'ONI.oni'
   else
     check_reg_dat.Checked := False;
Index: oup/current/Tools/BinEdit.dfm
===================================================================
--- oup/current/Tools/BinEdit.dfm	(revision 247)
+++ oup/current/Tools/BinEdit.dfm	(revision 248)
@@ -107,5 +107,5 @@
         Colors.EvenColumn = clNavy
         Colors.CurrentOffsetBackground = clBtnShadow
-        Colors.OffsetBackGround = clBtnFace
+        Colors.OffsetBackground = clBtnFace
         Colors.CurrentOffset = clBtnHighlight
         Colors.Grid = clBtnFace
@@ -116,5 +116,5 @@
         AllowInsertMode = False
         DrawGridLines = False
-        Version = 'May 23, 2005; '#169' markus stephany, vcl[at]mirkes[dot]de'
+        Version = 'september 30, 2007; '#169' markus stephany, vcl[at]mirkes[dot]de'
         OnChange = hexChange
         ShowPositionIfNotFocused = True
Index: oup/current/Tools/BinEdit.pas
===================================================================
--- oup/current/Tools/BinEdit.pas	(revision 247)
+++ oup/current/Tools/BinEdit.pas	(revision 248)
@@ -141,11 +141,15 @@
 //      Self.SelectFileID(ConnectionID, fileid);
     Self.ClearStructViewer;
+    ClearValues;
     mem := nil;
-    ConManager.Connection[ConID].LoadDatFile(fileid, TStream(mem));
-    rawlist := ConManager.Connection[ConID].GetRawList(fileid);
-    hex.LoadFromStream(mem);
-    mem.Free;
-    ClearValues;
-    WriteStructureInfos;
+    hex.DataSize := 0;
+    if fileinfo.Size > 0 then
+    begin
+      ConManager.Connection[ConID].LoadDatFile(fileid, TStream(mem));
+      rawlist := ConManager.Connection[ConID].GetRawList(fileid);
+      hex.LoadFromStream(mem);
+      mem.Free;
+      WriteStructureInfos;
+    end;
   end
   else
Index: oup/current/Tools/MetaEditor.dfm
===================================================================
--- oup/current/Tools/MetaEditor.dfm	(revision 247)
+++ oup/current/Tools/MetaEditor.dfm	(revision 248)
@@ -82,7 +82,15 @@
         Caption = 'Meta Edit'
         ImageIndex = 1
+        ExplicitLeft = 0
+        ExplicitTop = 0
+        ExplicitWidth = 0
+        ExplicitHeight = 0
       end
       object tab_hex: TTabSheet
         Caption = 'Binary Edit'
+        ExplicitLeft = 0
+        ExplicitTop = 0
+        ExplicitWidth = 0
+        ExplicitHeight = 0
         object splitter_hex_1: TSplitter
           Left = 0
@@ -162,5 +170,5 @@
           Colors.EvenColumn = clNavy
           Colors.CurrentOffsetBackground = clBtnShadow
-          Colors.OffsetBackGround = clBtnFace
+          Colors.OffsetBackground = clBtnFace
           Colors.CurrentOffset = clBtnHighlight
           Colors.Grid = clBtnFace
@@ -171,5 +179,5 @@
           AllowInsertMode = False
           DrawGridLines = False
-          Version = 'May 23, 2005; '#169' markus stephany, vcl[at]mirkes[dot]de'
+          Version = 'september 30, 2007; '#169' markus stephany, vcl[at]mirkes[dot]de'
           ShowPositionIfNotFocused = True
         end
Index: oup/current/Tools/MetaEditor.pas
===================================================================
--- oup/current/Tools/MetaEditor.pas	(revision 247)
+++ oup/current/Tools/MetaEditor.pas	(revision 248)
@@ -149,5 +149,5 @@
 var
   data: PNodeData;
-  ffile: TFile;
+  ffile: TResource;
 //*******************************************************************
   fs: TFileStream;
@@ -156,9 +156,9 @@
   data := Sender.GetNodeData(Node);
   ffile := nil;
-  if data.Field is TFile then
-    ffile := TFile(data.Field);
+  if data.Field is TResource then
+    ffile := TResource(data.Field);
   if data.Field is _MetaTypes.TDatLink then
     if Assigned(_MetaTypes.TDatLink(data.Field).TargetFile) then
-      ffile := TFile(_MetaTypes.TDatLink(data.Field).TargetFile);
+      ffile := TResource(_MetaTypes.TDatLink(data.Field).TargetFile);
   if Assigned(ffile) then
   begin
@@ -186,8 +186,8 @@
 begin
   data := Sender.GetNodeData(NewNode);
-  if data.Field is TFile then
-  begin
-    if Assigned(TFile(data.Field).Editor) then
-      Allowed := not TFile(data.Field).Opened
+  if data.Field is TResource then
+  begin
+    if Assigned(TResource(data.Field).Editor) then
+      Allowed := not TResource(data.Field).Opened
     else
       Allowed := True;
@@ -196,12 +196,12 @@
   begin
     data := Sender.GetNodeData(OldNode);
-    if data.Field is TFile then
-    begin
-      if TFile(data.Field).Opened then
+    if data.Field is TResource then
+    begin
+      if TResource(data.Field).Opened then
       begin
         if tab_meta.ControlCount > 0 then
           for i := 0 to tab_meta.ControlCount - 1 do
             tab_meta.RemoveControl(tab_meta.Controls[i]);
-        TFile(data.Field).Opened := False;
+        TResource(data.Field).Opened := False;
       end;
     end;
@@ -244,9 +244,9 @@
       0:
         begin
-          if Data.Field is TFile then
+          if Data.Field is TResource then
           begin
-            if Length(TFile(Data.Field).FileInfo.Name) = 0 then
+            if Length(TResource(Data.Field).FileInfo.Name) = 0 then
               TargetCanvas.Font.Color := $C06060;
-            if TFile(Data.Field).FileInfo.Size = 0 then
+            if TResource(Data.Field).FileInfo.Size = 0 then
               TargetCanvas.Font.Color := $2020A0;
           end;
@@ -267,5 +267,5 @@
   i: Integer;
   links: TStrings;
-  ifile: TFile;
+  ifile: TResource;
 begin
   inherited;
@@ -283,7 +283,7 @@
         end;
       end;
-      if data.Field is TFile then
+      if data.Field is TResource then
       begin
-        ifile := TFile(data.Field);
+        ifile := TResource(data.Field);
         case Column of
           0: HintText :=
Index: oup/current/Tools/_TemplateFileList.dfm
===================================================================
--- oup/current/Tools/_TemplateFileList.dfm	(revision 247)
+++ oup/current/Tools/_TemplateFileList.dfm	(revision 248)
@@ -38,4 +38,8 @@
         object tab_files: TTabSheet
           Caption = 'Filelist'
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
           object panel_extension: TPanel
             Left = 0
@@ -220,5 +224,5 @@
               Font.Name = 'Courier'
               Font.Style = []
-              ItemHeight = 13
+              ItemHeight = 0
               ParentFont = False
               Sorted = True
@@ -270,4 +274,8 @@
           Caption = 'Tree'
           ImageIndex = 1
+          ExplicitLeft = 0
+          ExplicitTop = 0
+          ExplicitWidth = 0
+          ExplicitHeight = 0
           object filelist_meta: TVirtualStringTree
             Left = 0
Index: oup/current/Tools/_TemplateFileList.pas
===================================================================
--- oup/current/Tools/_TemplateFileList.pas	(revision 247)
+++ oup/current/Tools/_TemplateFileList.pas	(revision 248)
@@ -420,9 +420,9 @@
   inherited;
   data := Sender.GetNodeData(Node);
-  if data.Field is TFile then
+  if data.Field is TResource then
   begin
     if Assigned(FOnNewFileSelected) then
     begin
-      FOnNewFileSelected(TFile(data.Field).FileInfo);
+      FOnNewFileSelected(TResource(data.Field).FileInfo);
     end;
   end;
@@ -437,9 +437,9 @@
   inherited;
   data := Sender.GetNodeData(NewNode);
-  if data.Field is TFile then
+  if data.Field is TResource then
   begin
     if Assigned(FOnNewFileSelecting) then
     begin
-      FOnNewFileSelecting(TFile(data.Field).FileInfo, Allowed);
+      FOnNewFileSelecting(TResource(data.Field).FileInfo, Allowed);
     end;
   end;
@@ -519,9 +519,9 @@
 begin
   Data     := Sender.GetNodeData(Node);
-  if Data.Field is TFile then
-  begin
-    if Length(TFile(Data.Field).FileInfo.Name) = 0 then
+  if Data.Field is TResource then
+  begin
+    if Length(TResource(Data.Field).FileInfo.Name) = 0 then
       TargetCanvas.Font.Color := $C06060;
-    if TFile(Data.Field).FileInfo.Size = 0 then
+    if TResource(Data.Field).FileInfo.Size = 0 then
       TargetCanvas.Font.Color := $2020A0;
   end;
