+++ /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