1 /* Catacomb 3-D Source Code
\r
2 * Copyright (C) 1993-2014 Flat Rock Software
\r
4 * This program is free software; you can redistribute it and/or modify
\r
5 * it under the terms of the GNU General Public License as published by
\r
6 * the Free Software Foundation; either version 2 of the License, or
\r
7 * (at your option) any later version.
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License along
\r
15 * with this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
19 #include "ID_HEADS.H"
\r
26 =============================================================================
\r
30 =============================================================================
\r
33 #define NAMESTART 180
\r
36 #define UNMARKGRCHUNK(chunk) (grneeded[chunk]&=~ca_levelbit)
\r
38 #define MOUSEINT 0x33
\r
40 #define EXPWALLSTART 8
\r
41 #define NUMEXPWALLS 7
\r
43 #define NUMFLOORS 36
\r
45 #define NUMFLOORS 36
\r
47 #define NUMLATCHPICS 100
\r
48 #define NUMSCALEPICS 100
\r
49 #define NUMSCALEWALLS 30
\r
52 #define FLASHCOLOR 5
\r
56 #define NUMLEVELS 20
\r
58 #define VIEWX 0 // corner of view window
\r
60 #define VIEWWIDTH (33*8) // size of view window
\r
61 #define VIEWHEIGHT (18*8)
\r
62 #define VIEWXH (VIEWX+VIEWWIDTH-1)
\r
63 #define VIEWYH (VIEWY+VIEWHEIGHT-1)
\r
65 #define CENTERX (VIEWX+VIEWWIDTH/2-1) // middle of view window
\r
66 #define CENTERY (VIEWY+VIEWHEIGHT/2-1)
\r
68 #define GLOBAL1 (1l<<16)
\r
69 #define TILEGLOBAL GLOBAL1
\r
70 #define TILESHIFT 16l
\r
72 #define MINDIST (2*GLOBAL1/5)
\r
73 #define FOCALLENGTH (TILEGLOBAL) // in global coordinates
\r
75 #define ANGLES 360 // must be divisable by 4
\r
77 #define MAPSIZE 64 // maps are 64*64 max
\r
78 #define MAXACTORS 150 // max number of tanks, etc / map
\r
85 #define SIGN(x) ((x)>0?1:-1)
\r
86 #define ABS(x) ((int)(x)>0?(x):-(x))
\r
87 #define LABS(x) ((long)(x)>0?(x):-(x))
\r
89 #define MAXSCALE (VIEWWIDTH/2)
\r
93 #define MAXSHOTPOWER 56
\r
95 #define SCREEN1START 0
\r
96 #define SCREEN2START 8320
\r
98 #define PAGE1START 0x900
\r
99 #define PAGE2START 0x2000
\r
100 #define PAGE3START 0x3700
\r
101 #define FREESTART 0x4e00
\r
103 #define PIXRADIUS 512
\r
105 #define STATUSLINES (200-VIEWHEIGHT)
\r
107 enum bonusnumbers {B_BOLT,B_NUKE,B_POTION,B_RKEY,B_YKEY,B_GKEY,B_BKEY,B_SCROLL1,
\r
108 B_SCROLL2,B_SCROLL3,B_SCROLL4,B_SCROLL5,B_SCROLL6,B_SCROLL7,B_SCROLL8,
\r
113 =============================================================================
\r
117 =============================================================================
\r
120 enum {BLANKCHAR=9,BOLTCHAR,NUKECHAR,POTIONCHAR,KEYCHARS,SCROLLCHARS=17,
\r
123 typedef long fixed;
\r
125 typedef struct {int x,y;} tilept;
\r
126 typedef struct {fixed x,y;} globpt;
\r
130 int x1,x2,leftclip,rightclip;// first pixel of wall (may not be visable)
\r
131 unsigned height1,height2,color,walllength,side;
\r
136 {nothing,playerobj,bonusobj,orcobj,batobj,skeletonobj,trollobj,demonobj,
\r
137 mageobj,pshotobj,bigpshotobj,mshotobj,inertobj,bounceobj,grelmobj
\r
138 ,gateobj} classtype;
\r
140 typedef enum {north,east,south,west,northeast,southeast,southwest,
\r
141 northwest,nodir} dirtype; // a catacombs 2 carryover
\r
144 typedef struct statestruct
\r
149 struct statestruct *next;
\r
153 typedef struct objstruct
\r
155 enum {no,yes} active;
\r
161 boolean tileobject; // true if entirely inside one tile
\r
166 unsigned tilex,tiley;
\r
168 unsigned viewheight;
\r
174 unsigned size; // global radius for hit rect calculation
\r
175 fixed xl,xh,yl,yh; // hit rectangle
\r
178 struct objstruct *next,*prev;
\r
186 int bolts,nukes,potions,keys[4],scrolls[8];
\r
188 int body,shotpower;
\r
191 typedef enum {ex_stillplaying,ex_died,ex_warped,ex_resetgame
\r
192 ,ex_loadedgame,ex_victorious,ex_abort} exittype;
\r
196 =============================================================================
\r
198 C3_MAIN DEFINITIONS
\r
200 =============================================================================
\r
203 extern char str[80],str2[20];
\r
204 extern unsigned tedlevelnum;
\r
205 extern boolean tedlevel;
\r
206 extern gametype gamestate;
\r
207 extern exittype playstate;
\r
210 void NewGame (void);
\r
211 boolean SaveTheGame(int file);
\r
212 boolean LoadTheGame(int file);
\r
213 void ResetGame(void);
\r
214 void ShutdownId (void);
\r
215 void InitGame (void);
\r
216 void Quit (char *error);
\r
217 void TEDDeath(void);
\r
218 void DemoLoop (void);
\r
219 void SetupScalePic (unsigned picnum);
\r
220 void SetupScaleWall (unsigned picnum);
\r
221 void SetupScaling (void);
\r
225 =============================================================================
\r
227 C3_GAME DEFINITIONS
\r
229 =============================================================================
\r
232 extern unsigned latchpics[NUMLATCHPICS];
\r
233 extern unsigned tileoffsets[NUMTILE16];
\r
234 extern unsigned textstarts[27];
\r
239 #define L_SHOTBAR 2
\r
241 #define L_BODYBAR 4
\r
244 void ScanInfoPlane (void);
\r
245 void ScanText (void);
\r
246 void SetupGameLevel (void);
\r
247 void Victory (void);
\r
249 void NormalScreen (void);
\r
250 void DrawPlayScreen (void);
\r
251 void LoadLatchMem (void);
\r
252 void FizzleFade (unsigned source, unsigned dest,
\r
253 unsigned width,unsigned height, boolean abortable);
\r
254 void FizzleOut (int showlevel);
\r
255 void FreeUpMemory (void);
\r
256 void GameLoop (void);
\r
260 =============================================================================
\r
262 C3_PLAY DEFINITIONS
\r
264 =============================================================================
\r
267 extern ControlInfo c;
\r
268 extern boolean running,slowturn;
\r
270 extern int bordertime;
\r
272 extern byte tilemap[MAPSIZE][MAPSIZE];
\r
273 extern objtype *actorat[MAPSIZE][MAPSIZE];
\r
274 extern byte spotvis[MAPSIZE][MAPSIZE];
\r
276 extern objtype objlist[MAXACTORS],*new,*obj,*player;
\r
278 extern unsigned farmapylookup[MAPSIZE];
\r
279 extern byte *nearmapylookup[MAPSIZE];
\r
280 extern byte update[];
\r
282 extern boolean godmode,singlestep;
\r
283 extern int extravbls;
\r
285 extern int mousexmove,mouseymove;
\r
286 extern int pointcount,pointsleft;
\r
289 void CenterWindow(word w,word h);
\r
290 void DebugMemory (void);
\r
291 void PicturePause (void);
\r
292 int DebugKeys (void);
\r
293 void CheckKeys (void);
\r
294 void InitObjList (void);
\r
295 void GetNewObj (boolean usedummy);
\r
296 void RemoveObj (objtype *gone);
\r
297 void PollControlls (void);
\r
298 void PlayLoop (void);
\r
302 =============================================================================
\r
304 C3_STATE DEFINITIONS
\r
306 =============================================================================
\r
309 void SpawnNewObj (unsigned x, unsigned y, statetype *state, unsigned size);
\r
310 void SpawnNewObjFrac (long x, long y, statetype *state, unsigned size);
\r
311 boolean CheckHandAttack (objtype *ob);
\r
312 void T_DoDamage (objtype *ob);
\r
313 boolean Walk (objtype *ob);
\r
314 void ChaseThink (objtype *obj, boolean diagonal);
\r
315 void MoveObj (objtype *ob, long move);
\r
316 boolean Chase (objtype *ob, boolean diagonal);
\r
318 extern dirtype opposite[9];
\r
321 =============================================================================
\r
323 C3_TRACE DEFINITIONS
\r
325 =============================================================================
\r
328 int FollowTrace (fixed tracex, fixed tracey, long deltax, long deltay, int max);
\r
329 int BackTrace (int finish);
\r
330 void ForwardTrace (void);
\r
331 int FinishWall (void);
\r
332 void InsideCorner (void);
\r
333 void OutsideCorner (void);
\r
334 void FollowWalls (void);
\r
336 extern boolean aborttrace;
\r
339 =============================================================================
\r
341 C3_DRAW DEFINITIONS
\r
343 =============================================================================
\r
346 #define MAXWALLS 50
\r
347 #define DANGERHIGH 45
\r
349 #define MIDWALL (MAXWALLS/2)
\r
351 //==========================================================================
\r
353 extern tilept tile,lasttile,focal,left,mid,right;
\r
355 extern globpt edge,view;
\r
357 extern unsigned screenloc[3];
\r
358 extern unsigned freelatch;
\r
360 extern int screenpage;
\r
362 extern boolean fizzlein;
\r
364 extern long lasttimecount;
\r
366 extern int firstangle,lastangle;
\r
368 extern fixed prestep;
\r
370 extern int traceclip,tracetop;
\r
372 extern fixed sintable[ANGLES+ANGLES/4],*costable;
\r
374 extern fixed viewx,viewy,viewsin,viewcos; // the focal point
\r
375 extern int viewangle;
\r
377 extern fixed scale,scaleglobal;
\r
378 extern unsigned slideofs;
\r
380 extern int zbuffer[VIEWXH+1];
\r
382 extern walltype walls[MAXWALLS],*leftwall,*rightwall;
\r
385 extern fixed tileglobal;
\r
386 extern fixed focallength;
\r
387 extern fixed mindist;
\r
388 extern int viewheight;
\r
389 extern fixed scale;
\r
391 extern int walllight1[NUMFLOORS];
\r
392 extern int walldark1[NUMFLOORS];
\r
393 extern int walllight2[NUMFLOORS];
\r
394 extern int walldark2[NUMFLOORS];
\r
396 //==========================================================================
\r
398 void DrawLine (int xl, int xh, int y,int color);
\r
399 void DrawWall (walltype *wallptr);
\r
400 void TraceRay (unsigned angle);
\r
401 fixed FixedByFrac (fixed a, fixed b);
\r
402 void TransformPoint (fixed gx, fixed gy, int *screenx, unsigned *screenheight);
\r
403 fixed TransformX (fixed gx, fixed gy);
\r
404 int FollowTrace (fixed tracex, fixed tracey, long deltax, long deltay, int max);
\r
405 void ForwardTrace (void);
\r
406 int FinishWall (void);
\r
407 int TurnClockwise (void);
\r
408 int TurnCounterClockwise (void);
\r
409 void FollowWall (void);
\r
411 void NewScene (void);
\r
412 void BuildTables (void);
\r
416 =============================================================================
\r
418 C3_SCALE DEFINITIONS
\r
420 =============================================================================
\r
424 #define COMPSCALECODESTART (65*6) // offset to start of code in comp scaler
\r
428 unsigned codeofs[65];
\r
429 unsigned start[65];
\r
430 unsigned width[65];
\r
437 unsigned codeofs[64];
\r
441 extern unsigned scaleblockwidth,
\r
445 extern byte plotpix[8];
\r
446 extern byte bitmasks1[8][8];
\r
447 extern byte bitmasks2[8][8];
\r
450 extern t_compscale _seg *scaledirectory[MAXSCALE+1];
\r
451 extern t_compshape _seg *shapedirectory[NUMSCALEPICS];
\r
452 extern memptr walldirectory[NUMSCALEWALLS];
\r
453 extern unsigned shapesize[MAXSCALE+1];
\r
455 void DeplanePic (int picnum);
\r
456 void ScaleShape (int xcenter, t_compshape _seg *compshape, unsigned scale);
\r
457 unsigned BuildCompShape (t_compshape _seg **finalspot);
\r
461 =============================================================================
\r
465 =============================================================================
\r
468 extern unsigned wallheight [VIEWWIDTH];
\r
469 extern unsigned wallwidth [VIEWWIDTH];
\r
470 extern unsigned wallseg [VIEWWIDTH];
\r
471 extern unsigned wallofs [VIEWWIDTH];
\r
472 extern unsigned screenbyte [VIEWWIDTH];
\r
473 extern unsigned screenbit [VIEWWIDTH];
\r
474 extern unsigned bitmasks [64];
\r
476 extern long wallscalecall;
\r
478 void ScaleWalls (void);
\r
481 =============================================================================
\r
485 =============================================================================
\r
488 #define MAXHANDHEIGHT 72
\r
490 extern long lastnuke;
\r
491 extern int handheight;
\r
492 extern int boltsleft;
\r
495 =============================================================================
\r
497 C3_ACT1 DEFINITIONS
\r
499 =============================================================================
\r
502 extern statetype s_trollouch;
\r
503 extern statetype s_trolldie1;
\r
506 extern statetype s_orcpause;
\r
508 extern statetype s_orc1;
\r
509 extern statetype s_orc2;
\r
510 extern statetype s_orc3;
\r
511 extern statetype s_orc4;
\r
513 extern statetype s_orcattack1;
\r
514 extern statetype s_orcattack2;
\r
515 extern statetype s_orcattack3;
\r
517 extern statetype s_orcouch;
\r
519 extern statetype s_orcdie1;
\r
520 extern statetype s_orcdie2;
\r
521 extern statetype s_orcdie3;
\r
524 extern statetype s_demonouch;
\r
525 extern statetype s_demondie1;
\r
527 extern statetype s_mageouch;
\r
528 extern statetype s_magedie1;
\r
530 extern statetype s_grelouch;
\r
531 extern statetype s_greldie1;
\r
533 extern statetype s_batdie1;
\r