show.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. /* =============================================================================
  2. * PROGRAM: ularn
  3. * FILENAME: show.c
  4. *
  5. * DESCRIPTION:
  6. * This module contains functions to print item names and show lists of items.
  7. *
  8. * =============================================================================
  9. * EXPORTED VARIABLES
  10. *
  11. * None
  12. *
  13. * =============================================================================
  14. * EXPORTED FUNCTIONS
  15. *
  16. * show_plusses - Prints the number of plusses as indicated by the input arg
  17. * qshowstr - Show the player's inventory without setting up text mode
  18. * showstr - Show the player's invertory, setting/exiting text mode
  19. * showwear - Show wearable items
  20. * showwield - Show wieldable items
  21. * showread - Show readable items
  22. * showeat - Show edible items
  23. * showquaff - Show quaffable items
  24. * seemagic - Show magic spells/scrolls/potions discovered
  25. * show1 - Show an item name
  26. * show3 - Show an item name with the numebr of plusses
  27. *
  28. * =============================================================================
  29. */
  30. #include "show.h"
  31. #include "dungeon.h"
  32. #include "header.h"
  33. #include "itm.h"
  34. #include "player.h"
  35. #include "potion.h"
  36. #include "scroll.h"
  37. #include "spell.h"
  38. #include "ularn_ask.h"
  39. #include "ularn_game.h"
  40. #include "ularn_win.h"
  41. /* =============================================================================
  42. * Local variables
  43. */
  44. /*
  45. * See magic function line and position counts. Used for paginating see magic.
  46. */
  47. static int lincount;
  48. static int count;
  49. /* =============================================================================
  50. * Local functions
  51. */
  52. /* =============================================================================
  53. * FUNCTION: t_setup
  54. *
  55. * DESCRIPTION:
  56. * Sets up for text display for the indicated number of lines.
  57. *
  58. * PARAMETERS:
  59. *
  60. * count : The number of lines of text to be displayed.
  61. *
  62. * RETURN VALUE:
  63. *
  64. * None.
  65. */
  66. static void t_setup(int count) {
  67. (void)count;
  68. set_display(DISPLAY_TEXT);
  69. ClearText();
  70. MoveCursor(1, 1);
  71. }
  72. /* =============================================================================
  73. * FUNCTION: t_endup
  74. *
  75. * DESCRIPTION:
  76. * Restores normal display screen depending on t_setup()/
  77. *
  78. * PARAMETERS:
  79. *
  80. * count : The number of lines of text displayed.
  81. *
  82. * RETURN VALUE:
  83. *
  84. * None.
  85. */
  86. static void t_endup(int count) {
  87. (void)count;
  88. set_display(DISPLAY_MAP);
  89. }
  90. /* =============================================================================
  91. * FUNCTION: seepage
  92. *
  93. * DESCRIPTION:
  94. * This function is used to paginate the seemagic output.
  95. * It is called for each spell displayed and assumes that spells are displayed
  96. * in 3 columns.
  97. * Whenever the number of calls indicates a full page has been displayed it
  98. * calls more() to prompt for the next page.
  99. *
  100. * PARAMETERS:
  101. *
  102. * None.
  103. *
  104. * RETURN VALUE:
  105. *
  106. * None.
  107. */
  108. static void seepage(void) {
  109. if (++count == 3) {
  110. lincount++;
  111. count = 0;
  112. Printc('\n');
  113. if (lincount > 17) {
  114. lincount = 0;
  115. more();
  116. ClearText();
  117. }
  118. }
  119. }
  120. /* =============================================================================
  121. * Exported functions
  122. */
  123. /* =============================================================================
  124. * FUNCTION: show_plusses
  125. */
  126. void show_plusses(int plus) {
  127. if ((plus > 0) || wizard)
  128. Printf(" +%d", plus);
  129. else if (plus < 0)
  130. Printf(" %d", plus);
  131. }
  132. /* =============================================================================
  133. * FUNCTION: qshowstr
  134. */
  135. void qshowstr(void) {
  136. int k;
  137. int mobuls_used;
  138. int mobuls_left;
  139. clearpager();
  140. nosignal = 1; /* don't allow ^c etc */
  141. if (c[GOLD]) {
  142. Printf(".) %d gold piece%s.", (long)c[GOLD], plural(c[GOLD]));
  143. pager();
  144. }
  145. for (k = 0; k < IVENSIZE; k++) {
  146. if (iven[k] != ONOTHING) {
  147. show3(k);
  148. pager();
  149. }
  150. }
  151. mobuls_used = (gtime / 100) + 1;
  152. mobuls_left = (TIMELIMIT / 100) - mobuls_used;
  153. Printf("\nElapsed time is %d. You have %d mobul%s left.", mobuls_used,
  154. mobuls_left, plural(mobuls_left));
  155. more();
  156. nosignal = 0;
  157. }
  158. /* =============================================================================
  159. * FUNCTION: showstr
  160. */
  161. void showstr(void) {
  162. int i, number;
  163. number = 3;
  164. /* count items in inventory */
  165. for (i = 0; i < IVENSIZE; i++)
  166. if (iven[i] != ONOTHING)
  167. number++;
  168. t_setup(number);
  169. qshowstr();
  170. t_endup(number);
  171. }
  172. /* =============================================================================
  173. * FUNCTION: showwear
  174. */
  175. void showwear(void) {
  176. int count;
  177. int i;
  178. int j;
  179. nosignal = 1; /* don't allow ^c etc */
  180. clearpager();
  181. /* count number of items we will display */
  182. count = 2;
  183. for (j = 0; j < IVENSIZE; j++) {
  184. i = iven[j];
  185. if (i != ONOTHING) {
  186. switch (i) {
  187. case OLEATHER:
  188. case OPLATE:
  189. case OCHAIN:
  190. case ORING:
  191. case OSTUDLEATHER:
  192. case OSPLINT:
  193. case OPLATEARMOR:
  194. case OSSPLATE:
  195. case OSHIELD:
  196. case OELVENCHAIN:
  197. count++;
  198. default:
  199. break;
  200. }
  201. }
  202. }
  203. t_setup(count);
  204. /* Display the wearable items in item index order */
  205. for (i = 22; i < 93; i++) {
  206. for (j = 0; j < IVENSIZE; j++) {
  207. if (iven[j] == i) {
  208. switch (i) {
  209. case OLEATHER:
  210. case OPLATE:
  211. case OCHAIN:
  212. case ORING:
  213. case OSTUDLEATHER:
  214. case OSPLINT:
  215. case OPLATEARMOR:
  216. case OSSPLATE:
  217. case OSHIELD:
  218. case OELVENCHAIN:
  219. show3(j);
  220. pager();
  221. break;
  222. default:
  223. break;
  224. }
  225. }
  226. }
  227. }
  228. more();
  229. nosignal = 0;
  230. t_endup(count);
  231. }
  232. /* =============================================================================
  233. * FUNCTION: showwield
  234. */
  235. void showwield(void) {
  236. int i;
  237. int j;
  238. int count;
  239. nosignal = 1; /* don't allow ^c etc */
  240. clearpager();
  241. /* count how many items */
  242. count = 2;
  243. for (j = 0; j < IVENSIZE; j++) {
  244. i = iven[j];
  245. if (i != ONOTHING) {
  246. switch (i) {
  247. case ODIAMOND:
  248. case ORUBY:
  249. case OEMERALD:
  250. case OSAPPHIRE:
  251. case OBOOK:
  252. case OCHEST:
  253. case OLARNEYE:
  254. case ONOTHEFT:
  255. case OSPIRITSCARAB:
  256. case OCUBEofUNDEAD:
  257. case OPOTION:
  258. case OORB:
  259. case OHANDofFEAR:
  260. case OBRASSLAMP:
  261. case OURN:
  262. case OWWAND:
  263. case OSPHTALISMAN:
  264. case OSCROLL:
  265. break;
  266. default:
  267. count++;
  268. break;
  269. }
  270. }
  271. }
  272. t_setup(count);
  273. /* display the wieldable items in item order */
  274. for (i = 22; i < 93; i++) {
  275. for (j = 0; j < IVENSIZE; j++) {
  276. if (iven[j] == i) {
  277. switch (i) {
  278. case ODIAMOND:
  279. case ORUBY:
  280. case OEMERALD:
  281. case OSAPPHIRE:
  282. case OBOOK:
  283. case OCHEST:
  284. case OLARNEYE:
  285. case ONOTHEFT:
  286. case OSPIRITSCARAB:
  287. case OCUBEofUNDEAD:
  288. case OPOTION:
  289. case OHANDofFEAR:
  290. case OBRASSLAMP:
  291. case OURN:
  292. case OSPHTALISMAN:
  293. case OWWAND:
  294. case OORB:
  295. case OSCROLL:
  296. break;
  297. default:
  298. show3(j);
  299. pager();
  300. break;
  301. }
  302. }
  303. }
  304. }
  305. more();
  306. nosignal = 0;
  307. t_endup(count);
  308. }
  309. /* =============================================================================
  310. * FUNCTION: showread
  311. */
  312. void showread(void) {
  313. int i;
  314. int j;
  315. int count;
  316. nosignal = 1; /* don't allow ^c etc */
  317. clearpager();
  318. count = 2;
  319. for (j = 0; j < IVENSIZE; j++) {
  320. switch (iven[j]) {
  321. case OBOOK:
  322. case OSCROLL:
  323. count++;
  324. break;
  325. default:
  326. break;
  327. }
  328. }
  329. t_setup(count);
  330. /* display the readable items in item order */
  331. for (i = 22; i < 84; i++) {
  332. for (j = 0; j < IVENSIZE; j++) {
  333. if (iven[j] == i) {
  334. switch (i) {
  335. case OBOOK:
  336. case OSCROLL:
  337. show3(j);
  338. pager();
  339. break;
  340. default:
  341. break;
  342. }
  343. }
  344. }
  345. }
  346. more();
  347. nosignal = 0;
  348. t_endup(count);
  349. }
  350. /* =============================================================================
  351. * FUNCTION: showeat
  352. */
  353. void showeat(void) {
  354. int i;
  355. int j;
  356. int count;
  357. nosignal = 1; /* don't allow ^c etc */
  358. clearpager();
  359. count = 2;
  360. for (j = 0; j < IVENSIZE; j++) {
  361. switch (iven[j]) {
  362. case OCOOKIE:
  363. count++;
  364. break;
  365. default:
  366. break;
  367. }
  368. }
  369. t_setup(count);
  370. /* show the edible items in item order */
  371. for (i = 22; i < 84; i++) {
  372. for (j = 0; j < IVENSIZE; j++) {
  373. if (iven[j] == i) {
  374. switch (i) {
  375. case OCOOKIE:
  376. show3(j);
  377. pager();
  378. break;
  379. default:
  380. break;
  381. }
  382. }
  383. }
  384. }
  385. more();
  386. nosignal = 0;
  387. t_endup(count);
  388. }
  389. /* =============================================================================
  390. * FUNCTION: showquaff
  391. */
  392. void showquaff(void) {
  393. int i, j, count;
  394. nosignal = 1; /* don't allow ^c etc */
  395. clearpager();
  396. count = 2;
  397. for (j = 0; j < IVENSIZE; j++) {
  398. switch (iven[j]) {
  399. case OPOTION:
  400. count++;
  401. break;
  402. default:
  403. break;
  404. }
  405. }
  406. t_setup(count);
  407. /* show the quaffable items in item order */
  408. for (i = 22; i < 84; i++) {
  409. for (j = 0; j < IVENSIZE; j++) {
  410. if (iven[j] == i) {
  411. switch (i) {
  412. case OPOTION:
  413. show3(j);
  414. pager();
  415. break;
  416. default:
  417. break;
  418. }
  419. }
  420. }
  421. }
  422. more();
  423. nosignal = 0;
  424. t_endup(count);
  425. }
  426. /* =============================================================================
  427. * FUNCTION: seemagic
  428. */
  429. void seemagic(int arg) {
  430. int i, number;
  431. count = 0;
  432. lincount = 0;
  433. nosignal = 1;
  434. set_display(DISPLAY_TEXT);
  435. if (arg == 99) {
  436. number = (SPELL_COUNT + 2) / 3 + 4; /* # lines needed to display */
  437. ClearText();
  438. MoveCursor(1, 1);
  439. Print("Availible spells are:\n\n");
  440. for (i = 0; i < SPELL_COUNT; i++) {
  441. Printf("%s %-20s ", spelcode[i], spelname[i]);
  442. seepage();
  443. }
  444. seepage();
  445. more();
  446. nosignal = 0;
  447. draws(0, MAXX, 0, number);
  448. return;
  449. } else if (arg == -1) {
  450. /* if display spells while casting one */
  451. number = 0;
  452. for (i = 0; i < SPELL_COUNT; i++)
  453. if (spelknow[i])
  454. number++;
  455. number = (number + 2) / 3 + 4; /* # lines needed to display */
  456. ClearText();
  457. MoveCursor(1, 1);
  458. } else
  459. ClearText();
  460. Print("The magic spells you have discovered to date are:\n\n");
  461. for (i = 0; i < SPELL_COUNT; i++) {
  462. if (spelknow[i]) {
  463. Printf("%s %-20s ", spelcode[i], spelname[i]);
  464. seepage();
  465. }
  466. }
  467. if (arg == -1) {
  468. seepage();
  469. more();
  470. nosignal = 0;
  471. set_display(DISPLAY_MAP);
  472. return;
  473. }
  474. lincount += 3;
  475. if (count != 0) {
  476. count = 2;
  477. seepage();
  478. }
  479. Print("\nThe magic scrolls you have found to date are:\n\n");
  480. count = 0;
  481. for (i = 0; i < MAXSCROLL; i++) {
  482. if (scrollknown[i]) {
  483. Printf("%-26s", &scrollname[i][1]);
  484. seepage();
  485. }
  486. }
  487. lincount += 3;
  488. if (count != 0) {
  489. count = 2;
  490. seepage();
  491. }
  492. Print("\nThe magic potions you have found to date are:\n\n");
  493. count = 0;
  494. for (i = 0; i < MAXPOTION; i++) {
  495. if (potionknown[i]) {
  496. Printf("%-26s", &potionname[i][1]);
  497. seepage();
  498. }
  499. }
  500. if (lincount != 0)
  501. more();
  502. nosignal = 0;
  503. set_display(DISPLAY_MAP);
  504. }
  505. /* =============================================================================
  506. * FUNCTION: show1
  507. */
  508. void show1(int idx, char *str2[], int known[]) {
  509. /* standard */
  510. if (known == 0) {
  511. if (str2 == 0)
  512. Printf("\n%c) %s", idx + 'a', objectname[(int)iven[idx]]);
  513. else if (*str2[ivenarg[idx]] == 0)
  514. Printf("\n%c) %s", idx + 'a', objectname[(int)iven[idx]]);
  515. else
  516. Printf("\n%c) %s of%s", idx + 'a', objectname[(int)iven[idx]],
  517. str2[ivenarg[idx]]);
  518. } else {
  519. /* scroll or potion or something with a known array */
  520. if (str2 == 0)
  521. Printf("\n%c) %s", idx + 'a', objectname[(int)iven[idx]]);
  522. else if (*str2[ivenarg[idx]] == 0)
  523. Printf("\n%c) %s", idx + 'a', objectname[(int)iven[idx]]);
  524. else if (known[ivenarg[idx]] == 0)
  525. Printf("\n%c) %s", idx + 'a', objectname[(int)iven[idx]]);
  526. else
  527. Printf("\n%c) %s of%s", idx + 'a', objectname[(int)iven[idx]],
  528. str2[ivenarg[idx]]);
  529. }
  530. if (wizard)
  531. Printf(" [ %d ]", ivenarg[idx]);
  532. }
  533. /* =============================================================================
  534. * FUNCTION: show3
  535. */
  536. void show3(int index) {
  537. switch (iven[index]) {
  538. case OPOTION:
  539. show1(index, potionname, potionknown);
  540. break;
  541. case OSCROLL:
  542. show1(index, scrollname, scrollknown);
  543. break;
  544. case OLARNEYE:
  545. case OBOOK:
  546. case OSPIRITSCARAB:
  547. case ODIAMOND:
  548. case ORUBY:
  549. case OCUBEofUNDEAD:
  550. case OEMERALD:
  551. case OCHEST:
  552. case OCOOKIE:
  553. case OSAPPHIRE:
  554. case OORB:
  555. case OHANDofFEAR:
  556. case OBRASSLAMP:
  557. case OURN:
  558. case OWWAND:
  559. case OSPHTALISMAN:
  560. case ONOTHEFT:
  561. show1(index, (char **)0, (int *)0);
  562. break;
  563. default:
  564. Printf("\n%c) %s", index + 'a', objectname[(int)iven[index]]);
  565. show_plusses(ivenarg[index]);
  566. break;
  567. }
  568. if (c[WIELD] == index)
  569. Print(" (weapon in hand)");
  570. if ((c[WEAR] == index) || (c[SHIELD] == index))
  571. Print(" (being worn)");
  572. }