DEADSOFTWARE

render: remove graphics data from TAnimationState
[d2df-sdl.git] / src / game / g_textures.pas
1 (* Copyright (C) Doom 2D: Forever Developers
2 *
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.
6 *
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.
11 *
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/>.
14 *)
15 {$INCLUDE ../shared/a_modes.inc}
16 unit g_textures;
18 interface
20 uses
21 SysUtils, Classes,
22 {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
23 g_base, MAPDEF;
25 type
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;
30 end;
32 TLevelTextureArray = array of TLevelTexture;
34 TAnimationState = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
35 private
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; // Ñìåíà êàäðîâ îáðàòíàÿ?
45 mLength: Integer;
47 public
48 constructor Create (aloop: Boolean; aspeed: Byte; len: Integer);
49 destructor Destroy (); override;
51 procedure reset ();
52 procedure update ();
53 procedure enable ();
54 procedure disable ();
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;
62 public
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;
73 end;
75 implementation
77 uses
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);
82 begin
83 assert(len >= 0);
84 mLength := len;
86 mMinLength := 0;
87 mLoop := aloop;
88 mSpeed := aspeed;
89 mEnabled := true;
90 mCurrentFrame := 0;
91 mPlayed := false;
92 end;
94 destructor TAnimationState.Destroy;
95 begin
96 inherited;
97 end;
99 procedure TAnimationState.update;
100 begin
101 if (not mEnabled) then exit;
103 mCounter += 1;
105 if (mCounter >= mSpeed) then
106 begin
107 // Îæèäàíèå ìåæäó êàäðàìè çàêîí÷èëîñü
108 // Îáðàòíûé ïîðÿäîê êàäðîâ?
109 if mRevert then
110 begin
111 // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
112 if (mCurrentFrame = 0) then
113 begin
114 if (mLength * mSpeed + mCounter < mMinLength) then exit;
115 end;
117 mCurrentFrame -= 1;
118 mPlayed := (mCurrentFrame < 0);
120 // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
121 if mPlayed then
122 begin
123 if mLoop then
124 mCurrentFrame := mLength - 1
125 else
126 mCurrentFrame += 1
127 end;
129 mCounter := 0;
130 end
131 else
132 begin
133 // Ïðÿìîé ïîðÿäîê êàäðîâ
134 // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
135 if (mCurrentFrame = mLength - 1) then
136 begin
137 if (mLength * mSpeed + mCounter < mMinLength) then exit;
138 end;
140 mCurrentFrame += 1;
141 mPlayed := (mCurrentFrame > mLength - 1);
143 // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
144 if mPlayed then
145 begin
146 if mLoop then mCurrentFrame := 0 else mCurrentFrame -= 1;
147 end;
149 mCounter := 0;
150 end;
151 end;
152 end;
154 procedure TAnimationState.reset;
155 begin
156 if mRevert then
157 mCurrentFrame := mLength - 1
158 else
159 mCurrentFrame := 0;
160 mCounter := 0;
161 mPlayed := false
162 end;
164 procedure TAnimationState.disable;
165 begin
166 mEnabled := false
167 end;
169 procedure TAnimationState.enable;
170 begin
171 mEnabled := true
172 end;
174 procedure TAnimationState.revert (r: Boolean);
175 begin
176 mRevert := r;
177 reset
178 end;
180 function TAnimationState.totalFrames (): Integer; inline;
181 begin
182 result := mLength
183 end;
185 procedure TAnimationState.saveState (st: TStream; mAlpha: Byte; mBlending: Boolean);
186 begin
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));
193 // Òåêóùèé êàäð
194 utils.writeInt(st, LongInt(mCurrentFrame));
195 // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
196 utils.writeBool(st, mPlayed);
197 // Alpha-êàíàë âñåé òåêñòóðû
198 utils.writeInt(st, Byte(mAlpha));
199 // Ðàçìûòèå òåêñòóðû
200 utils.writeInt(st, Byte(mBlending));
201 // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
202 utils.writeInt(st, Byte(mSpeed));
203 // Çàöèêëåíà ëè àíèìàöèÿ
204 utils.writeBool(st, mLoop);
205 // Âêëþ÷åíà ëè
206 utils.writeBool(st, mEnabled);
207 // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
208 utils.writeInt(st, Byte(mMinLength));
209 // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
210 utils.writeBool(st, mRevert);
211 end;
214 procedure TAnimationState.loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
215 begin
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);
222 // Òåêóùèé êàäð
223 mCurrentFrame := utils.readLongInt(st);
224 // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
225 mPlayed := utils.readBool(st);
226 // Alpha-êàíàë âñåé òåêñòóðû
227 mAlpha := utils.readByte(st);
228 // Ðàçìûòèå òåêñòóðû
229 mBlending := utils.readBool(st);
230 // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
231 mSpeed := utils.readByte(st);
232 // Çàöèêëåíà ëè àíèìàöèÿ
233 mLoop := utils.readBool(st);
234 // Âêëþ÷åíà ëè
235 mEnabled := utils.readBool(st);
236 // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
237 mMinLength := utils.readByte(st);
238 // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
239 mRevert := utils.readBool(st);
240 end;
242 end.