]> 4ch.mooo.com Git - 16.git/blobdiff - 16/keen456/KEEN4-6/KEEN6/K6_ACT2.C
added keen 4-6 rebuild code for reference.... i need to stop doing this... xD
[16.git] / 16 / keen456 / KEEN4-6 / KEEN6 / K6_ACT2.C
diff --git a/16/keen456/KEEN4-6/KEEN6/K6_ACT2.C b/16/keen456/KEEN4-6/KEEN6/K6_ACT2.C
deleted file mode 100755 (executable)
index ddea36f..0000000
+++ /dev/null
@@ -1,1311 +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
-K6_ACT2.C\r
-=========\r
-\r
-Contains the following actor types (in this order):\r
-\r
-- Nospike\r
-- Gik\r
-- Turrets\r
-- Orbatrix\r
-- Bip & Bipship\r
-- Flect\r
-\r
-*/\r
-\r
-#include "CK_DEF.H"\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 NOSPIKE\r
-\r
-temp1 = step counter for running on thin air\r
-temp2 = low byte: running flag; high byte: flash countdown\r
-temp3 = sprite pointer for the question mark\r
-temp4 = health\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_nospikestand     = {NOSPIKESTANDSPR,   NOSPIKESTANDSPR,   step,  false, true,  90,   0, 0, NULL, C_Nospike, R_Walk, &s_nospikewalk1};\r
-statetype s_nospikewalk1     = {NOSPIKEWALKL1SPR,  NOSPIKEWALKR1SPR,  step,  false, true,  10, 128, 0, T_NospikeWalk, C_Nospike, R_Walk, &s_nospikewalk2};\r
-statetype s_nospikewalk2     = {NOSPIKEWALKL2SPR,  NOSPIKEWALKR2SPR,  step,  false, true,  10, 128, 0, T_NospikeWalk, C_Nospike, R_Walk, &s_nospikewalk3};\r
-statetype s_nospikewalk3     = {NOSPIKEWALKL3SPR,  NOSPIKEWALKR3SPR,  step,  false, true,  10, 128, 0, T_NospikeWalk, C_Nospike, R_Walk, &s_nospikewalk4};\r
-statetype s_nospikewalk4     = {NOSPIKEWALKL4SPR,  NOSPIKEWALKR4SPR,  step,  false, true,  10, 128, 0, T_NospikeWalk, C_Nospike, R_Walk, &s_nospikewalk1};\r
-statetype s_nospikerun1      = {NOSPIKERUNL1SPR,   NOSPIKERUNR1SPR,   step,  false, true,   4, 128, 0, T_NospikeRun, C_Nospike, R_NospikeRun, &s_nospikerun2};\r
-statetype s_nospikerun2      = {NOSPIKERUNL2SPR,   NOSPIKERUNR2SPR,   step,  false, true,   4, 128, 0, T_NospikeRun, C_Nospike, R_NospikeRun, &s_nospikerun3};\r
-statetype s_nospikerun3      = {NOSPIKERUNL3SPR,   NOSPIKERUNR3SPR,   step,  false, true,   4, 128, 0, T_NospikeRun, C_Nospike, R_NospikeRun, &s_nospikerun4};\r
-statetype s_nospikerun4      = {NOSPIKERUNL4SPR,   NOSPIKERUNR4SPR,   step,  false, true,   4, 128, 0, T_NospikeRun, C_Nospike, R_NospikeRun, &s_nospikerun1};\r
-statetype s_nospikeconfused1 = {NOSPIKESTANDSPR,   NOSPIKESTANDSPR,   step,  false, false, 20,   0, 1, NULL, NULL, R_Draw, &s_nospikeconfused2};\r
-statetype s_nospikeconfused2 = {NOSPIKESTANDSPR,   NOSPIKESTANDSPR,   step,  false, false, 90,   0, 0, T_NospikeConfused, NULL, R_NospikeConfused, &s_nospikeconfused3};\r
-statetype s_nospikeconfused3 = {NOSPIKESTANDSPR,   NOSPIKESTANDSPR,   step,  false, false, 20,   0, 0, NULL, NULL, R_Draw, &s_nospikefall};\r
-statetype s_nospikefall      = {NOSPIKESTANDSPR,   NOSPIKESTANDSPR,   think, false, false,  0,   0, 0, T_Projectile, NULL, R_NospikeFall, NULL};\r
-statetype s_nospikestun      = {NOSPIKESTUNSPR,    NOSPIKESTUNSPR,    think, false, false,  0,   0, 0, T_Projectile, NULL, R_Stunned, &s_nospikestun};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnNospike\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnNospike(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = nospikeobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY) + -24*PIXGLOBAL;\r
-       if (US_RndT() < 0x80)\r
-       {\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xdir = -1;\r
-       }\r
-       new->ydir = 1;\r
-       NewState(new, &s_nospikestand);\r
-       new->temp4 = 4; // health\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_NospikeWalk\r
-=\r
-===========================\r
-*/\r
-\r
-void T_NospikeWalk(objtype *ob)\r
-{\r
-       if (US_RndT() < 0x10)\r
-       {\r
-               ob->state = &s_nospikestand;\r
-       }\r
-       else if (ob->bottom == player->bottom && US_RndT() <= 0x20)\r
-       {\r
-               //\r
-               // start running towards player\r
-               //\r
-               if (player->x > ob->x)\r
-               {\r
-                       ob->xdir = 1;\r
-               }\r
-               else\r
-               {\r
-                       ob->xdir = -1;\r
-               }\r
-               ob->temp1 = 0;  // nospike is still on solid ground (should already be 0 anyway)\r
-               ob->temp2 = 1;  // nospike is running\r
-               if (ob->state == &s_nospikewalk1)\r
-               {\r
-                       ob->state = &s_nospikerun2;\r
-               }\r
-               else if (ob->state == &s_nospikewalk2)\r
-               {\r
-                       ob->state = &s_nospikerun3;\r
-               }\r
-               else if (ob->state == &s_nospikewalk3)\r
-               {\r
-                       ob->state = &s_nospikerun4;\r
-               }\r
-               else if (ob->state == &s_nospikewalk4)\r
-               {\r
-                       ob->state = &s_nospikerun1;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_NospikeRun\r
-=\r
-===========================\r
-*/\r
-\r
-void T_NospikeRun(objtype *ob)\r
-{\r
-       if (ob->temp1)\r
-               return; // nospike is running on thin air, so we'd better not stop\r
-\r
-       if ( ( ( player->bottom != ob->bottom   // not on same ground level as Keen?\r
-                        || (ob->xdir == -1 && ob->x < player->x)\r
-                        || (ob->xdir == 1 && ob->x > player->x) ) // already ran past Keen?\r
-                 && US_RndT() < 8 )\r
-               || !OnScreen(ob) )      // always stop running when off-screen\r
-       {\r
-               //\r
-               // stop running\r
-               //\r
-               ob->temp2 = 0;\r
-               if (ob->state == &s_nospikerun1)\r
-               {\r
-                       ob->state = &s_nospikewalk2;\r
-               }\r
-               else if (ob->state == &s_nospikerun2)\r
-               {\r
-                       ob->state = &s_nospikewalk3;\r
-               }\r
-               else if (ob->state == &s_nospikerun3)\r
-               {\r
-                       ob->state = &s_nospikewalk4;\r
-               }\r
-               else if (ob->state == &s_nospikerun4)\r
-               {\r
-                       ob->state = &s_nospikewalk1;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Nospike\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Nospike(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-       }\r
-       else if (hit->obclass == stunshotobj)\r
-       {\r
-               if (--ob->temp4 == 0)   // handle health\r
-               {\r
-                       StunObj(ob, hit, &s_nospikestun);\r
-                       ob->yspeed = -24;\r
-               }\r
-               else\r
-               {\r
-                       if (player->x > ob->x)\r
-                       {\r
-                               ob->xdir = 1;\r
-                       }\r
-                       else\r
-                       {\r
-                               ob->xdir = -1;\r
-                       }\r
-                       ob->temp2 |= 0x400;     // draw white 4 times\r
-                       ob->needtoreact = true;\r
-                       if (ob->state == &s_nospikestand || ob->state == &s_nospikewalk1)\r
-                       {\r
-                               ChangeState(ob, &s_nospikerun2);\r
-                       }\r
-                       else if (ob->state == &s_nospikewalk2)\r
-                       {\r
-                               ChangeState(ob, &s_nospikerun3);\r
-                       }\r
-                       else if (ob->state == &s_nospikewalk3)\r
-                       {\r
-                               ChangeState(ob, &s_nospikerun4);\r
-                       }\r
-                       else if (ob->state == &s_nospikewalk4)\r
-                       {\r
-                               ChangeState(ob, &s_nospikerun1);\r
-                       }\r
-                       ExplodeShot(hit);\r
-               }\r
-       }\r
-       else if (hit->obclass == nospikeobj\r
-               && (hit->temp2 & 0xFF) && (ob->temp2 & 0xFF)    // both nospikes are running?\r
-               && hit->xdir != ob->xdir)       // running in opposite directions?\r
-       {\r
-               //\r
-               // stun both nospikes\r
-               //\r
-               ob->temp1=ob->temp2=ob->temp3=hit->temp1=hit->temp2=hit->temp3 = 0;\r
-               ob->temp4 = hit->temp4 = ob->obclass;\r
-               ChangeState(ob, &s_nospikestun);\r
-               ChangeState(hit, &s_nospikestun);\r
-               SD_PlaySound(SND_SMASH);\r
-               ob->obclass = hit->obclass = stunnedobj;\r
-               ob->yspeed = hit->yspeed = -24;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_NospikeConfused\r
-=\r
-===========================\r
-*/\r
-\r
-void T_NospikeConfused(objtype* ob)\r
-{\r
-       RF_RemoveSprite((void**)&ob->temp3);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_NospikeConfused\r
-=\r
-===========================\r
-*/\r
-\r
-void R_NospikeConfused(objtype *ob)\r
-{\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-       RF_PlaceSprite((void**)&ob->temp3, ob->x+TILEGLOBAL, ob->y-8*PIXGLOBAL, QUESTIONMARKSPR, spritedraw, 3);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_NospikeFall\r
-=\r
-===========================\r
-*/\r
-\r
-void R_NospikeFall(objtype *ob)\r
-{\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-       if (ob->hitnorth)\r
-       {\r
-               ob->temp1=ob->temp2=ob->temp3 = 0;\r
-               ob->temp4 = ob->obclass;\r
-               ChangeState(ob, &s_nospikestun);\r
-               SD_PlaySound(SND_SMASH);\r
-               ob->obclass = stunnedobj;\r
-               ob->yspeed = -24;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_NospikeRun\r
-=\r
-===========================\r
-*/\r
-\r
-void R_NospikeRun(objtype *ob)\r
-{\r
-       if (ob->hitnorth)\r
-       {\r
-               ob->temp1 = 0;  // on solid ground\r
-               if (ob->hiteast || ob->hitwest)\r
-               {\r
-                       ob->x -= ob->xdir << 7;\r
-                       NewState(ob, &s_nospikestand);\r
-                       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-                       ob->temp2 = 0;  // no longer running or flashing white\r
-                       return;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (++ob->temp1 == 6)   // not on solid ground for 6 steps?\r
-               {\r
-                       ChangeState(ob, &s_nospikeconfused1);\r
-#if 0\r
-                       // bugfix:\r
-                       ob->nothink = 0;        // to make sure T_NospikeConfused can remove the question mark sprite\r
-#endif\r
-               }\r
-       }\r
-       if (ob->temp2 & 0xFF00)\r
-       {\r
-               ob->temp2 -= 0x100;\r
-               RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, maskdraw, ob->priority);\r
-       }\r
-       else\r
-       {\r
-               RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 GIK\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_gikwalk1      = {GIKWALKL1SPR,  GIKWALKR1SPR,  step,      false, true,  10, 128, 0, T_GikWalk, C_ClipTop, R_Walk, &s_gikwalk2};\r
-statetype s_gikwalk2      = {GIKWALKL2SPR,  GIKWALKR2SPR,  step,      false, true,  10, 128, 0, T_GikWalk, C_ClipTop, R_Walk, &s_gikwalk3};\r
-statetype s_gikwalk3      = {GIKWALKL3SPR,  GIKWALKR3SPR,  step,      false, true,  10, 128, 0, T_GikWalk, C_ClipTop, R_Walk, &s_gikwalk1};\r
-statetype s_gikjump       = {GIKJUMPLSPR,   GIKJUMPRSPR,   think,     false, false,  0,   0, 0, T_Projectile, C_ClipSide, R_GikJump, &s_gikslide1};\r
-statetype s_gikslide1     = {GIKSLIDEL1SPR, GIKSLIDER1SPR, stepthink, false, false,  6,   0, 0, T_GikSlide, C_Lethal, R_GikSlide, &s_gikslide2};\r
-statetype s_gikslide2     = {GIKSLIDEL2SPR, GIKSLIDER2SPR, stepthink, false, false,  6,   0, 0, T_GikSlide, C_Lethal, R_GikSlide, &s_gikslide1};\r
-statetype s_gikstand      = {GIKSLIDEL1SPR, GIKSLIDER1SPR, step,      false, true,  20,   0, 0, NULL, C_Lethal, R_Walk, &s_gikwalk1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnGik\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnGik(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = gikobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       if (US_RndT() < 0x80)\r
-       {\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xdir = -1;\r
-       }\r
-       new->ydir = 1;\r
-       NewState(new, &s_gikwalk1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_GikWalk\r
-=\r
-===========================\r
-*/\r
-\r
-void T_GikWalk(objtype *ob)\r
-{\r
-       Sint16 xdist;\r
-\r
-       if (ob->hitnorth != 9)  // if NOT on flat ground that kills Keen\r
-       {\r
-               xdist = player->x - ob->x;\r
-               if (player->bottom <= ob->bottom && ob->bottom - player->bottom <= 4*TILEGLOBAL)\r
-               {\r
-                       if (xdist < 0)\r
-                       {\r
-                               ob->xdir = -1;\r
-                       }\r
-                       else\r
-                       {\r
-                               ob->xdir = 1;\r
-                       }\r
-                       if (xdist >= -7*TILEGLOBAL && xdist <= 7*TILEGLOBAL\r
-                               && (xdist <= -TILEGLOBAL || xdist >= TILEGLOBAL) )\r
-                       {\r
-                               if (xdist < 0)\r
-                               {\r
-                                       ob->xspeed = -40;\r
-                               }\r
-                               else\r
-                               {\r
-                                       ob->xspeed = 40;\r
-                               }\r
-                               ob->yspeed = -28;\r
-                               ob->state = &s_gikjump;\r
-                               SD_PlaySound(SND_GIKJUMP);\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_GikSlide\r
-=\r
-===========================\r
-*/\r
-\r
-void T_GikSlide(objtype *ob)\r
-{\r
-       // tic masks for friction, based on slope type and direction\r
-       // 0 - no friction\r
-       // 7 - lowest friction (speed decreases every 8 tics)\r
-       // 3 - medium friction (speed decreases every 4 tics)\r
-       // 1 - highest friction (speed decreases every 2 tics)\r
-       static Sint16 rticmask[8] = {0, 7, 0, 0, 0, 3, 3, 1};\r
-       static Sint16 lticmask[8] = {0, 7, 3, 3, 1, 0, 0, 0};\r
-\r
-       Sint16 ticmask;\r
-       Sint16 slope;\r
-       Sint32 i;\r
-\r
-       DoGravity(ob);\r
-\r
-       slope = ob->hitnorth & 7;\r
-       if (ob->xdir == 1)\r
-       {\r
-               ticmask = rticmask[slope];\r
-       }\r
-       else\r
-       {\r
-               ticmask = lticmask[slope];\r
-       }\r
-\r
-       if (ob->xspeed == 0 && ob->hitnorth)\r
-       {\r
-               ob->state = &s_gikstand;\r
-       }\r
-       else\r
-       {\r
-               for (i = lasttimecount-tics; i < lasttimecount; i++)\r
-               {\r
-                       if (ticmask && !(i & ticmask))\r
-                       {\r
-                               if ((ob->xspeed < 0 && ++ob->xspeed == 0)\r
-                                       || (ob-> xspeed > 0 && --ob->xspeed == 0))\r
-                               {\r
-                                       ob->state = &s_gikstand;\r
-                                       return;\r
-                               }\r
-                       }\r
-                       xtry += ob->xspeed;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_GikJump\r
-=\r
-===========================\r
-*/\r
-\r
-void R_GikJump(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
-               SD_PlaySound(SND_GIKLAND);\r
-               ChangeState(ob, ob->state->nextstate);\r
-       }\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_GikSlide\r
-=\r
-===========================\r
-*/\r
-\r
-void R_GikSlide(objtype *ob)\r
-{\r
-       if ((ob->hiteast && ob->xspeed < 0) || (ob->hitwest && ob->xspeed > 0))\r
-               ob->xspeed = 0;\r
-\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\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_yes;   // BUG? NOT removable in Keen 6 (checked v1.0, v1.4 and v1.5)\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
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 ORBATRIX\r
-\r
-temp1 = bounce counter\r
-temp2 = amount to move up during uncurl animation\r
-temp3 = float offset\r
-temp4 = float direction (up or down)\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_orbatrix1       = {ORBATRIXL1SPR,    ORBATRIXR1SPR,    slide,     false, true,  12, 16, 0, T_OrbatrixFly, C_Orbatrix, R_Orbatrix, &s_orbatrix2};\r
-statetype s_orbatrix2       = {ORBATRIXL2SPR,    ORBATRIXR2SPR,    slide,     false, true,  12, 16, 0, T_OrbatrixFly, C_Orbatrix, R_Orbatrix, &s_orbatrix1};\r
-statetype s_orbatrixcurl1   = {ORBATRIX1SPR,     ORBATRIX1SPR,     stepthink, false, true,  12,  0, 0, NULL, C_Orbatrix, R_Orbatrix, &s_orbatrixcurl2};\r
-statetype s_orbatrixcurl2   = {ORBATRIXCURLSPR,  ORBATRIXCURLSPR,  stepthink, false, true,  12,  0, 0, NULL, C_Orbatrix, R_Orbatrix, &s_orbatrixcurl3};\r
-statetype s_orbatrixcurl3   = {ORBATRIXCURLSPR,  ORBATRIXCURLSPR,  think,     false, true,  12,  0, 0, T_OrbatrixCurl, C_Orbatrix, R_Orbatrix, &s_orbatrixbounce1};\r
-statetype s_orbatrixuncurl1 = {ORBATRIXSPIN1SPR, ORBATRIXSPIN1SPR, think,     false, false, 12,  0, 0, T_OrbatrixUncurl, C_OrbatrixBounce, R_Draw, &s_orbatrixuncurl2};\r
-statetype s_orbatrixuncurl2 = {ORBATRIXCURLSPR,  ORBATRIXCURLSPR,  step,      false, false, 12,  0, 0, NULL, C_OrbatrixBounce, R_Draw, &s_orbatrixidle1};\r
-statetype s_orbatrixidle1   = {ORBATRIX1SPR,     ORBATRIX1SPR,     stepthink, false, true,  12,  0, 0, NULL, C_Orbatrix, R_Orbatrix, &s_orbatrixidle2};\r
-statetype s_orbatrixidle2   = {ORBATRIX2SPR,     ORBATRIX2SPR,     stepthink, false, true,  12,  0, 0, NULL, C_Orbatrix, R_Orbatrix, &s_orbatrixidle3};\r
-statetype s_orbatrixidle3   = {ORBATRIX3SPR,     ORBATRIX3SPR,     stepthink, false, true,  12,  0, 0, NULL, C_Orbatrix, R_Orbatrix, &s_orbatrixidle4};\r
-statetype s_orbatrixidle4   = {ORBATRIX4SPR,     ORBATRIX4SPR,     stepthink, false, true,  12,  0, 0, NULL, C_Orbatrix, R_Orbatrix, &s_orbatrix1};\r
-statetype s_orbatrixbounce1 = {ORBATRIXSPIN4SPR, ORBATRIXSPIN1SPR, stepthink, false, false,  6,  0, 0, T_Projectile, C_OrbatrixBounce, R_OrbatrixBounce, &s_orbatrixbounce2};\r
-statetype s_orbatrixbounce2 = {ORBATRIXSPIN3SPR, ORBATRIXSPIN2SPR, stepthink, false, false,  6,  0, 0, T_Projectile, C_OrbatrixBounce, R_OrbatrixBounce, &s_orbatrixbounce3};\r
-statetype s_orbatrixbounce3 = {ORBATRIXSPIN2SPR, ORBATRIXSPIN3SPR, stepthink, false, false,  6,  0, 0, T_Projectile, C_OrbatrixBounce, R_OrbatrixBounce, &s_orbatrixbounce4};\r
-statetype s_orbatrixbounce4 = {ORBATRIXSPIN1SPR, ORBATRIXSPIN4SPR, stepthink, false, false,  6,  0, 0, T_Projectile, C_OrbatrixBounce, R_OrbatrixBounce, &s_orbatrixbounce1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnOrbatrix\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnOrbatrix(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = orbatrixobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY) + -24*PIXGLOBAL;\r
-       if (US_RndT() < 0x80)\r
-       {\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xdir = -1;\r
-       }\r
-       new->ydir = 1;\r
-       new->temp4 = 1;\r
-       NewState(new, &s_orbatrix1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_OrbatrixFly\r
-=\r
-===========================\r
-*/\r
-\r
-void T_OrbatrixFly(objtype *ob)\r
-{\r
-       Sint16 dist;\r
-\r
-       if (US_RndT() < 0x20)\r
-       {\r
-               ob->state = &s_orbatrixidle1;\r
-               return;\r
-       }\r
-\r
-       if (ob->bottom != player->bottom)\r
-       {\r
-               return;\r
-       }\r
-\r
-       dist = player->x - ob->x;\r
-       ob->xdir = (dist < 0)? -1 : 1;\r
-       if (dist > -5*TILEGLOBAL && dist < 5*TILEGLOBAL)\r
-       {\r
-               ob->state = &s_orbatrixcurl1;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Orbatrix\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Orbatrix(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               ExplodeShot(hit);\r
-               ChangeState(ob, &s_orbatrixidle1);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Orbatrix\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Orbatrix(objtype *ob)\r
-{\r
-       //\r
-       // ugly hack: apply float offset before drawing the sprite\r
-       // (it's ugly because the sprite moves up/down, but the hitbox doesn't)\r
-       //\r
-       ob->y -= ob->temp3;\r
-       R_Walk(ob);\r
-       ob->y += ob->temp3;\r
-\r
-       //\r
-       // update the float offset\r
-       //\r
-       ob->temp3 = ob->temp3 + ob->temp4 * tics * 4;\r
-       if (ob->temp3 > 8*PIXGLOBAL)\r
-       {\r
-               ob->temp3 = 8*PIXGLOBAL;\r
-               ob->temp4 = -1;\r
-       }\r
-       else if (ob->temp3 < -8*PIXGLOBAL)\r
-       {\r
-               ob->temp3 = -8*PIXGLOBAL;\r
-               ob->temp4 = 1;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_OrbatrixBounce\r
-=\r
-===========================\r
-*/\r
-\r
-void R_OrbatrixBounce(objtype *ob)\r
-{\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-\r
-       if (ob->hitnorth)\r
-       {\r
-               ob->yspeed = -ob->yspeed;\r
-       }\r
-       if (ob->hitnorth || ob->hitwest || ob->hiteast)\r
-       {\r
-               ob->xspeed = -ob->xspeed;\r
-               SD_PlaySound(SND_ORBATRIXBOUNCE);\r
-               if (ob->hitnorth && --ob->temp1 == 0)\r
-               {\r
-                       ChangeState(ob, &s_orbatrixuncurl1);\r
-                       ob->temp2 = 24*PIXGLOBAL;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_OrbatrixCurl\r
-=\r
-===========================\r
-*/\r
-\r
-void T_OrbatrixCurl(objtype *ob)\r
-{\r
-       if (ob->temp3 >= 16)\r
-       {\r
-               ob->xspeed = ob->xdir * 60;\r
-               ob->yspeed = -32;\r
-               ob->y -= ob->temp3;\r
-               ob->temp1 = 5;  // bounce 5 times\r
-               ob->state = ob->state->nextstate;\r
-       }\r
-       ob->needtoreact = true;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_OrbatrixUncurl\r
-=\r
-===========================\r
-*/\r
-\r
-void T_OrbatrixUncurl(objtype *ob)\r
-{\r
-       ob->temp2 += (ytry = tics * -8);\r
-       if (ob->temp2 <= 0)\r
-       {\r
-               ytry -= ob->temp2;\r
-               ob->state = ob->state->nextstate;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_OrbatrixBounce\r
-=\r
-===========================\r
-*/\r
-\r
-void C_OrbatrixBounce(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
-               ob->xspeed = 0;\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 BIP\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_bipstand      = {BIPSTANDSPR,    BIPSTANDSPR,    step,  false, true, 30,  0, 0, NULL, C_Bip, R_Walk, &s_bipwalk1};\r
-statetype s_bipwalk1      = {BIPWALKL1SPR,   BIPWALKR1SPR,   step,  true,  true,  4, 32, 0, T_BipWalk, C_Bip, R_Walk, &s_bipwalk2};\r
-statetype s_bipwalk2      = {BIPWALKL2SPR,   BIPWALKR2SPR,   step,  true,  true,  4, 32, 0, T_BipWalk, C_Bip, R_Walk, &s_bipwalk3};\r
-statetype s_bipwalk3      = {BIPWALKL3SPR,   BIPWALKR3SPR,   step,  true,  true,  4, 32, 0, T_BipWalk, C_Bip, R_Walk, &s_bipwalk4};\r
-statetype s_bipwalk4      = {BIPWALKL4SPR,   BIPWALKR4SPR,   step,  true,  true,  4, 32, 0, T_BipWalk, C_Bip, R_Walk, &s_bipwalk1};\r
-statetype s_bipsquished   = {BIPSQUISHEDSPR, BIPSQUISHEDSPR, think, false, true,  0,  0, 0, T_Projectile, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= T_BipWalk\r
-=\r
-===========================\r
-*/\r
-\r
-void T_BipWalk(objtype *ob)\r
-{\r
-       if (ob->bottom == player->bottom)\r
-       {\r
-               if (ob->right < player->left - 4*PIXGLOBAL)\r
-                       ob->xdir = 1;\r
-\r
-               if (ob->left > player->right + 4*PIXGLOBAL)\r
-                       ob->xdir = -1;\r
-       }\r
-       else if (US_RndT() < 0x10)\r
-       {\r
-               ob->xdir = -ob->xdir;\r
-               ob->state = &s_bipstand;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Bip\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Bip(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj && hit->ymove > 0)\r
-       {\r
-               SD_PlaySound(SND_BIPSQUISH);\r
-               ob->obclass = inertobj;\r
-               ChangeState(ob, &s_bipsquished);\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 BIPSHIP\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_bipship         = {BIPSHIPLSPR,        BIPSHIPRSPR,        think,     false, true,      0, 0, 0, T_BipshipFly, C_Bipship, R_Draw, &s_bipship};\r
-statetype s_bipshipshot     = {BIPSHIPSHOTSPR,     BIPSHIPSHOTSPR,     think,     false, false,     0, 0, 0, T_Velocity, C_Lethal, R_BipShot, NULL};\r
-statetype s_bipshipturn1    = {BIPSHIPRTURN1SPR,   BIPSHIPLTURN1SPR,   stepthink, false, true,     10, 0, 0, T_BipshipTurn, C_Bipship, R_Draw, &s_bipshipturn2};\r
-statetype s_bipshipturn2    = {BIPSHIPRTURN2SPR,   BIPSHIPLTURN2SPR,   stepthink, false, true,     10, 0, 0, T_BipshipTurn, C_Bipship, R_Draw, &s_bipshipturn3};\r
-statetype s_bipshipturn3    = {BIPSHIPRTURN3SPR,   BIPSHIPLTURN3SPR,   stepthink, false, true,     10, 0, 0, T_BipshipTurn, C_Bipship, R_Draw, &s_bipshipturn4};\r
-statetype s_bipshipturn4    = {BIPSHIPRTURN4SPR,   BIPSHIPLTURN4SPR,   stepthink, false, true,     10, 0, 0, T_BipshipTurn, C_Bipship, R_Draw, &s_bipship};\r
-statetype s_bipshipexplode1 = {BIPSHIPEXPLODE2SPR, BIPSHIPEXPLODE1SPR, think,     false, false,     0, 0, 0, T_Projectile, NULL, R_Land, &s_bipshipexplode2};\r
-statetype s_bipshipexplode2 = {BIPSHIPEXPLODE2SPR, BIPSHIPEXPLODE1SPR, step,      true,  false,     1, 0, 0, T_BipshipExplode, NULL, R_Land, &s_bipshipexplode3};\r
-statetype s_bipshipexplode3 = {BIPSHIPEXPLODE5SPR, BIPSHIPEXPLODE5SPR, step,      true,  false, 30000, 0, 0, NULL, NULL, R_Land, &s_bipshipexplode3};\r
-statetype s_bipshipsmoke1   = {BIPSHIPEXPLODE3SPR, BIPSHIPEXPLODE3SPR, step,      true,  false,    10, 0, 0, NULL, NULL, R_Draw, &s_bipshipsmoke2};\r
-statetype s_bipshipsmoke2   = {BIPSHIPEXPLODE4SPR, BIPSHIPEXPLODE4SPR, step,      true,  false,    10, 0, 0, NULL, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnBipship\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnBipship(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = bipshipobj;\r
-       new->active = ac_yes;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY)+ -24*PIXGLOBAL;\r
-       if (US_RndT() < 0x80)\r
-       {\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xdir = -1;\r
-       }\r
-       new->xspeed = new->xdir * 20;\r
-       NewState(new, &s_bipship);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_BipShot\r
-=\r
-===========================\r
-*/\r
-\r
-void R_BipShot(objtype *ob)\r
-{\r
-       if (ob->hitnorth || ob->hitsouth || ob->hiteast || ob->hitwest)\r
-       {\r
-               RemoveObj(ob);\r
-       }\r
-       else\r
-       {\r
-               RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_BipshipTurn\r
-=\r
-===========================\r
-*/\r
-\r
-void T_BipshipTurn(objtype *ob)\r
-{\r
-       AccelerateX(ob, ob->xdir, 20);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_BipshipFly\r
-=\r
-===========================\r
-*/\r
-\r
-void T_BipshipFly(objtype *ob)\r
-{\r
-       Uint16 far *map;\r
-       Sint16 dir;\r
-       Uint16 tile, tx, ty;\r
-\r
-       AccelerateX(ob, ob->xdir, 20);\r
-       dir = ob->xdir;\r
-       if (player->bottom + TILEGLOBAL - ob->bottom <= 2*TILEGLOBAL)\r
-       {\r
-               if (player->x < ob->x)\r
-               {\r
-                       dir = -1;\r
-               }\r
-               else\r
-               {\r
-                       dir = 1;\r
-               }\r
-               if (ob->xdir == dir && US_RndT() < tics*4)\r
-               {\r
-                       SD_PlaySound(SND_KEENFIRE);\r
-                       GetNewObj(true);\r
-                       new->obclass = mshotobj;\r
-                       new->active = ac_removable;\r
-                       new->priority = 1;\r
-                       if (ob->xdir == 1)\r
-                       {\r
-                               new->x = ob->x + TILEGLOBAL;\r
-                               new->xspeed = 64;\r
-                       }\r
-                       else\r
-                       {\r
-                               new->x = ob->x;\r
-                               new->xspeed = -64;\r
-                       }\r
-                       new->y = ob->y + 10*PIXGLOBAL;\r
-                       new->yspeed = 16;\r
-                       NewState(new, &s_bipshipshot);\r
-               }\r
-       }\r
-\r
-       tx = ob->tilemidx + dir*4;\r
-       map = mapsegs[1] + mapbwidthtable[ob->tiletop]/2 + tx;\r
-\r
-       for (ty = ob->tiletop; ty <= ob->tilebottom; ty++, map += mapwidth)\r
-       {\r
-               tile = *map;\r
-               if (tinf[tile+EASTWALL] || tinf[tile+WESTWALL])\r
-               {\r
-                       dir = -dir;\r
-                       goto check_turn;\r
-               }\r
-       }\r
-       tile = *map;\r
-       if (!tinf[tile+NORTHWALL])\r
-       {\r
-               dir = -dir;\r
-       }\r
-check_turn:\r
-       if (dir != ob->xdir)\r
-       {\r
-               ob->xdir = dir;\r
-               ChangeState(ob, &s_bipshipturn1);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_BipshipExplode\r
-=\r
-===========================\r
-*/\r
-\r
-void T_BipshipExplode(objtype *ob)\r
-{\r
-       SD_PlaySound(SND_BIPSHIPEXPLODE);\r
-\r
-       GetNewObj(true);\r
-       new->obclass = inertobj;\r
-       new->active = ac_yes;\r
-       new->priority = 2;\r
-       new->x = ob->x;\r
-       new->y = ob->y - 24*PIXGLOBAL;\r
-       NewState(new, &s_bipshipsmoke1);\r
-\r
-       GetNewObj(true);\r
-       new->obclass = bipobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = ob->x;\r
-       new->y = ob->y - 8*PIXGLOBAL;\r
-       if (US_RndT() < 0x80)\r
-       {\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xdir = -1;\r
-       }\r
-       NewState(new, &s_bipstand);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Bipship\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Bipship(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               ExplodeShot(hit);\r
-               ChangeState(ob, &s_bipshipexplode1);\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 FLECT\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_flectstand = {FLECTSTANDLSPR, FLECTSTANDRSPR, think, false, true, 60,   0, 0, T_FlectStand, C_Flect, R_Flect, &s_flectwalk1};\r
-statetype s_flectturn  = {FLECTSTANDSPR,  FLECTSTANDSPR,  step,  false, true,  8,   0, 0, NULL, C_Flect, R_Flect, &s_flectwalk1};\r
-statetype s_flectwalk1 = {FLECTWALKL1SPR, FLECTWALKR1SPR, step,  false, true, 10, 128, 0, T_FlectWalk, C_Flect, R_Flect, &s_flectwalk2};\r
-statetype s_flectwalk2 = {FLECTWALKL2SPR, FLECTWALKR2SPR, step,  false, true, 10, 128, 0, T_FlectWalk, C_Flect, R_Flect, &s_flectwalk3};\r
-statetype s_flectwalk3 = {FLECTWALKL3SPR, FLECTWALKR3SPR, step,  false, true, 10, 128, 0, T_FlectWalk, C_Flect, R_Flect, &s_flectwalk4};\r
-statetype s_flectwalk4 = {FLECTWALKL4SPR, FLECTWALKR4SPR, step,  false, true, 10, 128, 0, T_FlectWalk, C_Flect, R_Flect, &s_flectwalk1};\r
-statetype s_flectstun  = {FLECTSTUNSPR,   FLECTSTUNSPR,   think, false, false, 0,   0, 0, T_Projectile, NULL, R_Stunned, &s_flectstun};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnFlect\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnFlect(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = flectobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY) + -1*TILEGLOBAL;\r
-       if (US_RndT() < 0x80)\r
-       {\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xdir = -1;\r
-       }\r
-       new->ydir = 1;\r
-       NewState(new, &s_flectwalk1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_FlectStand\r
-=\r
-===========================\r
-*/\r
-\r
-void T_FlectStand(objtype *ob)\r
-{\r
-       if (player->x < ob->x)\r
-       {\r
-               if (ob->xdir != -1)\r
-               {\r
-                       ob->state = &s_flectturn;\r
-                       ob->xdir = -1;\r
-               }\r
-               else\r
-               {\r
-                       ob->state = &s_flectwalk1;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (ob->xdir != 1)\r
-               {\r
-                       ob->state = &s_flectturn;\r
-                       ob->xdir = 1;\r
-               }\r
-               else\r
-               {\r
-                       ob->state = &s_flectwalk1;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_FlectWalk\r
-=\r
-===========================\r
-*/\r
-\r
-void T_FlectWalk(objtype *ob)\r
-{\r
-       if (player->x < ob->x && ob->xdir == 1)\r
-       {\r
-               if (ob->xdir != -1)     // always true here!\r
-               {\r
-                       ob->state = &s_flectturn;\r
-               }\r
-               ob->xdir = -1;\r
-       }\r
-\r
-       if (player->x > ob->x && ob->xdir == -1)\r
-       {\r
-               if (ob->xdir != 1)      // always true here!\r
-               {\r
-                       ob->state = &s_flectturn;\r
-               }\r
-               ob->xdir = 1;\r
-       }\r
-\r
-       if (US_RndT() < 0x20)\r
-       {\r
-               ob->state = &s_flectstand;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Flect\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Flect(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               ClipToSpriteSide(hit, ob);\r
-       }\r
-       else if (hit->obclass == stunshotobj)\r
-       {\r
-               if (hit->xdir == 0)\r
-               {\r
-                       StunObj(ob, hit, &s_flectstun);\r
-               }\r
-               else if (hit->xdir != ob->xdir)\r
-               {\r
-                       // reflect shot:\r
-                       hit->xdir = ob->xdir;\r
-                       hit->temp4 = true;      // shot can now stun Keen\r
-                       SD_PlaySound(SND_SHOTBOUNCE);\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Flect\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Flect(objtype *ob)\r
-{\r
-       if (ob->xdir == 1 && ob->hitwest)\r
-       {\r
-               ob->x -= ob->xmove;\r
-               ob->xdir = -1;\r
-               ob->nothink = US_RndT() >> 5;\r
-               ChangeState(ob, ob->state);\r
-       }\r
-       else if (ob->xdir == -1 && ob->hiteast)\r
-       {\r
-               ob->x -= ob->xmove;\r
-               ob->xdir = 1;\r
-               ob->nothink = US_RndT() >> 5;\r
-               ChangeState(ob, ob->state);\r
-       }\r
-       else if (!ob->hitnorth)\r
-       {\r
-               ob->x -= ob->xmove;\r
-               ob->xdir = -ob->xdir;\r
-               ChangeState(ob, ob->state);\r
-       }\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r