]> 4ch.mooo.com Git - 16.git/blob - 16/cawat/C5_ACT4.C
676e0b7ee815ac08f39352a2aafbdc79bed92c48
[16.git] / 16 / cawat / C5_ACT4.C
1 /* Catacomb Armageddon Source Code\r
2  * Copyright (C) 1993-2014 Flat Rock Software\r
3  *\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
8  *\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
13  *\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
17  */\r
18 \r
19 // C4_PLAY.C\r
20 \r
21 #include "DEF.H"\r
22 #pragma hdrstop\r
23 \r
24 /*\r
25 =============================================================================\r
26 \r
27                                                  LOCAL CONSTANTS\r
28 \r
29 =============================================================================\r
30 */\r
31 \r
32 \r
33 \r
34 //-------------------------------------------------------------------------\r
35 //\r
36 //                              ARCH OBJECTS\r
37 //\r
38 //-------------------------------------------------------------------------\r
39 \r
40 \r
41 \r
42 //-------------------------------------------------------------------------\r
43 //                              ARCH\r
44 //-------------------------------------------------------------------------\r
45 \r
46 void SpawnArch(int tilex, int tiley, int num);\r
47 \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
61 \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
75 \r
76 void SpawnArch (int tilex, int tiley, int num)\r
77 {\r
78         statetype       *objstate;\r
79 \r
80 \r
81         switch (num)\r
82         {\r
83                 case 1:\r
84                         objstate = &s_arch_1;\r
85                 break;\r
86                 case 2:\r
87                         objstate = &s_arch_2;\r
88                 break;\r
89                 case 3:\r
90                         objstate = &s_arch_3;\r
91                 break;\r
92                 case 4:\r
93                         objstate = &s_arch_4;\r
94                 break;\r
95                 case 5:\r
96                         objstate = &s_arch_5;\r
97                 break;\r
98                 case 6:\r
99                         objstate = &s_arch_6;\r
100                 break;\r
101                 case 7:\r
102                         objstate = &s_arch_7;\r
103                 break;\r
104                 case 8:\r
105                         objstate = &s_arch_8;\r
106                 break;\r
107                 case 9:\r
108                         objstate = &s_arch_9;\r
109                 break;\r
110                 case 10:\r
111                         objstate = &s_arch_10;\r
112                 break;\r
113                 case 11:\r
114                         objstate = &s_arch_11;\r
115                 break;\r
116                 case 12:\r
117                         objstate = &s_arch_12;\r
118                 break;\r
119                 case 13:\r
120                         objstate = &s_arch_13;\r
121                 break;\r
122         }\r
123         ASpawnNewObj(tilex,tiley,objstate,PIXRADIUS*35);\r
124         new->obclass = solidobj;\r
125         new->flags &= ~of_shootable;\r
126 }\r
127 \r
128 \r
129 //-------------------------------------------------------------------------\r
130 //\r
131 //                              MISC OBJECTS\r
132 //\r
133 //-------------------------------------------------------------------------\r
134 \r
135 \r
136 //-------------------------------------------------------------------------\r
137 //              COLUMN, SULPHUR GAS HOLE, FIRE POT, FOUNTAIN\r
138 //-------------------------------------------------------------------------\r
139 \r
140 \r
141 void SpawnMiscObjects(int tilex, int tiley, int num);\r
142 \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
150 \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
158 \r
159 \r
160 void SpawnMiscObjects(int tilex, int tiley, int num)\r
161 {\r
162         statetype       *objstate;\r
163 \r
164         switch (num)\r
165         {\r
166                 case 1:\r
167                         objstate = &s_column;\r
168                 break;\r
169 \r
170                 case 2:\r
171                         objstate = &s_sulphur_gas_1;\r
172                 break;\r
173 \r
174                 case 3:\r
175                         objstate = &s_fire_pot_1;\r
176                 break;\r
177 \r
178                 case 4:\r
179                         objstate = &s_fountain;\r
180                 break;\r
181         }\r
182 \r
183         SpawnNewObj(tilex,tiley,objstate,PIXRADIUS*35);\r
184         new->obclass = realsolidobj;\r
185         if (num == 2)\r
186                 new->flags &= ~of_shootable;\r
187         else\r
188                 new->flags |= of_shootable;\r
189 }\r
190 \r
191 \r
192 \r
193 \r
194 \r
195 \r
196 #if 0\r
197 void SpawnColumn(int tilex, int tiley);\r
198 \r
199 extern statetype s_column;\r
200 statetype s_column = {COLUMNPIC, 20, NULL, &s_column};\r
201 \r
202 void SpawnColumn(int tilex, int tiley)\r
203 {\r
204         SpawnNewObj(tilex,tiley,&s_column,PIXRADIUS*35);\r
205         new->obclass = realsolidobj;\r
206         new->flags |= of_shootable;\r
207 }\r
208 \r
209 \r
210 //-------------------------------------------------------------------------\r
211 //                              SULPHUR GAS\r
212 //-------------------------------------------------------------------------\r
213 \r
214 void SpawnSulphurGas(int tilex, int tiley);\r
215 \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
219 \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
223 \r
224 void SpawnSulphurGas(int tilex, int tiley)\r
225 {\r
226         SpawnNewObj(tilex,tiley,&s_sulphur_gas_1,PIXRADIUS*35);\r
227         new->obclass = realsolidobj;\r
228         new->flags &= ~of_shootable;\r
229 }\r
230 \r
231 \r
232 //-------------------------------------------------------------------------\r
233 //                              FIRE POT\r
234 //-------------------------------------------------------------------------\r
235 \r
236 void SpawnFirePot(int tilex, int tiley);\r
237 \r
238 extern statetype s_fire_pot_1;\r
239 extern statetype s_fire_pot_2;\r
240 \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
243 \r
244 void SpawnFirePot(int tilex, int tiley)\r
245 {\r
246         SpawnNewObj(tilex,tiley,&s_fire_pot_1,PIXRADIUS*35);\r
247         new->obclass = realsolidobj;\r
248         new->flags |= of_shootable;\r
249 \r
250 }\r
251 \r
252 //------------------------------------------------------------------------\r
253 //                              FOUNTAIN\r
254 //------------------------------------------------------------------------\r
255 \r
256 void SpawnFountain(int tilex, int tiley);\r
257 \r
258 extern statetype s_fountain;\r
259 statetype s_fountain = {WFOUNTAINPIC, 20, NULL, &s_fountain};\r
260 \r
261 void SpawnFountain(int tilex, int tiley)\r
262 {\r
263         SpawnNewObj(tilex,tiley,&s_fountain,PIXRADIUS*35);\r
264         new->obclass = realsolidobj;\r
265         new->flags |= of_shootable;\r
266 }\r
267 \r
268 #endif\r
269 \r
270 \r
271 //------------------------------------------------------------------------\r
272 //                              FORCE FIELD\r
273 //------------------------------------------------------------------------\r
274 \r
275 void SpawnForceField(int tilex, int tiley);\r
276 void T_ForceField(objtype *ob);\r
277 void T_ForceFieldRemove(objtype *ob);\r
278 \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
284 \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
289 \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
292 \r
293 void SpawnForceField(int tilex, int tiley)\r
294 {\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
301 }\r
302 \r
303 void T_ForceField(objtype *ob)\r
304 {\r
305         long move,deltax,deltay,size;\r
306 \r
307         size = (long)ob->size + player->size;\r
308 \r
309         deltax = ob->x - player->x;\r
310         deltay = ob->y - player->y;\r
311 \r
312         if (deltax <= size && deltax >= -size\r
313         && deltay <= size && deltay >= -size)\r
314                 TakeDamage (20);\r
315 \r
316 }\r
317 \r
318 void T_ForceFieldRemove(objtype *ob)\r
319 {\r
320         actorat[ob->tilex][ob->tiley] = 0;\r
321 }\r
322 \r
323 \r
324 //------------------------------------------------------------------------\r
325 //                      SKELETON HANGING FROM CEILING\r
326 //------------------------------------------------------------------------\r
327 \r
328 void SpawnSkeletonHanging(int tilex, int tiley);\r
329 void T_SkelHangThink(objtype *ob);\r
330 \r
331 extern statetype s_skeleton_hanging;\r
332 statetype s_skeleton_hanging = {SKEL_HANGPIC, 20, T_SkelHangThink, &s_skeleton_hanging};\r
333 \r
334 void SpawnSkeletonHanging(int tilex, int tiley)\r
335 {\r
336         unsigned tile;\r
337 \r
338         SpawnNewObj(tilex,tiley,&s_skeleton_hanging,PIXRADIUS*35);\r
339         new->obclass = solidobj;\r
340 \r
341         tile = *(mapsegs[2]+farmapylookup[tiley+1]+tilex);\r
342         if (tile)\r
343                 new->temp1 = (tile>>8)*30;\r
344         else\r
345                 new->temp1 = (3*60)+random(4*60);\r
346 \r
347         new->flags |= of_shootable;\r
348 }\r
349 \r
350 void T_SkelHangThink(objtype *ob)\r
351 {\r
352         ob->temp1 -= realtics;\r
353         if (ob->temp1 <= 0)\r
354         {\r
355                 ob->state = &s_skel_1;\r
356                 ob->ticcount = ob->state->tictime;\r
357                 ob->obclass = skeletonobj;\r
358                 ob->speed = 2036;\r
359                 ob->flags |= of_shootable;\r
360                 ob->hitpoints = EasyHitPoints(12);\r
361         }\r
362 }\r
363 \r
364 \r
365 /////////////////////////////////////////////////////////////////////////////\r
366 //\r
367 //      EasyHitPoints\r
368 //\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
372 //\r
373 //      Parms\r
374 //              NrmHitPts - the normal hit points\r
375 //\r
376 //      Returns\r
377 //              Half of NrmHitPts\r
378 //\r
379 /////////////////////////////////////////////////////////////////////////////\r
380 \r
381 int EasyHitPoints(int NrmHitPts)\r
382 {\r
383         if (EASYMODEON)                         // Wimpy, Wimpy, Wimpy!!!!!\r
384         {\r
385                 return(NrmHitPts/4);\r
386         }\r
387         else\r
388                 return(NrmHitPts);\r
389 }\r
390 \r
391 /////////////////////////////////////////////////////////////////////////////\r
392 //\r
393 //      EasyDoDamage\r
394 //\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
398 //\r
399 //      Parms\r
400 //              Damage - the normal damage taken\r
401 //\r
402 //      Returns\r
403 //              Half of Damage\r
404 //\r
405 /////////////////////////////////////////////////////////////////////////////\r
406 \r
407 int EasyDoDamage(int Damage)\r
408 {\r
409         if (EASYMODEON)                         // Wimpy, Wimpy, Wimpy!!!!!\r
410                 return(Damage/2);\r
411         else\r
412                 return(Damage);\r
413 }\r
414 \r