DEADSOFTWARE

render: use TAnimationState for items
[d2df-sdl.git] / src / game / opengl / r_items.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 r_items;
18 interface
20 uses MAPDEF; // ITEM_MAX
22 procedure r_Items_Load;
23 procedure r_Items_Free;
24 procedure r_Items_Draw;
25 procedure r_Items_DrawDrop;
27 var
28 gItemsTexturesID: Array [1..ITEM_MAX] of DWORD;
30 implementation
32 uses
33 SysUtils, Classes, Math,
34 r_graphics, r_animations, r_textures,
35 g_base, g_basic, g_game, g_options,
36 g_items
37 ;
39 var
40 itemFrames: Array [0..ITEM_MAX] of DWORD;
42 procedure r_Items_Load;
43 begin
44 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_BLUESPHERE', GameWAD+':TEXTURES\SBLUE', 32, 32, 4, True);
45 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_WHITESPHERE', GameWAD+':TEXTURES\SWHITE', 32, 32, 4, True);
46 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORGREEN', GameWAD+':TEXTURES\ARMORGREEN', 32, 16, 3, True);
47 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORBLUE', GameWAD+':TEXTURES\ARMORBLUE', 32, 16, 3, True);
48 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_JETPACK', GameWAD+':TEXTURES\JETPACK', 32, 32, 3, True);
49 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVUL', GameWAD+':TEXTURES\INVUL', 32, 32, 4, True);
50 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVIS', GameWAD+':TEXTURES\INVIS', 32, 32, 4, True);
51 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_RESPAWN', GameWAD+':TEXTURES\ITEMRESPAWN', 32, 32, 5, True);
52 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_BOTTLE', GameWAD+':TEXTURES\BOTTLE', 16, 32, 4, True);
53 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_HELMET', GameWAD+':TEXTURES\HELMET', 16, 16, 4, True);
54 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_RED', GameWAD+':TEXTURES\FLAGRED', 64, 64, 5, False);
55 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_BLUE', GameWAD+':TEXTURES\FLAGBLUE', 64, 64, 5, False);
56 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_DOM', GameWAD+':TEXTURES\FLAGDOM', 64, 64, 5, False);
57 g_Texture_CreateWADEx('ITEM_MEDKIT_SMALL', GameWAD+':TEXTURES\MED1');
58 g_Texture_CreateWADEx('ITEM_MEDKIT_LARGE', GameWAD+':TEXTURES\MED2');
59 g_Texture_CreateWADEx('ITEM_WEAPON_SAW', GameWAD+':TEXTURES\SAW');
60 g_Texture_CreateWADEx('ITEM_WEAPON_PISTOL', GameWAD+':TEXTURES\PISTOL');
61 g_Texture_CreateWADEx('ITEM_WEAPON_KASTET', GameWAD+':TEXTURES\KASTET');
62 g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN1', GameWAD+':TEXTURES\SHOTGUN1');
63 g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN2', GameWAD+':TEXTURES\SHOTGUN2');
64 g_Texture_CreateWADEx('ITEM_WEAPON_CHAINGUN', GameWAD+':TEXTURES\MGUN');
65 g_Texture_CreateWADEx('ITEM_WEAPON_ROCKETLAUNCHER', GameWAD+':TEXTURES\RLAUNCHER');
66 g_Texture_CreateWADEx('ITEM_WEAPON_PLASMA', GameWAD+':TEXTURES\PGUN');
67 g_Texture_CreateWADEx('ITEM_WEAPON_BFG', GameWAD+':TEXTURES\BFG');
68 g_Texture_CreateWADEx('ITEM_WEAPON_SUPERPULEMET', GameWAD+':TEXTURES\SPULEMET');
69 g_Texture_CreateWADEx('ITEM_WEAPON_FLAMETHROWER', GameWAD+':TEXTURES\FLAMETHROWER');
70 g_Texture_CreateWADEx('ITEM_AMMO_BULLETS', GameWAD+':TEXTURES\CLIP');
71 g_Texture_CreateWADEx('ITEM_AMMO_BULLETS_BOX', GameWAD+':TEXTURES\AMMO');
72 g_Texture_CreateWADEx('ITEM_AMMO_SHELLS', GameWAD+':TEXTURES\SHELL1');
73 g_Texture_CreateWADEx('ITEM_AMMO_SHELLS_BOX', GameWAD+':TEXTURES\SHELL2');
74 g_Texture_CreateWADEx('ITEM_AMMO_ROCKET', GameWAD+':TEXTURES\ROCKET');
75 g_Texture_CreateWADEx('ITEM_AMMO_ROCKET_BOX', GameWAD+':TEXTURES\ROCKETS');
76 g_Texture_CreateWADEx('ITEM_AMMO_CELL', GameWAD+':TEXTURES\CELL');
77 g_Texture_CreateWADEx('ITEM_AMMO_CELL_BIG', GameWAD+':TEXTURES\CELL2');
78 g_Texture_CreateWADEx('ITEM_AMMO_FUELCAN', GameWAD+':TEXTURES\FUELCAN');
79 g_Texture_CreateWADEx('ITEM_AMMO_BACKPACK', GameWAD+':TEXTURES\BPACK');
80 g_Texture_CreateWADEx('ITEM_KEY_RED', GameWAD+':TEXTURES\KEYR');
81 g_Texture_CreateWADEx('ITEM_KEY_GREEN', GameWAD+':TEXTURES\KEYG');
82 g_Texture_CreateWADEx('ITEM_KEY_BLUE', GameWAD+':TEXTURES\KEYB');
83 g_Texture_CreateWADEx('ITEM_OXYGEN', GameWAD+':TEXTURES\OXYGEN');
84 g_Texture_CreateWADEx('ITEM_SUIT', GameWAD+':TEXTURES\SUIT');
85 g_Texture_CreateWADEx('ITEM_WEAPON_KASTET', GameWAD+':TEXTURES\KASTET');
86 g_Texture_CreateWADEx('ITEM_MEDKIT_BLACK', GameWAD+':TEXTURES\BMED');
87 //
88 g_Texture_Get('ITEM_MEDKIT_SMALL', gItemsTexturesID[ITEM_MEDKIT_SMALL]);
89 g_Texture_Get('ITEM_MEDKIT_LARGE', gItemsTexturesID[ITEM_MEDKIT_LARGE]);
90 g_Texture_Get('ITEM_MEDKIT_BLACK', gItemsTexturesID[ITEM_MEDKIT_BLACK]);
91 g_Texture_Get('ITEM_SUIT', gItemsTexturesID[ITEM_SUIT]);
92 g_Texture_Get('ITEM_OXYGEN', gItemsTexturesID[ITEM_OXYGEN]);
93 g_Texture_Get('ITEM_WEAPON_SAW', gItemsTexturesID[ITEM_WEAPON_SAW]);
94 g_Texture_Get('ITEM_WEAPON_SHOTGUN1', gItemsTexturesID[ITEM_WEAPON_SHOTGUN1]);
95 g_Texture_Get('ITEM_WEAPON_SHOTGUN2', gItemsTexturesID[ITEM_WEAPON_SHOTGUN2]);
96 g_Texture_Get('ITEM_WEAPON_CHAINGUN', gItemsTexturesID[ITEM_WEAPON_CHAINGUN]);
97 g_Texture_Get('ITEM_WEAPON_ROCKETLAUNCHER', gItemsTexturesID[ITEM_WEAPON_ROCKETLAUNCHER]);
98 g_Texture_Get('ITEM_WEAPON_PLASMA', gItemsTexturesID[ITEM_WEAPON_PLASMA]);
99 g_Texture_Get('ITEM_WEAPON_BFG', gItemsTexturesID[ITEM_WEAPON_BFG]);
100 g_Texture_Get('ITEM_WEAPON_SUPERPULEMET', gItemsTexturesID[ITEM_WEAPON_SUPERPULEMET]);
101 g_Texture_Get('ITEM_WEAPON_FLAMETHROWER', gItemsTexturesID[ITEM_WEAPON_FLAMETHROWER]);
102 g_Texture_Get('ITEM_AMMO_BULLETS', gItemsTexturesID[ITEM_AMMO_BULLETS]);
103 g_Texture_Get('ITEM_AMMO_BULLETS_BOX', gItemsTexturesID[ITEM_AMMO_BULLETS_BOX]);
104 g_Texture_Get('ITEM_AMMO_SHELLS', gItemsTexturesID[ITEM_AMMO_SHELLS]);
105 g_Texture_Get('ITEM_AMMO_SHELLS_BOX', gItemsTexturesID[ITEM_AMMO_SHELLS_BOX]);
106 g_Texture_Get('ITEM_AMMO_ROCKET', gItemsTexturesID[ITEM_AMMO_ROCKET]);
107 g_Texture_Get('ITEM_AMMO_ROCKET_BOX', gItemsTexturesID[ITEM_AMMO_ROCKET_BOX]);
108 g_Texture_Get('ITEM_AMMO_CELL', gItemsTexturesID[ITEM_AMMO_CELL]);
109 g_Texture_Get('ITEM_AMMO_CELL_BIG', gItemsTexturesID[ITEM_AMMO_CELL_BIG]);
110 g_Texture_Get('ITEM_AMMO_FUELCAN', gItemsTexturesID[ITEM_AMMO_FUELCAN]);
111 g_Texture_Get('ITEM_AMMO_BACKPACK', gItemsTexturesID[ITEM_AMMO_BACKPACK]);
112 g_Texture_Get('ITEM_KEY_RED', gItemsTexturesID[ITEM_KEY_RED]);
113 g_Texture_Get('ITEM_KEY_GREEN', gItemsTexturesID[ITEM_KEY_GREEN]);
114 g_Texture_Get('ITEM_KEY_BLUE', gItemsTexturesID[ITEM_KEY_BLUE]);
115 g_Texture_Get('ITEM_WEAPON_KASTET', gItemsTexturesID[ITEM_WEAPON_KASTET]);
116 g_Texture_Get('ITEM_WEAPON_PISTOL', gItemsTexturesID[ITEM_WEAPON_PISTOL]);
117 // Frames
118 g_Frames_Get(itemFrames[ITEM_ARMOR_GREEN], 'FRAMES_ITEM_ARMORGREEN');
119 g_Frames_Get(itemFrames[ITEM_ARMOR_BLUE], 'FRAMES_ITEM_ARMORBLUE');
120 g_Frames_Get(itemFrames[ITEM_JETPACK], 'FRAMES_ITEM_JETPACK');
121 g_Frames_Get(itemFrames[ITEM_SPHERE_BLUE], 'FRAMES_ITEM_BLUESPHERE');
122 g_Frames_Get(itemFrames[ITEM_SPHERE_WHITE], 'FRAMES_ITEM_WHITESPHERE');
123 g_Frames_Get(itemFrames[ITEM_INVUL], 'FRAMES_ITEM_INVUL');
124 g_Frames_Get(itemFrames[ITEM_INVIS], 'FRAMES_ITEM_INVIS');
125 g_Frames_Get(itemFrames[ITEM_BOTTLE], 'FRAMES_ITEM_BOTTLE');
126 g_Frames_Get(itemFrames[ITEM_HELMET], 'FRAMES_ITEM_HELMET');
127 end;
129 procedure r_Items_Free;
130 begin
131 g_Frames_DeleteByName('FRAMES_ITEM_BLUESPHERE');
132 g_Frames_DeleteByName('FRAMES_ITEM_WHITESPHERE');
133 g_Frames_DeleteByName('FRAMES_ITEM_ARMORGREEN');
134 g_Frames_DeleteByName('FRAMES_ITEM_ARMORBLUE');
135 g_Frames_DeleteByName('FRAMES_ITEM_JETPACK');
136 g_Frames_DeleteByName('FRAMES_ITEM_INVUL');
137 g_Frames_DeleteByName('FRAMES_ITEM_INVIS');
138 g_Frames_DeleteByName('FRAMES_ITEM_RESPAWN');
139 g_Frames_DeleteByName('FRAMES_ITEM_BOTTLE');
140 g_Frames_DeleteByName('FRAMES_ITEM_HELMET');
141 g_Frames_DeleteByName('FRAMES_FLAG_RED');
142 g_Frames_DeleteByName('FRAMES_FLAG_BLUE');
143 g_Frames_DeleteByName('FRAMES_FLAG_DOM');
144 g_Texture_Delete('ITEM_MEDKIT_SMALL');
145 g_Texture_Delete('ITEM_MEDKIT_LARGE');
146 g_Texture_Delete('ITEM_WEAPON_SAW');
147 g_Texture_Delete('ITEM_WEAPON_PISTOL');
148 g_Texture_Delete('ITEM_WEAPON_KASTET');
149 g_Texture_Delete('ITEM_WEAPON_SHOTGUN1');
150 g_Texture_Delete('ITEM_WEAPON_SHOTGUN2');
151 g_Texture_Delete('ITEM_WEAPON_CHAINGUN');
152 g_Texture_Delete('ITEM_WEAPON_ROCKETLAUNCHER');
153 g_Texture_Delete('ITEM_WEAPON_PLASMA');
154 g_Texture_Delete('ITEM_WEAPON_BFG');
155 g_Texture_Delete('ITEM_WEAPON_SUPERPULEMET');
156 g_Texture_Delete('ITEM_WEAPON_FLAMETHROWER');
157 g_Texture_Delete('ITEM_AMMO_BULLETS');
158 g_Texture_Delete('ITEM_AMMO_BULLETS_BOX');
159 g_Texture_Delete('ITEM_AMMO_SHELLS');
160 g_Texture_Delete('ITEM_AMMO_SHELLS_BOX');
161 g_Texture_Delete('ITEM_AMMO_ROCKET');
162 g_Texture_Delete('ITEM_AMMO_ROCKET_BOX');
163 g_Texture_Delete('ITEM_AMMO_CELL');
164 g_Texture_Delete('ITEM_AMMO_CELL_BIG');
165 g_Texture_Delete('ITEM_AMMO_FUELCAN');
166 g_Texture_Delete('ITEM_AMMO_BACKPACK');
167 g_Texture_Delete('ITEM_KEY_RED');
168 g_Texture_Delete('ITEM_KEY_GREEN');
169 g_Texture_Delete('ITEM_KEY_BLUE');
170 g_Texture_Delete('ITEM_OXYGEN');
171 g_Texture_Delete('ITEM_SUIT');
172 g_Texture_Delete('ITEM_WEAPON_KASTET');
173 g_Texture_Delete('ITEM_MEDKIT_BLACK');
174 end;
176 procedure itemsDrawInternal (dropflag: Boolean);
177 var
178 i, fX, fY: Integer;
179 it: PItem;
180 begin
181 if (ggItems = nil) then exit;
183 for i := 0 to High(ggItems) do
184 begin
185 it := @ggItems[i];
186 if (not it.used) or (it.ItemType = ITEM_NONE) then continue; // just in case
187 if not it.alive then continue;
188 if (it.dropped <> dropflag) then continue;
190 with it^ do
191 begin
192 if g_Collide(Obj.X, Obj.Y, Obj.Rect.Width, Obj.Rect.Height, sX, sY, sWidth, sHeight) then
193 begin
194 Obj.lerp(gLerpFactor, fX, fY);
195 if (Animation = nil) then
196 begin
197 e_Draw(gItemsTexturesID[ItemType], fX, fY, 0, true, false);
198 end
199 else if itemFrames[it.ItemType] <> 0 then
200 begin
201 r_AnimationState_Draw(itemFrames[it.ItemType], Animation, fX, fY, TMirrorType.None)
202 end;
204 if g_debug_Frames then
205 begin
206 e_DrawQuad(Obj.X+Obj.Rect.X,
207 Obj.Y+Obj.Rect.Y,
208 Obj.X+Obj.Rect.X+Obj.Rect.Width-1,
209 Obj.Y+Obj.Rect.Y+Obj.Rect.Height-1,
210 0, 255, 0);
211 end;
212 end;
213 end;
214 end;
215 end;
217 procedure r_Items_Draw;
218 begin
219 itemsDrawInternal(false);
220 end;
222 procedure r_Items_DrawDrop;
223 begin
224 itemsDrawInternal(true);
225 end;
227 end.