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
;
34 TAnimationState
= class{$IFDEF USE_MEMPOOL}(TPoolObject
){$ENDIF}
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);
49 destructor Destroy (); override;
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;
63 property played
: Boolean read mPlayed
;
64 property enabled
: Boolean read mEnabled
;
65 property isReverse
: Boolean read mRevert
;
66 property loop
: Boolean read mLoop write mLoop
;
67 property speed
: Byte read mSpeed write mSpeed
;
68 property minLength
: Byte read mMinLength write mMinLength
;
69 property currentFrame
: Integer read mCurrentFrame write mCurrentFrame
;
70 property currentCounter
: Byte read mCounter write mCounter
;
71 property counter
: Byte read mCounter
;
72 property length
: Integer read mLength
;
78 g_game
, e_log
, g_basic
, g_console
, wadreader
,
79 g_language
, utils
, xstreams
;
81 constructor TAnimationState
.Create (aloop
: Boolean; aspeed
: Byte; len
: Integer);
94 destructor TAnimationState
.Destroy
;
99 procedure TAnimationState
.update
;
101 if (not mEnabled
) then exit
;
105 if (mCounter
>= mSpeed
) then
107 // Îæèäàíèå ìåæäó êàäðàìè çàêîí÷èëîñü
108 // Îáðàòíûé ïîðÿäîê êàäðîâ?
111 // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
112 if (mCurrentFrame
= 0) then
114 if (mLength
* mSpeed
+ mCounter
< mMinLength
) then exit
;
118 mPlayed
:= (mCurrentFrame
< 0);
120 // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
124 mCurrentFrame
:= mLength
- 1
133 // Ïðÿìîé ïîðÿäîê êàäðîâ
134 // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
135 if (mCurrentFrame
= mLength
- 1) then
137 if (mLength
* mSpeed
+ mCounter
< mMinLength
) then exit
;
141 mPlayed
:= (mCurrentFrame
> mLength
- 1);
143 // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
146 if mLoop
then mCurrentFrame
:= 0 else mCurrentFrame
-= 1;
154 procedure TAnimationState
.reset
;
157 mCurrentFrame
:= mLength
- 1
164 procedure TAnimationState
.disable
;
169 procedure TAnimationState
.enable
;
174 procedure TAnimationState
.revert (r
: Boolean);
180 function TAnimationState
.totalFrames (): Integer; inline;
185 procedure TAnimationState
.saveState (st
: TStream
; mAlpha
: Byte; mBlending
: Boolean);
187 if (st
= nil) then exit
;
189 utils
.writeSign(st
, 'ANIM');
190 utils
.writeInt(st
, Byte(0)); // version
191 // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
192 utils
.writeInt(st
, Byte(mCounter
));
194 utils
.writeInt(st
, LongInt(mCurrentFrame
));
195 // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
196 utils
.writeBool(st
, mPlayed
);
197 // Alpha-êàíàë âñåé òåêñòóðû
198 utils
.writeInt(st
, Byte(mAlpha
));
200 utils
.writeInt(st
, Byte(mBlending
));
201 // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
202 utils
.writeInt(st
, Byte(mSpeed
));
203 // Çàöèêëåíà ëè àíèìàöèÿ
204 utils
.writeBool(st
, mLoop
);
206 utils
.writeBool(st
, mEnabled
);
207 // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
208 utils
.writeInt(st
, Byte(mMinLength
));
209 // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
210 utils
.writeBool(st
, mRevert
);
214 procedure TAnimationState
.loadState (st
: TStream
; out mAlpha
: Byte; out mBlending
: Boolean);
216 if (st
= nil) then exit
;
218 if not utils
.checkSign(st
, 'ANIM') then raise XStreamError
.Create('animation chunk expected');
219 if (utils
.readByte(st
) <> 0) then raise XStreamError
.Create('invalid animation chunk version');
220 // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
221 mCounter
:= utils
.readByte(st
);
223 mCurrentFrame
:= utils
.readLongInt(st
);
224 // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
225 mPlayed
:= utils
.readBool(st
);
226 // Alpha-êàíàë âñåé òåêñòóðû
227 mAlpha
:= utils
.readByte(st
);
229 mBlending
:= utils
.readBool(st
);
230 // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
231 mSpeed
:= utils
.readByte(st
);
232 // Çàöèêëåíà ëè àíèìàöèÿ
233 mLoop
:= utils
.readBool(st
);
235 mEnabled
:= utils
.readBool(st
);
236 // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
237 mMinLength
:= utils
.readByte(st
);
238 // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
239 mRevert
:= utils
.readBool(st
);