OSDN Git Service

got 8086 port of wolf3d to work and sod to work
[proj16/16.git] / 16 / sod8086 / wl_menu.c
1 ////////////////////////////////////////////////////////////////////\r
2 //\r
3 // WL_MENU.C\r
4 // by John Romero (C) 1992 Id Software, Inc.\r
5 //\r
6 ////////////////////////////////////////////////////////////////////\r
7 #include "wl_def.h"\r
8 #pragma hdrstop\r
9 \r
10 //\r
11 // PRIVATE PROTOTYPES\r
12 //\r
13 void CP_ReadThis(void);\r
14 \r
15 #ifdef SPEAR\r
16 #define STARTITEM       newgame\r
17 \r
18 #else\r
19 #ifdef GOODTIMES\r
20 #define STARTITEM       newgame\r
21 \r
22 #else\r
23 #define STARTITEM       readthis\r
24 #endif\r
25 #endif\r
26 \r
27 char far endStrings[9][80]=\r
28 {\r
29 #ifndef SPEAR\r
30         {"Dost thou wish to\nleave with such hasty\nabandon?"},\r
31         {"Chickening out...\nalready?"},\r
32         {"Press N for more carnage.\nPress Y to be a weenie."},\r
33         {"So, you think you can\nquit this easily, huh?"},\r
34         {"Press N to save the world.\nPress Y to abandon it in\nits hour of need."},\r
35         {"Press N if you are brave.\nPress Y to cower in shame."},\r
36         {"Heroes, press N.\nWimps, press Y."},\r
37         {"You are at an intersection.\nA sign says, 'Press Y to quit.'\n>"},\r
38         {"For guns and glory, press N.\nFor work and worry, press Y."}\r
39 #else\r
40         ENDSTR1,\r
41         ENDSTR2,\r
42         ENDSTR3,\r
43         ENDSTR4,\r
44         ENDSTR5,\r
45         ENDSTR6,\r
46         ENDSTR7,\r
47         ENDSTR8,\r
48         ENDSTR9\r
49 #endif\r
50 };\r
51 \r
52 CP_iteminfo\r
53         MainItems={MENU_X,MENU_Y,10,STARTITEM,24},\r
54         SndItems={SM_X,SM_Y1,12,0,52},\r
55         LSItems={LSM_X,LSM_Y,10,0,24},\r
56         CtlItems={CTL_X,CTL_Y,6,-1,56},\r
57         CusItems={8,CST_Y+13*2,9,-1,0},\r
58         NewEitems={NE_X,NE_Y,11,0,88},\r
59         NewItems={NM_X,NM_Y,4,2,24};\r
60 \r
61 #pragma warn -sus\r
62 CP_itemtype far\r
63 MainMenu[]=\r
64 {\r
65 #ifdef JAPAN\r
66         {1,"",CP_NewGame},\r
67         {1,"",CP_Sound},\r
68         {1,"",CP_Control},\r
69         {1,"",CP_LoadGame},\r
70         {0,"",CP_SaveGame},\r
71         {1,"",CP_ChangeView},\r
72         {2,"",CP_ReadThis},\r
73         {1,"",CP_ViewScores},\r
74         {1,"",0},\r
75         {1,"",0}\r
76 #else\r
77 \r
78         {1,STR_NG,CP_NewGame},\r
79         {1,STR_SD,CP_Sound},\r
80         {1,STR_CL,CP_Control},\r
81         {1,STR_LG,CP_LoadGame},\r
82         {0,STR_SG,CP_SaveGame},\r
83         {1,STR_CV,CP_ChangeView},\r
84 \r
85 #ifndef GOODTIMES\r
86 #ifndef SPEAR\r
87 \r
88         #ifdef SPANISH\r
89         {2,"Ve esto!",CP_ReadThis},\r
90         #else\r
91         {2,"Read This!",CP_ReadThis},\r
92         #endif\r
93 \r
94 #endif\r
95 #endif\r
96 \r
97         {1,STR_VS,CP_ViewScores},\r
98         {1,STR_BD,0},\r
99         {1,STR_QT,0}\r
100 #endif\r
101 },\r
102 \r
103 far SndMenu[]=\r
104 {\r
105 #ifdef JAPAN\r
106         {1,"",0},\r
107         {1,"",0},\r
108         {1,"",0},\r
109         {0,"",0},\r
110         {0,"",0},\r
111         {1,"",0},\r
112         {1,"",0},\r
113         {1,"",0},\r
114         {0,"",0},\r
115         {0,"",0},\r
116         {1,"",0},\r
117         {1,"",0},\r
118 #else\r
119         {1,STR_NONE,0},\r
120         {1,STR_PC,0},\r
121         {1,STR_ALSB,0},\r
122         {0,"",0},\r
123         {0,"",0},\r
124         {1,STR_NONE,0},\r
125         {1,STR_DISNEY,0},\r
126         {1,STR_SB,0},\r
127         {0,"",0},\r
128         {0,"",0},\r
129         {1,STR_NONE,0},\r
130         {1,STR_ALSB,0}\r
131 #endif\r
132 },\r
133 \r
134 far CtlMenu[]=\r
135 {\r
136 #ifdef JAPAN\r
137         {0,"",0},\r
138         {0,"",0},\r
139         {0,"",0},\r
140         {0,"",0},\r
141         {0,"",MouseSensitivity},\r
142         {1,"",CustomControls}\r
143 #else\r
144         {0,STR_MOUSEEN,0},\r
145         {0,STR_JOYEN,0},\r
146         {0,STR_PORT2,0},\r
147         {0,STR_GAMEPAD,0},\r
148         {0,STR_SENS,MouseSensitivity},\r
149         {1,STR_CUSTOM,CustomControls}\r
150 #endif\r
151 },\r
152 \r
153 #pragma warn +sus\r
154 \r
155 #ifndef SPEAR\r
156 far NewEmenu[]=\r
157 {\r
158 #ifdef JAPAN\r
159 #ifdef JAPDEMO\r
160         {1,"",0},\r
161         {0,"",0},\r
162         {0,"",0},\r
163         {0,"",0},\r
164         {0,"",0},\r
165         {0,"",0},\r
166         {0,"",0},\r
167         {0,"",0},\r
168         {0,"",0},\r
169         {0,"",0},\r
170         {0,"",0},\r
171         {0,"",0},\r
172 #else\r
173         {1,"",0},\r
174         {0,"",0},\r
175         {1,"",0},\r
176         {0,"",0},\r
177         {1,"",0},\r
178         {0,"",0},\r
179         {1,"",0},\r
180         {0,"",0},\r
181         {1,"",0},\r
182         {0,"",0},\r
183         {1,"",0},\r
184         {0,"",0}\r
185 #endif\r
186 #else\r
187         #ifdef SPANISH\r
188         {1,"Episodio 1\n"\r
189            "Fuga desde Wolfenstein",0},\r
190         {0,"",0},\r
191         {3,"Episodio 2\n"\r
192                    "Operacion Eisenfaust",0},\r
193         {0,"",0},\r
194         {3,"Episodio 3\n"\r
195                    "Muere, Fuhrer, Muere!",0},\r
196         {0,"",0},\r
197         {3,"Episodio 4\n"\r
198                   "Un Negro Secreto",0},\r
199         {0,"",0},\r
200         {3,"Episodio 5\n"\r
201                   "Huellas del Loco",0},\r
202         {0,"",0},\r
203         {3,"Episodio 6\n"\r
204                   "Confrontacion",0}\r
205         #else\r
206         {1,"Episode 1\n"\r
207            "Escape from Wolfenstein",0},\r
208         {0,"",0},\r
209         {3,"Episode 2\n"\r
210                    "Operation: Eisenfaust",0},\r
211         {0,"",0},\r
212         {3,"Episode 3\n"\r
213                    "Die, Fuhrer, Die!",0},\r
214         {0,"",0},\r
215         {3,"Episode 4\n"\r
216                   "A Dark Secret",0},\r
217         {0,"",0},\r
218         {3,"Episode 5\n"\r
219                   "Trail of the Madman",0},\r
220         {0,"",0},\r
221         {3,"Episode 6\n"\r
222                   "Confrontation",0}\r
223         #endif\r
224 #endif\r
225 },\r
226 #endif\r
227 \r
228 \r
229 far NewMenu[]=\r
230 {\r
231 #ifdef JAPAN\r
232         {1,"",0},\r
233         {1,"",0},\r
234         {1,"",0},\r
235         {1,"",0}\r
236 #else\r
237         {1,STR_DADDY,0},\r
238         {1,STR_HURTME,0},\r
239         {1,STR_BRINGEM,0},\r
240         {1,STR_DEATH,0}\r
241 #endif\r
242 },\r
243 \r
244 far LSMenu[]=\r
245 {\r
246         {1,"",0},\r
247         {1,"",0},\r
248         {1,"",0},\r
249         {1,"",0},\r
250         {1,"",0},\r
251         {1,"",0},\r
252         {1,"",0},\r
253         {1,"",0},\r
254         {1,"",0},\r
255         {1,"",0}\r
256 },\r
257 \r
258 far CusMenu[]=\r
259 {\r
260         {1,"",0},\r
261         {0,"",0},\r
262         {0,"",0},\r
263         {1,"",0},\r
264         {0,"",0},\r
265         {0,"",0},\r
266         {1,"",0},\r
267         {0,"",0},\r
268         {1,"",0}\r
269 }\r
270 ;\r
271 \r
272 \r
273 int color_hlite[]={\r
274    DEACTIVE,\r
275    HIGHLIGHT,\r
276    READHCOLOR,\r
277    0x67\r
278    },\r
279 \r
280    color_norml[]={\r
281    DEACTIVE,\r
282    TEXTCOLOR,\r
283    READCOLOR,\r
284    0x6b\r
285    };\r
286 \r
287 int EpisodeSelect[6]={1};\r
288 \r
289 \r
290 int SaveGamesAvail[10],StartGame,SoundStatus=1,pickquick;\r
291 char SaveGameNames[10][32],SaveName[13]="SAVEGAM?.";\r
292 \r
293 \r
294 ////////////////////////////////////////////////////////////////////\r
295 //\r
296 // INPUT MANAGER SCANCODE TABLES\r
297 //\r
298 ////////////////////////////////////////////////////////////////////\r
299 static byte\r
300                                         *ScanNames[] =          // Scan code names with single chars\r
301                                         {\r
302         "?","?","1","2","3","4","5","6","7","8","9","0","-","+","?","?",\r
303         "Q","W","E","R","T","Y","U","I","O","P","[","]","|","?","A","S",\r
304         "D","F","G","H","J","K","L",";","\"","?","?","?","Z","X","C","V",\r
305         "B","N","M",",",".","/","?","?","?","?","?","?","?","?","?","?",\r
306         "?","?","?","?","?","?","?","?","\xf","?","-","\x15","5","\x11","+","?",\r
307         "\x13","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",\r
308         "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",\r
309         "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"\r
310                                         },      // DEBUG - consolidate these\r
311                                         far ExtScanCodes[] =    // Scan codes with >1 char names\r
312                                         {\r
313         1,0xe,0xf,0x1d,0x2a,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,\r
314         0x3f,0x40,0x41,0x42,0x43,0x44,0x57,0x59,0x46,0x1c,0x36,\r
315         0x37,0x38,0x47,0x49,0x4f,0x51,0x52,0x53,0x45,0x48,\r
316         0x50,0x4b,0x4d,0x00\r
317                                         },\r
318                                         *ExtScanNames[] =       // Names corresponding to ExtScanCodes\r
319                                         {\r
320         "Esc","BkSp","Tab","Ctrl","LShft","Space","CapsLk","F1","F2","F3","F4",\r
321         "F5","F6","F7","F8","F9","F10","F11","F12","ScrlLk","Enter","RShft",\r
322         "PrtSc","Alt","Home","PgUp","End","PgDn","Ins","Del","NumLk","Up",\r
323         "Down","Left","Right",""\r
324                                         };\r
325 \r
326 \r
327 ////////////////////////////////////////////////////////////////////\r
328 //\r
329 // Wolfenstein Control Panel!  Ta Da!\r
330 //\r
331 ////////////////////////////////////////////////////////////////////\r
332 void US_ControlPanel(byte scancode)\r
333 {\r
334         int which,i,start;\r
335 \r
336 \r
337         if (ingame)\r
338                 if (CP_CheckQuick(scancode))\r
339                         return;\r
340 \r
341         StartCPMusic(MENUSONG);\r
342         SetupControlPanel();\r
343 \r
344         //\r
345         // F-KEYS FROM WITHIN GAME\r
346         //\r
347         switch(scancode)\r
348         {\r
349 #ifndef SPEAR\r
350                 case sc_F1:\r
351                         #ifdef SPEAR\r
352                         BossKey();\r
353                         #else\r
354                         #ifdef GOODTIMES\r
355                         BossKey();\r
356                         #else\r
357                         HelpScreens();\r
358                         #endif\r
359                         #endif\r
360                         goto finishup;\r
361 #endif\r
362                 case sc_F2:\r
363                         CP_SaveGame(0);\r
364                         goto finishup;\r
365 \r
366                 case sc_F3:\r
367                         CP_LoadGame(0);\r
368                         goto finishup;\r
369 \r
370                 case sc_F4:\r
371                         CP_Sound();\r
372                         goto finishup;\r
373 \r
374                 case sc_F5:\r
375                         CP_ChangeView();\r
376                         goto finishup;\r
377 \r
378                 case sc_F6:\r
379                         CP_Control();\r
380                         goto finishup;\r
381 \r
382                 finishup:\r
383                         CleanupControlPanel();\r
384                         #ifdef SPEAR\r
385                         UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
386                         #endif\r
387                         return;\r
388         }\r
389 \r
390 #ifdef SPEAR\r
391         CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
392 #endif\r
393 \r
394         DrawMainMenu();\r
395         MenuFadeIn();\r
396         StartGame=0;\r
397 \r
398         //\r
399         // MAIN MENU LOOP\r
400         //\r
401         do\r
402         {\r
403                 which=HandleMenu(&MainItems,&MainMenu[0],NULL);\r
404 \r
405                 #ifdef SPEAR\r
406                 #ifndef SPEARDEMO\r
407                 //\r
408                 // EASTER EGG FOR SPEAR OF DESTINY!\r
409                 //\r
410                 if (Keyboard[sc_I] && Keyboard[sc_D])\r
411                 {\r
412                         VW_FadeOut();\r
413                         StartCPMusic (XJAZNAZI_MUS);\r
414                         UnCacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
415                         UnCacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
416                         MM_SortMem ();\r
417                         ClearMemory ();\r
418 \r
419 \r
420                         CA_CacheGrChunk (IDGUYS1PIC);\r
421                         VWB_DrawPic(0,0,IDGUYS1PIC);\r
422                         UNCACHEGRCHUNK(IDGUYS1PIC);\r
423 \r
424                         CA_CacheGrChunk (IDGUYS2PIC);\r
425                         VWB_DrawPic(0,80,IDGUYS2PIC);\r
426                         UNCACHEGRCHUNK(IDGUYS2PIC);\r
427 \r
428                         VW_UpdateScreen();\r
429 \r
430                         CA_CacheGrChunk (IDGUYSPALETTE);\r
431                         VL_FadeIn(0,255,grsegs[IDGUYSPALETTE],30);\r
432                         UNCACHEGRCHUNK(IDGUYSPALETTE);\r
433 \r
434                         while (Keyboard[sc_I] || Keyboard[sc_D]);\r
435                         IN_ClearKeysDown();\r
436                         IN_Ack();\r
437 \r
438                         VW_FadeOut();\r
439 \r
440                         CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
441                         CacheLump(OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
442                         DrawMainMenu();\r
443                         StartCPMusic (MENUSONG);\r
444                         MenuFadeIn();\r
445                 }\r
446                 #endif\r
447                 #endif\r
448 \r
449                 switch(which)\r
450                 {\r
451                         case viewscores:\r
452                                 if (MainMenu[viewscores].routine == NULL)\r
453                                         if (CP_EndGame())\r
454                                                 StartGame=1;\r
455 \r
456                                 DrawMainMenu();\r
457                                 MenuFadeIn();\r
458                                 break;\r
459 \r
460                         case backtodemo:\r
461                                 #ifdef SPEAR\r
462                                 if (!ingame)\r
463                                 {\r
464                                         //\r
465                                         // DEALLOCATE ALL SOUNDS!\r
466                                         //\r
467                                         switch (SoundMode)\r
468                                         {\r
469                                                 case sdm_PC:\r
470                                                         start = STARTPCSOUNDS;\r
471                                                         break;\r
472                                                 case sdm_AdLib:\r
473                                                         start = STARTADLIBSOUNDS;\r
474                                                         break;\r
475                                         }\r
476 \r
477                                         if (SoundMode != sdm_Off)\r
478                                                 for (i=0;i<NUMSOUNDS;i++,start++)\r
479                                                         if (audiosegs[start])\r
480                                                                 MM_SetPurge (&(memptr)audiosegs[start],3);              // make purgable\r
481                                 }\r
482                                 #endif\r
483 \r
484                                 MM_SortMem();\r
485                                 StartGame=1;\r
486                                 if (!ingame)\r
487                                         StartCPMusic(INTROSONG);\r
488                                 VL_FadeOut(0,255,0,0,0,10);\r
489                                 break;\r
490 \r
491                         case -1:\r
492                         case quit:\r
493                                 CP_Quit();\r
494                                 break;\r
495 \r
496                         default:\r
497                                 if (!StartGame)\r
498                                 {\r
499                                         DrawMainMenu();\r
500                                         MenuFadeIn();\r
501                                 }\r
502                 }\r
503 \r
504         //\r
505         // "EXIT OPTIONS" OR "NEW GAME" EXITS\r
506         //\r
507         } while(!StartGame);\r
508 \r
509         //\r
510         // DEALLOCATE EVERYTHING\r
511         //\r
512         CleanupControlPanel();\r
513 \r
514         //\r
515         // CHANGE MAINMENU ITEM\r
516         //\r
517         if (startgame || loadedgame)\r
518         {\r
519                 #pragma warn -sus\r
520                 MainMenu[viewscores].routine = NULL;\r
521                 #ifndef JAPAN\r
522                 _fstrcpy(MainMenu[viewscores].string,STR_EG);\r
523                 #endif\r
524                 #pragma warn +sus\r
525         }\r
526 \r
527         // RETURN/START GAME EXECUTION\r
528 \r
529 #ifdef SPEAR\r
530         UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
531         MM_SortMem ();\r
532 #endif\r
533 }\r
534 \r
535 \r
536 ////////////////////////\r
537 //\r
538 // DRAW MAIN MENU SCREEN\r
539 //\r
540 void DrawMainMenu(void)\r
541 {\r
542 #ifdef JAPAN\r
543         CA_CacheScreen(S_OPTIONSPIC);\r
544 #else\r
545         ClearMScreen();\r
546 \r
547         VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
548         DrawStripes(10);\r
549         VWB_DrawPic(84,0,C_OPTIONSPIC);\r
550 \r
551         #ifdef SPANISH\r
552         DrawWindow(MENU_X-8,MENU_Y-3,MENU_W+8,MENU_H,BKGDCOLOR);\r
553         #else\r
554         DrawWindow(MENU_X-8,MENU_Y-3,MENU_W,MENU_H,BKGDCOLOR);\r
555         #endif\r
556 #endif\r
557 \r
558         //\r
559         // CHANGE "GAME" AND "DEMO"\r
560         //\r
561         if (ingame)\r
562         {\r
563                 #ifndef JAPAN\r
564 \r
565                 #ifdef SPANISH\r
566                 _fstrcpy(&MainMenu[backtodemo].string,STR_GAME);\r
567                 #else\r
568                 _fstrcpy(&MainMenu[backtodemo].string[8],STR_GAME);\r
569                 #endif\r
570 \r
571                 #else\r
572                 CA_CacheGrChunk(C_MRETGAMEPIC);\r
573                 VWB_DrawPic(12*8,20*8,C_MRETGAMEPIC);\r
574                 UNCACHEGRCHUNK(C_MRETGAMEPIC);\r
575                 CA_CacheGrChunk(C_MENDGAMEPIC);\r
576                 VWB_DrawPic(12*8,18*8,C_MENDGAMEPIC);\r
577                 UNCACHEGRCHUNK(C_MENDGAMEPIC);\r
578                 #endif\r
579                 MainMenu[backtodemo].active=2;\r
580         }\r
581         else\r
582         {\r
583                 #ifndef JAPAN\r
584                 #ifdef SPANISH\r
585                 _fstrcpy(&MainMenu[backtodemo].string,STR_BD);\r
586                 #else\r
587                 _fstrcpy(&MainMenu[backtodemo].string[8],STR_DEMO);\r
588                 #endif\r
589                 #else\r
590                 CA_CacheGrChunk(C_MRETDEMOPIC);\r
591                 VWB_DrawPic(12*8,20*8,C_MRETDEMOPIC);\r
592                 UNCACHEGRCHUNK(C_MRETDEMOPIC);\r
593                 CA_CacheGrChunk(C_MSCORESPIC);\r
594                 VWB_DrawPic(12*8,18*8,C_MSCORESPIC);\r
595                 UNCACHEGRCHUNK(C_MSCORESPIC);\r
596                 #endif\r
597                 MainMenu[backtodemo].active=1;\r
598         }\r
599 \r
600         DrawMenu(&MainItems,&MainMenu[0]);\r
601         VW_UpdateScreen();\r
602 }\r
603 \r
604 #ifndef GOODTIMES\r
605 #ifndef SPEAR\r
606 ////////////////////////////////////////////////////////////////////\r
607 //\r
608 // READ THIS!\r
609 //\r
610 ////////////////////////////////////////////////////////////////////\r
611 void CP_ReadThis(void)\r
612 {\r
613         StartCPMusic(CORNER_MUS);\r
614         HelpScreens();\r
615         StartCPMusic(MENUSONG);\r
616 }\r
617 #endif\r
618 #endif\r
619 \r
620 #ifndef SPEAR\r
621 #ifndef GOODTIMES\r
622 #else\r
623 ////////////////////////////////////////////////////////////////////\r
624 //\r
625 // BOSS KEY\r
626 //\r
627 ////////////////////////////////////////////////////////////////////\r
628 void BossKey(void)\r
629 {\r
630         SD_MusicOff();\r
631         _AX = 3;\r
632         geninterrupt(0x10);\r
633         printf("C>");\r
634         while (!Keyboard[sc_Escape])\r
635         IN_ClearKeysDown();\r
636 \r
637         SD_MusicOn();\r
638         VL_SetVGAPlaneMode ();\r
639         VL_TestPaletteSet ();\r
640         VL_SetPalette (&gamepal);\r
641         LoadLatchMem();\r
642 }\r
643 #endif\r
644 #endif\r
645 \r
646 ////////////////////////////////////////////////////////////////////\r
647 //\r
648 // CHECK QUICK-KEYS & QUIT (WHILE IN A GAME)\r
649 //\r
650 ////////////////////////////////////////////////////////////////////\r
651 int CP_CheckQuick(unsigned scancode)\r
652 {\r
653         switch(scancode)\r
654         {\r
655                 //\r
656                 // END GAME\r
657                 //\r
658                 case sc_F7:\r
659                         CA_CacheGrChunk(STARTFONT+1);\r
660 \r
661                         WindowH=160;\r
662                         #ifdef JAPAN\r
663                         if (GetYorN(7,8,C_JAPQUITPIC))\r
664                         #else\r
665                         if (Confirm(ENDGAMESTR))\r
666                         #endif\r
667                         {\r
668                                 playstate = ex_died;\r
669                                 pickquick = gamestate.lives = 0;\r
670                         }\r
671 \r
672                         DrawAllPlayBorder();\r
673                         WindowH=200;\r
674                         fontnumber=0;\r
675                         MainMenu[savegame].active = 0;\r
676                         return 1;\r
677 \r
678                 //\r
679                 // QUICKSAVE\r
680                 //\r
681                 case sc_F8:\r
682                         if (SaveGamesAvail[LSItems.curpos] && pickquick)\r
683                         {\r
684                                 CA_CacheGrChunk(STARTFONT+1);\r
685                                 fontnumber = 1;\r
686                                 Message(STR_SAVING"...");\r
687                                 CP_SaveGame(1);\r
688                                 fontnumber=0;\r
689                         }\r
690                         else\r
691                         {\r
692                                 #ifndef SPEAR\r
693                                 CA_CacheGrChunk(STARTFONT+1);\r
694                                 CA_CacheGrChunk(C_CURSOR1PIC);\r
695                                 CA_CacheGrChunk(C_CURSOR2PIC);\r
696                                 CA_CacheGrChunk(C_DISKLOADING1PIC);\r
697                                 CA_CacheGrChunk(C_DISKLOADING2PIC);\r
698                                 CA_CacheGrChunk(C_SAVEGAMEPIC);\r
699                                 CA_CacheGrChunk(C_MOUSELBACKPIC);\r
700                                 #else\r
701                                 CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
702                                 CA_CacheGrChunk(C_CURSOR1PIC);\r
703                                 #endif\r
704 \r
705                                 VW_FadeOut ();\r
706 \r
707                                 StartCPMusic(MENUSONG);\r
708                                 pickquick=CP_SaveGame(0);\r
709 \r
710                                 SETFONTCOLOR(0,15);\r
711                                 IN_ClearKeysDown();\r
712                                 DrawPlayScreen ();\r
713 \r
714                                 if (!startgame && !loadedgame)\r
715                                 {\r
716                                         VW_FadeIn ();\r
717                                         StartMusic ();\r
718                                 }\r
719 \r
720                                 if (loadedgame)\r
721                                         playstate = ex_abort;\r
722                                 lasttimecount = TimeCount;\r
723 \r
724                                 if (MousePresent)\r
725                                         Mouse(MDelta);  // Clear accumulated mouse movement\r
726 \r
727                                 PM_CheckMainMem ();\r
728 \r
729                                 #ifndef SPEAR\r
730                                 UNCACHEGRCHUNK(C_CURSOR1PIC);\r
731                                 UNCACHEGRCHUNK(C_CURSOR2PIC);\r
732                                 UNCACHEGRCHUNK(C_DISKLOADING1PIC);\r
733                                 UNCACHEGRCHUNK(C_DISKLOADING2PIC);\r
734                                 UNCACHEGRCHUNK(C_SAVEGAMEPIC);\r
735                                 UNCACHEGRCHUNK(C_MOUSELBACKPIC);\r
736                                 #else\r
737                                 UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
738                                 #endif\r
739                         }\r
740                         return 1;\r
741 \r
742                 //\r
743                 // QUICKLOAD\r
744                 //\r
745                 case sc_F9:\r
746                         if (SaveGamesAvail[LSItems.curpos] && pickquick)\r
747                         {\r
748                                 char string[100]=STR_LGC;\r
749 \r
750 \r
751                                 CA_CacheGrChunk(STARTFONT+1);\r
752                                 fontnumber = 1;\r
753 \r
754                                 strcat(string,SaveGameNames[LSItems.curpos]);\r
755                                 strcat(string,"\"?");\r
756 \r
757                                 if (Confirm(string))\r
758                                         CP_LoadGame(1);\r
759 \r
760                                 DrawAllPlayBorder();\r
761                                 fontnumber=0;\r
762                         }\r
763                         else\r
764                         {\r
765                                 #ifndef SPEAR\r
766                                 CA_CacheGrChunk(STARTFONT+1);\r
767                                 CA_CacheGrChunk(C_CURSOR1PIC);\r
768                                 CA_CacheGrChunk(C_CURSOR2PIC);\r
769                                 CA_CacheGrChunk(C_DISKLOADING1PIC);\r
770                                 CA_CacheGrChunk(C_DISKLOADING2PIC);\r
771                                 CA_CacheGrChunk(C_LOADGAMEPIC);\r
772                                 CA_CacheGrChunk(C_MOUSELBACKPIC);\r
773                                 #else\r
774                                 CA_CacheGrChunk(C_CURSOR1PIC);\r
775                                 CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
776                                 #endif\r
777 \r
778                                 VW_FadeOut ();\r
779 \r
780                                 StartCPMusic(MENUSONG);\r
781                                 pickquick=CP_LoadGame(0);\r
782 \r
783                                 SETFONTCOLOR(0,15);\r
784                                 IN_ClearKeysDown();\r
785                                 DrawPlayScreen ();\r
786 \r
787                                 if (!startgame && !loadedgame)\r
788                                 {\r
789                                         VW_FadeIn ();\r
790                                         StartMusic ();\r
791                                 }\r
792 \r
793                                 if (loadedgame)\r
794                                         playstate = ex_abort;\r
795 \r
796                                 lasttimecount = TimeCount;\r
797 \r
798                                 if (MousePresent)\r
799                                         Mouse(MDelta);  // Clear accumulated mouse movement\r
800                                 PM_CheckMainMem ();\r
801 \r
802                                 #ifndef SPEAR\r
803                                 UNCACHEGRCHUNK(C_CURSOR1PIC);\r
804                                 UNCACHEGRCHUNK(C_CURSOR2PIC);\r
805                                 UNCACHEGRCHUNK(C_DISKLOADING1PIC);\r
806                                 UNCACHEGRCHUNK(C_DISKLOADING2PIC);\r
807                                 UNCACHEGRCHUNK(C_LOADGAMEPIC);\r
808                                 UNCACHEGRCHUNK(C_MOUSELBACKPIC);\r
809                                 #else\r
810                                 UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
811                                 #endif\r
812                         }\r
813                         return 1;\r
814 \r
815                 //\r
816                 // QUIT\r
817                 //\r
818                 case sc_F10:\r
819                         CA_CacheGrChunk(STARTFONT+1);\r
820 \r
821                         WindowX=WindowY=0;\r
822                         WindowW=320;\r
823                         WindowH=160;\r
824                         #ifdef JAPAN\r
825                         if (GetYorN(7,8,C_QUITMSGPIC))\r
826                         #else\r
827                                 #ifdef SPANISH\r
828                         if (Confirm(ENDGAMESTR))\r
829                                 #else\r
830                         if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))\r
831                                 #endif\r
832                         #endif\r
833                         {\r
834                                 int i;\r
835 \r
836 \r
837                                 VW_UpdateScreen();\r
838                                 SD_MusicOff();\r
839                                 SD_StopSound();\r
840                                 MenuFadeOut();\r
841 \r
842                                 //\r
843                                 // SHUT-UP THE ADLIB\r
844                                 //\r
845                                 for (i=1;i<=0xf5;i++)\r
846                                         alOut(i,0);\r
847                                 Quit(NULL);\r
848                         }\r
849 \r
850                         DrawAllPlayBorder();\r
851                         WindowH=200;\r
852                         fontnumber=0;\r
853                         return 1;\r
854                 }\r
855 \r
856         return 0;\r
857 }\r
858 \r
859 \r
860 ////////////////////////////////////////////////////////////////////\r
861 //\r
862 // END THE CURRENT GAME\r
863 //\r
864 ////////////////////////////////////////////////////////////////////\r
865 int CP_EndGame(void)\r
866 {\r
867 #ifdef JAPAN\r
868         if (!GetYorN(7,8,C_JAPQUITPIC))\r
869 #else\r
870         if (!Confirm(ENDGAMESTR))\r
871 #endif\r
872                 return 0;\r
873 \r
874         pickquick = gamestate.lives = 0;\r
875         playstate = ex_died;\r
876 \r
877         #pragma warn -sus\r
878         MainMenu[savegame].active = 0;\r
879         MainMenu[viewscores].routine=CP_ViewScores;\r
880         #ifndef JAPAN\r
881         _fstrcpy(MainMenu[viewscores].string,STR_VS);\r
882         #endif\r
883         #pragma warn +sus\r
884 \r
885         return 1;\r
886 }\r
887 \r
888 \r
889 ////////////////////////////////////////////////////////////////////\r
890 //\r
891 // VIEW THE HIGH SCORES\r
892 //\r
893 ////////////////////////////////////////////////////////////////////\r
894 void CP_ViewScores(void)\r
895 {\r
896         fontnumber=0;\r
897 \r
898 #ifdef SPEAR\r
899         UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
900         StartCPMusic (XAWARD_MUS);\r
901 #else\r
902         StartCPMusic (ROSTER_MUS);\r
903 #endif\r
904 \r
905         DrawHighScores ();\r
906         VW_UpdateScreen ();\r
907         MenuFadeIn();\r
908         fontnumber=1;\r
909 \r
910         IN_Ack();\r
911 \r
912         StartCPMusic(MENUSONG);\r
913         MenuFadeOut();\r
914 \r
915 #ifdef SPEAR\r
916         CacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
917         CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
918 #endif\r
919 }\r
920 \r
921 \r
922 ////////////////////////////////////////////////////////////////////\r
923 //\r
924 // START A NEW GAME\r
925 //\r
926 ////////////////////////////////////////////////////////////////////\r
927 void CP_NewGame(void)\r
928 {\r
929         int which,episode;\r
930 \r
931 #ifdef SPEAR\r
932         UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
933 #endif\r
934 \r
935 \r
936 #ifndef SPEAR\r
937 firstpart:\r
938 \r
939         DrawNewEpisode();\r
940         do\r
941         {\r
942                 which=HandleMenu(&NewEitems,&NewEmenu[0],NULL);\r
943                 switch(which)\r
944                 {\r
945                         case -1:\r
946                                 MenuFadeOut();\r
947                                 return;\r
948 \r
949                         default:\r
950                                 if (!EpisodeSelect[which/2])\r
951                                 {\r
952                                         SD_PlaySound (NOWAYSND);\r
953                                         Message("Please select \"Read This!\"\n"\r
954                                                         "from the Options menu to\n"\r
955                                                         "find out how to order this\n"\r
956                                                         "episode from Apogee.");\r
957                                         IN_ClearKeysDown();\r
958                                         IN_Ack();\r
959                                         DrawNewEpisode();\r
960                                         which = 0;\r
961                                 }\r
962                                 else\r
963                                 {\r
964                                         episode = which/2;\r
965                                         which = 1;\r
966                                 }\r
967                                 break;\r
968                 }\r
969 \r
970         } while (!which);\r
971 \r
972         ShootSnd();\r
973 \r
974         //\r
975         // ALREADY IN A GAME?\r
976         //\r
977         if (ingame)\r
978                 #ifdef JAPAN\r
979                 if (!GetYorN(7,8,C_JAPNEWGAMEPIC))\r
980                 #else\r
981                 if (!Confirm(CURGAME))\r
982                 #endif\r
983                 {\r
984                         MenuFadeOut();\r
985                         return;\r
986                 }\r
987 \r
988         MenuFadeOut();\r
989 \r
990 #else\r
991         episode = 0;\r
992 \r
993         //\r
994         // ALREADY IN A GAME?\r
995         //\r
996         CacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);\r
997         DrawNewGame();\r
998         if (ingame)\r
999                 if (!Confirm(CURGAME))\r
1000                 {\r
1001                         MenuFadeOut();\r
1002                         UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);\r
1003                         CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1004                         return;\r
1005                 }\r
1006 \r
1007 #endif\r
1008 \r
1009         DrawNewGame();\r
1010         which=HandleMenu(&NewItems,&NewMenu[0],DrawNewGameDiff);\r
1011         if (which<0)\r
1012         {\r
1013                 MenuFadeOut();\r
1014                 #ifndef SPEAR\r
1015                 goto firstpart;\r
1016                 #else\r
1017                 UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);\r
1018                 CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1019                 return;\r
1020                 #endif\r
1021         }\r
1022 \r
1023         ShootSnd();\r
1024         NewGame(which,episode);\r
1025         StartGame=1;\r
1026         MenuFadeOut();\r
1027 \r
1028         //\r
1029         // CHANGE "READ THIS!" TO NORMAL COLOR\r
1030         //\r
1031         #ifndef SPEAR\r
1032         #ifndef GOODTIMES\r
1033         MainMenu[readthis].active=1;\r
1034         #endif\r
1035         #endif\r
1036 \r
1037         pickquick = 0;\r
1038 \r
1039 #ifdef SPEAR\r
1040         UnCacheLump (NEWGAME_LUMP_START,NEWGAME_LUMP_END);\r
1041         CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1042 #endif\r
1043 }\r
1044 \r
1045 \r
1046 #ifndef SPEAR\r
1047 /////////////////////\r
1048 //\r
1049 // DRAW NEW EPISODE MENU\r
1050 //\r
1051 void DrawNewEpisode(void)\r
1052 {\r
1053         int i;\r
1054 \r
1055 #ifdef JAPAN\r
1056         CA_CacheScreen(S_EPISODEPIC);\r
1057 #else\r
1058         ClearMScreen();\r
1059         VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
1060 \r
1061         DrawWindow(NE_X-4,NE_Y-4,NE_W+8,NE_H+8,BKGDCOLOR);\r
1062         SETFONTCOLOR(READHCOLOR,BKGDCOLOR);\r
1063         PrintY=2;\r
1064         WindowX=0;\r
1065         #ifdef SPANISH\r
1066         US_CPrint("Cual episodio jugar?");\r
1067         #else\r
1068         US_CPrint("Which episode to play?");\r
1069         #endif\r
1070 #endif\r
1071 \r
1072         SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
1073         DrawMenu(&NewEitems,&NewEmenu[0]);\r
1074 \r
1075         for (i=0;i<6;i++)\r
1076                 VWB_DrawPic(NE_X+32,NE_Y+i*26,C_EPISODE1PIC+i);\r
1077 \r
1078         VW_UpdateScreen();\r
1079         MenuFadeIn();\r
1080         WaitKeyUp();\r
1081 }\r
1082 #endif\r
1083 \r
1084 /////////////////////\r
1085 //\r
1086 // DRAW NEW GAME MENU\r
1087 //\r
1088 void DrawNewGame(void)\r
1089 {\r
1090 #ifdef JAPAN\r
1091         CA_CacheScreen(S_SKILLPIC);\r
1092 #else\r
1093         ClearMScreen();\r
1094         VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
1095 \r
1096         SETFONTCOLOR(READHCOLOR,BKGDCOLOR);\r
1097         PrintX=NM_X+20;\r
1098         PrintY=NM_Y-32;\r
1099 \r
1100 #ifndef SPEAR\r
1101         #ifdef SPANISH\r
1102         US_Print("Eres macho?");\r
1103         #else\r
1104         US_Print("How tough are you?");\r
1105         #endif\r
1106 #else\r
1107         VWB_DrawPic (PrintX,PrintY,C_HOWTOUGHPIC);\r
1108 #endif\r
1109 \r
1110         DrawWindow(NM_X-5,NM_Y-10,NM_W,NM_H,BKGDCOLOR);\r
1111 #endif\r
1112 \r
1113         DrawMenu(&NewItems,&NewMenu[0]);\r
1114         DrawNewGameDiff(NewItems.curpos);\r
1115         VW_UpdateScreen();\r
1116         MenuFadeIn();\r
1117         WaitKeyUp();\r
1118 }\r
1119 \r
1120 \r
1121 ////////////////////////\r
1122 //\r
1123 // DRAW NEW GAME GRAPHIC\r
1124 //\r
1125 void DrawNewGameDiff(int w)\r
1126 {\r
1127         VWB_DrawPic(NM_X+185,NM_Y+7,w+C_BABYMODEPIC);\r
1128 }\r
1129 \r
1130 \r
1131 ////////////////////////////////////////////////////////////////////\r
1132 //\r
1133 // HANDLE SOUND MENU\r
1134 //\r
1135 ////////////////////////////////////////////////////////////////////\r
1136 void CP_Sound(void)\r
1137 {\r
1138         int which,i;\r
1139 \r
1140 \r
1141 #ifdef SPEAR\r
1142         UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1143         CacheLump (SOUND_LUMP_START,SOUND_LUMP_END);\r
1144 #endif\r
1145 \r
1146         DrawSoundMenu();\r
1147         MenuFadeIn();\r
1148         WaitKeyUp();\r
1149 \r
1150         do\r
1151         {\r
1152                 which=HandleMenu(&SndItems,&SndMenu[0],NULL);\r
1153                 //\r
1154                 // HANDLE MENU CHOICES\r
1155                 //\r
1156                 switch(which)\r
1157                 {\r
1158                         //\r
1159                         // SOUND EFFECTS\r
1160                         //\r
1161                         case 0:\r
1162                                 if (SoundMode!=sdm_Off)\r
1163                                 {\r
1164                                         SD_WaitSoundDone();\r
1165                                         SD_SetSoundMode(sdm_Off);\r
1166                                         DrawSoundMenu();\r
1167                                 }\r
1168                                 break;\r
1169                         case 1:\r
1170                                 if (SoundMode!=sdm_PC)\r
1171                                 {\r
1172                                         SD_WaitSoundDone();\r
1173                                         SD_SetSoundMode(sdm_PC);\r
1174                                         CA_LoadAllSounds();\r
1175                                         DrawSoundMenu();\r
1176                                         ShootSnd();\r
1177                                 }\r
1178                                 break;\r
1179                         case 2:\r
1180                                 if (SoundMode!=sdm_AdLib)\r
1181                                 {\r
1182                                         SD_WaitSoundDone();\r
1183                                         SD_SetSoundMode(sdm_AdLib);\r
1184                                         CA_LoadAllSounds();\r
1185                                         DrawSoundMenu();\r
1186                                         ShootSnd();\r
1187                                 }\r
1188                                 break;\r
1189 \r
1190                         //\r
1191                         // DIGITIZED SOUND\r
1192                         //\r
1193                         case 5:\r
1194                                 if (DigiMode!=sds_Off)\r
1195                                 {\r
1196                                         SD_SetDigiDevice(sds_Off);\r
1197                                         DrawSoundMenu();\r
1198                                 }\r
1199                                 break;\r
1200                         case 6:\r
1201                                 if (DigiMode!=sds_SoundSource)\r
1202                                 {\r
1203                                         SD_SetDigiDevice(sds_SoundSource);\r
1204                                         DrawSoundMenu();\r
1205                                         ShootSnd();\r
1206                                 }\r
1207                                 break;\r
1208                         case 7:\r
1209                                 if (DigiMode!=sds_SoundBlaster)\r
1210                                 {\r
1211                                         SD_SetDigiDevice(sds_SoundBlaster);\r
1212                                         DrawSoundMenu();\r
1213                                         ShootSnd();\r
1214                                 }\r
1215                                 break;\r
1216 \r
1217                         //\r
1218                         // MUSIC\r
1219                         //\r
1220                         case 10:\r
1221                                 if (MusicMode!=smm_Off)\r
1222                                 {\r
1223                                         SD_SetMusicMode(smm_Off);\r
1224                                         DrawSoundMenu();\r
1225                                         ShootSnd();\r
1226                                 }\r
1227                                 break;\r
1228                         case 11:\r
1229                                 if (MusicMode!=smm_AdLib)\r
1230                                 {\r
1231                                         SD_SetMusicMode(smm_AdLib);\r
1232                                         DrawSoundMenu();\r
1233                                         ShootSnd();\r
1234                                         StartCPMusic(MENUSONG);\r
1235                                 }\r
1236                                 break;\r
1237                 }\r
1238         } while(which>=0);\r
1239 \r
1240         MenuFadeOut();\r
1241 \r
1242 #ifdef SPEAR\r
1243         UnCacheLump (SOUND_LUMP_START,SOUND_LUMP_END);\r
1244         CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1245 #endif\r
1246 }\r
1247 \r
1248 \r
1249 //////////////////////\r
1250 //\r
1251 // DRAW THE SOUND MENU\r
1252 //\r
1253 void DrawSoundMenu(void)\r
1254 {\r
1255         int i,on;\r
1256 \r
1257 \r
1258 #ifdef JAPAN\r
1259         CA_CacheScreen(S_SOUNDPIC);\r
1260 #else\r
1261         //\r
1262         // DRAW SOUND MENU\r
1263         //\r
1264         ClearMScreen();\r
1265         VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
1266 \r
1267         DrawWindow(SM_X-8,SM_Y1-3,SM_W,SM_H1,BKGDCOLOR);\r
1268         DrawWindow(SM_X-8,SM_Y2-3,SM_W,SM_H2,BKGDCOLOR);\r
1269         DrawWindow(SM_X-8,SM_Y3-3,SM_W,SM_H3,BKGDCOLOR);\r
1270 #endif\r
1271 \r
1272         //\r
1273         // IF NO ADLIB, NON-CHOOSENESS!\r
1274         //\r
1275         if (!AdLibPresent && !SoundBlasterPresent)\r
1276         {\r
1277                 SndMenu[2].active=SndMenu[10].active=SndMenu[11].active=0;\r
1278         }\r
1279 \r
1280         if (!SoundSourcePresent)\r
1281                 SndMenu[6].active=0;\r
1282 \r
1283         if (!SoundBlasterPresent)\r
1284                 SndMenu[7].active=0;\r
1285 \r
1286         if (!SoundSourcePresent && !SoundBlasterPresent)\r
1287                 SndMenu[5].active=0;\r
1288 \r
1289         DrawMenu(&SndItems,&SndMenu[0]);\r
1290 #ifndef JAPAN\r
1291         VWB_DrawPic(100,SM_Y1-20,C_FXTITLEPIC);\r
1292         VWB_DrawPic(100,SM_Y2-20,C_DIGITITLEPIC);\r
1293         VWB_DrawPic(100,SM_Y3-20,C_MUSICTITLEPIC);\r
1294 #endif\r
1295 \r
1296         for (i=0;i<SndItems.amount;i++)\r
1297 #ifdef JAPAN\r
1298                 if (i!=3 && i!=4 && i!=8 && i!=9)\r
1299 #else\r
1300                 if (SndMenu[i].string[0])\r
1301 #endif\r
1302                 {\r
1303                         //\r
1304                         // DRAW SELECTED/NOT SELECTED GRAPHIC BUTTONS\r
1305                         //\r
1306                         on=0;\r
1307                         switch(i)\r
1308                         {\r
1309                                 //\r
1310                                 // SOUND EFFECTS\r
1311                                 //\r
1312                                 case 0: if (SoundMode==sdm_Off) on=1; break;\r
1313                                 case 1: if (SoundMode==sdm_PC) on=1; break;\r
1314                                 case 2: if (SoundMode==sdm_AdLib) on=1; break;\r
1315 \r
1316                                 //\r
1317                                 // DIGITIZED SOUND\r
1318                                 //\r
1319                                 case 5: if (DigiMode==sds_Off) on=1; break;\r
1320                                 case 6: if (DigiMode==sds_SoundSource) on=1; break;\r
1321                                 case 7: if (DigiMode==sds_SoundBlaster) on=1; break;\r
1322 \r
1323                                 //\r
1324                                 // MUSIC\r
1325                                 //\r
1326                                 case 10: if (MusicMode==smm_Off) on=1; break;\r
1327                                 case 11: if (MusicMode==smm_AdLib) on=1; break;\r
1328                         }\r
1329 \r
1330                         if (on)\r
1331                                 VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_SELECTEDPIC);\r
1332                         else\r
1333                                 VWB_DrawPic(SM_X+24,SM_Y1+i*13+2,C_NOTSELECTEDPIC);\r
1334                 }\r
1335 \r
1336         DrawMenuGun(&SndItems);\r
1337         VW_UpdateScreen();\r
1338 }\r
1339 \r
1340 \r
1341 //\r
1342 // DRAW LOAD/SAVE IN PROGRESS\r
1343 //\r
1344 void DrawLSAction(int which)\r
1345 {\r
1346         #define LSA_X   96\r
1347         #define LSA_Y   80\r
1348         #define LSA_W   130\r
1349         #define LSA_H   42\r
1350 \r
1351         DrawWindow(LSA_X,LSA_Y,LSA_W,LSA_H,TEXTCOLOR);\r
1352         DrawOutline(LSA_X,LSA_Y,LSA_W,LSA_H,0,HIGHLIGHT);\r
1353         VWB_DrawPic(LSA_X+8,LSA_Y+5,C_DISKLOADING1PIC);\r
1354 \r
1355         fontnumber=1;\r
1356         SETFONTCOLOR(0,TEXTCOLOR);\r
1357         PrintX=LSA_X+46;\r
1358         PrintY=LSA_Y+13;\r
1359 \r
1360         if (!which)\r
1361                 US_Print(STR_LOADING"...");\r
1362         else\r
1363                 US_Print(STR_SAVING"...");\r
1364 \r
1365         VW_UpdateScreen();\r
1366 }\r
1367 \r
1368 \r
1369 ////////////////////////////////////////////////////////////////////\r
1370 //\r
1371 // LOAD SAVED GAMES\r
1372 //\r
1373 ////////////////////////////////////////////////////////////////////\r
1374 int CP_LoadGame(int quick)\r
1375 {\r
1376         int handle,which,exit=0;\r
1377         char name[13];\r
1378 \r
1379 \r
1380         strcpy(name,SaveName);\r
1381 \r
1382         //\r
1383         // QUICKLOAD?\r
1384         //\r
1385         if (quick)\r
1386         {\r
1387                 which=LSItems.curpos;\r
1388 \r
1389                 if (SaveGamesAvail[which])\r
1390                 {\r
1391                         name[7]=which+'0';\r
1392                         handle=open(name,O_BINARY);\r
1393                         lseek(handle,32,SEEK_SET);\r
1394                         loadedgame=true;\r
1395                         LoadTheGame(handle,0,0);\r
1396                         loadedgame=false;\r
1397                         close(handle);\r
1398 \r
1399                         DrawFace ();\r
1400                         DrawHealth ();\r
1401                         DrawLives ();\r
1402                         DrawLevel ();\r
1403                         DrawAmmo ();\r
1404                         DrawKeys ();\r
1405                         DrawWeapon ();\r
1406                         DrawScore ();\r
1407                         return 1;\r
1408                 }\r
1409         }\r
1410 \r
1411 \r
1412 #ifdef SPEAR\r
1413         UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1414         CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);\r
1415 #endif\r
1416 \r
1417         DrawLoadSaveScreen(0);\r
1418 \r
1419         do\r
1420         {\r
1421                 which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);\r
1422                 if (which>=0 && SaveGamesAvail[which])\r
1423                 {\r
1424                         ShootSnd();\r
1425                         name[7]=which+'0';\r
1426 \r
1427                         handle=open(name,O_BINARY);\r
1428                         lseek(handle,32,SEEK_SET);\r
1429 \r
1430                         DrawLSAction(0);\r
1431                         loadedgame=true;\r
1432 \r
1433                         LoadTheGame(handle,LSA_X+8,LSA_Y+5);\r
1434                         close(handle);\r
1435 \r
1436                         StartGame=1;\r
1437                         ShootSnd();\r
1438                         //\r
1439                         // CHANGE "READ THIS!" TO NORMAL COLOR\r
1440                         //\r
1441 \r
1442                         #ifndef SPEAR\r
1443                         #ifndef GOODTIMES\r
1444                         MainMenu[readthis].active=1;\r
1445                         #endif\r
1446                         #endif\r
1447 \r
1448                         exit=1;\r
1449                         break;\r
1450                 }\r
1451 \r
1452         } while(which>=0);\r
1453 \r
1454         MenuFadeOut();\r
1455 \r
1456 #ifdef SPEAR\r
1457         UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);\r
1458         CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1459 #endif\r
1460 \r
1461         return exit;\r
1462 }\r
1463 \r
1464 \r
1465 ///////////////////////////////////\r
1466 //\r
1467 // HIGHLIGHT CURRENT SELECTED ENTRY\r
1468 //\r
1469 void TrackWhichGame(int w)\r
1470 {\r
1471         static int lastgameon=0;\r
1472 \r
1473         PrintLSEntry(lastgameon,TEXTCOLOR);\r
1474         PrintLSEntry(w,HIGHLIGHT);\r
1475 \r
1476         lastgameon=w;\r
1477 }\r
1478 \r
1479 \r
1480 ////////////////////////////\r
1481 //\r
1482 // DRAW THE LOAD/SAVE SCREEN\r
1483 //\r
1484 void DrawLoadSaveScreen(int loadsave)\r
1485 {\r
1486         #define DISKX   100\r
1487         #define DISKY   0\r
1488 \r
1489         int i;\r
1490 \r
1491 \r
1492         ClearMScreen();\r
1493         fontnumber=1;\r
1494         VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
1495         DrawWindow(LSM_X-10,LSM_Y-5,LSM_W,LSM_H,BKGDCOLOR);\r
1496         DrawStripes(10);\r
1497 \r
1498         if (!loadsave)\r
1499                 VWB_DrawPic(60,0,C_LOADGAMEPIC);\r
1500         else\r
1501                 VWB_DrawPic(60,0,C_SAVEGAMEPIC);\r
1502 \r
1503         for (i=0;i<10;i++)\r
1504                 PrintLSEntry(i,TEXTCOLOR);\r
1505 \r
1506         DrawMenu(&LSItems,&LSMenu[0]);\r
1507         VW_UpdateScreen();\r
1508         MenuFadeIn();\r
1509         WaitKeyUp();\r
1510 }\r
1511 \r
1512 \r
1513 ///////////////////////////////////////////\r
1514 //\r
1515 // PRINT LOAD/SAVE GAME ENTRY W/BOX OUTLINE\r
1516 //\r
1517 void PrintLSEntry(int w,int color)\r
1518 {\r
1519         SETFONTCOLOR(color,BKGDCOLOR);\r
1520         DrawOutline(LSM_X+LSItems.indent,LSM_Y+w*13,LSM_W-LSItems.indent-15,11,color,color);\r
1521         PrintX=LSM_X+LSItems.indent+2;\r
1522         PrintY=LSM_Y+w*13+1;\r
1523         fontnumber=0;\r
1524 \r
1525         if (SaveGamesAvail[w])\r
1526                 US_Print(SaveGameNames[w]);\r
1527         else\r
1528                 US_Print("      - "STR_EMPTY" -");\r
1529 \r
1530         fontnumber=1;\r
1531 }\r
1532 \r
1533 \r
1534 ////////////////////////////////////////////////////////////////////\r
1535 //\r
1536 // SAVE CURRENT GAME\r
1537 //\r
1538 ////////////////////////////////////////////////////////////////////\r
1539 int CP_SaveGame(int quick)\r
1540 {\r
1541         int handle,which,exit=0;\r
1542         unsigned nwritten;\r
1543         char name[13],input[32];\r
1544 \r
1545 \r
1546         strcpy(name,SaveName);\r
1547 \r
1548         //\r
1549         // QUICKSAVE?\r
1550         //\r
1551         if (quick)\r
1552         {\r
1553                 which=LSItems.curpos;\r
1554 \r
1555                 if (SaveGamesAvail[which])\r
1556                 {\r
1557                         name[7]=which+'0';\r
1558                         unlink(name);\r
1559                         handle=creat(name,S_IREAD|S_IWRITE);\r
1560 \r
1561                         strcpy(input,&SaveGameNames[which][0]);\r
1562 \r
1563                         _dos_write(handle,(void far *)input,32,&nwritten);\r
1564                         lseek(handle,32,SEEK_SET);\r
1565                         SaveTheGame(handle,0,0);\r
1566                         close(handle);\r
1567 \r
1568                         return 1;\r
1569                 }\r
1570         }\r
1571 \r
1572 \r
1573 #ifdef SPEAR\r
1574         UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1575         CacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);\r
1576 #endif\r
1577 \r
1578         DrawLoadSaveScreen(1);\r
1579 \r
1580         do\r
1581         {\r
1582                 which=HandleMenu(&LSItems,&LSMenu[0],TrackWhichGame);\r
1583                 if (which>=0)\r
1584                 {\r
1585                         //\r
1586                         // OVERWRITE EXISTING SAVEGAME?\r
1587                         //\r
1588                         if (SaveGamesAvail[which])\r
1589                                 #ifdef JAPAN\r
1590                                 if (!GetYorN(7,8,C_JAPSAVEOVERPIC))\r
1591                                 #else\r
1592                                 if (!Confirm(GAMESVD))\r
1593                                 #endif\r
1594                                 {\r
1595                                         DrawLoadSaveScreen(1);\r
1596                                         continue;\r
1597                                 }\r
1598                                 else\r
1599                                 {\r
1600                                         DrawLoadSaveScreen(1);\r
1601                                         PrintLSEntry(which,HIGHLIGHT);\r
1602                                         VW_UpdateScreen();\r
1603                                 }\r
1604 \r
1605                         ShootSnd();\r
1606 \r
1607                         strcpy(input,&SaveGameNames[which][0]);\r
1608                         name[7]=which+'0';\r
1609 \r
1610                         fontnumber=0;\r
1611                         if (!SaveGamesAvail[which])\r
1612                                 VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSItems.indent-16,10,BKGDCOLOR);\r
1613                         VW_UpdateScreen();\r
1614 \r
1615                         if (US_LineInput(LSM_X+LSItems.indent+2,LSM_Y+which*13+1,input,input,true,31,LSM_W-LSItems.indent-30))\r
1616                         {\r
1617                                 SaveGamesAvail[which]=1;\r
1618                                 strcpy(&SaveGameNames[which][0],input);\r
1619 \r
1620                                 unlink(name);\r
1621                                 handle=creat(name,S_IREAD|S_IWRITE);\r
1622                                 _dos_write(handle,(void far *)input,32,&nwritten);\r
1623                                 lseek(handle,32,SEEK_SET);\r
1624 \r
1625                                 DrawLSAction(1);\r
1626                                 SaveTheGame(handle,LSA_X+8,LSA_Y+5);\r
1627 \r
1628                                 close(handle);\r
1629 \r
1630                                 ShootSnd();\r
1631                                 exit=1;\r
1632                         }\r
1633                         else\r
1634                         {\r
1635                                 VWB_Bar(LSM_X+LSItems.indent+1,LSM_Y+which*13+1,LSM_W-LSItems.indent-16,10,BKGDCOLOR);\r
1636                                 PrintLSEntry(which,HIGHLIGHT);\r
1637                                 VW_UpdateScreen();\r
1638                                 SD_PlaySound(ESCPRESSEDSND);\r
1639                                 continue;\r
1640                         }\r
1641 \r
1642                         fontnumber=1;\r
1643                         break;\r
1644                 }\r
1645 \r
1646         } while(which>=0);\r
1647 \r
1648         MenuFadeOut();\r
1649 \r
1650 #ifdef SPEAR\r
1651         UnCacheLump (LOADSAVE_LUMP_START,LOADSAVE_LUMP_END);\r
1652         CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1653 #endif\r
1654 \r
1655         return exit;\r
1656 }\r
1657 \r
1658 \r
1659 ////////////////////////////////////////////////////////////////////\r
1660 //\r
1661 // CALIBRATE JOYSTICK\r
1662 //\r
1663 ////////////////////////////////////////////////////////////////////\r
1664 int CalibrateJoystick(void)\r
1665 {\r
1666         #define CALX    85\r
1667         #define CALY    40\r
1668         #define CALW    158\r
1669         #define CALH    140\r
1670 \r
1671         unsigned xmin,ymin,xmax,ymax,jb;\r
1672 \r
1673 \r
1674 \r
1675         #ifdef JAPAN\r
1676         VWB_DrawPic(CALX,CALY,C_JOY0PIC);\r
1677         #else\r
1678         DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);\r
1679         DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);\r
1680         SETFONTCOLOR(0,TEXTCOLOR);\r
1681 \r
1682         WindowX = PrintX = CALX;\r
1683         WindowW = CALW;\r
1684         WindowH = CALH;\r
1685         WindowY = PrintY = CALY;\r
1686         US_Print("    "STR_CALIB"\n    "STR_JOYST"\n");\r
1687         VWB_DrawPic(CALX+40,CALY+30,C_JOY1PIC);\r
1688         PrintY = CALY+80;\r
1689         US_Print(STR_MOVEJOY);\r
1690         SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);\r
1691         US_Print("   "STR_ESCEXIT);\r
1692         #endif\r
1693         VW_UpdateScreen();\r
1694 \r
1695         do\r
1696         {\r
1697                 jb=IN_JoyButtons();\r
1698                 if (Keyboard[sc_Escape])\r
1699                         return 0;\r
1700                 #ifndef SPEAR\r
1701                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
1702                         PicturePause();\r
1703                 #endif\r
1704 \r
1705         } while(!(jb&1));\r
1706 \r
1707         SD_PlaySound(SHOOTSND);\r
1708         IN_GetJoyAbs(joystickport,&xmin,&ymin);\r
1709 \r
1710 \r
1711         #ifdef JAPAN\r
1712         VWB_DrawPic(CALX,CALY,C_JOY1PIC);\r
1713         #else\r
1714         DrawWindow(CALX-5,CALY-5,CALW,CALH,TEXTCOLOR);\r
1715         DrawOutline(CALX-5,CALY-5,CALW,CALH,0,HIGHLIGHT);\r
1716         SETFONTCOLOR(0,TEXTCOLOR);\r
1717 \r
1718         PrintX = CALX;\r
1719         PrintY = CALY;\r
1720         US_Print("    "STR_CALIB"\n    "STR_JOYST"\n");\r
1721         VWB_DrawPic(CALX+40,CALY+30,C_JOY2PIC);\r
1722         PrintY = CALY+80;\r
1723         US_Print(STR_MOVEJOY2);\r
1724         SETFONTCOLOR(BKGDCOLOR,TEXTCOLOR);\r
1725         US_Print("   "STR_ESCEXIT);\r
1726         #endif\r
1727         VW_UpdateScreen();\r
1728 \r
1729         do\r
1730         {\r
1731                 jb=IN_JoyButtons();\r
1732                 if (Keyboard[sc_Escape])\r
1733                         return 0;\r
1734                 #ifndef SPEAR\r
1735                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
1736                         PicturePause();\r
1737                 #endif\r
1738         } while(!(jb&2));\r
1739 \r
1740         IN_GetJoyAbs(joystickport,&xmax,&ymax);\r
1741         SD_PlaySound(SHOOTSND);\r
1742 \r
1743         while (IN_JoyButtons());\r
1744 \r
1745         //\r
1746         // ASSIGN ACTUAL VALUES HERE\r
1747         //\r
1748         if ((xmin != xmax) && (ymin != ymax))\r
1749                 IN_SetupJoy(joystickport,xmin,xmax,ymin,ymax);\r
1750         else\r
1751                 return 0;\r
1752 \r
1753         return 1;\r
1754 }\r
1755 \r
1756 \r
1757 ////////////////////////////////////////////////////////////////////\r
1758 //\r
1759 // DEFINE CONTROLS\r
1760 //\r
1761 ////////////////////////////////////////////////////////////////////\r
1762 void CP_Control(void)\r
1763 {\r
1764         #define CTL_SPC 70\r
1765         enum {MOUSEENABLE,JOYENABLE,USEPORT2,PADENABLE,MOUSESENS,CUSTOMIZE};\r
1766         int i,which;\r
1767 \r
1768 \r
1769 #ifdef SPEAR\r
1770         UnCacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1771         CacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);\r
1772 #endif\r
1773 \r
1774         DrawCtlScreen();\r
1775         MenuFadeIn();\r
1776         WaitKeyUp();\r
1777 \r
1778         do\r
1779         {\r
1780                 which=HandleMenu(&CtlItems,&CtlMenu[0],NULL);\r
1781                 switch(which)\r
1782                 {\r
1783                         case MOUSEENABLE:\r
1784                                 mouseenabled^=1;\r
1785                                 _CX=_DX=CENTER;\r
1786                                 Mouse(4);\r
1787                                 DrawCtlScreen();\r
1788                                 CusItems.curpos=-1;\r
1789                                 ShootSnd();\r
1790                                 break;\r
1791 \r
1792                         case JOYENABLE:\r
1793                                 joystickenabled^=1;\r
1794                                 if (joystickenabled)\r
1795                                         if (!CalibrateJoystick())\r
1796                                                 joystickenabled = 0;\r
1797                                 DrawCtlScreen();\r
1798                                 CusItems.curpos=-1;\r
1799                                 ShootSnd();\r
1800                                 break;\r
1801 \r
1802                         case USEPORT2:\r
1803                                 joystickport^=1;\r
1804                                 DrawCtlScreen();\r
1805                                 ShootSnd();\r
1806                                 break;\r
1807 \r
1808                         case PADENABLE:\r
1809                                 joypadenabled^=1;\r
1810                                 DrawCtlScreen();\r
1811                                 ShootSnd();\r
1812                                 break;\r
1813 \r
1814                         case MOUSESENS:\r
1815                         case CUSTOMIZE:\r
1816                                 DrawCtlScreen();\r
1817                                 MenuFadeIn();\r
1818                                 WaitKeyUp();\r
1819                                 break;\r
1820                 }\r
1821         } while(which>=0);\r
1822 \r
1823         MenuFadeOut();\r
1824 \r
1825 #ifdef SPEAR\r
1826         UnCacheLump (CONTROL_LUMP_START,CONTROL_LUMP_END);\r
1827         CacheLump (OPTIONS_LUMP_START,OPTIONS_LUMP_END);\r
1828 #endif\r
1829 }\r
1830 \r
1831 \r
1832 ////////////////////////////////\r
1833 //\r
1834 // DRAW MOUSE SENSITIVITY SCREEN\r
1835 //\r
1836 void DrawMouseSens(void)\r
1837 {\r
1838 #ifdef JAPAN\r
1839         CA_CacheScreen(S_MOUSESENSPIC);\r
1840 #else\r
1841         ClearMScreen();\r
1842         VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
1843         #ifdef SPANISH\r
1844         DrawWindow(10,80,300,43,BKGDCOLOR);\r
1845         #else\r
1846         DrawWindow(10,80,300,30,BKGDCOLOR);\r
1847         #endif\r
1848 \r
1849         WindowX=0;\r
1850         WindowW=320;\r
1851         PrintY=82;\r
1852         SETFONTCOLOR(READCOLOR,BKGDCOLOR);\r
1853         US_CPrint(STR_MOUSEADJ);\r
1854 \r
1855         SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
1856         #ifdef SPANISH\r
1857         PrintX=14;\r
1858         PrintY=95+13;\r
1859         US_Print(STR_SLOW);\r
1860         PrintX=252;\r
1861         US_Print(STR_FAST);\r
1862         #else\r
1863         PrintX=14;\r
1864         PrintY=95;\r
1865         US_Print(STR_SLOW);\r
1866         PrintX=269;\r
1867         US_Print(STR_FAST);\r
1868         #endif\r
1869 #endif\r
1870 \r
1871         VWB_Bar(60,97,200,10,TEXTCOLOR);\r
1872         DrawOutline(60,97,200,10,0,HIGHLIGHT);\r
1873         DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);\r
1874         VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);\r
1875 \r
1876         VW_UpdateScreen();\r
1877         MenuFadeIn();\r
1878 }\r
1879 \r
1880 \r
1881 ///////////////////////////\r
1882 //\r
1883 // ADJUST MOUSE SENSITIVITY\r
1884 //\r
1885 void MouseSensitivity(void)\r
1886 {\r
1887         ControlInfo ci;\r
1888         int exit=0,oldMA;\r
1889 \r
1890 \r
1891         oldMA=mouseadjustment;\r
1892         DrawMouseSens();\r
1893         do\r
1894         {\r
1895                 ReadAnyControl(&ci);\r
1896                 switch(ci.dir)\r
1897                 {\r
1898                         case dir_North:\r
1899                         case dir_West:\r
1900                                 if (mouseadjustment)\r
1901                                 {\r
1902                                         mouseadjustment--;\r
1903                                         VWB_Bar(60,97,200,10,TEXTCOLOR);\r
1904                                         DrawOutline(60,97,200,10,0,HIGHLIGHT);\r
1905                                         DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);\r
1906                                         VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);\r
1907                                         VW_UpdateScreen();\r
1908                                         SD_PlaySound(MOVEGUN1SND);\r
1909                                         while(Keyboard[sc_LeftArrow]);\r
1910                                         WaitKeyUp();\r
1911                                 }\r
1912                                 break;\r
1913 \r
1914                         case dir_South:\r
1915                         case dir_East:\r
1916                                 if (mouseadjustment<9)\r
1917                                 {\r
1918                                         mouseadjustment++;\r
1919                                         VWB_Bar(60,97,200,10,TEXTCOLOR);\r
1920                                         DrawOutline(60,97,200,10,0,HIGHLIGHT);\r
1921                                         DrawOutline(60+20*mouseadjustment,97,20,10,0,READCOLOR);\r
1922                                         VWB_Bar(61+20*mouseadjustment,98,19,9,READHCOLOR);\r
1923                                         VW_UpdateScreen();\r
1924                                         SD_PlaySound(MOVEGUN1SND);\r
1925                                         while(Keyboard[sc_RightArrow]);\r
1926                                         WaitKeyUp();\r
1927                                 }\r
1928                                 break;\r
1929                 }\r
1930 \r
1931                 #ifndef SPEAR\r
1932                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
1933                 #else\r
1934                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))\r
1935                 #endif\r
1936                         PicturePause();\r
1937 \r
1938                 if (ci.button0 || Keyboard[sc_Space] || Keyboard[sc_Enter])\r
1939                         exit=1;\r
1940                 else\r
1941                 if (ci.button1 || Keyboard[sc_Escape])\r
1942                         exit=2;\r
1943 \r
1944         } while(!exit);\r
1945 \r
1946         if (exit==2)\r
1947         {\r
1948                 mouseadjustment=oldMA;\r
1949                 SD_PlaySound(ESCPRESSEDSND);\r
1950         }\r
1951         else\r
1952                 SD_PlaySound(SHOOTSND);\r
1953 \r
1954         WaitKeyUp();\r
1955         MenuFadeOut();\r
1956 }\r
1957 \r
1958 \r
1959 ///////////////////////////\r
1960 //\r
1961 // DRAW CONTROL MENU SCREEN\r
1962 //\r
1963 void DrawCtlScreen(void)\r
1964 {\r
1965  int i,x,y;\r
1966 \r
1967 \r
1968 #ifdef JAPAN\r
1969         CA_CacheScreen(S_CONTROLPIC);\r
1970 #else\r
1971  ClearMScreen();\r
1972  DrawStripes(10);\r
1973  VWB_DrawPic(80,0,C_CONTROLPIC);\r
1974  VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
1975  DrawWindow(CTL_X-8,CTL_Y-5,CTL_W,CTL_H,BKGDCOLOR);\r
1976 #endif\r
1977  WindowX=0;\r
1978  WindowW=320;\r
1979  SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
1980 \r
1981  if (JoysPresent[0])\r
1982    CtlMenu[1].active=\r
1983    CtlMenu[2].active=\r
1984    CtlMenu[3].active=1;\r
1985 \r
1986  CtlMenu[2].active=CtlMenu[3].active=joystickenabled;\r
1987 \r
1988  if (MousePresent)\r
1989  {\r
1990   CtlMenu[4].active=\r
1991   CtlMenu[0].active=1;\r
1992  }\r
1993 \r
1994  CtlMenu[4].active=mouseenabled;\r
1995 \r
1996 \r
1997  DrawMenu(&CtlItems,&CtlMenu[0]);\r
1998 \r
1999 \r
2000  x=CTL_X+CtlItems.indent-24;\r
2001  y=CTL_Y+3;\r
2002  if (mouseenabled)\r
2003    VWB_DrawPic(x,y,C_SELECTEDPIC);\r
2004  else\r
2005    VWB_DrawPic(x,y,C_NOTSELECTEDPIC);\r
2006 \r
2007  y=CTL_Y+16;\r
2008  if (joystickenabled)\r
2009    VWB_DrawPic(x,y,C_SELECTEDPIC);\r
2010  else\r
2011    VWB_DrawPic(x,y,C_NOTSELECTEDPIC);\r
2012 \r
2013  y=CTL_Y+29;\r
2014  if (joystickport)\r
2015    VWB_DrawPic(x,y,C_SELECTEDPIC);\r
2016  else\r
2017    VWB_DrawPic(x,y,C_NOTSELECTEDPIC);\r
2018 \r
2019  y=CTL_Y+42;\r
2020  if (joypadenabled)\r
2021    VWB_DrawPic(x,y,C_SELECTEDPIC);\r
2022  else\r
2023    VWB_DrawPic(x,y,C_NOTSELECTEDPIC);\r
2024 \r
2025  //\r
2026  // PICK FIRST AVAILABLE SPOT\r
2027  //\r
2028  if (CtlItems.curpos<0 || !CtlMenu[CtlItems.curpos].active)\r
2029    for (i=0;i<6;i++)\r
2030          if (CtlMenu[i].active)\r
2031          {\r
2032           CtlItems.curpos=i;\r
2033           break;\r
2034          }\r
2035 \r
2036  DrawMenuGun(&CtlItems);\r
2037  VW_UpdateScreen();\r
2038 }\r
2039 \r
2040 \r
2041 ////////////////////////////////////////////////////////////////////\r
2042 //\r
2043 // CUSTOMIZE CONTROLS\r
2044 //\r
2045 ////////////////////////////////////////////////////////////////////\r
2046 enum {FIRE,STRAFE,RUN,OPEN};\r
2047 char mbarray[4][3]={"b0","b1","b2","b3"},\r
2048            order[4]={RUN,OPEN,FIRE,STRAFE};\r
2049 \r
2050 \r
2051 void CustomControls(void)\r
2052 {\r
2053  int which;\r
2054 \r
2055 \r
2056  DrawCustomScreen();\r
2057  do\r
2058  {\r
2059   which=HandleMenu(&CusItems,&CusMenu[0],FixupCustom);\r
2060   switch(which)\r
2061   {\r
2062    case 0:\r
2063          DefineMouseBtns();\r
2064          DrawCustMouse(1);\r
2065          break;\r
2066    case 3:\r
2067          DefineJoyBtns();\r
2068          DrawCustJoy(0);\r
2069          break;\r
2070    case 6:\r
2071          DefineKeyBtns();\r
2072          DrawCustKeybd(0);\r
2073          break;\r
2074    case 8:\r
2075          DefineKeyMove();\r
2076          DrawCustKeys(0);\r
2077   }\r
2078  } while(which>=0);\r
2079 \r
2080 \r
2081 \r
2082  MenuFadeOut();\r
2083 }\r
2084 \r
2085 \r
2086 ////////////////////////\r
2087 //\r
2088 // DEFINE THE MOUSE BUTTONS\r
2089 //\r
2090 void DefineMouseBtns(void)\r
2091 {\r
2092  CustomCtrls mouseallowed={0,1,1,1};\r
2093  EnterCtrlData(2,&mouseallowed,DrawCustMouse,PrintCustMouse,MOUSE);\r
2094 }\r
2095 \r
2096 \r
2097 ////////////////////////\r
2098 //\r
2099 // DEFINE THE JOYSTICK BUTTONS\r
2100 //\r
2101 void DefineJoyBtns(void)\r
2102 {\r
2103  CustomCtrls joyallowed={1,1,1,1};\r
2104  EnterCtrlData(5,&joyallowed,DrawCustJoy,PrintCustJoy,JOYSTICK);\r
2105 }\r
2106 \r
2107 \r
2108 ////////////////////////\r
2109 //\r
2110 // DEFINE THE KEYBOARD BUTTONS\r
2111 //\r
2112 void DefineKeyBtns(void)\r
2113 {\r
2114  CustomCtrls keyallowed={1,1,1,1};\r
2115  EnterCtrlData(8,&keyallowed,DrawCustKeybd,PrintCustKeybd,KEYBOARDBTNS);\r
2116 }\r
2117 \r
2118 \r
2119 ////////////////////////\r
2120 //\r
2121 // DEFINE THE KEYBOARD BUTTONS\r
2122 //\r
2123 void DefineKeyMove(void)\r
2124 {\r
2125         CustomCtrls keyallowed={1,1,1,1};\r
2126         EnterCtrlData(10,&keyallowed,DrawCustKeys,PrintCustKeys,KEYBOARDMOVE);\r
2127 }\r
2128 \r
2129 \r
2130 ////////////////////////\r
2131 //\r
2132 // ENTER CONTROL DATA FOR ANY TYPE OF CONTROL\r
2133 //\r
2134 enum {FWRD,RIGHT,BKWD,LEFT};\r
2135 int moveorder[4]={LEFT,RIGHT,FWRD,BKWD};\r
2136 \r
2137 void EnterCtrlData(int index,CustomCtrls *cust,void (*DrawRtn)(int),void (*PrintRtn)(int),int type)\r
2138 {\r
2139  int j,exit,tick,redraw,which,x,picked;\r
2140  ControlInfo ci;\r
2141 \r
2142 \r
2143  ShootSnd();\r
2144  PrintY=CST_Y+13*index;\r
2145  IN_ClearKeysDown();\r
2146  exit=0;\r
2147  redraw=1;\r
2148  //\r
2149  // FIND FIRST SPOT IN ALLOWED ARRAY\r
2150  //\r
2151  for (j=0;j<4;j++)\r
2152    if (cust->allowed[j])\r
2153    {\r
2154         which=j;\r
2155         break;\r
2156    }\r
2157 \r
2158  do\r
2159  {\r
2160   if (redraw)\r
2161   {\r
2162    x=CST_START+CST_SPC*which;\r
2163    DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
2164 \r
2165    DrawRtn(1);\r
2166    DrawWindow(x-2,PrintY,CST_SPC,11,TEXTCOLOR);\r
2167    DrawOutline(x-2,PrintY,CST_SPC,11,0,HIGHLIGHT);\r
2168    SETFONTCOLOR(0,TEXTCOLOR);\r
2169    PrintRtn(which);\r
2170    PrintX=x;\r
2171    SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
2172    VW_UpdateScreen();\r
2173    WaitKeyUp();\r
2174    redraw=0;\r
2175   }\r
2176 \r
2177   ReadAnyControl(&ci);\r
2178 \r
2179   if (type==MOUSE || type==JOYSTICK)\r
2180         if (IN_KeyDown(sc_Enter)||IN_KeyDown(sc_Control)||IN_KeyDown(sc_Alt))\r
2181         {\r
2182          IN_ClearKeysDown();\r
2183          ci.button0=ci.button1=false;\r
2184         }\r
2185 \r
2186   //\r
2187   // CHANGE BUTTON VALUE?\r
2188   //\r
2189   if ((ci.button0|ci.button1|ci.button2|ci.button3)||\r
2190           ((type==KEYBOARDBTNS||type==KEYBOARDMOVE) && LastScan==sc_Enter))\r
2191   {\r
2192    tick=TimeCount=picked=0;\r
2193    SETFONTCOLOR(0,TEXTCOLOR);\r
2194 \r
2195    do\r
2196    {\r
2197         int button,result=0;\r
2198 \r
2199 \r
2200         if (type==KEYBOARDBTNS||type==KEYBOARDMOVE)\r
2201           IN_ClearKeysDown();\r
2202 \r
2203         //\r
2204         // FLASH CURSOR\r
2205         //\r
2206         if (TimeCount>10)\r
2207         {\r
2208          switch(tick)\r
2209          {\r
2210           case 0:\r
2211         VWB_Bar(x,PrintY+1,CST_SPC-2,10,TEXTCOLOR);\r
2212         break;\r
2213           case 1:\r
2214         PrintX=x;\r
2215         US_Print("?");\r
2216         SD_PlaySound(HITWALLSND);\r
2217          }\r
2218          tick^=1;\r
2219          TimeCount=0;\r
2220          VW_UpdateScreen();\r
2221         }\r
2222 \r
2223         //\r
2224         // WHICH TYPE OF INPUT DO WE PROCESS?\r
2225         //\r
2226         switch(type)\r
2227         {\r
2228          case MOUSE:\r
2229            Mouse(3);\r
2230            button=_BX;\r
2231            switch(button)\r
2232            {\r
2233         case 1: result=1; break;\r
2234         case 2: result=2; break;\r
2235         case 4: result=3; break;\r
2236            }\r
2237 \r
2238            if (result)\r
2239            {\r
2240         int z;\r
2241 \r
2242 \r
2243         for (z=0;z<4;z++)\r
2244           if (order[which]==buttonmouse[z])\r
2245           {\r
2246            buttonmouse[z]=bt_nobutton;\r
2247            break;\r
2248           }\r
2249 \r
2250         buttonmouse[result-1]=order[which];\r
2251         picked=1;\r
2252         SD_PlaySound(SHOOTDOORSND);\r
2253            }\r
2254            break;\r
2255 \r
2256          case JOYSTICK:\r
2257            if (ci.button0) result=1;\r
2258            else\r
2259            if (ci.button1) result=2;\r
2260            else\r
2261            if (ci.button2) result=3;\r
2262            else\r
2263            if (ci.button3) result=4;\r
2264 \r
2265            if (result)\r
2266            {\r
2267         int z;\r
2268 \r
2269 \r
2270         for (z=0;z<4;z++)\r
2271           if (order[which]==buttonjoy[z])\r
2272           {\r
2273            buttonjoy[z]=bt_nobutton;\r
2274            break;\r
2275           }\r
2276 \r
2277         buttonjoy[result-1]=order[which];\r
2278         picked=1;\r
2279         SD_PlaySound(SHOOTDOORSND);\r
2280            }\r
2281            break;\r
2282 \r
2283          case KEYBOARDBTNS:\r
2284            if (LastScan)\r
2285            {\r
2286         buttonscan[order[which]]=LastScan;\r
2287         picked=1;\r
2288         ShootSnd();\r
2289         IN_ClearKeysDown();\r
2290            }\r
2291            break;\r
2292 \r
2293          case KEYBOARDMOVE:\r
2294            if (LastScan)\r
2295            {\r
2296         dirscan[moveorder[which]]=LastScan;\r
2297         picked=1;\r
2298         ShootSnd();\r
2299         IN_ClearKeysDown();\r
2300            }\r
2301            break;\r
2302         }\r
2303 \r
2304         //\r
2305         // EXIT INPUT?\r
2306         //\r
2307         if (IN_KeyDown(sc_Escape))\r
2308         {\r
2309          picked=1;\r
2310          continue;\r
2311         }\r
2312 \r
2313    } while(!picked);\r
2314 \r
2315    SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
2316    redraw=1;\r
2317    WaitKeyUp();\r
2318    continue;\r
2319   }\r
2320 \r
2321   if (ci.button1 || IN_KeyDown(sc_Escape))\r
2322         exit=1;\r
2323 \r
2324   //\r
2325   // MOVE TO ANOTHER SPOT?\r
2326   //\r
2327   switch(ci.dir)\r
2328   {\r
2329    case dir_West:\r
2330          do\r
2331          {\r
2332           which--;\r
2333           if (which<0)\r
2334         which=3;\r
2335          } while(!cust->allowed[which]);\r
2336          redraw=1;\r
2337          SD_PlaySound(MOVEGUN1SND);\r
2338          while(ReadAnyControl(&ci),ci.dir!=dir_None);\r
2339          IN_ClearKeysDown();\r
2340          break;\r
2341 \r
2342    case dir_East:\r
2343          do\r
2344          {\r
2345           which++;\r
2346           if (which>3)\r
2347         which=0;\r
2348          } while(!cust->allowed[which]);\r
2349          redraw=1;\r
2350          SD_PlaySound(MOVEGUN1SND);\r
2351          while(ReadAnyControl(&ci),ci.dir!=dir_None);\r
2352          IN_ClearKeysDown();\r
2353          break;\r
2354    case dir_North:\r
2355    case dir_South:\r
2356          exit=1;\r
2357   }\r
2358  } while(!exit);\r
2359 \r
2360  SD_PlaySound(ESCPRESSEDSND);\r
2361  WaitKeyUp();\r
2362  DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
2363 }\r
2364 \r
2365 \r
2366 ////////////////////////\r
2367 //\r
2368 // FIXUP GUN CURSOR OVERDRAW SHIT\r
2369 //\r
2370 void FixupCustom(int w)\r
2371 {\r
2372         static int lastwhich=-1;\r
2373         int y=CST_Y+26+w*13;\r
2374 \r
2375 \r
2376         VWB_Hlin(7,32,y-1,DEACTIVE);\r
2377         VWB_Hlin(7,32,y+12,BORD2COLOR);\r
2378 #ifndef SPEAR\r
2379         VWB_Hlin(7,32,y-2,BORDCOLOR);\r
2380         VWB_Hlin(7,32,y+13,BORDCOLOR);\r
2381 #else\r
2382         VWB_Hlin(7,32,y-2,BORD2COLOR);\r
2383         VWB_Hlin(7,32,y+13,BORD2COLOR);\r
2384 #endif\r
2385 \r
2386         switch(w)\r
2387         {\r
2388                 case 0: DrawCustMouse(1); break;\r
2389                 case 3: DrawCustJoy(1); break;\r
2390                 case 6: DrawCustKeybd(1); break;\r
2391                 case 8: DrawCustKeys(1);\r
2392         }\r
2393 \r
2394 \r
2395         if (lastwhich>=0)\r
2396         {\r
2397                 y=CST_Y+26+lastwhich*13;\r
2398                 VWB_Hlin(7,32,y-1,DEACTIVE);\r
2399                 VWB_Hlin(7,32,y+12,BORD2COLOR);\r
2400 #ifndef SPEAR\r
2401                 VWB_Hlin(7,32,y-2,BORDCOLOR);\r
2402                 VWB_Hlin(7,32,y+13,BORDCOLOR);\r
2403 #else\r
2404                 VWB_Hlin(7,32,y-2,BORD2COLOR);\r
2405                 VWB_Hlin(7,32,y+13,BORD2COLOR);\r
2406 #endif\r
2407 \r
2408                 if (lastwhich!=w)\r
2409                         switch(lastwhich)\r
2410                         {\r
2411                                 case 0: DrawCustMouse(0); break;\r
2412                                 case 3: DrawCustJoy(0); break;\r
2413                                 case 6: DrawCustKeybd(0); break;\r
2414                                 case 8: DrawCustKeys(0);\r
2415                         }\r
2416         }\r
2417 \r
2418         lastwhich=w;\r
2419 }\r
2420 \r
2421 \r
2422 ////////////////////////\r
2423 //\r
2424 // DRAW CUSTOMIZE SCREEN\r
2425 //\r
2426 void DrawCustomScreen(void)\r
2427 {\r
2428         int i;\r
2429 \r
2430 \r
2431 #ifdef JAPAN\r
2432         CA_CacheScreen(S_CUSTOMPIC);\r
2433         fontnumber=1;\r
2434 \r
2435         PrintX=CST_START;\r
2436         PrintY = CST_Y+26;\r
2437         DrawCustMouse(0);\r
2438 \r
2439         PrintX=CST_START;\r
2440         US_Print("\n\n\n");\r
2441         DrawCustJoy(0);\r
2442 \r
2443         PrintX=CST_START;\r
2444         US_Print("\n\n\n");\r
2445         DrawCustKeybd(0);\r
2446 \r
2447         PrintX=CST_START;\r
2448         US_Print("\n\n\n");\r
2449         DrawCustKeys(0);\r
2450 #else\r
2451         ClearMScreen();\r
2452         WindowX=0;\r
2453         WindowW=320;\r
2454         VWB_DrawPic(112,184,C_MOUSELBACKPIC);\r
2455         DrawStripes(10);\r
2456         VWB_DrawPic(80,0,C_CUSTOMIZEPIC);\r
2457 \r
2458         //\r
2459         // MOUSE\r
2460         //\r
2461         SETFONTCOLOR(READCOLOR,BKGDCOLOR);\r
2462         WindowX=0;\r
2463         WindowW=320;\r
2464 \r
2465 #ifndef SPEAR\r
2466         PrintY=CST_Y;\r
2467         US_CPrint("Mouse\n");\r
2468 #else\r
2469         PrintY = CST_Y+13;\r
2470         VWB_DrawPic (128,48,C_MOUSEPIC);\r
2471 #endif\r
2472 \r
2473         SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
2474         #ifdef SPANISH\r
2475         PrintX=CST_START-16;\r
2476         US_Print(STR_CRUN);\r
2477         PrintX=CST_START-16+CST_SPC*1;\r
2478         US_Print(STR_COPEN);\r
2479         PrintX=CST_START-16+CST_SPC*2;\r
2480         US_Print(STR_CFIRE);\r
2481         PrintX=CST_START-16+CST_SPC*3;\r
2482         US_Print(STR_CSTRAFE"\n");\r
2483         #else\r
2484         PrintX=CST_START;\r
2485         US_Print(STR_CRUN);\r
2486         PrintX=CST_START+CST_SPC*1;\r
2487         US_Print(STR_COPEN);\r
2488         PrintX=CST_START+CST_SPC*2;\r
2489         US_Print(STR_CFIRE);\r
2490         PrintX=CST_START+CST_SPC*3;\r
2491         US_Print(STR_CSTRAFE"\n");\r
2492         #endif\r
2493 \r
2494         DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
2495         DrawCustMouse(0);\r
2496         US_Print("\n");\r
2497 \r
2498 \r
2499         //\r
2500         // JOYSTICK/PAD\r
2501         //\r
2502 #ifndef SPEAR\r
2503         SETFONTCOLOR(READCOLOR,BKGDCOLOR);\r
2504         US_CPrint("Joystick/Gravis GamePad\n");\r
2505 #else\r
2506         PrintY += 13;\r
2507         VWB_DrawPic (40,88,C_JOYSTICKPIC);\r
2508 #endif\r
2509 \r
2510 #ifdef SPEAR\r
2511         VWB_DrawPic (112,120,C_KEYBOARDPIC);\r
2512 #endif\r
2513 \r
2514         SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
2515         #ifdef SPANISH\r
2516         PrintX=CST_START-16;\r
2517         US_Print(STR_CRUN);\r
2518         PrintX=CST_START-16+CST_SPC*1;\r
2519         US_Print(STR_COPEN);\r
2520         PrintX=CST_START-16+CST_SPC*2;\r
2521         US_Print(STR_CFIRE);\r
2522         PrintX=CST_START-16+CST_SPC*3;\r
2523         US_Print(STR_CSTRAFE"\n");\r
2524         #else\r
2525         PrintX=CST_START;\r
2526         US_Print(STR_CRUN);\r
2527         PrintX=CST_START+CST_SPC*1;\r
2528         US_Print(STR_COPEN);\r
2529         PrintX=CST_START+CST_SPC*2;\r
2530         US_Print(STR_CFIRE);\r
2531         PrintX=CST_START+CST_SPC*3;\r
2532         US_Print(STR_CSTRAFE"\n");\r
2533         #endif\r
2534         DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
2535         DrawCustJoy(0);\r
2536         US_Print("\n");\r
2537 \r
2538 \r
2539         //\r
2540         // KEYBOARD\r
2541         //\r
2542 #ifndef SPEAR\r
2543         SETFONTCOLOR(READCOLOR,BKGDCOLOR);\r
2544         US_CPrint("Keyboard\n");\r
2545 #else\r
2546         PrintY += 13;\r
2547 #endif\r
2548         SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
2549         #ifdef SPANISH\r
2550         PrintX=CST_START-16;\r
2551         US_Print(STR_CRUN);\r
2552         PrintX=CST_START-16+CST_SPC*1;\r
2553         US_Print(STR_COPEN);\r
2554         PrintX=CST_START-16+CST_SPC*2;\r
2555         US_Print(STR_CFIRE);\r
2556         PrintX=CST_START-16+CST_SPC*3;\r
2557         US_Print(STR_CSTRAFE"\n");\r
2558         #else\r
2559         PrintX=CST_START;\r
2560         US_Print(STR_CRUN);\r
2561         PrintX=CST_START+CST_SPC*1;\r
2562         US_Print(STR_COPEN);\r
2563         PrintX=CST_START+CST_SPC*2;\r
2564         US_Print(STR_CFIRE);\r
2565         PrintX=CST_START+CST_SPC*3;\r
2566         US_Print(STR_CSTRAFE"\n");\r
2567         #endif\r
2568         DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
2569         DrawCustKeybd(0);\r
2570         US_Print("\n");\r
2571 \r
2572 \r
2573         //\r
2574         // KEYBOARD MOVE KEYS\r
2575         //\r
2576         SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
2577         #ifdef SPANISH\r
2578         PrintX=4;\r
2579         US_Print(STR_LEFT);\r
2580         US_Print("/");\r
2581         US_Print(STR_RIGHT);\r
2582         US_Print("/");\r
2583         US_Print(STR_FRWD);\r
2584         US_Print("/");\r
2585         US_Print(STR_BKWD"\n");\r
2586         #else\r
2587         PrintX=CST_START;\r
2588         US_Print(STR_LEFT);\r
2589         PrintX=CST_START+CST_SPC*1;\r
2590         US_Print(STR_RIGHT);\r
2591         PrintX=CST_START+CST_SPC*2;\r
2592         US_Print(STR_FRWD);\r
2593         PrintX=CST_START+CST_SPC*3;\r
2594         US_Print(STR_BKWD"\n");\r
2595         #endif\r
2596         DrawWindow(5,PrintY-1,310,13,BKGDCOLOR);\r
2597         DrawCustKeys(0);\r
2598 #endif\r
2599         //\r
2600         // PICK STARTING POINT IN MENU\r
2601         //\r
2602         if (CusItems.curpos<0)\r
2603                 for (i=0;i<CusItems.amount;i++)\r
2604                         if (CusMenu[i].active)\r
2605                         {\r
2606                                 CusItems.curpos=i;\r
2607                                 break;\r
2608                         }\r
2609 \r
2610 \r
2611         VW_UpdateScreen();\r
2612         MenuFadeIn();\r
2613 }\r
2614 \r
2615 \r
2616 void PrintCustMouse(int i)\r
2617 {\r
2618         int j;\r
2619 \r
2620         for (j=0;j<4;j++)\r
2621                 if (order[i]==buttonmouse[j])\r
2622                 {\r
2623                         PrintX=CST_START+CST_SPC*i;\r
2624                         US_Print(mbarray[j]);\r
2625                         break;\r
2626                 }\r
2627 }\r
2628 \r
2629 void DrawCustMouse(int hilight)\r
2630 {\r
2631         int i,color;\r
2632 \r
2633 \r
2634         color=TEXTCOLOR;\r
2635         if (hilight)\r
2636                 color=HIGHLIGHT;\r
2637         SETFONTCOLOR(color,BKGDCOLOR);\r
2638 \r
2639         if (!mouseenabled)\r
2640         {\r
2641                 SETFONTCOLOR(DEACTIVE,BKGDCOLOR);\r
2642                 CusMenu[0].active=0;\r
2643         }\r
2644         else\r
2645                 CusMenu[0].active=1;\r
2646 \r
2647         PrintY=CST_Y+13*2;\r
2648         for (i=0;i<4;i++)\r
2649                 PrintCustMouse(i);\r
2650 }\r
2651 \r
2652 void PrintCustJoy(int i)\r
2653 {\r
2654         int j;\r
2655 \r
2656         for (j=0;j<4;j++)\r
2657                 if (order[i]==buttonjoy[j])\r
2658                 {\r
2659                         PrintX=CST_START+CST_SPC*i;\r
2660                         US_Print(mbarray[j]);\r
2661                         break;\r
2662                 }\r
2663 }\r
2664 \r
2665 void DrawCustJoy(int hilight)\r
2666 {\r
2667         int i,color;\r
2668 \r
2669 \r
2670         color=TEXTCOLOR;\r
2671         if (hilight)\r
2672                 color=HIGHLIGHT;\r
2673         SETFONTCOLOR(color,BKGDCOLOR);\r
2674 \r
2675         if (!joystickenabled)\r
2676         {\r
2677                 SETFONTCOLOR(DEACTIVE,BKGDCOLOR);\r
2678                 CusMenu[3].active=0;\r
2679         }\r
2680         else\r
2681                 CusMenu[3].active=1;\r
2682 \r
2683         PrintY=CST_Y+13*5;\r
2684         for (i=0;i<4;i++)\r
2685                 PrintCustJoy(i);\r
2686 }\r
2687 \r
2688 \r
2689 void PrintCustKeybd(int i)\r
2690 {\r
2691         PrintX=CST_START+CST_SPC*i;\r
2692         US_Print(IN_GetScanName(buttonscan[order[i]]));\r
2693 }\r
2694 \r
2695 void DrawCustKeybd(int hilight)\r
2696 {\r
2697         int i,color;\r
2698 \r
2699 \r
2700         color=TEXTCOLOR;\r
2701         if (hilight)\r
2702                 color=HIGHLIGHT;\r
2703         SETFONTCOLOR(color,BKGDCOLOR);\r
2704 \r
2705         PrintY=CST_Y+13*8;\r
2706         for (i=0;i<4;i++)\r
2707                 PrintCustKeybd(i);\r
2708 }\r
2709 \r
2710 void PrintCustKeys(int i)\r
2711 {\r
2712         PrintX=CST_START+CST_SPC*i;\r
2713         US_Print(IN_GetScanName(dirscan[moveorder[i]]));\r
2714 }\r
2715 \r
2716 void DrawCustKeys(int hilight)\r
2717 {\r
2718         int i,color;\r
2719 \r
2720 \r
2721         color=TEXTCOLOR;\r
2722         if (hilight)\r
2723                 color=HIGHLIGHT;\r
2724         SETFONTCOLOR(color,BKGDCOLOR);\r
2725 \r
2726         PrintY=CST_Y+13*10;\r
2727         for (i=0;i<4;i++)\r
2728                 PrintCustKeys(i);\r
2729 }\r
2730 \r
2731 \r
2732 ////////////////////////////////////////////////////////////////////\r
2733 //\r
2734 // CHANGE SCREEN VIEWING SIZE\r
2735 //\r
2736 ////////////////////////////////////////////////////////////////////\r
2737 void CP_ChangeView(void)\r
2738 {\r
2739         int exit=0,oldview,newview;\r
2740         ControlInfo ci;\r
2741 \r
2742 \r
2743         WindowX=WindowY=0;\r
2744         WindowW=320;\r
2745         WindowH=200;\r
2746         newview=oldview=viewwidth/16;\r
2747         DrawChangeView(oldview);\r
2748 \r
2749         do\r
2750         {\r
2751                 CheckPause();\r
2752                 ReadAnyControl(&ci);\r
2753                 switch(ci.dir)\r
2754                 {\r
2755                 case dir_South:\r
2756                 case dir_West:\r
2757                         newview--;\r
2758                         if (newview<4)\r
2759                                 newview=4;\r
2760                         ShowViewSize(newview);\r
2761                         VW_UpdateScreen();\r
2762                         SD_PlaySound(HITWALLSND);\r
2763                         TicDelay(10);\r
2764                         break;\r
2765 \r
2766                 case dir_North:\r
2767                 case dir_East:\r
2768                         newview++;\r
2769                         if (newview>19)\r
2770                                 newview=19;\r
2771                         ShowViewSize(newview);\r
2772                         VW_UpdateScreen();\r
2773                         SD_PlaySound(HITWALLSND);\r
2774                         TicDelay(10);\r
2775                         break;\r
2776                 }\r
2777 \r
2778                 #ifndef SPEAR\r
2779                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
2780                 #else\r
2781                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))\r
2782                 #endif\r
2783                         PicturePause();\r
2784 \r
2785                 if (ci.button0 || Keyboard[sc_Enter])\r
2786                         exit=1;\r
2787                 else\r
2788                 if (ci.button1 || Keyboard[sc_Escape])\r
2789                 {\r
2790                         viewwidth=oldview*16;\r
2791                         SD_PlaySound(ESCPRESSEDSND);\r
2792                         MenuFadeOut();\r
2793                         return;\r
2794                 }\r
2795 \r
2796         } while(!exit);\r
2797 \r
2798 \r
2799         if (oldview!=newview)\r
2800         {\r
2801                 SD_PlaySound (SHOOTSND);\r
2802                 Message(STR_THINK"...");\r
2803                 NewViewSize(newview);\r
2804         }\r
2805 \r
2806         ShootSnd();\r
2807         MenuFadeOut();\r
2808 }\r
2809 \r
2810 \r
2811 /////////////////////////////\r
2812 //\r
2813 // DRAW THE CHANGEVIEW SCREEN\r
2814 //\r
2815 void DrawChangeView(int view)\r
2816 {\r
2817 #ifdef JAPAN\r
2818         CA_CacheScreen(S_CHANGEPIC);\r
2819 \r
2820         ShowViewSize(view);\r
2821 #else\r
2822         VWB_Bar(0,160,320,40,VIEWCOLOR);\r
2823         ShowViewSize(view);\r
2824 \r
2825         PrintY=161;\r
2826         WindowX=0;\r
2827         WindowY=320;\r
2828         SETFONTCOLOR(HIGHLIGHT,BKGDCOLOR);\r
2829 \r
2830         US_CPrint(STR_SIZE1"\n");\r
2831         US_CPrint(STR_SIZE2"\n");\r
2832         US_CPrint(STR_SIZE3);\r
2833 #endif\r
2834         VW_UpdateScreen();\r
2835 \r
2836         MenuFadeIn();\r
2837 }\r
2838 \r
2839 \r
2840 ////////////////////////////////////////////////////////////////////\r
2841 //\r
2842 // QUIT THIS INFERNAL GAME!\r
2843 //\r
2844 ////////////////////////////////////////////////////////////////////\r
2845 void CP_Quit(void)\r
2846 {\r
2847         int i;\r
2848 \r
2849 \r
2850         #ifdef JAPAN\r
2851         if (GetYorN(7,11,C_QUITMSGPIC))\r
2852         #else\r
2853 \r
2854         #ifdef SPANISH\r
2855         if (Confirm(ENDGAMESTR))\r
2856         #else\r
2857         if (Confirm(endStrings[US_RndT()&0x7+(US_RndT()&1)]))\r
2858         #endif\r
2859 \r
2860         #endif\r
2861         {\r
2862                 VW_UpdateScreen();\r
2863                 SD_MusicOff();\r
2864                 SD_StopSound();\r
2865                 MenuFadeOut();\r
2866                 //\r
2867                 // SHUT-UP THE ADLIB\r
2868                 //\r
2869                 for (i=1;i<=0xf5;i++)\r
2870                         alOut(i,0);\r
2871                 Quit(NULL);\r
2872         }\r
2873 \r
2874         DrawMainMenu();\r
2875 }\r
2876 \r
2877 \r
2878 ////////////////////////////////////////////////////////////////////\r
2879 //\r
2880 // HANDLE INTRO SCREEN (SYSTEM CONFIG)\r
2881 //\r
2882 ////////////////////////////////////////////////////////////////////\r
2883 void IntroScreen(void)\r
2884 {\r
2885 #ifdef SPEAR\r
2886 \r
2887 #define MAINCOLOR       0x4f\r
2888 #define EMSCOLOR        0x4f\r
2889 #define XMSCOLOR        0x4f\r
2890 \r
2891 #else\r
2892 \r
2893 #define MAINCOLOR       0x6c\r
2894 #define EMSCOLOR        0x6c\r
2895 #define XMSCOLOR        0x6c\r
2896 \r
2897 #endif\r
2898 #define FILLCOLOR       14\r
2899 \r
2900         long memory,emshere,xmshere;\r
2901         int i,num,ems[10]={100,200,300,400,500,600,700,800,900,1000},\r
2902                 xms[10]={100,200,300,400,500,600,700,800,900,1000},\r
2903                 main[10]={32,64,96,128,160,192,224,256,288,320};\r
2904 \r
2905 \r
2906         //\r
2907         // DRAW MAIN MEMORY\r
2908         //\r
2909         memory=(1023l+mminfo.nearheap+mminfo.farheap)/1024l;\r
2910         for (i=0;i<10;i++)\r
2911                 if (memory>=main[i])\r
2912                         VWB_Bar(49,163-8*i,6,5,MAINCOLOR-i);\r
2913 \r
2914 \r
2915         //\r
2916         // DRAW EMS MEMORY\r
2917         //\r
2918         if (EMSPresent)\r
2919         {\r
2920                 emshere=4l*EMSPagesAvail;\r
2921                 for (i=0;i<10;i++)\r
2922                         if (emshere>=ems[i])\r
2923                                 VWB_Bar(89,163-8*i,6,5,EMSCOLOR-i);\r
2924         }\r
2925 \r
2926         //\r
2927         // DRAW XMS MEMORY\r
2928         //\r
2929         if (XMSPresent)\r
2930         {\r
2931                 xmshere=4l*XMSPagesAvail;\r
2932                 for (i=0;i<10;i++)\r
2933                         if (xmshere>=xms[i])\r
2934                                 VWB_Bar(129,163-8*i,6,5,XMSCOLOR-i);\r
2935         }\r
2936 \r
2937         //\r
2938         // FILL BOXES\r
2939         //\r
2940         if (MousePresent)\r
2941                 VWB_Bar(164,82,12,2,FILLCOLOR);\r
2942 \r
2943         if (JoysPresent[0] || JoysPresent[1])\r
2944                 VWB_Bar(164,105,12,2,FILLCOLOR);\r
2945 \r
2946         if (AdLibPresent && !SoundBlasterPresent)\r
2947                 VWB_Bar(164,128,12,2,FILLCOLOR);\r
2948 \r
2949         if (SoundBlasterPresent)\r
2950                 VWB_Bar(164,151,12,2,FILLCOLOR);\r
2951 \r
2952         if (SoundSourcePresent)\r
2953                 VWB_Bar(164,174,12,2,FILLCOLOR);\r
2954 }\r
2955 \r
2956 \r
2957 ////////////////////////////////////////////////////////////////////\r
2958 ////////////////////////////////////////////////////////////////////\r
2959 //\r
2960 // SUPPORT ROUTINES\r
2961 //\r
2962 ////////////////////////////////////////////////////////////////////\r
2963 ////////////////////////////////////////////////////////////////////\r
2964 \r
2965 ////////////////////////////////////////////////////////////////////\r
2966 //\r
2967 // Clear Menu screens to dark red\r
2968 //\r
2969 ////////////////////////////////////////////////////////////////////\r
2970 void ClearMScreen(void)\r
2971 {\r
2972 #ifndef SPEAR\r
2973         VWB_Bar(0,0,320,200,BORDCOLOR);\r
2974 #else\r
2975         VWB_DrawPic(0,0,C_BACKDROPPIC);\r
2976 #endif\r
2977 }\r
2978 \r
2979 \r
2980 ////////////////////////////////////////////////////////////////////\r
2981 //\r
2982 // Un/Cache a LUMP of graphics\r
2983 //\r
2984 ////////////////////////////////////////////////////////////////////\r
2985 void CacheLump(int lumpstart,int lumpend)\r
2986 {\r
2987  int i;\r
2988 \r
2989  for (i=lumpstart;i<=lumpend;i++)\r
2990    CA_CacheGrChunk(i);\r
2991 }\r
2992 \r
2993 \r
2994 void UnCacheLump(int lumpstart,int lumpend)\r
2995 {\r
2996  int i;\r
2997 \r
2998  for (i=lumpstart;i<=lumpend;i++)\r
2999         if (grsegs[i])\r
3000                 UNCACHEGRCHUNK(i);\r
3001 }\r
3002 \r
3003 \r
3004 ////////////////////////////////////////////////////////////////////\r
3005 //\r
3006 // Draw a window for a menu\r
3007 //\r
3008 ////////////////////////////////////////////////////////////////////\r
3009 void DrawWindow(int x,int y,int w,int h,int wcolor)\r
3010 {\r
3011         VWB_Bar(x,y,w,h,wcolor);\r
3012         DrawOutline(x,y,w,h,BORD2COLOR,DEACTIVE);\r
3013 }\r
3014 \r
3015 \r
3016 void DrawOutline(int x,int y,int w,int h,int color1,int color2)\r
3017 {\r
3018         VWB_Hlin(x,x+w,y,color2);\r
3019         VWB_Vlin(y,y+h,x,color2);\r
3020         VWB_Hlin(x,x+w,y+h,color1);\r
3021         VWB_Vlin(y,y+h,x+w,color1);\r
3022 }\r
3023 \r
3024 \r
3025 ////////////////////////////////////////////////////////////////////\r
3026 //\r
3027 // Setup Control Panel stuff - graphics, etc.\r
3028 //\r
3029 ////////////////////////////////////////////////////////////////////\r
3030 void SetupControlPanel(void)\r
3031 {\r
3032         struct ffblk f;\r
3033         char name[13];\r
3034         int which,i;\r
3035 \r
3036 \r
3037         //\r
3038         // CACHE GRAPHICS & SOUNDS\r
3039         //\r
3040         CA_CacheGrChunk(STARTFONT+1);\r
3041 #ifndef SPEAR\r
3042         CacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);\r
3043 #else\r
3044         CacheLump(BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
3045 #endif\r
3046 \r
3047         SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
3048         fontnumber=1;\r
3049         WindowH=200;\r
3050 \r
3051         if (!ingame)\r
3052                 CA_LoadAllSounds();\r
3053         else\r
3054                 MainMenu[savegame].active=1;\r
3055 \r
3056         //\r
3057         // SEE WHICH SAVE GAME FILES ARE AVAILABLE & READ STRING IN\r
3058         //\r
3059         strcpy(name,SaveName);\r
3060         if (!findfirst(name,&f,0))\r
3061                 do\r
3062                 {\r
3063                         which=f.ff_name[7]-'0';\r
3064                         if (which<10)\r
3065                         {\r
3066                                 int handle;\r
3067                                 char temp[32];\r
3068 \r
3069                                 SaveGamesAvail[which]=1;\r
3070                                 handle=open(f.ff_name,O_BINARY);\r
3071                                 read(handle,temp,32);\r
3072                                 close(handle);\r
3073                                 strcpy(&SaveGameNames[which][0],temp);\r
3074                         }\r
3075                 } while(!findnext(&f));\r
3076 \r
3077         //\r
3078         // CENTER MOUSE\r
3079         //\r
3080         _CX=_DX=CENTER;\r
3081         Mouse(4);\r
3082 }\r
3083 \r
3084 \r
3085 ////////////////////////////////////////////////////////////////////\r
3086 //\r
3087 // Clean up all the Control Panel stuff\r
3088 //\r
3089 ////////////////////////////////////////////////////////////////////\r
3090 void CleanupControlPanel(void)\r
3091 {\r
3092 #ifndef SPEAR\r
3093         UnCacheLump(CONTROLS_LUMP_START,CONTROLS_LUMP_END);\r
3094 #else\r
3095         UnCacheLump (BACKDROP_LUMP_START,BACKDROP_LUMP_END);\r
3096 #endif\r
3097 \r
3098         fontnumber = 0;\r
3099 }\r
3100 \r
3101 \r
3102 ////////////////////////////////////////////////////////////////////\r
3103 //\r
3104 // Handle moving gun around a menu\r
3105 //\r
3106 ////////////////////////////////////////////////////////////////////\r
3107 int HandleMenu(CP_iteminfo *item_i,CP_itemtype far *items,void (*routine)(int w))\r
3108 {\r
3109         char key;\r
3110         static int redrawitem=1,lastitem=-1;\r
3111         int i,x,y,basey,exit,which,shape,timer;\r
3112         ControlInfo ci;\r
3113 \r
3114 \r
3115         which=item_i->curpos;\r
3116         x=item_i->x&-8;\r
3117         basey=item_i->y-2;\r
3118         y=basey+which*13;\r
3119 \r
3120         VWB_DrawPic(x,y,C_CURSOR1PIC);\r
3121         SetTextColor(items+which,1);\r
3122         if (redrawitem)\r
3123         {\r
3124                 PrintX=item_i->x+item_i->indent;\r
3125                 PrintY=item_i->y+which*13;\r
3126                 US_Print((items+which)->string);\r
3127         }\r
3128         //\r
3129         // CALL CUSTOM ROUTINE IF IT IS NEEDED\r
3130         //\r
3131         if (routine)\r
3132                 routine(which);\r
3133         VW_UpdateScreen();\r
3134 \r
3135         shape=C_CURSOR1PIC;\r
3136         timer=8;\r
3137         exit=0;\r
3138         TimeCount=0;\r
3139         IN_ClearKeysDown();\r
3140 \r
3141 \r
3142         do\r
3143         {\r
3144                 //\r
3145                 // CHANGE GUN SHAPE\r
3146                 //\r
3147                 if (TimeCount>timer)\r
3148                 {\r
3149                         TimeCount=0;\r
3150                         if (shape==C_CURSOR1PIC)\r
3151                         {\r
3152                                 shape=C_CURSOR2PIC;\r
3153                                 timer=8;\r
3154                         }\r
3155                         else\r
3156                         {\r
3157                                 shape=C_CURSOR1PIC;\r
3158                                 timer=70;\r
3159                         }\r
3160                         VWB_DrawPic(x,y,shape);\r
3161                         if (routine)\r
3162                                 routine(which);\r
3163                         VW_UpdateScreen();\r
3164                 }\r
3165 \r
3166                 CheckPause();\r
3167 \r
3168                 //\r
3169                 // SEE IF ANY KEYS ARE PRESSED FOR INITIAL CHAR FINDING\r
3170                 //\r
3171                 key=LastASCII;\r
3172                 if (key)\r
3173                 {\r
3174                         int ok=0;\r
3175 \r
3176                         //\r
3177                         // CHECK FOR SCREEN CAPTURE\r
3178                         //\r
3179                         #ifndef SPEAR\r
3180                         if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
3181                         #else\r
3182                         if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("debugmode"))\r
3183                         #endif\r
3184                                 PicturePause();\r
3185 \r
3186 \r
3187                         if (key>='a')\r
3188                                 key-='a'-'A';\r
3189 \r
3190                         for (i=which+1;i<item_i->amount;i++)\r
3191                                 if ((items+i)->active && (items+i)->string[0]==key)\r
3192                                 {\r
3193                                         EraseGun(item_i,items,x,y,which);\r
3194                                         which=i;\r
3195                                         DrawGun(item_i,items,x,&y,which,basey,routine);\r
3196                                         ok=1;\r
3197                                         IN_ClearKeysDown();\r
3198                                         break;\r
3199                                 }\r
3200 \r
3201                         //\r
3202                         // DIDN'T FIND A MATCH FIRST TIME THRU. CHECK AGAIN.\r
3203                         //\r
3204                         if (!ok)\r
3205                         {\r
3206                                 for (i=0;i<which;i++)\r
3207                                         if ((items+i)->active && (items+i)->string[0]==key)\r
3208                                         {\r
3209                                                 EraseGun(item_i,items,x,y,which);\r
3210                                                 which=i;\r
3211                                                 DrawGun(item_i,items,x,&y,which,basey,routine);\r
3212                                                 IN_ClearKeysDown();\r
3213                                                 break;\r
3214                                         }\r
3215                         }\r
3216                 }\r
3217 \r
3218                 //\r
3219                 // GET INPUT\r
3220                 //\r
3221                 ReadAnyControl(&ci);\r
3222                 switch(ci.dir)\r
3223                 {\r
3224                         ////////////////////////////////////////////////\r
3225                         //\r
3226                         // MOVE UP\r
3227                         //\r
3228                         case dir_North:\r
3229 \r
3230                         EraseGun(item_i,items,x,y,which);\r
3231 \r
3232                         //\r
3233                         // ANIMATE HALF-STEP\r
3234                         //\r
3235                         if (which && (items+which-1)->active)\r
3236                         {\r
3237                                 y-=6;\r
3238                                 DrawHalfStep(x,y);\r
3239                         }\r
3240 \r
3241                         //\r
3242                         // MOVE TO NEXT AVAILABLE SPOT\r
3243                         //\r
3244                         do\r
3245                         {\r
3246                                 if (!which)\r
3247                                         which=item_i->amount-1;\r
3248                                 else\r
3249                                         which--;\r
3250                         } while(!(items+which)->active);\r
3251 \r
3252                         DrawGun(item_i,items,x,&y,which,basey,routine);\r
3253                         //\r
3254                         // WAIT FOR BUTTON-UP OR DELAY NEXT MOVE\r
3255                         //\r
3256                         TicDelay(20);\r
3257                         break;\r
3258 \r
3259                         ////////////////////////////////////////////////\r
3260                         //\r
3261                         // MOVE DOWN\r
3262                         //\r
3263                         case dir_South:\r
3264 \r
3265                         EraseGun(item_i,items,x,y,which);\r
3266                         //\r
3267                         // ANIMATE HALF-STEP\r
3268                         //\r
3269                         if (which!=item_i->amount-1 && (items+which+1)->active)\r
3270                         {\r
3271                                 y+=6;\r
3272                                 DrawHalfStep(x,y);\r
3273                         }\r
3274 \r
3275                         do\r
3276                         {\r
3277                                 if (which==item_i->amount-1)\r
3278                                         which=0;\r
3279                                 else\r
3280                                         which++;\r
3281                         } while(!(items+which)->active);\r
3282 \r
3283                         DrawGun(item_i,items,x,&y,which,basey,routine);\r
3284 \r
3285                         //\r
3286                         // WAIT FOR BUTTON-UP OR DELAY NEXT MOVE\r
3287                         //\r
3288                         TicDelay(20);\r
3289                         break;\r
3290                 }\r
3291 \r
3292                 if (ci.button0 ||\r
3293                         Keyboard[sc_Space] ||\r
3294                         Keyboard[sc_Enter])\r
3295                                 exit=1;\r
3296 \r
3297                 if (ci.button1 ||\r
3298                         Keyboard[sc_Escape])\r
3299                                 exit=2;\r
3300 \r
3301         } while(!exit);\r
3302 \r
3303 \r
3304         IN_ClearKeysDown();\r
3305 \r
3306         //\r
3307         // ERASE EVERYTHING\r
3308         //\r
3309         if (lastitem!=which)\r
3310         {\r
3311                 VWB_Bar(x-1,y,25,16,BKGDCOLOR);\r
3312                 PrintX=item_i->x+item_i->indent;\r
3313                 PrintY=item_i->y+which*13;\r
3314                 US_Print((items+which)->string);\r
3315                 redrawitem=1;\r
3316         }\r
3317         else\r
3318                 redrawitem=0;\r
3319 \r
3320         if (routine)\r
3321                 routine(which);\r
3322         VW_UpdateScreen();\r
3323 \r
3324         item_i->curpos=which;\r
3325 \r
3326         lastitem=which;\r
3327         switch(exit)\r
3328         {\r
3329                 case 1:\r
3330                         //\r
3331                         // CALL THE ROUTINE\r
3332                         //\r
3333                         if ((items+which)->routine!=NULL)\r
3334                         {\r
3335                                 ShootSnd();\r
3336                                 MenuFadeOut();\r
3337                                 (items+which)->routine(0);\r
3338                         }\r
3339                         return which;\r
3340 \r
3341                 case 2:\r
3342                         SD_PlaySound(ESCPRESSEDSND);\r
3343                         return -1;\r
3344         }\r
3345 \r
3346         return 0; // JUST TO SHUT UP THE ERROR MESSAGES!\r
3347 }\r
3348 \r
3349 \r
3350 //\r
3351 // ERASE GUN & DE-HIGHLIGHT STRING\r
3352 //\r
3353 void EraseGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int y,int which)\r
3354 {\r
3355         VWB_Bar(x-1,y,25,16,BKGDCOLOR);\r
3356         SetTextColor(items+which,0);\r
3357 \r
3358         PrintX=item_i->x+item_i->indent;\r
3359         PrintY=item_i->y+which*13;\r
3360         US_Print((items+which)->string);\r
3361         VW_UpdateScreen();\r
3362 }\r
3363 \r
3364 \r
3365 //\r
3366 // DRAW HALF STEP OF GUN TO NEXT POSITION\r
3367 //\r
3368 void DrawHalfStep(int x,int y)\r
3369 {\r
3370         VWB_DrawPic(x,y,C_CURSOR1PIC);\r
3371         VW_UpdateScreen();\r
3372         SD_PlaySound(MOVEGUN1SND);\r
3373         TimeCount=0;\r
3374         while(TimeCount<8);\r
3375 }\r
3376 \r
3377 \r
3378 //\r
3379 // DRAW GUN AT NEW POSITION\r
3380 //\r
3381 void DrawGun(CP_iteminfo *item_i,CP_itemtype far *items,int x,int *y,int which,int basey,void (*routine)(int w))\r
3382 {\r
3383         VWB_Bar(x-1,*y,25,16,BKGDCOLOR);\r
3384         *y=basey+which*13;\r
3385         VWB_DrawPic(x,*y,C_CURSOR1PIC);\r
3386         SetTextColor(items+which,1);\r
3387 \r
3388         PrintX=item_i->x+item_i->indent;\r
3389         PrintY=item_i->y+which*13;\r
3390         US_Print((items+which)->string);\r
3391 \r
3392         //\r
3393         // CALL CUSTOM ROUTINE IF IT IS NEEDED\r
3394         //\r
3395         if (routine)\r
3396                 routine(which);\r
3397         VW_UpdateScreen();\r
3398         SD_PlaySound(MOVEGUN2SND);\r
3399 }\r
3400 \r
3401 ////////////////////////////////////////////////////////////////////\r
3402 //\r
3403 // DELAY FOR AN AMOUNT OF TICS OR UNTIL CONTROLS ARE INACTIVE\r
3404 //\r
3405 ////////////////////////////////////////////////////////////////////\r
3406 void TicDelay(int count)\r
3407 {\r
3408         ControlInfo ci;\r
3409 \r
3410 \r
3411         TimeCount=0;\r
3412         do\r
3413         {\r
3414                 ReadAnyControl(&ci);\r
3415         } while(TimeCount<count && ci.dir!=dir_None);\r
3416 }\r
3417 \r
3418 \r
3419 ////////////////////////////////////////////////////////////////////\r
3420 //\r
3421 // Draw a menu\r
3422 //\r
3423 ////////////////////////////////////////////////////////////////////\r
3424 void DrawMenu(CP_iteminfo *item_i,CP_itemtype far *items)\r
3425 {\r
3426         int i,which=item_i->curpos;\r
3427 \r
3428 \r
3429         WindowX=PrintX=item_i->x+item_i->indent;\r
3430         WindowY=PrintY=item_i->y;\r
3431         WindowW=320;\r
3432         WindowH=200;\r
3433 \r
3434         for (i=0;i<item_i->amount;i++)\r
3435         {\r
3436                 SetTextColor(items+i,which==i);\r
3437 \r
3438                 PrintY=item_i->y+i*13;\r
3439                 if ((items+i)->active)\r
3440                         US_Print((items+i)->string);\r
3441                 else\r
3442                 {\r
3443                         SETFONTCOLOR(DEACTIVE,BKGDCOLOR);\r
3444                         US_Print((items+i)->string);\r
3445                         SETFONTCOLOR(TEXTCOLOR,BKGDCOLOR);\r
3446                 }\r
3447 \r
3448                 US_Print("\n");\r
3449         }\r
3450 }\r
3451 \r
3452 \r
3453 ////////////////////////////////////////////////////////////////////\r
3454 //\r
3455 // SET TEXT COLOR (HIGHLIGHT OR NO)\r
3456 //\r
3457 ////////////////////////////////////////////////////////////////////\r
3458 void SetTextColor(CP_itemtype far *items,int hlight)\r
3459 {\r
3460         if (hlight)\r
3461                 {SETFONTCOLOR(color_hlite[items->active],BKGDCOLOR);}\r
3462         else\r
3463                 {SETFONTCOLOR(color_norml[items->active],BKGDCOLOR);}\r
3464 }\r
3465 \r
3466 \r
3467 ////////////////////////////////////////////////////////////////////\r
3468 //\r
3469 // WAIT FOR CTRLKEY-UP OR BUTTON-UP\r
3470 //\r
3471 ////////////////////////////////////////////////////////////////////\r
3472 void WaitKeyUp(void)\r
3473 {\r
3474         ControlInfo ci;\r
3475         while(ReadAnyControl(&ci),      ci.button0|\r
3476                                                                 ci.button1|\r
3477                                                                 ci.button2|\r
3478                                                                 ci.button3|\r
3479                                                                 Keyboard[sc_Space]|\r
3480                                                                 Keyboard[sc_Enter]|\r
3481                                                                 Keyboard[sc_Escape]);\r
3482 }\r
3483 \r
3484 \r
3485 ////////////////////////////////////////////////////////////////////\r
3486 //\r
3487 // READ KEYBOARD, JOYSTICK AND MOUSE FOR INPUT\r
3488 //\r
3489 ////////////////////////////////////////////////////////////////////\r
3490 void ReadAnyControl(ControlInfo *ci)\r
3491 {\r
3492         int mouseactive=0;\r
3493 \r
3494 \r
3495         IN_ReadControl(0,ci);\r
3496 \r
3497         if (mouseenabled)\r
3498         {\r
3499                 int mousey,mousex;\r
3500 \r
3501 \r
3502                 // READ MOUSE MOTION COUNTERS\r
3503                 // RETURN DIRECTION\r
3504                 // HOME MOUSE\r
3505                 // CHECK MOUSE BUTTONS\r
3506 \r
3507                 Mouse(3);\r
3508                 mousex=_CX;\r
3509                 mousey=_DX;\r
3510 \r
3511                 if (mousey<CENTER-SENSITIVE)\r
3512                 {\r
3513                         ci->dir=dir_North;\r
3514                         _CX=_DX=CENTER;\r
3515                         Mouse(4);\r
3516                         mouseactive=1;\r
3517                 }\r
3518                 else\r
3519                 if (mousey>CENTER+SENSITIVE)\r
3520                 {\r
3521                         ci->dir=dir_South;\r
3522                         _CX=_DX=CENTER;\r
3523                         Mouse(4);\r
3524                         mouseactive=1;\r
3525                 }\r
3526 \r
3527                 if (mousex<CENTER-SENSITIVE)\r
3528                 {\r
3529                         ci->dir=dir_West;\r
3530                         _CX=_DX=CENTER;\r
3531                         Mouse(4);\r
3532                         mouseactive=1;\r
3533                 }\r
3534                 else\r
3535                 if (mousex>CENTER+SENSITIVE)\r
3536                 {\r
3537                         ci->dir=dir_East;\r
3538                         _CX=_DX=CENTER;\r
3539                         Mouse(4);\r
3540                         mouseactive=1;\r
3541                 }\r
3542 \r
3543                 if (IN_MouseButtons())\r
3544                 {\r
3545                         ci->button0=IN_MouseButtons()&1;\r
3546                         ci->button1=IN_MouseButtons()&2;\r
3547                         ci->button2=IN_MouseButtons()&4;\r
3548                         ci->button3=false;\r
3549                         mouseactive=1;\r
3550                 }\r
3551         }\r
3552 \r
3553         if (joystickenabled && !mouseactive)\r
3554         {\r
3555                 int jx,jy,jb;\r
3556 \r
3557 \r
3558                 INL_GetJoyDelta(joystickport,&jx,&jy);\r
3559                 if (jy<-SENSITIVE)\r
3560                         ci->dir=dir_North;\r
3561                 else\r
3562                 if (jy>SENSITIVE)\r
3563                         ci->dir=dir_South;\r
3564 \r
3565                 if (jx<-SENSITIVE)\r
3566                         ci->dir=dir_West;\r
3567                 else\r
3568                 if (jx>SENSITIVE)\r
3569                         ci->dir=dir_East;\r
3570 \r
3571                 jb=IN_JoyButtons();\r
3572                 if (jb)\r
3573                 {\r
3574                         ci->button0=jb&1;\r
3575                         ci->button1=jb&2;\r
3576                         if (joypadenabled)\r
3577                         {\r
3578                                 ci->button2=jb&4;\r
3579                                 ci->button3=jb&8;\r
3580                         }\r
3581                         else\r
3582                                 ci->button2=ci->button3=false;\r
3583                 }\r
3584         }\r
3585 }\r
3586 \r
3587 \r
3588 ////////////////////////////////////////////////////////////////////\r
3589 //\r
3590 // DRAW DIALOG AND CONFIRM YES OR NO TO QUESTION\r
3591 //\r
3592 ////////////////////////////////////////////////////////////////////\r
3593 int Confirm(char far *string)\r
3594 {\r
3595         int xit=0,i,x,y,tick=0,time,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};\r
3596 \r
3597 \r
3598         Message(string);\r
3599         IN_ClearKeysDown();\r
3600 \r
3601         //\r
3602         // BLINK CURSOR\r
3603         //\r
3604         x=PrintX;\r
3605         y=PrintY;\r
3606         TimeCount=0;\r
3607 \r
3608         do\r
3609         {\r
3610                 if (TimeCount>=10)\r
3611                 {\r
3612                         switch(tick)\r
3613                         {\r
3614                                 case 0:\r
3615                                         VWB_Bar(x,y,8,13,TEXTCOLOR);\r
3616                                         break;\r
3617                                 case 1:\r
3618                                         PrintX=x;\r
3619                                         PrintY=y;\r
3620                                         US_Print("_");\r
3621                         }\r
3622                         VW_UpdateScreen();\r
3623                         tick^=1;\r
3624                         TimeCount=0;\r
3625                 }\r
3626 \r
3627                 #ifndef SPEAR\r
3628                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
3629                         PicturePause();\r
3630                 #endif\r
3631 \r
3632         #ifdef SPANISH\r
3633         } while(!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);\r
3634         #else\r
3635         } while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);\r
3636         #endif\r
3637 \r
3638         #ifdef SPANISH\r
3639         if (Keyboard[sc_S])\r
3640         {\r
3641                 xit=1;\r
3642                 ShootSnd();\r
3643         }\r
3644 \r
3645         while(Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape]);\r
3646 \r
3647         #else\r
3648 \r
3649         if (Keyboard[sc_Y])\r
3650         {\r
3651                 xit=1;\r
3652                 ShootSnd();\r
3653         }\r
3654 \r
3655         while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);\r
3656         #endif\r
3657 \r
3658         IN_ClearKeysDown();\r
3659         SD_PlaySound(whichsnd[xit]);\r
3660         return xit;\r
3661 }\r
3662 \r
3663 #ifdef JAPAN\r
3664 ////////////////////////////////////////////////////////////////////\r
3665 //\r
3666 // DRAW MESSAGE & GET Y OR N\r
3667 //\r
3668 ////////////////////////////////////////////////////////////////////\r
3669 int GetYorN(int x,int y,int pic)\r
3670 {\r
3671         int xit=0,whichsnd[2]={ESCPRESSEDSND,SHOOTSND};\r
3672 \r
3673 \r
3674         CA_CacheGrChunk(pic);\r
3675         VWB_DrawPic(x * 8,y * 8,pic);\r
3676         UNCACHEGRCHUNK(pic);\r
3677         VW_UpdateScreen();\r
3678         IN_ClearKeysDown();\r
3679 \r
3680         do\r
3681         {\r
3682                 #ifndef SPEAR\r
3683                 if (Keyboard[sc_Tab] && Keyboard[sc_P] && MS_CheckParm("goobers"))\r
3684                         PicturePause();\r
3685                 #endif\r
3686 \r
3687         #ifdef SPANISH\r
3688         } while(!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);\r
3689         #else\r
3690         } while(!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);\r
3691         #endif\r
3692 \r
3693         #ifdef SPANISH\r
3694         if (Keyboard[sc_S])\r
3695         {\r
3696                 xit=1;\r
3697                 ShootSnd();\r
3698         }\r
3699 \r
3700         while(Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape]);\r
3701 \r
3702         #else\r
3703 \r
3704         if (Keyboard[sc_Y])\r
3705         {\r
3706                 xit=1;\r
3707                 ShootSnd();\r
3708         }\r
3709 \r
3710         while(Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape]);\r
3711         #endif\r
3712 \r
3713         IN_ClearKeysDown();\r
3714         SD_PlaySound(whichsnd[xit]);\r
3715         return xit;\r
3716 }\r
3717 #endif\r
3718 \r
3719 \r
3720 ////////////////////////////////////////////////////////////////////\r
3721 //\r
3722 // PRINT A MESSAGE IN A WINDOW\r
3723 //\r
3724 ////////////////////////////////////////////////////////////////////\r
3725 void Message(char far *string)\r
3726 {\r
3727         int h=0,w=0,mw=0,i,x,y,time;\r
3728         fontstruct _seg *font;\r
3729 \r
3730 \r
3731         CA_CacheGrChunk (STARTFONT+1);\r
3732         fontnumber=1;\r
3733         font=grsegs[STARTFONT+fontnumber];\r
3734         h=font->height;\r
3735         for (i=0;i<_fstrlen(string);i++)\r
3736                 if (string[i]=='\n')\r
3737                 {\r
3738                         if (w>mw)\r
3739                                 mw=w;\r
3740                         w=0;\r
3741                         h+=font->height;\r
3742                 }\r
3743                 else\r
3744                         w+=font->width[string[i]];\r
3745 \r
3746         if (w+10>mw)\r
3747                 mw=w+10;\r
3748 \r
3749         PrintY=(WindowH/2)-h/2;\r
3750         PrintX=WindowX=160-mw/2;\r
3751 \r
3752         DrawWindow(WindowX-5,PrintY-5,mw+10,h+10,TEXTCOLOR);\r
3753         DrawOutline(WindowX-5,PrintY-5,mw+10,h+10,0,HIGHLIGHT);\r
3754         SETFONTCOLOR(0,TEXTCOLOR);\r
3755         US_Print(string);\r
3756         VW_UpdateScreen();\r
3757 }\r
3758 \r
3759 \r
3760 ////////////////////////////////////////////////////////////////////\r
3761 //\r
3762 // THIS MAY BE FIXED A LITTLE LATER...\r
3763 //\r
3764 ////////////////////////////////////////////////////////////////////\r
3765 static  int     lastmusic;\r
3766 \r
3767 void StartCPMusic(int song)\r
3768 {\r
3769         musicnames      chunk;\r
3770 \r
3771         if (audiosegs[STARTMUSIC + lastmusic])  // JDC\r
3772                 MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmusic]);\r
3773         lastmusic = song;\r
3774 \r
3775         SD_MusicOff();\r
3776         chunk = song;\r
3777 \r
3778         MM_BombOnError (false);\r
3779         CA_CacheAudioChunk(STARTMUSIC + chunk);\r
3780         MM_BombOnError (true);\r
3781         if (mmerror)\r
3782                 mmerror = false;\r
3783         else\r
3784         {\r
3785                 MM_SetLock(&((memptr)audiosegs[STARTMUSIC + chunk]),true);\r
3786                 SD_StartMusic((MusicGroup far *)audiosegs[STARTMUSIC + chunk]);\r
3787         }\r
3788 }\r
3789 \r
3790 void FreeMusic (void)\r
3791 {\r
3792         if (audiosegs[STARTMUSIC + lastmusic])  // JDC\r
3793                 MM_FreePtr ((memptr *)&audiosegs[STARTMUSIC + lastmusic]);\r
3794 }\r
3795 \r
3796 \r
3797 ///////////////////////////////////////////////////////////////////////////\r
3798 //\r
3799 //      IN_GetScanName() - Returns a string containing the name of the\r
3800 //              specified scan code\r
3801 //\r
3802 ///////////////////////////////////////////////////////////////////////////\r
3803 byte *\r
3804 IN_GetScanName(ScanCode scan)\r
3805 {\r
3806         byte            **p;\r
3807         ScanCode        far *s;\r
3808 \r
3809         for (s = ExtScanCodes,p = ExtScanNames;*s;p++,s++)\r
3810                 if (*s == scan)\r
3811                         return(*p);\r
3812 \r
3813         return(ScanNames[scan]);\r
3814 }\r
3815 \r
3816 \r
3817 ///////////////////////////////////////////////////////////////////////////\r
3818 //\r
3819 // CHECK FOR PAUSE KEY (FOR MUSIC ONLY)\r
3820 //\r
3821 ///////////////////////////////////////////////////////////////////////////\r
3822 void CheckPause(void)\r
3823 {\r
3824         if (Paused)\r
3825         {\r
3826                 switch(SoundStatus)\r
3827                 {\r
3828                         case 0: SD_MusicOn(); break;\r
3829                         case 1: SD_MusicOff(); break;\r
3830                 }\r
3831 \r
3832                 SoundStatus^=1;\r
3833                 VW_WaitVBL(3);\r
3834                 IN_ClearKeysDown();\r
3835                 Paused=false;\r
3836  }\r
3837 }\r
3838 \r
3839 \r
3840 ///////////////////////////////////////////////////////////////////////////\r
3841 //\r
3842 // DRAW GUN CURSOR AT CORRECT POSITION IN MENU\r
3843 //\r
3844 ///////////////////////////////////////////////////////////////////////////\r
3845 void DrawMenuGun(CP_iteminfo *iteminfo)\r
3846 {\r
3847         int x,y;\r
3848 \r
3849 \r
3850         x=iteminfo->x;\r
3851         y=iteminfo->y+iteminfo->curpos*13-2;\r
3852         VWB_DrawPic(x,y,C_CURSOR1PIC);\r
3853 }\r
3854 \r
3855 \r
3856 ///////////////////////////////////////////////////////////////////////////\r
3857 //\r
3858 // DRAW SCREEN TITLE STRIPES\r
3859 //\r
3860 ///////////////////////////////////////////////////////////////////////////\r
3861 void DrawStripes(int y)\r
3862 {\r
3863 #ifndef SPEAR\r
3864         VWB_Bar(0,y,320,24,0);\r
3865         VWB_Hlin(0,319,y+22,STRIPE);\r
3866 #else\r
3867         VWB_Bar(0,y,320,22,0);\r
3868         VWB_Hlin(0,319,y+23,0);\r
3869 #endif\r
3870 }\r
3871 \r
3872 void ShootSnd(void)\r
3873 {\r
3874         SD_PlaySound(SHOOTSND);\r
3875 }\r
3876 \r
3877 \r
3878 ///////////////////////////////////////////////////////////////////////////\r
3879 //\r
3880 // CHECK FOR EPISODES\r
3881 //\r
3882 ///////////////////////////////////////////////////////////////////////////\r
3883 void CheckForEpisodes(void)\r
3884 {\r
3885         struct ffblk f;\r
3886 \r
3887 //\r
3888 // JAPANESE VERSION\r
3889 //\r
3890 #ifdef JAPAN\r
3891 #ifdef JAPDEMO\r
3892         if (!findfirst("*.WJ1",&f,FA_ARCH))\r
3893         {\r
3894                 strcpy(extension,"WJ1");\r
3895 #else\r
3896         if (!findfirst("*.WJ6",&f,FA_ARCH))\r
3897         {\r
3898                 strcpy(extension,"WJ6");\r
3899 #endif\r
3900                 strcat(configname,extension);\r
3901                 strcat(SaveName,extension);\r
3902                 strcat(PageFileName,extension);\r
3903                 strcat(audioname,extension);\r
3904                 strcat(demoname,extension);\r
3905                 EpisodeSelect[1] =\r
3906                 EpisodeSelect[2] =\r
3907                 EpisodeSelect[3] =\r
3908                 EpisodeSelect[4] =\r
3909                 EpisodeSelect[5] = 1;\r
3910         }\r
3911         else\r
3912                 Quit("NO JAPANESE WOLFENSTEIN 3-D DATA FILES to be found!");\r
3913 #else\r
3914 \r
3915 //\r
3916 // ENGLISH\r
3917 //\r
3918 #ifndef UPLOAD\r
3919 #ifndef SPEAR\r
3920         if (!findfirst("*.WL6",&f,FA_ARCH))\r
3921         {\r
3922                 strcpy(extension,"WL6");\r
3923                 NewEmenu[2].active =\r
3924                 NewEmenu[4].active =\r
3925                 NewEmenu[6].active =\r
3926                 NewEmenu[8].active =\r
3927                 NewEmenu[10].active =\r
3928                 EpisodeSelect[1] =\r
3929                 EpisodeSelect[2] =\r
3930                 EpisodeSelect[3] =\r
3931                 EpisodeSelect[4] =\r
3932                 EpisodeSelect[5] = 1;\r
3933         }\r
3934         else\r
3935         if (!findfirst("*.WL3",&f,FA_ARCH))\r
3936         {\r
3937                 strcpy(extension,"WL3");\r
3938                 NewEmenu[2].active =\r
3939                 NewEmenu[4].active =\r
3940                 EpisodeSelect[1] =\r
3941                 EpisodeSelect[2] = 1;\r
3942         }\r
3943         else\r
3944 #endif\r
3945 #endif\r
3946 \r
3947 \r
3948 \r
3949 #ifdef SPEAR\r
3950 #ifndef SPEARDEMO\r
3951         if (!findfirst("*.SOD",&f,FA_ARCH))\r
3952         {\r
3953                 strcpy(extension,"SOD");\r
3954         }\r
3955         else\r
3956                 Quit("NO SPEAR OF DESTINY DATA FILES TO BE FOUND!");\r
3957 #else\r
3958         if (!findfirst("*.SDM",&f,FA_ARCH))\r
3959         {\r
3960                 strcpy(extension,"SDM");\r
3961         }\r
3962         else\r
3963                 Quit("NO SPEAR OF DESTINY DEMO DATA FILES TO BE FOUND!");\r
3964 #endif\r
3965 \r
3966 #else\r
3967         if (!findfirst("*.WL1",&f,FA_ARCH))\r
3968         {\r
3969                 strcpy(extension,"WL1");\r
3970         }\r
3971         else\r
3972                 Quit("NO WOLFENSTEIN 3-D DATA FILES to be found!");\r
3973 #endif\r
3974 \r
3975         strcat(configname,extension);\r
3976         strcat(SaveName,extension);\r
3977         strcat(PageFileName,extension);\r
3978         strcat(audioname,extension);\r
3979         strcat(demoname,extension);\r
3980 #ifndef SPEAR\r
3981 #ifndef GOODTIMES\r
3982         strcat(helpfilename,extension);\r
3983 #endif\r
3984         strcat(endfilename,extension);\r
3985 #endif\r
3986 #endif\r
3987 }\r