]> 4ch.mooo.com Git - 16.git/blobdiff - 16/keen456/KEEN4-6/KEEN4/K4_ACT2.C
added keen 4-6 rebuild code for reference.... i need to stop doing this... xD
[16.git] / 16 / keen456 / KEEN4-6 / KEEN4 / K4_ACT2.C
diff --git a/16/keen456/KEEN4-6/KEEN4/K4_ACT2.C b/16/keen456/KEEN4-6/KEEN4/K4_ACT2.C
deleted file mode 100755 (executable)
index 41b0ad9..0000000
+++ /dev/null
@@ -1,1392 +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
-K4_ACT2.C\r
-=========\r
-\r
-Contains the following actor types (in this order):\r
-\r
-- Wormouth\r
-- Thundercloud & Lightning\r
-- Berkeloid & Fireball\r
-- Inchworm & Foot (in-level)\r
-- Bounder\r
-- Lick\r
-- Platform\r
-- Dropping Platform\r
-\r
-*/\r
-\r
-#include "CK_DEF.H"\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 WORMOUTH\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_worm      = {WORMOUTHSPR,       WORMOUTHSPR,       slide, true,  true,  4, 16, 0, T_Worm,          NULL,                  R_Walk,    &s_worm};\r
-statetype s_wormpeek1 = {WORMOUTHPEEKL1SPR, WORMOUTHPEEKL1SPR, step,  false, false, 20,  0, 0, NULL,                   C_Worm,   R_Draw,    &s_wormpeek2};\r
-statetype s_wormpeek2 = {WORMOUTHPEEKL2SPR, WORMOUTHPEEKL2SPR, step,  false, false,  8,  0, 0, NULL,                   C_Worm,   R_Draw,    &s_wormpeek3};\r
-statetype s_wormpeek3 = {WORMOUTHPEEKL1SPR, WORMOUTHPEEKL1SPR, step,  false, false, 20,  0, 0, T_WormLookLeft,  C_Worm,   R_Draw,    &s_wormpeek4};\r
-statetype s_wormpeek4 = {WORMOUTHSPR,       WORMOUTHSPR,       step,  false, false,  8,  0, 0, NULL,                   C_Worm,   R_Draw,    &s_wormpeek5};\r
-statetype s_wormpeek5 = {WORMOUTHPEEKR1SPR, WORMOUTHPEEKR1SPR, step,  false, false, 20,  0, 0, NULL,                   C_Worm,   R_Draw,    &s_wormpeek6};\r
-statetype s_wormpeek6 = {WORMOUTHPEEKR2SPR, WORMOUTHPEEKR2SPR, step,  false, false,  8,  0, 0, NULL,                   C_Worm,   R_Draw,    &s_wormpeek7};\r
-statetype s_wormpeek7 = {WORMOUTHPEEKR1SPR, WORMOUTHPEEKR1SPR, step,  false, false, 20,  0, 0, T_WormLookRight, C_Worm,   R_Draw,    &s_wormpeek8};\r
-statetype s_wormpeek8 = {WORMOUTHSPR,       WORMOUTHSPR,       step,  false, false,  8,  0, 0, T_WormLook,      NULL,                  R_Draw,    &s_worm};\r
-statetype s_wormbite1 = {WORMOUTHBITEL1SPR, WORMOUTHBITER1SPR, step,  false, false,  8,  0, 0, NULL,                   C_WormKill, R_Draw,    &s_wormbite2};\r
-statetype s_wormbite2 = {WORMOUTHBITEL2SPR, WORMOUTHBITER2SPR, step,  false, false,  8,  0, 0, NULL,                   C_WormKill, R_Draw,    &s_wormbite3};\r
-statetype s_wormbite3 = {WORMOUTHBITEL3SPR, WORMOUTHBITER3SPR, step,  false, false, 16,  0, 0, NULL,                   C_WormKill, R_Draw,    &s_wormbite4};\r
-statetype s_wormbite4 = {WORMOUTHBITEL2SPR, WORMOUTHBITER2SPR, step,  false, false,  8,  0, 0, NULL,                   C_WormKill, R_Draw,    &s_wormbite5};\r
-statetype s_wormbite5 = {WORMOUTHBITEL1SPR, WORMOUTHBITER1SPR, step,  false, false,  8,  0, 0, NULL,                   C_WormKill, R_Draw,    &s_worm};\r
-statetype s_wormstun  = {WORMOUTHSTUNSPR,   WORMOUTHSTUNSPR,   think, false, false, 10,  0, 0, T_Projectile,       NULL,                  R_Stunned, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnWormMouth\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnWormMouth(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = wormouthobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y) + 0x8F;\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_worm);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_WormLookRight\r
-=\r
-===========================\r
-*/\r
-\r
-void T_WormLookRight(objtype *ob)\r
-{\r
-       if (player->x > ob->x)\r
-       {\r
-               ob->xdir = 1;\r
-               ob->state = &s_worm;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_WormLook\r
-=\r
-===========================\r
-*/\r
-\r
-void T_WormLook(objtype *ob)\r
-{\r
-       if (player->x > ob->x)\r
-       {\r
-               ob->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               ob->xdir = -1;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_WormLookLeft\r
-=\r
-===========================\r
-*/\r
-\r
-void T_WormLookLeft(objtype *ob)\r
-{\r
-       if (player->x < ob->x)\r
-       {\r
-               ob->xdir = -1;\r
-               ob->state = &s_worm;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Worm\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Worm(objtype *ob)\r
-{\r
-       Sint16 xdist, ydist;\r
-\r
-       xdist = player->x - ob->x;\r
-       ydist = player->bottom - ob->bottom;\r
-       if ((xdist < -3*TILEGLOBAL || xdist > 3*TILEGLOBAL) && US_RndT() < 6)\r
-       {\r
-               ob->state = &s_wormpeek1;\r
-       }\r
-       else if (ydist >= -TILEGLOBAL && ydist <= TILEGLOBAL)\r
-       {\r
-               if (ob->xdir == 1 && xdist > 8*PIXGLOBAL && xdist < 24*PIXGLOBAL\r
-                       || ob->xdir == -1 && xdist < -8*PIXGLOBAL && xdist > -32*PIXGLOBAL)\r
-               {\r
-                       SD_PlaySound(SND_WORMOUTHATTACK);\r
-                       ob->state = &s_wormbite1;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Worm\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Worm(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               StunObj(ob, hit, &s_wormstun);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_WormKill\r
-=\r
-===========================\r
-*/\r
-\r
-void C_WormKill(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               if (!(ob->xdir == 1 && ob->x > hit->x || ob->xdir == -1 && ob->x < hit->x))\r
-               {\r
-                       KillKeen();\r
-               }\r
-               return;\r
-       }\r
-       else\r
-       {\r
-               C_Worm(ob, hit);\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 THUNDERCLOUD\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_cloudsleep   = {CLOUDSPR,       CLOUDSPR,       think,     false, false,  20, 0, 0, NULL,         C_CloudSleep, R_Draw,  NULL};\r
-statetype s_cloudwake    = {CLOUDACTIVESPR, CLOUDACTIVESPR, step,      false, false, 100, 0, 0, NULL,         NULL,         R_Cloud, &s_cloud};\r
-statetype s_cloud        = {CLOUDACTIVESPR, CLOUDACTIVESPR, think,     false, false,  20, 0, 0, T_Cloud,      NULL,         R_Cloud, NULL};\r
-statetype s_cloudalign   = {CLOUDACTIVESPR, CLOUDACTIVESPR, think,     false, false,  20, 0, 0, T_CloudAlign, NULL,         R_Cloud, NULL};\r
-statetype s_cloudcharge  = {CLOUDACTIVESPR, CLOUDACTIVESPR, stepthink, false, false,  60, 0, 0, T_Velocity,   NULL,         R_Cloud, &s_cloud};\r
-statetype s_cloudattack1 = {CLOUDCHARGESPR, CLOUDCHARGESPR, step,      false, false,  10, 0, 0, NULL,         NULL,         R_Draw,  &s_cloudattack2};\r
-statetype s_cloudattack2 = {CLOUDACTIVESPR, CLOUDACTIVESPR, step,      false, false,  10, 0, 0, NULL,         NULL,         R_Draw,  &s_cloudattack3};\r
-statetype s_cloudattack3 = {CLOUDCHARGESPR, CLOUDCHARGESPR, step,      false, false,  10, 0, 0, NULL,         NULL,         R_Draw,  &s_cloudattack4};\r
-statetype s_cloudattack4 = {CLOUDACTIVESPR, CLOUDACTIVESPR, step,      false, false,  10, 0, 0, T_CloudShoot, NULL,         R_Draw,  &s_cloudattack5};\r
-statetype s_cloudattack5 = {CLOUDCHARGESPR, CLOUDCHARGESPR, step,      false, false,  10, 0, 0, NULL,         NULL,         R_Draw,  &s_cloudattack6};\r
-statetype s_cloudattack6 = {CLOUDACTIVESPR, CLOUDACTIVESPR, step,      false, false,  10, 0, 0, NULL,         NULL,         R_Draw,  &s_cloudattack7};\r
-statetype s_cloudattack7 = {CLOUDCHARGESPR, CLOUDCHARGESPR, step,      false, false,  10, 0, 0, NULL,         NULL,         R_Draw,  &s_cloudattack8};\r
-statetype s_cloudattack8 = {CLOUDACTIVESPR, CLOUDACTIVESPR, step,      false, false,  10, 0, 0, NULL,         NULL,         R_Draw,  &s_cloudattack9};\r
-statetype s_cloudattack9 = {CLOUDCHARGESPR, CLOUDCHARGESPR, step,      false, false,  48, 0, 0, NULL,         NULL,         R_Draw,  &s_cloudcharge};\r
-\r
-statetype s_bolt1 = {BOLT1SPR, BOLT1SPR, step, false, false, 8, 0, 0, NULL, C_Lethal, R_Draw, &s_bolt2};\r
-statetype s_bolt2 = {BOLT2SPR, BOLT2SPR, step, false, false, 8, 0, 0, NULL, C_Lethal, R_Draw, &s_bolt3};\r
-statetype s_bolt3 = {BOLT1SPR, BOLT1SPR, step, false, false, 8, 0, 0, NULL, C_Lethal, R_Draw, &s_bolt4};\r
-statetype s_bolt4 = {BOLT2SPR, BOLT2SPR, step, false, false, 8, 0, 0, NULL, C_Lethal, R_Draw, &s_bolt5};\r
-statetype s_bolt5 = {BOLT1SPR, BOLT1SPR, step, false, false, 8, 0, 0, NULL, C_Lethal, R_Draw, &s_bolt6};\r
-statetype s_bolt6 = {BOLT2SPR, BOLT2SPR, step, false, false, 8, 0, 0, NULL, C_Lethal, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnCloudster\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnCloudster(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = thundercloudobj;\r
-       new->active = ac_yes;\r
-       new->priority = 2;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y);\r
-       new->ydir = new->xdir = 1;\r
-       NewState(new, &s_cloudsleep);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Cloud\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Cloud(objtype *ob)\r
-{\r
-       if (US_RndT() < tics)\r
-               ob->xdir = ob->x > player->x? -1 : 1;\r
-\r
-       AccelerateX(ob, ob->xdir, 10);\r
-       if (player->bottom < ob->bottom || (Sint16)(player->top - ob->bottom) > 64*PIXGLOBAL)\r
-               return;\r
-       if (ob->left < player->right && ob->right > player->left)\r
-       {\r
-               ob->state = &s_cloudalign;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_CloudAlign\r
-=\r
-===========================\r
-*/\r
-\r
-void T_CloudAlign(objtype *ob)\r
-{\r
-       AccelerateX(ob, ob->xdir, 10);\r
-       if (xtry < 0 && (Sint16)((ob->x & 0x7F) + xtry) <= 0)\r
-       {\r
-               xtry = -(ob->x & 0x7F);\r
-               ob->state = &s_cloudattack1;\r
-       }\r
-       if (xtry > 0 && (ob->x & 0x7F) + xtry >= 8*PIXGLOBAL)\r
-       {\r
-               xtry = 8*PIXGLOBAL - (ob->x & 0x7F);\r
-               ob->state = &s_cloudattack1;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Cloud\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Cloud(objtype *ob)\r
-{\r
-       if (ob->hitwest)\r
-       {\r
-               ob->xspeed = 0;\r
-               ob->xdir = -1;\r
-       }\r
-       else if (ob->hiteast)\r
-       {\r
-               ob->xspeed = 0;\r
-               ob->xdir = 1;\r
-       }\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_CloudShoot\r
-=\r
-===========================\r
-*/\r
-\r
-void T_CloudShoot(objtype *ob)\r
-{\r
-       GetNewObj(true);\r
-       new->obclass = lightningobj;\r
-       new->active = ac_removable;\r
-       new->needtoclip = cl_noclip;\r
-       new->x = ob->x + TILEGLOBAL;\r
-       new->y = ob->y + TILEGLOBAL;\r
-       NewState(new, &s_bolt1);\r
-       SD_PlaySound(SND_THUNDER);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_CloudSleep\r
-=\r
-===========================\r
-*/\r
-\r
-void C_CloudSleep(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               ChangeState(ob, &s_cloudwake);\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 BERKELOID\r
-\r
-temp1 = float offset, in global units (added to ob->y when drawing the sprite)\r
-temp2 = float speed, in global units per tic (added to temp1 for every tic)\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_berkefloat1  = {BERKEWALKL1SPR,  BERKEWALKR1SPR,  slide, false, true,  6, 8, 0, BerkeThink, C_Berke, BerkeWalkReact, &s_berkefloat2};\r
-statetype s_berkefloat2  = {BERKEWALKL2SPR,  BERKEWALKR2SPR,  slide, false, true,  6, 8, 0, BerkeThink, C_Berke, BerkeWalkReact, &s_berkefloat3};\r
-statetype s_berkefloat3  = {BERKEWALKL3SPR,  BERKEWALKR3SPR,  slide, false, true,  6, 8, 0, BerkeThink, C_Berke, BerkeWalkReact, &s_berkefloat4};\r
-statetype s_berkefloat4  = {BERKEWALKL4SPR,  BERKEWALKR4SPR,  slide, false, true,  6, 8, 0, BerkeThink, C_Berke, BerkeWalkReact, &s_berkefloat1};\r
-statetype s_berkethrow1  = {BERKETHROWL1SPR, BERKETHROWR1SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow2};\r
-statetype s_berkethrow2  = {BERKETHROWL1SPR, BERKETHROWR1SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow3};\r
-statetype s_berkethrow3  = {BERKETHROWL1SPR, BERKETHROWR1SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow4};\r
-statetype s_berkethrow4  = {BERKETHROWL1SPR, BERKETHROWR1SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow5};\r
-statetype s_berkethrow5  = {BERKETHROWL1SPR, BERKETHROWR1SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow6};\r
-statetype s_berkethrow6  = {BERKETHROWL1SPR, BERKETHROWR1SPR, step,  false, false, 6, 0, 0, BerkeThrowThink, C_Berke, BerkeDrawReact, &s_berkethrow7};\r
-statetype s_berkethrow7  = {BERKETHROWL2SPR, BERKETHROWR2SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow8};\r
-statetype s_berkethrow8  = {BERKETHROWL2SPR, BERKETHROWR2SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow9};\r
-statetype s_berkethrow9  = {BERKETHROWL2SPR, BERKETHROWR2SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow10};\r
-statetype s_berkethrow10 = {BERKETHROWL2SPR, BERKETHROWR2SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow11};\r
-statetype s_berkethrow11 = {BERKETHROWL2SPR, BERKETHROWR2SPR, step,  false, false, 6, 0, 0, SetReactThink, C_Berke, BerkeDrawReact, &s_berkethrow12};\r
-statetype s_berkethrow12 = {BERKETHROWL2SPR, BERKETHROWR2SPR, step,  false, false, 6, 0, 0, BerkeThrowDone, C_Berke, BerkeDrawReact, &s_berkefloat1};\r
-\r
-statetype s_fire1     = {FIREBALL1SPR, FIREBALL1SPR, stepthink, false, false, 6, 0, 0, T_WeakProjectile, C_Lethal, FireReact, &s_fire2};\r
-statetype s_fire2     = {FIREBALL2SPR, FIREBALL2SPR, stepthink, false, false, 6, 0, 0, T_WeakProjectile, C_Lethal, FireReact, &s_fire1};\r
-statetype s_fireland1 = {FIREBALL1SPR, FIREBALL1SPR, step, false, false,  6, 0, 0, NULL, C_Berke, R_Draw, &s_fireland2};\r
-statetype s_fireland2 = {FIREBALL3SPR, FIREBALL3SPR, step, false, false, 12, 0, 0, NULL, C_Berke, R_Draw, &s_fireland3};\r
-statetype s_fireland3 = {FIREBALL4SPR, FIREBALL4SPR, step, false, false, 12, 0, 0, NULL, C_Berke, R_Draw, &s_fireland4};\r
-statetype s_fireland4 = {FIREBALL3SPR, FIREBALL3SPR, step, false, false, 12, 0, 0, NULL, C_Berke, R_Draw, &s_fireland5};\r
-statetype s_fireland5 = {FIREBALL4SPR, FIREBALL4SPR, step, false, false, 12, 0, 0, NULL, C_Berke, R_Draw, &s_fireland6};\r
-statetype s_fireland6 = {FIREBALL1SPR, FIREBALL1SPR, step, false, false, 12, 0, 0, NULL, C_Berke, R_Draw, &s_fireland7};\r
-statetype s_fireland7 = {FIREBALL2SPR, FIREBALL2SPR, step, false, false, 12, 0, 0, NULL, C_Berke, R_Draw, &s_fireland8};\r
-statetype s_fireland8 = {FIREBALL1SPR, FIREBALL1SPR, step, false, false, 12, 0, 0, NULL, C_Berke, R_Draw, &s_fireland9};\r
-statetype s_fireland9 = {FIREBALL2SPR, FIREBALL2SPR, step, false, false, 12, 0, 0, NULL, C_Berke, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnBerkeloid\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnBerkeloid(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = berkeloidobj;\r
-       new->active = ac_yes;\r
-       new->priority = 2;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y) + -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
-       new->temp2 = 8;\r
-       NewState(new, &s_berkefloat1);\r
-}\r
-\r
-\r
-/*\r
-===========================\r
-=\r
-= BerkeThink\r
-=\r
-===========================\r
-*/\r
-\r
-void BerkeThink(objtype *ob)\r
-{\r
-       Sint16 xdist, ydist;\r
-\r
-       if (US_RndT() < 0x20)\r
-               ob->xdir = player->x < ob->x? -1 : 1;\r
-\r
-       if (US_RndT() < 8)\r
-       {\r
-               // BUG: might be about to move off a ledge, causing it to get stuck\r
-               // after throwing (the throw states don't use BerkeWalkReact)!\r
-               // To avoid that, set xtry to 0 here.\r
-\r
-               ob->state = &s_berkethrow1;\r
-               // BUG? this doesn't play the attack sound\r
-       }\r
-       else if (US_RndT() <= 0x40)\r
-       {\r
-               xdist = player->x - ob->x;\r
-               ydist = player->y - ob->y;\r
-               if (ydist >= -TILEGLOBAL && ydist <= TILEGLOBAL\r
-                       && (ob->xdir == 1 && xdist > 0 || ob->xdir == -1 && xdist < 0))\r
-               {\r
-                       // BUG: might be about to move off a ledge, causing it to get stuck\r
-                       // after throwing (the throw states don't use BerkeWalkReact)!\r
-                       // To avoid that, set xtry to 0 here.\r
-\r
-                       ob->state = &s_berkethrow1;\r
-                       SD_PlaySound(SND_BERKELOIDATTACK);\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= BerkeThrowThink\r
-=\r
-===========================\r
-*/\r
-\r
-void BerkeThrowThink(objtype *ob)\r
-{\r
-       GetNewObj(true);\r
-       new->active = ac_removable;\r
-       new->obclass = berkeloidobj;\r
-       new->y = ob->y + 8*PIXGLOBAL;\r
-       new->yspeed = -8;\r
-       if (ob->xdir == 1)\r
-       {\r
-               new->xspeed = 48;\r
-               new->x = ob->x + 32*PIXGLOBAL;\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xspeed = -48;\r
-               new->x = ob->x - 16*PIXGLOBAL;\r
-               new->xdir = -1;\r
-       }\r
-       NewState(new, &s_fire1);\r
-       ob->needtoreact = true;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= BerkeThrowDone\r
-=\r
-===========================\r
-*/\r
-\r
-void BerkeThrowDone(objtype *ob)\r
-{\r
-       ob->nothink = 4;\r
-       ob->needtoreact = true;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Berke\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Berke(objtype *ob, objtype *hit)\r
-{\r
-       ob++;                   // shut up compiler\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               ExplodeShot(hit);\r
-       }\r
-       else if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= FireReact\r
-=\r
-===========================\r
-*/\r
-\r
-void FireReact(objtype *ob)\r
-{\r
-       if (ob->hiteast || ob->hitwest)\r
-               ob->xspeed = 0;\r
-\r
-       if (ob->hitnorth)\r
-       {\r
-               SD_PlaySound(SND_FIREBALLLAND);\r
-               ChangeState(ob, &s_fireland1);\r
-       }\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= BerkeDrawReact\r
-=\r
-===========================\r
-*/\r
-\r
-void BerkeDrawReact(objtype *ob)\r
-{\r
-       //float up & down:\r
-       ob->temp1 = ob->temp1 + ob->temp2 * tics;\r
-       if (ob->temp1 > 0)\r
-       {\r
-               ob->temp1 = 0;\r
-               ob->temp2 = -8;\r
-       }\r
-       else if (ob->temp1 < -TILEGLOBAL)\r
-       {\r
-               ob->temp1 = -TILEGLOBAL;\r
-               ob->temp2 = 8;\r
-       }\r
-\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y+ob->temp1, ob->shapenum, spritedraw, 0);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= BerkeWalkReact\r
-=\r
-===========================\r
-*/\r
-\r
-void BerkeWalkReact(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
-       BerkeDrawReact(ob);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 INCHWORM & FOOT\r
-\r
-temp1 = last lasttimecount (for resetting the touch counter after each frame)\r
-temp2 = touch counter\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_footsmoke1 = {SMOKE1SPR, SMOKE1SPR, step, false, false, 12, 0, 0, NULL, NULL, R_Draw, &s_footsmoke2};\r
-statetype s_footsmoke2 = {SMOKE2SPR, SMOKE2SPR, step, false, false, 12, 0, 0, NULL, NULL, R_Draw, &s_footsmoke3};\r
-statetype s_footsmoke3 = {SMOKE3SPR, SMOKE3SPR, step, false, false, 12, 0, 0, NULL, NULL, R_Draw, &s_footsmoke4};\r
-statetype s_footsmoke4 = {SMOKE4SPR, SMOKE4SPR, step, false, false, 12, 0, 0, NULL, NULL, R_Draw, NULL};\r
-statetype s_inch1      = {INCHWORML1SPR, INCHWORMR1SPR, step, false, true, 30, 128, 0, InchThink, InchContact, R_Walk, &s_inch2};\r
-statetype s_inch2      = {INCHWORML2SPR, INCHWORMR2SPR, step, false, true, 30, 128, 0, InchThink, InchContact, R_Walk, &s_inch1};\r
-statetype s_footchange = { -1,  -1, step, false, false, 48, 0, 0, NULL, NULL, R_Draw, &s_footwait};    //never used!\r
-statetype s_footwait   = {FOOTSPR, FOOTSPR, think, false, false, 30000, 0, 0, NULL, FootContact, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnInchworm\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnInchworm(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = inchwormobj;\r
-       new->active = ac_yes;\r
-       new->priority = 2;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y);\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_inch1);\r
-       new->ticcount = US_RndT() / 32;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnFoot\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnFoot(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = footobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y-3);\r
-       NewState(new, &s_footwait);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= InchThink\r
-=\r
-===========================\r
-*/\r
-\r
-void InchThink(objtype *ob)\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
-= InchContact\r
-=\r
-===========================\r
-*/\r
-\r
-void InchContact(objtype *ob, objtype *hit)\r
-{\r
-       objtype *ob2;\r
-\r
-       if (hit->obclass != inchwormobj)\r
-               return;\r
-\r
-       if (ob->temp1 != (Sint16)lasttimecount)\r
-       {\r
-               ob->temp1 = (Sint16)lasttimecount;\r
-               ob->temp2 = 0;\r
-       }\r
-\r
-       if (++ob->temp2 != 11)  //11 instead of 12 since the object can't contact itself\r
-               return;\r
-\r
-       //change current inchworm into a foot:\r
-       SD_PlaySound(SND_MAKEFOOT);\r
-       ob->y -= 5*TILEGLOBAL;\r
-       ob->obclass = footobj;\r
-       ChangeState(ob, &s_footwait);\r
-\r
-       //Note: It would make more sense to remove the remaining inchworm BEFORE\r
-       //spawning the smoke, just in case there are not enough free spots in the\r
-       //objarray to spawn the smoke. The game won't crash either way, though.\r
-\r
-       //spawn smoke:\r
-       GetNewObj(true);\r
-       new->x = ob->x -  8*PIXGLOBAL;\r
-       new->y = ob->y + 16*PIXGLOBAL;\r
-       new->priority = 3;\r
-       NewState(new, &s_footsmoke1);\r
-\r
-       GetNewObj(true);\r
-       new->x = ob->x + 16*PIXGLOBAL;\r
-       new->y = ob->y + 24*PIXGLOBAL;\r
-       new->priority = 3;\r
-       NewState(new, &s_footsmoke1);\r
-\r
-       GetNewObj(true);\r
-       new->x = ob->x + 40*PIXGLOBAL;\r
-       new->y = ob->y + 16*PIXGLOBAL;\r
-       new->priority = 3;\r
-       NewState(new, &s_footsmoke1);\r
-\r
-       GetNewObj(true);\r
-       new->x = ob->x;\r
-       new->y = ob->y - 8*PIXGLOBAL;\r
-       new->priority = 3;\r
-       NewState(new, &s_footsmoke1);\r
-\r
-       //remove ALL inchworm from the level:\r
-       for (ob2 = player->next; ob2; ob2=ob2->next)\r
-       {\r
-               if (ob2->obclass == inchwormobj)\r
-                       RemoveObj(ob2);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= FootContact\r
-=\r
-===========================\r
-*/\r
-\r
-void FootContact(objtype *ob, objtype *hit)    //completely useless\r
-{\r
-       ob++;                   // shut up compiler\r
-       hit++;                  // shut up compiler\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 BOUNDER\r
-\r
-temp1 = if non-zero, pick a new (random) direction when hitting the ground\r
-        Makes the Bounder jump straight up at least once after having jumped\r
-                 left/right (unless Keen is riding the Bounder)\r
-temp2 = jump counter to make the Bounder jump straight up at least twice\r
-        after Keen has fallen/jumped off\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_bounderup1   = {BOUNDERC1SPR,   BOUNDERC1SPR,   stepthink, false, false, 20, 0, 0, T_Projectile, C_Bounder, R_Bounder, &s_bounderup2};\r
-statetype s_bounderup2   = {BOUNDERC2SPR,   BOUNDERC2SPR,   stepthink, false, false, 20, 0, 0, T_Projectile, C_Bounder, R_Bounder, &s_bounderup1};\r
-statetype s_bounderside1 = {BOUNDERL1SPR,   BOUNDERR1SPR,   stepthink, false, false, 20, 0, 0, T_Projectile, C_Bounder, R_Bounder, &s_bounderside2};\r
-statetype s_bounderside2 = {BOUNDERL2SPR,   BOUNDERR2SPR,   stepthink, false, false, 20, 0, 0, T_Projectile, C_Bounder, R_Bounder, &s_bounderside1};\r
-statetype s_bounderstun  = {BOUNDERC1SPR,   BOUNDERC1SPR,   think,     false, false,  0, 0, 0, T_Projectile, NULL, R_Stunned, &s_bounderstun2};\r
-statetype s_bounderstun2 = {BOUNDERSTUNSPR, BOUNDERSTUNSPR, think,     false, false,  0, 0, 0, T_Projectile, NULL, R_Stunned, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnBounder\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnBounder(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = bounderobj;\r
-       new->active = ac_yes;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y) + -8*PIXGLOBAL;\r
-       new->ydir = 1;\r
-       new->xdir = 0;\r
-       NewState(new, &s_bounderup1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Bounder\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Bounder(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               //basically StunObj(), but in different order:\r
-               ob->temp1 = 0;\r
-               ob->temp2 = 0;\r
-               ob->temp3 = 0;\r
-               ob->temp4 = ob->obclass;\r
-               ExplodeShot(hit);\r
-               ChangeState(ob, &s_bounderstun);\r
-               ob->obclass = stunnedobj;\r
-\r
-               ob->yspeed -= 32;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Bounder\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Bounder(objtype *ob)\r
-{\r
-       Sint16 randnum;\r
-\r
-       if (ob->hitsouth)\r
-               ob->yspeed = 0;\r
-\r
-       if (ob->hitnorth)\r
-       {\r
-               ob->temp2++;\r
-               if (OnScreen(ob))\r
-                       SD_PlaySound(SND_BOUNCE2);\r
-\r
-               ob->yspeed = -50;\r
-               if (gamestate.riding == ob)\r
-               {\r
-                       ob->temp2 = 0;\r
-                       if (player->left < ob->left-4*PIXGLOBAL)\r
-                       {\r
-                               ob->xdir = -1;\r
-                       }\r
-                       else if (player->right > ob->right+4*PIXGLOBAL)\r
-                       {\r
-                               ob->xdir = 1;\r
-                       }\r
-                       else\r
-                       {\r
-                               ob->xdir = 0;\r
-                       }\r
-                       ob->xspeed = ob->xdir * 24;\r
-               }\r
-               else if (ob->temp2 <= 2 || ob->temp1 == 0)\r
-               {\r
-                       ob->temp1 = 1;\r
-                       ob->xdir = ob->xspeed = 0;\r
-                       ChangeState(ob, &s_bounderup1);\r
-               }\r
-               else\r
-               {\r
-                       ob->temp1 = 0;\r
-                       randnum = US_RndT();\r
-                       if (randnum < 100)\r
-                       {\r
-                               ob->xdir = -1;\r
-                       }\r
-                       else if (randnum < 200)\r
-                       {\r
-                               ob->xdir = 1;\r
-                       }\r
-                       else\r
-                       {\r
-                               ob->xdir = 0;\r
-                       }\r
-                       ob->xspeed = ob->xdir * 24;\r
-               }\r
-\r
-               if (ob->xdir)\r
-               {\r
-                       ChangeState(ob, &s_bounderside1);\r
-               }\r
-               else\r
-               {\r
-                       ChangeState(ob, &s_bounderup1);\r
-               }\r
-       }\r
-\r
-       if (ob->hiteast || ob->hitwest)\r
-       {\r
-               ob->xdir = -ob->xdir;\r
-               ob->xspeed = -ob->xspeed;\r
-       }\r
-\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 LICK\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_lick1     = {LICKMOVEL1SPR,   LICKMOVER1SPR,   step,  false, false, 10, 0, 0, LickJumpThink, LickContact, R_Draw, &s_lick2};\r
-statetype s_lick2     = {LICKMOVEL2SPR,   LICKMOVER2SPR,   think, false, false,  0, 0, 0, T_Projectile, LickContact, LickAirReact, &s_lick3};\r
-statetype s_lick3     = {LICKMOVEL3SPR,   LICKMOVER3SPR,   think, false, false,  0, 0, 0, T_Projectile, LickContact, LickAirReact, NULL};\r
-statetype s_lick4     = {LICKMOVEL4SPR,   LICKMOVER4SPR,   step,  false, false, 10, 0, 0, NULL, LickContact, R_Draw, &s_lick1};\r
-statetype s_licklick1 = {LICKATTACKL1SPR, LICKATTACKR1SPR, step,  true,  false,  4, 0, 0, NULL, LickKillContact, R_Draw, &s_licklick2};\r
-statetype s_licklick2 = {LICKATTACKL2SPR, LICKATTACKR2SPR, step,  true,  false,  4, 0, 0, NULL, LickKillContact, R_Draw, &s_licklick3};\r
-statetype s_licklick3 = {LICKATTACKL3SPR, LICKATTACKR3SPR, step,  true,  false,  4, 0, 0, NULL, LickKillContact, R_Draw, &s_licklick4};\r
-statetype s_licklick4 = {LICKATTACKL2SPR, LICKATTACKR2SPR, step,  true,  false,  4, 0, 0, NULL, LickKillContact, R_Draw, &s_licklick5};\r
-statetype s_licklick5 = {LICKATTACKL1SPR, LICKATTACKR1SPR, step,  true,  false,  4, 0, 0, NULL, LickKillContact, R_Draw, &s_licklick6};\r
-statetype s_licklick6 = {LICKATTACKL2SPR, LICKATTACKR2SPR, step,  true,  false,  4, 0, 0, NULL, LickKillContact, R_Draw, &s_licklick7};\r
-statetype s_licklick7 = {LICKATTACKL3SPR, LICKATTACKR3SPR, step,  true,  false,  4, 0, 0, NULL, LickKillContact, R_Draw, &s_licklick8};\r
-statetype s_licklick8 = {LICKATTACKL2SPR, LICKATTACKR2SPR, step,  true,  false,  4, 0, 0, NULL, LickKillContact, R_Draw, &s_lick3};\r
-statetype s_lickstun  = {LICKSTUNSPR,     LICKSTUNSPR,     think, false, false,  0, 0, 0, T_Projectile, NULL, R_Stunned, &s_lickstun2};\r
-statetype s_lickstun2 = {LICKSTUNSPR,     LICKSTUNSPR,     think, false, false,  0, 0, 0, T_Projectile, NULL, R_Stunned, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnLick\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnLick(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = lickobj;\r
-       new->active = ac_yes;\r
-       new->priority = 2;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y);\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->nothink = US_RndT() / 64;\r
-       NewState(new, &s_lick3);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= LickJumpThink\r
-=\r
-===========================\r
-*/\r
-\r
-void LickJumpThink(objtype *ob)\r
-{\r
-       Sint16 xdist, ydist;\r
-\r
-       if (ob->x > player->x)\r
-       {\r
-               ob->xdir = -1;\r
-       }\r
-       else\r
-       {\r
-               ob->xdir = 1;\r
-       }\r
-\r
-       xdist = player->x - ob->x;\r
-       ydist = player->y - ob->y;\r
-\r
-       if (ydist >= -TILEGLOBAL && ydist <= TILEGLOBAL && \r
-               ( ob->xdir == 1 && xdist > -2*PIXGLOBAL && xdist < 24*PIXGLOBAL\r
-                || ob->xdir == -1 && xdist < 2*PIXGLOBAL && xdist > -32*PIXGLOBAL ) )\r
-       {\r
-               SD_PlaySound(SND_LICKATTACK);\r
-               ob->state = &s_licklick1;\r
-       }\r
-       else if (abs(xdist) > 3*TILEGLOBAL)\r
-       {\r
-               ob->xspeed = ob->xdir * 32;\r
-               ob->yspeed = -32;\r
-       }\r
-       else\r
-       {\r
-               ob->xspeed = (ob->xdir * 32)/2;\r
-               ob->yspeed = -16;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= LickContact\r
-=\r
-===========================\r
-*/\r
-\r
-void LickContact(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               StunObj(ob, hit, &s_lickstun);\r
-               ob->yspeed -= 16;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= LickKillContact\r
-=\r
-===========================\r
-*/\r
-\r
-void LickKillContact(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               if (ob->xdir == 1 && player->x > ob->x \r
-                       || ob->xdir == -1 && player->x < ob->x)\r
-               {\r
-                       KillKeen();\r
-               }\r
-       }\r
-       else\r
-       {\r
-               LickContact(ob, hit);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= LickAirReact\r
-=\r
-===========================\r
-*/\r
-\r
-void LickAirReact(objtype *ob)\r
-{\r
-       if (ob->hitnorth)\r
-               ChangeState(ob, &s_lick4);\r
-\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 PLATFORM\r
-\r
-temp2 = additional sprite pointer for thruster sprites\r
-temp3 = additional sprite pointer for thruster sprites\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_platform = {PLATFORMSPR, PLATFORMSPR, think, false, false, 0, 0, 0, T_Platform, NULL, R_Platform, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnPlatform\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnPlatform(Sint16 x, Sint16 y, 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(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y);\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
-               break;\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) == 31)\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) == 31)\r
-                       {\r
-                               ob->xdir = 1;\r
-                               xtry = xtry + (0x100 - (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) == 31)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[newtile-2]/2+ob->tileleft) == 31)\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) == 31)\r
-                       {\r
-                               if (*(mapsegs[2]+mapbwidthtable[newtile+2]/2+ob->tileleft) == 31)\r
-                               {\r
-                                       ytry = 0;\r
-                                       ob->needtoreact = true;\r
-                               }\r
-                               else\r
-                               {\r
-                                       ob->ydir = 1;\r
-                                       ytry = ytry + (0x100 - (newpos & 0xFF));\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Platform\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Platform(objtype *ob)\r
-{\r
-       Uint16 frame;\r
-\r
-       //place platform sprite:\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-       \r
-       //place (or remove) thruster sprites:\r
-       frame = (lasttimecount >> 2) & 1;\r
-       if (ob->xdir == 1)\r
-       {\r
-               RF_PlaceSprite((void**)&ob->temp2, ob->x-1*PIXGLOBAL, ob->y+3*PIXGLOBAL, frame+PLATSIDETHRUST1SPR, spritedraw, 0);\r
-               if (ob->temp3)\r
-                       RF_RemoveSprite((void**)&ob->temp3);\r
-       }\r
-       else if (ob->xdir == -1)\r
-       {\r
-               if (ob->temp2)\r
-                       RF_RemoveSprite((void**)&ob->temp2);\r
-               RF_PlaceSprite((void**)&ob->temp3, ob->x+48*PIXGLOBAL, ob->y+5*PIXGLOBAL, frame+PLATSIDETHRUST1SPR, spritedraw, 1);\r
-       }\r
-       else if (ob->ydir == -1)\r
-       {\r
-               RF_PlaceSprite((void**)&ob->temp2, ob->x+2*PIXGLOBAL, ob->y+9*PIXGLOBAL, frame+PLATLTHRUST1SPR, spritedraw, 0);\r
-               RF_PlaceSprite((void**)&ob->temp3, ob->x+46*PIXGLOBAL, ob->y+8*PIXGLOBAL, frame+PLATRTHRUST1SPR, spritedraw, 0);\r
-       }\r
-       else if (ob->ydir == 1)\r
-       {\r
-               if (frame)\r
-               {\r
-                       RF_PlaceSprite((void**)&ob->temp2, ob->x+2*PIXGLOBAL, ob->y+9*PIXGLOBAL, frame+PLATLTHRUST1SPR, spritedraw, 0);\r
-                       RF_PlaceSprite((void**)&ob->temp3, ob->x+46*PIXGLOBAL, ob->y+8*PIXGLOBAL, frame+PLATRTHRUST1SPR, spritedraw, 0);\r
-               }\r
-               else\r
-               {\r
-                       if (ob->temp2)\r
-                               RF_RemoveSprite((void**)&ob->temp2);\r
-                       if (ob->temp3)\r
-                               RF_RemoveSprite((void**)&ob->temp3);\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 DROPPING PLATFORM\r
-\r
-temp1 = initial y position\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_dropplatsit  = {PLATFORMSPR, PLATFORMSPR, think,      false, false, 0, 0,   0, T_DropPlatSit, NULL, R_Draw, NULL};\r
-statetype s_dropplatfall = {PLATFORMSPR, PLATFORMSPR, think,      false, false, 0, 0,   0, T_DropPlatFall, NULL, R_Draw, NULL};\r
-statetype s_dropplatrise = {PLATFORMSPR, PLATFORMSPR, slidethink, false, false, 0, 0, -32, T_DropPlatRise, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnDropPlat\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnDropPlat(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = platformobj;\r
-       new->active = ac_allways;\r
-       new->priority = 0;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = new->temp1 = CONVERT_TILE_TO_GLOBAL(y);\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 * 16;\r
-               ob->yspeed = 0;\r
-               if (ob->y + ytry - ob->temp1 >= 8*PIXGLOBAL)\r
-                       ob->state = &s_dropplatfall;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_DropPlatFall\r
-=\r
-===========================\r
-*/\r
-\r
-void T_DropPlatFall(objtype *ob)\r
-{\r
-       Uint16 newy, ty;\r
-\r
-       DoGravity(ob);\r
-\r
-       if (ytry >= 15*PIXGLOBAL)\r
-               ytry = 15*PIXGLOBAL;\r
-\r
-       newy = ob->bottom + ytry;\r
-       ty = CONVERT_GLOBAL_TO_TILE(newy);\r
-       if (ob->tilebottom != ty)\r
-       {\r
-               if (*(mapsegs[2]+mapbwidthtable[ty]/2+ob->tileleft) == 31)\r
-               {\r
-                       ytry = 0xFF - (ob->bottom & 0xFF);\r
-                       if (gamestate.riding != ob)\r
-                               ob->state = &s_dropplatrise;\r
-               }\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_DropPlatRise\r
-=\r
-===========================\r
-*/\r
-\r
-void T_DropPlatRise(objtype *ob)\r
-{\r
-       if (gamestate.riding == ob)\r
-       {\r
-               ob->yspeed = 0;\r
-               ob->state = &s_dropplatfall;\r
-       }\r
-       else if (ob->y <= ob->temp1)\r
-       {\r
-               ytry = ob->temp1 - ob->y;\r
-               ob->state = &s_dropplatsit;\r
-       }\r
-}\r