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
;
77 mCounter
: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
78 mSpeed
: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
79 mCurrentFrame
: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0)
80 mLoop
: Boolean; // Ïåðåõîäèòü íà ïåðâûé êàäð ïîñëå ïîñëåäíåãî?
81 mEnabled
: Boolean; // Ðàáîòà ðàçðåøåíà?
82 mPlayed
: Boolean; // Ïðîèãðàíà âñÿ õîòÿ áû ðàç?
83 mMinLength
: Byte; // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
84 mRevert
: Boolean; // Ñìåíà êàäðîâ îáðàòíàÿ?
89 constructor Create (aloop
: Boolean; aspeed
: Byte; len
: Integer);
96 procedure revert (r
: Boolean);
98 procedure saveState (st
: TStream
; mAlpha
: Byte; mBlending
: Boolean);
99 procedure loadState (st
: TStream
; out mAlpha
: Byte; out mBlending
: Boolean);
101 function totalFrames (): Integer; inline;
104 property played
: Boolean read mPlayed
;
105 property enabled
: Boolean read mEnabled
;
106 property isReverse
: Boolean read mRevert
;
107 property loop
: Boolean read mLoop write mLoop
;
108 property speed
: Byte read mSpeed write mSpeed
;
109 property minLength
: Byte read mMinLength write mMinLength
;
110 property currentFrame
: Integer read mCurrentFrame write mCurrentFrame
;
111 property currentCounter
: Byte read mCounter write mCounter
;
112 property counter
: Byte read mCounter
;
113 property length
: Integer read mLength
;
119 g_game
, e_log
, g_basic
, g_console
, wadreader
,
120 g_language
, utils
, xstreams
;
122 constructor TAnimationState
.Create (aloop
: Boolean; aspeed
: Byte; len
: Integer);
135 destructor TAnimationState
.Destroy
;
140 procedure TAnimationState
.update
;
142 if (not mEnabled
) then exit
;
146 if (mCounter
>= mSpeed
) then
148 // Îæèäàíèå ìåæäó êàäðàìè çàêîí÷èëîñü
149 // Îáðàòíûé ïîðÿäîê êàäðîâ?
152 // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
153 if (mCurrentFrame
= 0) then
155 if (mLength
* mSpeed
+ mCounter
< mMinLength
) then exit
;
159 mPlayed
:= (mCurrentFrame
< 0);
161 // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
165 mCurrentFrame
:= mLength
- 1
174 // Ïðÿìîé ïîðÿäîê êàäðîâ
175 // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
176 if (mCurrentFrame
= mLength
- 1) then
178 if (mLength
* mSpeed
+ mCounter
< mMinLength
) then exit
;
182 mPlayed
:= (mCurrentFrame
> mLength
- 1);
184 // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
187 if mLoop
then mCurrentFrame
:= 0 else mCurrentFrame
-= 1;
195 procedure TAnimationState
.reset
;
198 mCurrentFrame
:= mLength
- 1
205 procedure TAnimationState
.disable
;
210 procedure TAnimationState
.enable
;
215 procedure TAnimationState
.revert (r
: Boolean);
221 function TAnimationState
.totalFrames (): Integer; inline;
226 procedure TAnimationState
.saveState (st
: TStream
; mAlpha
: Byte; mBlending
: Boolean);
228 if (st
= nil) then exit
;
230 utils
.writeSign(st
, 'ANIM');
231 utils
.writeInt(st
, Byte(0)); // version
232 // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
233 utils
.writeInt(st
, Byte(mCounter
));
235 utils
.writeInt(st
, LongInt(mCurrentFrame
));
236 // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
237 utils
.writeBool(st
, mPlayed
);
238 // Alpha-êàíàë âñåé òåêñòóðû
239 utils
.writeInt(st
, Byte(mAlpha
));
241 utils
.writeInt(st
, Byte(mBlending
));
242 // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
243 utils
.writeInt(st
, Byte(mSpeed
));
244 // Çàöèêëåíà ëè àíèìàöèÿ
245 utils
.writeBool(st
, mLoop
);
247 utils
.writeBool(st
, mEnabled
);
248 // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
249 utils
.writeInt(st
, Byte(mMinLength
));
250 // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
251 utils
.writeBool(st
, mRevert
);
255 procedure TAnimationState
.loadState (st
: TStream
; out mAlpha
: Byte; out mBlending
: Boolean);
257 if (st
= nil) then exit
;
259 if not utils
.checkSign(st
, 'ANIM') then raise XStreamError
.Create('animation chunk expected');
260 if (utils
.readByte(st
) <> 0) then raise XStreamError
.Create('invalid animation chunk version');
261 // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
262 mCounter
:= utils
.readByte(st
);
264 mCurrentFrame
:= utils
.readLongInt(st
);
265 // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
266 mPlayed
:= utils
.readBool(st
);
267 // Alpha-êàíàë âñåé òåêñòóðû
268 mAlpha
:= utils
.readByte(st
);
270 mBlending
:= utils
.readBool(st
);
271 // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
272 mSpeed
:= utils
.readByte(st
);
273 // Çàöèêëåíà ëè àíèìàöèÿ
274 mLoop
:= utils
.readBool(st
);
276 mEnabled
:= utils
.readBool(st
);
277 // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
278 mMinLength
:= utils
.readByte(st
);
279 // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
280 mRevert
:= utils
.readBool(st
);
286 constructor TAnimState
.Create (aloop
: Boolean; aspeed
: Byte; len
: Integer);
299 procedure TAnimState
.Destroy
;
301 Self
:= Default(TAnimState
);
304 procedure TAnimState
.update
;
306 if (not mEnabled
) then exit
;
310 if (mCounter
>= mSpeed
) then
314 if (mCurrentFrame
= 0) then
316 if (mLength
* mSpeed
+ mCounter
< mMinLength
) then exit
;
320 mPlayed
:= (mCurrentFrame
< 0);
325 mCurrentFrame
:= mLength
- 1
334 if (mCurrentFrame
= mLength
- 1) then
336 if (mLength
* mSpeed
+ mCounter
< mMinLength
) then exit
;
340 mPlayed
:= (mCurrentFrame
> mLength
- 1);
344 if mLoop
then mCurrentFrame
:= 0 else mCurrentFrame
-= 1;
352 procedure TAnimState
.reset
;
355 mCurrentFrame
:= mLength
- 1
362 procedure TAnimState
.disable
;
367 procedure TAnimState
.enable
;
372 procedure TAnimState
.revert (r
: Boolean);
378 function TAnimState
.totalFrames (): Integer; inline;
383 procedure TAnimState
.saveState (st
: TStream
; mAlpha
: Byte; mBlending
: Boolean);
385 if (st
= nil) then exit
;
387 utils
.writeSign(st
, 'ANIM');
388 utils
.writeInt(st
, Byte(0)); // version
389 utils
.writeInt(st
, Byte(mCounter
));
390 utils
.writeInt(st
, LongInt(mCurrentFrame
));
391 utils
.writeBool(st
, mPlayed
);
392 utils
.writeInt(st
, Byte(mAlpha
));
393 utils
.writeInt(st
, Byte(mBlending
));
394 utils
.writeInt(st
, Byte(mSpeed
));
395 utils
.writeBool(st
, mLoop
);
396 utils
.writeBool(st
, mEnabled
);
397 utils
.writeInt(st
, Byte(mMinLength
));
398 utils
.writeBool(st
, mRevert
);
402 procedure TAnimState
.loadState (st
: TStream
; out mAlpha
: Byte; out mBlending
: Boolean);
404 if (st
= nil) then exit
;
406 if not utils
.checkSign(st
, 'ANIM') then raise XStreamError
.Create('animation chunk expected');
407 if (utils
.readByte(st
) <> 0) then raise XStreamError
.Create('invalid animation chunk version');
408 mCounter
:= utils
.readByte(st
);
409 mCurrentFrame
:= utils
.readLongInt(st
);
410 mPlayed
:= utils
.readBool(st
);
411 mAlpha
:= utils
.readByte(st
);
412 mBlending
:= utils
.readBool(st
);
413 mSpeed
:= utils
.readByte(st
);
414 mLoop
:= utils
.readBool(st
);
415 mEnabled
:= utils
.readBool(st
);
416 mMinLength
:= utils
.readByte(st
);
417 mRevert
:= utils
.readBool(st
);