]> 4ch.mooo.com Git - 16.git/blob - 16/cawat/C5_MAIN.C
c7e0f8207de6404e178b5548a32629a3ed3d1f6e
[16.git] / 16 / cawat / C5_MAIN.C
1 /* Catacomb Armageddon Source Code\r
2  * Copyright (C) 1993-2014 Flat Rock Software\r
3  *\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
8  *\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
13  *\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
17  */\r
18 \r
19 // C3_MAIN.C\r
20 \r
21 #define CATALOG\r
22 \r
23 \r
24 #include <time.h>\r
25 #include <stdarg.h>\r
26 \r
27 #include "DEF.H"\r
28 #include "GELIB.H"\r
29 #pragma hdrstop\r
30 #include <dir.h>\r
31 \r
32 /*\r
33 =============================================================================\r
34 \r
35                                                  LOCAL CONSTANTS\r
36 \r
37 =============================================================================\r
38 */\r
39 \r
40 \r
41 /*\r
42 =============================================================================\r
43 \r
44                                                  GLOBAL VARIABLES\r
45 \r
46 =============================================================================\r
47 */\r
48 \r
49 PresenterInfo MainHelpText;\r
50 \r
51 GameDiff restartgame;\r
52 boolean loadedgame,abortgame,ingame;\r
53 \r
54 \r
55 memptr          scalesegs[NUMPICS];\r
56 char            str[80],str2[20];\r
57 unsigned        tedlevelnum;\r
58 boolean         tedlevel;\r
59 gametype        gamestate;\r
60 exittype        playstate;\r
61 char    SlowMode = 0;\r
62 int starting_level;\r
63 \r
64 //extern unsigned scolor,gcolor;                                        //NPM\r
65 \r
66 short NumGames=0;\r
67 unsigned Flags=0;\r
68 \r
69 boolean LoadShapes = true;\r
70 boolean EASYMODEON = false;\r
71 \r
72 void DisplayIntroText(void);\r
73 \r
74 /*\r
75 =============================================================================\r
76 \r
77                                                  LOCAL VARIABLES\r
78 \r
79 =============================================================================\r
80 */\r
81 \r
82 \r
83 \r
84 //===========================================================================\r
85 \r
86 #if 0\r
87 // JAB Hack begin\r
88 #define MyInterrupt     0x60\r
89 void interrupt (*intaddr)();\r
90 void interrupt (*oldintaddr)();\r
91         char    *JHParmStrings[] = {"no386",nil};\r
92 \r
93 void\r
94 jabhack(void)\r
95 {\r
96 extern void far jabhack2(void);\r
97 extern int far  CheckIs386(void);\r
98 \r
99         int     i;\r
100 \r
101         oldintaddr = getvect(MyInterrupt);\r
102 \r
103         for (i = 1;i < _argc;i++)\r
104                 if (US_CheckParm(_argv[i],JHParmStrings) == 0)\r
105                         return;\r
106 \r
107         if (CheckIs386())\r
108         {\r
109                 jabhack2();\r
110                 setvect(MyInterrupt,intaddr);\r
111         }\r
112 }\r
113 \r
114 void\r
115 jabunhack(void)\r
116 {\r
117         setvect(MyInterrupt,oldintaddr);\r
118 }\r
119 //      JAB Hack end\r
120 #endif\r
121 \r
122 //===========================================================================\r
123 \r
124 /*\r
125 =====================\r
126 =\r
127 = NewGame\r
128 =\r
129 = Set up new game to start from the beginning\r
130 =\r
131 =====================\r
132 */\r
133 \r
134 void NewGame (void)\r
135 {\r
136         if (!loadedgame)\r
137         {\r
138                 memset (&gamestate,0,sizeof(gamestate));\r
139                 gamestate.mapon = starting_level;\r
140                 gamestate.body = MAXBODY;\r
141         }\r
142 \r
143         BGFLAGS = BGF_NOT_LIGHTNING;\r
144         Flags &= FL_CLEAR;\r
145 \r
146         boltsleft = bolttimer = 0;\r
147 \r
148 //      memset (gamestate.levels,-1,sizeof(gamestate.levels));\r
149 }\r
150 \r
151 //===========================================================================\r
152 \r
153 #define RLETAG  0xABCD\r
154 \r
155 /*\r
156 ==================\r
157 =\r
158 = SaveTheGame\r
159 =\r
160 ==================\r
161 */\r
162 \r
163 boolean SaveTheGame(int file)\r
164 {\r
165         word    i,compressed,expanded;\r
166         objtype *o;\r
167         memptr  bigbuffer;\r
168 \r
169         // save the sky and ground colors\r
170         if (!CA_FarWrite(file,(void far *)&skycolor,sizeof(skycolor)))\r
171                 return(false);\r
172         if (!CA_FarWrite(file,(void far *)&groundcolor,sizeof(groundcolor)))\r
173                 return(false);\r
174 \r
175         if (!CA_FarWrite(file,(void far *)&FreezeTime,sizeof(FreezeTime)))\r
176                 return(false);\r
177 \r
178         if (!CA_FarWrite(file,(void far *)&gamestate,sizeof(gamestate)))\r
179                 return(false);\r
180 \r
181         if (!CA_FarWrite(file,(void far *)&EASYMODEON,sizeof(EASYMODEON)))\r
182                 return(false);\r
183 \r
184         expanded = mapwidth * mapheight * 2;\r
185         MM_GetPtr (&bigbuffer,expanded);\r
186 \r
187         for (i = 0;i < 3;i+=2)  // Write planes 0 and 2\r
188         {\r
189 //\r
190 // leave a word at start of compressed data for compressed length\r
191 //\r
192                 compressed = (unsigned)CA_RLEWCompress ((unsigned huge *)mapsegs[i]\r
193                         ,expanded,((unsigned huge *)bigbuffer)+1,RLETAG);\r
194 \r
195                 *(unsigned huge *)bigbuffer = compressed;\r
196 \r
197                 if (!CA_FarWrite(file,(void far *)bigbuffer,compressed+2) )\r
198                 {\r
199                         MM_FreePtr (&bigbuffer);\r
200                         return(false);\r
201                 }\r
202         }\r
203 \r
204         for (o = player;o;o = o->next)\r
205                 if (!CA_FarWrite(file,(void far *)o,sizeof(objtype)))\r
206                 {\r
207                         MM_FreePtr (&bigbuffer);\r
208                         return(false);\r
209                 }\r
210 \r
211         MM_FreePtr (&bigbuffer);\r
212 \r
213         return(true);\r
214 }\r
215 \r
216 //===========================================================================\r
217 \r
218 \r
219 /*\r
220 ==================\r
221 =\r
222 = LoadTheGame\r
223 =\r
224 ==================\r
225 */\r
226 \r
227 boolean LoadTheGame(int file)\r
228 {\r
229         unsigned        i,x,y;\r
230         objtype         *obj,*prev,*next,*followed;\r
231         unsigned        compressed,expanded;\r
232         unsigned        far *map,tile;\r
233         memptr          bigbuffer;\r
234 \r
235         screenpage = 0;\r
236         FreeUpMemory();\r
237 \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
241                 return(false);\r
242         if (!CA_FarRead(file,(void far *)&groundcolor,sizeof(groundcolor)))\r
243                 return(false);\r
244 \r
245         if (!CA_FarRead(file,(void far *)&FreezeTime,sizeof(FreezeTime)))\r
246                 return(false);\r
247 \r
248         if (!CA_FarRead(file,(void far *)&gamestate,sizeof(gamestate)))\r
249                 return(false);\r
250 \r
251         if (!CA_FarRead(file,(void far *)&EASYMODEON,sizeof(EASYMODEON)))\r
252                 return(false);\r
253 \r
254         SetupGameLevel ();              // load in and cache the base old level\r
255 \r
256         if (!FindFile(Filename,"SAVE GAME",-1))\r
257                 Quit("Error: Can't find saved game file!");\r
258 \r
259         expanded = mapwidth * mapheight * 2;\r
260         MM_GetPtr (&bigbuffer,expanded);\r
261 \r
262         for (i = 0;i < 3;i+=2)  // Read planes 0 and 2\r
263         {\r
264                 if (!CA_FarRead(file,(void far *)&compressed,sizeof(compressed)) )\r
265                 {\r
266                         MM_FreePtr (&bigbuffer);\r
267                         return(false);\r
268                 }\r
269 \r
270                 if (!CA_FarRead(file,(void far *)bigbuffer,compressed) )\r
271                 {\r
272                         MM_FreePtr (&bigbuffer);\r
273                         return(false);\r
274                 }\r
275 \r
276                 CA_RLEWexpand ((unsigned huge *)bigbuffer,\r
277                         (unsigned huge *)mapsegs[i],expanded,RLETAG);\r
278         }\r
279 \r
280         MM_FreePtr (&bigbuffer);\r
281 //\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
284 //\r
285         memset (tilemap,0,sizeof(tilemap));\r
286         memset (actorat,0,sizeof(actorat));\r
287         map = mapsegs[0];\r
288         for (y=0;y<mapheight;y++)\r
289                 for (x=0;x<mapwidth;x++)\r
290                 {\r
291                         tile = *map++;\r
292                         if (tile<NUMFLOORS)\r
293                         {\r
294                                 if (tile != INVISIBLEWALL)\r
295                                         tilemap[x][y] = tile;\r
296                                 if (tile>0)\r
297                                         (unsigned)actorat[x][y] = tile;\r
298                         }\r
299                 }\r
300 \r
301 \r
302         // Read the object list back in - assumes at least one object in list\r
303 \r
304         InitObjList ();\r
305         new = player;\r
306         while (true)\r
307         {\r
308                 prev = new->prev;\r
309                 next = new->next;\r
310                 if (!CA_FarRead(file,(void far *)new,sizeof(objtype)))\r
311                         return(false);\r
312                 followed = new->next;\r
313                 new->prev = prev;\r
314                 new->next = next;\r
315                 actorat[new->tilex][new->tiley] = new;  // drop a new marker\r
316 \r
317                 if (followed)\r
318                         GetNewObj (false);\r
319                 else\r
320                         break;\r
321         }\r
322 \r
323         return(true);\r
324 }\r
325 \r
326 //===========================================================================\r
327 \r
328 /*\r
329 ==================\r
330 =\r
331 = ResetGame\r
332 =\r
333 ==================\r
334 */\r
335 \r
336 void ResetGame(void)\r
337 {\r
338         NewGame ();\r
339 \r
340         ca_levelnum--;\r
341         ca_levelbit>>=1;\r
342         CA_ClearMarks();\r
343         ca_levelbit<<=1;\r
344         ca_levelnum++;\r
345 }\r
346 \r
347 //===========================================================================\r
348 \r
349 \r
350 /*\r
351 ==========================\r
352 =\r
353 = ShutdownId\r
354 =\r
355 = Shuts down all ID_?? managers\r
356 =\r
357 ==========================\r
358 */\r
359 \r
360 void ShutdownId (void)\r
361 {\r
362   US_Shutdown ();\r
363 #ifndef PROFILE\r
364   SD_Shutdown ();\r
365   IN_Shutdown ();\r
366 #endif\r
367   VW_Shutdown ();\r
368   CA_Shutdown ();\r
369   MM_Shutdown ();\r
370 }\r
371 \r
372 \r
373 //===========================================================================\r
374 \r
375 /*\r
376 ==========================\r
377 =\r
378 = InitGame\r
379 =\r
380 = Load a few things right away\r
381 =\r
382 ==========================\r
383 */\r
384 \r
385 void InitGame (void)\r
386 {\r
387         unsigned        segstart,seglength;\r
388         int                     i,x,y;\r
389         unsigned        *blockstart;\r
390 \r
391 //      US_TextScreen();\r
392 \r
393         MM_Startup ();\r
394         VW_Startup ();\r
395 #ifndef PROFILE\r
396         IN_Startup ();\r
397         SD_Startup ();\r
398 #endif\r
399         US_Startup ();\r
400 \r
401 //      US_UpdateTextScreen();\r
402 \r
403         CA_Startup ();\r
404         US_Setup ();\r
405 \r
406         US_SetLoadSaveHooks(LoadTheGame,SaveTheGame,ResetGame);\r
407 \r
408 \r
409 //\r
410 // load in and lock down some basic chunks\r
411 //\r
412 \r
413         CA_ClearMarks ();\r
414 \r
415         CA_MarkGrChunk(STARTFONT);\r
416         CA_MarkGrChunk(STARTTILE8);\r
417         CA_MarkGrChunk(STARTTILE8M);\r
418         CA_MarkGrChunk(HAND1PICM);\r
419 \r
420         CA_MarkGrChunk(NORTHICONSPR);\r
421         CA_CacheMarks (NULL);\r
422 \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
427 \r
428         fontcolor = WHITE;\r
429 \r
430 \r
431 //\r
432 // build some tables\r
433 //\r
434         for (i=0;i<MAPSIZE;i++)\r
435                 nearmapylookup[i] = &tilemap[0][0]+MAPSIZE*i;\r
436 \r
437         for (i=0;i<PORTTILESHIGH;i++)\r
438                 uwidthtable[i] = UPDATEWIDE*i;\r
439 \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
444 \r
445         BuildTables ();                 // 3-d tables\r
446 \r
447         SetupScaling ();\r
448 \r
449 #ifndef PROFILE\r
450 //      US_FinishTextScreen();\r
451 #endif\r
452 \r
453 #if 0\r
454 //\r
455 // reclaim the memory from the linked in text screen\r
456 //\r
457         segstart = FP_SEG(&introscn);\r
458         seglength = 4000/16;\r
459         if (FP_OFF(&introscn))\r
460         {\r
461                 segstart++;\r
462                 seglength--;\r
463         }\r
464         MML_UseSpace (segstart,seglength);\r
465 #endif\r
466 \r
467         VW_SetScreenMode (GRMODE);\r
468         ge_textmode = false;\r
469 //      VW_ColorBorder (3);\r
470         VW_ClearVideo (BLACK);\r
471 \r
472 //\r
473 // initialize variables\r
474 //\r
475         updateptr = &update[0];\r
476         *(unsigned *)(updateptr + UPDATEWIDE*PORTTILESHIGH) = UPDATETERMINATE;\r
477         bufferofs = 0;\r
478         displayofs = 0;\r
479         VW_SetLineWidth(SCREENWIDTH);\r
480 }\r
481 \r
482 //===========================================================================\r
483 \r
484 void clrscr (void);             // can't include CONIO.H because of name conflicts...\r
485 \r
486 /*\r
487 ==========================\r
488 =\r
489 = Quit\r
490 =\r
491 ==========================\r
492 */\r
493 \r
494 void Quit (char *error, ...)\r
495 {\r
496         short exit_code=0;\r
497         unsigned        finscreen;\r
498 \r
499         va_list ap;\r
500 \r
501         va_start(ap,error);\r
502 \r
503 #ifndef CATALOG\r
504         if (!error)\r
505         {\r
506                 CA_SetAllPurge ();\r
507                 CA_CacheGrChunk (PIRACY);\r
508                 finscreen = (unsigned)grsegs[PIRACY];\r
509         }\r
510 #endif\r
511 \r
512         ShutdownId ();\r
513 \r
514         if (error && *error)\r
515         {\r
516                 vprintf(error,ap);\r
517                 exit_code = 1;\r
518         }\r
519 #ifndef CATALOG\r
520         else\r
521         if (!NoWait)\r
522         {\r
523                 movedata (finscreen,0,0xb800,0,4000);\r
524                 bioskey (0);\r
525         }\r
526 #endif\r
527 \r
528         va_end(ap);\r
529 \r
530 #ifndef CATALOG\r
531         if (!error)\r
532         {\r
533                 _argc = 2;\r
534                 _argv[1] = "LAST.SHL";\r
535                 _argv[2] = "ENDSCN.SCN";\r
536                 _argv[3] = NULL;\r
537                 if (execv("LOADSCN.EXE", _argv) == -1)\r
538                 {\r
539                         clrscr();\r
540                         puts("Couldn't find executable LOADSCN.EXE.\n");\r
541                         exit(1);\r
542                 }\r
543         }\r
544 #endif\r
545 \r
546         exit(exit_code);\r
547 }\r
548 \r
549 //===========================================================================\r
550 \r
551 /*\r
552 ==================\r
553 =\r
554 = TEDDeath\r
555 =\r
556 ==================\r
557 */\r
558 \r
559 void    TEDDeath(void)\r
560 {\r
561         ShutdownId();\r
562         execlp("TED5.EXE","TED5.EXE","/LAUNCH",NULL);\r
563 }\r
564 \r
565 //===========================================================================\r
566 \r
567 /*\r
568 ====================\r
569 =\r
570 = DisplayDepartment\r
571 =\r
572 ====================\r
573 */\r
574 void DisplayDepartment(char *text)\r
575 {\r
576         short temp;\r
577 \r
578 //      bufferofs = 0;\r
579         PrintY = 1;\r
580         WindowX = 0;\r
581         WindowW = 320;\r
582 \r
583         VW_Bar(WindowX,PrintY+1,WindowW,7,7);\r
584         temp = fontcolor;\r
585         fontcolor = 2;\r
586         US_CPrintLine (text);\r
587         fontcolor = temp;\r
588 }\r
589 \r
590 \r
591 \r
592 /*\r
593 =====================\r
594 =\r
595 = DemoLoop\r
596 =\r
597 =====================\r
598 */\r
599 \r
600 void    DemoLoop (void)\r
601 {\r
602 \r
603 /////////////////////////////////////////////////////////////////////////////\r
604 // main game cycle\r
605 /////////////////////////////////////////////////////////////////////////////\r
606 \r
607         displayofs = bufferofs = 0;\r
608         VW_Bar (0,0,320,200,0);\r
609         VW_SetScreen(0,0);\r
610 \r
611 //\r
612 // Read in all the graphic images needed for the title sequence\r
613 //\r
614                 VW_WaitVBL(1);\r
615                 IN_ReadControl(0,&control);\r
616 \r
617 //      set EASYMODE\r
618 //\r
619         if (stricmp(_argv[2], "1") == 0)\r
620                 EASYMODEON = true;\r
621         else\r
622                 EASYMODEON = false;\r
623 \r
624 // restore game\r
625 //\r
626         if (stricmp(_argv[3], "1") == 0)\r
627         {\r
628                 VW_FadeOut();\r
629                 bufferofs = displayofs = 0;\r
630                 VW_Bar(0,0,320,200,0);\r
631                 if (GE_LoadGame())\r
632                 {\r
633                         loadedgame = true;\r
634                         playstate = ex_loadedgame;\r
635                         Keyboard[sc_Enter] = true;\r
636                         VW_Bar(0,0,320,200,0);\r
637                         ColoredPalette();\r
638                 }\r
639                 VW_Bar(0,0,320,200,0);\r
640                 VW_FadeIn();\r
641         }\r
642 \r
643         // Play a game\r
644         //\r
645                 restartgame = gd_Normal;\r
646                 NewGame();\r
647                 GameLoop();\r
648 }\r
649 \r
650 \r
651 //-------------------------------------------------------------------------\r
652 // DisplayIntroText()\r
653 //-------------------------------------------------------------------------\r
654 void DisplayIntroText()\r
655 {\r
656         PresenterInfo pi;\r
657 \r
658 #ifdef TEXT_PRESENTER\r
659         char *toptext = "You stand before the gate leading into the Towne "\r
660                                                  "of Morbidity.... "\r
661                                                  "^XX";\r
662 \r
663         char *bottomtext = "Enter now boldly to defeat the evil Nemesis "\r
664                                                          "deep inside the catacombs."\r
665                                                          "\r
666                                                          "^XX";\r
667 #endif\r
668 \r
669         char oldfontcolor=fontcolor;\r
670 \r
671         fontcolor = 14;\r
672 \r
673 \r
674 #ifdef TEXT_PRESENTER\r
675         pi.xl = 0;\r
676         pi.yl = 0;\r
677         pi.xh = 319;\r
678         pi.yh = 1;\r
679         pi.bgcolor = 0;\r
680         pi.script[0] = (char far *)toptext;\r
681         Presenter(&pi);\r
682 \r
683         pi.yl = 160;\r
684         pi.yh = 161;\r
685         pi.script[0] = (char far *)bottomtext;\r
686         Presenter(&pi);\r
687 \r
688 #else\r
689         PrintY = 1;\r
690         PrintX = 0;\r
691         WindowX = 0;\r
692         WindowW = 320;\r
693         US_Print ("         You stand before the gate leading into\n");\r
694         US_Print ("                 the Towne of Morbidity...\n");\r
695 \r
696         PrintY = 180;\r
697         US_Print ("    Enter now boldly to defeat the evil Nemesis\n");\r
698         US_Print ("              deep inside the catacombs.\n");\r
699 \r
700 #endif\r
701 \r
702         fontcolor = oldfontcolor;\r
703 }\r
704 \r
705 #if 0\r
706 boolean ChooseGameLevel()\r
707 {\r
708         char choices[] = {sc_Escape,sc_E,sc_N,sc_H,0},ch;\r
709 \r
710         CenterWindow(20,10);\r
711 \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
717 \r
718 //      VW_UpdateScreen();\r
719         if ((ch=GetKeyChoice(choices)) == sc_Escape)\r
720         {\r
721                 while (Keyboard[sc_Escape]);\r
722                 LastScan = 0;\r
723                 return(false);\r
724         }\r
725 \r
726         if (ch == sc_E)\r
727                 restartgame = gd_Easy;\r
728         else\r
729         if (ch == sc_N)\r
730                 restartgame = gd_Normal;\r
731         else\r
732                 restartgame = gd_Hard;\r
733 \r
734         return(true);\r
735 }\r
736 #endif\r
737 \r
738 \r
739 //===========================================================================\r
740 \r
741 /*\r
742 ==========================\r
743 =\r
744 = SetupScalePic\r
745 =\r
746 ==========================\r
747 */\r
748 \r
749 void SetupScalePic (unsigned picnum)\r
750 {\r
751         unsigned        scnum;\r
752 \r
753         if (picnum == 1)\r
754                 return;\r
755 \r
756         scnum = picnum-FIRSTSCALEPIC;\r
757 \r
758         if (shapedirectory[scnum])\r
759         {\r
760                 MM_SetPurge (&(memptr)shapedirectory[scnum],0);\r
761                 return;                                 // allready in memory\r
762         }\r
763 \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
769 }\r
770 \r
771 //===========================================================================\r
772 \r
773 /*\r
774 ==========================\r
775 =\r
776 = SetupScaleWall\r
777 =\r
778 ==========================\r
779 */\r
780 \r
781 void SetupScaleWall (unsigned picnum)\r
782 {\r
783         int             x,y;\r
784         unsigned        scnum;\r
785         byte    far *dest;\r
786 \r
787         if (picnum == 1)\r
788                 return;\r
789 \r
790         scnum = picnum-FIRSTWALLPIC;\r
791 \r
792         if (walldirectory[scnum])\r
793         {\r
794                 MM_SetPurge (&walldirectory[scnum],0);\r
795                 return;                                 // allready in memory\r
796         }\r
797 \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
802         for (x=0;x<64;x++)\r
803                 for (y=0;y<64;y++)\r
804                         *dest++ = spotvis[y][x];\r
805         grneeded[picnum]&= ~ca_levelbit;\r
806         MM_FreePtr (&grsegs[picnum]);\r
807 }\r
808 \r
809 //===========================================================================\r
810 \r
811 /*\r
812 ==========================\r
813 =\r
814 = SetupScaling\r
815 =\r
816 ==========================\r
817 */\r
818 \r
819 void SetupScaling (void)\r
820 {\r
821         int             i,x,y;\r
822         byte    far *dest;\r
823 \r
824 //\r
825 // build the compiled scalers\r
826 //\r
827         for (i=1;i<=VIEWWIDTH/2;i++)\r
828                 BuildCompScale (i*2,&scaledirectory[i]);\r
829 }\r
830 \r
831 //===========================================================================\r
832 \r
833 int     showscorebox;\r
834 \r
835 void RF_FixOfs (void)\r
836 {\r
837 }\r
838 \r
839 void HelpScreens (void)\r
840 {\r
841 }\r
842 \r
843 \r
844 #if 0\r
845 /*\r
846 ==================\r
847 =\r
848 = CheckMemory\r
849 =\r
850 ==================\r
851 */\r
852 \r
853 #define MINMEMORY       400000l\r
854 \r
855 void    CheckMemory(void)\r
856 {\r
857         unsigned        finscreen;\r
858 \r
859         if (Flags & FL_NOMEMCHECK)\r
860                 return;\r
861 \r
862         if (mminfo.nearheap+mminfo.farheap+mminfo.EMSmem+mminfo.XMSmem\r
863                 >= MINMEMORY)\r
864                 return;\r
865 \r
866         CA_CacheGrChunk (OUTOFMEM);\r
867         finscreen = (unsigned)grsegs[OUTOFMEM];\r
868         ShutdownId ();\r
869         movedata (finscreen,7,0xb800,0,4000);\r
870         gotoxy (1,24);\r
871         exit(1);\r
872 }\r
873 #endif\r
874 \r
875 //===========================================================================\r
876 \r
877 \r
878 /*\r
879 ==========================\r
880 =\r
881 = main\r
882 =\r
883 ==========================\r
884 */\r
885 \r
886 char                    *MainParmStrings[] = {"q","l","ver","nomemcheck","helptest",nil};\r
887 \r
888 void main (void)\r
889 {\r
890         short i;\r
891 \r
892         starting_level = 0;\r
893 \r
894         for (i = 1;i < _argc;i++)\r
895         {\r
896                 switch (US_CheckParm(_argv[i],MainParmStrings))\r
897                 {\r
898                         case 0:\r
899                                 Flags |= FL_QUICK;\r
900                         break;\r
901 \r
902                         case 1:\r
903                                 starting_level = atoi(_argv[i]+1);\r
904                                 if ((starting_level < 0) || (starting_level > LASTMAP-1))\r
905                                         starting_level = 0;\r
906                         break;\r
907 \r
908                         case 2:\r
909                                 printf("%s\n", GAMENAME);\r
910                                 printf("Copyright 1992-93 Softdisk Publishing\n");\r
911                                 printf("%s %s\n",VERSION,REVISION);\r
912                                 printf("\n");\r
913                                 exit(0);\r
914                         break;\r
915 \r
916                         case 3:\r
917                                 Flags |= FL_NOMEMCHECK;\r
918                         break;\r
919 \r
920                         case 4:\r
921                                 Flags |= (FL_HELPTEST|FL_QUICK);\r
922                         break;\r
923                 }\r
924         }\r
925 \r
926         if (stricmp(_argv[1], "^(a@&r`"))\r
927                 Quit("You must type CATARM to run CATACOMB ARMAGEDDON 3-D\n");\r
928 \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
936 \r
937 //      jabhack();\r
938 \r
939         randomize();\r
940 \r
941         InitGame ();\r
942 //      CheckMemory ();\r
943         LoadLatchMem ();\r
944 \r
945 //      if (!LoadTextFile("MAINHELP."EXT,&MainHelpText))\r
946 //              Quit("Can't load MAINHELP."EXT);\r
947 \r
948 #ifdef PROFILE\r
949         NewGame ();\r
950         GameLoop ();\r
951 #endif\r
952 \r
953         DemoLoop();\r
954         Quit(NULL);\r
955 }\r
956 \r
957 //-------------------------------------------------------------------------\r
958 // Display640()\r
959 //-------------------------------------------------------------------------\r
960 void Display640()\r
961 {\r
962 // Can you believe it takes all this just to change to 640 mode!!???!\r
963 //\r
964         VW_ScreenToScreen(0,FREESTART-STATUSLEN,40,80);\r
965         VW_SetLineWidth(80);\r
966         MoveScreen(0,0);\r
967         VW_Bar (0,0,640,200,0);\r
968         VW_SetScreenMode(EGA640GR);\r
969         VW_SetLineWidth(80);\r
970         BlackPalette();\r
971 }\r
972 \r
973 //-------------------------------------------------------------------------\r
974 // Display320()\r
975 //-------------------------------------------------------------------------\r
976 void Display320()\r
977 {\r
978 // Can you believe it takes all this just to change to 320 mode!!???!\r
979 //\r
980         VW_ColorBorder(0);\r
981         VW_FadeOut();\r
982         VW_SetLineWidth(40);\r
983         MoveScreen(0,0);\r
984         VW_Bar (0,0,320,200,0);\r
985         VW_SetScreenMode(EGA320GR);\r
986         BlackPalette();\r
987         VW_ScreenToScreen(FREESTART-STATUSLEN,0,40,80);\r
988 }\r
989 \r
990 void PrintHelp(void)\r
991 {\r
992         char oldfontcolor = fontcolor;\r
993         PrintY = 1;\r
994         WindowX = 135;\r
995         WindowW = 640;\r
996 \r
997         VW_FadeOut();\r
998         bufferofs = displayofs = screenloc[0];\r
999         VW_Bar(0,0,320,200,0);\r
1000 \r
1001         Display640();\r
1002 \r
1003         VW_Bar(0, 0, 640, 200, 7);\r
1004 \r
1005         fontcolor = (7 ^ 1);\r
1006         US_Print ("\n\n                    SUMMARY OF GAME CONTROLS\n\n");\r
1007 \r
1008         fontcolor = (7 ^ 4);\r
1009         US_Print ("         ACTION\n\n");\r
1010 \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
1015         US_Print ("Z\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
1023 #ifndef CATALOG\r
1024         fontcolor = (7 ^ 0);\r
1025         US_Print ("          (See complete Instructions for more info)\n");\r
1026 #endif\r
1027 \r
1028         fontcolor = (7 ^ 8);\r
1029         PrintX = 400;\r
1030         PrintY = 37;\r
1031         WindowX = 400;\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
1045 \r
1046         VW_UpdateScreen();\r
1047         VW_FadeIn();\r
1048         VW_ColorBorder(8 | 56);\r
1049         IN_Ack();\r
1050         Display320();\r
1051         fontcolor = oldfontcolor;\r
1052 }