--- /dev/null
+/* Catacomb 3-D Source Code\r
+ * Copyright (C) 1993-2014 Flat Rock Software\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
+#include "ID_HEADS.H"\r
+#include <MATH.H>\r
+#include <VALUES.H>\r
+\r
+//#define PROFILE\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL CONSTANTS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define NAMESTART 180\r
+\r
+\r
+#define UNMARKGRCHUNK(chunk) (grneeded[chunk]&=~ca_levelbit)\r
+\r
+#define MOUSEINT 0x33\r
+\r
+#define EXPWALLSTART 8\r
+#define NUMEXPWALLS 7\r
+#define WALLEXP 15\r
+#define NUMFLOORS 36\r
+\r
+#define NUMFLOORS 36\r
+\r
+#define NUMLATCHPICS 100\r
+#define NUMSCALEPICS 100\r
+#define NUMSCALEWALLS 30\r
+\r
+\r
+#define FLASHCOLOR 5\r
+#define FLASHTICS 4\r
+\r
+\r
+#define NUMLEVELS 20\r
+\r
+#define VIEWX 0 // corner of view window\r
+#define VIEWY 0\r
+#define VIEWWIDTH (33*8) // size of view window\r
+#define VIEWHEIGHT (18*8)\r
+#define VIEWXH (VIEWX+VIEWWIDTH-1)\r
+#define VIEWYH (VIEWY+VIEWHEIGHT-1)\r
+\r
+#define CENTERX (VIEWX+VIEWWIDTH/2-1) // middle of view window\r
+#define CENTERY (VIEWY+VIEWHEIGHT/2-1)\r
+\r
+#define GLOBAL1 (1l<<16)\r
+#define TILEGLOBAL GLOBAL1\r
+#define TILESHIFT 16l\r
+\r
+#define MINDIST (2*GLOBAL1/5)\r
+#define FOCALLENGTH (TILEGLOBAL) // in global coordinates\r
+\r
+#define ANGLES 360 // must be divisable by 4\r
+\r
+#define MAPSIZE 64 // maps are 64*64 max\r
+#define MAXACTORS 150 // max number of tanks, etc / map\r
+\r
+#define NORTH 0\r
+#define EAST 1\r
+#define SOUTH 2\r
+#define WEST 3\r
+\r
+#define SIGN(x) ((x)>0?1:-1)\r
+#define ABS(x) ((int)(x)>0?(x):-(x))\r
+#define LABS(x) ((long)(x)>0?(x):-(x))\r
+\r
+#define MAXSCALE (VIEWWIDTH/2)\r
+\r
+\r
+#define MAXBODY 64\r
+#define MAXSHOTPOWER 56\r
+\r
+#define SCREEN1START 0\r
+#define SCREEN2START 8320\r
+\r
+#define PAGE1START 0x900\r
+#define PAGE2START 0x2000\r
+#define PAGE3START 0x3700\r
+#define FREESTART 0x4e00\r
+\r
+#define PIXRADIUS 512\r
+\r
+#define STATUSLINES (200-VIEWHEIGHT)\r
+\r
+enum bonusnumbers {B_BOLT,B_NUKE,B_POTION,B_RKEY,B_YKEY,B_GKEY,B_BKEY,B_SCROLL1,\r
+ B_SCROLL2,B_SCROLL3,B_SCROLL4,B_SCROLL5,B_SCROLL6,B_SCROLL7,B_SCROLL8,\r
+ B_GOAL,B_CHEST};\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ GLOBAL TYPES\r
+\r
+=============================================================================\r
+*/\r
+\r
+enum {BLANKCHAR=9,BOLTCHAR,NUKECHAR,POTIONCHAR,KEYCHARS,SCROLLCHARS=17,\r
+ NUMBERCHARS=25};\r
+\r
+typedef long fixed;\r
+\r
+typedef struct {int x,y;} tilept;\r
+typedef struct {fixed x,y;} globpt;\r
+\r
+typedef struct\r
+{\r
+ int x1,x2,leftclip,rightclip;// first pixel of wall (may not be visable)\r
+ unsigned height1,height2,color,walllength,side;\r
+ long planecoord;\r
+} walltype;\r
+\r
+typedef enum\r
+ {nothing,playerobj,bonusobj,orcobj,batobj,skeletonobj,trollobj,demonobj,\r
+ mageobj,pshotobj,bigpshotobj,mshotobj,inertobj,bounceobj,grelmobj\r
+ ,gateobj} classtype;\r
+\r
+typedef enum {north,east,south,west,northeast,southeast,southwest,\r
+ northwest,nodir} dirtype; // a catacombs 2 carryover\r
+\r
+\r
+typedef struct statestruct\r
+{\r
+ int shapenum;\r
+ int tictime;\r
+ void (*think) ();\r
+ struct statestruct *next;\r
+} statetype;\r
+\r
+\r
+typedef struct objstruct\r
+{\r
+ enum {no,yes} active;\r
+ int ticcount;\r
+ classtype obclass;\r
+ statetype *state;\r
+\r
+ boolean shootable;\r
+ boolean tileobject; // true if entirely inside one tile\r
+\r
+ long distance;\r
+ dirtype dir;\r
+ fixed x,y;\r
+ unsigned tilex,tiley;\r
+ int viewx;\r
+ unsigned viewheight;\r
+\r
+ int angle;\r
+ int hitpoints;\r
+ long speed;\r
+\r
+ unsigned size; // global radius for hit rect calculation\r
+ fixed xl,xh,yl,yh; // hit rectangle\r
+\r
+ int temp1,temp2;\r
+ struct objstruct *next,*prev;\r
+} objtype;\r
+\r
+\r
+typedef struct\r
+{\r
+ int difficulty;\r
+ int mapon;\r
+ int bolts,nukes,potions,keys[4],scrolls[8];\r
+ long score;\r
+ int body,shotpower;\r
+} gametype;\r
+\r
+typedef enum {ex_stillplaying,ex_died,ex_warped,ex_resetgame\r
+ ,ex_loadedgame,ex_victorious,ex_abort} exittype;\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_MAIN DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern char str[80],str2[20];\r
+extern unsigned tedlevelnum;\r
+extern boolean tedlevel;\r
+extern gametype gamestate;\r
+extern exittype playstate;\r
+\r
+\r
+void NewGame (void);\r
+boolean SaveTheGame(int file);\r
+boolean LoadTheGame(int file);\r
+void ResetGame(void);\r
+void ShutdownId (void);\r
+void InitGame (void);\r
+void Quit (char *error);\r
+void TEDDeath(void);\r
+void DemoLoop (void);\r
+void SetupScalePic (unsigned picnum);\r
+void SetupScaleWall (unsigned picnum);\r
+void SetupScaling (void);\r
+void main (void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_GAME DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern unsigned latchpics[NUMLATCHPICS];\r
+extern unsigned tileoffsets[NUMTILE16];\r
+extern unsigned textstarts[27];\r
+\r
+\r
+#define L_CHARS 0\r
+#define L_NOSHOT 1\r
+#define L_SHOTBAR 2\r
+#define L_NOBODY 3\r
+#define L_BODYBAR 4\r
+\r
+\r
+void ScanInfoPlane (void);\r
+void ScanText (void);\r
+void SetupGameLevel (void);\r
+void Victory (void);\r
+void Died (void);\r
+void NormalScreen (void);\r
+void DrawPlayScreen (void);\r
+void LoadLatchMem (void);\r
+void FizzleFade (unsigned source, unsigned dest,\r
+ unsigned width,unsigned height, boolean abortable);\r
+void FizzleOut (int showlevel);\r
+void FreeUpMemory (void);\r
+void GameLoop (void);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_PLAY DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern ControlInfo c;\r
+extern boolean running,slowturn;\r
+\r
+extern int bordertime;\r
+\r
+extern byte tilemap[MAPSIZE][MAPSIZE];\r
+extern objtype *actorat[MAPSIZE][MAPSIZE];\r
+extern byte spotvis[MAPSIZE][MAPSIZE];\r
+\r
+extern objtype objlist[MAXACTORS],*new,*obj,*player;\r
+\r
+extern unsigned farmapylookup[MAPSIZE];\r
+extern byte *nearmapylookup[MAPSIZE];\r
+extern byte update[];\r
+\r
+extern boolean godmode,singlestep;\r
+extern int extravbls;\r
+\r
+extern int mousexmove,mouseymove;\r
+extern int pointcount,pointsleft;\r
+\r
+\r
+void CenterWindow(word w,word h);\r
+void DebugMemory (void);\r
+void PicturePause (void);\r
+int DebugKeys (void);\r
+void CheckKeys (void);\r
+void InitObjList (void);\r
+void GetNewObj (boolean usedummy);\r
+void RemoveObj (objtype *gone);\r
+void PollControlls (void);\r
+void PlayLoop (void);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_STATE DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+void SpawnNewObj (unsigned x, unsigned y, statetype *state, unsigned size);\r
+void SpawnNewObjFrac (long x, long y, statetype *state, unsigned size);\r
+boolean CheckHandAttack (objtype *ob);\r
+void T_DoDamage (objtype *ob);\r
+boolean Walk (objtype *ob);\r
+void ChaseThink (objtype *obj, boolean diagonal);\r
+void MoveObj (objtype *ob, long move);\r
+boolean Chase (objtype *ob, boolean diagonal);\r
+\r
+extern dirtype opposite[9];\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_TRACE DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+int FollowTrace (fixed tracex, fixed tracey, long deltax, long deltay, int max);\r
+int BackTrace (int finish);\r
+void ForwardTrace (void);\r
+int FinishWall (void);\r
+void InsideCorner (void);\r
+void OutsideCorner (void);\r
+void FollowWalls (void);\r
+\r
+extern boolean aborttrace;\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_DRAW DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define MAXWALLS 50\r
+#define DANGERHIGH 45\r
+\r
+#define MIDWALL (MAXWALLS/2)\r
+\r
+//==========================================================================\r
+\r
+extern tilept tile,lasttile,focal,left,mid,right;\r
+\r
+extern globpt edge,view;\r
+\r
+extern unsigned screenloc[3];\r
+extern unsigned freelatch;\r
+\r
+extern int screenpage;\r
+\r
+extern boolean fizzlein;\r
+\r
+extern long lasttimecount;\r
+\r
+extern int firstangle,lastangle;\r
+\r
+extern fixed prestep;\r
+\r
+extern int traceclip,tracetop;\r
+\r
+extern fixed sintable[ANGLES+ANGLES/4],*costable;\r
+\r
+extern fixed viewx,viewy,viewsin,viewcos; // the focal point\r
+extern int viewangle;\r
+\r
+extern fixed scale,scaleglobal;\r
+extern unsigned slideofs;\r
+\r
+extern int zbuffer[VIEWXH+1];\r
+\r
+extern walltype walls[MAXWALLS],*leftwall,*rightwall;\r
+\r
+\r
+extern fixed tileglobal;\r
+extern fixed focallength;\r
+extern fixed mindist;\r
+extern int viewheight;\r
+extern fixed scale;\r
+\r
+extern int walllight1[NUMFLOORS];\r
+extern int walldark1[NUMFLOORS];\r
+extern int walllight2[NUMFLOORS];\r
+extern int walldark2[NUMFLOORS];\r
+\r
+//==========================================================================\r
+\r
+void DrawLine (int xl, int xh, int y,int color);\r
+void DrawWall (walltype *wallptr);\r
+void TraceRay (unsigned angle);\r
+fixed FixedByFrac (fixed a, fixed b);\r
+void TransformPoint (fixed gx, fixed gy, int *screenx, unsigned *screenheight);\r
+fixed TransformX (fixed gx, fixed gy);\r
+int FollowTrace (fixed tracex, fixed tracey, long deltax, long deltay, int max);\r
+void ForwardTrace (void);\r
+int FinishWall (void);\r
+int TurnClockwise (void);\r
+int TurnCounterClockwise (void);\r
+void FollowWall (void);\r
+\r
+void NewScene (void);\r
+void BuildTables (void);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_SCALE DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+\r
+#define COMPSCALECODESTART (65*6) // offset to start of code in comp scaler\r
+\r
+typedef struct\r
+{\r
+ unsigned codeofs[65];\r
+ unsigned start[65];\r
+ unsigned width[65];\r
+ byte code[];\r
+} t_compscale;\r
+\r
+typedef struct\r
+{\r
+ unsigned width;\r
+ unsigned codeofs[64];\r
+} t_compshape;\r
+\r
+\r
+extern unsigned scaleblockwidth,\r
+ scaleblockheight,\r
+ scaleblockdest;\r
+\r
+extern byte plotpix[8];\r
+extern byte bitmasks1[8][8];\r
+extern byte bitmasks2[8][8];\r
+\r
+\r
+extern t_compscale _seg *scaledirectory[MAXSCALE+1];\r
+extern t_compshape _seg *shapedirectory[NUMSCALEPICS];\r
+extern memptr walldirectory[NUMSCALEWALLS];\r
+extern unsigned shapesize[MAXSCALE+1];\r
+\r
+void DeplanePic (int picnum);\r
+void ScaleShape (int xcenter, t_compshape _seg *compshape, unsigned scale);\r
+unsigned BuildCompShape (t_compshape _seg **finalspot);\r
+\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_ASM DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern unsigned wallheight [VIEWWIDTH];\r
+extern unsigned wallwidth [VIEWWIDTH];\r
+extern unsigned wallseg [VIEWWIDTH];\r
+extern unsigned wallofs [VIEWWIDTH];\r
+extern unsigned screenbyte [VIEWWIDTH];\r
+extern unsigned screenbit [VIEWWIDTH];\r
+extern unsigned bitmasks [64];\r
+\r
+extern long wallscalecall;\r
+\r
+void ScaleWalls (void);\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_WIZ DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+#define MAXHANDHEIGHT 72\r
+\r
+extern long lastnuke;\r
+extern int handheight;\r
+extern int boltsleft;\r
+\r
+/*\r
+=============================================================================\r
+\r
+ C3_ACT1 DEFINITIONS\r
+\r
+=============================================================================\r
+*/\r
+\r
+extern statetype s_trollouch;\r
+extern statetype s_trolldie1;\r
+\r
+\r
+extern statetype s_orcpause;\r
+\r
+extern statetype s_orc1;\r
+extern statetype s_orc2;\r
+extern statetype s_orc3;\r
+extern statetype s_orc4;\r
+\r
+extern statetype s_orcattack1;\r
+extern statetype s_orcattack2;\r
+extern statetype s_orcattack3;\r
+\r
+extern statetype s_orcouch;\r
+\r
+extern statetype s_orcdie1;\r
+extern statetype s_orcdie2;\r
+extern statetype s_orcdie3;\r
+\r
+\r
+extern statetype s_demonouch;\r
+extern statetype s_demondie1;\r
+\r
+extern statetype s_mageouch;\r
+extern statetype s_magedie1;\r
+\r
+extern statetype s_grelouch;\r
+extern statetype s_greldie1;\r
+\r
+extern statetype s_batdie1;\r