]> 4ch.mooo.com Git - 16.git/blobdiff - 16/keen456/KEEN4-6/KEEN6/K6_ACT1.C
added keen 4-6 rebuild code for reference.... i need to stop doing this... xD
[16.git] / 16 / keen456 / KEEN4-6 / KEEN6 / K6_ACT1.C
diff --git a/16/keen456/KEEN4-6/KEEN6/K6_ACT1.C b/16/keen456/KEEN4-6/KEEN6/K6_ACT1.C
deleted file mode 100755 (executable)
index a2004bd..0000000
+++ /dev/null
@@ -1,2137 +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_ACT1.C\r
-=========\r
-\r
-Contains the following actor types (in this order):\r
-\r
-- some shared routines\r
-- Bonus Items\r
-- Grabbiter\r
-- Rocket\r
-- Grapple spots\r
-- Satellite\r
-- Quest Items (Sandwich, Grappling Hook, Passcard, Molly)\r
-- Platforms\r
-- falling platforms\r
-- static platforms\r
-- Goplat platforms\r
-- Trick platforms\r
-- Bloog\r
-- Blooguard\r
-- Blooglet\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
-= 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
-#ifdef KEEN6Ev15\r
-       if (!wall)\r
-       {\r
-               return;\r
-       }\r
-       else\r
-#else\r
-       if (wall)\r
-#endif\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
-\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
-\r
-statetype s_splash1   = {VIVASPLASH1SPR, VIVASPLASH1SPR, step, false, false, 8, 0, 0, NULL, NULL, R_Draw, &s_splash2};\r
-statetype s_splash2   = {VIVASPLASH2SPR, VIVASPLASH2SPR, step, false, false, 8, 0, 0, NULL, NULL, R_Draw, &s_splash3};\r
-statetype s_splash3   = {VIVASPLASH3SPR, VIVASPLASH3SPR, step, false, false, 8, 0, 0, NULL, NULL, R_Draw, &s_splash4};\r
-statetype s_splash4   = {VIVASPLASH4SPR, VIVASPLASH4SPR, 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\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
-                                                 GRABBITER\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_grabbiter1      = {GRABBITER1SPR,      GRABBITER1SPR,      step, false, false, 12, 0, 0, NULL, C_Grabbiter, R_Draw, &s_grabbiter2};\r
-statetype s_grabbiter2      = {GRABBITER2SPR,      GRABBITER2SPR,      step, false, false, 12, 0, 0, NULL, C_Grabbiter, R_Draw, &s_grabbiter1};\r
-statetype s_grabbitersleep1 = {GRABBITERSLEEP1SPR, GRABBITERSLEEP1SPR, step, false, false, 12, 0, 0, NULL, NULL, R_Draw, &s_grabbitersleep2};\r
-statetype s_grabbitersleep2 = {GRABBITERSLEEP2SPR, GRABBITERSLEEP2SPR, step, false, false, 12, 0, 0, NULL, NULL, R_Draw, &s_grabbitersleep1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnGrabbiter\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnGrabbiter(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->active = ac_yes;\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 2;\r
-       new->obclass = grabbiterobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       if (gamestate.sandwichstate == 2)\r
-       {\r
-               NewState(new, &s_grabbitersleep1);\r
-       }\r
-       else\r
-       {\r
-               NewState(new, &s_grabbiter1);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Grabbiter\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Grabbiter(objtype *ob, objtype *hit)\r
-{\r
-       // BUG: this is executed for every object, not just (Map-)Keen!\r
-       switch (gamestate.sandwichstate)\r
-       {\r
-       case 0:\r
-               CA_CacheGrChunk(KEENTALK1PIC);\r
-               SD_PlaySound(SND_GRABBITER);\r
-               VW_FixRefreshBuffer();\r
-               US_CenterWindow(26, 8);\r
-               VWB_DrawPic(WindowX+WindowW-48, WindowY, KEENTALK1PIC);\r
-               WindowW -= 48;\r
-               PrintY += 5;\r
-               US_CPrint(\r
-                       "Oh, no!\n"\r
-                       "It's a slavering\n"\r
-                       "Grabbiter! He says,\n"\r
-                       "\"Get me lunch and\n"\r
-                       "I'll tell ya a secret!\""\r
-                       );\r
-               VW_UpdateScreen();\r
-               SD_PlaySound(SND_NOWAY);\r
-               VW_WaitVBL(30);\r
-               IN_ClearKeysDown();\r
-               IN_Ack();\r
-               RF_ForceRefresh();\r
-\r
-               //push Keen back\r
-               xtry = -hit->xmove;\r
-               ytry = -hit->ymove;\r
-               hit->xdir = hit->ydir = 0;\r
-               ClipToWalls(hit);\r
-               break;\r
-\r
-       case 1:\r
-               gamestate.sandwichstate++;\r
-               CA_CacheGrChunk(KEENTALK1PIC);\r
-               VW_FixRefreshBuffer();\r
-               US_CenterWindow(26, 8);\r
-               VWB_DrawPic(WindowX+WindowW-48, WindowY, KEENTALK1PIC);\r
-               WindowW -= 48;\r
-               PrintY += 2;\r
-               US_CPrint(\r
-                       "The Grabbiter grabs\n"\r
-                       "the gigantic sandwich,\n"\r
-                       "downs it in one bite,\n"\r
-                       "and says,\"Here's your\n"\r
-                       "secret. Big meals\n"\r
-                       "make me sleepy!\n"     // BUG: quote is missing at the end\r
-                       );\r
-               VW_UpdateScreen();\r
-               VW_WaitVBL(30);\r
-               IN_ClearKeysDown();\r
-               IN_Ack();\r
-               ChangeState(ob, &s_grabbitersleep1);\r
-               RF_ForceRefresh();\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 ROCKET\r
-\r
-temp1 = direction\r
-temp2 = countdown to next dir check\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_rocket        = {ROCKETSPR,     ROCKETSPR,     think,     false, false, 0, 0, 0, NULL, C_Rocket, R_Draw, NULL};\r
-statetype s_rocketfly1    = {ROCKETFLY1SPR, ROCKETFLY1SPR, stepthink, false, false, 8, 0, 0, T_RocketFly, C_RocketFly, R_Draw, &s_rocketfly2};\r
-statetype s_rocketfly2    = {ROCKETFLY2SPR, ROCKETFLY2SPR, stepthink, false, false, 8, 0, 0, T_RocketFly, C_RocketFly, R_Draw, &s_rocketfly1};\r
-statetype s_keenrocket    = {0,             0,             think,     false, false, 0, 0, 0, T_Rocket, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnRocket\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnRocket(Uint16 tileX, Uint16 tileY, Uint16 state)\r
-{\r
-       if (gamestate.rocketstate == state)\r
-       {\r
-               GetNewObj(false);\r
-               new->active = ac_yes;\r
-               new->needtoclip = cl_noclip;\r
-               new->priority = 3;\r
-               new->obclass = rocketobj;\r
-               new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-               new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-               NewState(new, &s_rocket);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Rocket\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Rocket(objtype *ob)\r
-{\r
-       ob->needtoreact = true;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Rocket\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Rocket(objtype *ob, objtype *hit)\r
-{\r
-       // BUG: this is executed for every object, not just (Map-)Keen!\r
-       switch (gamestate.passcardstate)\r
-       {\r
-       case 0:\r
-               CA_CacheGrChunk(KEENTALK1PIC);\r
-               VW_FixRefreshBuffer();\r
-               US_CenterWindow(26, 8);\r
-               VWB_DrawPic(WindowX+WindowW-48, WindowY, KEENTALK1PIC);\r
-               WindowW -= 48;\r
-               PrintY += 5;\r
-               US_CPrint(\r
-                       "The door makes a loud\n"\r
-                       "blooping noise.\n"\r
-                       "It says,\n"\r
-                       "\"Passcard required\n"\r
-                       "for entry.\""\r
-                       );\r
-               VW_UpdateScreen();\r
-               SD_PlaySound(SND_NOWAY);\r
-               VW_WaitVBL(30);\r
-               IN_ClearKeysDown();\r
-               IN_Ack();\r
-               RF_ForceRefresh();\r
-\r
-               //push Keen back\r
-               xtry = -hit->xmove;\r
-               ytry = -hit->ymove;\r
-               hit->xdir = hit->ydir = 0;\r
-               ClipToWalls(hit);\r
-               break;\r
-\r
-       case 1:\r
-               ob->temp1 = arrow_North;\r
-               ob->temp2 = TILEGLOBAL;\r
-               ChangeState(ob, &s_rocketfly1);\r
-\r
-               hit->x = ob->x;\r
-               hit->y = ob->y + TILEGLOBAL;\r
-               hit->needtoclip = cl_noclip;\r
-               ChangeState(hit, &s_keenrocket);\r
-               SD_PlaySound(SND_ROCKETSTART);\r
-               SD_WaitSoundDone();\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_RocketFly\r
-=\r
-===========================\r
-*/\r
-\r
-void C_RocketFly(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               hit->x = ob->x;\r
-               hit->y = ob->y+TILEGLOBAL;\r
-               ChangeState(hit, hit->state);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_RocketFly\r
-=\r
-===========================\r
-*/\r
-\r
-void T_RocketFly(objtype *ob)\r
-{\r
-       Uint16 move, 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 == 0 && ytry == 0)\r
-       {\r
-               if (!SD_SoundPlaying())\r
-                       SD_PlaySound(SND_ROCKETFLY);\r
-\r
-               move = tics << 5;\r
-               if (ob->temp2 > move)\r
-               {\r
-                       ob->temp2 = ob->temp2 - move;\r
-                       dir = pdirx[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               xtry = move;\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               xtry = -move;\r
-                       }\r
-                       dir = pdiry[ob->temp1];\r
-                       if (dir == 1)\r
-                       {\r
-                               ytry = move;\r
-\r
-                       }\r
-                       else if (dir == -1)\r
-                       {\r
-                               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
-                       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
-                               ob->x += xtry;\r
-                               ob->y += ytry;\r
-                               ChangeState(ob, &s_rocket);\r
-\r
-                               player->x = CONVERT_TILE_TO_GLOBAL(tx+1) + 1*PIXGLOBAL;\r
-                               player->y = CONVERT_TILE_TO_GLOBAL(ty+1);\r
-                               player->obclass = keenobj;\r
-                               player->shapenum = WORLDKEENR3SPR;\r
-                               player->needtoclip = cl_midclip;\r
-                               NewState(player, &s_worldkeen);\r
-                               gamestate.rocketstate ^= 1;\r
-                       }\r
-                       else\r
-                       {\r
-                               move -= ob->temp2;\r
-                               ob->temp2 = TILEGLOBAL - move;\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
-                               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
-\r
-                                                 GRAPPLE SPOT\r
-\r
-temp1 = type (0 = top of cliff, 1 = bottom of cliff)\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_grapplespot   = {-1,                 -1,                 think, false, false,  0, 0,  0, NULL, C_GrappleSpot, R_Draw, NULL};\r
-statetype s_throwrope1    = {WORLDKEENTRHOW1SPR, WORLDKEENTRHOW1SPR, step,  false, false, 10, 0,  0, NULL, NULL, R_Draw, &s_throwrope2};\r
-statetype s_throwrope2    = {WORLDKEENTRHOW2SPR, WORLDKEENTRHOW2SPR, step,  false, false,  8, 0,  0, T_ThrowRope, NULL, R_Draw, &s_worldkeen};\r
-statetype s_climbrope1    = {WORLDKEENCLIMB1SPR, WORLDKEENCLIMB1SPR, slide, true,  false,  4, 0, 16, NULL, NULL, R_Draw, &s_climbrope2};\r
-statetype s_climbrope2    = {WORLDKEENCLIMB2SPR, WORLDKEENCLIMB2SPR, slide, true,  false,  4, 0, 16, T_ClimbRope, NULL, R_Draw, &s_climbrope1};\r
-statetype s_maprope       = {ROPETHROW2SPR,      ROPETHROW2SPR,      think, false, false,  0, 0,  0, NULL, NULL, R_Draw, NULL};\r
-statetype s_mapropeshort  = {ROPETHROW1SPR,      ROPETHROW1SPR,      step,  false, false, 10, 0,  0, NULL, NULL, R_Draw, &s_mapropeshort};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnGrappleSpot\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnGrappleSpot(Uint16 tileX, Uint16 tileY, Uint16 type)\r
-{\r
-       GetNewObj(false);\r
-       new->active = ac_yes;\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 2;\r
-       new->obclass = grapplespotobj;\r
-       new->tileleft = new->tileright = tileX;\r
-       new->tiletop = new->tilebottom = tileY;\r
-       new->temp1 = type;\r
-       new->x = new->left = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->right = new->left + TILEGLOBAL;\r
-       if (type)\r
-       {\r
-               new->y = new->top = CONVERT_TILE_TO_GLOBAL(tileY+1)-1;\r
-       }\r
-       else\r
-       {\r
-               new->y = new->top = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       }\r
-       new->bottom = new->top + 1;\r
-       NewState(new, &s_grapplespot);\r
-\r
-       if (gamestate.hookstate == 2 && type)\r
-       {\r
-               GetNewObj(false);\r
-               new->active = ac_yes;\r
-               new->needtoclip = cl_noclip;\r
-               new->priority = 0;\r
-               new->obclass = inertobj;\r
-               new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-               new->y = CONVERT_TILE_TO_GLOBAL(tileY+1);\r
-               NewState(new, &s_maprope);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_ThrowRope\r
-=\r
-===========================\r
-*/\r
-\r
-void T_ThrowRope(objtype *ob)\r
-{\r
-       GetNewObj(false);\r
-       new->active = ac_yes;\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 0;\r
-       new->obclass = inertobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(ob->tileright);\r
-       new->y = ob->y - 2*TILEGLOBAL;\r
-       NewState(new, &s_maprope);\r
-\r
-       ob->obclass = keenobj;\r
-       ob->shapenum = WORLDKEENU3SPR;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_ClimbRope\r
-=\r
-===========================\r
-*/\r
-\r
-void T_ClimbRope(objtype *ob)\r
-{\r
-       if (--ob->temp4 == 0)\r
-       {\r
-               if (ob->ydir == 1)\r
-               {\r
-                       ob->y += 3*PIXGLOBAL;\r
-                       ob->shapenum = WORLDKEEND3SPR;\r
-               }\r
-               else\r
-               {\r
-                       ob->y -= 3*PIXGLOBAL;\r
-                       ob->shapenum = WORLDKEENU3SPR;\r
-               }\r
-               ob->obclass = keenobj;\r
-               NewState(ob, &s_worldkeen);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_GrappleSpot\r
-=\r
-===========================\r
-*/\r
-\r
-void C_GrappleSpot(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               switch (gamestate.hookstate)\r
-               {\r
-               case 0:\r
-                       CA_CacheGrChunk(KEENTALK1PIC);\r
-                       VW_FixRefreshBuffer();\r
-                       US_CenterWindow(26, 8);\r
-                       VWB_DrawPic(WindowX+WindowW-48, WindowY, KEENTALK1PIC);\r
-                       WindowW -= 48;\r
-                       PrintY += 15;\r
-                       US_CPrint(\r
-                               "What a tall cliff!\n"\r
-                               "Wish I had a rope\n"\r
-                               "and grappling hook.\n"\r
-                               );\r
-                       VW_UpdateScreen();\r
-                       SD_PlaySound(SND_NOWAY);\r
-                       VW_WaitVBL(30);\r
-                       IN_ClearKeysDown();\r
-                       IN_Ack();\r
-                       RF_ForceRefresh();\r
-\r
-                       //push Keen back\r
-                       xtry = -hit->xmove;\r
-                       ytry = -hit->ymove;\r
-                       hit->xdir = hit->ydir = 0;\r
-                       ClipToWalls(hit);\r
-                       break;\r
-\r
-               case 1:\r
-                       gamestate.hookstate++;\r
-                       SD_PlaySound(SND_THROWROPE);\r
-                       ChangeState(hit, &s_throwrope1);\r
-                       hit->obclass = inertobj;\r
-                       break;\r
-\r
-               case 2:\r
-                       if (ob->temp1)\r
-                       {\r
-                               hit->y += 4*PIXGLOBAL;\r
-                               hit->temp4 = 6;\r
-                               hit->ydir = 1;\r
-                       }\r
-                       else\r
-                       {\r
-                               hit->y -= 4*PIXGLOBAL;\r
-                               hit->temp4 = 6;\r
-                               hit->ydir = -1;\r
-                       }\r
-                       NewState(hit, &s_climbrope1);\r
-                       hit->obclass = inertobj;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 SATELLITE\r
-\r
-temp1 = direction (satellite) / type (stop points)\r
-temp2 = countdown to next dir check\r
-temp3 = type of stop point touched (low byte: current; high byte: previous)\r
-        is updated every frame and resets to 0 when no longer touching a spot\r
-temp4 = type of last stop point passed over (1 or 2, never 0)\r
-        is updated when no longer touching the spot\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_satellitestopspot  = {-1,               -1,               think,     false, false,  0, 0, 0, NULL, NULL, NULL, NULL};\r
-statetype s_worldkeensatellite = {WORLDKEENHANGSPR, WORLDKEENHANGSPR, think,     false, false,  0, 0, 0, NULL, NULL, R_WorldKeenSatellite, NULL};\r
-statetype s_satellite1         = {SATELLITE1SPR,    SATELLITE1SPR,    stepthink, false, false, 10, 0, 0, T_Satellite, C_Satellite, R_Draw, &s_satellite2};\r
-statetype s_satellite2         = {SATELLITE2SPR,    SATELLITE2SPR,    stepthink, false, false, 10, 0, 0, T_Satellite, C_Satellite, R_Draw, &s_satellite3};\r
-statetype s_satellite3         = {SATELLITE3SPR,    SATELLITE3SPR,    stepthink, false, false, 10, 0, 0, T_Satellite, C_Satellite, R_Draw, &s_satellite4};\r
-statetype s_satellite4         = {SATELLITE4SPR,    SATELLITE4SPR,    stepthink, false, false, 10, 0, 0, T_Satellite, C_Satellite, R_Draw, &s_satellite1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnSatelliteStop\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnSatelliteStop(Uint16 tileX, Uint16 tileY, Uint16 type)\r
-{\r
-       GetNewObj(false);\r
-       new->active = ac_allways;\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 2;\r
-       new->obclass = satellitestopobj;\r
-       new->tileleft=new->tileright=tileX;\r
-       new->tiletop=new->tilebottom=tileY;\r
-       new->temp1 = (type ^ 1) + 1;    // type is either 0 or 1, so this just maps 0 to 2 and 1 to 1\r
-       new->x=new->left = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->right = new->left + TILEGLOBAL;\r
-       new->y=new->top = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       new->bottom = new->top + TILEGLOBAL;\r
-       NewState(new, &s_satellitestopspot);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnSatellite\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnSatellite(Uint16 tileX, Uint16 tileY)\r
-{\r
-       Sint16 dir;\r
-\r
-       GetNewObj(false);\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 2;\r
-       new->active = ac_allways;\r
-       new->obclass = satelliteobj;\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
-       NewState(new, &s_satellite1);\r
-\r
-       dir = arrow_West;\r
-       (mapsegs[2]+mapbwidthtable[tileY]/2)[tileX] = (dir+DIRARROWSTART);\r
-       new->temp1 = dir;\r
-       new->temp2 = TILEGLOBAL;\r
-       new->temp4 = 2;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Satellite\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Satellite(objtype *ob)\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 == 0 && ytry == 0)\r
-       {\r
-               //\r
-               // if current stop spot type is 0 (not touching a spot), but previous\r
-               // type is not 0, then set temp4 to the previous type\r
-               //\r
-               if (!(ob->temp3 & 0xFF) && (ob->temp3 & 0xFF00))\r
-               {\r
-                       ob->temp4 = ob->temp3 >> 8;\r
-               }\r
-               //\r
-               // move current type into previous type and set current stop type to 0\r
-               //\r
-               ob->temp3 <<= 8;\r
-\r
-               //\r
-               // follow the arrow path like a GoPlat\r
-               //\r
-               T_GoPlat(ob);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Satellite\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Satellite(objtype *ob, objtype *hit)\r
-{\r
-       Sint16 temp;\r
-       objtype *o;\r
-\r
-       if (hit->state == &s_satellitestopspot)\r
-       {\r
-               ob->temp3 |= hit->temp1;\r
-       }\r
-       else if (hit->obclass == keenobj)\r
-       {\r
-               //\r
-               // check if satellite has reaced a new stop spot\r
-               //\r
-               temp = ob->temp3 >> 8;\r
-               if (temp && temp != ob->temp4)\r
-               {\r
-                       SD_PlaySound(SND_GRABSATELLITE);\r
-                       //\r
-                       // update last spot value (don't grab or drop Keen until moved to the next spot)\r
-                       //\r
-                       ob->temp4 = temp;\r
-                       if (player->state == &s_worldkeensatellite)\r
-                       {\r
-                               //\r
-                               // drop Keen off at the current stop spot\r
-                               //\r
-                               for (o=player->next; o; o=o->next)\r
-                               {\r
-                                       if (o->obclass == satellitestopobj && o->temp1 == temp)\r
-                                       {\r
-                                               hit->x = o->x;\r
-                                               hit->y = o->y;\r
-                                               hit->shapenum = WORLDKEENU3SPR;\r
-                                               ChangeState(player, &s_worldkeen);\r
-                                               hit->needtoclip = cl_midclip;\r
-                                               return;\r
-                                       }\r
-                               }\r
-                       }\r
-                       else\r
-                       {\r
-                               //\r
-                               // grab and carry Keen\r
-                               //\r
-                               hit->x = ob->x + 12*PIXGLOBAL;\r
-                               hit->y = ob->y + 16*PIXGLOBAL;\r
-                               hit->needtoclip = cl_noclip;\r
-                               ChangeState(player, &s_worldkeensatellite);\r
-                       }\r
-               }\r
-               else if (hit->state == &s_worldkeensatellite)\r
-               {\r
-                       //\r
-                       // move Keen along with the satellite\r
-                       //\r
-                       hit->x = ob->x + 12*PIXGLOBAL;\r
-                       hit->y = ob->y + 16*PIXGLOBAL;\r
-                       ChangeState(hit, hit->state);\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_WorldKeenSatellite\r
-=\r
-===========================\r
-*/\r
-\r
-void R_WorldKeenSatellite(objtype *ob)\r
-{\r
-       RF_PlaceSprite(&ob->sprite, ob->x + 4*PIXGLOBAL, ob->y + 8*PIXGLOBAL, WORLDKEENHANGSPR, spritedraw, 1);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 SANDWICH\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_sandwich      = {SANDWICHSPR, SANDWICHSPR, think, false, false, 0, 0, 0, NULL, C_Molly, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnSandwich\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnSandwich(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 2;\r
-       new->obclass = sandwichobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       NewState(new, &s_sandwich);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 GRAPPLING HOOK\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_hook          = {HOOKSPR, HOOKSPR, think, false, false, 0, 0, 0, NULL, C_Molly, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnHook\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnHook(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 2;\r
-       new->obclass = hookobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       NewState(new, &s_hook);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 PASSCARD\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_passcard      = {PASSCARDSPR, PASSCARDSPR, think, false, false, 0, 0, 0, NULL, C_Molly, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnPasscard\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnPasscard(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 2;\r
-       new->obclass = passcardobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(tileX);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(tileY);\r
-       NewState(new, &s_passcard);\r
-}\r
-\r
-//============================================================================\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Molly\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Molly(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               switch (ob->obclass)\r
-               {\r
-               case sandwichobj:\r
-                       playstate = ex_sandwich;\r
-                       break;\r
-\r
-               case hookobj:\r
-                       playstate = ex_hook;\r
-                       break;\r
-\r
-               case passcardobj:\r
-                       playstate = ex_card;\r
-                       break;\r
-\r
-               case mollyobj:\r
-                       playstate = ex_molly;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 MOLLY\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_molly1        = {MOLLY1SPR, MOLLY1SPR, step, false, false, 20, 0, 0, NULL, C_Molly, R_Draw, &s_molly2};\r
-statetype s_molly2        = {MOLLY2SPR, MOLLY2SPR, step, false, false, 40, 0, 0, NULL, C_Molly, R_Draw, &s_molly3};\r
-statetype s_molly3        = {MOLLY1SPR, MOLLY1SPR, step, false, false, 40, 0, 0, NULL, C_Molly, R_Draw, &s_molly4};\r
-statetype s_molly4        = {MOLLY2SPR, MOLLY2SPR, step, false, false, 20, 0, 0, NULL, C_Molly, R_Draw, &s_molly1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnMolly\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnMolly(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = mollyobj;\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) + -8*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_molly1);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 PLATFORM\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_platform      = {PLATFORMSPR, PLATFORMSPR, think, false, false, 0, 0, 0, T_Platform, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnPlatform\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnPlatform(Uint16 tileX, Uint16 tileY, Sint16 dir)\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
-       NewState(new, &s_platform);\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
-       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
-                                                 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_fallplatfall = {PLATFORMSPR, PLATFORMSPR, think,      false, false, 0, 0,   0, T_DropPlatFall, NULL, R_Draw, NULL};\r
-statetype s_fallplatrise = {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_fallplatfall;\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_fallplatrise;\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_fallplatfall;\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_staticplatform = {PLATFORMSPR, PLATFORMSPR, step, false, false, 32000, 0, 0, NULL, NULL, R_Draw, &s_staticplatform};\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_staticplatform);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 GO PLATFORM\r
-\r
-temp1 = direction\r
-temp2 = countdown to next dir check\r
-temp3 = sprite pointer for the Bip sprite\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_goplat        = {PLATFORMSPR, PLATFORMSPR, think, false, false, 0, 0, 0, T_GoPlat, NULL, R_GoPlat, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnGoPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnGoPlat(Uint16 tileX, Uint16 tileY, Sint16 dir)\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
-       NewState(new, &s_goplat);\r
-       *(mapsegs[2]+mapbwidthtable[tileY]/2 + tileX) = dir + DIRARROWSTART;\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
-       Sint16 dir;\r
-       Uint16 tx, ty;\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
-                       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_GoPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void R_GoPlat(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+TILEGLOBAL, ob->temp1+PLATBIP1SPR, spritedraw, ob->priority);\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
-\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
-                                                 BLOOG\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_bloogwalk1 = {BLOOGWALKL1SPR, BLOOGWALKR1SPR, step,  false, true, 10, 128, 0, T_BloogWalk, C_Bloog, R_Walk, &s_bloogwalk2};\r
-statetype s_bloogwalk2 = {BLOOGWALKL2SPR, BLOOGWALKR2SPR, step,  false, true, 10, 128, 0, T_BloogWalk, C_Bloog, R_Walk, &s_bloogwalk3};\r
-statetype s_bloogwalk3 = {BLOOGWALKL3SPR, BLOOGWALKR3SPR, step,  false, true, 10, 128, 0, T_BloogWalk, C_Bloog, R_Walk, &s_bloogwalk4};\r
-statetype s_bloogwalk4 = {BLOOGWALKL4SPR, BLOOGWALKR4SPR, step,  false, true, 10, 128, 0, T_BloogWalk, C_Bloog, R_Walk, &s_bloogwalk1};\r
-statetype s_bloogstun  = {BLOOGSTUNSPR,   BLOOGSTUNSPR,   think, false, false, 0,   0, 0, T_Projectile, NULL, R_Stunned, &s_bloogstun};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnBloog\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnBloog(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = bloogobj;\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) + -2*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_bloogwalk1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_BloogWalk\r
-=\r
-===========================\r
-*/\r
-\r
-void T_BloogWalk(objtype *ob)\r
-{\r
-       if (US_RndT() < 0x20)\r
-       {\r
-               if (ob->x < player->x)\r
-               {\r
-                       ob->xdir = 1;\r
-               }\r
-               else\r
-               {\r
-                       ob->xdir = -1;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Bloog\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Bloog(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-       }\r
-       else if (hit->obclass == stunshotobj)\r
-       {\r
-               StunObj(ob, hit, &s_bloogstun);\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 BLOOGUARD\r
-\r
-temp1 = flash countdown\r
-temp2 = health\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_blooguardwalk1   = {BLOOGUARDWALKL1SPR,  BLOOGUARDWALKR1SPR,  step,  false, true,  9, 128, 0, T_BlooguardWalk, C_Blooguard, R_Blooguard, &s_blooguardwalk2};\r
-statetype s_blooguardwalk2   = {BLOOGUARDWALKL2SPR,  BLOOGUARDWALKR2SPR,  step,  false, true,  9, 128, 0, T_BlooguardWalk, C_Blooguard, R_Blooguard, &s_blooguardwalk3};\r
-statetype s_blooguardwalk3   = {BLOOGUARDWALKL3SPR,  BLOOGUARDWALKR3SPR,  step,  false, true,  9, 128, 0, T_BlooguardWalk, C_Blooguard, R_Blooguard, &s_blooguardwalk4};\r
-statetype s_blooguardwalk4   = {BLOOGUARDWALKL4SPR,  BLOOGUARDWALKR4SPR,  step,  false, true,  9, 128, 0, T_BlooguardWalk, C_Blooguard, R_Blooguard, &s_blooguardwalk1};\r
-statetype s_blooguardattack1 = {BLOOGUARDSWINGL1SPR, BLOOGUARDSWINGR1SPR, step,  false, true, 30,   0, 0, NULL, C_Blooguard, R_Blooguard, &s_blooguardattack2};\r
-statetype s_blooguardattack2 = {BLOOGUARDSWINGL2SPR, BLOOGUARDSWINGR2SPR, step,  false, true,  9,   0, 0, NULL, C_Blooguard, R_Blooguard, &s_blooguardattack3};\r
-statetype s_blooguardattack3 = {BLOOGUARDSWINGL3SPR, BLOOGUARDSWINGR3SPR, step,  true,  true,  1,   0, 0, T_BlooguardAttack, C_Blooguard, R_Blooguard, &s_blooguardattack4};\r
-statetype s_blooguardattack4 = {BLOOGUARDSWINGL3SPR, BLOOGUARDSWINGR3SPR, step,  false, true,  9,   0, 0, NULL, C_Blooguard, R_Blooguard, &s_blooguardwalk1};\r
-statetype s_blooguardstun    = {BLOOGUARDSTUNSPR,    BLOOGUARDSTUNSPR,    think, false, false, 0,   0, 0, T_Projectile, NULL, R_Stunned, &s_blooguardstun};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnBlooguard\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnBlooguard(Uint16 tileX, Uint16 tileY)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = blooguardobj;\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) + -40*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->temp2 = 3; // health\r
-       NewState(new, &s_blooguardwalk1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_BlooguardWalk\r
-=\r
-===========================\r
-*/\r
-\r
-void T_BlooguardWalk(objtype *ob)\r
-{\r
-       if (US_RndT() < 0x20)\r
-       {\r
-               if (ob->x < player->x)\r
-               {\r
-                       ob->xdir = 1;\r
-               }\r
-               else\r
-               {\r
-                       ob->xdir = -1;\r
-               }\r
-       }\r
-       if ( ((ob->xdir == 1 && ob->x < player->x) || (ob->xdir == -1 && ob->x > player->x))\r
-               && ob->bottom == player->bottom && US_RndT() < 0x20)\r
-       {\r
-               ob->state = &s_blooguardattack1;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_BlooguardAttack\r
-=\r
-===========================\r
-*/\r
-\r
-#pragma argsused\r
-void T_BlooguardAttack(objtype *ob)\r
-{\r
-       SD_PlaySound(SND_SMASH);\r
-       groundslam = 23;\r
-       if (player->hitnorth)\r
-       {\r
-               ChangeState(player, &s_keenstun);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Blooguard\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Blooguard(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-       }\r
-       if (hit->obclass == stunshotobj)        // not 'else if' in the original code\r
-       {\r
-               if (--ob->temp2 == 0)   // handle health\r
-               {\r
-                       StunObj(ob, hit, &s_blooguardstun);\r
-               }\r
-               else\r
-               {\r
-                       ob->temp1 = 2;  // draw white twice\r
-                       ob->needtoreact = true;\r
-                       ExplodeShot(hit);\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Blooguard\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Blooguard(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*2;\r
-               ob->xdir = -ob->xdir;\r
-               ob->nothink = US_RndT() >> 5;\r
-               ChangeState(ob, ob->state);\r
-       }\r
-       if (ob->temp1)\r
-       {\r
-               ob->temp1--;\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
-                                                 BLOOGLET\r
-\r
-temp1 = type\r
-\r
-=============================================================================\r
-*/\r
-\r
-// red Blooglet:\r
-statetype s_rbloogletwalk1 = {RBLOOGLETWALKL1SPR, RBLOOGLETWALKR1SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_rbloogletwalk2};\r
-statetype s_rbloogletwalk2 = {RBLOOGLETWALKL2SPR, RBLOOGLETWALKR2SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_rbloogletwalk3};\r
-statetype s_rbloogletwalk3 = {RBLOOGLETWALKL3SPR, RBLOOGLETWALKR3SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_rbloogletwalk4};\r
-statetype s_rbloogletwalk4 = {RBLOOGLETWALKL4SPR, RBLOOGLETWALKR4SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_rbloogletwalk1};\r
-statetype s_rbloogletstun  = {RBLOOGLETSTUNSPR,   RBLOOGLETSTUNSPR,   think, false, false, 0,   0, 0, T_Projectile, NULL, R_Stunned, NULL};\r
-\r
-// yellow Blooglet:\r
-statetype s_ybloogletwalk1 = {YBLOOGLETWALKL1SPR, YBLOOGLETWALKR1SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_ybloogletwalk2};\r
-statetype s_ybloogletwalk2 = {YBLOOGLETWALKL2SPR, YBLOOGLETWALKR2SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_ybloogletwalk3};\r
-statetype s_ybloogletwalk3 = {YBLOOGLETWALKL3SPR, YBLOOGLETWALKR3SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_ybloogletwalk4};\r
-statetype s_ybloogletwalk4 = {YBLOOGLETWALKL4SPR, YBLOOGLETWALKR4SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_ybloogletwalk1};\r
-statetype s_ybloogletstun  = {YBLOOGLETSTUNSPR,   YBLOOGLETSTUNSPR,   think, false, false, 0,   0, 0, T_Projectile, NULL, R_Stunned, NULL};\r
-\r
-// blue Blooglet:\r
-statetype s_bbloogletwalk1 = {BBLOOGLETWALKL1SPR, BBLOOGLETWALKR1SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_bbloogletwalk2};\r
-statetype s_bbloogletwalk2 = {BBLOOGLETWALKL2SPR, BBLOOGLETWALKR2SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_bbloogletwalk3};\r
-statetype s_bbloogletwalk3 = {BBLOOGLETWALKL3SPR, BBLOOGLETWALKR3SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_bbloogletwalk4};\r
-statetype s_bbloogletwalk4 = {BBLOOGLETWALKL4SPR, BBLOOGLETWALKR4SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_bbloogletwalk1};\r
-statetype s_bbloogletstun  = {BBLOOGLETSTUNSPR,   BBLOOGLETSTUNSPR,   think, false, false, 0,   0, 0, T_Projectile, NULL, R_Stunned, NULL};\r
-\r
-// green Blooglet:\r
-statetype s_gbloogletwalk1 = {GBLOOGLETWALKL1SPR, GBLOOGLETWALKR1SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_gbloogletwalk2};\r
-statetype s_gbloogletwalk2 = {GBLOOGLETWALKL2SPR, GBLOOGLETWALKR2SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_gbloogletwalk3};\r
-statetype s_gbloogletwalk3 = {GBLOOGLETWALKL3SPR, GBLOOGLETWALKR3SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_gbloogletwalk4};\r
-statetype s_gbloogletwalk4 = {GBLOOGLETWALKL4SPR, GBLOOGLETWALKR4SPR, step,  false, true,  5, 128, 0, T_BloogWalk, C_Blooglet, R_Walk, &s_gbloogletwalk1};\r
-statetype s_gbloogletstun  = {GBLOOGLETSTUNSPR,   GBLOOGLETSTUNSPR,   think, false, false, 0,   0, 0, T_Projectile, NULL, R_Stunned, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnBlooglet\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnBlooglet(Uint16 tileX, Uint16 tileY, Sint16 type)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = bloogletobj;\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) + -8*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->temp1 = type;\r
-\r
-       switch (type % 4)\r
-       {\r
-       case 0:\r
-               NewState(new, &s_rbloogletwalk1);\r
-               break;\r
-\r
-       case 1:\r
-               NewState(new, &s_ybloogletwalk1);\r
-               break;\r
-\r
-       case 2:\r
-               NewState(new, &s_bbloogletwalk1);\r
-               break;\r
-\r
-       case 3:\r
-               NewState(new, &s_gbloogletwalk1);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Blooglet\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Blooglet(objtype *ob, objtype *hit)\r
-{\r
-       static statetype *stunnedstate[4] = {\r
-               &s_rbloogletstun,\r
-               &s_ybloogletstun,\r
-               &s_bbloogletstun,\r
-               &s_gbloogletstun\r
-       };\r
-       Sint16 color;\r
-\r
-       if (hit->obclass == keenobj && hit->state->contact)\r
-       {\r
-               playerkludgeclipcancel = true;\r
-               ClipToSpriteSide(hit, ob);\r
-               playerkludgeclipcancel = false;\r
-       }\r
-       else if (hit->obclass == stunshotobj)\r
-       {\r
-               color = ob->temp1 & 3;\r
-               if (ob->temp1 > 3)\r
-               {\r
-                       //\r
-                       // spawn a key gem\r
-                       //\r
-                       GetNewObj(false);\r
-                       new->needtoclip = cl_midclip;\r
-                       new->priority = 2;\r
-                       new->obclass = bonusobj;\r
-                       new->x = ob->x;\r
-                       new->y = ob->y;\r
-                       new->ydir = -1;\r
-                       new->yspeed = -40;\r
-                       new->temp1 = color;\r
-                       new->temp2=new->shapenum = bonusshape[color];\r
-                       new->temp3 = new->temp2 + 2;\r
-                       NewState(new, &s_bonusfly1);\r
-                       SD_PlaySound(SND_DROPKEY);\r
-               }\r
-               StunObj(ob, hit, stunnedstate[color]);\r
-       }\r
-}
\ No newline at end of file