//::///////////////////////////////////////////////
//:: NeverPas - Talk Table File Format
//:: nw_tlk.pas
//:: Copyright (c) 2003 Errant Logic.
//:://////////////////////////////////////////////
{
  Talk Table types and classes
}
//:://////////////////////////////////////////////
//:: Created By:
//:: Created On:   October 08, 2003
//:://////////////////////////////////////////////



unit nw_tlk;

interface

uses
  nw_generic,
  Dialogs,
  SysUtils,
  Classes;

type

  { TLK Header }
  nw_tlkHeader = packed record
    FileType:             array[0..3] of Char; // 'TLK '
    FileVersion:          array[0..3] of Char; // 'V3.0' currently
    LanguageID:           DWORD;
    StringCount:          DWORD;
    StringEntriesOffset:  DWORD;
  end;

  nw_tlkStringElement = packed record
    Flags:    DWORD;
    SoundResRef: array[0..15] of Char;
    VolumeVariance: DWORD; // unused
    PitchVariance: DWORD; // unused
    OffsetToString: DWORD;
    StringSize: DWORD;
    SoundLength : FLOAT;
  end;

  TTLKFile = class(TObject)
  private
    Header: nw_tlkHeader;
    StringDataTable: array of nw_tlkStringElement;
    FFilename: String;
    FStream: TFileStream;
    FLoaded: Boolean;
  public
    constructor Create;
    destructor Destroy; override;

    function Verify(Filetype, FileVersion: string): Boolean;

    function LoadTLK(Filename: string): Boolean;
    function GetTLKString(Index: DWORD; var s: string): Boolean;
  end;

implementation

constructor TTLKFile.Create;
begin
  inherited Create;
end;

destructor TTLKFile.Destroy;
begin
  if FStream <> nil then FStream.Free;
  inherited Destroy;
end;

function TTLKFile.LoadTLK(Filename: String): boolean;
var
  i: dword;
begin
  Result := False;
  if Not(FileExists(Filename)) then Exit;

  FStream := TFileStream.Create(Filename,fmOpenRead);

  if FStream.Size < SizeOf(nw_tlkHeader) then
  begin
    FStream.Free;
    Exit;
  end;

  FStream.Seek(0,soFromBeginning);
  FStream.Read(Header,SizeOf(nw_tlkHeader));


  if Not(Verify('TLK ','V3.0')) then
  begin
    FStream.Free;
    Exit;
  end;

  SetLength(StringDataTable,Header.StringCount);

//  FStream.Seek(SizeOf(nw_tlkHeader),soFromBeginning);
  for i := 0 to Header.StringCount - 1 do
  begin
    FStream.Read(StringDataTable[i],SizeOf(nw_tlkStringElement));

    if (i mod 1000) = 0 then
    begin
      ShowMessage('Index: ' + IntToStr(i) + #13 +
      'Offset: ' + IntToStr(StringDataTable[i].OffsetToString) + #13 +
      'Size: ' + IntToStr(StringDataTable[i].StringSize));
    end;

  end;


  FLoaded := True;
  FFilename := Filename;

end;

function TTLKFile.Verify(Filetype,FileVersion: string): Boolean;
begin
  Result := False;
  if (Header.FileType = Filetype) and (Header.FileVersion = FileVersion) then
    Result := True;
end;

function TTLKFile.GetTLKString(Index: DWORD; var s: string): Boolean;
begin
end;

end.
