1 /* Catacomb Armageddon 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
33 =============================================================================
\r
37 =============================================================================
\r
42 =============================================================================
\r
46 =============================================================================
\r
49 PresenterInfo MainHelpText;
\r
51 GameDiff restartgame;
\r
52 boolean loadedgame,abortgame,ingame;
\r
55 memptr scalesegs[NUMPICS];
\r
56 char str[80],str2[20];
\r
57 unsigned tedlevelnum;
\r
64 //extern unsigned scolor,gcolor; //NPM
\r
69 boolean LoadShapes = true;
\r
70 boolean EASYMODEON = false;
\r
72 void DisplayIntroText(void);
\r
75 =============================================================================
\r
79 =============================================================================
\r
84 //===========================================================================
\r
88 #define MyInterrupt 0x60
\r
89 void interrupt (*intaddr)();
\r
90 void interrupt (*oldintaddr)();
\r
91 char *JHParmStrings[] = {"no386",nil};
\r
96 extern void far jabhack2(void);
\r
97 extern int far CheckIs386(void);
\r
101 oldintaddr = getvect(MyInterrupt);
\r
103 for (i = 1;i < _argc;i++)
\r
104 if (US_CheckParm(_argv[i],JHParmStrings) == 0)
\r
110 setvect(MyInterrupt,intaddr);
\r
117 setvect(MyInterrupt,oldintaddr);
\r
122 //===========================================================================
\r
125 =====================
\r
129 = Set up new game to start from the beginning
\r
131 =====================
\r
134 void NewGame (void)
\r
138 memset (&gamestate,0,sizeof(gamestate));
\r
139 gamestate.mapon = starting_level;
\r
140 gamestate.body = MAXBODY;
\r
143 BGFLAGS = BGF_NOT_LIGHTNING;
\r
146 boltsleft = bolttimer = 0;
\r
148 // memset (gamestate.levels,-1,sizeof(gamestate.levels));
\r
151 //===========================================================================
\r
153 #define RLETAG 0xABCD
\r
163 boolean SaveTheGame(int file)
\r
165 word i,compressed,expanded;
\r
169 // save the sky and ground colors
\r
170 if (!CA_FarWrite(file,(void far *)&skycolor,sizeof(skycolor)))
\r
172 if (!CA_FarWrite(file,(void far *)&groundcolor,sizeof(groundcolor)))
\r
175 if (!CA_FarWrite(file,(void far *)&FreezeTime,sizeof(FreezeTime)))
\r
178 if (!CA_FarWrite(file,(void far *)&gamestate,sizeof(gamestate)))
\r
181 if (!CA_FarWrite(file,(void far *)&EASYMODEON,sizeof(EASYMODEON)))
\r
184 expanded = mapwidth * mapheight * 2;
\r
185 MM_GetPtr (&bigbuffer,expanded);
\r
187 for (i = 0;i < 3;i+=2) // Write planes 0 and 2
\r
190 // leave a word at start of compressed data for compressed length
\r
192 compressed = (unsigned)CA_RLEWCompress ((unsigned huge *)mapsegs[i]
\r
193 ,expanded,((unsigned huge *)bigbuffer)+1,RLETAG);
\r
195 *(unsigned huge *)bigbuffer = compressed;
\r
197 if (!CA_FarWrite(file,(void far *)bigbuffer,compressed+2) )
\r
199 MM_FreePtr (&bigbuffer);
\r
204 for (o = player;o;o = o->next)
\r
205 if (!CA_FarWrite(file,(void far *)o,sizeof(objtype)))
\r
207 MM_FreePtr (&bigbuffer);
\r
211 MM_FreePtr (&bigbuffer);
\r
216 //===========================================================================
\r
227 boolean LoadTheGame(int file)
\r
230 objtype *obj,*prev,*next,*followed;
\r
231 unsigned compressed,expanded;
\r
232 unsigned far *map,tile;
\r
238 playstate = ex_loadedgame;
\r
239 // load the sky and ground colors
\r
240 if (!CA_FarRead(file,(void far *)&skycolor,sizeof(skycolor)))
\r
242 if (!CA_FarRead(file,(void far *)&groundcolor,sizeof(groundcolor)))
\r
245 if (!CA_FarRead(file,(void far *)&FreezeTime,sizeof(FreezeTime)))
\r
248 if (!CA_FarRead(file,(void far *)&gamestate,sizeof(gamestate)))
\r
251 if (!CA_FarRead(file,(void far *)&EASYMODEON,sizeof(EASYMODEON)))
\r
254 SetupGameLevel (); // load in and cache the base old level
\r
256 if (!FindFile(Filename,"SAVE GAME",-1))
\r
257 Quit("Error: Can't find saved game file!");
\r
259 expanded = mapwidth * mapheight * 2;
\r
260 MM_GetPtr (&bigbuffer,expanded);
\r
262 for (i = 0;i < 3;i+=2) // Read planes 0 and 2
\r
264 if (!CA_FarRead(file,(void far *)&compressed,sizeof(compressed)) )
\r
266 MM_FreePtr (&bigbuffer);
\r
270 if (!CA_FarRead(file,(void far *)bigbuffer,compressed) )
\r
272 MM_FreePtr (&bigbuffer);
\r
276 CA_RLEWexpand ((unsigned huge *)bigbuffer,
\r
277 (unsigned huge *)mapsegs[i],expanded,RLETAG);
\r
280 MM_FreePtr (&bigbuffer);
\r
282 // copy the wall data to a data segment array again, to handle doors and
\r
283 // bomb walls that are allready opened
\r
285 memset (tilemap,0,sizeof(tilemap));
\r
286 memset (actorat,0,sizeof(actorat));
\r
288 for (y=0;y<mapheight;y++)
\r
289 for (x=0;x<mapwidth;x++)
\r
292 if (tile<NUMFLOORS)
\r
294 if (tile != INVISIBLEWALL)
\r
295 tilemap[x][y] = tile;
\r
297 (unsigned)actorat[x][y] = tile;
\r
302 // Read the object list back in - assumes at least one object in list
\r
310 if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))
\r
312 followed = new->next;
\r
315 actorat[new->tilex][new->tiley] = new; // drop a new marker
\r
326 //===========================================================================
\r
336 void ResetGame(void)
\r
347 //===========================================================================
\r
351 ==========================
\r
355 = Shuts down all ID_?? managers
\r
357 ==========================
\r
360 void ShutdownId (void)
\r
373 //===========================================================================
\r
376 ==========================
\r
380 = Load a few things right away
\r
382 ==========================
\r
385 void InitGame (void)
\r
387 unsigned segstart,seglength;
\r
389 unsigned *blockstart;
\r
391 // US_TextScreen();
\r
401 // US_UpdateTextScreen();
\r
406 US_SetLoadSaveHooks(LoadTheGame,SaveTheGame,ResetGame);
\r
410 // load in and lock down some basic chunks
\r
415 CA_MarkGrChunk(STARTFONT);
\r
416 CA_MarkGrChunk(STARTTILE8);
\r
417 CA_MarkGrChunk(STARTTILE8M);
\r
418 CA_MarkGrChunk(HAND1PICM);
\r
420 CA_MarkGrChunk(NORTHICONSPR);
\r
421 CA_CacheMarks (NULL);
\r
423 MM_SetLock (&grsegs[STARTFONT],true);
\r
424 MM_SetLock (&grsegs[STARTTILE8],true);
\r
425 MM_SetLock (&grsegs[STARTTILE8M],true);
\r
426 MM_SetLock (&grsegs[HAND1PICM],true);
\r
432 // build some tables
\r
434 for (i=0;i<MAPSIZE;i++)
\r
435 nearmapylookup[i] = &tilemap[0][0]+MAPSIZE*i;
\r
437 for (i=0;i<PORTTILESHIGH;i++)
\r
438 uwidthtable[i] = UPDATEWIDE*i;
\r
440 blockstart = &blockstarts[0];
\r
441 for (y=0;y<UPDATEHIGH;y++)
\r
442 for (x=0;x<UPDATEWIDE;x++)
\r
443 *blockstart++ = SCREENWIDTH*16*y+x*TILEWIDTH;
\r
445 BuildTables (); // 3-d tables
\r
450 // US_FinishTextScreen();
\r
455 // reclaim the memory from the linked in text screen
\r
457 segstart = FP_SEG(&introscn);
\r
458 seglength = 4000/16;
\r
459 if (FP_OFF(&introscn))
\r
464 MML_UseSpace (segstart,seglength);
\r
467 VW_SetScreenMode (GRMODE);
\r
468 ge_textmode = false;
\r
469 // VW_ColorBorder (3);
\r
470 VW_ClearVideo (BLACK);
\r
473 // initialize variables
\r
475 updateptr = &update[0];
\r
476 *(unsigned *)(updateptr + UPDATEWIDE*PORTTILESHIGH) = UPDATETERMINATE;
\r
479 VW_SetLineWidth(SCREENWIDTH);
\r
482 //===========================================================================
\r
484 void clrscr (void); // can't include CONIO.H because of name conflicts...
\r
487 ==========================
\r
491 ==========================
\r
494 void Quit (char *error, ...)
\r
497 unsigned finscreen;
\r
501 va_start(ap,error);
\r
507 CA_CacheGrChunk (PIRACY);
\r
508 finscreen = (unsigned)grsegs[PIRACY];
\r
514 if (error && *error)
\r
523 movedata (finscreen,0,0xb800,0,4000);
\r
534 _argv[1] = "LAST.SHL";
\r
535 _argv[2] = "ENDSCN.SCN";
\r
537 if (execv("LOADSCN.EXE", _argv) == -1)
\r
540 puts("Couldn't find executable LOADSCN.EXE.\n");
\r
549 //===========================================================================
\r
559 void TEDDeath(void)
\r
562 execlp("TED5.EXE","TED5.EXE","/LAUNCH",NULL);
\r
565 //===========================================================================
\r
568 ====================
\r
570 = DisplayDepartment
\r
572 ====================
\r
574 void DisplayDepartment(char *text)
\r
583 VW_Bar(WindowX,PrintY+1,WindowW,7,7);
\r
586 US_CPrintLine (text);
\r
593 =====================
\r
597 =====================
\r
600 void DemoLoop (void)
\r
603 /////////////////////////////////////////////////////////////////////////////
\r
605 /////////////////////////////////////////////////////////////////////////////
\r
607 displayofs = bufferofs = 0;
\r
608 VW_Bar (0,0,320,200,0);
\r
612 // Read in all the graphic images needed for the title sequence
\r
615 IN_ReadControl(0,&control);
\r
619 if (stricmp(_argv[2], "1") == 0)
\r
622 EASYMODEON = false;
\r
626 if (stricmp(_argv[3], "1") == 0)
\r
629 bufferofs = displayofs = 0;
\r
630 VW_Bar(0,0,320,200,0);
\r
634 playstate = ex_loadedgame;
\r
635 Keyboard[sc_Enter] = true;
\r
636 VW_Bar(0,0,320,200,0);
\r
639 VW_Bar(0,0,320,200,0);
\r
645 restartgame = gd_Normal;
\r
651 //-------------------------------------------------------------------------
\r
652 // DisplayIntroText()
\r
653 //-------------------------------------------------------------------------
\r
654 void DisplayIntroText()
\r
658 #ifdef TEXT_PRESENTER
\r
659 char *toptext = "You stand before the gate leading into the Towne "
\r
660 "of Morbidity.... "
\r
663 char *bottomtext = "Enter now boldly to defeat the evil Nemesis "
\r
664 "deep inside the catacombs."
\r
669 char oldfontcolor=fontcolor;
\r
674 #ifdef TEXT_PRESENTER
\r
680 pi.script[0] = (char far *)toptext;
\r
685 pi.script[0] = (char far *)bottomtext;
\r
693 US_Print (" You stand before the gate leading into\n");
\r
694 US_Print (" the Towne of Morbidity...\n");
\r
697 US_Print (" Enter now boldly to defeat the evil Nemesis\n");
\r
698 US_Print (" deep inside the catacombs.\n");
\r
702 fontcolor = oldfontcolor;
\r
706 boolean ChooseGameLevel()
\r
708 char choices[] = {sc_Escape,sc_E,sc_N,sc_H,0},ch;
\r
710 CenterWindow(20,10);
\r
712 US_Print("\n Choose difficulty level:\n");
\r
713 US_Print(" (E)asy\n");
\r
714 US_Print(" (N)ormal\n");
\r
715 US_Print(" (H)ard\n");
\r
716 US_Print("\n (ESC)ape aborts\n");
\r
718 // VW_UpdateScreen();
\r
719 if ((ch=GetKeyChoice(choices)) == sc_Escape)
\r
721 while (Keyboard[sc_Escape]);
\r
727 restartgame = gd_Easy;
\r
730 restartgame = gd_Normal;
\r
732 restartgame = gd_Hard;
\r
739 //===========================================================================
\r
742 ==========================
\r
746 ==========================
\r
749 void SetupScalePic (unsigned picnum)
\r
756 scnum = picnum-FIRSTSCALEPIC;
\r
758 if (shapedirectory[scnum])
\r
760 MM_SetPurge (&(memptr)shapedirectory[scnum],0);
\r
761 return; // allready in memory
\r
764 CA_CacheGrChunk (picnum);
\r
765 DeplanePic (picnum);
\r
766 shapesize[scnum] = BuildCompShape (&shapedirectory[scnum]);
\r
767 grneeded[picnum]&= ~ca_levelbit;
\r
768 MM_FreePtr (&grsegs[picnum]);
\r
771 //===========================================================================
\r
774 ==========================
\r
778 ==========================
\r
781 void SetupScaleWall (unsigned picnum)
\r
790 scnum = picnum-FIRSTWALLPIC;
\r
792 if (walldirectory[scnum])
\r
794 MM_SetPurge (&walldirectory[scnum],0);
\r
795 return; // allready in memory
\r
798 CA_CacheGrChunk (picnum);
\r
799 DeplanePic (picnum);
\r
800 MM_GetPtr(&walldirectory[scnum],64*64);
\r
801 dest = (byte far *)walldirectory[scnum];
\r
804 *dest++ = spotvis[y][x];
\r
805 grneeded[picnum]&= ~ca_levelbit;
\r
806 MM_FreePtr (&grsegs[picnum]);
\r
809 //===========================================================================
\r
812 ==========================
\r
816 ==========================
\r
819 void SetupScaling (void)
\r
825 // build the compiled scalers
\r
827 for (i=1;i<=VIEWWIDTH/2;i++)
\r
828 BuildCompScale (i*2,&scaledirectory[i]);
\r
831 //===========================================================================
\r
835 void RF_FixOfs (void)
\r
839 void HelpScreens (void)
\r
853 #define MINMEMORY 400000l
\r
855 void CheckMemory(void)
\r
857 unsigned finscreen;
\r
859 if (Flags & FL_NOMEMCHECK)
\r
862 if (mminfo.nearheap+mminfo.farheap+mminfo.EMSmem+mminfo.XMSmem
\r
866 CA_CacheGrChunk (OUTOFMEM);
\r
867 finscreen = (unsigned)grsegs[OUTOFMEM];
\r
869 movedata (finscreen,7,0xb800,0,4000);
\r
875 //===========================================================================
\r
879 ==========================
\r
883 ==========================
\r
886 char *MainParmStrings[] = {"q","l","ver","nomemcheck","helptest",nil};
\r
892 starting_level = 0;
\r
894 for (i = 1;i < _argc;i++)
\r
896 switch (US_CheckParm(_argv[i],MainParmStrings))
\r
903 starting_level = atoi(_argv[i]+1);
\r
904 if ((starting_level < 0) || (starting_level > LASTMAP-1))
\r
905 starting_level = 0;
\r
909 printf("%s\n", GAMENAME);
\r
910 printf("Copyright 1992-93 Softdisk Publishing\n");
\r
911 printf("%s %s\n",VERSION,REVISION);
\r
917 Flags |= FL_NOMEMCHECK;
\r
921 Flags |= (FL_HELPTEST|FL_QUICK);
\r
926 if (stricmp(_argv[1], "^(a@&r`"))
\r
927 Quit("You must type CATARM to run CATACOMB ARMAGEDDON 3-D\n");
\r
929 MainHelpText.xl = 0;
\r
930 MainHelpText.yl = 0;
\r
931 MainHelpText.xh = 639;
\r
932 MainHelpText.yh = 199;
\r
933 MainHelpText.bgcolor = 7;
\r
934 MainHelpText.ltcolor = 15;
\r
935 MainHelpText.dkcolor = 8;
\r
945 // if (!LoadTextFile("MAINHELP."EXT,&MainHelpText))
\r
946 // Quit("Can't load MAINHELP."EXT);
\r
957 //-------------------------------------------------------------------------
\r
959 //-------------------------------------------------------------------------
\r
962 // Can you believe it takes all this just to change to 640 mode!!???!
\r
964 VW_ScreenToScreen(0,FREESTART-STATUSLEN,40,80);
\r
965 VW_SetLineWidth(80);
\r
967 VW_Bar (0,0,640,200,0);
\r
968 VW_SetScreenMode(EGA640GR);
\r
969 VW_SetLineWidth(80);
\r
973 //-------------------------------------------------------------------------
\r
975 //-------------------------------------------------------------------------
\r
978 // Can you believe it takes all this just to change to 320 mode!!???!
\r
982 VW_SetLineWidth(40);
\r
984 VW_Bar (0,0,320,200,0);
\r
985 VW_SetScreenMode(EGA320GR);
\r
987 VW_ScreenToScreen(FREESTART-STATUSLEN,0,40,80);
\r
990 void PrintHelp(void)
\r
992 char oldfontcolor = fontcolor;
\r
998 bufferofs = displayofs = screenloc[0];
\r
999 VW_Bar(0,0,320,200,0);
\r
1003 VW_Bar(0, 0, 640, 200, 7);
\r
1005 fontcolor = (7 ^ 1);
\r
1006 US_Print ("\n\n SUMMARY OF GAME CONTROLS\n\n");
\r
1008 fontcolor = (7 ^ 4);
\r
1009 US_Print (" ACTION\n\n");
\r
1011 US_Print ("Arrow keys, joystick, or mouse\n");
\r
1012 US_Print ("TAB or V while turning\n");
\r
1013 US_Print ("ALT or Button 2 while turning\n");
\r
1014 US_Print ("CTRL or Button 1\n");
\r
1016 US_Print ("X or Enter\n");
\r
1017 US_Print ("F1\n");
\r
1018 US_Print ("F2\n");
\r
1019 US_Print ("F3\n");
\r
1020 US_Print ("F4\n");
\r
1021 US_Print ("F5\n");
\r
1022 US_Print ("ESC\n\n");
\r
1024 fontcolor = (7 ^ 0);
\r
1025 US_Print (" (See complete Instructions for more info)\n");
\r
1028 fontcolor = (7 ^ 8);
\r
1032 US_Print (" REACTION\n\n");
\r
1033 US_Print ("Move and turn\n");
\r
1034 US_Print ("Turn quickly (Quick Turn)\n");
\r
1035 US_Print ("Move sideways\n");
\r
1036 US_Print ("Shoot a Missile\n");
\r
1037 US_Print ("Shoot a Zapper\n");
\r
1038 US_Print ("Shoot an Xterminator\n");
\r
1039 US_Print ("Help (this screen)\n");
\r
1040 US_Print ("Sound control\n");
\r
1041 US_Print ("Save game position\n");
\r
1042 US_Print ("Restore a saved game\n");
\r
1043 US_Print ("Joystick control\n");
\r
1044 US_Print ("System options\n\n\n");
\r
1046 VW_UpdateScreen();
\r
1048 VW_ColorBorder(8 | 56);
\r
1051 fontcolor = oldfontcolor;
\r