Index: oup/releases/0.11a/OniUnPacker.bdsproj
===================================================================
--- oup/releases/0.11a/OniUnPacker.bdsproj	(revision 19)
+++ oup/releases/0.11a/OniUnPacker.bdsproj	(revision 19)
@@ -0,0 +1,171 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<BorlandProject>
+	<PersonalityInfo>
+		<Option>
+			<Option Name="Personality">Delphi.Personality</Option>
+			<Option Name="ProjectType"></Option>
+			<Option Name="Version">1.0</Option>
+			<Option Name="GUID">{5F594E8D-8185-4AC6-8191-2A0F26194CB4}</Option>
+		</Option>
+	</PersonalityInfo>
+	<Delphi.Personality>
+		<Source>
+			<Source Name="MainSource">OniUnPacker.dpr</Source>
+		</Source>
+		<FileVersion>
+			<FileVersion Name="Version">7.0</FileVersion>
+		</FileVersion>
+		<Compiler>
+			<Compiler Name="A">8</Compiler>
+			<Compiler Name="B">0</Compiler>
+			<Compiler Name="C">1</Compiler>
+			<Compiler Name="D">1</Compiler>
+			<Compiler Name="E">0</Compiler>
+			<Compiler Name="F">0</Compiler>
+			<Compiler Name="G">1</Compiler>
+			<Compiler Name="H">1</Compiler>
+			<Compiler Name="I">1</Compiler>
+			<Compiler Name="J">0</Compiler>
+			<Compiler Name="K">0</Compiler>
+			<Compiler Name="L">1</Compiler>
+			<Compiler Name="M">0</Compiler>
+			<Compiler Name="N">1</Compiler>
+			<Compiler Name="O">1</Compiler>
+			<Compiler Name="P">1</Compiler>
+			<Compiler Name="Q">0</Compiler>
+			<Compiler Name="R">0</Compiler>
+			<Compiler Name="S">0</Compiler>
+			<Compiler Name="T">0</Compiler>
+			<Compiler Name="U">0</Compiler>
+			<Compiler Name="V">1</Compiler>
+			<Compiler Name="W">0</Compiler>
+			<Compiler Name="X">1</Compiler>
+			<Compiler Name="Y">1</Compiler>
+			<Compiler Name="Z">1</Compiler>
+			<Compiler Name="ShowHints">True</Compiler>
+			<Compiler Name="ShowWarnings">True</Compiler>
+			<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
+			<Compiler Name="NamespacePrefix"></Compiler>
+			<Compiler Name="GenerateDocumentation">False</Compiler>
+			<Compiler Name="DefaultNamespace"></Compiler>
+			<Compiler Name="SymbolDeprecated">True</Compiler>
+			<Compiler Name="SymbolLibrary">True</Compiler>
+			<Compiler Name="SymbolPlatform">True</Compiler>
+			<Compiler Name="SymbolExperimental">True</Compiler>
+			<Compiler Name="UnitLibrary">True</Compiler>
+			<Compiler Name="UnitPlatform">True</Compiler>
+			<Compiler Name="UnitDeprecated">True</Compiler>
+			<Compiler Name="UnitExperimental">True</Compiler>
+			<Compiler Name="HResultCompat">True</Compiler>
+			<Compiler Name="HidingMember">True</Compiler>
+			<Compiler Name="HiddenVirtual">True</Compiler>
+			<Compiler Name="Garbage">True</Compiler>
+			<Compiler Name="BoundsError">True</Compiler>
+			<Compiler Name="ZeroNilCompat">True</Compiler>
+			<Compiler Name="StringConstTruncated">True</Compiler>
+			<Compiler Name="ForLoopVarVarPar">True</Compiler>
+			<Compiler Name="TypedConstVarPar">True</Compiler>
+			<Compiler Name="AsgToTypedConst">True</Compiler>
+			<Compiler Name="CaseLabelRange">True</Compiler>
+			<Compiler Name="ForVariable">True</Compiler>
+			<Compiler Name="ConstructingAbstract">True</Compiler>
+			<Compiler Name="ComparisonFalse">True</Compiler>
+			<Compiler Name="ComparisonTrue">True</Compiler>
+			<Compiler Name="ComparingSignedUnsigned">True</Compiler>
+			<Compiler Name="CombiningSignedUnsigned">True</Compiler>
+			<Compiler Name="UnsupportedConstruct">True</Compiler>
+			<Compiler Name="FileOpen">True</Compiler>
+			<Compiler Name="FileOpenUnitSrc">True</Compiler>
+			<Compiler Name="BadGlobalSymbol">True</Compiler>
+			<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
+			<Compiler Name="InvalidDirective">True</Compiler>
+			<Compiler Name="PackageNoLink">True</Compiler>
+			<Compiler Name="PackageThreadVar">True</Compiler>
+			<Compiler Name="ImplicitImport">True</Compiler>
+			<Compiler Name="HPPEMITIgnored">True</Compiler>
+			<Compiler Name="NoRetVal">True</Compiler>
+			<Compiler Name="UseBeforeDef">True</Compiler>
+			<Compiler Name="ForLoopVarUndef">True</Compiler>
+			<Compiler Name="UnitNameMismatch">True</Compiler>
+			<Compiler Name="NoCFGFileFound">True</Compiler>
+			<Compiler Name="MessageDirective">True</Compiler>
+			<Compiler Name="ImplicitVariants">True</Compiler>
+			<Compiler Name="UnicodeToLocale">True</Compiler>
+			<Compiler Name="LocaleToUnicode">True</Compiler>
+			<Compiler Name="ImagebaseMultiple">True</Compiler>
+			<Compiler Name="SuspiciousTypecast">True</Compiler>
+			<Compiler Name="PrivatePropAccessor">True</Compiler>
+			<Compiler Name="UnsafeType">False</Compiler>
+			<Compiler Name="UnsafeCode">False</Compiler>
+			<Compiler Name="UnsafeCast">False</Compiler>
+			<Compiler Name="OptionTruncated">True</Compiler>
+			<Compiler Name="WideCharReduced">True</Compiler>
+			<Compiler Name="DuplicatesIgnored">True</Compiler>
+		</Compiler>
+		<Linker>
+			<Linker Name="MapFile">0</Linker>
+			<Linker Name="OutputObjs">0</Linker>
+			<Linker Name="ConsoleApp">1</Linker>
+			<Linker Name="DebugInfo">False</Linker>
+			<Linker Name="RemoteSymbols">False</Linker>
+			<Linker Name="GenerateDRC">False</Linker>
+			<Linker Name="MinStackSize">16384</Linker>
+			<Linker Name="MaxStackSize">1048576</Linker>
+			<Linker Name="ImageBase">4194304</Linker>
+			<Linker Name="ExeDescription"></Linker>
+		</Linker>
+		<Directories>
+			<Directories Name="OutputDir"></Directories>
+			<Directories Name="UnitOutputDir"></Directories>
+			<Directories Name="PackageDLLOutputDir"></Directories>
+			<Directories Name="PackageDCPOutputDir"></Directories>
+			<Directories Name="SearchPath"></Directories>
+			<Directories Name="Packages">xmlrtl;rtl;vcl;vclie;inet;inetdbbde;inetdbxpress;vclx;IndySystem;IndyCore;dbrtl;dsnap;soaprtl;IndyProtocols;bdertl;vcldbx;vcldb;webdsnap;websnap;vclactnband;GridPackd2005;TWrapGrid;Package1;A406_R70;CoolTrayIcon_D6plus</Directories>
+			<Directories Name="Conditionals"></Directories>
+			<Directories Name="DebugSourceDirs"></Directories>
+			<Directories Name="UsePackages">False</Directories>
+		</Directories>
+		<Parameters>
+			<Parameters Name="RunParams"></Parameters>
+			<Parameters Name="HostApplication"></Parameters>
+			<Parameters Name="Launcher"></Parameters>
+			<Parameters Name="UseLauncher">False</Parameters>
+			<Parameters Name="DebugCWD"></Parameters>
+			<Parameters Name="RemoteHost"></Parameters>
+			<Parameters Name="RemotePath"></Parameters>
+			<Parameters Name="RemoteLauncher"></Parameters>
+			<Parameters Name="RemoteCWD"></Parameters>
+			<Parameters Name="RemoteDebug">False</Parameters>
+		</Parameters>
+		<VersionInfo>
+			<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
+			<VersionInfo Name="AutoIncBuild">False</VersionInfo>
+			<VersionInfo Name="MajorVer">1</VersionInfo>
+			<VersionInfo Name="MinorVer">0</VersionInfo>
+			<VersionInfo Name="Release">0</VersionInfo>
+			<VersionInfo Name="Build">0</VersionInfo>
+			<VersionInfo Name="Debug">False</VersionInfo>
+			<VersionInfo Name="PreRelease">False</VersionInfo>
+			<VersionInfo Name="Special">False</VersionInfo>
+			<VersionInfo Name="Private">False</VersionInfo>
+			<VersionInfo Name="DLL">False</VersionInfo>
+			<VersionInfo Name="Locale">1031</VersionInfo>
+			<VersionInfo Name="CodePage">1252</VersionInfo>
+		</VersionInfo>
+		<VersionInfoKeys>
+			<VersionInfoKeys Name="CompanyName"></VersionInfoKeys>
+			<VersionInfoKeys Name="FileDescription"></VersionInfoKeys>
+			<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
+			<VersionInfoKeys Name="InternalName"></VersionInfoKeys>
+			<VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys>
+			<VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys>
+			<VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys>
+			<VersionInfoKeys Name="ProductName"></VersionInfoKeys>
+			<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
+			<VersionInfoKeys Name="Comments"></VersionInfoKeys>
+		</VersionInfoKeys>  <Excluded_Packages>
+      <Excluded_Packages Name="C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Borland Studio Projects\Bpl\TCrossEdit.bpl">(untitled)</Excluded_Packages>
+      <Excluded_Packages Name="d:\programme\borland\bds\3.0\Bin\dbwebxprt.bpl">Borland Web Wizard Package</Excluded_Packages>
+    </Excluded_Packages>
+  </Delphi.Personality>
+</BorlandProject>
Index: oup/releases/0.11a/OniUnPacker.cfg
===================================================================
--- oup/releases/0.11a/OniUnPacker.cfg	(revision 19)
+++ oup/releases/0.11a/OniUnPacker.cfg	(revision 19)
@@ -0,0 +1,38 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Borland Studio Projects\Bpl"
+-LN"C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Borland Studio Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
Index: oup/releases/0.11a/OniUnPacker.dpr
===================================================================
--- oup/releases/0.11a/OniUnPacker.dpr	(revision 19)
+++ oup/releases/0.11a/OniUnPacker.dpr	(revision 19)
@@ -0,0 +1,19 @@
+PROGRAM OniUnPacker;
+uses
+  Forms,
+  Unit1_main in 'Unit1_main.pas' {Form1},
+  Unit2_functions in 'Unit2_functions.pas',
+  Unit3_data in 'Unit3_data.pas',
+  Unit4_Exporters in 'Unit4_Exporters.pas',
+  Unit5_preview in 'Unit5_preview.pas' {Form5},
+  Unit6_imgfuncs in 'Unit6_imgfuncs.pas';
+
+{$R *.res}
+
+BEGIN
+  Application.Initialize;
+  Application.Title:='Oni Un/Packer';
+  Application.CreateForm(TForm1, Form1);
+  Application.CreateForm(TForm5, Form5);
+  Application.Run;
+END.
Index: oup/releases/0.11a/Unit1_main.dfm
===================================================================
--- oup/releases/0.11a/Unit1_main.dfm	(revision 19)
+++ oup/releases/0.11a/Unit1_main.dfm	(revision 19)
@@ -0,0 +1,295 @@
+object Form1: TForm1
+  Left = 0
+  Top = 0
+  HorzScrollBar.Visible = False
+  VertScrollBar.Visible = False
+  AutoScroll = False
+  Caption = 'Form1'
+  ClientHeight = 454
+  ClientWidth = 742
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  Menu = menu
+  OldCreateOrder = False
+  OnClose = FormClose
+  OnCreate = FormCreate
+  OnResize = FormResize
+  PixelsPerInch = 96
+  TextHeight = 13
+  object panel_all: TPanel
+    Left = 0
+    Top = 100
+    Width = 692
+    Height = 300
+    BevelOuter = bvNone
+    TabOrder = 0
+    object Splitter2: TSplitter
+      Left = 360
+      Top = 0
+      Width = 8
+      Height = 300
+      AutoSnap = False
+      Beveled = True
+      MinSize = 360
+      OnMoved = Splitter2Moved
+    end
+    object panel_left: TPanel
+      Left = 0
+      Top = 0
+      Width = 360
+      Height = 300
+      Cursor = crDrag
+      Align = alLeft
+      BevelOuter = bvNone
+      TabOrder = 0
+      object Splitter1: TSplitter
+        Left = 0
+        Top = 241
+        Width = 360
+        Height = 8
+        Cursor = crVSplit
+        Align = alTop
+        AutoSnap = False
+        Beveled = True
+        MinSize = 75
+        OnMoved = Splitter1Moved
+      end
+      object panel_files: TPanel
+        Left = 0
+        Top = 0
+        Width = 360
+        Height = 241
+        Align = alTop
+        BevelOuter = bvNone
+        TabOrder = 0
+        object btn_extractallconvert: TButton
+          Left = 273
+          Top = 208
+          Width = 82
+          Height = 33
+          Caption = 'Extract all (with convert)'
+          TabOrder = 0
+          WordWrap = True
+          OnClick = btn_extractallconvertClick
+        end
+        object btn_extract: TButton
+          Left = 0
+          Top = 208
+          Width = 100
+          Height = 33
+          Caption = 'Extract file (without convert)'
+          TabOrder = 1
+          WordWrap = True
+          OnClick = btn_extractconvertClick
+        end
+        object btn_extractconvert: TButton
+          Left = 101
+          Top = 208
+          Width = 105
+          Height = 33
+          Caption = 'Extract file (with convert if possible)'
+          TabOrder = 2
+          WordWrap = True
+          OnClick = btn_extractconvertClick
+        end
+        object list_files: TListBox
+          Left = 0
+          Top = 0
+          Width = 360
+          Height = 209
+          Align = alTop
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'Fixedsys'
+          Font.Style = []
+          ItemHeight = 15
+          ParentFont = False
+          TabOrder = 3
+          OnClick = list_filesDblClick
+          OnDblClick = list_filesDblClick
+        end
+        object btn_extractall: TButton
+          Left = 210
+          Top = 208
+          Width = 62
+          Height = 33
+          Caption = 'Extract all'
+          TabOrder = 4
+          WordWrap = True
+          OnClick = btn_extractallconvertClick
+        end
+      end
+      object list_extensions: TListBox
+        Left = 0
+        Top = 249
+        Width = 360
+        Height = 51
+        Align = alClient
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -11
+        Font.Name = 'Fixedsys'
+        Font.Style = []
+        ItemHeight = 15
+        ParentFont = False
+        Sorted = True
+        TabOrder = 1
+        OnClick = list_extensionsClick
+        OnDblClick = list_extensionsClick
+      end
+    end
+    object panel_right: TPanel
+      Left = 368
+      Top = 0
+      Width = 324
+      Height = 300
+      Align = alClient
+      BevelOuter = bvNone
+      TabOrder = 1
+      object Splitter3: TSplitter
+        Left = 0
+        Top = 200
+        Width = 324
+        Height = 8
+        Cursor = crVSplit
+        Align = alTop
+        AutoSnap = False
+        Beveled = True
+        MinSize = 75
+      end
+      object edit_data: TMemo
+        Left = 0
+        Top = 0
+        Width = 324
+        Height = 200
+        Align = alTop
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -13
+        Font.Name = 'Fixedsys'
+        Font.Style = []
+        ParentFont = False
+        ReadOnly = True
+        ScrollBars = ssVertical
+        TabOrder = 0
+        WordWrap = False
+      end
+      object list_names: TListBox
+        Left = 0
+        Top = 208
+        Width = 324
+        Height = 92
+        Align = alClient
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -11
+        Font.Name = 'Fixedsys'
+        Font.Style = []
+        ItemHeight = 15
+        ParentFont = False
+        Sorted = True
+        TabOrder = 1
+      end
+    end
+  end
+  object panel_info: TPanel
+    Left = 0
+    Top = 0
+    Width = 742
+    Height = 100
+    Align = alTop
+    BevelOuter = bvNone
+    TabOrder = 1
+    object lbl_info: TLabel
+      Left = 2
+      Top = 26
+      Width = 345
+      Height = 73
+      AutoSize = False
+      Caption = 'lbl_info'
+    end
+    object lbl_fileinfo: TLabel
+      Left = 380
+      Top = 0
+      Width = 345
+      Height = 99
+      AutoSize = False
+      Caption = 'lbl_fileinfo'
+    end
+    object btn_load: TButton
+      Left = 0
+      Top = 0
+      Width = 81
+      Height = 25
+      Caption = 'Load dat-file'
+      TabOrder = 0
+      OnClick = btn_loadClick
+    end
+    object btn_hexcopy: TButton
+      Left = 295
+      Top = 64
+      Width = 89
+      Height = 33
+      Caption = 'Copy filedata as hex to clipboard'
+      TabOrder = 1
+      WordWrap = True
+      OnClick = btn_hexcopyClick
+    end
+  end
+  object group_progress: TGroupBox
+    Left = 160
+    Top = 384
+    Width = 297
+    Height = 57
+    Caption = 'Extracting...'
+    TabOrder = 2
+    Visible = False
+    object lbl_progress: TLabel
+      Left = 10
+      Top = 36
+      Width = 279
+      Height = 18
+      AutoSize = False
+    end
+    object progress: TProgressBar
+      Left = 8
+      Top = 16
+      Width = 217
+      Height = 17
+      Step = 1
+      TabOrder = 0
+    end
+    object btn_extractcancel: TButton
+      Left = 232
+      Top = 16
+      Width = 57
+      Height = 33
+      Caption = 'Cancel'
+      TabOrder = 1
+      OnClick = btn_extractcancelClick
+    end
+  end
+  object fopen: TOpenDialog
+    Filter = 'Oni-Dat-Files|*.dat|Oni-Sep-Files (MAC)|*.sep'
+    Left = 72
+  end
+  object menu: TMainMenu
+    AutoHotkeys = maManual
+    Left = 128
+    object menu_main: TMenuItem
+      Caption = 'Main'
+      object menu_exit: TMenuItem
+        Caption = 'Exit'
+      end
+    end
+    object menu_preview: TMenuItem
+      Caption = 'Preview Window'
+      OnClick = menu_previewClick
+    end
+  end
+end
Index: oup/releases/0.11a/Unit1_main.pas
===================================================================
--- oup/releases/0.11a/Unit1_main.pas	(revision 19)
+++ oup/releases/0.11a/Unit1_main.pas	(revision 19)
@@ -0,0 +1,370 @@
+UNIT Unit1_main;
+INTERFACE
+USES
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, StrUtils, Clipbrd, ExtCtrls, ComCtrls, Menus,
+  Unit2_functions, Unit3_data, Unit5_preview;
+
+TYPE
+  TForm1 = Class(TForm)
+    panel_all: TPanel;
+    panel_left: TPanel;
+    Splitter1: TSplitter;
+    panel_files: TPanel;
+    btn_extractallconvert: TButton;
+    btn_extract: TButton;
+    btn_extractconvert: TButton;
+    list_files: TListBox;
+    btn_extractall: TButton;
+    list_extensions: TListBox;
+    Splitter2: TSplitter;
+    panel_right: TPanel;
+    edit_data: TMemo;
+    list_names: TListBox;
+    Splitter3: TSplitter;
+    panel_info: TPanel;
+    lbl_info: TLabel;
+    btn_load: TButton;
+    btn_hexcopy: TButton;
+    fopen: TOpenDialog;
+    lbl_fileinfo: TLabel;
+    group_progress: TGroupBox;
+    progress: TProgressBar;
+    lbl_progress: TLabel;
+    menu: TMainMenu;
+    menu_main: TMenuItem;
+    menu_exit: TMenuItem;
+    menu_preview: TMenuItem;
+    btn_extractcancel: TButton;
+    procedure btn_extractcancelClick(Sender: TObject);
+    PROCEDURE menu_previewClick(Sender: TObject);
+    PROCEDURE btn_extractallconvertClick(Sender: TObject);
+    PROCEDURE Splitter2Moved(Sender: TObject);
+    PROCEDURE Splitter1Moved(Sender: TObject);
+    PROCEDURE FormClose(Sender: TObject; var Action: TCloseAction);
+    PROCEDURE btn_hexcopyClick(Sender: TObject);
+    PROCEDURE list_extensionsClick(Sender: TObject);
+    PROCEDURE FormResize(Sender: TObject);
+    PROCEDURE btn_extractconvertClick(Sender: TObject);
+    PROCEDURE FormCreate(Sender: TObject);
+    PROCEDURE list_filesDblClick(Sender: TObject);
+    PROCEDURE btn_loadClick(Sender: TObject);
+  PRIVATE
+  PUBLIC
+  END;
+
+VAR
+  Form1: TForm1;
+
+IMPLEMENTATION
+{$R *.dfm}
+
+PROCEDURE DoAfterLoadOfADat;
+  VAR
+    i:LongWord;
+    txt:Text;
+    temp4:LongWord;
+    temp2:Word;
+    temp1:Byte;
+  BEGIN
+    IF NOT DirectoryExists(GetExtractPath) THEN
+      CreateDir(GetExtractPath);
+    AssignFile(txt,GetExtractPath+'\___TXMP-FILES___.TXT');
+    ReWrite(txt);
+    FOR i:=0 TO dat_header.Extensions-1 DO BEGIN
+      IF (dat_extensionsmap[i].Extension[3]='T') AND
+          (dat_extensionsmap[i].Extension[2]='X') AND
+          (dat_extensionsmap[i].Extension[1]='M') AND
+          (dat_extensionsmap[i].Extension[0]='P') THEN BEGIN
+        WriteLn(txt, FormatNumber(dat_extensionsmap[i].ExtCount,4,'0')+' TXMP-Files');
+        Break;
+      END;
+    END;
+    WriteLn(txt,'FileName'+#9+'MipMap'+#9+'Depth'+#9+'ImgX'+#9+'ImgY'+#9+'StoreT');
+    FOR i:=0 TO dat_header.Files-1 DO BEGIN
+      IF dat_files[i].Extension='TXMP' THEN BEGIN
+        Write(txt,dat_files[i].FileName+#9);
+        LoadDatFilePart(i,$88,1,@temp1);
+        Write(txt,IntToHex(temp1,2)+#9);
+        LoadDatFilePart(i,$89,1,@temp1);
+        Write(txt,IntToHex(temp1,2)+#9);
+        LoadDatFilePart(i,$8C,2,@temp2);
+        Write(txt,IntToHex(temp2,4)+#9);
+        LoadDatFilePart(i,$8E,2,@temp2);
+        Write(txt,IntToHex(temp2,4)+#9);
+        LoadDatFilePart(i,$90,1,@temp1);
+        Write(txt,IntToHex(temp1,2)+#9);
+        WriteLn(txt,'');
+      END;
+    END;
+    CloseFile(txt);
+
+    IF NOT DirectoryExists(GetExtractPath) THEN
+      CreateDir(GetExtractPath);
+    AssignFile(txt,GetExtractPath+'\___TXAN-FILES___.TXT');
+    ReWrite(txt);
+    FOR i:=0 TO dat_header.Extensions-1 DO BEGIN
+      IF (dat_extensionsmap[i].Extension[3]='T') AND
+          (dat_extensionsmap[i].Extension[2]='X') AND
+          (dat_extensionsmap[i].Extension[1]='A') AND
+          (dat_extensionsmap[i].Extension[0]='N') THEN BEGIN
+        WriteLn(txt, FormatNumber(dat_extensionsmap[i].ExtCount,4,'0')+' TXAN-Files');
+        Break;
+      END;
+    END;
+    WriteLn(txt,'FileName'+#9+'Loopspeed'+#9+'Unknown'+#9+'Links');
+    FOR i:=0 TO dat_header.Files-1 DO BEGIN
+      IF dat_files[i].Extension='TXAN' THEN BEGIN
+        Write(txt,dat_files[i].FileName+#9);
+        LoadDatFilePart(i,$14,2,@temp2);
+        Write(txt,IntToHex(temp2,4)+#9);
+        LoadDatFilePart(i,$16,2,@temp2);
+        Write(txt,IntToHex(temp2,4)+#9);
+        LoadDatFilePart(i,$1C,4,@temp4);
+        Write(txt,IntToHex(temp4,8)+#9);
+        WriteLn(txt,'');
+      END;
+    END;
+    CloseFile(txt);
+  END;
+
+PROCEDURE TForm1.btn_loadClick(Sender: TObject);
+  VAR i:LongWord;
+  BEGIN
+    fopen.InitialDir:=AppSettings.DatPath;
+    IF fopen.Execute THEN BEGIN
+      Form1.Caption:='Oni Un/Packer '+version+' ('+ExtractFileName(fopen.FileName)+')';
+      AppSettings.DatPath:=ExtractFilepath(fopen.FileName);
+      list_files.Items.Clear;
+      list_extensions.Items.Clear;
+      list_names.Items.Clear;
+      IF LoadDatInfos(fopen.FileName) THEN BEGIN
+        lbl_info.Caption:=
+              '# of files: '+IntToStr(dat_header.Files)+CrLf+
+              '# of named files: '+IntToStr(dat_header.NamedFiles)+CrLf+
+              '# of extensions: '+IntToStr(dat_header.Extensions)+CrLf+
+              'Address of Body: 0x'+IntToHex(dat_header.DataAddr,8)+CrLf+
+              'Address of End: 0x'+IntToHex(dat_header.NamesAddr,8);
+        list_extensions.Items.Add('_All files: '+FormatNumber(dat_header.Files,4,' '));
+        FOR i:=0 TO dat_header.Extensions-1 DO BEGIN
+          WITH dat_extensionsmap[i] DO BEGIN
+            list_extensions.Items.Add(
+                Extension[3]+Extension[2]+Extension[1]+Extension[0]+': '+
+                FormatNumber(ExtCount,4,' ')+' (Ident: 0x'+
+                IntToHex(Ident[7],2)+IntToHex(Ident[6],2)+IntToHex(Ident[5],2)+IntToHex(Ident[4],2)+IntToHex(Ident[3],2)+IntToHex(Ident[2],2)+IntToHex(Ident[1],2)+IntToHex(Ident[0],2)+')');
+          END;
+        END;
+        FOR i:=0 TO dat_header.namedFiles-1 DO BEGIN
+          WITH dat_namedfilesmap[i] DO BEGIN
+            list_names.Items.Add('0x'+IntToHex(filenumber,8)+': 0x'+IntToHex(blubb,8));
+          END;
+        END;
+        Form1.list_extensions.ItemIndex:=0;
+        Form1.list_extensionsClick(Form1);
+        Form1.list_files.ItemIndex:=0;
+        Form1.list_filesDblClick(Form1);
+
+        DoAfterLoadOfADat;
+
+      END ELSE BEGIN
+        ShowMessage('Error while loading the file:'+CrLf+fopen.FileName+CrLf+'Perhaps not an Oni-.dat-file?');
+      END;
+    END;
+  END;
+
+PROCEDURE TForm1.list_filesDblClick(Sender: TObject);
+  VAR
+    id:LongWord;
+    temp:Tdata;
+  BEGIN
+    id:=StrToInt(MidStr(list_files.Items.Strings[list_files.ItemIndex],1,5));
+    lbl_fileinfo.Caption:=
+          'Filename: '+dat_files[id].FileName+CrLf+
+          'Size: '+FormatFileSize(dat_files[id].Size)+' ('+IntToStr(dat_files[id].Size)+' Bytes)'+CrLf+
+          'FileType: 0x'+IntToHex(dat_files[id].FileType,8)+CrLf+
+          'Address in .dat: 0x'+IntTohex(dat_files[id].DatAddr,8);
+    IF (dat_files[id].FileType AND $02)=0 THEN BEGIN
+      temp:=LoadDatFile(id);
+      edit_data.Text:=CreateHexString(temp,False);
+      btn_hexcopy.Visible:=True;
+      IF menu_preview.Checked THEN Form5.ShowPreview(id); 
+    END ELSE BEGIN
+      edit_data.Text:='Zero byte file.'+CrLf+'Oni will take the data for this file of level0_final.dat/raw';
+      btn_hexcopy.Visible:=False;
+    END;
+  END;
+
+PROCEDURE TForm1.FormCreate(Sender: TObject);
+  BEGIN
+    Form1.Caption:='Oni Un/Packer '+version;
+    Form1.FormResize(Form1);
+
+    panel_all.Align:=alClient;
+
+    IF FileExists(ExtractFilepath(Application.EXEname)+'\oniunpacker.ini') THEN BEGIN
+      AssignFile(AppSettingsFile,ExtractFilepath(Application.EXEname)+'\oniunpacker.ini');
+      Reset(AppSettingsFile);
+      Read(AppSettingsFile,AppSettings);
+      CloseFile(AppSettingsFile);
+    END ELSE BEGIN
+      AppSettings.DatPath:='D:\Spiele\Oni\GameDataFolder';
+      AppSettings.ExtractPath:='C:\Dokumente und Einstellungen\Administrator\Desktop';
+    END;
+
+    Form1.btn_loadClick(Form1);
+  END;
+
+PROCEDURE TForm1.btn_extractconvertClick(Sender: TObject);
+  VAR
+    result:Integer;
+    id:LongWord;
+  BEGIN
+    id:=StrToInt(MidStr(list_files.Items.Strings[list_files.ItemIndex],1,5));
+    IF TComponent(Sender).Name='btn_extract' THEN
+      result:=ExportFile(id,False)
+    ELSE
+      result:=ExportFile(id,True);
+    CASE result OF
+      0{export_noerror}: IF 1=2 THEN BEGIN END;
+      1{export_nohandler}: ShowMessage('No export-handler for files with extension '+dat_files[id].Extension+'.');
+      2{export_handlererror}: ShowMessage('Error while running data-handler for '+CrLf+dat_files[id].FileName);
+      3{export_error}: ShowMessage('Error while exporting file '+CrLf+dat_files[id].FileName);
+    ELSE ShowMessage('Couldn''t export file '+FormatNumber(id,5,'0')+CrLf+'(Unknown error)');
+    END;
+    Form1.list_files.SetFocus;
+  END;
+
+PROCEDURE TForm1.FormResize(Sender: TObject);
+  CONST
+    MinWidth:Integer=750;
+    MinHeight:Integer=500;
+  BEGIN
+    IF NOT group_progress.Visible THEN BEGIN
+      IF Form1.Width<MinWidth THEN Form1.Width:=MinWidth;
+      IF Form1.Height<MinHeight THEN Form1.Height:=MinHeight;
+    END;
+  END;
+
+PROCEDURE TForm1.list_extensionsClick(Sender: TObject);
+  VAR
+    Extension:String[4];
+    i:LongWord;
+  BEGIN
+    Extension:=MidStr(list_extensions.Items.Strings[list_extensions.ItemIndex],1,4);
+    list_files.Items.Clear;
+    IF Extension='_All' THEN BEGIN
+      FOR i:=0 TO dat_header.Files-1 DO
+        list_files.Items.Add(dat_files[i].FileName);
+    END ELSE BEGIN
+      FOR i:=0 TO dat_header.Files-1 DO
+        IF dat_files[i].Extension=Extension THEN
+          list_files.Items.Add(dat_files[i].FileName);
+    END;
+  END;
+
+PROCEDURE TForm1.btn_hexcopyClick(Sender: TObject);
+  VAR
+    temp:Tdata;
+  BEGIN
+    temp:=LoadDatFile(StrToInt(MidStr(list_files.Items.Strings[list_files.ItemIndex],1,5)));
+    Clipboard.SetTextBuf(PChar(CreateHexString(temp,True)));
+  END;
+
+PROCEDURE TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
+  BEGIN
+    AssignFile(AppSettingsFile,ExtractFilepath(Application.EXEname)+'\oniunpacker.ini');
+    IF FileExists(ExtractFilepath(Application.EXEname)+'\oniunpacker.ini') THEN
+      Reset(AppSettingsFile)
+    ELSE
+      Rewrite(AppSettingsFile);
+    Write(AppSettingsFile,AppSettings);
+    CloseFile(AppSettingsFile);
+  END;
+
+PROCEDURE TForm1.Splitter1Moved(Sender: TObject);
+  BEGIN
+    Form1.list_files.Height:=Form1.Splitter1.Top-32;
+    Form1.btn_extractallconvert.Top:=Form1.Splitter1.Top-33;
+    Form1.btn_extract.Top:=Form1.Splitter1.Top-33;
+    Form1.btn_extractconvert.Top:=Form1.Splitter1.Top-33;
+    Form1.btn_extractall.Top:=Form1.Splitter1.Top-33;
+  END;
+
+PROCEDURE TForm1.Splitter2Moved(Sender: TObject);
+  BEGIN
+    Form1.btn_extractall.Left:=Form1.Splitter2.Left-146;
+    Form1.btn_extractallconvert.Left:=Form1.Splitter2.Left-83;
+  END;
+
+PROCEDURE TForm1.btn_extractallconvertClick(Sender: TObject);
+  VAR
+    convert:Boolean;
+    i:LongWord;
+    errors:LongWord;
+    oldwidth,oldheight:Integer;
+    oldstate:TWindowState;
+  BEGIN
+    panel_all.Visible:=False;
+    panel_info.Visible:=False;
+    group_progress.Visible:=True;
+    FOR i:=0 TO menu.ComponentCount DO menu.Items.Items[i].Enabled:=False;
+    oldwidth:=Form1.Width;
+    oldheight:=Form1.Height;
+    oldstate:=Form1.WindowState;
+    Form1.WindowState:=wsNormal;
+    Form1.Width:=400;
+    Form1.Height:=103;
+    group_progress.Left:=0;
+    group_progress.Top:=0;
+    group_progress.Width:=Form1.Width-8;
+    progress.Width:=group_progress.Width-80;
+    progress.Max:=dat_header.files;
+    btn_extractcancel.Left:=group_progress.Width-65;
+    btn_extractcancel.Caption:='Cancel';
+    btn_extractcancel.SetFocus;
+
+    IF TComponent(Sender).Name='btn_extractall' THEN
+      convert:=False
+    ELSE
+      convert:=True;
+    errors:=0;
+    FOR i:=0 TO High(dat_files) DO BEGIN
+      IF ExportFile(i,convert)>0 THEN Inc(errors);
+      IF (i MOD 25)=0 THEN BEGIN
+        lbl_progress.Caption:=IntToStr(i)+'/'+IntToStr(dat_header.Files);
+        progress.Position:=i;
+        Application.ProcessMessages;
+        IF btn_extractcancel.Caption='Cancel_' THEN BEGIN
+          btn_extractcancel.Caption:='Cancel';
+          Break;
+        END;
+      END;
+    END;
+    IF errors>0 THEN
+      ShowMessage(IntToStr(errors)+' errors encountered.');
+
+    Form1.Width:=oldwidth;
+    Form1.Height:=oldheight;
+    Form1.WindowState:=oldstate;
+    FOR i:=0 TO menu.ComponentCount DO menu.Items.Items[i].Enabled:=True;
+    panel_all.Visible:=True;
+    panel_info.Visible:=True;
+    group_progress.Visible:=False;
+  END;
+
+PROCEDURE TForm1.menu_previewClick(Sender: TObject);
+  BEGIN
+    menu_preview.Checked:=NOT menu_preview.Checked;
+    IF menu_preview.Checked THEN BEGIN
+      Form5.Visible:=True;
+    END ELSE BEGIN
+      Form5.Visible:=False;
+    END;
+  END;
+
+PROCEDURE TForm1.btn_extractcancelClick(Sender: TObject);
+  BEGIN
+    btn_extractcancel.Caption:='Cancel_';
+  END;
+
+END.
Index: oup/releases/0.11a/Unit2_functions.pas
===================================================================
--- oup/releases/0.11a/Unit2_functions.pas	(revision 19)
+++ oup/releases/0.11a/Unit2_functions.pas	(revision 19)
@@ -0,0 +1,205 @@
+UNIT Unit2_functions;
+INTERFACE
+USES Classes, SysUtils, StrUtils, Math, Unit3_data, Unit4_Exporters;
+
+FUNCTION LoadDatInfos(filename:String):Boolean;
+FUNCTION LoadDatFile(fileid:LongWord):Tdata;
+FUNCTION LoadDatFilePart(fileid,offset,size:LongWord; target:Pointer):Boolean;
+FUNCTION LoadRawFilePart(address,size:LongWord; target:Pointer):Boolean;
+FUNCTION FormatNumber(value:LongWord; width:Byte; leadingzeros:Char):String;
+FUNCTION FormatFileSize(size:LongWord):String;
+FUNCTION CreateHexString(data:Tdata; HexOnly:Boolean):String;
+FUNCTION ExportFile(fileid:LongWord; convert:Boolean):Integer;
+FUNCTION GetWinFileName(fileid:LongWord; substring:String):String;
+FUNCTION GetExtractPath:String;
+
+
+
+IMPLEMENTATION
+
+
+FUNCTION LoadDatInfos(filename:String):Boolean;
+  VAR i:LongWord;
+    dat_file:TFileStream;
+  BEGIN
+    Result:=True;
+    IF Length(filename)>0 THEN dat_file.Free;
+    dat_filename:=filename;
+    dat_file:=TFileStream.Create(filename, fmOpenRead);
+    dat_file.Read(dat_header,SizeOf(dat_header));
+    FOR i:=0 TO High(dat_header.Ident) DO
+      IF dat_header.Ident[i]<>header_ident1[i] THEN BEGIN
+        Result:=False;
+        Exit;
+      END;
+{    FOR i:=0 TO High(dat_header.Ident2) DO
+      IF dat_header.Ident2[i]<>header_ident2[i] THEN BEGIN
+        Result:=False;
+        Exit;
+     END;
+}
+    SetLength(dat_filesmap,dat_header.Files);
+    SetLength(dat_files,dat_header.Files);
+    FOR i:=0 TO dat_header.Files-1 DO dat_file.Read(dat_filesmap[i],SizeOf(dat_filesmap[i]));
+    FOR i:=0 TO dat_header.Files-1 DO BEGIN
+      dat_files[i].Extension:=dat_filesmap[i].Extension;
+      dat_files[i].Extension:=ReverseString(dat_files[i].Extension);
+      dat_files[i].Size:=dat_filesmap[i].FileSize;
+      dat_files[i].FileType:=dat_filesmap[i].FileType;
+      dat_files[i].DatAddr:=dat_filesmap[i].DataAddr-8+dat_header.DataAddr;
+      IF (dat_filesmap[i].FileType AND $01)=0 THEN BEGIN
+        dat_file.Seek(dat_filesmap[i].NameAddr+dat_header.NamesAddr,soFromBeginning);
+        SetLength(dat_files[i].Name,100);
+        dat_file.Read(dat_files[i].Name[1],100);
+        dat_files[i].Name:=MidStr(dat_files[i].Name,1+4,Pos(#0,dat_files[i].Name)-1-4);
+      END ELSE BEGIN
+        dat_files[i].Name:='';
+      END;
+      dat_files[i].FileName:=FormatNumber(i,5,'0')+'-'+dat_files[i].Name+'.'+dat_files[i].Extension;
+    END;
+    dat_file.Seek($40+dat_header.Files*$14,soFromBeginning);
+    SetLength(dat_namedfilesmap,dat_header.NamedFiles);
+    FOR i:=0 TO dat_header.NamedFiles-1 DO dat_file.Read(dat_namedfilesmap[i],SizeOf(dat_namedfilesmap[i]));
+
+    dat_file.Seek($40+dat_header.Files*$14+dat_header.NamedFiles*$8,soFromBeginning);
+    SetLength(dat_extensionsmap,dat_header.Extensions);
+    FOR i:=0 TO dat_header.Extensions-1 DO dat_file.Read(dat_extensionsmap[i],SizeOf(dat_extensionsmap[i]));
+
+    dat_file.Free;
+  END;
+
+
+FUNCTION LoadDatFile(fileid:LongWord):Tdata;
+  VAR dat_file:TFileStream;
+  BEGIN
+    dat_file:=TFileStream.Create(dat_filename, fmOpenRead);
+    dat_file.Seek(dat_files[fileid].DatAddr,soFromBeginning);
+    SetLength(Result,dat_files[fileid].Size);
+    dat_file.Read(Result[0],dat_files[fileid].Size);
+    dat_file.Free;
+  END;
+
+
+FUNCTION LoadDatFilePart(fileid,offset,size:LongWord; target:Pointer):Boolean;
+  VAR dat_file:TFileStream;
+  BEGIN
+    dat_file:=TFileStream.Create(dat_filename, fmOpenRead);
+    Result:=True;
+    dat_file.Seek(dat_files[fileid].DatAddr+offset,soFromBeginning);
+    dat_file.Read(target^,size);
+    dat_file.Free;
+  END;
+
+
+FUNCTION LoadRawFilePart(address,size:LongWord; target:Pointer):Boolean;
+  VAR
+    filestream:TFileStream;
+  BEGIN
+    Result:=True;
+    filestream:=TFileStream.Create(AnsiReplaceStr(dat_filename,'.dat','.raw'),fmOpenRead);
+    filestream.Seek(address,soFromBeginning);
+    filestream.Read(target^,size);
+    filestream.Free;
+  END;
+
+
+FUNCTION FormatNumber(value:LongWord; width:Byte; leadingzeros:Char):String;
+  BEGIN
+    Result:=AnsiReplaceStr(Format('%'+IntToStr(width)+'u',[value]),' ',leadingzeros);
+  END;
+
+
+FUNCTION FormatFileSize(size:LongWord):String;
+  BEGIN
+    IF size>=1024*1024*1024 THEN BEGIN
+      Result:=FloatToStrF(size/1024/1024/1024,ffFixed,5,1)+' GB';
+    END ELSE BEGIN
+      IF size>=1024*1024 THEN BEGIN
+        Result:=FloatToStrF(size/1024/1024,ffFixed,5,1)+' MB';
+      END ELSE BEGIN
+        IF size>=1024 THEN BEGIN
+          Result:=FloatToStrF(size/1024,ffFixed,5,1)+' KB';
+        END ELSE BEGIN
+          Result:=IntToStr(size)+' B';
+        END;
+      END;
+    END;
+  END;
+
+
+FUNCTION CreateHexString(data:Tdata; HexOnly:Boolean):String;
+  VAR
+    string_build,ascii_version:String;
+    i:LongWord;
+  BEGIN
+    string_build:='';
+    ascii_version:='';
+    FOR i:=0 TO High(data) DO BEGIN
+      IF NOT HexOnly THEN
+        IF (i MOD 16)=0 THEN
+          string_build:=string_build+'0x'+IntToHex(i,6)+'  ';
+      string_build:=string_build+IntToHex(data[i],2);
+      IF NOT HexOnly THEN BEGIN
+        IF data[i]>=32 THEN ascii_version:=ascii_version+Chr(data[i])
+        ELSE ascii_version:=ascii_version+'.';
+        IF ((i+1) MOD 2)=0 THEN string_build:=string_build+#32;
+        IF ((i+1) MOD 16)=0 THEN BEGIN
+          string_build:=string_build+#32+ascii_version+CrLf;
+          ascii_version:='';
+        END;
+      END;
+    END;
+    Result:=string_build;
+  END;
+
+
+FUNCTION ExportFile(fileid:LongWord; convert:Boolean):Integer;
+  VAR
+    i:Byte;
+  BEGIN
+    Result:=export_noerror;
+
+    ExportDefFileHeader(fileid);
+
+    IF (dat_files[fileid].FileType AND $02)=0 THEN BEGIN
+      ExportDatFile(fileid);
+
+      FOR i:=1 TO Length(ExportHandlers)+1 DO BEGIN
+        IF i<=Length(ExportHandlers) THEN BEGIN
+          IF ExportHandlers[i].Ext=dat_files[fileid].Extension THEN BEGIN
+            IF ExportHandlers[i].needed THEN BEGIN
+              CASE ExportHandlers[i].Handler(fileid,convert) OF
+                0: Result:=0;
+              ELSE
+                Result:=export_handlererror;
+              END;
+            END;
+            Break;
+          END;
+        END ELSE BEGIN
+          Result:=export_nohandler;
+        END;
+      END;
+    END;
+  END;
+
+
+FUNCTION GetWinFileName(fileid:LongWord; substring:String):String;
+  VAR
+    name:String;
+  BEGIN
+    name:=dat_files[fileid].Name;
+    name:=AnsiReplaceStr(name,'\','__');
+    name:=AnsiReplaceStr(name,'/','__');
+    name:=AnsiReplaceStr(name,'>','__');
+    name:=AnsiReplaceStr(name,'<','__');
+    Result:=FormatNumber(fileid,5,'0')+'-'+name+'.'+substring+'.'+dat_files[fileid].Extension;
+  END;
+
+FUNCTION GetExtractPath:String;
+  BEGIN
+    Result:=ExtractFilePath(dat_filename)+'\extracted_'+ExtractFileName(dat_filename);
+  END;
+
+
+END.
Index: oup/releases/0.11a/Unit3_data.pas
===================================================================
--- oup/releases/0.11a/Unit3_data.pas	(revision 19)
+++ oup/releases/0.11a/Unit3_data.pas	(revision 19)
@@ -0,0 +1,83 @@
+UNIT Unit3_data;
+INTERFACE
+USES Classes;
+
+CONST
+  version:String='v0.11a';
+  CrLf:String[2]=#13+#10;
+
+TYPE
+  Tdata=Array OF Byte;
+  Theader=PACKED RECORD
+    Ident:Array[0..$13] OF Byte;
+    Files:LongWord;
+    NamedFiles:LongWord;
+    Extensions:LongWord;
+    DataAddr:LongWord;
+    DataSize:LongWord;
+    NamesAddr:LongWord;
+    NamesSize:LongWord;
+    Ident2:Array[0..$F] OF Byte;
+  END;
+  Tfilesmap=Array OF PACKED RECORD
+    Extension:Array[0..$3] OF Char;
+    DataAddr:LongWord;
+    NameAddr:LongWord;
+    FileSize:LongWord;
+    FileType:LongWord;
+  END;
+  Tfiles=Array OF PACKED RECORD
+    FileName:String;
+    Extension:String[4];
+    Name:String;
+    Size:LongWord;
+    FileType:LongWord;
+    DatAddr:LongWord;
+  END;
+
+  Tnamedfilesmap=Array OF PACKED RECORD
+  	FileNumber:LongWord;
+	  blubb:LongWord;
+  END;
+  Textensionsmap=Array OF PACKED RECORD
+  	Ident:Array[0..$7] OF Byte;
+	  Extension:Array[0..$3] OF Char;
+  	ExtCount:LongWord;
+  END;
+
+  TAppSettings=RECORD
+    DatPath:String[250];
+    ExtractPath:String[250];
+  END;
+
+  TExportHandlers=RECORD
+    Ext:String[4];
+    needed:Boolean;
+    Handler:Function(fileid:LongWord; convert:Boolean):Integer;
+  END;
+
+VAR
+  dat_filename:String='';
+  dat_header:Theader;
+  dat_filesmap:Tfilesmap;
+  dat_files:Tfiles;
+  dat_namedfilesmap:Tnamedfilesmap;
+  dat_extensionsmap:Textensionsmap;
+  AppSettings:TAppSettings;
+  AppSettingsFile:File OF TAppSettings;
+
+CONST
+  header_ident1:Array[0..$13] OF Byte=
+      ($1F,$27,$DC,$33,$DF,$BC,$03,$00,$31,$33,$52,$56,$40,$00,$14,$00,$10,$00,$08,$00);
+  header_ident2:Array[0..$F] OF Byte=
+      ($99,$CF,$40,$00,$90,$4F,$63,$00,$F4,$55,$5F,$00,$90,$4F,$63,$00);
+
+  export_noerror:Integer=0;
+  export_nohandler:Integer=1;
+  export_handlererror:Integer=2;
+  export_error:Integer=3;
+
+IMPLEMENTATION
+
+END.
+
Index: oup/releases/0.11a/Unit4_Exporters.pas
===================================================================
--- oup/releases/0.11a/Unit4_Exporters.pas	(revision 19)
+++ oup/releases/0.11a/Unit4_Exporters.pas	(revision 19)
@@ -0,0 +1,136 @@
+UNIT Unit4_Exporters;
+INTERFACE
+USES Classes, StrUtils, SysUtils, Math, Unit3_data, Unit6_imgfuncs;
+
+PROCEDURE ExportDefLine(fileid:LongWord; line:String; create:Boolean);
+PROCEDURE ExportDefFileHeader(fileid:LongWord);
+PROCEDURE ExportDatFile(fileid:LongWord);
+
+FUNCTION ExportTRAC(fileid:LongWord; convert:Boolean):Integer;
+FUNCTION ExportTXAN(fileid:LongWord; convert:Boolean):Integer;
+FUNCTION ExportTXMP(fileid:LongWord; convert:Boolean):Integer;
+VAR
+  ExportHandlers:Array[1..4] OF TExportHandlers=(
+    (Ext:'ABNA'; needed:False),
+    //(Ext:'AGDB'; needed:False),
+    (Ext:'TRAC'; needed:True; Handler:ExportTRAC),
+    (Ext:'TXAN'; needed:True; Handler:ExportTXAN),
+    (Ext:'TXMP'; needed:True; Handler:ExportTXMP)
+  );
+
+
+
+IMPLEMENTATION
+USES Unit2_functions;
+
+PROCEDURE ExportDefLine(fileid:LongWord; line:String; create:Boolean);
+  VAR
+    filestream:TFileStream;
+    data:Tdata;
+    i:LongWord;
+  BEGIN
+    SetLength(data,Length(line)+2);
+    FOR i:=1 TO Length(line) DO
+      data[i-1]:=Ord(line[i]);
+    data[Length(line)]:=13;
+    data[Length(line)+1]:=10;
+
+    IF create THEN
+      filestream:=TFileStream.Create(GetExtractPath+'\'+GetWinFileName(fileid,'_DEF_'),fmCreate)
+    ELSE BEGIN
+      filestream:=TFileStream.Create(GetExtractPath+'\'+GetWinFileName(fileid,'_DEF_'),fmOpenWrite);
+      filestream.Seek(0,soFromEnd);
+    END;
+    filestream.Write(data[0],Length(data));
+    filestream.Free;
+  END;
+
+PROCEDURE ExportDefFileHeader(fileid:LongWord);
+  BEGIN
+    IF NOT DirectoryExists(GetExtractPath) THEN
+      CreateDir(GetExtractPath);
+    WITH dat_files[fileid] DO
+    ExportDefLine(fileid,FormatNumber(fileid,5,'0')+':'+Name+':'+Extension+':'+IntToHex(Size,8)+':'+IntToHex(FileType,8),True);
+  END;
+
+PROCEDURE ExportDatFile(fileid:LongWord);
+  VAR
+    filestream:TFileStream;
+    data:Tdata;
+  BEGIN
+    data:=LoadDatFile(fileid);
+    filestream:=TFileStream.Create(GetExtractPath+'\'+GetWinFileName(fileid,'_DAT_'),fmCreate);
+    filestream.Write(data[0],Length(data));
+    filestream.Free;
+  END;
+
+
+FUNCTION ExportTRAC;
+  VAR
+    link:LongWord;
+    linkcount:Word;
+    i:LongWord;
+  BEGIN
+    Result:=export_noerror;
+
+    LoadDatFilePart(fileid,$18,SizeOf(link),@link);
+    link:=link DIV 256;
+    ExportDefLine(fileid,FormatNumber(0,4,'0')+':LINKtoTRAC:'+FormatNumber(link,5,'0')+':'+dat_files[link].Name+':'+dat_files[link].Extension,False);
+
+    LoadDatFilePart(fileid,$1E,SizeOf(linkcount),@linkcount);
+    ExportDefLine(fileid,'TRAMLINKS:'+FormatNumber(linkcount,4,'0'),False);
+    FOR i:=1 TO linkcount DO BEGIN
+      LoadDatFilePart(fileid,$20+(i-1)*12+8,SizeOf(link),@link);
+      link:=link DIV 256;
+      ExportDefLine(fileid,FormatNumber(i,4,'0')+':LINKtoTRAM:'+FormatNumber(link,5,'0')+':'+dat_files[link].Name+':'+dat_files[link].Extension,False);
+    END;
+  END;
+
+FUNCTION ExportTXAN;
+  VAR
+    loop_speed,unknown:Word;
+    linkcount:LongWord;
+    link:LongWord;
+    i:Byte;
+  BEGIN
+    Result:=export_noerror;
+
+    LoadDatFilePart(fileid,$14,SizeOf(loop_speed),@loop_speed);
+    LoadDatFilePart(fileid,$16,SizeOf(unknown),@unknown);
+    ExportDefLine(fileid,'LOOPSPEED:'+FormatNumber(loop_speed,2,'0'),False);
+    ExportDefLine(fileid,'UNKNOWN:'+FormatNumber(unknown,2,'0'),False);
+
+    LoadDatFilePart(fileid,$1C,SizeOf(linkcount),@linkcount);
+    ExportDefLine(fileid,'TXMPLINKS:'+FormatNumber(linkcount,4,'0'),False);
+    FOR i:=0 TO linkcount-1 DO BEGIN
+      LoadDatFilePart(fileid,$20+i*4,SizeOf(link),@link);
+      link:=link DIV 256;
+      IF link=0 THEN link:=fileid-1;
+      ExportDefLine(fileid,FormatNumber(i,4,'0')+':LINKtoTXMP:'+FormatNumber(link,5,'0')+':'+dat_files[link].Name+':'+dat_files[link].Extension,False);
+    END;
+  END;
+
+FUNCTION ExportTXMP;
+  VAR
+    filestream:TFileStream;
+    subfile:Byte;
+    img:TImgPackage;
+  BEGIN
+    Result:=export_noerror;
+    subfile:=1;
+
+    img:=LoadImgData(fileid);
+
+    filestream:=TFileStream.Create(GetExtractPath+'\'+GetWinFileName(fileid,FormatNumber(subfile,2,'0')+'-ImgData'),fmCreate);
+    filestream.Write(img.imgdata[0],Length(img.imgdata));
+    filestream.Free;
+
+    IF convert THEN BEGIN
+      img.imgdata:=ImgdataToBMP(img.imgx,img.imgy,img.imgdepth,img.storetype,img.imgdata);
+      filestream:=TFileStream.Create(GetExtractPath+'\'+GetWinFileName(fileid,FormatNumber(subfile,2,'0')+'-ImgData')+'.bmp',fmCreate);
+      filestream.Write(img.imgdata[0],Length(img.imgdata));
+      filestream.Free;
+    END;
+  END;
+
+END.
Index: oup/releases/0.11a/Unit5_preview.dfm
===================================================================
--- oup/releases/0.11a/Unit5_preview.dfm	(revision 19)
+++ oup/releases/0.11a/Unit5_preview.dfm	(revision 19)
@@ -0,0 +1,74 @@
+object Form5: TForm5
+  Left = 0
+  Top = 0
+  Width = 435
+  Height = 348
+  BorderStyle = bsSizeToolWin
+  Caption = 'Preview'
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  FormStyle = fsStayOnTop
+  OldCreateOrder = False
+  OnCloseQuery = FormCloseQuery
+  OnCreate = FormCreate
+  OnResize = FormResize
+  PixelsPerInch = 96
+  TextHeight = 13
+  object img: TImage
+    Left = 0
+    Top = 20
+    Width = 427
+    Height = 304
+    Align = alClient
+  end
+  object panel_buttons: TPanel
+    Left = 0
+    Top = 0
+    Width = 427
+    Height = 20
+    Align = alTop
+    BevelOuter = bvNone
+    TabOrder = 0
+    Visible = False
+    OnResize = panel_buttonsResize
+    object btn_dec: TButton
+      Left = 0
+      Top = 0
+      Width = 20
+      Height = 20
+      Caption = '-'
+      Enabled = False
+      TabOrder = 0
+      OnClick = btn_decClick
+    end
+    object btn_startstop: TButton
+      Left = 21
+      Top = 0
+      Width = 80
+      Height = 20
+      Caption = 'Stop automatic'
+      TabOrder = 1
+      OnClick = btn_startstopClick
+    end
+    object btn_inc: TButton
+      Left = 102
+      Top = 0
+      Width = 20
+      Height = 20
+      Caption = '+'
+      Enabled = False
+      TabOrder = 2
+      OnClick = btn_incClick
+    end
+  end
+  object timer: TTimer
+    Enabled = False
+    OnTimer = timerTimer
+    Left = 72
+    Top = 48
+  end
+end
Index: oup/releases/0.11a/Unit5_preview.pas
===================================================================
--- oup/releases/0.11a/Unit5_preview.pas	(revision 19)
+++ oup/releases/0.11a/Unit5_preview.pas	(revision 19)
@@ -0,0 +1,173 @@
+UNIT Unit5_preview;
+INTERFACE
+USES
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, Math, ExtCtrls, Unit2_functions, Unit3_data, Unit4_exporters, Unit6_imgfuncs,
+  StdCtrls;
+
+TYPE
+  TForm5 = Class(TForm)
+    img: TImage;
+    timer: TTimer;
+    panel_buttons: TPanel;
+    btn_dec: TButton;
+    btn_startstop: TButton;
+    btn_inc: TButton;
+    procedure btn_incClick(Sender: TObject);
+    procedure btn_decClick(Sender: TObject);
+    procedure FormResize(Sender: TObject);
+    procedure btn_startstopClick(Sender: TObject);
+    PROCEDURE panel_buttonsResize(Sender: TObject);
+    PROCEDURE timerTimer(Sender: TObject);
+    PROCEDURE FormCreate(Sender: TObject);
+    PROCEDURE FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+    PROCEDURE ShowPreview(fileid:LongWord);
+  PRIVATE
+  PUBLIC
+  END;
+
+VAR
+  Form5: TForm5;
+
+IMPLEMENTATION
+{$R *.dfm}
+USES Unit1_main;
+VAR
+  memstreams:Array OF TMemoryStream;
+  actualimg:Byte;
+  _fileid:LongWord;
+
+PROCEDURE PreviewTXMP;
+  VAR
+    data:Tdata;
+    img:TImgPackage;
+  BEGIN
+    {
+    tempdata:=ResizeImage(imgx,imgy,imgdepth,tempdata);
+    imgx:=imgx DIV 2;
+    imgy:=imgy DIV 2;
+    datasize:=datasize DIV 4;
+    }
+    SetLength(memstreams,1);
+    img:=LoadImgData(_fileid);
+    data:=ImgdataToBmp(img.imgx,img.imgy,img.imgdepth,img.storetype,img.imgdata);
+
+    memstreams[0].Clear;
+    memstreams[0].Write(data[0],Length(data));
+    memstreams[0].Seek(0,soFromBeginning);
+
+    Form5.img.Picture.Bitmap.LoadFromStream(memstreams[0]);
+  END;
+
+PROCEDURE PreviewTXAN;
+  VAR
+    loop_speed:Word;
+    linkcount:LongWord;
+    link:LongWord;
+    i:Byte;
+    data:Tdata;
+    img:TImgPackage;
+  BEGIN
+    LoadDatFilePart(_fileid,$14,SizeOf(loop_speed),@loop_speed);
+    LoadDatFilePart(_fileid,$1C,SizeOf(linkcount),@linkcount);
+    SetLength(memstreams,linkcount);
+    FOR i:=0 TO linkcount-1 DO BEGIN
+      LoadDatFilePart(_fileid,$20+i*4,SizeOf(link),@link);
+      link:=link DIV 256;
+      IF link=0 THEN link:=_fileid-1;
+      memstreams[i]:=TMemoryStream.Create;
+      img:=LoadImgData(link);
+      data:=ImgdataToBmp(img.imgx,img.imgy,img.imgdepth,img.storetype,img.imgdata);
+      memstreams[i].Clear;
+      memstreams[i].Write(data[0],Length(data));
+      memstreams[i].Seek(0,soFromBeginning);
+    END;
+    actualimg:=254;
+    Form5.timer.Interval:=Floor(loop_speed*(1/60)*1000);
+    Form5.timer.Enabled:=False;
+    Form5.btn_startstopClick(Form5); 
+    Form5.panel_buttons.Visible:=True;
+  END;
+
+PROCEDURE TForm5.ShowPreview(fileid:LongWord);
+  BEGIN
+    _fileid:=fileid;
+    Form5.timer.Enabled:=False;
+    Form5.panel_buttons.Visible:=False;
+    Form5.Caption:='Preview '+dat_files[_fileid].FileName;
+    IF dat_files[fileid].Extension='TXMP' THEN PreviewTXMP;
+    IF dat_files[fileid].Extension='TXAN' THEN PreviewTXAN;
+  END;
+
+PROCEDURE TForm5.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+  BEGIN
+    CanClose:=False;
+    Form1.menu_preview.Checked:=False;
+    Form5.Visible:=False;
+  END;
+
+PROCEDURE TForm5.FormCreate(Sender: TObject);
+  BEGIN
+    SetLength(memstreams,1);
+    memstreams[0]:=TMemoryStream.Create;
+    Form5.Width:=170;
+    Form5.Height:=200;
+  END;
+
+PROCEDURE TForm5.timerTimer(Sender: TObject);
+  BEGIN
+    Inc(actualimg);
+    IF actualimg>=Length(memstreams) THEN actualimg:=0;
+    Form5.img.Picture.Bitmap.LoadFromStream(memstreams[actualimg]);
+    memstreams[actualimg].Seek(0,soFromBeginning);
+    Form5.Caption:='Preview '+dat_files[_fileid].FileName+' ('+IntToStr(actualimg+1)+'/'+IntToStr(Length(memstreams))+')';
+  END;
+
+PROCEDURE TForm5.panel_buttonsResize(Sender: TObject);
+  BEGIN
+    btn_startstop.Width:=panel_buttons.Width-45;
+    btn_inc.Left:=panel_buttons.Width-23;
+  END;
+
+PROCEDURE TForm5.btn_startstopClick(Sender: TObject);
+  BEGIN
+    Form5.timer.Enabled:=NOT Form5.timer.Enabled;
+    Form5.btn_dec.Enabled:=NOT Form5.timer.Enabled;
+    Form5.btn_inc.Enabled:=NOT Form5.timer.Enabled;
+    IF Form5.timer.Enabled THEN
+      Form5.btn_startstop.Caption:='Stop automatic'
+    ELSE
+      Form5.btn_startstop.Caption:='Start automatic';
+  END;
+
+PROCEDURE TForm5.FormResize(Sender: TObject);
+  BEGIN
+    IF Form5.Width>=150 THEN BEGIN
+    END ELSE Form5.Width:=150;
+    IF Form5.Height>=150 THEN BEGIN
+    END ELSE Form5.Height:=150;
+  END;
+
+PROCEDURE TForm5.btn_decClick(Sender: TObject);
+  BEGIN
+    IF actualimg>0 THEN
+      Dec(actualimg)
+    ELSE
+      actualimg:=High(memstreams);
+    Form5.Caption:='Preview '+dat_files[_fileid].FileName+' ('+IntToStr(actualimg+1)+'/'+IntToStr(Length(memstreams))+')';
+    Form5.img.Picture.Bitmap.LoadFromStream(memstreams[actualimg]);
+    memstreams[actualimg].Seek(0,soFromBeginning);
+  END;
+
+PROCEDURE TForm5.btn_incClick(Sender: TObject);
+  BEGIN
+    IF actualimg<High(memstreams) THEN
+      Inc(actualimg)
+    ELSE
+      actualimg:=0;
+    Form5.Caption:='Preview '+dat_files[_fileid].FileName+' ('+IntToStr(actualimg+1)+'/'+IntToStr(Length(memstreams))+')';
+    Form5.img.Picture.Bitmap.LoadFromStream(memstreams[actualimg]);
+    memstreams[actualimg].Seek(0,soFromBeginning);
+  END;
+
+END.
Index: oup/releases/0.11a/Unit6_imgfuncs.pas
===================================================================
--- oup/releases/0.11a/Unit6_imgfuncs.pas	(revision 19)
+++ oup/releases/0.11a/Unit6_imgfuncs.pas	(revision 19)
@@ -0,0 +1,235 @@
+UNIT Unit6_imgfuncs;
+INTERFACE
+USES Math, Unit3_data;
+
+TYPE
+  TImgPackage=RECORD
+    imgx,imgy:Word;
+    imgdepth:Byte;
+    storetype:Byte;
+    datasize:LongWord;
+    raw_addr:LongWord;
+    imgdata:Tdata;
+  END;
+FUNCTION ResizeImage(oldx,oldy:LongWord; imgdepth:Byte; data:Tdata):Tdata;
+FUNCTION RevertImage(imgx,imgy,imgdepth:LongWord; imgdata:Tdata):Tdata;
+FUNCTION DecompressImage(imgx,imgy:LongWord; imgdata:Tdata):Tdata;
+FUNCTION ImgdataToBmp(imgx,imgy,imgdepth,storetype:LongWord; imgdata:Tdata):Tdata;
+FUNCTION LoadImgData(fileid:LongWord):TImgPackage;
+
+IMPLEMENTATION
+USES Unit2_functions;
+
+
+FUNCTION ResizeImage(oldx,oldy:LongWord; imgdepth:Byte; data:Tdata):Tdata;
+  VAR
+    i,j:LongWord;
+    col,row,row_orig:LongWord;
+    temparray:Tdata;
+  BEGIN
+    SetLength(temparray,(oldx DIV 2)*(oldy DIV 2)*(imgdepth DIV 8));
+    row_orig:=0;
+    row:=0;
+    col:=0;
+    FOR i:=0 TO (oldx*oldy)-1 DO BEGIN
+      IF ((i MOD oldx)=0) AND (i>0) THEN BEGIN
+        Inc(row_orig);
+        IF (row_orig MOD 2)=0 THEN BEGIN
+          Inc(row);
+          col:=0;
+        END;
+      END;
+      IF (row_orig MOD 2)=0 THEN BEGIN
+        IF (i MOD 2)=0 THEN BEGIN
+          FOR j:=0 TO (imgdepth DIV 8)-1 DO
+            temparray[((row*(oldx DIV 2))+col)*(imgdepth DIV 8)+j]:=data[i*2+j];
+          Inc(col);
+        END;
+      END;
+    END;
+    Result:=temparray;
+  END;
+
+
+FUNCTION RevertImage(imgx,imgy,imgdepth:LongWord; imgdata:Tdata):Tdata;
+  VAR
+    x,y,i:LongWord;
+  BEGIN
+    SetLength(Result,imgx*imgy*(imgdepth DIV 8));
+    FOR y:=0 TO imgy-1 DO
+      FOR x:=0 TO imgx-1 DO
+        FOR i:=0 TO (imgdepth DIV 8)-1 DO
+          Result[((imgx*(imgy-1-y)+x)*(imgdepth DIV 8))+i]:=
+                  imgdata[(imgx*y+x)*(imgdepth DIV 8)+i];
+  END;
+
+
+FUNCTION DecompressImage(imgx,imgy:LongWord; imgdata:Tdata):Tdata;
+  TYPE
+    Tcolor=RECORD
+        RGBb:Byte;
+        RGBg:Byte;
+        RGBr:Byte;
+        RGBa:Byte;
+      END;
+  VAR
+    i,j,x,y:LongWord;
+    color:Array[1..4] OF Tcolor;
+    pixel:Array[1..16] OF Byte;
+  BEGIN
+    x:=0;
+    y:=0;
+    SetLength(Result,imgx*imgy*4);
+    FOR i:=0 TO ((imgx*imgy) DIV 16)-1 DO BEGIN
+      Color[1].RGBb:=Floor(((imgdata[(i*8)+0]+imgdata[(i*8)+1]*256) AND $001F) / $001F * 255);
+      Color[1].RGBg:=Floor(((imgdata[(i*8)+0]+imgdata[(i*8)+1]*256) AND $07E0) / $07E0 * 255);
+      Color[1].RGBr:=Floor(((imgdata[(i*8)+0]+imgdata[(i*8)+1]*256) AND $F800) / $F800 * 255);
+      Color[1].RGBa:=255;
+      Color[2].RGBb:=Floor(((imgdata[(i*8)+2]+imgdata[(i*8)+3]*256) AND $001F) / $001F * 255);
+      Color[2].RGBg:=Floor(((imgdata[(i*8)+2]+imgdata[(i*8)+3]*256) AND $07E0) / $07E0 * 255);
+      Color[2].RGBr:=Floor(((imgdata[(i*8)+2]+imgdata[(i*8)+3]*256) AND $F800) / $F800 * 255);
+      Color[2].RGBa:=255;
+      Color[3].RGBb:=Floor( Color[1].RGBb/3*2 + Color[2].RGBb/3 );
+      Color[3].RGBg:=Floor( Color[1].RGBg/3*2 + Color[2].RGBg/3 );
+      Color[3].RGBr:=Floor( Color[1].RGBr/3*2 + Color[2].RGBr/3 );
+      Color[3].RGBa:=255;
+      Color[4].RGBb:=Floor( Color[1].RGBb/3 + Color[2].RGBb/3*2 );
+      Color[4].RGBg:=Floor( Color[1].RGBg/3 + Color[2].RGBg/3*2 );
+      Color[4].RGBr:=Floor( Color[1].RGBr/3 + Color[2].RGBr/3*2 );
+      Color[4].RGBa:=255;
+      Pixel[1]:=Floor( (imgdata[(i*8)+4] AND $C0) / $40 + 1 );
+      Pixel[2]:=Floor( (imgdata[(i*8)+4] AND $30) / $10 + 1 );
+      Pixel[3]:=Floor( (imgdata[(i*8)+4] AND $0C) / $04 + 1 );
+      Pixel[4]:=Floor( (imgdata[(i*8)+4] AND $03) + 1 );
+      Pixel[5]:=Floor( (imgdata[(i*8)+5] AND $C0) / $40 + 1 );
+      Pixel[6]:=Floor( (imgdata[(i*8)+5] AND $30) / $10 + 1 );
+      Pixel[7]:=Floor( (imgdata[(i*8)+5] AND $0C) / $04 + 1 );
+      Pixel[8]:=Floor( (imgdata[(i*8)+5] AND $03) + 1 );
+      Pixel[9]:=Floor( (imgdata[(i*8)+6] AND $C0) / $40 + 1 );
+      Pixel[10]:=Floor( (imgdata[(i*8)+6] AND $30) / $10 + 1 );
+      Pixel[11]:=Floor( (imgdata[(i*8)+6] AND $0C) / $04 + 1 );
+      Pixel[12]:=Floor( (imgdata[(i*8)+6] AND $03) + 1 );
+      Pixel[13]:=Floor( (imgdata[(i*8)+7] AND $C0) / $40 + 1 );
+      Pixel[14]:=Floor( (imgdata[(i*8)+7] AND $30) / $10 + 1 );
+      Pixel[15]:=Floor( (imgdata[(i*8)+7] AND $0C) / $04 + 1 );
+      Pixel[16]:=Floor( (imgdata[(i*8)+7] AND $03) + 1 );
+      FOR j:=0 TO 3 DO BEGIN
+        Result[((y+3)*imgx+x+j)*3+0]:=Color[Pixel[16-j]].RGBb;
+        Result[((y+3)*imgx+x+j)*3+1]:=Color[Pixel[16-j]].RGBg;
+        Result[((y+3)*imgx+x+j)*3+2]:=Color[Pixel[16-j]].RGBr;
+      END;
+      FOR j:=0 TO 3 DO BEGIN
+        Result[((y+2)*imgx+x+j)*3+0]:=Color[Pixel[12-j]].RGBb;
+        Result[((y+2)*imgx+x+j)*3+1]:=Color[Pixel[12-j]].RGBg;
+        Result[((y+2)*imgx+x+j)*3+2]:=Color[Pixel[12-j]].RGBr;
+      END;
+      FOR j:=0 TO 3 DO BEGIN
+        Result[((y+1)*imgx+x+j)*3+0]:=Color[Pixel[8-j]].RGBb;
+        Result[((y+1)*imgx+x+j)*3+1]:=Color[Pixel[8-j]].RGBg;
+        Result[((y+1)*imgx+x+j)*3+2]:=Color[Pixel[8-j]].RGBr;
+      END;
+      FOR j:=0 TO 3 DO BEGIN
+        Result[((y+0)*imgx+x+j)*3+0]:=Color[Pixel[4-j]].RGBb;
+        Result[((y+0)*imgx+x+j)*3+1]:=Color[Pixel[4-j]].RGBg;
+        Result[((y+0)*imgx+x+j)*3+2]:=Color[Pixel[4-j]].RGBr;
+      END;
+      x:=x+4;
+      IF x=imgx THEN BEGIN
+        y:=y+4;
+        x:=0;
+      END;
+    END;
+  END;
+
+
+FUNCTION ImgdataToBmp(imgx,imgy,imgdepth,storetype:LongWord; imgdata:Tdata):Tdata;
+  CONST BMPheader:Array[0..53] OF Byte=
+          ($42,$4D,0,0,0,0,0,0,0,0,54,0,0,0,
+           40,0,0,0,0,0,0,0,0,0,0,0,1,0,$18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+  VAR
+    i,x,y:LongWord;
+  BEGIN
+    CASE storetype OF
+      0: BEGIN
+          SetLength(Result,imgx*imgy*3);
+          FOR y:=0 TO imgy-1 DO BEGIN
+            FOR x:=0 TO imgx-1 DO BEGIN
+              Result[((imgx*y+x)*3)+0]:=Floor( ( (imgdata[(imgx*y+x)*2]+imgdata[(imgx*y+x)*2+1]*256) AND $000F ) / $000F * 255);
+              Result[((imgx*y+x)*3)+1]:=Floor( ( (imgdata[(imgx*y+x)*2]+imgdata[(imgx*y+x)*2+1]*256) AND $00F0 ) / $00F0 * 255);
+              Result[((imgx*y+x)*3)+2]:=Floor( ( (imgdata[(imgx*y+x)*2]+imgdata[(imgx*y+x)*2+1]*256) AND $0F00 ) / $0F00 * 255);
+            END;
+          END;
+        END;
+      1,2,8: BEGIN
+          SetLength(Result,imgx*imgy*3);
+          FOR y:=0 TO imgy-1 DO BEGIN
+            FOR x:=0 TO imgx-1 DO BEGIN
+              Result[((imgx*y+x)*3)+0]:=Floor( ( (imgdata[(imgx*y+x)*2]+imgdata[(imgx*y+x)*2+1]*256) AND $001F ) / $001F * 255);
+              Result[((imgx*y+x)*3)+1]:=Floor( ( (imgdata[(imgx*y+x)*2]+imgdata[(imgx*y+x)*2+1]*256) AND $03E0 ) / $03E0 * 255);
+              Result[((imgx*y+x)*3)+2]:=Floor( ( (imgdata[(imgx*y+x)*2]+imgdata[(imgx*y+x)*2+1]*256) AND $7C00 ) / $7C00 * 255);
+            END;
+          END;
+        END;
+      9: BEGIN
+          Result:=DecompressImage(imgx,imgy,imgdata);
+        END;
+    END;
+    Result:=RevertImage(imgx,imgy,24,Result);
+    SetLength(Result,imgx*imgy*3+54);
+    FOR i:=High(Result)-54 DOWNTO 0 DO   Result[i+54]:=Result[i];
+
+    FOR i:=0 TO High(BMPheader) DO   Result[i]:=BMPheader[i];
+    Result[2]:=((imgx*imgy*3+54) AND $000000FF);
+    Result[3]:=((imgx*imgy*3+54) AND $0000FF00) DIV $100;
+    Result[4]:=((imgx*imgy*3+54) AND $00FF0000) DIV $10000;
+    Result[5]:=((imgx*imgy*3+54) AND $FF000000) DIV $1000000;
+    Result[18]:=(imgx AND $000000FF) DIV $1;
+    Result[19]:=(imgx AND $0000FF00) DIV $100;
+    Result[20]:=(imgx AND $00FF0000) DIV $10000;
+    Result[21]:=(imgx AND $FF000000) DIV $1000000;
+    Result[22]:=(imgy AND $000000FF) DIV $1;
+    Result[23]:=(imgy AND $0000FF00) DIV $100;
+    Result[24]:=(imgy AND $00FF0000) DIV $10000;
+    Result[25]:=(imgy AND $FF000000) DIV $1000000;
+    Result[34]:=((imgx*imgy*3) AND $000000FF) DIV $1;
+    Result[35]:=((imgx*imgy*3) AND $0000FF00) DIV $100;
+    Result[36]:=((imgx*imgy*3) AND $00FF0000) DIV $10000;
+    Result[37]:=((imgx*imgy*3) AND $FF000000) DIV $1000000;
+  END;
+
+FUNCTION LoadImgData(fileid:LongWord):TImgPackage;
+{  VAR
+    raw_addr:LongWord;
+    storetype:Byte;
+    imgx,imgy:Word;
+    imgdepth:Byte;
+    data:Tdata;
+    datasize:LongWord;}
+  BEGIN
+      LoadDatFilePart(fileid,$9C,SizeOf(Result.raw_addr),@Result.raw_addr);
+      LoadDatFilePart(fileid,$8C,SizeOf(Result.imgx),@Result.imgx);
+      LoadDatFilePart(fileid,$8E,SizeOf(Result.imgy),@Result.imgy);
+      LoadDatFilePart(fileid,$90,SizeOf(Result.storetype),@Result.storetype);
+
+      CASE Result.storetype OF
+        0,1,2: BEGIN
+            Result.datasize:=Result.imgx*Result.imgy*2;
+            Result.imgdepth:=16;
+          END;
+        8: BEGIN
+            Result.datasize:=Result.imgx*Result.imgy*4;
+            Result.imgdepth:=32;
+          END;
+        9: BEGIN
+            Result.datasize:=Result.imgx*Result.imgy DIV 2;
+            Result.imgdepth:=16;
+          END;
+      ELSE
+        Exit;
+      END;
+      SetLength(Result.imgdata,Result.datasize);
+
+      LoadRawFilePart(Result.raw_addr,Result.datasize,@Result.imgdata[0]);
+  END;
+
+END.
