1 /* Catacomb Armageddon Source Code
\r
2 * Copyright (C) 1993-2014 Flat Rock Software
\r
4 * This program is free software; you can redistribute it and/or modify
\r
5 * it under the terms of the GNU General Public License as published by
\r
6 * the Free Software Foundation; either version 2 of the License, or
\r
7 * (at your option) any later version.
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License along
\r
15 * with this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
25 =============================================================================
\r
29 =============================================================================
\r
34 //-------------------------------------------------------------------------
\r
38 //-------------------------------------------------------------------------
\r
42 //-------------------------------------------------------------------------
\r
44 //-------------------------------------------------------------------------
\r
46 void SpawnArch(int tilex, int tiley, int num);
\r
48 extern statetype s_arch_1;
\r
49 extern statetype s_arch_2;
\r
50 extern statetype s_arch_3;
\r
51 extern statetype s_arch_4;
\r
52 extern statetype s_arch_5;
\r
53 extern statetype s_arch_6;
\r
54 extern statetype s_arch_7;
\r
55 extern statetype s_arch_8;
\r
56 extern statetype s_arch_9;
\r
57 extern statetype s_arch_10;
\r
58 extern statetype s_arch_11;
\r
59 extern statetype s_arch_12;
\r
60 extern statetype s_arch_13;
\r
62 statetype s_arch_1 = {ARCH1PIC, 20, NULL, &s_arch_1};
\r
63 statetype s_arch_2 = {ARCH2PIC, 20, NULL, &s_arch_2};
\r
64 statetype s_arch_3 = {ARCH3PIC, 20, NULL, &s_arch_3};
\r
65 statetype s_arch_4 = {ARCH4PIC, 20, NULL, &s_arch_4};
\r
66 statetype s_arch_5 = {ARCH5PIC, 20, NULL, &s_arch_5};
\r
67 statetype s_arch_6 = {ARCH6PIC, 20, NULL, &s_arch_6};
\r
68 statetype s_arch_7 = {ARCH7PIC, 20, NULL, &s_arch_7};
\r
69 statetype s_arch_8 = {ARCH8PIC, 20, NULL, &s_arch_8};
\r
70 statetype s_arch_9 = {ARCH9PIC, 20, NULL, &s_arch_9};
\r
71 statetype s_arch_10 = {ARCH10PIC, 20, NULL, &s_arch_10};
\r
72 statetype s_arch_11 = {ARCH11PIC, 20, NULL, &s_arch_11};
\r
73 statetype s_arch_12 = {ARCH12PIC, 20, NULL, &s_arch_12};
\r
74 statetype s_arch_13 = {ARCH13PIC, 20, NULL, &s_arch_13};
\r
76 void SpawnArch (int tilex, int tiley, int num)
\r
78 statetype *objstate;
\r
84 objstate = &s_arch_1;
\r
87 objstate = &s_arch_2;
\r
90 objstate = &s_arch_3;
\r
93 objstate = &s_arch_4;
\r
96 objstate = &s_arch_5;
\r
99 objstate = &s_arch_6;
\r
102 objstate = &s_arch_7;
\r
105 objstate = &s_arch_8;
\r
108 objstate = &s_arch_9;
\r
111 objstate = &s_arch_10;
\r
114 objstate = &s_arch_11;
\r
117 objstate = &s_arch_12;
\r
120 objstate = &s_arch_13;
\r
123 ASpawnNewObj(tilex,tiley,objstate,PIXRADIUS*35);
\r
124 new->obclass = solidobj;
\r
125 new->flags &= ~of_shootable;
\r
129 //-------------------------------------------------------------------------
\r
133 //-------------------------------------------------------------------------
\r
136 //-------------------------------------------------------------------------
\r
137 // COLUMN, SULPHUR GAS HOLE, FIRE POT, FOUNTAIN
\r
138 //-------------------------------------------------------------------------
\r
141 void SpawnMiscObjects(int tilex, int tiley, int num);
\r
143 extern statetype s_column;
\r
144 extern statetype s_sulphur_gas_1;
\r
145 extern statetype s_sulphur_gas_2;
\r
146 extern statetype s_sulphur_gas_3;
\r
147 extern statetype s_fire_pot_1;
\r
148 extern statetype s_fire_pot_2;
\r
149 extern statetype s_fountain;
\r
151 statetype s_column = {COLUMNPIC, 20, NULL, &s_column};
\r
152 statetype s_sulphur_gas_1 = {SULPHUR_GAS_1PIC, 20, NULL, &s_sulphur_gas_2};
\r
153 statetype s_sulphur_gas_2 = {SULPHUR_GAS_2PIC, 20, NULL, &s_sulphur_gas_3};
\r
154 statetype s_sulphur_gas_3 = {SULPHUR_GAS_3PIC, 20, NULL, &s_sulphur_gas_1};
\r
155 statetype s_fire_pot_1 = {FIRE_POT_1PIC, 20, NULL, &s_fire_pot_2};
\r
156 statetype s_fire_pot_2 = {FIRE_POT_2PIC, 20, NULL, &s_fire_pot_1};
\r
157 statetype s_fountain = {WFOUNTAINPIC, 20, NULL, &s_fountain};
\r
160 void SpawnMiscObjects(int tilex, int tiley, int num)
\r
162 statetype *objstate;
\r
167 objstate = &s_column;
\r
171 objstate = &s_sulphur_gas_1;
\r
175 objstate = &s_fire_pot_1;
\r
179 objstate = &s_fountain;
\r
183 SpawnNewObj(tilex,tiley,objstate,PIXRADIUS*35);
\r
184 new->obclass = realsolidobj;
\r
186 new->flags &= ~of_shootable;
\r
188 new->flags |= of_shootable;
\r
197 void SpawnColumn(int tilex, int tiley);
\r
199 extern statetype s_column;
\r
200 statetype s_column = {COLUMNPIC, 20, NULL, &s_column};
\r
202 void SpawnColumn(int tilex, int tiley)
\r
204 SpawnNewObj(tilex,tiley,&s_column,PIXRADIUS*35);
\r
205 new->obclass = realsolidobj;
\r
206 new->flags |= of_shootable;
\r
210 //-------------------------------------------------------------------------
\r
212 //-------------------------------------------------------------------------
\r
214 void SpawnSulphurGas(int tilex, int tiley);
\r
216 extern statetype s_sulphur_gas_1;
\r
217 extern statetype s_sulphur_gas_2;
\r
218 extern statetype s_sulphur_gas_3;
\r
220 statetype s_sulphur_gas_1 = {SULPHUR_GAS_1PIC, 20, NULL, &s_sulphur_gas_2};
\r
221 statetype s_sulphur_gas_2 = {SULPHUR_GAS_2PIC, 20, NULL, &s_sulphur_gas_3};
\r
222 statetype s_sulphur_gas_3 = {SULPHUR_GAS_3PIC, 20, NULL, &s_sulphur_gas_1};
\r
224 void SpawnSulphurGas(int tilex, int tiley)
\r
226 SpawnNewObj(tilex,tiley,&s_sulphur_gas_1,PIXRADIUS*35);
\r
227 new->obclass = realsolidobj;
\r
228 new->flags &= ~of_shootable;
\r
232 //-------------------------------------------------------------------------
\r
234 //-------------------------------------------------------------------------
\r
236 void SpawnFirePot(int tilex, int tiley);
\r
238 extern statetype s_fire_pot_1;
\r
239 extern statetype s_fire_pot_2;
\r
241 statetype s_fire_pot_1 = {FIRE_POT_1PIC, 20, NULL, &s_fire_pot_2};
\r
242 statetype s_fire_pot_2 = {FIRE_POT_2PIC, 20, NULL, &s_fire_pot_1};
\r
244 void SpawnFirePot(int tilex, int tiley)
\r
246 SpawnNewObj(tilex,tiley,&s_fire_pot_1,PIXRADIUS*35);
\r
247 new->obclass = realsolidobj;
\r
248 new->flags |= of_shootable;
\r
252 //------------------------------------------------------------------------
\r
254 //------------------------------------------------------------------------
\r
256 void SpawnFountain(int tilex, int tiley);
\r
258 extern statetype s_fountain;
\r
259 statetype s_fountain = {WFOUNTAINPIC, 20, NULL, &s_fountain};
\r
261 void SpawnFountain(int tilex, int tiley)
\r
263 SpawnNewObj(tilex,tiley,&s_fountain,PIXRADIUS*35);
\r
264 new->obclass = realsolidobj;
\r
265 new->flags |= of_shootable;
\r
271 //------------------------------------------------------------------------
\r
273 //------------------------------------------------------------------------
\r
275 void SpawnForceField(int tilex, int tiley);
\r
276 void T_ForceField(objtype *ob);
\r
277 void T_ForceFieldRemove(objtype *ob);
\r
279 extern statetype s_force_field_1;
\r
280 extern statetype s_force_field_2;
\r
281 extern statetype s_force_field_3;
\r
282 extern statetype s_force_field_4;
\r
283 extern statetype s_force_field_die1;
\r
285 statetype s_force_field_1 = {FORCE_FIELD_1PIC, 10, T_ForceField, &s_force_field_2};
\r
286 statetype s_force_field_2 = {FORCE_FIELD_2PIC, 10, T_ForceField, &s_force_field_3};
\r
287 statetype s_force_field_3 = {FORCE_FIELD_3PIC, 10, T_ForceField, &s_force_field_4};
\r
288 statetype s_force_field_4 = {FORCE_FIELD_4PIC, 10, T_ForceField, &s_force_field_1};
\r
290 statetype s_force_field_die = {0,0,T_ForceFieldRemove,&s_force_field_die1};
\r
291 statetype s_force_field_die1 = {0,0,NULL,NULL};
\r
293 void SpawnForceField(int tilex, int tiley)
\r
295 SpawnNewObj(tilex,tiley,&s_force_field_1,PIXRADIUS*35);
\r
296 new->obclass = solidobj;
\r
297 new->hitpoints = EasyHitPoints(20);
\r
298 new->flags |= of_forcefield; //sets bit 7 :: makes it nonsolid, but also detectable
\r
299 // without adding another object type!
\r
300 new->flags |= of_shootable;
\r
303 void T_ForceField(objtype *ob)
\r
305 long move,deltax,deltay,size;
\r
307 size = (long)ob->size + player->size;
\r
309 deltax = ob->x - player->x;
\r
310 deltay = ob->y - player->y;
\r
312 if (deltax <= size && deltax >= -size
\r
313 && deltay <= size && deltay >= -size)
\r
318 void T_ForceFieldRemove(objtype *ob)
\r
320 actorat[ob->tilex][ob->tiley] = 0;
\r
324 //------------------------------------------------------------------------
\r
325 // SKELETON HANGING FROM CEILING
\r
326 //------------------------------------------------------------------------
\r
328 void SpawnSkeletonHanging(int tilex, int tiley);
\r
329 void T_SkelHangThink(objtype *ob);
\r
331 extern statetype s_skeleton_hanging;
\r
332 statetype s_skeleton_hanging = {SKEL_HANGPIC, 20, T_SkelHangThink, &s_skeleton_hanging};
\r
334 void SpawnSkeletonHanging(int tilex, int tiley)
\r
338 SpawnNewObj(tilex,tiley,&s_skeleton_hanging,PIXRADIUS*35);
\r
339 new->obclass = solidobj;
\r
341 tile = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);
\r
343 new->temp1 = (tile>>8)*30;
\r
345 new->temp1 = (3*60)+random(4*60);
\r
347 new->flags |= of_shootable;
\r
350 void T_SkelHangThink(objtype *ob)
\r
352 ob->temp1 -= realtics;
\r
353 if (ob->temp1 <= 0)
\r
355 ob->state = &s_skel_1;
\r
356 ob->ticcount = ob->state->tictime;
\r
357 ob->obclass = skeletonobj;
\r
359 ob->flags |= of_shootable;
\r
360 ob->hitpoints = EasyHitPoints(12);
\r
365 /////////////////////////////////////////////////////////////////////////////
\r
369 // Checks to see if the player has selected the easy mode for playing.
\r
370 // If so then the normal hit points are cut in half.
\r
371 // This is when the object is spawned.
\r
374 // NrmHitPts - the normal hit points
\r
377 // Half of NrmHitPts
\r
379 /////////////////////////////////////////////////////////////////////////////
\r
381 int EasyHitPoints(int NrmHitPts)
\r
383 if (EASYMODEON) // Wimpy, Wimpy, Wimpy!!!!!
\r
385 return(NrmHitPts/4);
\r
391 /////////////////////////////////////////////////////////////////////////////
\r
395 // Checks to see if the player has selected the easy mode for playing.
\r
396 // If so then the normal amount of damage is cut in half.
\r
397 // This is called each time a monster does damage.
\r
400 // Damage - the normal damage taken
\r
405 /////////////////////////////////////////////////////////////////////////////
\r
407 int EasyDoDamage(int Damage)
\r
409 if (EASYMODEON) // Wimpy, Wimpy, Wimpy!!!!!
\r