DEADSOFTWARE

gl: draw console
[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 TAnimState = record
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 procedure Invalidate;
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;
61 function IsInvalid (): Boolean;
62 function IsValid (): Boolean;
64 public
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;
75 end;
77 implementation
79 uses
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);
84 begin
85 Self := Default(TAnimState);
87 assert(len >= 0);
88 mLength := len;
90 mMinLength := 0;
91 mLoop := aloop;
92 mSpeed := aspeed;
93 mEnabled := true;
94 mCurrentFrame := 0;
95 mPlayed := false;
96 end;
98 procedure TAnimState.Invalidate;
99 begin
100 Self := Default(TAnimState);
101 end;
103 procedure TAnimState.update;
104 begin
105 if (not mEnabled) then exit;
107 mCounter += 1;
109 if (mCounter >= mSpeed) then
110 begin
111 if mRevert then
112 begin
113 if (mCurrentFrame = 0) then
114 begin
115 if (mLength * mSpeed + mCounter < mMinLength) then exit;
116 end;
118 mCurrentFrame -= 1;
119 mPlayed := (mCurrentFrame < 0);
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 if (mCurrentFrame = mLength - 1) then
134 begin
135 if (mLength * mSpeed + mCounter < mMinLength) then exit;
136 end;
138 mCurrentFrame += 1;
139 mPlayed := (mCurrentFrame > mLength - 1);
141 if mPlayed then
142 begin
143 if mLoop then mCurrentFrame := 0 else mCurrentFrame -= 1;
144 end;
146 mCounter := 0;
147 end;
148 end;
149 end;
151 procedure TAnimState.reset;
152 begin
153 if mRevert then
154 mCurrentFrame := mLength - 1
155 else
156 mCurrentFrame := 0;
157 mCounter := 0;
158 mPlayed := false
159 end;
161 procedure TAnimState.disable;
162 begin
163 mEnabled := false
164 end;
166 procedure TAnimState.enable;
167 begin
168 mEnabled := true
169 end;
171 procedure TAnimState.revert (r: Boolean);
172 begin
173 mRevert := r;
174 reset
175 end;
177 function TAnimState.totalFrames (): Integer; inline;
178 begin
179 result := mLength
180 end;
182 function TAnimState.IsInvalid (): Boolean;
183 begin
184 result := mLength <= 0
185 end;
187 function TAnimState.IsValid (): Boolean;
188 begin
189 result := mLength > 0
190 end;
192 procedure TAnimState.saveState (st: TStream; mAlpha: Byte; mBlending: Boolean);
193 begin
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);
208 end;
211 procedure TAnimState.loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
212 begin
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);
227 end;
230 end.