CentrED/UOLib/UAnimData.pas

165 lines
3.9 KiB
Plaintext

(*
* 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
FrameData: array[0..63] of Byte;
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;
function GetAnimDataOffset(AID: Integer): Integer;
implementation
function GetAnimDataOffset(AID: Integer): Integer;
var
group, tile: Integer;
begin
group := AID div 8;
tile := AID mod 8;
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.