2009-12-08 20:22:45 +01:00
|
|
|
(*
|
|
|
|
* CDDL HEADER START
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the terms of the
|
|
|
|
* Common Development and Distribution License, Version 1.0 only
|
|
|
|
* (the "License"). You may not use this file except in compliance
|
|
|
|
* with the License.
|
|
|
|
*
|
|
|
|
* You can obtain a copy of the license at
|
|
|
|
* http://www.opensource.org/licenses/cddl1.php.
|
|
|
|
* See the License for the specific language governing permissions
|
|
|
|
* and limitations under the License.
|
|
|
|
*
|
|
|
|
* When distributing Covered Code, include this CDDL HEADER in each
|
|
|
|
* file and include the License file at
|
|
|
|
* http://www.opensource.org/licenses/cddl1.php. If applicable,
|
|
|
|
* add the following below this CDDL HEADER, with the fields enclosed
|
|
|
|
* by brackets "[]" replaced with your own identifying * information:
|
|
|
|
* Portions Copyright [yyyy] [name of copyright owner]
|
|
|
|
*
|
|
|
|
* CDDL HEADER END
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Portions Copyright 2009 Andreas Schneider
|
|
|
|
*)
|
|
|
|
unit UAnimData;
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
uses
|
|
|
|
Classes, UMulBlock;
|
|
|
|
|
|
|
|
const
|
|
|
|
AnimDataSize = 68;
|
|
|
|
AnimDataGroupSize = 4 + (8 * AnimDataSize);
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
|
|
{ TAnimData }
|
|
|
|
|
|
|
|
TAnimData = class(TMulBlock)
|
|
|
|
constructor Create(AData: TStream);
|
|
|
|
function GetSize: Integer; override;
|
|
|
|
procedure Write(AData: TStream); override;
|
|
|
|
function Clone: TAnimData; override;
|
|
|
|
protected
|
|
|
|
FUnknown: Byte;
|
|
|
|
FFrameCount: Byte;
|
|
|
|
FFrameInterval: Byte;
|
|
|
|
FFrameStart: Byte;
|
|
|
|
public
|
2009-12-09 16:26:12 +01:00
|
|
|
FrameData: array[0..63] of ShortInt;
|
2009-12-08 20:22:45 +01:00
|
|
|
property Unknown: Byte read FUnknown write FUnknown;
|
|
|
|
property FrameCount: Byte read FFrameCount write FFrameCount;
|
|
|
|
property FrameInterval: Byte read FFrameInterval write FFrameInterval;
|
|
|
|
property FrameStart: Byte read FFrameStart write FFrameStart;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ TAnimDataGroup }
|
|
|
|
|
|
|
|
TAnimDataGroup = class(TMulBlock)
|
|
|
|
constructor Create(AData: TStream);
|
|
|
|
destructor Destroy; override;
|
|
|
|
function GetSize: Integer; override;
|
|
|
|
procedure Write(AData: TStream); override;
|
|
|
|
protected
|
|
|
|
FUnknown: LongInt;
|
|
|
|
AnimData: array[0..7] of TAnimData;
|
|
|
|
property Unknown: LongInt read FUnknown write FUnknown;
|
|
|
|
end;
|
|
|
|
|
2009-12-08 22:17:39 +01:00
|
|
|
function GetAnimDataOffset(AID: Integer): Integer;
|
2009-12-08 20:22:45 +01:00
|
|
|
|
|
|
|
implementation
|
|
|
|
|
2009-12-08 22:17:39 +01:00
|
|
|
function GetAnimDataOffset(AID: Integer): Integer;
|
2009-12-08 20:22:45 +01:00
|
|
|
var
|
|
|
|
group, tile: Integer;
|
|
|
|
begin
|
2009-12-08 22:17:39 +01:00
|
|
|
group := AID div 8;
|
|
|
|
tile := AID mod 8;
|
2009-12-08 20:22:45 +01:00
|
|
|
|
|
|
|
Result := group * AnimDataGroupSize + 4 + tile * AnimDataSize;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ TAnimData }
|
|
|
|
|
|
|
|
constructor TAnimData.Create(AData: TStream);
|
|
|
|
begin
|
|
|
|
if AData <> nil then
|
|
|
|
begin
|
|
|
|
AData.Read(FrameData, SizeOf(FrameData[0]) * Length(FrameData));
|
|
|
|
AData.Read(FUnknown, SizeOf(FUnknown));
|
|
|
|
AData.Read(FFrameCount, SizeOf(FFrameCount));
|
|
|
|
AData.Read(FFrameInterval, SizeOf(FFrameInterval));
|
|
|
|
AData.Read(FFrameStart, SizeOf(FFrameStart));
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TAnimData.Write(AData: TStream);
|
|
|
|
begin
|
|
|
|
AData.Write(FrameData, SizeOf(FrameData[0]) * Length(FrameData));
|
|
|
|
AData.Write(FUnknown, SizeOf(FUnknown));
|
|
|
|
AData.Write(FFrameCount, SizeOf(FFrameCount));
|
|
|
|
AData.Write(FFrameInterval, SizeOf(FFrameInterval));
|
|
|
|
AData.Write(FFrameStart, SizeOf(FFrameStart));
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TAnimData.Clone: TAnimData;
|
|
|
|
var
|
|
|
|
i: Integer;
|
|
|
|
begin
|
|
|
|
Result := TAnimData.Create(nil);
|
|
|
|
Result.FUnknown := FUnknown;
|
|
|
|
Result.FFrameCount := FFrameCount;
|
|
|
|
Result.FFrameInterval := FFrameInterval;
|
|
|
|
Result.FFrameStart := FFrameStart;
|
|
|
|
for i := 0 to 63 do
|
|
|
|
Result.FrameData[i] := FrameData[i];
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TAnimData.GetSize: Integer;
|
|
|
|
begin
|
|
|
|
Result := AnimDataSize;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ TAnimDataGroup }
|
|
|
|
|
|
|
|
constructor TAnimDataGroup.Create(AData: TStream);
|
|
|
|
var
|
|
|
|
i: Integer;
|
|
|
|
begin
|
|
|
|
if AData <> nil then
|
|
|
|
begin
|
|
|
|
AData.Read(FUnknown, SizeOf(FUnknown));
|
|
|
|
end;
|
|
|
|
for i := 0 to 7 do
|
|
|
|
AnimData[i] := TAnimData.Create(AData);
|
|
|
|
end;
|
|
|
|
|
|
|
|
destructor TAnimDataGroup.Destroy;
|
|
|
|
var
|
|
|
|
i: Integer;
|
|
|
|
begin
|
|
|
|
for i := 0 to 7 do
|
|
|
|
AnimData[i].Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TAnimDataGroup.Write(AData: TStream);
|
|
|
|
var
|
|
|
|
i: Integer;
|
|
|
|
begin
|
|
|
|
AData.Write(FUnknown, SizeOf(FUnknown));
|
|
|
|
for i := 0 to 7 do
|
|
|
|
AnimData[i].Write(AData);
|
|
|
|
end;
|
|
|
|
|
|
|
|
function TAnimDataGroup.GetSize: Integer;
|
|
|
|
begin
|
|
|
|
Result := AnimDataGroupSize;
|
|
|
|
end;
|
|
|
|
|
|
|
|
end.
|
|
|
|
|