Формат DBPF2 и его декодирование: Часть практическая, реализация декодера и кодера

Формат DBPF2 и его декодирование: Часть практическая, реализация декодера и кодера
Автор: AnriRS

Реализация декодирования формата DBPF2, содержится в файле siS3DBPF2Decoder.pas

Статьи по теме

библиотека компонентов для работы с файлами TS3 – DBPF2: описание формата, на русском языке

библиотека компонентов для работы с файлами TS3 – DBPF2: типы данных, на русском языке;

Базовый класс DBPF2 файла

type
TDBPF2File = class(TComponent)
...
protected
function Alloc: TDBPF2Item;
// добавляет запись в индексную таблицу и возвращает ее
procedure ResetHeader; // заполняет заголовок значениями "по умолчанию"
public
constructor Create(AOwner: TComponent); override; // контруктор класса
destructor Destroy; override; // деструктор класса
procedure FreeStream; virtual;
// освобождает вторичные потоки, освобождает первичный поток
end;

Методы

constructor Create(AOwner: TDBPF2File) – конструктор класса, как аргумент получает декодер, индексной таблице которого принадлежит запись;

destructor Destroy – виртуальный деструктор, освобождает вторичный поток и запись, вместо него нужно использовать Free;

procedure FreeStream – виртуальный метод, освобождает вторичные потоки, удаляет индексную таблицу, освобождает первичный поток;

Декодер

type
TDBPF2Decoder = class(TDBPF2File)
protected
procedure DecriptP; // декодирует шифрованный заголовок
public
procedure Decode(AReader: TStream);
// связывает поток декодирования, декодирует индексную таблицу
procedure New(AReader: TStream);
// связывает поток декодирования, создает пустую индексную таблицу
procedure Add(const AFrom: TStream; AResourceType: DWORD;
AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD;
AMemSize: DWORD = 0);
// добавляет блок данных в поток, блок добавляется без его декомпрессии
procedure Delete(Index: integer); // помечает запись как удаленную
function Find(AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD): integer;
// возвращает индекс записи или -1
property Items: TDBPF2Items read; // декодированная индексная таблица
property Count: integer read; // число записей в индексной таблице
property Header: TDBPF2Header read; // заголовок файла
end;

Свойства

  • Items: TDBPF2Items – массив записей по каждому из файлов в пакете, только чтение
  • Count: integer – число файлов в пакете, только чтение
  • Header: TS3PackHeader – заголовок исходного файла, содержит 96 байт – свойство информационное для отладки, содержит правильные значения только после выполнения метода Decode, после использования метода Add не изменяется, только чтение

Методы

procedure Decode(AReader: TStream) – связывает поток декодирования, декодирует индексную таблицу;

procedure New(AReader: TStream) – связывает поток декодирования, создает пустую индексную таблицу;

procedure Add(const AFrom: TStream; AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD; AMemSize: DWORD = 0) – добавляет в индексную таблицу из потока AFrom запись, если AMemSize=0, то запись не сжата, и ее размер устанавливается по размеру потока; при передаче 64 разрядного экземпляра он передается по частям: AInstanceHi = Instance shr 32, AInstanceLo = Instance, фактически запись к исходному файлу не добавляется;

procedure Delete(Index: integer) – помечает запись как удаленную, если запись не существует – не делает ничего;

function Find(AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD): integer – возвращает индекс записи или -1 если запись не найдена;

procedure DecriptP – защищенный метод вызывается из метода Decode автоматически, должен быть определен и реализовывать дешифрацию формата DBPP;

Кодер

type
TDBPF2Coder = class(TDBPF2File)
public
procedure New(AWriter: TStream);
// связывает поток кодирования, создает пустую индексную таблицу
procedure FreeStream; override;
// сохранияет индексную таблицу, освобождает вторичные потоки,
// освобождает первичный поток
procedure Add(const AFrom: TDBPF2Decoder); overload;
// добавляет блоки данных в поток, блоки добавляются без их декомпрессии
procedure Add(const AFrom: TDBPF2Decoder; Index: integer); overload;
procedure Add(const AFrom: TStream; AResourceType: DWORD;
AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD;
AMemSize: DWORD = 0); overload;
// добавляют блок данных в поток, блок добавляется без его декомпрессии
property Header: TDBPF2Header read; // заголовок файла
end;

Свойства

  • Header: TS3PackHeader – заголовок получемого файла, содержит 96 байт – свойство содержит правильные значения после выполнения метода New, после использования методов Add изменяется корректно, Header.IndexOffset содержит размер текущий размер файла без индексной таблицы, Header.IndexSize – текущий размер индексной таблицы, только чтение

Методы

procedure New(AWriter: TStream) – связывает первичный поток (поток кодирования) с кодером, создает пустую индексную таблицу, до вызова метода другие методы и поля (кроме FreeStream и Count) использовать нельзя;

procedure FreeStream – перегруженный виртуальный метод, сохранияет индексную таблицу, затем освобождает вторичные потоки, удаляет индексную таблицу, освобождает первичный поток;

procedure Add(const AFrom: TDBPF2Decoder) – добавляет из потока, связанного с AFrom все записи не помеченные как удаленные, если запись декодирована, то добавляется ее вторичный поток, иначе запись не декодируется (и не расжимается);

procedure Add(const AFrom: TDBPF2Decoder; Index: integer) – добавляет из потока, связанного с AFrom запись с номером Index, если она не помечена как удаленная, если запись декодирована, то добавляется ее вторичный поток, иначе запись не декодируется (и не расжимается);

procedure Add(const AFrom: TStream; AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD; AMemSize: DWORD = 0) – добавляет из потока AFrom запись, если AMemSize=0, то запись не сжата, и ее размер устанавливается по размеру потока; при передаче 64 разрядного экземпляра: AInstanceHi = Instance shr 32, AInstanceLo = Instance

The Sims 3

The Sims 2

The Sims

MySims

Sims-игры

Даты релизов

the_sims_3_store_saleshymn_bunnersimovod_3simovod2Журнал «Симовод»Prosims - магазин сувениров