OSDN Git Service

going on vacation >.<
[proj16/16.git] / src / lib / hb / act / c6_act4.c
1 /* Catacomb Apocalypse 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 \r
28                                                  LOCAL CONSTANTS\r
29 \r
30 =============================================================================\r
31 */\r
32 \r
33 \r
34 //-------------------------------------------------------------------------\r
35 //\r
36 //                              MISC OBJECTS\r
37 //\r
38 //-------------------------------------------------------------------------\r
39 \r
40 \r
41 //-------------------------------------------------------------------------\r
42 //              COLUMN, SULPHUR GAS HOLE, FIRE POT, FOUNTAIN\r
43 //-------------------------------------------------------------------------\r
44 \r
45 \r
46 void SpawnMiscObjects(int tilex, int tiley, int num);\r
47 \r
48 statetype s_column1 = {COLUMN1PIC, 20, NULL, &s_column1};\r
49 statetype s_column2 = {COLUMN2PIC, 20, NULL, &s_column2};\r
50 statetype s_column3 = {COLUMN3PIC, 20, NULL, &s_column3};\r
51 statetype s_column4 = {COLUMN4PIC, 20, NULL, &s_column4};\r
52 statetype s_column5 = {COLUMN5PIC, 20, NULL, &s_column5};\r
53 statetype s_ffire_pot = {FFIRE_POTPIC, 20, NULL, &s_ffire_pot};\r
54 statetype s_ofire_pot1 = {OFIRE_POT1PIC, 20, NULL, &s_ofire_pot2};\r
55 statetype s_ofire_pot2 = {OFIRE_POT2PIC, 20, NULL, &s_ofire_pot1};\r
56 statetype s_tomb1 = {TOMB1PIC, 20, NULL, &s_tomb1};\r
57 statetype s_tomb2 = {TOMB2PIC, 20, NULL, &s_tomb2};\r
58 void SpawnMiscObjects(int tilex, int tiley, int num)\r
59 {\r
60         statetype       *objstate;\r
61 \r
62         switch (num)\r
63         {\r
64                 case 1:\r
65                         objstate = &s_column1;\r
66                 break;\r
67 \r
68                 case 2:\r
69                         objstate = &s_column2;\r
70                 break;\r
71 \r
72                 case 3:\r
73                         objstate = &s_column3;\r
74                 break;\r
75 \r
76                 case 4:\r
77                         objstate = &s_ffire_pot;\r
78                 break;\r
79 \r
80                 case 5:\r
81                         objstate = &s_column4;\r
82                 break;\r
83 \r
84                 case 6:\r
85                         objstate = &s_ofire_pot1;\r
86                 break;\r
87 \r
88                 case 7:\r
89                         objstate = &s_tomb1;\r
90                 break;\r
91 \r
92                 case 8:\r
93                         objstate = &s_tomb2;\r
94                 break;\r
95 \r
96                 case 9:\r
97                         objstate = &s_column5;\r
98                 break;\r
99         }\r
100 \r
101         SpawnNewObj(tilex, tiley, objstate, PIXRADIUS*10);\r
102         new->obclass = realsolidobj;\r
103         new->flags |= of_shootable;\r
104 }\r
105 \r
106 \r
107 \r
108 //------------------------------------------------------------------------\r
109 //                              FORCE FIELD\r
110 //------------------------------------------------------------------------\r
111 \r
112 void SpawnForceField(int tilex, int tiley);\r
113 void T_ForceField(objtype *ob);\r
114 void T_ForceFieldRemove(objtype *ob);\r
115 \r
116 statetype s_force_field_1 = {FORCE_FIELD_1PIC, 10, T_ForceField, &s_force_field_2};\r
117 statetype s_force_field_2 = {FORCE_FIELD_2PIC, 10, T_ForceField, &s_force_field_3};\r
118 statetype s_force_field_3 = {FORCE_FIELD_3PIC, 10, T_ForceField, &s_force_field_4};\r
119 statetype s_force_field_4 = {FORCE_FIELD_4PIC, 10, T_ForceField, &s_force_field_1};\r
120 \r
121 statetype s_force_field_die = {0,0,T_ForceFieldRemove,&s_force_field_die1};\r
122 statetype s_force_field_die1 = {0,0,NULL,NULL};\r
123 \r
124 void SpawnForceField(int tilex, int tiley)\r
125 {\r
126         SpawnNewObj(tilex,tiley,&s_force_field_1,PIXRADIUS*35);\r
127         new->obclass = solidobj;\r
128         new->hitpoints = EasyHitPoints(20);\r
129         new->temp1 = 0;\r
130         new->flags |= of_forcefield;            //sets bit 7 :: makes it nonsolid, but also detectable\r
131                                                 //              without adding another object type!\r
132         new->flags |= of_shootable;\r
133 }\r
134 \r
135 void T_ForceField(objtype *ob)\r
136 {\r
137         long move,deltax,deltay,size;\r
138 \r
139         size = (long)ob->size + player->size;\r
140 \r
141         deltax = ob->x - player->x;\r
142         deltay = ob->y - player->y;\r
143 \r
144         if (deltax <= size && deltax >= -size\r
145         && deltay <= size && deltay >= -size)\r
146                 if (!new->temp1)\r
147                 {\r
148                         TakeDamage (94);\r
149                         new->temp1 = 1;\r
150                         return;\r
151                 }\r
152                 else\r
153                         return;\r
154         new->temp1 = 0;\r
155 }\r
156 \r
157 void T_ForceFieldRemove(objtype *ob)\r
158 {\r
159         actorat[ob->tilex][ob->tiley] = 0;\r
160 }\r
161 \r
162 \r
163 \r
164 \r
165 //-------------------------------------------------------------------------\r
166 //\r
167 //                                                              INVISIBLE WALL CONTROLLER\r
168 //\r
169 //-------------------------------------------------------------------------\r
170 \r
171 void SpawnInvisWallCntroller(int x, int y);\r
172 void T_InvisWall(objtype *ob);\r
173 \r
174 extern statetype s_invis_wall_control;\r
175 \r
176 statetype s_invis_wall_control = {0, 10, T_InvisWall, &s_invis_wall_control};\r
177 \r
178 void SpawnInvisWallCntroller(int tilex, int tiley)\r
179 {\r
180         SpawnNewObj(tilex,tiley,&s_invis_wall_control,PIXRADIUS*35);\r
181         new->obclass = solidobj;\r
182         new->flags &= ~of_shootable;\r
183         new->temp1 = tilemap[tilex][tiley];             // Number for the wall tile here\r
184                                                                                                                 // Used for replacing the wall tile\r
185 }\r
186 \r
187 void T_InvisWall(objtype *ob)\r
188 {\r
189         long move,deltax,deltay,size;\r
190 \r
191         size = (long)ob->size + player->size;\r
192 \r
193         deltax = ob->x - player->x;\r
194         deltay = ob->y - player->y;\r
195 \r
196         if ((deltax <= size && deltax >= -size\r
197                 && deltay <= size && deltay >= -size) ||\r
198                 (ob->tilex == player->tilex) && (ob->tiley == player->tiley))\r
199         {\r
200           // Get rid of the wall tile if you are on it\r
201                 tilemap[ob->tilex][ob->tiley] = 0;\r
202         }\r
203         else\r
204         {\r
205           // Replace wall tile\r
206                 tilemap[ob->tilex][ob->tiley] = ob->temp1;\r
207         }\r
208 }\r
209 \r
210 \r
211 /////////////////////////////////////////////////////////////////////////////\r
212 //\r
213 //      EasyHitPoints\r
214 //\r
215 //      Checks to see if the player has selected the easy mode for playing.\r
216 //      If so then the normal hit points are cut in half.\r
217 //      This is when the object is spawned.\r
218 //\r
219 //      Parms\r
220 //              NrmHitPts - the normal hit points\r
221 //\r
222 //      Returns\r
223 //              Half of NrmHitPts\r
224 //\r
225 /////////////////////////////////////////////////////////////////////////////\r
226 \r
227 int EasyHitPoints(int NrmHitPts)\r
228 {\r
229         if (EASYMODEON)                         // Wimpy, Wimpy, Wimpy!!!!!\r
230         {\r
231                 return(NrmHitPts/4);\r
232         }\r
233         else\r
234                 return(NrmHitPts);\r
235 }\r
236 \r
237 /////////////////////////////////////////////////////////////////////////////\r
238 //\r
239 //      EasyDoDamage\r
240 //\r
241 //      Checks to see if the player has selected the easy mode for playing.\r
242 //      If so then the normal amount of damage is cut in half.\r
243 //      This is called each time a monster does damage.\r
244 //\r
245 //      Parms\r
246 //              Damage - the normal damage taken\r
247 //\r
248 //      Returns\r
249 //              Half of Damage\r
250 //\r
251 /////////////////////////////////////////////////////////////////////////////\r
252 \r
253 int EasyDoDamage(int Damage)\r
254 {\r
255         if (EASYMODEON)                         // Wimpy, Wimpy, Wimpy!!!!!\r
256                 return(Damage/2);\r
257         else\r
258                 return(Damage);\r
259 }\r
260 \r