--- /dev/null
+/* Catacomb Apocalypse Source Code\r
+ * Copyright (C) 1993-2014 Flat Rock Software\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along\r
+ * with this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+ */\r
+\r
+// C4_PLAY.C\r
+\r
+#include "DEF.H"\r
+#pragma hdrstop\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ LOCAL CONSTANTS\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+//-------------------------------------------------------------------------\r
+//\r
+// MISC OBJECTS\r
+//\r
+//-------------------------------------------------------------------------\r
+\r
+\r
+//-------------------------------------------------------------------------\r
+// COLUMN, SULPHUR GAS HOLE, FIRE POT, FOUNTAIN\r
+//-------------------------------------------------------------------------\r
+\r
+\r
+void SpawnMiscObjects(int tilex, int tiley, int num);\r
+\r
+statetype s_column1 = {COLUMN1PIC, 20, NULL, &s_column1};\r
+statetype s_column2 = {COLUMN2PIC, 20, NULL, &s_column2};\r
+statetype s_column3 = {COLUMN3PIC, 20, NULL, &s_column3};\r
+statetype s_column4 = {COLUMN4PIC, 20, NULL, &s_column4};\r
+statetype s_column5 = {COLUMN5PIC, 20, NULL, &s_column5};\r
+statetype s_ffire_pot = {FFIRE_POTPIC, 20, NULL, &s_ffire_pot};\r
+statetype s_ofire_pot1 = {OFIRE_POT1PIC, 20, NULL, &s_ofire_pot2};\r
+statetype s_ofire_pot2 = {OFIRE_POT2PIC, 20, NULL, &s_ofire_pot1};\r
+statetype s_tomb1 = {TOMB1PIC, 20, NULL, &s_tomb1};\r
+statetype s_tomb2 = {TOMB2PIC, 20, NULL, &s_tomb2};\r
+void SpawnMiscObjects(int tilex, int tiley, int num)\r
+{\r
+ statetype *objstate;\r
+\r
+ switch (num)\r
+ {\r
+ case 1:\r
+ objstate = &s_column1;\r
+ break;\r
+\r
+ case 2:\r
+ objstate = &s_column2;\r
+ break;\r
+\r
+ case 3:\r
+ objstate = &s_column3;\r
+ break;\r
+\r
+ case 4:\r
+ objstate = &s_ffire_pot;\r
+ break;\r
+\r
+ case 5:\r
+ objstate = &s_column4;\r
+ break;\r
+\r
+ case 6:\r
+ objstate = &s_ofire_pot1;\r
+ break;\r
+\r
+ case 7:\r
+ objstate = &s_tomb1;\r
+ break;\r
+\r
+ case 8:\r
+ objstate = &s_tomb2;\r
+ break;\r
+\r
+ case 9:\r
+ objstate = &s_column5;\r
+ break;\r
+ }\r
+\r
+ SpawnNewObj(tilex, tiley, objstate, PIXRADIUS*10);\r
+ new->obclass = realsolidobj;\r
+ new->flags |= of_shootable;\r
+}\r
+\r
+\r
+\r
+//------------------------------------------------------------------------\r
+// FORCE FIELD\r
+//------------------------------------------------------------------------\r
+\r
+void SpawnForceField(int tilex, int tiley);\r
+void T_ForceField(objtype *ob);\r
+void T_ForceFieldRemove(objtype *ob);\r
+\r
+statetype s_force_field_1 = {FORCE_FIELD_1PIC, 10, T_ForceField, &s_force_field_2};\r
+statetype s_force_field_2 = {FORCE_FIELD_2PIC, 10, T_ForceField, &s_force_field_3};\r
+statetype s_force_field_3 = {FORCE_FIELD_3PIC, 10, T_ForceField, &s_force_field_4};\r
+statetype s_force_field_4 = {FORCE_FIELD_4PIC, 10, T_ForceField, &s_force_field_1};\r
+\r
+statetype s_force_field_die = {0,0,T_ForceFieldRemove,&s_force_field_die1};\r
+statetype s_force_field_die1 = {0,0,NULL,NULL};\r
+\r
+void SpawnForceField(int tilex, int tiley)\r
+{\r
+ SpawnNewObj(tilex,tiley,&s_force_field_1,PIXRADIUS*35);\r
+ new->obclass = solidobj;\r
+ new->hitpoints = EasyHitPoints(20);\r
+ new->temp1 = 0;\r
+ new->flags |= of_forcefield; //sets bit 7 :: makes it nonsolid, but also detectable\r
+ // without adding another object type!\r
+ new->flags |= of_shootable;\r
+}\r
+\r
+void T_ForceField(objtype *ob)\r
+{\r
+ long move,deltax,deltay,size;\r
+\r
+ size = (long)ob->size + player->size;\r
+\r
+ deltax = ob->x - player->x;\r
+ deltay = ob->y - player->y;\r
+\r
+ if (deltax <= size && deltax >= -size\r
+ && deltay <= size && deltay >= -size)\r
+ if (!new->temp1)\r
+ {\r
+ TakeDamage (94);\r
+ new->temp1 = 1;\r
+ return;\r
+ }\r
+ else\r
+ return;\r
+ new->temp1 = 0;\r
+}\r
+\r
+void T_ForceFieldRemove(objtype *ob)\r
+{\r
+ actorat[ob->tilex][ob->tiley] = 0;\r
+}\r
+\r
+\r
+\r
+\r
+//-------------------------------------------------------------------------\r
+//\r
+// INVISIBLE WALL CONTROLLER\r
+//\r
+//-------------------------------------------------------------------------\r
+\r
+void SpawnInvisWallCntroller(int x, int y);\r
+void T_InvisWall(objtype *ob);\r
+\r
+extern statetype s_invis_wall_control;\r
+\r
+statetype s_invis_wall_control = {0, 10, T_InvisWall, &s_invis_wall_control};\r
+\r
+void SpawnInvisWallCntroller(int tilex, int tiley)\r
+{\r
+ SpawnNewObj(tilex,tiley,&s_invis_wall_control,PIXRADIUS*35);\r
+ new->obclass = solidobj;\r
+ new->flags &= ~of_shootable;\r
+ new->temp1 = tilemap[tilex][tiley]; // Number for the wall tile here\r
+ // Used for replacing the wall tile\r
+}\r
+\r
+void T_InvisWall(objtype *ob)\r
+{\r
+ long move,deltax,deltay,size;\r
+\r
+ size = (long)ob->size + player->size;\r
+\r
+ deltax = ob->x - player->x;\r
+ deltay = ob->y - player->y;\r
+\r
+ if ((deltax <= size && deltax >= -size\r
+ && deltay <= size && deltay >= -size) ||\r
+ (ob->tilex == player->tilex) && (ob->tiley == player->tiley))\r
+ {\r
+ // Get rid of the wall tile if you are on it\r
+ tilemap[ob->tilex][ob->tiley] = 0;\r
+ }\r
+ else\r
+ {\r
+ // Replace wall tile\r
+ tilemap[ob->tilex][ob->tiley] = ob->temp1;\r
+ }\r
+}\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// EasyHitPoints\r
+//\r
+// Checks to see if the player has selected the easy mode for playing.\r
+// If so then the normal hit points are cut in half.\r
+// This is when the object is spawned.\r
+//\r
+// Parms\r
+// NrmHitPts - the normal hit points\r
+//\r
+// Returns\r
+// Half of NrmHitPts\r
+//\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+int EasyHitPoints(int NrmHitPts)\r
+{\r
+ if (EASYMODEON) // Wimpy, Wimpy, Wimpy!!!!!\r
+ {\r
+ return(NrmHitPts/4);\r
+ }\r
+ else\r
+ return(NrmHitPts);\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// EasyDoDamage\r
+//\r
+// Checks to see if the player has selected the easy mode for playing.\r
+// If so then the normal amount of damage is cut in half.\r
+// This is called each time a monster does damage.\r
+//\r
+// Parms\r
+// Damage - the normal damage taken\r
+//\r
+// Returns\r
+// Half of Damage\r
+//\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+int EasyDoDamage(int Damage)\r
+{\r
+ if (EASYMODEON) // Wimpy, Wimpy, Wimpy!!!!!\r
+ return(Damage/2);\r
+ else\r
+ return(Damage);\r
+}\r
+\r