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