Index: oup/current/FileClasses/_DataTypes.pas
===================================================================
--- oup/current/FileClasses/_DataTypes.pas	(revision 124)
+++ oup/current/FileClasses/_DataTypes.pas	(revision 124)
@@ -0,0 +1,67 @@
+unit _DataTypes;
+
+interface
+
+type
+  TDataType = class
+    private
+      function GetDataLength: Integer; virtual; abstract;
+      function GetValueAsString: String; virtual; abstract;
+    published
+      property DataLength: Integer read GetDataLength;
+//      property DataLength: Integer;
+      property ValueAsString: String read GetValueAsString;
+  end;
+
+
+  TDataField = record
+    Offset: Integer;
+    Data: TDataType;
+  end;
+  TDataFields = array of TDataField;
+
+
+  TInt32 = class(TDataType)
+    private
+      FValue: LongWord;
+      function GetDataLength: Integer; override;
+      function GetValueAsString: String; override;
+  end;
+
+  TString = class(TDataType)
+    private
+      FString: String;
+      function GetDataLength: Integer; override;
+      function GetValueAsString: String; override;
+  end;
+
+implementation
+
+uses
+  SysUtils;
+
+{ TInt32 }
+
+function TInt32.GetDataLength: Integer;
+begin
+  Result := 4;
+end;
+
+function TInt32.GetValueAsString: String;
+begin
+  Result := IntToStr(FValue);
+end;
+
+{ TString }
+
+function TString.GetDataLength: Integer;
+begin
+  Result := Length(FString);
+end;
+
+function TString.GetValueAsString: String;
+begin
+  Result := FString;
+end;
+
+end.
Index: oup/current/FileClasses/_FileTypes.pas
===================================================================
--- oup/current/FileClasses/_FileTypes.pas	(revision 124)
+++ oup/current/FileClasses/_FileTypes.pas	(revision 124)
@@ -0,0 +1,61 @@
+unit _FileTypes;
+
+interface
+
+uses
+  TypeDefs, _DataTypes;
+
+
+type
+  TFileType = class
+    private
+      FDatLinks: TDatLinkList;
+      FDataFields: TDataFields;
+      function GetDatLink(Offset: Integer): TDatLink;
+      function GetField(Offset: Integer): TDataField;
+    public
+      property LinksByID[Offset: Integer]: TDatLink read GetDatLink;
+      property Fields[Offset: Integer]: TDataField read GetField;
+  end;
+
+
+implementation
+
+{ TFileType }
+
+function TFileType.GetDatLink(Offset: Integer): TDatLink;
+var
+  i: Integer;
+begin
+  Result.SrcOffset := -1;
+  Result.DestID := -1;
+  Result.PosDestExts := '';
+  
+  if Length(FDatLinks) > 0 then
+  begin
+    for i := 0 to High(FDatLinks) do
+      if FDatLinks[i].SrcOffset = Offset then
+        break;
+    if i < Length(FDatLinks) then
+      Result := FDatLinks[i];
+  end;
+end;
+
+function TFileType.GetField(Offset: Integer): TDataField;
+var
+  i: Integer;
+begin
+  Result.Offset := -1;
+  Result.Data := nil;
+
+  if Length(FDataFields) > 0 then
+  begin
+    for i := 0 to High(FDataFields) do
+      if FDataFields[i].Offset = Offset then
+        break;
+    if i < Length(FDataFields) then
+      Result := FDataFields[i];
+  end;
+end;
+
+end.
Index: oup/current/Global/OniImgClass.pas
===================================================================
--- oup/current/Global/OniImgClass.pas	(revision 123)
+++ oup/current/Global/OniImgClass.pas	(revision 124)
@@ -590,8 +590,13 @@
   x, y: Word;
   bpp:  Byte;
-begin
+  minside: Byte;
+begin
+  minside := 1;
   case Self.FStoreType of
     9:
-      bpp := 8;
+    begin
+      bpp := 4;
+      minside := 4;
+    end;
     0, 1, 2:
       bpp := 16;
@@ -612,5 +617,5 @@
       y    := y div 2;
       size := size + (x * y * bpp) div 8;
-    until (x = 1) or (y = 1);
+    until (x = minside) or (y = minside);
   end;
   Result := size;
Index: oup/current/Global/RawList.pas
===================================================================
--- oup/current/Global/RawList.pas	(revision 123)
+++ oup/current/Global/RawList.pas	(revision 124)
@@ -314,4 +314,5 @@
   mipmap:    Byte;
   bpp:       Byte;
+  minside:   Byte;
 begin
   ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $88, SizeOf(mipmap), @mipmap);
@@ -323,14 +324,15 @@
 
 
+  minside := 1;
   case storetype of
     0, 1, 2:
       bpp := 16;
-//      datasize := x * y * 2;
     8:
       bpp := 32;
-//      datasize := x * y * 4;
     9:
+    begin
       bpp := 4;
-//      datasize := x * y div 2;
+      minside := 4;
+    end;
   end;
 
@@ -342,5 +344,5 @@
       y    := y div 2;
       datasize := datasize + (x * y * bpp) div 8;
-    until (x = 1) or (y = 1);
+    until (x = minside) or (y = minside);
   end;
 
Index: oup/current/Global/TypeDefs.pas
===================================================================
--- oup/current/Global/TypeDefs.pas	(revision 123)
+++ oup/current/Global/TypeDefs.pas	(revision 124)
@@ -115,4 +115,5 @@
   end;
 
+
   TLinkByName = record
       SrcOffset: Integer;
