All pastes #768217 Raw Edit

Mine

public text v1 · immutable
#768217 ·published 2007-11-10 12:20 UTC
rendered paste body
unit IFPReader;

interface uses //...;

type
  TIFPHeader = array[0..3] of Char;

type
  TIFPReader = class
  private
    IFP: array of byte;
    IFPFile: file of Byte;
    IFPFilePos: integer;
    function GetIFPName: string;
    function GetIFPSize: Integer;
    function GetIFPHeader: TIFPHeader;
    function GetIFPAnimListNext: string;
    function GetIFPAnimCount: Integer;
  public
    destructor Destroy; override;
    function LoadIFP(Path: string): Boolean;
    procedure GetIFPAnimList(HList: HWND);
    property IFPName: string read GetIFPName;
    property IFPSize: Integer read GetIFPSize;
    property IFPHeader: TIFPHeader read GetIFPHeader;
    property IFPAnimListNext: string read GetIFPAnimListNext;
    property IFPAnimCount: Integer read GetIFPAnimCount;
    property FilePos: Integer read IFPFilePos write IFPFilePos;
  published
  end;

var
  GLOBALIFP: TIFPReader;

implementation //...

{ TIFPReader }

// frees the memory
destructor TIFPReader.Destroy;
begin
  SetLength(IFP, 0);
  inherited;
end;

// copies IFP file to the byte array
function TIFPReader.LoadIFP(Path: string): Boolean;
var
  aFileSize: Cardinal;
begin
  if FileExists(Path) then
  begin
    AssignFile(IFPFile, Path);
    Reset(IFPFile);
    aFileSize := FileSize(IFPFile);
    try
      SetLength(IFP, aFileSize);
      BlockRead(IFPFile, IFP[0], aFileSize);
      Result := True;
    finally
      CloseFile(IFPFile);
    end;
  end else Result := False;
end;

// reads a name of IFP (string beginning from the 20th byte of IFP)
function TIFPReader.GetIFPName: string;
begin
  Result := PChar(@IFP[20]);
end;

// returns total size of IFP (without header)
function TIFPReader.GetIFPSize: Integer;
begin
  Result := PLongInt(@IFP[4])^;
end;

// returns 'ANPK'
function TIFPReader.GetIFPHeader: TIFPHeader;
begin
  Q_MoveMem(@IFP[0], @Result[0], 4);
end;

// reads name of the next animation 
function TIFPReader.GetIFPAnimListNext: string;
var
  NameLen: integer;
begin
  NameLen := PLongInt(@IFP[FilePos])^;
  Inc(IFPFilePos, 4);
  System.SetString(Result, PChar(@IFP[FilePos]), NameLen);
  if NameLen mod 4 = 0 then
    Inc(IFPFilePos, NameLen)
  else
    Inc(IFPFilePos, (NameLen div 4 + 1) * 4);
  Inc(IFPFilePos, PLongInt(@IFP[FilePos + 4])^ + 12); // +DGAN
end;

// returns total number of animations in this IFP
function TIFPReader.GetIFPAnimCount: Integer;
begin
  Result := PLongInt(@IFP[16])^;
end;

// fills the listbox with animation names
procedure TIFPReader.GetIFPAnimList;
var
  I, Count: integer;
begin
  FilePos := 32;
  Count := IFPAnimCount - 1;
  ListBox_ClearItems(HList);
  for I := 0 to Count do
  begin
    ListBox_AddItem(HList, GetIFPAnimListNext);
  end;
end;
end.