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