1 (* Copyright (C) Doom 2D: Forever Developers
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License ONLY.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 {$INCLUDE ../shared/a_modes.inc}
22 {$IFDEF USE_MEMPOOL}mempool
,{$ENDIF}
26 TLevelTexture
= record
27 TextureName
: AnsiString; // as stored in wad
28 FullName
: AnsiString; // full path to texture // !!! merge it with TextureName
29 framesCount
, speed
: Byte;
32 TLevelTextureArray
= array of TLevelTexture
;
36 mCounter
: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
37 mSpeed
: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
38 mCurrentFrame
: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0)
39 mLoop
: Boolean; // Ïåðåõîäèòü íà ïåðâûé êàäð ïîñëå ïîñëåäíåãî?
40 mEnabled
: Boolean; // Ðàáîòà ðàçðåøåíà?
41 mPlayed
: Boolean; // Ïðîèãðàíà âñÿ õîòÿ áû ðàç?
42 mMinLength
: Byte; // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
43 mRevert
: Boolean; // Ñìåíà êàäðîâ îáðàòíàÿ?
48 constructor Create (aloop
: Boolean; aspeed
: Byte; len
: Integer);
55 procedure revert (r
: Boolean);
57 procedure saveState (st
: TStream
; mAlpha
: Byte; mBlending
: Boolean);
58 procedure loadState (st
: TStream
; out mAlpha
: Byte; out mBlending
: Boolean);
60 function totalFrames (): Integer; inline;
61 function IsInvalid (): Boolean;
62 function IsValid (): Boolean;
65 property played
: Boolean read mPlayed
;
66 property enabled
: Boolean read mEnabled
;
67 property isReverse
: Boolean read mRevert
;
68 property loop
: Boolean read mLoop write mLoop
;
69 property speed
: Byte read mSpeed write mSpeed
;
70 property minLength
: Byte read mMinLength write mMinLength
;
71 property currentFrame
: Integer read mCurrentFrame write mCurrentFrame
;
72 property currentCounter
: Byte read mCounter write mCounter
;
73 property counter
: Byte read mCounter
;
74 property length
: Integer read mLength
;
80 g_game
, e_log
, g_basic
, g_console
, wadreader
,
81 g_language
, utils
, xstreams
;
83 constructor TAnimState
.Create (aloop
: Boolean; aspeed
: Byte; len
: Integer);
85 Self
:= Default(TAnimState
);
98 procedure TAnimState
.Invalidate
;
100 Self
:= Default(TAnimState
);
103 procedure TAnimState
.update
;
105 if (not mEnabled
) then exit
;
109 if (mCounter
>= mSpeed
) then
113 if (mCurrentFrame
= 0) then
115 if (mLength
* mSpeed
+ mCounter
< mMinLength
) then exit
;
119 mPlayed
:= (mCurrentFrame
< 0);
124 mCurrentFrame
:= mLength
- 1
133 if (mCurrentFrame
= mLength
- 1) then
135 if (mLength
* mSpeed
+ mCounter
< mMinLength
) then exit
;
139 mPlayed
:= (mCurrentFrame
> mLength
- 1);
143 if mLoop
then mCurrentFrame
:= 0 else mCurrentFrame
-= 1;
151 procedure TAnimState
.reset
;
154 mCurrentFrame
:= mLength
- 1
161 procedure TAnimState
.disable
;
166 procedure TAnimState
.enable
;
171 procedure TAnimState
.revert (r
: Boolean);
177 function TAnimState
.totalFrames (): Integer; inline;
182 function TAnimState
.IsInvalid (): Boolean;
184 result
:= mLength
<= 0
187 function TAnimState
.IsValid (): Boolean;
189 result
:= mLength
> 0
192 procedure TAnimState
.saveState (st
: TStream
; mAlpha
: Byte; mBlending
: Boolean);
194 if (st
= nil) then exit
;
196 utils
.writeSign(st
, 'ANIM');
197 utils
.writeInt(st
, Byte(0)); // version
198 utils
.writeInt(st
, Byte(mCounter
));
199 utils
.writeInt(st
, LongInt(mCurrentFrame
));
200 utils
.writeBool(st
, mPlayed
);
201 utils
.writeInt(st
, Byte(mAlpha
));
202 utils
.writeInt(st
, Byte(mBlending
));
203 utils
.writeInt(st
, Byte(mSpeed
));
204 utils
.writeBool(st
, mLoop
);
205 utils
.writeBool(st
, mEnabled
);
206 utils
.writeInt(st
, Byte(mMinLength
));
207 utils
.writeBool(st
, mRevert
);
211 procedure TAnimState
.loadState (st
: TStream
; out mAlpha
: Byte; out mBlending
: Boolean);
213 if (st
= nil) then exit
;
215 if not utils
.checkSign(st
, 'ANIM') then raise XStreamError
.Create('animation chunk expected');
216 if (utils
.readByte(st
) <> 0) then raise XStreamError
.Create('invalid animation chunk version');
217 mCounter
:= utils
.readByte(st
);
218 mCurrentFrame
:= utils
.readLongInt(st
);
219 mPlayed
:= utils
.readBool(st
);
220 mAlpha
:= utils
.readByte(st
);
221 mBlending
:= utils
.readBool(st
);
222 mSpeed
:= utils
.readByte(st
);
223 mLoop
:= utils
.readBool(st
);
224 mEnabled
:= utils
.readBool(st
);
225 mMinLength
:= utils
.readByte(st
);
226 mRevert
:= utils
.readBool(st
);