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
25 =============================================================================
\r
29 An Id Software production
\r
33 =============================================================================
\r
37 =============================================================================
\r
41 =============================================================================
\r
46 =============================================================================
\r
50 =============================================================================
\r
53 memptr scalesegs[NUMPICS];
\r
54 char str[80],str2[20];
\r
55 unsigned tedlevelnum;
\r
61 =============================================================================
\r
65 =============================================================================
\r
70 //===========================================================================
\r
73 #define MyInterrupt 0x60
\r
74 void interrupt (*intaddr)();
\r
75 void interrupt (*oldintaddr)();
\r
76 char *JHParmStrings[] = {"no386",nil};
\r
81 extern void far jabhack2(void);
\r
82 extern int far CheckIs386(void);
\r
86 oldintaddr = getvect(MyInterrupt);
\r
88 for (i = 1;i < _argc;i++)
\r
89 if (US_CheckParm(_argv[i],JHParmStrings) == 0)
\r
95 setvect(MyInterrupt,intaddr);
\r
102 setvect(MyInterrupt,oldintaddr);
\r
106 //===========================================================================
\r
109 =====================
\r
113 = Set up new game to start from the beginning
\r
115 =====================
\r
118 void NewGame (void)
\r
120 memset (&gamestate,0,sizeof(gamestate));
\r
121 gamestate.mapon = 0;
\r
122 gamestate.body = MAXBODY;
\r
125 //===========================================================================
\r
127 #define RLETAG 0xABCD
\r
137 boolean SaveTheGame(int file)
\r
139 word i,compressed,expanded;
\r
143 if (!CA_FarWrite(file,(void far *)&gamestate,sizeof(gamestate)))
\r
146 expanded = mapwidth * mapheight * 2;
\r
147 MM_GetPtr (&bigbuffer,expanded);
\r
149 for (i = 0;i < 3;i+=2) // Write planes 0 and 2
\r
152 // leave a word at start of compressed data for compressed length
\r
154 compressed = (unsigned)CA_RLEWCompress ((unsigned huge *)mapsegs[i]
\r
155 ,expanded,((unsigned huge *)bigbuffer)+1,RLETAG);
\r
157 *(unsigned huge *)bigbuffer = compressed;
\r
159 if (!CA_FarWrite(file,(void far *)bigbuffer,compressed+2) )
\r
161 MM_FreePtr (&bigbuffer);
\r
166 for (o = player;o;o = o->next)
\r
167 if (!CA_FarWrite(file,(void far *)o,sizeof(objtype)))
\r
169 MM_FreePtr (&bigbuffer);
\r
173 MM_FreePtr (&bigbuffer);
\r
178 //===========================================================================
\r
188 boolean LoadTheGame(int file)
\r
191 objtype *obj,*prev,*next,*followed;
\r
192 unsigned compressed,expanded;
\r
193 unsigned far *map,tile;
\r
196 if (!CA_FarRead(file,(void far *)&gamestate,sizeof(gamestate)))
\r
199 SetupGameLevel (); // load in and cache the base old level
\r
201 expanded = mapwidth * mapheight * 2;
\r
202 MM_GetPtr (&bigbuffer,expanded);
\r
204 for (i = 0;i < 3;i+=2) // Read planes 0 and 2
\r
206 if (!CA_FarRead(file,(void far *)&compressed,sizeof(compressed)) )
\r
208 MM_FreePtr (&bigbuffer);
\r
212 if (!CA_FarRead(file,(void far *)bigbuffer,compressed) )
\r
214 MM_FreePtr (&bigbuffer);
\r
218 CA_RLEWexpand ((unsigned huge *)bigbuffer,
\r
219 (unsigned huge *)mapsegs[i],expanded,RLETAG);
\r
222 MM_FreePtr (&bigbuffer);
\r
224 // copy the wall data to a data segment array again, to handle doors and
\r
225 // bomb walls that are allready opened
\r
227 memset (tilemap,0,sizeof(tilemap));
\r
228 memset (actorat,0,sizeof(actorat));
\r
230 for (y=0;y<mapheight;y++)
\r
231 for (x=0;x<mapwidth;x++)
\r
234 if (tile<NUMFLOORS)
\r
236 tilemap[x][y] = tile;
\r
238 (unsigned)actorat[x][y] = tile;
\r
243 // Read the object list back in - assumes at least one object in list
\r
251 if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))
\r
253 followed = new->next;
\r
256 actorat[new->tilex][new->tiley] = new; // drop a new marker
\r
267 //===========================================================================
\r
277 void ResetGame(void)
\r
288 //===========================================================================
\r
292 ==========================
\r
296 = Shuts down all ID_?? managers
\r
298 ==========================
\r
301 void ShutdownId (void)
\r
314 //===========================================================================
\r
317 ==========================
\r
321 = Load a few things right away
\r
323 ==========================
\r
326 void InitGame (void)
\r
328 unsigned segstart,seglength;
\r
330 unsigned *blockstart;
\r
332 // US_TextScreen();
\r
342 // US_UpdateTextScreen();
\r
347 US_SetLoadSaveHooks(LoadTheGame,SaveTheGame,ResetGame);
\r
350 // load in and lock down some basic chunks
\r
355 CA_MarkGrChunk(STARTFONT);
\r
356 CA_MarkGrChunk(STARTTILE8);
\r
357 CA_MarkGrChunk(STARTTILE8M);
\r
358 CA_MarkGrChunk(HAND1PICM);
\r
359 CA_MarkGrChunk(HAND2PICM);
\r
360 CA_MarkGrChunk(ENTERPLAQUEPIC);
\r
362 CA_CacheMarks (NULL);
\r
364 MM_SetLock (&grsegs[STARTFONT],true);
\r
365 MM_SetLock (&grsegs[STARTTILE8],true);
\r
366 MM_SetLock (&grsegs[STARTTILE8M],true);
\r
367 MM_SetLock (&grsegs[HAND1PICM],true);
\r
368 MM_SetLock (&grsegs[HAND2PICM],true);
\r
369 MM_SetLock (&grsegs[ENTERPLAQUEPIC],true);
\r
375 // build some tables
\r
377 for (i=0;i<MAPSIZE;i++)
\r
378 nearmapylookup[i] = &tilemap[0][0]+MAPSIZE*i;
\r
380 for (i=0;i<PORTTILESHIGH;i++)
\r
381 uwidthtable[i] = UPDATEWIDE*i;
\r
383 blockstart = &blockstarts[0];
\r
384 for (y=0;y<UPDATEHIGH;y++)
\r
385 for (x=0;x<UPDATEWIDE;x++)
\r
386 *blockstart++ = SCREENWIDTH*16*y+x*TILEWIDTH;
\r
388 BuildTables (); // 3-d tables
\r
393 // US_FinishTextScreen();
\r
397 // reclaim the memory from the linked in text screen
\r
399 segstart = FP_SEG(&introscn);
\r
400 seglength = 4000/16;
\r
401 if (FP_OFF(&introscn))
\r
407 MML_UseSpace (segstart,seglength);
\r
409 VW_SetScreenMode (GRMODE);
\r
410 VW_ColorBorder (3);
\r
411 VW_ClearVideo (BLACK);
\r
414 // initialize variables
\r
416 updateptr = &update[0];
\r
417 *(unsigned *)(updateptr + UPDATEWIDE*PORTTILESHIGH) = UPDATETERMINATE;
\r
420 VW_SetLineWidth(SCREENWIDTH);
\r
423 //===========================================================================
\r
425 void clrscr (void); // can't include CONIO.H because of name conflicts...
\r
428 ==========================
\r
432 ==========================
\r
435 void Quit (char *error)
\r
437 unsigned finscreen;
\r
443 CA_CacheGrChunk (PIRACY);
\r
444 finscreen = (unsigned)grsegs[PIRACY];
\r
449 if (error && *error)
\r
458 movedata (finscreen,0,0xb800,0,4000);
\r
467 //===========================================================================
\r
477 void TEDDeath(void)
\r
480 execlp("TED5.EXE","TED5.EXE","/LAUNCH",NULL);
\r
483 //===========================================================================
\r
486 =====================
\r
490 =====================
\r
493 static char *ParmStrings[] = {"easy","normal","hard",""};
\r
495 void DemoLoop (void)
\r
500 // check for launch from ted
\r
505 gamestate.mapon = tedlevelnum;
\r
506 restartgame = gd_Normal;
\r
507 for (i = 1;i < _argc;i++)
\r
509 if ( (level = US_CheckParm(_argv[i],ParmStrings)) == -1)
\r
512 restartgame = gd_Easy+level;
\r
523 displayofs = bufferofs = 0;
\r
524 VW_Bar (0,0,320,200,0);
\r
528 CA_CacheGrChunk (TITLEPIC);
\r
529 bufferofs = SCREEN2START;
\r
530 displayofs = SCREEN1START;
\r
531 VWB_DrawPic (0,0,TITLEPIC);
\r
532 MM_SetPurge (&grsegs[TITLEPIC],3);
\r
533 UNMARKGRCHUNK(TITLEPIC);
\r
534 FizzleFade (bufferofs,displayofs,320,200,true);
\r
536 if (!IN_UserInput(TickBase*3,false))
\r
538 CA_CacheGrChunk (CREDITSPIC);
\r
539 VWB_DrawPic (0,0,CREDITSPIC);
\r
540 MM_SetPurge (&grsegs[CREDITSPIC],3);
\r
541 UNMARKGRCHUNK(CREDITSPIC);
\r
542 FizzleFade (bufferofs,displayofs,320,200,true);
\r
546 if (!IN_UserInput(TickBase*3,false))
\r
550 FizzleFade (bufferofs,displayofs,320,200,true);
\r
551 IN_UserInput(TickBase*3,false);
\r
554 if (IN_IsUserInput())
\r
556 US_ControlPanel ();
\r
558 if (restartgame || loadedgame)
\r
568 //===========================================================================
\r
571 ==========================
\r
575 ==========================
\r
578 void SetupScalePic (unsigned picnum)
\r
582 scnum = picnum-FIRSTSCALEPIC;
\r
584 if (shapedirectory[scnum])
\r
586 MM_SetPurge (&(memptr)shapedirectory[scnum],0);
\r
587 return; // allready in memory
\r
590 CA_CacheGrChunk (picnum);
\r
591 DeplanePic (picnum);
\r
592 shapesize[scnum] = BuildCompShape (&shapedirectory[scnum]);
\r
593 grneeded[picnum]&= ~ca_levelbit;
\r
594 MM_FreePtr (&grsegs[picnum]);
\r
597 //===========================================================================
\r
600 ==========================
\r
604 ==========================
\r
607 void SetupScaleWall (unsigned picnum)
\r
613 scnum = picnum-FIRSTWALLPIC;
\r
615 if (walldirectory[scnum])
\r
617 MM_SetPurge (&walldirectory[scnum],0);
\r
618 return; // allready in memory
\r
621 CA_CacheGrChunk (picnum);
\r
622 DeplanePic (picnum);
\r
623 MM_GetPtr(&walldirectory[scnum],64*64);
\r
624 dest = (byte far *)walldirectory[scnum];
\r
627 *dest++ = spotvis[y][x];
\r
628 grneeded[picnum]&= ~ca_levelbit;
\r
629 MM_FreePtr (&grsegs[picnum]);
\r
632 //===========================================================================
\r
635 ==========================
\r
639 ==========================
\r
642 void SetupScaling (void)
\r
648 // build the compiled scalers
\r
650 for (i=1;i<=VIEWWIDTH/2;i++)
\r
651 BuildCompScale (i*2,&scaledirectory[i]);
\r
654 //===========================================================================
\r
658 void RF_FixOfs (void)
\r
662 void HelpScreens (void)
\r
675 #define MINMEMORY 335000l
\r
677 void CheckMemory(void)
\r
679 unsigned finscreen;
\r
681 if (mminfo.nearheap+mminfo.farheap+mminfo.EMSmem+mminfo.XMSmem
\r
685 CA_CacheGrChunk (OUTOFMEM);
\r
686 finscreen = (unsigned)grsegs[OUTOFMEM];
\r
688 movedata (finscreen,7,0xb800,0,4000);
\r
693 //===========================================================================
\r
697 ==========================
\r
701 ==========================
\r
708 if (stricmp(_argv[1], "/VER") == 0)
\r
710 printf("Catacomb 3-D version 1.22 (Rev 1)\n");
\r
711 printf("Copyright 1991-93 Softdisk Publishing\n");
\r
712 printf("Developed for use with 100%% IBM compatibles\n");
\r
713 printf("that have 640K memory and DOS version 3.3 or later\n");
\r
714 printf("and EGA graphics or better.\n");
\r
718 if (stricmp(_argv[1], "/?") == 0)
\r
720 printf("Catacomb 3-D version 1.22\n");
\r
721 printf("Copyright 1991-93 Softdisk Publishing\n\n");
\r
722 printf("Syntax:\n");
\r
723 printf("CAT3D [/<switch>]\n\n");
\r
724 printf("Switch What it does\n");
\r
725 printf("/? This Information\n");
\r
726 printf("/VER Display Program Version Information\n");
\r
727 printf("/COMP Fix problems with SVGA screens\n");
\r
728 printf("/NOAL No AdLib or SoundBlaster detection\n");
\r
729 printf("/NOJOYS Tell program to ignore joystick\n");
\r
730 printf("/NOMOUSE Tell program to ignore mouse\n");
\r
731 printf("/HIDDENCARD Overrides video detection\n\n");
\r
732 printf("Each switch must include a '/' and multiple switches\n");
\r
733 printf("must be seperated by at least one space.\n\n");
\r
755 Quit("Demo loop exited???");
\r