]> 4ch.mooo.com Git - 16.git/blobdiff - 16/keen456/KEEN4-6/KEEN5/K5_ACT1.C
added keen 4-6 rebuild code for reference.... i need to stop doing this... xD
[16.git] / 16 / keen456 / KEEN4-6 / KEEN5 / K5_ACT1.C
diff --git a/16/keen456/KEEN4-6/KEEN5/K5_ACT1.C b/16/keen456/KEEN4-6/KEEN5/K5_ACT1.C
deleted file mode 100755 (executable)
index 9157bac..0000000
+++ /dev/null
@@ -1,1524 +0,0 @@
-/* Reconstructed Commander Keen 4-6 Source Code\r
- * Copyright (C) 2021 K1n9_Duk3\r
- *\r
- * This file is loosely based on:\r
- * Keen Dreams Source Code\r
- * Copyright (C) 2014 Javier M. Chavez\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
-/*\r
-K5_ACT1.C\r
-=========\r
-\r
-Contains the following actor types (in this order):\r
-\r
-- some shared routines\r
-- Bonus Items\r
-- Teleport and Fuse effects\r
-- Platforms\r
-- falling platforms\r
-- static platforms\r
-- Goplat platforms\r
-- Volte Face\r
-- sneaky platforms\r
-- Turrets\r
-\r
-*/\r
-\r
-#include "CK_DEF.H"\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 SHARED STUFF\r
-\r
-=============================================================================\r
-*/\r
-\r
-Sint16 pdirx[] = {0, 1, 0, -1, 1, 1, -1, -1};\r
-Sint16 pdiry[] = {-1, 0, 1, 0, -1, 1, 1, -1};\r
-\r
-/*\r
-===========================\r
-=\r
-= CheckSpawnShot\r
-=\r
-===========================\r
-*/\r
-\r
-Sint16 CheckSpawnShot(Uint16 x, Uint16 y, statetype *state)\r
-{\r
-       if (GetNewObj(true) == -1)\r
-               return -1;\r
-       new->x = x;\r
-       new->y = y;\r
-       new->obclass = mshotobj;\r
-       new->active = ac_removable;\r
-       NewState(new, state);\r
-       if (!CheckPosition(new))\r
-       {\r
-               RemoveObj(new);\r
-               return -1;\r
-       }\r
-       return 0;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_ClipSide\r
-=\r
-===========================\r
-*/\r
-\r
-void C_ClipSide(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               playerkludgeclipcancel = true;\r
-               ClipToSpriteSide(hit, ob);\r
-               playerkludgeclipcancel = false;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_ClipTop\r
-=\r
-===========================\r
-*/\r
-\r
-void C_ClipTop(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-               ClipToSpriteTop(hit, ob);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Land\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Land(objtype *ob)\r
-{\r
-       if (ob->hiteast || ob->hitwest)\r
-               ob->xspeed = 0;\r
-\r
-       if (ob->hitsouth)\r
-               ob->yspeed = 0;\r
-\r
-       if (ob->hitnorth)\r
-       {\r
-               ob->yspeed = 0;\r
-               if (ob->state->nextstate)\r
-               {\r
-                       ChangeState(ob, ob->state->nextstate);\r
-               }\r
-               else\r
-               {\r
-                       RemoveObj(ob);\r
-                       return;\r
-               }\r
-       }\r
-\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Bounce\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Bounce(objtype *ob)\r
-{\r
-       Uint16 wall,absx,absy,angle,newangle;\r
-       Uint32 speed;\r
-\r
-\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-\r
-       if (ob->hiteast || ob->hitwest)\r
-               ob->xspeed = -ob->xspeed/2;\r
-\r
-       if (ob->hitsouth)\r
-       {\r
-               ob->yspeed = -ob->yspeed/2;\r
-               return;\r
-       }\r
-\r
-       wall = ob->hitnorth;\r
-       if (wall)\r
-       {\r
-               if (ob->yspeed < 0)\r
-                       ob->yspeed = 0;\r
-\r
-               absx = abs(ob->xspeed);\r
-               absy = ob->yspeed;\r
-               if (absx>absy)\r
-               {\r
-                       if (absx>absy*2)        // 22 degrees\r
-                       {\r
-                               angle = 0;\r
-                               speed = absx*286;       // x*sqrt(5)/2\r
-                       }\r
-                       else                            // 45 degrees\r
-                       {\r
-                               angle = 1;\r
-                               speed = absx*362;       // x*sqrt(2)\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       if (absy>absx*2)        // 90 degrees\r
-                       {\r
-                               angle = 3;\r
-                               speed = absy*256;\r
-                       }\r
-                       else\r
-                       {\r
-                               angle = 2;              // 67 degrees\r
-                               speed = absy*286;       // y*sqrt(5)/2\r
-                       }\r
-               }\r
-               if (ob->xspeed > 0)\r
-                       angle = 7-angle;\r
-\r
-               speed >>= 1;\r
-               newangle = bounceangle[ob->hitnorth][angle];\r
-               switch (newangle)\r
-               {\r
-               case 0:\r
-                       ob->xspeed = speed / 286;\r
-                       ob->yspeed = -ob->xspeed / 2;\r
-                       break;\r
-               case 1:\r
-                       ob->xspeed = speed / 362;\r
-                       ob->yspeed = -ob->xspeed;\r
-                       break;\r
-               case 2:\r
-                       ob->yspeed = -(speed / 286);\r
-                       ob->xspeed = -ob->yspeed / 2;\r
-                       break;\r
-               case 3:\r
-\r
-               case 4:\r
-                       ob->xspeed = 0;\r
-                       ob->yspeed = -(speed / 256);\r
-                       break;\r
-               case 5:\r
-                       ob->yspeed = -(speed / 286);\r
-                       ob->xspeed = ob->yspeed / 2;\r
-                       break;\r
-               case 6:\r
-                       ob->xspeed = ob->yspeed = -(speed / 362);\r
-                       break;\r
-               case 7:\r
-                       ob->xspeed = -(speed / 286);\r
-                       ob->yspeed = ob->xspeed / 2;\r
-                       break;\r
-\r
-               case 8:\r
-                       ob->xspeed = -(speed / 286);\r
-                       ob->yspeed = -ob->xspeed / 2;\r
-                       break;\r
-               case 9:\r
-                       ob->xspeed = -(speed / 362);\r
-                       ob->yspeed = -ob->xspeed;\r
-                       break;\r
-               case 10:\r
-                       ob->yspeed = speed / 286;\r
-                       ob->xspeed = -ob->yspeed / 2;\r
-                       break;\r
-               case 11:\r
-\r
-               case 12:\r
-                       ob->xspeed = 0;\r
-                       ob->yspeed = -(speed / 256);\r
-                       break;\r
-               case 13:\r
-                       ob->yspeed = speed / 286;\r
-                       ob->xspeed = ob->yspeed / 2;\r
-                       break;\r
-               case 14:\r
-                       ob->xspeed = speed / 362;\r
-                       ob->yspeed = speed / 362;\r
-                       break;\r
-               case 15:\r
-                       ob->xspeed = speed / 286;\r
-                       ob->yspeed = ob->xspeed / 2;\r
-                       break;\r
-               }\r
-\r
-               if (speed < 256*16)\r
-               {\r
-                       ChangeState(ob, ob->state->nextstate);\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 BONUS ITEMS\r
-temp1 = bonus type\r
-temp2 = base shape number\r
-temp3 = last animated shape number +1\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_bonus1    = {0,            0,            step,      false, false, 20, 0, 0, T_Bonus, NULL, R_Draw, &s_bonus2};\r
-statetype s_bonus2    = {0,            0,            step,      false, false, 20, 0, 0, T_Bonus, NULL, R_Draw, &s_bonus1};\r
-statetype s_bonusfly1 = {0,            0,            stepthink, false, false, 20, 0, 0, T_FlyBonus, NULL, R_Draw, &s_bonusfly2};\r
-statetype s_bonusfly2 = {0,            0,            stepthink, false, false, 20, 0, 0, T_FlyBonus, NULL, R_Draw, &s_bonusfly1};\r
-statetype s_bonusrise = {0,            0,            slide,     false, false, 40, 0, 8, NULL, NULL, R_Draw, NULL};\r
-statetype s_splash1   = {VIVAPOOF1SPR, VIVAPOOF1SPR, step,      false, false,  8, 0, 0, NULL, NULL, R_Draw, &s_splash2};\r
-statetype s_splash2   = {VIVAPOOF2SPR, VIVAPOOF2SPR, step,      false, false,  8, 0, 0, NULL, NULL, R_Draw, &s_splash3};\r
-statetype s_splash3   = {VIVAPOOF3SPR, VIVAPOOF3SPR, step,      false, false,  8, 0, 0, NULL, NULL, R_Draw, &s_splash4};\r
-statetype s_splash4   = {VIVAPOOF4SPR, VIVAPOOF4SPR, step,      false, false,  8, 0, 0, NULL, NULL, R_Draw, NULL};\r
-\r
-Uint16 bonusshape[] = {\r
-       REDGEM1SPR, YELLOWGEM1SPR, BLUEGEM1SPR, GREENGEM1SPR,\r
-       SUGAR1ASPR, SUGAR2ASPR, SUGAR3ASPR,\r
-       SUGAR4ASPR, SUGAR5ASPR, SUGAR6ASPR,\r
-       ONEUPASPR, STUNCLIP1SPR, DOORCARD1SPR\r
-};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnBonus\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnBonus(Uint16 tileX, Uint16 tileY, Uint16 type)\r
-{\r
-       GetNewObj(false);\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 2;\r
-       new->obclass = bonusobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       new->ydir = -1;\r
-       new->temp1 = type;\r
-       new->temp2=new->shapenum = bonusshape[type];\r
-       new->temp3 = new->temp2+2;\r
-       NewState(new, &s_bonus1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnSplash\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnSplash(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(true);\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 3;\r
-       new->obclass = inertobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       NewState(new, &s_splash1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Bonus\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Bonus(objtype *ob)\r
-{\r
-       if (++ob->shapenum == ob->temp3)\r
-               ob->shapenum = ob->temp2;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_FlyBonus\r
-=\r
-===========================\r
-*/\r
-\r
-void T_FlyBonus(objtype *ob)\r
-{\r
-       if (ob->hitnorth)\r
-               ob->state = &s_bonus1;\r
-\r
-       if (++ob->shapenum == ob->temp3)\r
-               ob->shapenum = ob->temp2;\r
-\r
-       DoGravity(ob);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 TELEPORT EFFECTS\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_teleport1     = {TELEPORTSPARK1SPR, TELEPORTSPARK1SPR, step, false, false, 6, 0, 0, NULL, NULL, R_Draw, &s_teleport2};\r
-statetype s_teleport2     = {TELEPORTSPARK2SPR, TELEPORTSPARK2SPR, step, false, false, 6, 0, 0, NULL, NULL, R_Draw, &s_teleport1};\r
-statetype s_teleportzap1  = {TELEPORTZAP1SPR,   TELEPORTZAP1SPR,   step, false, false, 6, 0, 0, NULL, NULL, R_Draw, &s_teleportzap2};\r
-statetype s_teleportzap2  = {TELEPORTZAP2SPR,   TELEPORTZAP2SPR,   step, false, false, 6, 0, 0, NULL, NULL, R_Draw, &s_teleportzap1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnTeleport\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnTeleport(void)\r
-{\r
-       GetNewObj(true);\r
-       new->priority = 3;\r
-       new->needtoclip = cl_noclip;\r
-       new->obclass = teleporterobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(player->tileleft) - 8*PIXGLOBAL;\r
-       new->y = CONVERT_TILE_TO_GLOBAL(player->tilebottom) - 5*TILEGLOBAL;\r
-       NewState(new, &s_teleport1);\r
-\r
-       GetNewObj(true);\r
-       new->priority = 3;\r
-       new->needtoclip = cl_noclip;\r
-       new->obclass = teleporterobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(player->tileleft);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(player->tiletop) - 8*PIXGLOBAL;\r
-       NewState(new, &s_teleportzap1);\r
-\r
-       SD_PlaySound(SND_TELEPORT);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 FUSE FLASH\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_fuseflash1    = {FUSEFLASH1SPR, FUSEFLASH1SPR, step, false, false, 10, 0, 0, NULL, NULL, R_Draw, &s_fuseflash2};\r
-statetype s_fuseflash2    = {FUSEFLASH2SPR, FUSEFLASH2SPR, step, false, false, 20, 0, 0, NULL, NULL, R_Draw, &s_fuseflash3};\r
-statetype s_fuseflash3    = {FUSEFLASH3SPR, FUSEFLASH3SPR, step, false, false, 10, 0, 0, NULL, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnFuseFlash\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnFuseFlash(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(true);\r
-       new->priority = 3;\r
-       new->needtoclip = cl_noclip;\r
-       new->obclass = teleporterobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX-1);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       NewState(new, &s_fuseflash1);\r
-       SD_PlaySound(SND_BIGSPARK);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 DEAD MACHINE\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_deadmachine   = {-1, -1, step, false, false, 60, 0, 0, T_DeadMachine, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnDeadMachine\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnDeadMachine(void)\r
-{\r
-       GetNewObj(false);\r
-       new->active = ac_allways;\r
-       new->needtoclip = cl_noclip;\r
-       NewState(new, &s_deadmachine);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_DeadMachine\r
-=\r
-===========================\r
-*/\r
-\r
-#pragma argsused\r
-void T_DeadMachine(objtype *ob)\r
-{\r
-       if (mapon == 12)\r
-       {\r
-               playstate = ex_qedbroke;\r
-       }\r
-       else\r
-       {\r
-               playstate = ex_fusebroke;\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 PLATFORMS\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_platform      = {PLATFORMSPR,  PLATFORMSPR,  think,     false, false, 0, 0, 0, T_Platform, NULL, R_Draw, NULL};\r
-statetype s_slotplat1     = {SLOTPLAT1SPR, SLOTPLAT1SPR, stepthink, false, false, 0, 0, 0, T_Slotplat, NULL, R_Draw, &s_slotplat2};\r
-statetype s_slotplat2     = {SLOTPLAT2SPR, SLOTPLAT2SPR, stepthink, false, false, 0, 0, 0, T_Slotplat, NULL, R_Draw, &s_slotplat1};\r
-// BUG? the slotplat states have a tictime of 0, so they never transition to the next state\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnPlatform\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnPlatform(Uint16 tileX, Uint16 tileY, Sint16 dir, Sint16 type)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = platformobj;\r
-       new->active = ac_allways;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       switch (dir)\r
-       {\r
-       case 0:\r
-               new->xdir = 0;\r
-               new->ydir = -1;\r
-               break;\r
-       case 1:\r
-               new->xdir = 1;\r
-               new->ydir = 0;\r
-               break;\r
-       case 2:\r
-               new->xdir = 0;\r
-               new->ydir = 1;\r
-               break;\r
-       case 3:\r
-               new->xdir = -1;\r
-               new->ydir = 0;\r
-       }\r
-       if (type)\r
-       {\r
-               new->x += 4*PIXGLOBAL;\r
-               new->y += 4*PIXGLOBAL;\r
-               NewState(new, &s_slotplat1);\r
-       }\r
-       else\r
-       {\r
-               NewState(new, &s_platform);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Platform\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Platform(objtype *ob)\r
-{\r
-       Uint16 newpos, newtile;\r
-\r
-       //\r
-       // this code could be executed twice during the same frame because the\r
-       // object's animation/state changed during that frame, so don't update\r
-       // anything if we already have movement for the current frame i.e. the\r
-       // update code has already been executed this frame\r
-       //\r
-       if (!xtry && !ytry)\r
-       {\r
-               xtry = ob->xdir * 12 * tics;\r
-               ytry = ob->ydir * 12 * tics;\r
-\r
-               if (ob->xdir == 1)\r
-               {\r
-                       newpos = ob->right + xtry;\r
-                       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-                       if (ob->tileright != newtile)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[ob->tiletop]/2 + newtile) == PLATFORMBLOCK)\r
-                               {\r
-                                       ob->xdir = -1;\r
-                                       xtry = xtry - (newpos & 0xFF);\r
-                               }\r
-                       }\r
-               }\r
-               else if (ob->xdir == -1)\r
-               {\r
-                       newpos = ob->left + xtry;\r
-                       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-                       if (ob->tileleft != newtile)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[ob->tiletop]/2 + newtile) == PLATFORMBLOCK)\r
-                               {\r
-                                       ob->xdir = 1;\r
-                                       xtry = xtry + (TILEGLOBAL - (newpos & 0xFF));\r
-                               }\r
-                       }\r
-               }\r
-               else if (ob->ydir == 1)\r
-               {\r
-                       newpos = ob->bottom + ytry;\r
-                       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-                       if (ob->tilebottom != newtile)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[newtile]/2 + ob->tileleft) == PLATFORMBLOCK)\r
-                               {\r
-                                       if (*(mapsegs[2]+mapbwidthtable[newtile-2]/2 + ob->tileleft) == PLATFORMBLOCK)\r
-                                       {\r
-                                               ytry = 0;\r
-                                               ob->needtoreact = true;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               ob->ydir = -1;\r
-                                               ytry = ytry - (newpos & 0xFF);\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               else if (ob->ydir == -1)\r
-               {\r
-                       newpos = ob->top + ytry;\r
-                       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-                       if (ob->tiletop != newtile)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[newtile]/2 + ob->tileleft) == PLATFORMBLOCK)\r
-                               {\r
-                                       if (*(mapsegs[2]+mapbwidthtable[newtile+2]/2 + ob->tileleft) == PLATFORMBLOCK)\r
-                                       {\r
-                                               ytry = 0;\r
-                                               ob->needtoreact = true;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               ob->ydir = 1;\r
-                                               ytry = ytry + (TILEGLOBAL - (newpos & 0xFF));\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Slotplat\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Slotplat(objtype *ob)\r
-{\r
-       Uint16 newpos, newtile;\r
-\r
-       //\r
-       // this code could be executed twice during the same frame because the\r
-       // object's animation/state changed during that frame, so don't update\r
-       // anything if we already have movement for the current frame i.e. the\r
-       // update code has already been executed this frame\r
-       //\r
-       if (!xtry && !ytry)\r
-       {\r
-               xtry = ob->xdir * 12 * tics;\r
-               ytry = ob->ydir * 12 * tics;\r
-\r
-               if (ob->xdir == 1)\r
-               {\r
-                       newpos = ob->right + xtry;\r
-                       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-                       if (ob->tileright != newtile)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[ob->tiletop]/2 + newtile) == PLATFORMBLOCK)\r
-                               {\r
-                                       ob->xdir = -1;\r
-                                       xtry = xtry - (newpos & 0xFF);\r
-                               }\r
-                       }\r
-               }\r
-               else if (ob->xdir == -1)\r
-               {\r
-                       newpos = ob->left + xtry;\r
-                       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-                       if (ob->tileleft != newtile)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[ob->tiletop]/2 + newtile) == PLATFORMBLOCK)\r
-                               {\r
-                                       ob->xdir = 1;\r
-                                       xtry = xtry + (TILEGLOBAL - (newpos & 0xFF));\r
-                               }\r
-                       }\r
-               }\r
-               else if (ob->ydir == 1)\r
-               {\r
-                       newpos = ob->bottom + ytry;\r
-                       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-                       if (ob->tilebottom != newtile)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[newtile]/2 + ob->tileleft + 1) == PLATFORMBLOCK)\r
-                               {\r
-                                       if (*(mapsegs[2]+mapbwidthtable[newtile-2]/2 + ob->tileleft) == PLATFORMBLOCK)  // BUG? '+ 1' is missing after 'tileleft'\r
-                                       {\r
-                                               ytry = 0;\r
-                                               ob->needtoreact = true;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               ob->ydir = -1;\r
-                                               ytry = ytry - (newpos & 0xFF);\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               else if (ob->ydir == -1)\r
-               {\r
-                       newpos = ob->top + ytry;\r
-                       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-                       if (ob->tiletop != newtile)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[newtile]/2 + ob->tileleft + 1) == PLATFORMBLOCK)\r
-                               {\r
-                                       if (*(mapsegs[2]+mapbwidthtable[newtile+2]/2 + ob->tileleft + 1) == PLATFORMBLOCK)\r
-                                       {\r
-                                               ytry = 0;\r
-                                               ob->needtoreact = true;\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               ob->ydir = 1;\r
-                                               ytry = ytry + (TILEGLOBAL - (newpos & 0xFF));\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 DROPPING PLATFORM\r
-\r
-temp1 = initial y position\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_dropplatsit  = {PLATFORMSPR, PLATFORMSPR, think,      false, false, 0, 0,   0, T_DropPlatSit, NULL, R_Draw, NULL};\r
-statetype s_dropplatfall = {PLATFORMSPR, PLATFORMSPR, think,      false, false, 0, 0,   0, T_DropPlatFall, NULL, R_Draw, NULL};\r
-statetype s_dropplatrise = {PLATFORMSPR, PLATFORMSPR, slidethink, false, false, 0, 0, -32, T_DropPlatRise, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnDropPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnDropPlat(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = platformobj;\r
-       new->active = ac_allways;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y=new->temp1 = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       new->xdir = 0;\r
-       new->ydir = 1;\r
-       new->needtoclip = cl_noclip;\r
-       NewState(new, &s_dropplatsit);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_DropPlatSit\r
-=\r
-===========================\r
-*/\r
-\r
-void T_DropPlatSit(objtype *ob)\r
-{\r
-       if (gamestate.riding == ob)\r
-       {\r
-               ytry = tics << 4;       //tics * 16;\r
-               ob->yspeed = 0;\r
-               if (ob->y + ytry - ob->temp1 >= 8*PIXGLOBAL)\r
-                       ob->state = &s_dropplatfall;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_DropPlatFall\r
-=\r
-===========================\r
-*/\r
-\r
-void T_DropPlatFall(objtype *ob)\r
-{\r
-       Uint16 newpos, newtile;\r
-\r
-       DoGravity(ob);\r
-\r
-#if 0\r
-       // bugfix: don't skip a tile (this is present in Keen 4, but missing in 5 & 6)\r
-       if (ytry >= 15*PIXGLOBAL)\r
-               ytry = 15*PIXGLOBAL;\r
-#endif\r
-\r
-       newpos = ob->bottom + ytry;\r
-       newtile = CONVERT_GLOBAL_TO_TILE(newpos);\r
-       if (ob->tilebottom != newtile)\r
-       {\r
-               if (*(mapsegs[2]+mapbwidthtable[newtile]/2 + ob->tileleft) == PLATFORMBLOCK)\r
-               {\r
-                       ytry = 0xFF - (ob->bottom & 0xFF);\r
-                       if (gamestate.riding != ob)\r
-                               ob->state = &s_dropplatrise;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_DropPlatRise\r
-=\r
-===========================\r
-*/\r
-\r
-void T_DropPlatRise(objtype *ob)\r
-{\r
-       if (gamestate.riding == ob)\r
-       {\r
-               ob->yspeed = 0;\r
-               ob->state = &s_dropplatfall;\r
-       }\r
-       else if (ob->y <= ob->temp1)\r
-       {\r
-               ytry = ob->temp1 - ob->y;\r
-               ob->state = &s_dropplatsit;\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 STATIC PLATFORM\r
-\r
-temp1 = initial y position (is set but never used)\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_statplat    = {PLATFORMSPR, PLATFORMSPR, step, false, false, 32000, 0, 0, NULL, NULL, R_Draw, &s_statplat};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnStaticPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnStaticPlat(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = platformobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y=new->temp1 = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       new->xdir = 0;\r
-       new->ydir = 1;\r
-       new->needtoclip = cl_noclip;\r
-       NewState(new, &s_statplat);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 GO PLATFORMS\r
-\r
-temp1 = direction\r
-temp2 = countdown to next dir check\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_goplat        = {PLATFORMSPR,  PLATFORMSPR,  think,     false, false, 0, 0, 0, T_GoPlat, NULL, R_Draw, NULL};\r
-statetype s_slotgoplat1   = {SLOTPLAT1SPR, SLOTPLAT1SPR, stepthink, false, false, 0, 0, 0, T_GoSlotPlat, NULL, R_Draw, &s_slotgoplat2};\r
-statetype s_slotgoplat2   = {SLOTPLAT2SPR, SLOTPLAT2SPR, stepthink, false, false, 0, 0, 0, T_GoSlotPlat, NULL, R_Draw, &s_slotgoplat1};\r
-// BUG? the slotgoplat states have a tictime of 0, so they never transition to the next state\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnGoPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnGoPlat(Uint16 tileX, Uint16 tileY, Sint16 dir, Sint16 type)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = platformobj;\r
-       new->active = ac_allways;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       new->xdir = 0;\r
-       new->ydir = 1;\r
-       new->needtoclip = cl_noclip;\r
-       if (type)\r
-       {\r
-               new->x += 4*PIXGLOBAL;\r
-               new->y += 4*PIXGLOBAL;\r
-               NewState(new, &s_slotgoplat1);\r
-       }\r
-       else\r
-       {\r
-               NewState(new, &s_goplat);\r
-       }\r
-       *(mapsegs[2]+mapbwidthtable[tileY]/2 + tileX) = DIRARROWSTART + dir;\r
-       new->temp1 = dir;\r
-       new->temp2 = TILEGLOBAL;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_GoPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void T_GoPlat(objtype *ob)\r
-{\r
-       Uint16 move;\r
-       Uint16 tx, ty;\r
-       Sint16 dir;\r
-\r
-       //\r
-       // this code could be executed twice during the same frame because the\r
-       // object's animation/state changed during that frame, so don't update\r
-       // anything if we already have movement for the current frame i.e. the\r
-       // update code has already been executed this frame\r
-       //\r
-       if (!xtry && !ytry)\r
-       {\r
-               move = tics * 12;\r
-               if (ob->temp2 > move)\r
-               {\r
-                       ob->temp2 = ob->temp2 - move;\r
-\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry = xtry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry = xtry + -move;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry = ytry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry = ytry + -move;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry += ob->temp2;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry += -ob->temp2;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry += ob->temp2;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry += -ob->temp2;\r
-                       }\r
-\r
-                       tx = CONVERT_GLOBAL_TO_TILE(ob->x + xtry);\r
-                       ty = CONVERT_GLOBAL_TO_TILE(ob->y + ytry);\r
-                       ob->temp1 = *(mapsegs[2]+mapbwidthtable[ty]/2 + tx) - DIRARROWSTART;\r
-                       if (ob->temp1 < arrow_North || ob->temp1 > arrow_None)\r
-                       {\r
-                               char error[60] = "Goplat moved to a bad spot: ";\r
-                               char buf[5] = "";\r
-\r
-                               strcat(error, itoa(ob->x, buf, 16));\r
-                               strcat(error, ",");\r
-                               strcat(error, itoa(ob->y, buf, 16));\r
-                               Quit(error);\r
-                       }\r
-\r
-                       move -= ob->temp2;\r
-                       ob->temp2 = TILEGLOBAL - move;\r
-\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry = xtry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry = xtry - move;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry = ytry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry = ytry - move;\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_GoSlotPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void T_GoSlotPlat(objtype *ob)\r
-{\r
-       Uint16 move;\r
-       Uint16 tx, ty;\r
-       Sint16 dir;\r
-\r
-       //\r
-       // this code could be executed twice during the same frame because the\r
-       // object's animation/state changed during that frame, so don't update\r
-       // anything if we already have movement for the current frame i.e. the\r
-       // update code has already been executed this frame\r
-       //\r
-       if (!xtry && !ytry)\r
-       {\r
-               move = tics * 12;\r
-               if (ob->temp2 > move)\r
-               {\r
-                       ob->temp2 = ob->temp2 - move;\r
-\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry = xtry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry = xtry + -move;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry = ytry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry = ytry + -move;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry += ob->temp2;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry += -ob->temp2;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry += ob->temp2;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry += -ob->temp2;\r
-                       }\r
-\r
-                       tx = CONVERT_GLOBAL_TO_TILE(ob->x + xtry + 4*PIXGLOBAL);\r
-                       ty = CONVERT_GLOBAL_TO_TILE(ob->y + ytry + 4*PIXGLOBAL);\r
-                       ob->temp1 = *(mapsegs[2]+mapbwidthtable[ty]/2 + tx) - DIRARROWSTART;\r
-                       if (ob->temp1 < arrow_North || ob->temp1 > arrow_None)\r
-                       {\r
-                               Quit("Goplat moved to a bad spot!");\r
-                       }\r
-\r
-                       move -= ob->temp2;\r
-                       ob->temp2 = TILEGLOBAL - move;\r
-\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry = xtry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry = xtry - move;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry = ytry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry = ytry - move;\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 VOLTEFACE\r
-\r
-temp1 = direction\r
-temp2 = countdown to next dir check\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_volte1     = {VOLTEFACE1SPR,    VOLTEFACE1SPR,    stepthink, false, false,   6, 0, 0, T_Volte, C_Volte, R_Draw, &s_volte2};\r
-statetype s_volte2     = {VOLTEFACE2SPR,    VOLTEFACE2SPR,    stepthink, false, false,   6, 0, 0, T_Volte, C_Volte, R_Draw, &s_volte3};\r
-statetype s_volte3     = {VOLTEFACE3SPR,    VOLTEFACE3SPR,    stepthink, false, false,   6, 0, 0, T_Volte, C_Volte, R_Draw, &s_volte4};\r
-statetype s_volte4     = {VOLTEFACE4SPR,    VOLTEFACE4SPR,    stepthink, false, false,   6, 0, 0, T_Volte, C_Volte, R_Draw, &s_volte1};\r
-statetype s_voltestun  = {VOLTEFACESTUNSPR, VOLTEFACESTUNSPR, step,      false, false, 300, 0, 0, NULL, NULL, R_Draw, &s_volte1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnVolte\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnVolte(Uint16 tileX, Uint16 tileY)\r
-{\r
-       Uint16 dir;\r
-       Uint16 far *map;\r
-\r
-       GetNewObj(false);\r
-       new->obclass = volteobj;\r
-       new->active = ac_allways;\r
-       new->priority = 2;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       new->needtoclip = cl_noclip;\r
-       NewState(new, &s_volte1);\r
-       map = mapsegs[2] + mapbwidthtable[tileY]/2 + tileX;\r
-       if (map[-1] == DIRARROWSTART + arrow_East)\r
-       {\r
-               dir = arrow_East;\r
-       }\r
-       else if (map[1] == DIRARROWSTART + arrow_West)\r
-       {\r
-               dir = arrow_West;\r
-       }\r
-       else if (*(map-mapwidth) == DIRARROWSTART + arrow_South)\r
-       {\r
-               dir = arrow_South;\r
-       }\r
-       else if (*(map+mapwidth) == DIRARROWSTART + arrow_North)\r
-       {\r
-               dir = arrow_North;\r
-       }\r
-       map[0] = dir + DIRARROWSTART;\r
-       new->temp1 = dir;\r
-       new->temp2 = TILEGLOBAL;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Volte\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Volte(objtype *ob)\r
-{\r
-       Uint16 move;\r
-       Uint16 tx, ty;\r
-       Sint16 dir;\r
-\r
-       //\r
-       // this code could be executed twice during the same frame because the\r
-       // object's animation/state changed during that frame, so don't update\r
-       // anything if we already have movement for the current frame i.e. the\r
-       // update code has already been executed this frame\r
-       //\r
-       if (!xtry && !ytry)\r
-       {\r
-               move = tics << 5;\r
-               if (ob->temp2 > move)\r
-               {\r
-                       ob->temp2 = ob->temp2 - move;\r
-\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry = xtry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry = xtry + -move;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry = ytry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry = ytry + -move;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry += ob->temp2;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry += -ob->temp2;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry += ob->temp2;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry += -ob->temp2;\r
-                       }\r
-\r
-                       tx = CONVERT_GLOBAL_TO_TILE(ob->x + xtry);\r
-                       ty = CONVERT_GLOBAL_TO_TILE(ob->y + ytry);\r
-                       ob->temp1 = *(mapsegs[2]+mapbwidthtable[ty]/2 + tx) - DIRARROWSTART;\r
-                       if (ob->temp1 < arrow_North || ob->temp1 > arrow_None)\r
-                       {\r
-                               char error[60] = "Volte moved to a bad spot: ";\r
-                               char buf[5] = "";\r
-\r
-                               strcat(error, itoa(ob->x, buf, 16));\r
-                               strcat(error, ",");\r
-                               strcat(error, itoa(ob->y, buf, 16));\r
-                               Quit(error);\r
-                       }\r
-\r
-                       move -= ob->temp2;\r
-                       ob->temp2 = TILEGLOBAL - move;\r
-\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry = xtry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry = xtry - move;\r
-                       }\r
-\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry = ytry + move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               ytry = ytry - move;\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Volte\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Volte(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-       }\r
-       else if (hit->obclass == stunshotobj)\r
-       {\r
-               ExplodeShot(hit);\r
-               ChangeState(ob, &s_voltestun);\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 SNEAKY PLATFORM\r
-\r
-temp1 = initial x position (is set but never used)\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_sneakplatsit    = {PLATFORMSPR, PLATFORMSPR, think, false, false,  0,   0, 0, T_SneakPlat, NULL, R_Draw, NULL};\r
-statetype s_sneakplatdodge  = {PLATFORMSPR, PLATFORMSPR, slide, false, false, 48,  32, 0, NULL, NULL, R_Draw, &s_sneakplatreturn};\r
-statetype s_sneakplatreturn = {PLATFORMSPR, PLATFORMSPR, slide, false, false, 96, -16, 0, NULL, NULL, R_Draw, &s_sneakplatsit};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnSneakPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnSneakPlat(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = platformobj;\r
-       new->active = ac_allways;\r
-       new->priority = 0;\r
-       new->x=new->temp1 = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       new->xdir = 0;\r
-       new->ydir = 1;\r
-       new->needtoclip = cl_noclip;\r
-       NewState(new, &s_sneakplatsit);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_SneakPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void T_SneakPlat(objtype *ob)\r
-{\r
-       Sint16 dist;\r
-\r
-       if (player->state != &s_keenjump1)\r
-               return;\r
-\r
-       if (player->xdir == 1)\r
-       {\r
-               dist = ob->left-player->right;\r
-               if (dist > 4*TILEGLOBAL || dist < 0)\r
-                       return;\r
-       }\r
-       else\r
-       {\r
-               dist = player->left-ob->right;\r
-               if (dist > 4*TILEGLOBAL || dist < 0)\r
-                       return;\r
-       }\r
-       dist = player->y - ob->y;\r
-       if (dist < -6*TILEGLOBAL || dist > 6*TILEGLOBAL)\r
-               return;\r
-\r
-       ob->xdir = player->xdir;\r
-       ob->state = &s_sneakplatdodge;\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 CANNON\r
-\r
-temp1 = direction\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_cannon     = {0,            0,            step,      false, false, 120, 0, 0, NULL, NULL, R_Draw, &s_cannonfire};\r
-statetype s_cannonfire = {0,            0,            step,      true,  false,   1, 0, 0, T_Cannon, NULL, R_Draw, &s_cannon};\r
-statetype s_cshot1     = {LASER1SPR,    LASER1SPR,    stepthink, false, false,   8, 0, 0, T_Velocity, C_CShot, R_CShot, &s_cshot2};\r
-statetype s_cshot2     = {LASER2SPR,    LASER2SPR,    stepthink, false, false,   8, 0, 0, T_Velocity, C_CShot, R_CShot, &s_cshot3};\r
-statetype s_cshot3     = {LASER3SPR,    LASER3SPR,    stepthink, false, false,   8, 0, 0, T_Velocity, C_CShot, R_CShot, &s_cshot4};\r
-statetype s_cshot4     = {LASER4SPR,    LASER4SPR,    stepthink, false, false,   8, 0, 0, T_Velocity, C_CShot, R_CShot, &s_cshot1};\r
-statetype s_cshothit1  = {LASERHIT1SPR, LASERHIT1SPR, step,      false, false,  10, 0, 0, NULL, NULL, R_Draw, &s_cshothit2};\r
-statetype s_cshothit2  = {LASERHIT2SPR, LASERHIT2SPR, step,      false, false,  10, 0, 0, NULL, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnCannon\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnCannon(Uint16 tileX, Uint16 tileY, Sint16 dir)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = cannonobj;\r
-       new->active = ac_yes;\r
-       new->tileright = new->tileleft = tileX;\r
-       new->tiletop = new->tilebottom = tileY;\r
-       new->x = new->left = new->right = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = new->top = new->bottom = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       new->temp1 = dir;\r
-       NewState(new, &s_cannon);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Cannon\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Cannon(objtype *ob)\r
-{\r
-       GetNewObj(true);\r
-       new->obclass = mshotobj;\r
-       new->active = ac_removable;\r
-       new->x = ob->x;\r
-       new->y = ob->y;\r
-       switch (ob->temp1)\r
-       {\r
-       case 0:\r
-               new->yspeed = -64;\r
-               break;\r
-       case 1:\r
-               new->xspeed = 64;\r
-               break;\r
-       case 2:\r
-               new->yspeed = 64;\r
-               break;\r
-       case 3:\r
-               new->xspeed = -64;\r
-       }\r
-       NewState(new, &s_cshot1);\r
-       SD_PlaySound(SND_ENEMYSHOT);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_CShot\r
-=\r
-===========================\r
-*/\r
-\r
-void C_CShot(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-               ChangeState(ob, &s_cshothit1);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_CShot\r
-=\r
-===========================\r
-*/\r
-\r
-void R_CShot(objtype *ob)\r
-{\r
-       if (ob->hitnorth || ob->hiteast || ob->hitsouth || ob->hitwest)\r
-       {\r
-               SD_PlaySound(SND_ENEMYSHOTEXPLODE);\r
-               ChangeState(ob, &s_cshothit1);\r
-       }\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}
\ No newline at end of file