OSDN Git Service

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