]> 4ch.mooo.com Git - 16.git/blobdiff - 16/keen456/KEEN4-6/KEEN4/K4_ACT1.C
added keen 4-6 rebuild code for reference.... i need to stop doing this... xD
[16.git] / 16 / keen456 / KEEN4-6 / KEEN4 / K4_ACT1.C
diff --git a/16/keen456/KEEN4-6/KEEN4/K4_ACT1.C b/16/keen456/KEEN4-6/KEEN4/K4_ACT1.C
deleted file mode 100755 (executable)
index f26104b..0000000
+++ /dev/null
@@ -1,1221 +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_ACT1.C\r
-=========\r
-\r
-Contains the following actor types (in this order):\r
-\r
-- Miragia (world map)\r
-- Bonus Items\r
-- Council Member\r
-- Poison Slug\r
-- Mad Mushroom\r
-- Egg & Eggbird\r
-- Arachnut\r
-- Skypest\r
-\r
-*/\r
-\r
-#include "CK_DEF.H"\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 MIRAGIA\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_miragia0 = {0, 0, step, false, false, 300, 0, 0, T_Miragia0, NULL, NULL, &s_miragia1};\r
-statetype s_miragia1 = {0, 0, step, false, false,  30, 0, 0, T_Miragia1, NULL, NULL, &s_miragia2};\r
-statetype s_miragia2 = {0, 0, step, false, false,  30, 0, 0, T_Miragia2, NULL, NULL, &s_miragia3};\r
-statetype s_miragia3 = {0, 0, step, false, false,  30, 0, 0, T_Miragia3, NULL, NULL, &s_miragia4};\r
-statetype s_miragia4 = {0, 0, step, false, false, 300, 0, 0, T_Miragia4, NULL, NULL, &s_miragia5};\r
-statetype s_miragia5 = {0, 0, step, false, false,  30, 0, 0, T_Miragia5, NULL, NULL, &s_miragia6};\r
-statetype s_miragia6 = {0, 0, step, false, false,  30, 0, 0, T_Miragia6, NULL, NULL, &s_miragia7};\r
-statetype s_miragia7 = {0, 0, step, false, false,  30, 0, 0, T_Miragia7, NULL, NULL, &s_miragia0};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnMiragia\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnMiragia(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = inertobj;\r
-       new->active = ac_allways;\r
-       new->x = x;\r
-       new->y = y;\r
-       new->state = &s_miragia0;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Miragia0\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Miragia0(objtype *ob)\r
-{\r
-       if (player->tileright >= ob->x && player->tileleft <= ob->x+5\r
-               && player->tiletop >= ob->y && player->tilebottom <= ob->y+4)\r
-       {\r
-               //don't let miragia appear if player is in the area, so player won't get stuck\r
-               ob->state = &s_miragia7;\r
-       }\r
-       else\r
-       {\r
-               RF_MapToMap(8, 60, ob->x, ob->y, 6, 4);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Miragia1\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Miragia1(objtype *ob)\r
-{\r
-       RF_MapToMap(14, 60, ob->x, ob->y, 6, 4);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Miragia2\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Miragia2(objtype *ob)\r
-{\r
-       RF_MapToMap(20, 60, ob->x, ob->y, 6, 4);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Miragia3\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Miragia3(objtype *ob)\r
-{\r
-       RF_MapToMap(26, 60, ob->x, ob->y, 6, 4);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Miragia4\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Miragia4(objtype *ob)\r
-{\r
-       RF_MapToMap(20, 60, ob->x, ob->y, 6, 4);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Miragia5\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Miragia5(objtype *ob)\r
-{\r
-       RF_MapToMap(14, 60, ob->x, ob->y, 6, 4);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Miragia6\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Miragia6(objtype *ob)\r
-{\r
-       RF_MapToMap(8, 60, ob->x, ob->y, 6, 4);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Miragia7\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Miragia7(objtype *ob)\r
-{\r
-       RF_MapToMap(2, 60, ob->x, ob->y, 6, 4);\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_bonusrise = {0, 0, slide, false, false, 40, 0, 8, NULL, NULL, R_Draw, NULL};\r
-\r
-statetype s_splash1 = {DROPSPLASH1SPR, DROPSPLASH1SPR, step, false, false, 10, 0, 0, NULL, NULL, R_Draw, &s_splash2};\r
-statetype s_splash2 = {DROPSPLASH2SPR, DROPSPLASH2SPR, step, false, false, 10, 0, 0, NULL, NULL, R_Draw, &s_splash3};\r
-statetype s_splash3 = {DROPSPLASH3SPR, DROPSPLASH3SPR, step, false, false, 10, 0, 0, NULL, NULL, R_Draw, NULL};\r
-\r
-Uint16 bonusshape[] = {REDGEM1SPR, YELLOWGEM1SPR, BLUEGEM1SPR, GREENGEM1SPR, SUGAR1ASPR, SUGAR2ASPR, SUGAR3ASPR, SUGAR4ASPR, SUGAR5ASPR, SUGAR6ASPR, ONEUPASPR, STUNCLIP1SPR};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnBonus\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnBonus(Sint16 x, Sint16 y, Sint16 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(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y);\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(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(true);\r
-       new->needtoclip = cl_noclip;\r
-       new->priority = 3;\r
-       new->obclass = inertobj;\r
-       new->x = CONVERT_TILE_TO_GLOBAL(x);\r
-       new->y = CONVERT_TILE_TO_GLOBAL(y);\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
-       ob->shapenum++;\r
-       if (ob->shapenum == ob->temp3)\r
-               ob->shapenum = ob->temp2;\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 COUNCIL MEMBER\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_councilwalk1 = {COUNCILWALKL1SPR, COUNCILWALKR1SPR, step, false, true,   10,  64, 0, T_Council, NULL, R_Walk, &s_councilwalk2};\r
-statetype s_councilwalk2 = {COUNCILWALKL2SPR, COUNCILWALKR2SPR, step, false, true,   10,  64, 0, T_Council, NULL, R_Walk, &s_councilwalk1};\r
-statetype s_councilstand = {COUNCILTHINKLSPR, COUNCILTHINKRSPR, step, false, false, 120, 128, 0, NULL, NULL, R_Draw, &s_councilwalk1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnCouncil\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnCouncil(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = oracleobj;\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) -0x171;      //TODO: wierd\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_councilwalk1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Council\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Council(objtype *ob)\r
-{\r
-       Uint16 randnum;\r
-\r
-       randnum = US_RndT();\r
-       if (tics*8 > randnum)\r
-       {\r
-               // BUG: might be about to move off a ledge, causing it to get stuck\r
-               // after standing (the stand state doesn't use R_Walk)!\r
-               // To avoid that, set xtry to 0 here.\r
-               ob->state = &s_councilstand;\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 POINSON SLUG\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_slugwalk1   = {SLUGWALKL1SPR,   SLUGWALKR1SPR,   step,  false, true,    8, 64, 0, NULL, C_Slug, R_WalkNormal, &s_slugwalk2};\r
-statetype s_slugwalk2   = {SLUGWALKL2SPR,   SLUGWALKR2SPR,   step,  false, true,    8, 64, 0, T_Slug, C_Slug, R_WalkNormal, &s_slugwalk1};\r
-statetype s_slugpiss1   = {SLUGPISSLSPR,    SLUGPISSRSPR,    step,  false, true,   60, 64, 0, T_SlugPiss, C_Slug, R_WalkNormal, &s_slugwalk1};\r
-statetype s_slugstun    = {SLUGSTUN1SPR,    SLUGSTUN1SPR,    think, false, false,   0,  0, 0, T_Projectile, NULL, R_Stunned, NULL};\r
-statetype s_slugstunalt = {SLUGSTUN2SPR,    SLUGSTUN2SPR,    think, false, false,   0,  0, 0, T_Projectile, NULL, R_Stunned, NULL};\r
-statetype s_slugslime   = {SLUGSLIME1SPR,   SLUGSLIME1SPR,   step,  false, false, 300,  0, 0, NULL, C_Lethal, R_Draw, &s_slugslime2};\r
-statetype s_slugslime2  = {SLUGSLIME2SPR,   SLUGSLIME2SPR,   step,  false, false,  60,  0, 0, NULL, NULL, R_Draw, NULL};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnSlug\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnSlug(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = slugobj;\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) - 0x71;\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_slugwalk1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Slug\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Slug(objtype *ob)\r
-{\r
-       if (US_RndT() < 16)\r
-       {\r
-               if (ob->x < player->x)\r
-               {\r
-                       ob->xdir = 1;\r
-               }\r
-               else\r
-               {\r
-                       ob->xdir = -1;\r
-               }\r
-               ob->state = &s_slugpiss1;\r
-               SD_PlaySound(SND_SLUGPOO);\r
-               // Note: might be a good idea to set xtry to 0 here\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_SlugPiss\r
-=\r
-===========================\r
-*/\r
-\r
-void T_SlugPiss(objtype *ob)\r
-{\r
-       GetNewObj(true);\r
-       new->obclass = inertobj;\r
-       new->active = ac_removable;\r
-       new->priority = 0;\r
-       new->x = ob->x;\r
-       new->y = ob->bottom - 8*PIXGLOBAL;\r
-       NewState(new, &s_slugslime);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Slug\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Slug(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-       }\r
-       else if (hit->obclass == stunshotobj)\r
-       {\r
-               if (US_RndT() < 0x80)\r
-               {\r
-                       StunObj(ob, hit, &s_slugstun);\r
-               }\r
-               else\r
-               {\r
-                       StunObj(ob, hit, &s_slugstunalt);\r
-               }\r
-               ob->yspeed = -24;\r
-               ob->xspeed = ob->xdir*8;\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 MAD MUSHROOM\r
-\r
-temp1 = jump counter\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_mushroom1 = {MADMUSHROOML1SPR, MADMUSHROOMR1SPR, stepthink, false, false, 8, 0, 0, T_Mushroom, C_Mushroom, R_Mushroom, &s_mushroom2};\r
-statetype s_mushroom2 = {MADMUSHROOML2SPR, MADMUSHROOMR2SPR, stepthink, false, false, 8, 0, 0, T_Mushroom, C_Mushroom, R_Mushroom, &s_mushroom1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnMadMushroom\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnMadMushroom(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = madmushroomobj;\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) - 0xF1;\r
-       new->xdir = 1;\r
-       new->ydir = 1;\r
-       NewState(new, &s_mushroom1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Mushroom\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Mushroom(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
-       // BUG: this might be executed twice during the same frame if the\r
-       // object's animation/state changed during that frame, causing the\r
-       // object to move at twice the speed during that frame!\r
-       // To avoid that, return if ytry is not 0.\r
-       DoWeakGravity(ob);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Mushroom\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Mushroom(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
-= R_Mushroom\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Mushroom(objtype *ob)\r
-{\r
-       if (ob->hitsouth)\r
-               ob->yspeed = 0;\r
-\r
-       if (ob->hitnorth)\r
-       {\r
-               ob->yspeed = 0;\r
-               if (++ob->temp1 == 3)\r
-               {\r
-                       ob->temp1 = 0;\r
-                       ob->yspeed = -68;\r
-                       SD_PlaySound(SND_BOUNCE2);\r
-               }\r
-               else\r
-               {\r
-                       SD_PlaySound(SND_BOUNCE1);\r
-                       ob->yspeed = -40;\r
-               }\r
-       }\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 EGGBIRD\r
-\r
-temp1 = blocked flag for flying eggbird (cannot change xdir to chase Keen\r
-        while this is non-zero)\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_egg      = {EGGSPR,      EGGSPR,      think, false, true,      8, 0, 0, NULL, C_Egg, R_Draw, NULL};\r
-statetype s_eggbroke = {EGGBROKESPR, EGGBROKESPR, step,  false, false, 30000, 0, 0, NULL, NULL, R_Draw, NULL};\r
-statetype s_eggchip1 = {EGGCHIP1SPR, EGGCHIP1SPR, think, false, false,     0, 0, 0, T_Projectile, NULL, R_Chip, NULL};\r
-statetype s_eggchip2 = {EGGCHIP2SPR, EGGCHIP2SPR, think, false, false,     0, 0, 0, T_Projectile, NULL, R_Chip, NULL};\r
-statetype s_eggchip3 = {EGGCHIP3SPR, EGGCHIP3SPR, think, false, false,     0, 0, 0, T_Projectile, NULL, R_Chip, NULL};\r
-\r
-statetype s_eggbirdpause = {BIRDWALKL1SPR, BIRDWALKR1SPR, step,       false, true,  120, 128, 0, NULL, C_EggbirdStun, R_Eggbird, &s_eggbirdwalk2};\r
-statetype s_eggbirdwalk1 = {BIRDWALKL1SPR, BIRDWALKR1SPR, step,       false, true,    7, 128, 0, NULL, C_Eggbird, R_Eggbird, &s_eggbirdwalk2};\r
-statetype s_eggbirdwalk2 = {BIRDWALKL2SPR, BIRDWALKR2SPR, step,       false, true,    7, 128, 0, NULL, C_Eggbird, R_Eggbird, &s_eggbirdwalk3};\r
-statetype s_eggbirdwalk3 = {BIRDWALKL3SPR, BIRDWALKR3SPR, step,       false, true,    7, 128, 0, NULL, C_Eggbird, R_Eggbird, &s_eggbirdwalk4};\r
-statetype s_eggbirdwalk4 = {BIRDWALKL4SPR, BIRDWALKR4SPR, step,       false, true,    7, 128, 0, T_Eggbird, C_Eggbird, R_Eggbird, &s_eggbirdwalk1};\r
-statetype s_eggbirdfly1  = {BIRDFLY1SPR,   BIRDFLY1SPR,   slidethink, false, false,   8,   0, 0, T_EggbirdFly, C_Eggbird, R_Eggbirdfly, &s_eggbirdfly2};\r
-statetype s_eggbirdfly2  = {BIRDFLY2SPR,   BIRDFLY2SPR,   slidethink, false, false,   8,   0, 0, T_EggbirdFly, C_Eggbird, R_Eggbirdfly, &s_eggbirdfly3};\r
-statetype s_eggbirdfly3  = {BIRDFLY3SPR,   BIRDFLY3SPR,   slidethink, false, false,   8,   0, 0, T_EggbirdFly, C_Eggbird, R_Eggbirdfly, &s_eggbirdfly4};\r
-statetype s_eggbirdfly4  = {BIRDFLY4SPR,   BIRDFLY4SPR,   slidethink, false, false,   8,   0, 0, T_EggbirdFly, C_Eggbird, R_Eggbirdfly, &s_eggbirdfly1};\r
-statetype s_eggbirddrop  = {BIRDFLY4SPR,   BIRDFLY4SPR,   think,      false, false,   8, 128, 0, T_WeakProjectile, C_Eggbird, R_EggbirdDrop, NULL};\r
-statetype s_eggbirdstun  = {BIRDSTUNSPR,   BIRDSTUNSPR,   stepthink,  false, false, 240,   0, 0, T_Projectile, C_EggbirdStun, R_Draw, &s_eggbirdstun2};\r
-statetype s_eggbirdstun2 = {BIRDWALKL1SPR, BIRDWALKR1SPR, step,       false, true,   20,   0, 0, NULL, C_EggbirdStun, R_Draw, &s_eggbirdstun3};\r
-statetype s_eggbirdstun3 = {BIRDSTUNSPR,   BIRDSTUNSPR,   step,       false, true,   20,   0, 0, NULL, C_EggbirdStun, R_Draw, &s_eggbirdstun4};\r
-statetype s_eggbirdstun4 = {BIRDWALKL1SPR, BIRDWALKR1SPR, step,       false, true,   20,   0, 0, NULL, C_EggbirdStun, R_Draw, &s_eggbirdstun5};\r
-statetype s_eggbirdstun5 = {BIRDSTUNSPR,   BIRDSTUNSPR,   step,       false, true,   20,   0, 0, T_EggUnstun, C_EggbirdStun, R_Draw, &s_eggbirdwalk1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnEggbird\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnEggbird(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = eggobj;\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) - 0x71;\r
-       new->xdir = 1;\r
-       new->ydir = 1;\r
-       NewState(new, &s_egg);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_EggUnstun\r
-=\r
-===========================\r
-*/\r
-\r
-void T_EggUnstun(objtype *ob)\r
-{\r
-       ob->obclass = eggbirdobj;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnEggbirdOut\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnEggbirdOut(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(true);\r
-       new->obclass = eggbirdobj;\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) - 0xF1;\r
-       if (new->x < player->x)\r
-       {\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xdir = -1;\r
-       }\r
-       new->ydir = 1;\r
-       NewState(new, &s_eggbirdpause);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Egg\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Egg(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj || hit->obclass == keenobj)\r
-       {\r
-               if (hit->obclass == stunshotobj)\r
-                       ExplodeShot(hit);\r
-\r
-               ob->obclass = inertobj;\r
-               ob->active = ac_removable;\r
-               ChangeState(ob, &s_eggbroke);\r
-\r
-               GetNewObj(true);\r
-               new->obclass = eggbirdobj;\r
-               new->active = ac_yes;\r
-               new->x = ob->x;\r
-               new->y = ob->y - 8*PIXGLOBAL;\r
-               if (ob->x < player->x)\r
-               {\r
-                       new->xdir = 1;\r
-               }\r
-               else\r
-               {\r
-                       new->xdir = -1;\r
-               }\r
-               new->ydir = 1;\r
-               NewState(new, &s_eggbirdpause);\r
-\r
-               GetNewObj(true);\r
-               new->obclass = inertobj;\r
-               new->active = ac_removable;\r
-               new->x = ob->x;\r
-               new->y = ob->y;\r
-               new->xspeed = -28;\r
-               new->yspeed = -40;\r
-               NewState(new, &s_eggchip1);\r
-\r
-               GetNewObj(true);\r
-               new->obclass = inertobj;\r
-               new->active = ac_removable;\r
-               new->x = ob->x;\r
-               new->y = ob->y;\r
-               new->xspeed = 28;\r
-               new->yspeed = -40;\r
-               NewState(new, &s_eggchip2);\r
-\r
-               GetNewObj(true);\r
-               new->obclass = inertobj;\r
-               new->active = ac_removable;\r
-               new->x = ob->x;\r
-               new->y = ob->y;\r
-               new->xspeed = 0;\r
-               new->yspeed = -56;\r
-               NewState(new, &s_eggchip3);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Eggbird\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Eggbird(objtype *ob)\r
-{\r
-       if (ob->x < player->x)\r
-       {\r
-               ob->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               ob->xdir = -1;\r
-       }\r
-       if (ob->bottom >= player->bottom + 3*TILEGLOBAL && player->hitnorth\r
-               && StatePositionOk(ob, &s_eggbirdfly1)) // BUG: StatePositionOk() only works for normal clipping, not for full clipping\r
-       {\r
-               // Note: might be a good idea to set xtry to 0 here\r
-               ob->state = &s_eggbirdfly1;\r
-               ob->needtoclip = cl_fullclip;\r
-               ob->yspeed = -8;\r
-               ob->temp1 = 0;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_EggbirdFly\r
-=\r
-===========================\r
-*/\r
-\r
-void T_EggbirdFly(objtype *ob)\r
-{\r
-       if (ob->temp1 == 0)\r
-       {\r
-               if (ob->x < player->x)\r
-               {\r
-                       ob->xdir = 1;\r
-               }\r
-               else\r
-               {\r
-                       ob->xdir = -1;\r
-               }\r
-       }\r
-       AccelerateXv(ob, ob->xdir, 16);\r
-       if (ob->y < player->y)\r
-       {\r
-               AccelerateY(ob, 1, 16);\r
-       }\r
-       else\r
-       {\r
-               AccelerateY(ob, -1, 16);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Eggbird\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Eggbird(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-       }\r
-       else if (hit->obclass == stunshotobj)\r
-       {\r
-               ob->xspeed = 0;\r
-               ob->needtoclip = cl_midclip;\r
-               StunObj(ob, hit, &s_eggbirdstun);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_EggbirdStun\r
-=\r
-===========================\r
-*/\r
-\r
-void C_EggbirdStun(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               ob->xspeed = 0;\r
-               StunObj(ob, hit, &s_eggbirdstun);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Eggbird\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Eggbird(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
-       if (!ob->hitnorth)\r
-       {\r
-               ob->yspeed = -16;\r
-               ob->needtoclip = cl_fullclip;\r
-               ChangeState(ob, &s_eggbirdfly1);\r
-       }\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_EggbirdDrop\r
-=\r
-===========================\r
-*/\r
-\r
-void R_EggbirdDrop(objtype *ob)        //never actually used\r
-{\r
-       if (ob->hitnorth)\r
-       {\r
-               ChangeState(ob, &s_eggbirdwalk1);\r
-       }\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Chip\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Chip(objtype *ob)\r
-{\r
-       if (ob->hitnorth)\r
-               ob->xspeed = ob->yspeed = 0;\r
-\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Eggbirdfly\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Eggbirdfly(objtype *ob)\r
-{\r
-       statetype *oldstate;\r
-\r
-       if ((ob->hitsouth || ob->hitnorth) && !ob->temp1)\r
-               ob->temp1++;\r
-\r
-       if (ob->hiteast && ob->xspeed < 0 || ob->hitwest && ob->xspeed > 0)\r
-       {\r
-               ob->xspeed = 0;\r
-               ob->xdir = -ob->xdir;\r
-       }\r
-       if (ob->hitnorth == 1 && player->bottom - ob->bottom < 8*PIXGLOBAL)     // BUG? unsigned comparison!\r
-       {\r
-               oldstate = ob->state;\r
-               ob->needtoclip = cl_midclip;\r
-               ChangeState(ob, &s_eggbirdwalk1);\r
-               xtry = 0;\r
-               ytry = 8*PIXGLOBAL;\r
-               PushObj(ob);\r
-               if (!ob->hitnorth)\r
-               {\r
-                       ob->needtoclip = cl_fullclip;\r
-                       ChangeState(ob, oldstate);\r
-               }\r
-               return; // BUG: sprite isn't updated\r
-       }\r
-\r
-       if (!ob->hitsouth && !ob->hitnorth)\r
-               ob->temp1 = 0;\r
-\r
-       RF_PlaceSprite(&ob->sprite, ob->x, ob->y, ob->shapenum, spritedraw, ob->priority);\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 ARACHNUT\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_arach1     = {ARACHNUTWALK1SPR, ARACHNUTWALK4SPR, step, false, true,   6, 128, 0, NULL, C_Arach, R_Walk, &s_arach2};\r
-statetype s_arach2     = {ARACHNUTWALK2SPR, ARACHNUTWALK3SPR, step, false, true,   6, 128, 0, NULL, C_Arach, R_Walk, &s_arach3};\r
-statetype s_arach3     = {ARACHNUTWALK3SPR, ARACHNUTWALK2SPR, step, false, true,   6, 128, 0, NULL, C_Arach, R_Walk, &s_arach4};\r
-statetype s_arach4     = {ARACHNUTWALK4SPR, ARACHNUTWALK1SPR, step, false, true,   6, 128, 0, T_Arach, C_Arach, R_Walk, &s_arach1};\r
-statetype s_arachstun  = {ARACHNUTSTUNSPR,  ARACHNUTSTUNSPR,  step, false, true, 240,   0, 0, NULL, C_ArachStun, R_Draw, &s_arachstun2};\r
-statetype s_arachstun2 = {ARACHNUTWALK1SPR, ARACHNUTWALK1SPR, step, false, true,  20,   0, 0, NULL, C_ArachStun, R_Draw, &s_arachstun3};\r
-statetype s_arachstun3 = {ARACHNUTSTUNSPR,  ARACHNUTSTUNSPR,  step, false, true,  20,   0, 0, NULL, C_ArachStun, R_Draw, &s_arachstun4};\r
-statetype s_arachstun4 = {ARACHNUTWALK1SPR, ARACHNUTWALK1SPR, step, false, true,  20,   0, 0, NULL, C_ArachStun, R_Draw, &s_arachstun5};\r
-statetype s_arachstun5 = {ARACHNUTSTUNSPR,  ARACHNUTSTUNSPR,  step, false, true,  20,   0, 0, NULL, C_ArachStun, R_Draw, &s_arach1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnArachnut\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnArachnut(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = arachnutobj;\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) - 0x171;\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_arach1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_Arach\r
-=\r
-===========================\r
-*/\r
-\r
-void T_Arach(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
-= C_Arach\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Arach(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               StunObj(ob, hit, &s_arachstun);\r
-       }\r
-       else if (hit->obclass == keenobj)\r
-       {\r
-               KillKeen();\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_ArachStun\r
-=\r
-===========================\r
-*/\r
-\r
-void C_ArachStun(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               StunObj(ob, hit, &s_arachstun);\r
-       }\r
-}\r
-\r
-/*\r
-=============================================================================\r
-\r
-                                                 SKYPEST\r
-\r
-=============================================================================\r
-*/\r
-\r
-statetype s_pestfly1 = {SKYPESTFLYL1SPR, SKYPESTFLYR1SPR, stepthink, true, false, 5, 0, 0, T_PestFly, C_PestFly, R_Pest, &s_pestfly2};\r
-statetype s_pestfly2 = {SKYPESTFLYL2SPR, SKYPESTFLYR2SPR, stepthink, true, false, 5, 0, 0, T_PestFly, C_PestFly, R_Pest, &s_pestfly1};\r
-statetype s_squashedpest = {SKYPESTSQUASHEDSPR, SKYPESTSQUASHEDSPR, think, false, false, 0, 0, 0, NULL, NULL, R_Draw, &s_squashedpest};\r
-statetype s_pestrest1  = {SKYPESTSIT9SPR, SKYPESTSIT9SPR, step, false, false, 100, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest2};\r
-statetype s_pestrest2  = {SKYPESTSIT1SPR, SKYPESTSIT1SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest3};\r
-statetype s_pestrest3  = {SKYPESTSIT2SPR, SKYPESTSIT2SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest4};\r
-statetype s_pestrest4  = {SKYPESTSIT3SPR, SKYPESTSIT3SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest5};\r
-statetype s_pestrest5  = {SKYPESTSIT4SPR, SKYPESTSIT4SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest6};\r
-statetype s_pestrest6  = {SKYPESTSIT3SPR, SKYPESTSIT3SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest7};\r
-statetype s_pestrest7  = {SKYPESTSIT2SPR, SKYPESTSIT2SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest8};\r
-statetype s_pestrest8  = {SKYPESTSIT1SPR, SKYPESTSIT1SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest9};\r
-statetype s_pestrest9  = {SKYPESTSIT9SPR, SKYPESTSIT9SPR, step, false, false, 60, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest10};\r
-statetype s_pestrest10 = {SKYPESTSIT5SPR, SKYPESTSIT5SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest11};\r
-statetype s_pestrest11 = {SKYPESTSIT6SPR, SKYPESTSIT6SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest12};\r
-statetype s_pestrest12 = {SKYPESTSIT7SPR, SKYPESTSIT7SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest13};\r
-statetype s_pestrest13 = {SKYPESTSIT8SPR, SKYPESTSIT8SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest14};\r
-statetype s_pestrest14 = {SKYPESTSIT7SPR, SKYPESTSIT7SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest15};\r
-statetype s_pestrest15 = {SKYPESTSIT6SPR, SKYPESTSIT6SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest16};\r
-statetype s_pestrest16 = {SKYPESTSIT5SPR, SKYPESTSIT5SPR, step, false, false, 10, 0, 0, NULL, C_Squashable, R_Draw, &s_pestrest17};\r
-statetype s_pestrest17 = {SKYPESTSIT9SPR, SKYPESTSIT9SPR, step, false, false, 100, 0, 0, T_PestRest, C_Squashable, R_Draw, &s_pestfly1};\r
-\r
-/*\r
-===========================\r
-=\r
-= SpawnSkypest\r
-=\r
-===========================\r
-*/\r
-\r
-void SpawnSkypest(Sint16 x, Sint16 y)\r
-{\r
-       GetNewObj(false);\r
-       new->obclass = skypestobj;\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);\r
-       if (US_RndT() < 0x80)\r
-       {\r
-               new->xdir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->xdir = -1;\r
-       }\r
-       if (US_RndT() < 0x80)\r
-       {\r
-               new->ydir = 1;\r
-       }\r
-       else\r
-       {\r
-               new->ydir = -1;\r
-       }\r
-       NewState(new, &s_pestfly1);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_PestFly\r
-=\r
-===========================\r
-*/\r
-\r
-void T_PestFly(objtype *ob)\r
-{\r
-       // BUG: this might be executed twice during the same frame if the\r
-       // object's animation/state changed during that frame, causing the\r
-       // object to move at twice the speed during that frame!\r
-       // To avoid that, return if xtry is not 0 or ytry is not 0.\r
-\r
-       if (US_RndT() < tics)\r
-               ob->xdir = -ob->xdir;\r
-\r
-       if (ob->ydir == -1 && US_RndT() < tics)\r
-               ob->ydir = 1;\r
-\r
-       if (ob->ydir == 1 && US_RndT() < tics*2)\r
-               ob->ydir = -ob->ydir;\r
-\r
-       AccelerateX(ob, ob->xdir, 20);\r
-       AccelerateY(ob, ob->ydir, 20);\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_PestFly\r
-=\r
-===========================\r
-*/\r
-\r
-void C_PestFly(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->obclass == keenobj)\r
-               KillKeen();\r
-\r
-       if (hit->obclass == stunshotobj)\r
-       {\r
-               if (hit->xdir == 1)\r
-               {\r
-                       ob->xspeed = 20;\r
-               }\r
-               else if (hit->xdir == -1)\r
-               {\r
-                       ob->xspeed = -20;\r
-               }\r
-               else if (hit->ydir == 1)\r
-               {\r
-                       ob->yspeed = 20;\r
-               }\r
-               else if (hit->ydir == -1)\r
-               {\r
-                       ob->yspeed = -20;\r
-               }\r
-               ExplodeShot(hit);\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= C_Squashable\r
-=\r
-===========================\r
-*/\r
-\r
-void C_Squashable(objtype *ob, objtype *hit)\r
-{\r
-       if (hit->state == &s_keenpogodown || hit->state == &s_keenpogo || hit->state == &s_keenpogo2)\r
-       {\r
-               ChangeState(ob, &s_squashedpest);\r
-               SD_PlaySound(SND_SQUISH);\r
-               ob->obclass = inertobj;\r
-       }\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= T_PestRest\r
-=\r
-===========================\r
-*/\r
-\r
-void T_PestRest(objtype *ob)\r
-{\r
-       ob->ydir = -1;\r
-       ob->yspeed = -16;\r
-       ytry = -144;\r
-}\r
-\r
-/*\r
-===========================\r
-=\r
-= R_Pest\r
-=\r
-===========================\r
-*/\r
-\r
-void R_Pest(objtype *ob)\r
-{\r
-       if (ob->hitsouth)\r
-       {\r
-               ob->yspeed = 8;\r
-               ob->ydir = 1;\r
-       }\r
-       if (ob->hitnorth && !ob->hiteast && !ob->hitwest)\r
-       {\r
-               ob->y += 8*PIXGLOBAL;\r
-               ChangeState(ob, &s_pestrest1);\r
-       }\r
-       if (ob->hitwest)\r
-       {\r
-               ob->xspeed = 0;\r
-               ob->xdir = -1;\r
-       }\r
-       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