MAIN.BAK 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. //
  2. // MAIN.C - Handles StartUp and the MainMenu
  3. //
  4. #include <process.h>
  5. #include <io.h>
  6. #include <dos.h>
  7. #include <mem.h>
  8. #include <conio.h>
  9. #include <bios.h>
  10. #include <string.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include "main.h"
  14. #include "default.h"
  15. #include "scguess.h"
  16. int cdrom; // cmd-line param flag
  17. char keydesc[256][10];
  18. unsigned char ASCIINames[] = // Unshifted ASCII for scan codes
  19. {
  20. // 0 1 2 3 4 5 6 7 8 9 A B C D E F
  21. 0 ,0 ,'1','2','3','4','5','6','7','8','9','0','-','=',0 ,0 , // 0
  22. 'Q','W','E','R','T','Y','U','I','O','P','[',']',0 ,0 ,'A','S', // 1
  23. 'D','F','G','H','J','K','L',';',0, '`', 0 ,92 ,'Z','X','C','V', // 2
  24. 'B','N','M',',','.','/',0 ,'*',0 , 0, 0 ,0 ,0 ,0 ,0 ,0 , // 3
  25. 0 ,0 ,0 ,0 ,0 ,0 ,0 ,'7','8','9','-','4','5','6','+','1', // 4
  26. '2','3','0',0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5
  27. 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6
  28. 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7
  29. };
  30. char cards[M_LAST][20] = {
  31. S_NONE,
  32. S_PCSP,
  33. "Adlib",
  34. "Sound Blaster",
  35. "Pro Audio Spectrum",
  36. "Gravis Ultra Sound",
  37. "WaveBlaster",
  38. "Roland Sound Canvas",
  39. "General Midi",
  40. "Sound Blaster AWE32"
  41. };
  42. char controls [C_LAST][20] = {
  43. S_CON1,
  44. S_CON2,
  45. S_CON3
  46. };
  47. CONTS curk;
  48. net_t netinfo;
  49. net_t info; // in case ESC is pressed
  50. serial_t modeminfo;
  51. serial_t minfo; // in case ESC is pressed
  52. serial_t serialinfo;
  53. serial_t sinfo; // in case ESC is pressed
  54. DMXINFO lastc;
  55. DMXINFO newc;
  56. void * swindow;
  57. BOOL savemusic = FALSE;
  58. BOOL savefx = FALSE;
  59. #define KEYBOARDINT 0x9
  60. int mousepresent = 0;
  61. enum
  62. {
  63. MAIN_CMUSIC,
  64. MAIN_CSFX,
  65. MAIN_TYPE,
  66. MAIN_CONFIG,
  67. MAIN_SAVE,
  68. MAIN_NET,
  69. MAIN_NETSG,
  70. MAIN_MAX
  71. };
  72. item_t mainitems[]=
  73. {
  74. {MAIN_CMUSIC, 21,12,39, -1,-1},
  75. {MAIN_CSFX, 21,13,39, -1,-1},
  76. {MAIN_TYPE, 21,14,39, -1,-1},
  77. {MAIN_CONFIG, 21,15,39, -1,-1},
  78. {MAIN_SAVE, 21,16,39, -1,-1},
  79. {MAIN_NET, 21,18,39, -1,-1},
  80. {MAIN_NETSG, 21,19,39, -1,-1}
  81. };
  82. menu_t mainmenu =
  83. {
  84. &mainitems[0],
  85. MAIN_CMUSIC,
  86. MAIN_MAX,
  87. 0x7f
  88. };
  89. //
  90. // Draw a PUP and get a keypress
  91. //
  92. void ErrorWindow(pup_t far *pup)
  93. {
  94. SaveScreen();
  95. DrawPup(pup);
  96. while (kbhit())
  97. getch();
  98. while (getch() != 0x1b);
  99. RestoreScreen();
  100. while (kbhit())
  101. getch();
  102. sound(3000);
  103. delay(10);
  104. nosound();
  105. }
  106. //
  107. // Make ASCII names/key value lookup
  108. //
  109. void MakeKeyLookup (void)
  110. {
  111. int loop;
  112. memset ( keydesc, 0, sizeof ( keydesc ) );
  113. for ( loop = 0; loop < 128; loop++ )
  114. keydesc [ loop ] [ 0 ] = ASCIINames[ loop ];
  115. strcpy ( keydesc [ SC_CAPS_LOCK ], "CAPSLOCK" );
  116. strcpy ( keydesc [ SC_BACKSPACE ], "BACKSP" );
  117. strcpy ( keydesc [ SC_ENTER ], "ENTER" );
  118. strcpy ( keydesc [ SC_TAB ], "TAB" );
  119. strcpy ( keydesc [ SC_RIGHT_SHIFT ], "RSHIFT" );
  120. strcpy ( keydesc [ SC_SPACE ], "SPACE" );
  121. strcpy ( keydesc [ SC_CTRL ], "CTRL" );
  122. strcpy ( keydesc [ SC_ALT ], "ALT" );
  123. strcpy ( keydesc [ SC_INSERT ], "INS" );
  124. strcpy ( keydesc [ SC_DELETE ], "DEL" );
  125. strcpy ( keydesc [ SC_PAGEUP ], "PGUP" );
  126. strcpy ( keydesc [ SC_PAGEDN ], "PGDN" );
  127. strcpy ( keydesc [ SC_HOME ], "HOME" );
  128. strcpy ( keydesc [ SC_END ], "END" );
  129. strcpy ( keydesc [ SC_UP ], "UP" );
  130. strcpy ( keydesc [ SC_DOWN ], "DOWN" );
  131. strcpy ( keydesc [ SC_LEFT ], "LEFT" );
  132. strcpy ( keydesc [ SC_RIGHT ], "RIGHT" );
  133. }
  134. //
  135. // Set funky blue color
  136. //
  137. void SetColor (void)
  138. {
  139. return; // DON'T DO ANYTHING UNTIL I CAN SET IT BACK!
  140. #if 0
  141. _asm
  142. {
  143. push ax
  144. push dx
  145. mov dx, 0x3C8
  146. mov ax, 1
  147. out dx, al
  148. inc dx
  149. mov ax, 1
  150. out dx, al
  151. mov ax, 5
  152. out dx, al
  153. mov ax, 16
  154. out dx, al
  155. pop dx
  156. pop ax
  157. }
  158. #endif
  159. }
  160. //
  161. // Draw current config info in window
  162. // MAKE SURE NO WINDOWS ARE ON TOP!
  163. //
  164. void DrawCurrentConfig(void)
  165. {
  166. RestoreScreen();
  167. textcolor(8);
  168. textbackground(7);
  169. gotoxy(43,6);
  170. cprintf(" ");
  171. gotoxy(43,6);
  172. cprintf("%s",controls [ newc.control ]);
  173. gotoxy(43,7);
  174. cprintf(" ");
  175. gotoxy(43,7);
  176. cprintf("%s",cards [ newc.m.card ]);
  177. gotoxy(43,8);
  178. cprintf(" ");
  179. gotoxy(43,8);
  180. cprintf("%s",cards [ newc.d.card ]);
  181. gotoxy(1,25);
  182. SaveScreen();
  183. }
  184. //
  185. // Quitting - save changes?
  186. //
  187. enum { SAVEYES, SAVENO, SAVEMAX };
  188. item_t quitwinitems[]=
  189. {
  190. {SAVEYES, 35,11,7, -1,-1},
  191. {SAVENO, 35,12,7, -1,-1}
  192. };
  193. menu_t quitwinmenu=
  194. {
  195. &quitwinitems[0],
  196. SAVEYES,
  197. SAVEMAX,
  198. 0x7f
  199. };
  200. int QuitAndSave(void)
  201. {
  202. short key;
  203. short field;
  204. SaveScreen();
  205. DrawPup(&quitwin);
  206. quitwinmenu.startitem = SAVEYES;
  207. while(1)
  208. {
  209. SetupMenu(&quitwinmenu);
  210. field = GetMenuInput();
  211. key = menukey;
  212. switch(key)
  213. {
  214. case KEY_ESC:
  215. RestoreScreen();
  216. return -1;
  217. case KEY_ENTER:
  218. if (field == SAVEYES)
  219. M_SaveDefaults();
  220. RestoreScreen();
  221. return 0;
  222. }
  223. }
  224. }
  225. //
  226. // Start up and initialize SETUP
  227. //
  228. void StartUp(void)
  229. {
  230. int addr;
  231. int irq;
  232. int dma;
  233. int midi;
  234. union REGS r;
  235. r.x.ax = 0;
  236. int86(0x33,&r,&r);
  237. if (r.x.ax == 0xffff)
  238. mousepresent = 1;
  239. else
  240. mousepresent = 0;
  241. r.x.ax = 2;
  242. int86(0x33, &r, &r );
  243. SetColor();
  244. memset ( &newc, 0, sizeof ( DMXINFO ) );
  245. memset ( &lastc, 0, sizeof ( DMXINFO ) );
  246. MakeKeyLookup();
  247. midi = addr = irq = dma = 0; // WILL BE INITED LATER
  248. curk.up = SC_UP;
  249. curk.down = SC_DOWN;
  250. curk.left = SC_LEFT;
  251. curk.right = SC_RIGHT;
  252. curk.fire = SC_CTRL;
  253. curk.use = SC_SPACE;
  254. curk.key1 = SC_ALT;
  255. curk.key2 = SC_RIGHT_SHIFT;
  256. curk.key3 = SC_COMMA;
  257. curk.key4 = SC_PERIOD;
  258. curk.mouse[0] = 0;
  259. curk.mouse[1] = 1;
  260. curk.mouse[2] = 2;
  261. curk.joy[0] = 0;
  262. curk.joy[1] = 1;
  263. curk.joy[2] = 2;
  264. curk.joy[3] = 3;
  265. newc.m.card = M_NONE;
  266. newc.m.port = -1;
  267. newc.m.midiport = -1;
  268. newc.m.irq = -1;
  269. newc.m.dma = -1;
  270. newc.d = newc.m;
  271. newc.numdig = 2;
  272. DrawPup(&title);
  273. DrawPup(&show);
  274. DrawPup(&idmain2);
  275. SaveScreen();
  276. if ( !M_LoadDefaults() )
  277. {
  278. //
  279. // Auto-detect ONLY first time through
  280. //
  281. if ( SmellsLikeGUS ( &addr, &irq, &dma ) )
  282. {
  283. if (newc.m.irq > 7)
  284. ErrorWindow(&gusirqer);
  285. newc.m.card = M_GUS;
  286. newc.m.port = addr;
  287. newc.m.midiport = -1;
  288. newc.m.irq = irq;
  289. newc.m.dma = dma;
  290. newc.d = newc.m;
  291. //fprintf(stderr, "GUS: addr=%x, irq=%d, dma=%d\n", addr, irq, dma);
  292. }
  293. else if ( SmellsLikeSB ( &addr, &irq, &dma, &midi ) )
  294. {
  295. newc.m.card = M_SB;
  296. newc.m.port = addr;
  297. newc.m.midiport = midi;
  298. newc.m.irq = irq;
  299. newc.m.dma = dma;
  300. newc.d = newc.m;
  301. }
  302. ChooseController();
  303. SetupMusic();
  304. SetupFX();
  305. lastc.control = newc.control;
  306. lastc.numdig = newc.numdig;
  307. lastc.m = newc.m;
  308. lastc.d = newc.d;
  309. mainmenu.startitem = MAIN_SAVE;
  310. }
  311. else
  312. {
  313. lastc.control = newc.control;
  314. lastc.numdig = newc.numdig;
  315. lastc.m = newc.m;
  316. lastc.d = newc.d;
  317. if (newc.m.irq > 7)
  318. ErrorWindow(&gusirqer);
  319. mainmenu.startitem = MAIN_CMUSIC;
  320. }
  321. DrawCurrentConfig();
  322. //
  323. // GLOBALS
  324. //
  325. respawn = nomonsters = 0;
  326. MainMenu();
  327. clrscr();
  328. }
  329. //
  330. // Main menu
  331. //
  332. void MainMenu (void)
  333. {
  334. int i;
  335. int field;
  336. short key;
  337. char *args[10];
  338. char string[10][10];
  339. int argcount;
  340. // ASSUME THAT THE MAIN MENU HAS BEEN DRAWN IN STARTUP
  341. while(1)
  342. {
  343. SetupMenu(&mainmenu);
  344. field = GetMenuInput();
  345. key = menukey;
  346. if ( key == KEY_ESC )
  347. {
  348. if (QuitAndSave() < 0)
  349. continue;
  350. break;
  351. }
  352. //
  353. // WARP
  354. //
  355. if (key == KEY_F1)
  356. {
  357. int level;
  358. int i;
  359. level = WarpTime();
  360. if (!level)
  361. continue;
  362. M_SaveDefaults();
  363. RestoreScreen();
  364. argcount = 1;
  365. if (nomonsters)
  366. args[argcount++] = "-nomonsters";
  367. if (respawn)
  368. args[argcount++] = "-respawn";
  369. args[argcount++] = "-warp";
  370. #ifdef DOOM2
  371. sprintf(string[argcount],"%d",level);
  372. args[argcount] = string[argcount];
  373. #else
  374. sprintf(string[argcount],"%d",level>>8);
  375. args[argcount] = string[argcount];
  376. argcount++;
  377. sprintf(string[argcount],"%d",level&0x0f);
  378. args[argcount] = string[argcount];
  379. #endif
  380. argcount++;
  381. if (cdrom)
  382. args[argcount++] = "-cdrom";
  383. for (i = 1;i < myargc; i++)
  384. args[argcount++] = myargv[i];
  385. args[argcount] = NULL;
  386. textbackground(0);
  387. textcolor(7);
  388. clrscr();
  389. if (!access("doom2.exe",0))
  390. {
  391. args[0] = "doom2.exe ";
  392. execv("doom2.exe",args);
  393. }
  394. else
  395. if (!access("heretic.exe",0))
  396. {
  397. args[0] = "heretic.exe ";
  398. execv("heretic.exe",args);
  399. }
  400. else
  401. if (!access("strife.exe",0))
  402. {
  403. args[0] = "strife.exe ";
  404. execv("strife.exe",args);
  405. }
  406. else
  407. {
  408. args[0] = "doom.exe ";
  409. execv("doom.exe",args);
  410. }
  411. printf("Problem EXECing "EXENAME" for netplay. Need to be in same directory!");
  412. //
  413. // ERROR EXECing!
  414. //
  415. exit(0);
  416. }
  417. if ( key != KEY_ENTER && key != KEY_F10 ) continue;
  418. switch ( field )
  419. {
  420. case MAIN_CMUSIC:
  421. SetupMusic();
  422. break;
  423. case MAIN_CSFX:
  424. SetupFX();
  425. break;
  426. case MAIN_TYPE:
  427. ChooseController();
  428. break;
  429. case MAIN_CONFIG:
  430. ConfigControl();
  431. break;
  432. case MAIN_SAVE:
  433. M_SaveDefaults();
  434. textbackground(0);
  435. textcolor(7);
  436. clrscr();
  437. argcount = 1;
  438. for (i = 1;i < myargc; i++)
  439. args[argcount++] = myargv[i];
  440. if (cdrom)
  441. args[argcount++] = "-cdrom";
  442. if (!access("heretic.exe",0))
  443. {
  444. args[0] = "heretic.exe";
  445. args[argcount] = NULL;
  446. execv("heretic.exe",args);
  447. }
  448. else
  449. if (!access("strife.exe",0))
  450. {
  451. args[0] = "strife.exe ";
  452. execv("strife.exe",args);
  453. }
  454. else
  455. if (!access("doom2.exe",0))
  456. {
  457. args[0] = "doom2.exe";
  458. args[argcount] = NULL;
  459. execv("doom2.exe",args);
  460. }
  461. else
  462. {
  463. args[0] = "doom.exe ";
  464. args[argcount] = NULL;
  465. execv("doom.exe",args);
  466. }
  467. printf("Problem EXECing "EXENAME"! Probably not in same directory!\n");
  468. exit(0);
  469. goto func_exit;
  470. case MAIN_NET:
  471. ChooseNetplay();
  472. break;
  473. case MAIN_NETSG:
  474. #ifndef STRIFE
  475. ChooseNetrestore();
  476. #endif
  477. break;
  478. default:
  479. break;
  480. }
  481. }
  482. func_exit:
  483. textbackground(0);
  484. textcolor(7);
  485. clrscr();
  486. return;
  487. }