CONFIG.C~ 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  1. //
  2. // Configure controllers
  3. //
  4. #include <dos.h>
  5. #include <conio.h>
  6. #include <bios.h>
  7. #include "main.h"
  8. void Pos(item_t *item)
  9. {
  10. gotoxy(item->x+1,item->y+1);
  11. }
  12. void Clear(item_t *item)
  13. {
  14. int i;
  15. Pos(item);
  16. for (i = 0;i < item->w; i++)
  17. cprintf(" ");
  18. gotoxy(1,25);
  19. }
  20. //
  21. // Get keyboard scan code
  22. //
  23. int GetScanCode (void)
  24. {
  25. volatile unsigned short rval;
  26. while (kbhit())
  27. getch();
  28. SaveScreen();
  29. DrawPup(&askpres);
  30. while(1)
  31. {
  32. rval = _bios_keybrd ( _KEYBRD_SHIFTSTATUS );
  33. if ( rval & 0x0004 )
  34. {
  35. rval = SC_CTRL;
  36. break;
  37. }
  38. else if ( rval & 0x0008 )
  39. {
  40. rval = SC_ALT;
  41. break;
  42. }
  43. else if ( rval & 0x0001 )
  44. {
  45. rval = SC_RIGHT_SHIFT;
  46. break;
  47. }
  48. else
  49. {
  50. rval = _bios_keybrd ( _KEYBRD_READY );
  51. rval = rval >> 8;
  52. if ( rval == SC_ENTER ) rval = 0;
  53. if ( rval == SC_BACKSPACE ) rval = 0;
  54. if ( rval ) break;
  55. }
  56. }
  57. RestoreScreen();
  58. while (kbhit())
  59. getch();
  60. return ( rval );
  61. }
  62. enum {FORWARD,BACKWARD,LEFT,RIGHT,
  63. #ifdef HERETIC
  64. LOOKD,LOOKC,LOOKU,FLYD,FLYC,FLYU,
  65. #endif
  66. USE,FIRE,SPEED,STRAFE,STRAFE_LEFT,STRAFE_RIGHT,
  67. #ifdef HERETIC
  68. INVL,INVR,
  69. #endif
  70. #ifdef STRIFE
  71. INVL,INVR,INVH,INVE,INVU,INVD,INVPOP,INVQ,HEALTHU,JUMP,LOOKU,LOOKD,
  72. #endif
  73. MAXKEYS};
  74. item_t idkeyselitems[]=
  75. {
  76. #ifdef HERETIC
  77. {FORWARD, 39,5,8, -1,-1},
  78. {BACKWARD, 39,6,8, -1,-1},
  79. {LEFT, 39,7,8, -1,-1},
  80. {RIGHT, 39,8,8, -1,-1},
  81. {LOOKD, 29,10,8, -1,LOOKC, RIGHT,FLYD},
  82. {LOOKC, 39,10,8, LOOKD,LOOKU, RIGHT,FLYC},
  83. {LOOKU, 49,10,8, LOOKC,-1, RIGHT,FLYU},
  84. {FLYD, 29,11,8, -1,FLYC, LOOKD,USE},
  85. {FLYC, 39,11,8, FLYD,FLYU, LOOKC,USE},
  86. {FLYU, 49,11,8, FLYC,-1, LOOKU,SPEED},
  87. {USE, 29,13,8, -1,SPEED, FLYD},
  88. {FIRE, 29,14,8, -1,STRAFE},
  89. {SPEED, 49,13,8, USE,-1, FLYU},
  90. {STRAFE, 49,14,8, FIRE,-1},
  91. {STRAFE_LEFT, 42,15,8, -1,-1, FIRE},
  92. {STRAFE_RIGHT, 42,16,8, -1,-1},
  93. {INVL, 42,17,8, -1,-1},
  94. {INVR, 42,18,8, -1,-1}
  95. #endif
  96. #ifdef STRIFE
  97. {FORWARD, 39,5,8, -1,-1},
  98. {BACKWARD, 39,6,8, -1,-1},
  99. {LEFT, 39,7,8, -1,STRAFE_LEFT,BACKWARD,RIGHT},
  100. {RIGHT, 39,8,8, -1,STRAFE_RIGHT,LEFT,INVL},
  101. {USE, 29,15,8, -1,SPEED,INVPOP,FIRE},
  102. {FIRE, 29,16,8, -1,STRAFE},
  103. {SPEED, 49,15,8, USE,-1, INVQ, STRAFE},
  104. {STRAFE, 49,16,8, FIRE,-1,SPEED,LOOKU},
  105. {STRAFE_LEFT, 52,7,8, LEFT,-1, BACKWARD, STRAFE_RIGHT},
  106. {STRAFE_RIGHT, 52,8,8, RIGHT,-1, STRAFE_LEFT,INVR},
  107. {INVL, 35,10,8, -1,INVR,RIGHT},
  108. {INVR, 52,10,8, INVL,-1,STRAFE_RIGHT,INVE},
  109. {INVH, 35,11,8, -1,INVE,INVL,INVU},
  110. {INVE, 52,11,8, INVH,-1,INVR,INVD},
  111. {INVU, 35,12,8, -1,INVD,INVH,INVPOP},
  112. {INVD, 52,12,8, INVU,-1,INVE,INVQ},
  113. {INVPOP, 35,13,8, -1,INVQ,INVU,USE},
  114. {INVQ, 52,13,8, INVPOP,-1,INVD,SPEED},
  115. {HEALTHU, 42,18,8, -1,LOOKD,JUMP,0},
  116. {JUMP, 35,17,8, -1,LOOKU,FIRE,HEALTHU},
  117. {LOOKU, 52,17,8, JUMP,-1,STRAFE,LOOKD},
  118. {LOOKD, 52,18,8, HEALTHU,-1,LOOKU,0},
  119. #else
  120. {FORWARD, 47,5,8, -1,-1},
  121. {BACKWARD, 47,6,8, -1,-1},
  122. {LEFT, 47,7,8, -1,-1},
  123. {RIGHT, 47,8,8, -1,-1},
  124. {USE, 47,12,8, -1,-1},
  125. {FIRE, 47,13,8, -1,-1},
  126. {SPEED, 47,14,8, -1,-1},
  127. {STRAFE, 47,15,8, -1,-1},
  128. {STRAFE_LEFT, 47,16,8, -1,-1},
  129. {STRAFE_RIGHT, 47,17,8, -1,-1},
  130. #endif
  131. };
  132. menu_t idkeyselmenu=
  133. {
  134. &idkeyselitems[0],
  135. FORWARD,
  136. MAXKEYS,
  137. 0x7f
  138. };
  139. void IDConfigKeyboard(void)
  140. {
  141. short field;
  142. short key;
  143. CONTS turk;
  144. int rval;
  145. SaveScreen();
  146. DrawPup(&idkeysel);
  147. turk = curk;
  148. textbackground(1);
  149. textcolor(15);
  150. Clear(&idkeyselitems[FORWARD]);
  151. Pos(&idkeyselitems[FORWARD]);
  152. cprintf("%s",keydesc[turk.up] );
  153. Clear(&idkeyselitems[BACKWARD]);
  154. Pos(&idkeyselitems[BACKWARD]);
  155. cprintf("%s",keydesc[turk.down] );
  156. Clear(&idkeyselitems[LEFT]);
  157. Pos(&idkeyselitems[LEFT]);
  158. cprintf("%s",keydesc[turk.left] );
  159. Clear(&idkeyselitems[RIGHT]);
  160. Pos(&idkeyselitems[RIGHT]);
  161. cprintf("%s",keydesc[turk.right] );
  162. Clear(&idkeyselitems[USE]);
  163. Pos(&idkeyselitems[USE]);
  164. cprintf("%s",keydesc[turk.use] );
  165. Clear(&idkeyselitems[FIRE]);
  166. Pos(&idkeyselitems[FIRE]);
  167. cprintf("%s",keydesc[turk.fire] );
  168. Clear(&idkeyselitems[SPEED]);
  169. Pos(&idkeyselitems[SPEED]);
  170. cprintf("%s",keydesc[turk.key2] );
  171. Clear(&idkeyselitems[STRAFE]);
  172. Pos(&idkeyselitems[STRAFE]);
  173. cprintf("%s",keydesc[turk.key1] );
  174. Clear(&idkeyselitems[STRAFE_LEFT]);
  175. Pos(&idkeyselitems[STRAFE_LEFT]);
  176. cprintf("%s",keydesc[turk.key3] );
  177. Clear(&idkeyselitems[STRAFE_RIGHT]);
  178. Pos(&idkeyselitems[STRAFE_RIGHT]);
  179. cprintf("%s",keydesc[turk.key4] );
  180. #ifdef HERETIC
  181. Clear(&idkeyselitems[LOOKD]);
  182. Pos(&idkeyselitems[LOOKD]);
  183. cprintf("%s",keydesc[turk.lookdown] );
  184. Clear(&idkeyselitems[LOOKC]);
  185. Pos(&idkeyselitems[LOOKC]);
  186. cprintf("%s",keydesc[turk.lookcenter] );
  187. Clear(&idkeyselitems[LOOKU]);
  188. Pos(&idkeyselitems[LOOKU]);
  189. cprintf("%s",keydesc[turk.lookup] );
  190. Clear(&idkeyselitems[FLYD]);
  191. Pos(&idkeyselitems[FLYD]);
  192. cprintf("%s",keydesc[turk.flydown] );
  193. Clear(&idkeyselitems[FLYC]);
  194. Pos(&idkeyselitems[FLYC]);
  195. cprintf("%s",keydesc[turk.flycenter] );
  196. Clear(&idkeyselitems[FLYU]);
  197. Pos(&idkeyselitems[FLYU]);
  198. cprintf("%s",keydesc[turk.flyup] );
  199. Clear(&idkeyselitems[INVL]);
  200. Pos(&idkeyselitems[INVL]);
  201. cprintf("%s",keydesc[turk.invleft] );
  202. Clear(&idkeyselitems[INVR]);
  203. Pos(&idkeyselitems[INVR]);
  204. cprintf("%s",keydesc[turk.invright] );
  205. #endif
  206. #ifdef STRIFE
  207. Clear(&idkeyselitems[INVL]);
  208. Pos(&idkeyselitems[INVL]);
  209. cprintf("%s",keydesc[turk.invleft] );
  210. Clear(&idkeyselitems[INVR]);
  211. Pos(&idkeyselitems[INVR]);
  212. cprintf("%s",keydesc[turk.invright] );
  213. Clear(&idkeyselitems[INVH]);
  214. Pos(&idkeyselitems[INVH]);
  215. cprintf("%s",keydesc[turk.invhome] );
  216. Clear(&idkeyselitems[INVE]);
  217. Pos(&idkeyselitems[INVE]);
  218. cprintf("%s",keydesc[turk.invend] );
  219. Clear(&idkeyselitems[INVU]);
  220. Pos(&idkeyselitems[INVU]);
  221. cprintf("%s",keydesc[turk.invuse] );
  222. Clear(&idkeyselitems[INVD]);
  223. Pos(&idkeyselitems[INVD]);
  224. cprintf("%s",keydesc[turk.invdrop] );
  225. Clear(&idkeyselitems[INVPOP]);
  226. Pos(&idkeyselitems[INVPOP]);
  227. cprintf("%s",keydesc[turk.invpop] );
  228. Clear(&idkeyselitems[INVQ]);
  229. Pos(&idkeyselitems[INVQ]);
  230. cprintf("%s",keydesc[turk.invquery] );
  231. Clear(&idkeyselitems[HEALTHU]);
  232. Pos(&idkeyselitems[HEALTHU]);
  233. cprintf("%s",keydesc[turk.healthuse] );
  234. Clear(&idkeyselitems[JUMP]);
  235. Pos(&idkeyselitems[JUMP]);
  236. cprintf("%s",keydesc[turk.jump] );
  237. Clear(&idkeyselitems[LOOKD]);
  238. Pos(&idkeyselitems[LOOKD]);
  239. cprintf("%s",keydesc[turk.lookdown] );
  240. Clear(&idkeyselitems[LOOKU]);
  241. Pos(&idkeyselitems[LOOKU]);
  242. cprintf("%s",keydesc[turk.lookup] );
  243. #endif
  244. gotoxy(1,25);
  245. while(1)
  246. {
  247. SetupMenu(&idkeyselmenu);
  248. field = GetMenuInput();
  249. key = menukey;
  250. switch ( key )
  251. {
  252. case KEY_ESC:
  253. goto func_exit;
  254. case KEY_F10:
  255. curk = turk;
  256. goto func_exit;
  257. case KEY_ENTER:
  258. switch ( field )
  259. {
  260. case FORWARD:
  261. rval = GetScanCode();
  262. if ( rval )
  263. {
  264. turk.up = rval;
  265. Clear(&idkeyselitems[FORWARD]);
  266. Pos(&idkeyselitems[FORWARD]);
  267. cprintf("%s",keydesc[turk.up] );
  268. }
  269. break;
  270. case BACKWARD:
  271. rval = GetScanCode();
  272. if ( rval )
  273. {
  274. turk.down = rval;
  275. Clear(&idkeyselitems[BACKWARD]);
  276. Pos(&idkeyselitems[BACKWARD]);
  277. cprintf("%s",keydesc[turk.down] );
  278. }
  279. break;
  280. case LEFT:
  281. rval = GetScanCode();
  282. if ( rval )
  283. {
  284. turk.left = rval;
  285. Clear(&idkeyselitems[LEFT]);
  286. Pos(&idkeyselitems[LEFT]);
  287. cprintf("%s",keydesc[turk.left] );
  288. }
  289. break;
  290. case RIGHT:
  291. rval = GetScanCode();
  292. if ( rval )
  293. {
  294. turk.right = rval;
  295. Clear(&idkeyselitems[RIGHT]);
  296. Pos(&idkeyselitems[RIGHT]);
  297. cprintf("%s",keydesc[turk.right] );
  298. }
  299. break;
  300. case USE:
  301. rval = GetScanCode();
  302. if ( rval )
  303. {
  304. turk.use = rval;
  305. Clear(&idkeyselitems[USE]);
  306. Pos(&idkeyselitems[USE]);
  307. cprintf("%s",keydesc[turk.use] );
  308. }
  309. break;
  310. case FIRE:
  311. rval = GetScanCode();
  312. if ( rval )
  313. {
  314. turk.fire = rval;
  315. Clear(&idkeyselitems[FIRE]);
  316. Pos(&idkeyselitems[FIRE]);
  317. cprintf("%s",keydesc[turk.fire] );
  318. }
  319. break;
  320. case SPEED:
  321. rval = GetScanCode();
  322. if ( rval )
  323. {
  324. turk.key2 = rval;
  325. Clear(&idkeyselitems[SPEED]);
  326. Pos(&idkeyselitems[SPEED]);
  327. cprintf("%s",keydesc[turk.key2] );
  328. }
  329. break;
  330. case STRAFE:
  331. rval = GetScanCode();
  332. if ( rval )
  333. {
  334. turk.key1 = rval;
  335. Clear(&idkeyselitems[STRAFE]);
  336. Pos(&idkeyselitems[STRAFE]);
  337. cprintf("%s",keydesc[turk.key1] );
  338. }
  339. break;
  340. case STRAFE_LEFT:
  341. rval = GetScanCode();
  342. if ( rval )
  343. {
  344. turk.key3 = rval;
  345. Clear(&idkeyselitems[STRAFE_LEFT]);
  346. Pos(&idkeyselitems[STRAFE_LEFT]);
  347. cprintf("%s",keydesc[turk.key3] );
  348. }
  349. break;
  350. case STRAFE_RIGHT:
  351. rval = GetScanCode();
  352. if ( rval )
  353. {
  354. turk.key4 = rval;
  355. Clear(&idkeyselitems[STRAFE_RIGHT]);
  356. Pos(&idkeyselitems[STRAFE_RIGHT]);
  357. cprintf("%s",keydesc[turk.key4] );
  358. }
  359. break;
  360. #ifdef HERETIC
  361. case LOOKD:
  362. rval = GetScanCode();
  363. if ( rval )
  364. {
  365. turk.lookdown = rval;
  366. Clear(&idkeyselitems[LOOKD]);
  367. Pos(&idkeyselitems[LOOKD]);
  368. cprintf("%s",keydesc[turk.lookdown] );
  369. }
  370. break;
  371. case LOOKC:
  372. rval = GetScanCode();
  373. if ( rval )
  374. {
  375. turk.lookcenter = rval;
  376. Clear(&idkeyselitems[LOOKC]);
  377. Pos(&idkeyselitems[LOOKC]);
  378. cprintf("%s",keydesc[turk.lookcenter] );
  379. }
  380. break;
  381. case LOOKU:
  382. rval = GetScanCode();
  383. if ( rval )
  384. {
  385. turk.lookup = rval;
  386. Clear(&idkeyselitems[LOOKU]);
  387. Pos(&idkeyselitems[LOOKU]);
  388. cprintf("%s",keydesc[turk.lookup] );
  389. }
  390. break;
  391. case FLYD:
  392. rval = GetScanCode();
  393. if ( rval )
  394. {
  395. turk.flydown = rval;
  396. Clear(&idkeyselitems[FLYD]);
  397. Pos(&idkeyselitems[FLYD]);
  398. cprintf("%s",keydesc[turk.flydown] );
  399. }
  400. break;
  401. case FLYC:
  402. rval = GetScanCode();
  403. if ( rval )
  404. {
  405. turk.flycenter = rval;
  406. Clear(&idkeyselitems[FLYC]);
  407. Pos(&idkeyselitems[FLYC]);
  408. cprintf("%s",keydesc[turk.flycenter] );
  409. }
  410. break;
  411. case FLYU:
  412. rval = GetScanCode();
  413. if ( rval )
  414. {
  415. turk.flyup = rval;
  416. Clear(&idkeyselitems[FLYU]);
  417. Pos(&idkeyselitems[FLYU]);
  418. cprintf("%s",keydesc[turk.flyup] );
  419. }
  420. break;
  421. case INVL:
  422. rval = GetScanCode();
  423. if ( rval )
  424. {
  425. turk.invleft = rval;
  426. Clear(&idkeyselitems[INVL]);
  427. Pos(&idkeyselitems[INVL]);
  428. cprintf("%s",keydesc[turk.invleft] );
  429. }
  430. break;
  431. case INVR:
  432. rval = GetScanCode();
  433. if ( rval )
  434. {
  435. turk.invright = rval;
  436. Clear(&idkeyselitems[INVR]);
  437. Pos(&idkeyselitems[INVR]);
  438. cprintf("%s",keydesc[turk.invright] );
  439. }
  440. break;
  441. #endif
  442. #ifdef STRIFE
  443. case LOOKD:
  444. rval = GetScanCode();
  445. if ( rval )
  446. {
  447. turk.lookdown = rval;
  448. Clear(&idkeyselitems[LOOKD]);
  449. Pos(&idkeyselitems[LOOKD]);
  450. cprintf("%s",keydesc[turk.lookdown] );
  451. }
  452. break;
  453. case LOOKU:
  454. rval = GetScanCode();
  455. if ( rval )
  456. {
  457. turk.lookup = rval;
  458. Clear(&idkeyselitems[LOOKU]);
  459. Pos(&idkeyselitems[LOOKU]);
  460. cprintf("%s",keydesc[turk.lookup] );
  461. }
  462. break;
  463. case INVL:
  464. rval = GetScanCode();
  465. if ( rval )
  466. {
  467. turk.invleft = rval;
  468. Clear(&idkeyselitems[INVL]);
  469. Pos(&idkeyselitems[INVL]);
  470. cprintf("%s",keydesc[turk.invleft] );
  471. }
  472. break;
  473. case INVR:
  474. rval = GetScanCode();
  475. if ( rval )
  476. {
  477. turk.invright = rval;
  478. Clear(&idkeyselitems[INVR]);
  479. Pos(&idkeyselitems[INVR]);
  480. cprintf("%s",keydesc[turk.invright] );
  481. }
  482. break;
  483. case INVH:
  484. rval = GetScanCode();
  485. if ( rval )
  486. {
  487. turk.invhome = rval;
  488. Clear(&idkeyselitems[INVH]);
  489. Pos(&idkeyselitems[INVH]);
  490. cprintf("%s",keydesc[turk.invhome] );
  491. }
  492. break;
  493. case INVE:
  494. rval = GetScanCode();
  495. if ( rval )
  496. {
  497. turk.invend = rval;
  498. Clear(&idkeyselitems[INVE]);
  499. Pos(&idkeyselitems[INVE]);
  500. cprintf("%s",keydesc[turk.invend] );
  501. }
  502. break;
  503. case INVU:
  504. rval = GetScanCode();
  505. if ( rval )
  506. {
  507. turk.invuse = rval;
  508. Clear(&idkeyselitems[INVU]);
  509. Pos(&idkeyselitems[INVU]);
  510. cprintf("%s",keydesc[turk.invuse] );
  511. }
  512. break;
  513. case INVD:
  514. rval = GetScanCode();
  515. if ( rval )
  516. {
  517. turk.invdrop = rval;
  518. Clear(&idkeyselitems[INVD]);
  519. Pos(&idkeyselitems[INVD]);
  520. cprintf("%s",keydesc[turk.invdrop] );
  521. }
  522. break;
  523. case INVPOP:
  524. rval = GetScanCode();
  525. if ( rval )
  526. {
  527. turk.invpop = rval;
  528. Clear(&idkeyselitems[INVPOP]);
  529. Pos(&idkeyselitems[INVPOP]);
  530. cprintf("%s",keydesc[turk.invpop] );
  531. }
  532. break;
  533. case INVQ:
  534. rval = GetScanCode();
  535. if ( rval )
  536. {
  537. turk.invquery = rval;
  538. Clear(&idkeyselitems[INVQ]);
  539. Pos(&idkeyselitems[INVQ]);
  540. cprintf("%s",keydesc[turk.invquery] );
  541. }
  542. break;
  543. case HEALTHU:
  544. rval = GetScanCode();
  545. if ( rval )
  546. {
  547. turk.healthuse = rval;
  548. Clear(&idkeyselitems[HEALTHU]);
  549. Pos(&idkeyselitems[HEALTHU]);
  550. cprintf("%s",keydesc[turk.healthuse] );
  551. }
  552. break;
  553. case JUMP:
  554. rval = GetScanCode();
  555. if ( rval )
  556. {
  557. turk.jump = rval;
  558. Clear(&idkeyselitems[JUMP]);
  559. Pos(&idkeyselitems[JUMP]);
  560. cprintf("%s",keydesc[turk.jump] );
  561. }
  562. break;
  563. #endif
  564. }
  565. gotoxy(1,25);
  566. break;
  567. }
  568. }
  569. func_exit:
  570. RestoreScreen();
  571. return;
  572. }
  573. //
  574. // Configure joystick buttons
  575. //
  576. enum
  577. {
  578. J_FIRE,
  579. J_FORWARD,
  580. J_USE,
  581. J_STRAFE,
  582. J_MAX
  583. };
  584. item_t idjoyselitems[]=
  585. {
  586. {J_FIRE, 42,10,9, -1,-1},
  587. {J_FORWARD, 42,11,9, -1,-1},
  588. {J_USE, 42,12,9, -1,-1},
  589. {J_STRAFE, 42,13,9, -1,-1}
  590. };
  591. menu_t idjoyselmenu=
  592. {
  593. &idjoyselitems[0],
  594. J_FIRE,
  595. J_MAX,
  596. 0x7f
  597. };
  598. //
  599. // Get joystick button
  600. //
  601. int GetJoyButton (void)
  602. {
  603. int rval = -1;
  604. int num;
  605. int c;
  606. SaveScreen();
  607. DrawPup(&mousentr);
  608. while(kbhit())
  609. getch();
  610. while(1)
  611. {
  612. num = inp ( 0x201 );
  613. num = num >> 4;
  614. if ( ! ( num & 1 ) )
  615. {
  616. rval = 0;
  617. break;
  618. }
  619. if ( ! ( num & 2 ) )
  620. {
  621. rval = 1;
  622. break;
  623. }
  624. if ( ! ( num & 4 ) )
  625. {
  626. rval = 2;
  627. break;
  628. }
  629. if ( ! ( num & 8 ) )
  630. {
  631. rval = 3;
  632. break;
  633. }
  634. if (kbhit())
  635. {
  636. c=_bios_keybrd( _KEYBRD_READY ) >> 8;
  637. if (c == SC_ESC)
  638. break;
  639. getch();
  640. }
  641. // if ( ( _bios_keybrd ( _KEYBRD_READY ) >> 8 ) == SC_ESC ) break;
  642. }
  643. RestoreScreen();
  644. while(kbhit())
  645. getch();
  646. return ( rval );
  647. }
  648. void IDConfigJoy (void)
  649. {
  650. short key;
  651. short field;
  652. int rval;
  653. CONTS turk;
  654. char joybuts [4][20] =
  655. {
  656. "BUTTON 1",
  657. "BUTTON 2",
  658. "BUTTON 3",
  659. "BUTTON 4"
  660. };
  661. int fire;
  662. int frwd;
  663. int strf;
  664. int use;
  665. SaveScreen();
  666. DrawPup(&idjoysel);
  667. turk = curk;
  668. fire = turk.joy[ ID_FIRE ];
  669. frwd = turk.joy[ ID_FORWARD ];
  670. strf = turk.joy[ ID_STRAFE ];
  671. use = turk.joy[ ID_USE ];
  672. textbackground(1);
  673. textcolor(15);
  674. Clear(&idjoyselitems[J_FIRE]);
  675. Pos(&idjoyselitems[J_FIRE]);
  676. if (fire >= 0)
  677. cprintf("%s",joybuts[fire]);
  678. Clear(&idjoyselitems[J_FORWARD]);
  679. Pos(&idjoyselitems[J_FORWARD]);
  680. if (frwd >= 0)
  681. cprintf("%s",joybuts[ frwd ] );
  682. Clear(&idjoyselitems[J_STRAFE]);
  683. Pos(&idjoyselitems[J_STRAFE]);
  684. if (strf >= 0)
  685. cprintf("%s",joybuts[ strf ] );
  686. Clear(&idjoyselitems[J_USE]);
  687. Pos(&idjoyselitems[J_USE]);
  688. if (use >= 0)
  689. cprintf("%s",joybuts[ use ] );
  690. gotoxy(1,25);
  691. while(1)
  692. {
  693. SetupMenu(&idjoyselmenu);
  694. field = GetMenuInput();
  695. key = menukey;
  696. switch ( key )
  697. {
  698. case KEY_ESC:
  699. goto func_exit;
  700. case KEY_F10:
  701. curk = turk;
  702. goto func_exit;
  703. case KEY_ENTER:
  704. switch ( field )
  705. {
  706. case J_FIRE:
  707. rval = GetJoyButton();
  708. if ( rval != -1 )
  709. {
  710. turk.joy [ ID_FIRE ] = rval;
  711. Clear(&idjoyselitems[J_FIRE]);
  712. Pos(&idjoyselitems[J_FIRE]);
  713. cprintf("%s",joybuts[ rval ] );
  714. if (turk.joy [ ID_FORWARD ] == rval)
  715. {
  716. turk.joy [ ID_FORWARD ] = -1;
  717. Clear(&idjoyselitems[J_FORWARD]);
  718. }
  719. if (turk.joy [ ID_USE ] == rval)
  720. {
  721. turk.joy [ ID_USE ] = -1;
  722. Clear(&idjoyselitems[J_USE]);
  723. }
  724. if (turk.joy [ ID_STRAFE ] == rval)
  725. {
  726. turk.joy [ ID_STRAFE ] = -1;
  727. Clear(&idjoyselitems[J_STRAFE]);
  728. }
  729. }
  730. break;
  731. case J_FORWARD:
  732. rval = GetJoyButton();
  733. if ( rval != -1 )
  734. {
  735. turk.joy [ ID_FORWARD ] = rval;
  736. Clear(&idjoyselitems[J_FORWARD]);
  737. Pos(&idjoyselitems[J_FORWARD]);
  738. cprintf("%s",joybuts[rval]);
  739. if (turk.joy [ ID_FIRE ] == rval)
  740. {
  741. turk.joy [ ID_FIRE ] = -1;
  742. Clear(&idjoyselitems[J_FIRE]);
  743. }
  744. if (turk.joy [ ID_USE ] == rval)
  745. {
  746. turk.joy [ ID_USE ] = -1;
  747. Clear(&idjoyselitems[J_USE]);
  748. }
  749. if (turk.joy [ ID_STRAFE ] == rval)
  750. {
  751. turk.joy [ ID_STRAFE ] = -1;
  752. Clear(&idjoyselitems[J_STRAFE]);
  753. }
  754. }
  755. break;
  756. case J_USE:
  757. rval = GetJoyButton();
  758. if ( rval != -1 )
  759. {
  760. turk.joy [ ID_USE ] = rval;
  761. Clear(&idjoyselitems[J_USE]);
  762. Pos(&idjoyselitems[J_USE]);
  763. cprintf("%s",joybuts[rval]);
  764. if (turk.joy [ ID_FORWARD ] == rval)
  765. {
  766. turk.joy [ ID_FORWARD ] = -1;
  767. Clear(&idjoyselitems[J_FORWARD]);
  768. }
  769. if (turk.joy [ ID_FIRE ] == rval)
  770. {
  771. turk.joy [ ID_FIRE ] = -1;
  772. Clear(&idjoyselitems[J_FIRE]);
  773. }
  774. if (turk.joy [ ID_STRAFE ] == rval)
  775. {
  776. turk.joy [ ID_STRAFE ] = -1;
  777. Clear(&idjoyselitems[J_STRAFE]);
  778. }
  779. }
  780. break;
  781. case J_STRAFE:
  782. rval = GetJoyButton();
  783. if ( rval != -1 )
  784. {
  785. turk.joy [ ID_STRAFE ] = rval;
  786. Clear(&idjoyselitems[J_STRAFE]);
  787. Pos(&idjoyselitems[J_STRAFE]);
  788. cprintf("%s",joybuts[rval]);
  789. if (turk.joy [ ID_FORWARD ] == rval)
  790. {
  791. turk.joy [ ID_FORWARD ] = -1;
  792. Clear(&idjoyselitems[J_FORWARD]);
  793. }
  794. if (turk.joy [ ID_USE ] == rval)
  795. {
  796. turk.joy [ ID_USE ] = -1;
  797. Clear(&idjoyselitems[J_USE]);
  798. }
  799. if (turk.joy [ ID_FIRE ] == rval)
  800. {
  801. turk.joy [ ID_FIRE ] = -1;
  802. Clear(&idjoyselitems[J_FIRE]);
  803. }
  804. }
  805. break;
  806. }
  807. gotoxy(1,25);
  808. break;
  809. }
  810. }
  811. func_exit:
  812. RestoreScreen();
  813. return;
  814. }
  815. //
  816. // Configure mouse buttons
  817. //
  818. enum {M_FIRE,M_FORWARD,M_STRAFE,M_MAX};
  819. item_t idmouselitems[]=
  820. {
  821. {M_FIRE, 44,9,13, -1,-1},
  822. {M_FORWARD, 44,10,13, -1,-1},
  823. {M_STRAFE, 44,11,13, -1,-1}
  824. };
  825. menu_t idmouselmenu=
  826. {
  827. &idmouselitems[0],
  828. M_FIRE,
  829. M_MAX,
  830. 0x7f
  831. };
  832. //
  833. // Get mouse button
  834. //
  835. int GetMouseButton (void)
  836. {
  837. int rval = -1;
  838. union REGS r;
  839. SaveScreen();
  840. DrawPup(&mousentr);
  841. while(1)
  842. {
  843. r.x.ax = 3;
  844. int86 ( 0x33, &r, &r );
  845. if ( r.x.bx & 1 )
  846. rval = 0;
  847. else if ( r.x.bx & 2 )
  848. rval = 1;
  849. else if ( r.x.bx & 4 )
  850. rval = 2;
  851. if ( rval != -1 ) break;
  852. if ( ( _bios_keybrd ( _KEYBRD_READY ) >> 8 ) == SC_ESC ) break;
  853. }
  854. RestoreScreen();
  855. while(kbhit())
  856. getch();
  857. return ( rval );
  858. }
  859. void IDConfigMouse (void)
  860. {
  861. short key;
  862. short field;
  863. int rval;
  864. CONTS turk;
  865. char mousebuts [3][20] = {
  866. "LEFT BUTTON",
  867. "RIGHT BUTTON",
  868. "MID BUTTON"
  869. };
  870. int fire;
  871. int frwd;
  872. int strf;
  873. SaveScreen();
  874. DrawPup(&idmousel);
  875. turk = curk;
  876. fire = turk.mouse[ ID_FIRE ];
  877. frwd = turk.mouse[ ID_FORWARD ];
  878. strf = turk.mouse[ ID_STRAFE ];
  879. textbackground(1);
  880. textcolor(15);
  881. Clear(&idmouselitems[M_FIRE]);
  882. Pos(&idmouselitems[M_FIRE]);
  883. if (fire >= 0)
  884. cprintf("%s",mousebuts[ fire ] );
  885. Clear(&idmouselitems[M_FORWARD]);
  886. Pos(&idmouselitems[M_FORWARD]);
  887. if (frwd >= 0)
  888. cprintf("%s",mousebuts[ frwd ] );
  889. Clear(&idmouselitems[M_STRAFE]);
  890. Pos(&idmouselitems[M_STRAFE]);
  891. if (strf >= 0)
  892. cprintf("%s",mousebuts[ strf ] );
  893. gotoxy(1,25);
  894. while(1)
  895. {
  896. SetupMenu(&idmouselmenu);
  897. field = GetMenuInput();
  898. key = menukey;
  899. switch ( key )
  900. {
  901. case KEY_ESC:
  902. goto func_exit;
  903. case KEY_F10:
  904. curk = turk;
  905. goto func_exit;
  906. case KEY_ENTER:
  907. switch ( field )
  908. {
  909. case M_FIRE:
  910. rval = GetMouseButton();
  911. if ( rval != -1 )
  912. {
  913. turk.mouse [ ID_FIRE ] = rval;
  914. Clear(&idmouselitems[M_FIRE]);
  915. Pos(&idmouselitems[M_FIRE]);
  916. cprintf("%s",mousebuts [ rval ] );
  917. if (turk.mouse [ ID_STRAFE ] == rval)
  918. {
  919. turk.mouse [ ID_STRAFE ] = -1;
  920. Clear(&idmouselitems[M_STRAFE]);
  921. }
  922. if (turk.mouse [ ID_FORWARD ] == rval)
  923. {
  924. turk.mouse [ ID_FORWARD ] = -1;
  925. Clear(&idmouselitems[M_FORWARD]);
  926. }
  927. }
  928. break;
  929. case M_FORWARD:
  930. rval = GetMouseButton();
  931. if ( rval != -1 )
  932. {
  933. turk.mouse [ ID_FORWARD ] = rval;
  934. Clear(&idmouselitems[M_FORWARD]);
  935. Pos(&idmouselitems[M_FORWARD]);
  936. cprintf("%s",mousebuts [ rval ] );
  937. if (turk.mouse [ ID_STRAFE ] == rval)
  938. {
  939. turk.mouse [ ID_STRAFE ] = -1;
  940. Clear(&idmouselitems[M_STRAFE]);
  941. }
  942. if (turk.mouse [ ID_FIRE ] == rval)
  943. {
  944. turk.mouse [ ID_FIRE ] = -1;
  945. Clear(&idmouselitems[M_FIRE]);
  946. }
  947. }
  948. break;
  949. case M_STRAFE:
  950. rval = GetMouseButton();
  951. if ( rval != -1 )
  952. {
  953. turk.mouse [ ID_STRAFE ] = rval;
  954. Clear(&idmouselitems[M_STRAFE]);
  955. Pos(&idmouselitems[M_STRAFE]);
  956. cprintf("%s",mousebuts[rval]);
  957. if (turk.mouse [ ID_FORWARD ] == rval)
  958. {
  959. turk.mouse [ ID_FORWARD ] = -1;
  960. Clear(&idmouselitems[M_FORWARD]);
  961. }
  962. if (turk.mouse [ ID_FIRE ] == rval)
  963. {
  964. turk.mouse [ ID_FIRE ] = -1;
  965. Clear(&idmouselitems[M_FIRE]);
  966. }
  967. }
  968. break;
  969. }
  970. gotoxy(1,25);
  971. break;
  972. }
  973. }
  974. func_exit:
  975. RestoreScreen();
  976. return;
  977. }
  978. //
  979. // Choose which controller to configure!
  980. //
  981. enum {CFG_KEY,CFG_MOUSE,CFG_JOY,CFG_MAX};
  982. item_t conselitems[]=
  983. {
  984. {CFG_KEY, 31,11,14, -1,-1},
  985. {CFG_MOUSE, 31,12,14, -1,-1},
  986. {CFG_JOY, 31,13,14, -1,-1}
  987. };
  988. menu_t conselmenu=
  989. {
  990. &conselitems[0],
  991. CFG_KEY,
  992. CFG_MAX,
  993. 0x7f
  994. };
  995. void ConfigControl (void)
  996. {
  997. short key;
  998. short field;
  999. SaveScreen();
  1000. DrawPup(&consel);
  1001. while(1)
  1002. {
  1003. SetupMenu(&conselmenu);
  1004. field = GetMenuInput();
  1005. key = menukey;
  1006. if ( key == KEY_ESC )
  1007. break;
  1008. if ( key != KEY_ENTER && key != KEY_F10 ) continue;
  1009. switch ( field )
  1010. {
  1011. default:
  1012. case CFG_KEY:
  1013. IDConfigKeyboard();
  1014. goto func_exit;
  1015. case CFG_MOUSE:
  1016. if ( !mousepresent )
  1017. {
  1018. ErrorWindow(&mouspres);
  1019. break;
  1020. }
  1021. IDConfigMouse();
  1022. goto func_exit;
  1023. case CFG_JOY:
  1024. IDConfigJoy();
  1025. goto func_exit;
  1026. }
  1027. }
  1028. func_exit:
  1029. RestoreScreen();
  1030. return;
  1031. }