1 /* Catacomb Apocalypse 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
26 =============================================================================
\r
30 =============================================================================
\r
34 //-------------------------------------------------------------------------
\r
38 //-------------------------------------------------------------------------
\r
41 //-------------------------------------------------------------------------
\r
42 // COLUMN, SULPHUR GAS HOLE, FIRE POT, FOUNTAIN
\r
43 //-------------------------------------------------------------------------
\r
46 void SpawnMiscObjects(int tilex, int tiley, int num);
\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
60 statetype *objstate;
\r
65 objstate = &s_column1;
\r
69 objstate = &s_column2;
\r
73 objstate = &s_column3;
\r
77 objstate = &s_ffire_pot;
\r
81 objstate = &s_column4;
\r
85 objstate = &s_ofire_pot1;
\r
89 objstate = &s_tomb1;
\r
93 objstate = &s_tomb2;
\r
97 objstate = &s_column5;
\r
101 SpawnNewObj(tilex, tiley, objstate, PIXRADIUS*10);
\r
102 new->obclass = realsolidobj;
\r
103 new->flags |= of_shootable;
\r
108 //------------------------------------------------------------------------
\r
110 //------------------------------------------------------------------------
\r
112 void SpawnForceField(int tilex, int tiley);
\r
113 void T_ForceField(objtype *ob);
\r
114 void T_ForceFieldRemove(objtype *ob);
\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
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
124 void SpawnForceField(int tilex, int tiley)
\r
126 SpawnNewObj(tilex,tiley,&s_force_field_1,PIXRADIUS*35);
\r
127 new->obclass = solidobj;
\r
128 new->hitpoints = EasyHitPoints(20);
\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
135 void T_ForceField(objtype *ob)
\r
137 long move,deltax,deltay,size;
\r
139 size = (long)ob->size + player->size;
\r
141 deltax = ob->x - player->x;
\r
142 deltay = ob->y - player->y;
\r
144 if (deltax <= size && deltax >= -size
\r
145 && deltay <= size && deltay >= -size)
\r
157 void T_ForceFieldRemove(objtype *ob)
\r
159 actorat[ob->tilex][ob->tiley] = 0;
\r
165 //-------------------------------------------------------------------------
\r
167 // INVISIBLE WALL CONTROLLER
\r
169 //-------------------------------------------------------------------------
\r
171 void SpawnInvisWallCntroller(int x, int y);
\r
172 void T_InvisWall(objtype *ob);
\r
174 extern statetype s_invis_wall_control;
\r
176 statetype s_invis_wall_control = {0, 10, T_InvisWall, &s_invis_wall_control};
\r
178 void SpawnInvisWallCntroller(int tilex, int tiley)
\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
187 void T_InvisWall(objtype *ob)
\r
189 long move,deltax,deltay,size;
\r
191 size = (long)ob->size + player->size;
\r
193 deltax = ob->x - player->x;
\r
194 deltay = ob->y - player->y;
\r
196 if ((deltax <= size && deltax >= -size
\r
197 && deltay <= size && deltay >= -size) ||
\r
198 (ob->tilex == player->tilex) && (ob->tiley == player->tiley))
\r
200 // Get rid of the wall tile if you are on it
\r
201 tilemap[ob->tilex][ob->tiley] = 0;
\r
205 // Replace wall tile
\r
206 tilemap[ob->tilex][ob->tiley] = ob->temp1;
\r
211 /////////////////////////////////////////////////////////////////////////////
\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
220 // NrmHitPts - the normal hit points
\r
223 // Half of NrmHitPts
\r
225 /////////////////////////////////////////////////////////////////////////////
\r
227 int EasyHitPoints(int NrmHitPts)
\r
229 if (EASYMODEON) // Wimpy, Wimpy, Wimpy!!!!!
\r
231 return(NrmHitPts/4);
\r
237 /////////////////////////////////////////////////////////////////////////////
\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
246 // Damage - the normal damage taken
\r
251 /////////////////////////////////////////////////////////////////////////////
\r
253 int EasyDoDamage(int Damage)
\r
255 if (EASYMODEON) // Wimpy, Wimpy, Wimpy!!!!!
\r