Суббота, 23.11.2024, 13:48
Приветствую Вас Гость

Каталог статей

Главная » Статьи » S3DecoderLib

S3DecoderLib: Работа с таблицами строк

Работа с таблицами строк

 

[ Стабильный билд • ResourceType STBL • Вспомогательные типы данных и функции • Языковые параметры (локализации) ]

 

Програмный модуль и версия

DBPF2STBL.pas, rev.120825

 

Вспомогательные типы данных

 

record TDBPF2STBLHeader - заголовок STBL

  type
    TDBPF2STBLHeader = packed record
      // from http://www.modthesims.info/wiki.php?title=Sims_3:0x220557DA
      Sig: packed array[0..3] of BYTE; // 'STBL' = 0x4C425453
      Ver: BYTE;      // версия = 2
      Reserved1: packed array[0..1] of BYTE; // 0 ???
      Count: DWORD; // число записей в таблице
      Reserved2: packed array[0..5] of BYTE; // 0 ???
    end; // TSTBLHeader record

record TDBPF2STBLRecord - запись STBL

  type
    TDBPF2STBLRecord = packed record
      Hash64: UInt64; // QWORD  // fnv64 хэш локализуемой строки
      Lenght: DWORD; // длина замещающей строки
      Str: packed array of char; // замещающая строка
    end; // TSTBLRecord record

class TDBPF2STBLItem - класс-обертка для записи

Класс "Обертывает" запись данных, представляя текстовую строку в виде строки Delphi
  type
    TDBPF2STBLItem = class // класс-обертка для записи
      private
      protected
        FHash: UInt64; // QWORD  // fnv64 хэш локализуемой строки
        FValue: string;
      public
        property Hash: UInt64 read FHash write FHash;
        property Value: string read FValue write FValue;
    end;

Свойства

Hash: UInt64 – хэш исходной строки, чтение/запись;

Value: string – строка замены, чтение/запись;

 

array TDBPF2STBLItems - массив записей

  type
    TDBPF2STBLItems = packed array of TDBPF2STBLItem;

Основные типы данных

 

class TDBPF2STBL - таблица STBL

  type
    TDBPF2STBL = class(TDBPF2ItemDecoder)
    // see
      private
      protected
        FHeader: TDBPF2STBLHeader; // заголовок записи
        FItems: TDBPF2STBLItems; // индексная таблица
        FCount: integer;

        function Alloc: TDBPF2STBLItem; // добавляет запись в индексную таблицу и возвращает ее
      public
        constructor Create(AStream: TStream = nil); // декодирует данные записи
        destructor Destroy; override;

        procedure Decode(AStream: TStream); override; // декодирует данные записи
        procedure New(AStream: TStream); // связывает поток декодирования, создает пустую индексную таблицу
        procedure Commit; // кодирует данные записи
        procedure Clear; // очищает таблицу

        procedure Add(AHash: UInt64; Str: string);
        function Find(AHash: UInt64): string;

        property Count: integer read FCount;
        property Stream: TStream write Decode;
        property Items: TDBPF2STBLItems read FItems;
    end;

class TDBPF2STBLFinder - поддержка локализации строк

Класс TDBPF2STBLFinder обеспечивает кэшированный поиск строк локализации по алгоритму:

1. Ищем в прокэшированной таблице строк для заданной локали.

2. Если нечего не нашли декодируем другую таблицу строк для заданной локали и ищем в ней.

3. Если нечего не нашли повторяем шаги 1 и 2 для локали по умолчанию 0 ("en-us").

  type
    TDBPF2STBLFinder = class
      private
      protected
        FTblAct, FTblDef: TDBPF2STBL;
        FIActHi, FIActLo: DWORD;
        FIDefHi, FIDefLo: DWORD;
        FLocale: integer;
        FDecoder: TDBPF2Decoder;

        procedure SetDecoder(v: TDBPF2Decoder);
        procedure SetLocale(v: integer);

      public
        constructor Create(ALocaleId: integer; ADecoder: TDBPF2Decoder = nil);
        destructor Destroy(); override;

        procedure Reset;
        function Find(AHash: UInt64): string; overload;
        function Find(S: string): string; overload;

        property Decoder: TDBPF2Decoder read FDecoder write SetDecoder;
        property Locale: integer read FLocale write SetLocale;
    end;

Свойства

Decoder: DWORD – декодер (TDBPF2Decoder), с загруженным первичным потоком, чтение/запись;

Locale – идентификатор локали согласно приложению 2;

 

Методы

constructor Create(ALocaleId: integer; ADecoder: TDBPF2Decoder = nil) – конструктор класса;

destructor Destroy; override – деструктор класса;

 

procedure Reset – сбрасывает кэширование;

function Find(AHash: UInt64): string; overload – возвращает строку по ее хэшу;

function Find(S: string): string; overload – возвращает строку по значение нелокализованной строки;

 

Функции

function IsSTBL(AResourceType: DWORD): boolean; // возвращает true, если AResourceType STBL
function LocaleId(InstanceHi: DWORD): integer; // возвращает Id локали по InstanceHi ресурса
function FindLocalization(DBPF2Decoder: TDBPF2Decoder; AHash: UInt64; Locale: integer): string; // ищет локализацию по хэшу, устарело,
  // т.к. при нескольких вызовах работает гораздо медленнее TDBPF2STBLFinder.Find
Категория: S3DecoderLib | Добавил: crazylab (28.09.2013)
Просмотров: 784