--- /dev/null
+/* 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
+#ifndef __CK_DEF__\r
+#define __CK_DEF__\r
+\r
+#include <BIOS.H>\r
+#include <CONIO.H>\r
+\r
+#include "ID_HEADS.H"\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL CONSTANTS & MACROS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define MAXACTORS 100\r
+\r
+#define GAMELEVELS 25\r
+\r
+#define CONVERT_GLOBAL_TO_TILE(x) ((x)>>(G_T_SHIFT))\r
+#define CONVERT_TILE_TO_GLOBAL(x) ((x)<<(G_T_SHIFT))\r
+#define CONVERT_GLOBAL_TO_PIXEL(x) ((x)>>(G_P_SHIFT))\r
+#define CONVERT_PIXEL_TO_GLOBAL(x) ((x)<<(G_P_SHIFT))\r
+#define CONVERT_PIXEL_TO_TILE(x) ((x)>>(P_T_SHIFT))\r
+#define CONVERT_TILE_TO_PIXEL(x) ((x)<<(P_T_SHIFT))\r
+\r
+#define SPAWN_ADJUST_Y(y, h) (CONVERT_TILE_TO_GLOBAL(y) + (CONVERT_PIXEL_TO_GLOBAL(16-(h))))\r
+\r
+#define ARRAYLENGTH(x) (sizeof(x)/sizeof(*(x)))\r
+\r
+#define CA_UnmarkGrChunk(num) (grneeded[num] &= ~ca_levelbit)\r
+\r
+#define SetPalette(pal) {_ES=FP_SEG(pal); _DX=FP_OFF(pal); _AX=0x1002; geninterrupt(0x10);}\r
+#define SetPaletteEx(pal) {(pal)[16] = bordercolor; SetPalette(pal);}\r
+\r
+//HACK IMPORTS:\r
+void RFL_InitAnimList(void);\r
+void CA_FreeGraphics(void);\r
+void CA_SetGrPurge(void);\r
+\r
+/*\r
+Note:\r
+\r
+The ID software memory manager doesn't care about the different purge levels.\r
+Using PURGE_FIST is identical to using PURGE_LAST.\r
+*/\r
+#define PURGE_FIRST 3\r
+#define PURGE_LAST 1\r
+\r
+#define PLATFORMBLOCK 31\r
+#define DIRARROWSTART 91\r
+#define DIRARROWEND (DIRARROWSTART+arrow_None)\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL TYPES\r
+\r
+=============================================================================\r
+*/\r
+\r
+//SDL-style integer types - just to make future SDL ports easier\r
+typedef unsigned int Uint16;\r
+typedef signed int Sint16;\r
+typedef unsigned char Uint8;\r
+typedef signed char Sint8;\r
+typedef unsigned long Uint32;\r
+typedef signed long Sint32;\r
+//Note: only the game code (CK_*.C, K?_*.C) uses these!\r
+\r
+//some compile-time checks to make sure the ints have the correct size\r
+#if (sizeof(Uint16) != 2)\r
+#error 'Uint16' has wrong size\r
+#elif (sizeof(Sint16) != 2)\r
+#error 'Sint16' has wrong size\r
+#elif (sizeof(Uint8) != 1)\r
+#error 'Uint8' has wrong size\r
+#elif (sizeof(Sint8) != 1)\r
+#error 'Sint8' has wrong size\r
+#elif (sizeof(Uint32) != 4)\r
+#error 'Uint32' has wrong size\r
+#elif (sizeof(Sint32) != 4)\r
+#error 'Sint32' has wrong size\r
+#endif\r
+\r
+typedef enum {\r
+ arrow_North, // 0\r
+ arrow_East, // 1\r
+ arrow_South, // 2\r
+ arrow_West, // 3\r
+ arrow_NorthEast, // 4\r
+ arrow_SouthEast, // 5\r
+ arrow_SouthWest, // 6\r
+ arrow_NorthWest, // 7\r
+ arrow_None // 8\r
+} arrowdirtype;\r
+\r
+typedef enum {\r
+ ex_stillplaying, // 0\r
+ ex_died, // 1\r
+ ex_completed, // 2\r
+ ex_rescued, // 3, only in Keen 4\r
+ ex_warped, // 4\r
+ ex_resetgame, // 5\r
+ ex_loadedgame, // 6\r
+ ex_foot, // 7, only in Keen 4\r
+ ex_abortgame, // 8\r
+ ex_sandwich, // 9, only in Keen 6\r
+ ex_hook, // 10, only in Keen 6\r
+ ex_card, // 11, only in Keen 6\r
+ ex_molly, // 12, only in Keen 6\r
+ ex_portout, // 13, only in Keen 5\r
+ ex_fusebroke, // 14, only in Keen 5\r
+ ex_qedbroke, // 15, only in Keen 5\r
+ NUMEXITTYPES\r
+} exittype;\r
+\r
+typedef enum\r
+{\r
+ INTILE_NOTHING, // 0\r
+ INTILE_POLE, // 1\r
+ INTILE_DOOR, // 2\r
+ INTILE_DEADLY, // 3\r
+ INTILE_DROP, // 4\r
+ INTILE_SWITCH0, // 5\r
+ INTILE_SWITCH1, // 6\r
+ INTILE_GEMSOCKET0, // 7\r
+ INTILE_GEMSOCKET1, // 8\r
+ INTILE_GEMSOCKET2, // 9\r
+ INTILE_GEMSOCKET3, // 10\r
+ INTILE_SHORESOUTH, // 11\r
+ INTILE_SHOREWEST, // 12\r
+ INTILE_SHORENORTH, // 13\r
+ INTILE_SHOREEAST, // 14\r
+ INTILE_BRIDGESWITCH, // 15\r
+ INTILE_MOON, // 16\r
+ INTILE_DIRARROW, // 17 (not used in the code, but assigned to tiles in Keen 5 & 6)\r
+ INTILE_BRIDGE, // 18\r
+ INTILE_FORCEFIELD, // 19\r
+ INTILE_TELEPORT, // 20\r
+ INTILE_BONUS100, // 21\r
+ INTILE_BONUS200, // 22\r
+ INTILE_BONUS500, // 23\r
+ INTILE_BONUS1000, // 24\r
+ INTILE_BONUS2000, // 25\r
+ INTILE_BONUS5000, // 26\r
+ INTILE_EXTRALIFE, // 27\r
+ INTILE_AMMO, // 28\r
+ INTILE_29, // 29 (never used)\r
+ INTILE_FORCEFIELDEND, // 30\r
+ INTILE_AMPTONCOMPUTER, // 31\r
+ INTILE_KEYCARDDOOR, // 32\r
+ INTILE_ELEVATORLEFT, // 33\r
+ INTILE_ELEVATORRIGHT, // 34\r
+\r
+ INTILE_FOREGROUND = 0x80\r
+} intiletype;\r
+\r
+#define INTILE_TYPEMASK (INTILE_FOREGROUND-1)\r
+\r
+typedef enum\r
+{\r
+ nothing, // 0\r
+ inertobj, // 1\r
+ keenobj, // 2\r
+ stunshotobj, // 3\r
+#if defined KEEN4\r
+ bonusobj, // 4\r
+ slugobj, // 5\r
+ oracleobj, // 6\r
+ classtype_7, // 7, never used\r
+ eggobj, // 8\r
+ madmushroomobj, // 9\r
+ arachnutobj, // 10\r
+ skypestobj, // 11\r
+ wormouthobj, // 12\r
+ thundercloudobj, // 13\r
+ berkeloidobj, // 14\r
+ bounderobj, // 15\r
+ inchwormobj, // 16\r
+ footobj, // 17\r
+ lickobj, // 18\r
+ mimrockobj, // 19\r
+ platformobj, // 20\r
+ dopefishobj, // 21\r
+ schoolfishobj, // 22\r
+ pixieobj, // 23\r
+ lindseyobj, // 24\r
+ lightningobj, // 25\r
+ treasureeaterobj,// 26\r
+ eggbirdobj, // 27\r
+ classtype_28, // 28, never used\r
+ classtype_29, // 29, never used\r
+ scubaobj, // 30\r
+ mshotobj, // 31\r
+ mineobj, // 32\r
+ stunnedobj, // 33\r
+ flagobj, // 34\r
+#elif defined KEEN5\r
+ mshotobj, // 4\r
+ bonusobj, // 5\r
+ platformobj, // 6\r
+ stunnedobj, // 7\r
+ flagobj, // 8\r
+ sparkyobj, // 9\r
+ mineobj, // 10\r
+ slicestarobj, // 11\r
+ roboredobj, // 12\r
+ spirogripobj, // 13\r
+ amptonobj, // 14\r
+ cannonobj, // 15\r
+ volteobj, // 16\r
+ shelleyobj, // 17, never used\r
+ spindredobj, // 18\r
+ shikadimasterobj,// 19\r
+ shikadiobj, // 20\r
+ petobj, // 21\r
+ spherefulobj, // 22\r
+ scottieobj, // 23\r
+ teleporterobj, // 24\r
+ qedobj, // 25\r
+#elif defined KEEN6\r
+ mshotobj, // 4\r
+ bonusobj, // 5\r
+ platformobj, // 6\r
+ bloogobj, // 7\r
+ bloogletobj, // 8\r
+ classtype_9, // 9, never used\r
+ fleexobj, // 10\r
+ classtype_11, // 11, never used\r
+ mollyobj, // 12\r
+ babobbaobj, // 13\r
+ bobbaobj, // 14\r
+ classtype_15, // 15\r
+ nospikeobj, // 16\r
+ gikobj, // 17\r
+ cannonobj, // 18\r
+ orbatrixobj, // 19\r
+ bipobj, // 20\r
+ flectobj, // 21\r
+ blorbobj, // 22\r
+ ceilickobj, // 23\r
+ blooguardobj, // 24\r
+ stunnedobj, // 25\r
+ bipshipobj, // 26\r
+ sandwichobj, // 27\r
+ hookobj, // 28\r
+ passcardobj, // 29\r
+ grabbiterobj, // 30\r
+ rocketobj, // 31\r
+ grapplespotobj, // 32\r
+ satelliteobj, // 33\r
+ satellitestopobj,// 34\r
+ flagobj, // 35\r
+#endif\r
+ NUMCLASSTYPES\r
+} classtype;\r
+\r
+typedef struct statestruct\r
+{\r
+ Sint16 leftshapenum, rightshapenum;\r
+ enum {step,slide,think,stepthink,slidethink} progress;\r
+ boolean skippable;\r
+ boolean pushtofloor;\r
+ Sint16 tictime;\r
+ Sint16 xmove;\r
+ Sint16 ymove;\r
+ void (*think) (struct objstruct*);\r
+ void (*contact) (struct objstruct*, struct objstruct*);\r
+ void (*react) (struct objstruct*);\r
+ struct statestruct *nextstate;\r
+} statetype;\r
+\r
+typedef struct objstruct\r
+{\r
+ classtype obclass;\r
+ enum {ac_no, ac_yes, ac_allways, ac_removable} active;\r
+ boolean needtoreact;\r
+ enum {cl_noclip, cl_midclip, cl_fullclip} needtoclip;\r
+ Uint16 nothink;\r
+ Uint16 x, y;\r
+ Sint16 xdir, ydir;\r
+ Sint16 xmove, ymove;\r
+ Sint16 xspeed, yspeed;\r
+ Sint16 ticcount;\r
+ statetype *state;\r
+ Uint16 shapenum;\r
+ Uint16 priority;\r
+ Uint16 left, top, right, bottom, midx;\r
+ Uint16 tileleft, tiletop, tileright, tilebottom, tilemidx;\r
+ Sint16 hitnorth, hiteast, hitsouth, hitwest;\r
+ Sint16 temp1, temp2, temp3, temp4;\r
+ void *sprite;\r
+ struct objstruct *next, *prev;\r
+} objtype;\r
+\r
+typedef struct\r
+{\r
+ Uint16 worldx, worldy;\r
+ boolean leveldone[GAMELEVELS];\r
+ Sint32 score, nextextra;\r
+ Sint16 ammo, drops;\r
+#if defined KEEN4\r
+ Sint16 wetsuit;\r
+ Sint16 rescued;\r
+#elif defined KEEN5\r
+ boolean keycard;\r
+ Sint16 destroyed; // never used\r
+ Sint16 numfuses;\r
+#elif defined KEEN6\r
+ Sint16 sandwichstate, hookstate, passcardstate, rocketstate;\r
+#endif\r
+ Sint16 keys[4];\r
+ Sint16 mapon;\r
+ Sint16 lives;\r
+ Sint16 difficulty;\r
+ objtype *riding;\r
+} gametype;\r
+\r
+/*\r
+=============================================================================\r
+\r
+ CK_MAIN DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern char str[80], str2[20];\r
+extern boolean storedemo;\r
+\r
+void SizeText(char *text, Uint16 *width, Uint16 *height);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ CK_DEMO DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern boolean scorescreenkludge;\r
+\r
+void CheckLastScan(void);\r
+#if GRMODE == EGAGR\r
+void Terminator(void);\r
+void StarWars(void);\r
+#endif\r
+void ShowTitle(void);\r
+#if GRMODE == CGAGR\r
+void ShowCredits(void);\r
+#endif\r
+void RunDemo(Sint16 num);\r
+void DrawHighScores(void);\r
+void CheckHighScore(Sint32 score, Sint16 completed);\r
+void ShowHighScores(void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ CK_GAME DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+void FreeGraphics(void);\r
+void NewGame(void);\r
+boolean SaveTheGame(Sint16 handle);\r
+boolean LoadTheGame(Sint16 handle);\r
+void ResetGame(void);\r
+void SetupGameLevel(boolean loadnow);\r
+void DialogDraw(char *title, Uint16 numcache);\r
+void DialogUpdate(void);\r
+void DialogFinish(void);\r
+void StartDemoRecord(void);\r
+void EndDemoRecord(void);\r
+void GameLoop(void);\r
+void HandleDeath(void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ CK_PLAY DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern boolean singlestep, jumpcheat, godmode, keenkilled;\r
+extern exittype playstate;\r
+extern gametype gamestate;\r
+extern objtype *new, *check, *player, *scoreobj;\r
+extern Uint16 originxtilemax, originytilemax;\r
+extern ControlInfo c;\r
+extern boolean button2, button3; // never used\r
+extern objtype dummyobj;\r
+extern Sint16 invincible;\r
+extern boolean oldshooting, showscorebox, joypad;\r
+extern Sint16 groundslam;\r
+extern boolean debugok;\r
+extern boolean jumpbutton, jumpheld, pogobutton, pogoheld, firebutton, fireheld, upheld;\r
+\r
+\r
+void CheckKeys(void);\r
+void StatusWindow(void);\r
+void CenterActor(objtype *ob);\r
+void WorldScrollScreen(objtype *ob);\r
+void ScrollScreen(objtype *ob);\r
+void InitObjArray(void);\r
+Sint16 GetNewObj(boolean usedummy);\r
+void RemoveObj(objtype *ob);\r
+void GivePoints(Uint16 points);\r
+void StopMusic(void);\r
+void StartMusic(Uint16 num);\r
+void PlayLoop(void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ CK_TEXT DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+void HelpScreens(void);\r
+void FinaleLayout(void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ CK_STATE DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern Sint16 wallclip[8][16];\r
+\r
+extern Sint16 xtry;\r
+extern Sint16 ytry;\r
+extern boolean playerkludgeclipcancel;\r
+\r
+void MoveObjVert(objtype *ob, Sint16 ymove);\r
+void MoveObjHoriz(objtype *ob, Sint16 xmove);\r
+void PlayerBottomKludge(objtype *ob);\r
+void PlayerTopKludge(objtype *ob);\r
+void ClipToEnds(objtype *ob);\r
+void ClipToSides(objtype *ob);\r
+boolean CheckPosition(objtype *ob);\r
+boolean StatePositionOk(objtype *ob, statetype *state);\r
+\r
+#ifdef KEEN5\r
+void CalcBounds(objtype *ob);\r
+#endif\r
+\r
+void ClipToWalls(objtype *ob);\r
+void FullClipToWalls(objtype *ob);\r
+void PushObj(objtype *ob);\r
+void ClipToSpriteSide(objtype *push, objtype *solid);\r
+void ClipToSpriteTop(objtype *push, objtype *solid);\r
+void ClipToSprite(objtype *push, objtype *solid, boolean squish);\r
+Sint16 DoActor(objtype *ob, Sint16 numtics);\r
+void StateMachine(objtype *ob);\r
+void NewState(objtype *ob, statetype *state);\r
+void ChangeState(objtype *ob, statetype *state);\r
+boolean OnScreen(objtype *ob);\r
+void DoGravity(objtype *ob);\r
+void DoWeakGravity(objtype *ob);\r
+void DoTinyGravity(objtype *ob);\r
+void AccelerateX(objtype *ob, Sint16 dir, Sint16 maxspeed);\r
+void AccelerateXv(objtype *ob, Sint16 dir, Sint16 maxspeed);\r
+void AccelerateY(objtype *ob, Sint16 dir, Sint16 maxspeed);\r
+void FrictionX(objtype *ob);\r
+void FrictionY(objtype *ob);\r
+void StunObj(objtype *ob, objtype *shot, statetype *stunstate);\r
+void T_Projectile(objtype *ob);\r
+void T_WeakProjectile(objtype *ob);\r
+void ProjectileThink1(objtype *ob);\r
+void T_Velocity(objtype *ob);\r
+void SetReactThink(objtype *ob);\r
+void T_Stunned(objtype *ob);\r
+void C_Lethal(objtype *ob, objtype *hit);\r
+void R_Draw(objtype *ob);\r
+void R_Walk(objtype *ob);\r
+void R_WalkNormal(objtype *ob);\r
+void BadState(void);\r
+void R_Stunned(objtype *ob);\r
+\r
+extern statetype sc_deadstate;\r
+extern statetype sc_badstate;\r
+\r
+/*\r
+=============================================================================\r
+\r
+ CK_KEEN DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern Uint16 bounceangle[8][8];\r
+#ifndef KEEN4\r
+extern arrowdirtype arrowflip[];\r
+#endif\r
+\r
+extern statetype s_keenstand;\r
+extern statetype s_keenpauselook;\r
+extern statetype s_keenwait1;\r
+extern statetype s_keenwait2;\r
+extern statetype s_keenwait3;\r
+extern statetype s_keenwait4;\r
+extern statetype s_keenwait5;\r
+extern statetype s_keenwait6;\r
+extern statetype s_keenmoon1;\r
+extern statetype s_keenmoon2;\r
+extern statetype s_keenmoon3;\r
+extern statetype s_keenread;\r
+extern statetype s_keenread2;\r
+extern statetype s_keenread3;\r
+extern statetype s_keenread4;\r
+extern statetype s_keenread5;\r
+extern statetype s_keenread6;\r
+extern statetype s_keenread7;\r
+extern statetype s_keenstopread;\r
+extern statetype s_keenstopread2;\r
+extern statetype s_keenstopread3;\r
+extern statetype s_keenlookup;\r
+extern statetype s_keenlookup2;\r
+extern statetype s_keenlookdown;\r
+extern statetype s_keenlookdown2;\r
+extern statetype s_keenlookdown3;\r
+extern statetype s_keenlookdown4;\r
+extern statetype s_keendrop;\r
+extern statetype s_keendead;\r
+extern statetype s_keendie1;\r
+extern statetype s_keendie2;\r
+#ifdef KEEN4\r
+extern statetype s_keensuitdie1;\r
+extern statetype s_keensuitdie2;\r
+#endif\r
+extern statetype s_keenshoot1;\r
+extern statetype s_keenshoot2;\r
+extern statetype s_keenshootup1;\r
+extern statetype s_keenshootup2;\r
+extern statetype s_keenswitch;\r
+extern statetype s_keenswitch2;\r
+extern statetype s_keenkey;\r
+extern statetype s_keenlineup;\r
+extern statetype s_keenenter1;\r
+extern statetype s_keenenter2;\r
+extern statetype s_keenenter3;\r
+extern statetype s_keenenter4;\r
+extern statetype s_keenenter5;\r
+extern statetype s_keenpole;\r
+extern statetype s_keenclimb1;\r
+extern statetype s_keenclimb2;\r
+extern statetype s_keenclimb3;\r
+extern statetype s_keenslide1;\r
+extern statetype s_keenslide2;\r
+extern statetype s_keenslide3;\r
+extern statetype s_keenslide4;\r
+extern statetype s_keenpoleshoot1;\r
+extern statetype s_keenpoleshoot2;\r
+extern statetype s_keenpoleshootup1;\r
+extern statetype s_keenpoleshootup2;\r
+extern statetype s_keenpoleshootdown1;\r
+extern statetype s_keenpoleshootdown2;\r
+extern statetype s_keenwalk1;\r
+extern statetype s_keenwalk2;\r
+extern statetype s_keenwalk3;\r
+extern statetype s_keenwalk4;\r
+extern statetype s_keenpogodown;\r
+extern statetype s_keenpogo;\r
+extern statetype s_keenpogo2;\r
+extern statetype s_keenjump1;\r
+extern statetype s_keenjump2;\r
+extern statetype s_keenjump3;\r
+extern statetype s_keenjump4;\r
+extern statetype s_keenairshoot1;\r
+extern statetype s_keenairshoot2;\r
+extern statetype s_keenairshoot3;\r
+extern statetype s_keenairshootup1;\r
+extern statetype s_keenairshootup2;\r
+extern statetype s_keenairshootup3;\r
+extern statetype s_keenairshootdown1;\r
+extern statetype s_keenairshootdown2;\r
+extern statetype s_keenairshootdown3;\r
+extern statetype s_keenholdon;\r
+extern statetype s_keenholdon2;\r
+extern statetype s_keenclimbup;\r
+extern statetype s_keenclimbup2;\r
+extern statetype s_keenclimbup3;\r
+extern statetype s_keenclimbup4;\r
+extern statetype s_keenclimbup5;\r
+\r
+extern Sint16 slopespeed[8];\r
+extern Sint16 polexspeed[3];\r
+\r
+extern Sint16 shotsinclip[4];\r
+extern Sint16 bonussound[];\r
+extern Sint16 bonuspoints[];\r
+extern Sint16 bonussprite[];\r
+\r
+extern Uint16 zeromap;\r
+\r
+extern Sint16 singlegravity;\r
+extern Sint16 jumptime;\r
+extern Sint32 leavepoletime;\r
+extern Sint16 moonok;\r
+\r
+void SpawnKeen(Sint16 x, Sint16 y, Sint16 dir);\r
+boolean CheckGrabPole(objtype *ob);\r
+boolean CheckEnterHouse(objtype *ob);\r
+void WalkSound1(objtype *ob);\r
+void WalkSound2(objtype *ob);\r
+void KeenStandThink(objtype *ob);\r
+void KeenPauseThink(objtype *ob);\r
+void KeenReadThink(objtype *ob);\r
+void KeenLookUpThink(objtype *ob);\r
+void KeenLookDownThink(objtype *ob);\r
+void KeenWalkThink(objtype *ob);\r
+void T_LineUp(objtype *ob);\r
+void KeenEnterThink(objtype *ob);\r
+void KeenSwitchThink(objtype *ob);\r
+void KeenKeyThink(objtype *ob);\r
+void KeenAirThink(objtype *ob);\r
+void KeenBounceThink(objtype *ob);\r
+void KeenPogoThink(objtype *ob);\r
+void PoleActions(objtype *ob);\r
+void KeenPoleThink(objtype *ob);\r
+void KeenClimbThink(objtype *ob);\r
+void KeenDropThink(objtype *ob);\r
+void KeenDropDownThink(objtype *ob);\r
+void KeenHoldThink(objtype *ob);\r
+void KeenShootThink(objtype *ob);\r
+void T_PullUp1(objtype *ob);\r
+void T_PullUp2(objtype *ob);\r
+void T_PullUp3(objtype *ob);\r
+void T_PulledUp(objtype *ob);\r
+void KeenDieThink(objtype *ob);\r
+void KillKeen(void);\r
+void KeenContact(objtype *ob, objtype *hit);\r
+void KeenPosContact(objtype *ob, objtype *hit);\r
+void HandleRiding(objtype *ob);\r
+void TileBonus(Uint16 x, Uint16 y, Uint16 bonus);\r
+void GiveDrop(Uint16 x, Uint16 y);\r
+void CheckInTiles(objtype *ob);\r
+void KeenSimpleReact(objtype *ob);\r
+void KeenStandReact(objtype *ob);\r
+void KeenWalkReact(objtype *ob);\r
+void KeenAirReact(objtype *ob);\r
+void KeenPogoReact(objtype *ob);\r
+void KeenPoleReact(objtype *ob);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ CK_KEEN2 DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern statetype s_score;\r
+extern statetype s_demo;\r
+void SpawnScore(void);\r
+void UpdateScore(objtype *ob);\r
+void DrawDemoPlaque(objtype *ob);\r
+\r
+extern statetype s_worldkeen;\r
+extern statetype s_worldkeenwave1;\r
+extern statetype s_worldkeenwave2;\r
+extern statetype s_worldkeenwave3;\r
+extern statetype s_worldkeenwave4;\r
+extern statetype s_worldkeenwave5;\r
+extern statetype s_worldkeenwalk;\r
+void SpawnWorldKeen(Sint16 x, Sint16 y);\r
+#ifdef KEEN5\r
+void SpawnWorldKeenPort(Uint16 tileX, Uint16 tileY);\r
+#endif\r
+void CheckEnterLevel(objtype *ob);\r
+void T_KeenWorld(objtype *ob);\r
+void T_KeenWorldWalk(objtype *ob);\r
+void CheckWorldInTiles(objtype *ob);\r
+\r
+#ifdef KEEN4\r
+extern statetype s_keenonfoot1;\r
+extern statetype s_keenonfoot2;\r
+extern statetype s_worldswim;\r
+void T_FootFly(objtype *ob);\r
+void T_KeenWorldSwim(objtype *ob);\r
+#endif\r
+\r
+#ifdef KEEN5\r
+extern statetype s_worldelevate;\r
+void T_Elevate(objtype *ob);\r
+#endif\r
+\r
+extern statetype s_flagwave1;\r
+extern statetype s_flagwave2;\r
+extern statetype s_flagwave3;\r
+extern statetype s_flagwave4;\r
+void SpawnFlag(Sint16 x, Sint16 y);\r
+\r
+#ifndef KEEN5\r
+extern statetype s_throwflag0;\r
+extern statetype s_throwflag1;\r
+extern statetype s_throwflag2;\r
+extern statetype s_throwflag3;\r
+extern statetype s_throwflag4;\r
+extern statetype s_throwflag5;\r
+extern statetype s_throwflag6;\r
+void SpawnThrowFlag(Sint16 x, Sint16 y);\r
+void TossThink(objtype *ob);\r
+void PathThink(objtype *ob);\r
+void FlagAlign(objtype *ob);\r
+#endif\r
+\r
+extern statetype s_stunray1;\r
+extern statetype s_stunray2;\r
+extern statetype s_stunray3;\r
+extern statetype s_stunray4;\r
+extern statetype s_stunhit;\r
+extern statetype s_stunhit2;\r
+void SpawnShot(Uint16 x, Uint16 y, Direction dir);\r
+void ExplodeShot(objtype *ob);\r
+void T_Shot(objtype *ob);\r
+void R_Shot(objtype *ob);\r
+\r
+extern statetype s_door1;\r
+extern statetype s_door2;\r
+extern statetype s_door3;\r
+void DoorOpen(objtype *ob);\r
+\r
+#ifdef KEEN5\r
+extern statetype s_carddoor;\r
+void CardDoorOpen(objtype *ob);\r
+#endif\r
+\r
+/*\r
+=============================================================================\r
+\r
+ OTHER DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#if defined KEEN4\r
+#include "K4_DEF.H"\r
+#elif defined KEEN5\r
+#include "K5_DEF.H"\r
+#elif defined KEEN6\r
+#include "K6_DEF.H"\r
+#endif\r
+\r
+#endif
\ No newline at end of file