inventory.c revision 1.9 1 1.9 agc /* $NetBSD: inventory.c,v 1.9 2003/08/07 09:37:38 agc Exp $ */
2 1.3 cgd
3 1.1 cgd /*
4 1.3 cgd * Copyright (c) 1988, 1993
5 1.3 cgd * The Regents of the University of California. All rights reserved.
6 1.1 cgd *
7 1.1 cgd * This code is derived from software contributed to Berkeley by
8 1.1 cgd * Timothy C. Stoehr.
9 1.1 cgd *
10 1.1 cgd * Redistribution and use in source and binary forms, with or without
11 1.1 cgd * modification, are permitted provided that the following conditions
12 1.1 cgd * are met:
13 1.1 cgd * 1. Redistributions of source code must retain the above copyright
14 1.1 cgd * notice, this list of conditions and the following disclaimer.
15 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 cgd * notice, this list of conditions and the following disclaimer in the
17 1.1 cgd * documentation and/or other materials provided with the distribution.
18 1.9 agc * 3. Neither the name of the University nor the names of its contributors
19 1.1 cgd * may be used to endorse or promote products derived from this software
20 1.1 cgd * without specific prior written permission.
21 1.1 cgd *
22 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 cgd * SUCH DAMAGE.
33 1.1 cgd */
34 1.1 cgd
35 1.5 lukem #include <sys/cdefs.h>
36 1.1 cgd #ifndef lint
37 1.3 cgd #if 0
38 1.3 cgd static char sccsid[] = "@(#)inventory.c 8.1 (Berkeley) 5/31/93";
39 1.3 cgd #else
40 1.9 agc __RCSID("$NetBSD: inventory.c,v 1.9 2003/08/07 09:37:38 agc Exp $");
41 1.3 cgd #endif
42 1.1 cgd #endif /* not lint */
43 1.1 cgd
44 1.1 cgd /*
45 1.1 cgd * inventory.c
46 1.1 cgd *
47 1.1 cgd * This source herein may be modified and/or distributed by anybody who
48 1.1 cgd * so desires, with the following restrictions:
49 1.1 cgd * 1.) No portion of this notice shall be removed.
50 1.1 cgd * 2.) Credit shall not be taken for the creation of this source.
51 1.1 cgd * 3.) This code is not to be traded, sold, or used for personal
52 1.1 cgd * gain or profit.
53 1.1 cgd *
54 1.1 cgd */
55 1.1 cgd
56 1.1 cgd #include "rogue.h"
57 1.1 cgd
58 1.1 cgd boolean is_wood[WANDS];
59 1.6 hubertf const char *press_space = " --press space to continue--";
60 1.1 cgd
61 1.6 hubertf const char *const wand_materials[WAND_MATERIALS] = {
62 1.1 cgd "steel ",
63 1.1 cgd "bronze ",
64 1.1 cgd "gold ",
65 1.1 cgd "silver ",
66 1.1 cgd "copper ",
67 1.1 cgd "nickel ",
68 1.1 cgd "cobalt ",
69 1.1 cgd "tin ",
70 1.1 cgd "iron ",
71 1.1 cgd "magnesium ",
72 1.1 cgd "chrome ",
73 1.1 cgd "carbon ",
74 1.1 cgd "platinum ",
75 1.1 cgd "silicon ",
76 1.1 cgd "titanium ",
77 1.1 cgd
78 1.1 cgd "teak ",
79 1.1 cgd "oak ",
80 1.1 cgd "cherry ",
81 1.1 cgd "birch ",
82 1.1 cgd "pine ",
83 1.1 cgd "cedar ",
84 1.1 cgd "redwood ",
85 1.1 cgd "balsa ",
86 1.1 cgd "ivory ",
87 1.1 cgd "walnut ",
88 1.1 cgd "maple ",
89 1.1 cgd "mahogany ",
90 1.1 cgd "elm ",
91 1.1 cgd "palm ",
92 1.1 cgd "wooden "
93 1.1 cgd };
94 1.1 cgd
95 1.6 hubertf const char *const gems[GEMS] = {
96 1.1 cgd "diamond ",
97 1.1 cgd "stibotantalite ",
98 1.1 cgd "lapi-lazuli ",
99 1.1 cgd "ruby ",
100 1.1 cgd "emerald ",
101 1.1 cgd "sapphire ",
102 1.1 cgd "amethyst ",
103 1.1 cgd "quartz ",
104 1.1 cgd "tiger-eye ",
105 1.1 cgd "opal ",
106 1.1 cgd "agate ",
107 1.1 cgd "turquoise ",
108 1.1 cgd "pearl ",
109 1.1 cgd "garnet "
110 1.1 cgd };
111 1.1 cgd
112 1.6 hubertf const char *const syllables[MAXSYLLABLES] = {
113 1.1 cgd "blech ",
114 1.1 cgd "foo ",
115 1.1 cgd "barf ",
116 1.1 cgd "rech ",
117 1.1 cgd "bar ",
118 1.1 cgd "blech ",
119 1.1 cgd "quo ",
120 1.1 cgd "bloto ",
121 1.1 cgd "oh ",
122 1.1 cgd "caca ",
123 1.1 cgd "blorp ",
124 1.1 cgd "erp ",
125 1.1 cgd "festr ",
126 1.1 cgd "rot ",
127 1.1 cgd "slie ",
128 1.1 cgd "snorf ",
129 1.1 cgd "iky ",
130 1.1 cgd "yuky ",
131 1.1 cgd "ooze ",
132 1.1 cgd "ah ",
133 1.1 cgd "bahl ",
134 1.1 cgd "zep ",
135 1.1 cgd "druhl ",
136 1.1 cgd "flem ",
137 1.1 cgd "behil ",
138 1.1 cgd "arek ",
139 1.1 cgd "mep ",
140 1.1 cgd "zihr ",
141 1.1 cgd "grit ",
142 1.1 cgd "kona ",
143 1.1 cgd "kini ",
144 1.1 cgd "ichi ",
145 1.1 cgd "tims ",
146 1.1 cgd "ogr ",
147 1.1 cgd "oo ",
148 1.1 cgd "ighr ",
149 1.1 cgd "coph ",
150 1.1 cgd "swerr ",
151 1.1 cgd "mihln ",
152 1.1 cgd "poxi "
153 1.1 cgd };
154 1.1 cgd
155 1.1 cgd #define COMS 48
156 1.1 cgd
157 1.1 cgd struct id_com_s {
158 1.1 cgd short com_char;
159 1.6 hubertf const char *com_desc;
160 1.1 cgd };
161 1.1 cgd
162 1.6 hubertf const struct id_com_s com_id_tab[COMS] = {
163 1.5 lukem {'?', "? prints help"},
164 1.5 lukem {'r', "r read scroll"},
165 1.5 lukem {'/', "/ identify object"},
166 1.5 lukem {'e', "e eat food"},
167 1.5 lukem {'h', "h left "},
168 1.5 lukem {'w', "w wield a weapon"},
169 1.5 lukem {'j', "j down"},
170 1.5 lukem {'W', "W wear armor"},
171 1.5 lukem {'k', "k up"},
172 1.5 lukem {'T', "T take armor off"},
173 1.5 lukem {'l', "l right"},
174 1.5 lukem {'P', "P put on ring"},
175 1.5 lukem {'y', "y up & left"},
176 1.5 lukem {'R', "R remove ring"},
177 1.5 lukem {'u', "u up & right"},
178 1.5 lukem {'d', "d drop object"},
179 1.5 lukem {'b', "b down & left"},
180 1.5 lukem {'c', "c call object"},
181 1.5 lukem {'n', "n down & right"},
182 1.5 lukem {'\0', "<SHIFT><dir>: run that way"},
183 1.5 lukem {')', ") print current weapon"},
184 1.5 lukem {'\0', "<CTRL><dir>: run till adjacent"},
185 1.5 lukem {']', "] print current armor"},
186 1.5 lukem {'f', "f<dir> fight till death or near death"},
187 1.5 lukem {'=', "= print current rings"},
188 1.5 lukem {'t', "t<dir> throw something"},
189 1.5 lukem {'\001', "^A print Hp-raise average"},
190 1.5 lukem {'m', "m<dir> move onto without picking up"},
191 1.5 lukem {'z', "z<dir> zap a wand in a direction"},
192 1.5 lukem {'o', "o examine/set options"},
193 1.5 lukem {'^', "^<dir> identify trap type"},
194 1.5 lukem {'\022', "^R redraw screen"},
195 1.5 lukem {'&', "& save screen into 'rogue.screen'"},
196 1.5 lukem {'s', "s search for trap/secret door"},
197 1.5 lukem {'\020', "^P repeat last message"},
198 1.5 lukem {'>', "> go down a staircase"},
199 1.5 lukem {'\033', "^[ cancel command"},
200 1.5 lukem {'<', "< go up a staircase"},
201 1.5 lukem {'S', "S save game"},
202 1.5 lukem {'.', ". rest for a turn"},
203 1.5 lukem {'Q', "Q quit"},
204 1.5 lukem {',', ", pick something up"},
205 1.5 lukem {'!', "! shell escape"},
206 1.5 lukem {'i', "i inventory"},
207 1.5 lukem {'F', "F<dir> fight till either of you dies"},
208 1.5 lukem {'I', "I inventory single item"},
209 1.5 lukem {'v', "v print version number"},
210 1.5 lukem {'q', "q quaff potion" }
211 1.1 cgd };
212 1.1 cgd
213 1.5 lukem void
214 1.1 cgd inventory(pack, mask)
215 1.6 hubertf const object *pack;
216 1.5 lukem unsigned short mask;
217 1.1 cgd {
218 1.1 cgd object *obj;
219 1.1 cgd short i = 0, j, maxlen = 0, n;
220 1.1 cgd char descs[MAX_PACK_COUNT+1][DCOLS];
221 1.1 cgd short row, col;
222 1.1 cgd
223 1.1 cgd obj = pack->next_object;
224 1.1 cgd
225 1.1 cgd if (!obj) {
226 1.1 cgd message("your pack is empty", 0);
227 1.1 cgd return;
228 1.1 cgd }
229 1.1 cgd while (obj) {
230 1.1 cgd if (obj->what_is & mask) {
231 1.1 cgd descs[i][0] = ' ';
232 1.1 cgd descs[i][1] = obj->ichar;
233 1.1 cgd descs[i][2] = ((obj->what_is & ARMOR) && obj->is_protected)
234 1.1 cgd ? '}' : ')';
235 1.1 cgd descs[i][3] = ' ';
236 1.1 cgd get_desc(obj, descs[i]+4);
237 1.1 cgd if ((n = strlen(descs[i])) > maxlen) {
238 1.1 cgd maxlen = n;
239 1.1 cgd }
240 1.1 cgd i++;
241 1.1 cgd }
242 1.1 cgd obj = obj->next_object;
243 1.1 cgd }
244 1.1 cgd (void) strcpy(descs[i++], press_space);
245 1.1 cgd if (maxlen < 27) maxlen = 27;
246 1.1 cgd col = DCOLS - (maxlen + 2);
247 1.1 cgd
248 1.1 cgd for (row = 0; ((row < i) && (row < DROWS)); row++) {
249 1.1 cgd if (row > 0) {
250 1.1 cgd for (j = col; j < DCOLS; j++) {
251 1.1 cgd descs[row-1][j-col] = mvinch(row, j);
252 1.1 cgd }
253 1.1 cgd descs[row-1][j-col] = 0;
254 1.1 cgd }
255 1.1 cgd mvaddstr(row, col, descs[row]);
256 1.1 cgd clrtoeol();
257 1.1 cgd }
258 1.1 cgd refresh();
259 1.1 cgd wait_for_ack();
260 1.1 cgd
261 1.1 cgd move(0, 0);
262 1.1 cgd clrtoeol();
263 1.1 cgd
264 1.1 cgd for (j = 1; ((j < i) && (j < DROWS)); j++) {
265 1.1 cgd mvaddstr(j, col, descs[j-1]);
266 1.1 cgd }
267 1.1 cgd }
268 1.1 cgd
269 1.5 lukem void
270 1.1 cgd id_com()
271 1.1 cgd {
272 1.1 cgd int ch = 0;
273 1.1 cgd short i, j, k;
274 1.1 cgd
275 1.1 cgd while (ch != CANCEL) {
276 1.1 cgd check_message();
277 1.1 cgd message("Character you want help for (* for all):", 0);
278 1.1 cgd
279 1.1 cgd refresh();
280 1.1 cgd ch = getchar();
281 1.1 cgd
282 1.1 cgd switch(ch) {
283 1.1 cgd case LIST:
284 1.1 cgd {
285 1.1 cgd char save[(((COMS / 2) + (COMS % 2)) + 1)][DCOLS];
286 1.1 cgd short rows = (((COMS / 2) + (COMS % 2)) + 1);
287 1.5 lukem boolean need_two_screens = FALSE;
288 1.1 cgd
289 1.1 cgd if (rows > LINES) {
290 1.1 cgd need_two_screens = 1;
291 1.1 cgd rows = LINES;
292 1.1 cgd }
293 1.1 cgd k = 0;
294 1.1 cgd
295 1.1 cgd for (i = 0; i < rows; i++) {
296 1.1 cgd for (j = 0; j < DCOLS; j++) {
297 1.1 cgd save[i][j] = mvinch(i, j);
298 1.1 cgd }
299 1.1 cgd }
300 1.1 cgd MORE:
301 1.1 cgd for (i = 0; i < rows; i++) {
302 1.1 cgd move(i, 0);
303 1.1 cgd clrtoeol();
304 1.1 cgd }
305 1.1 cgd for (i = 0; i < (rows-1); i++) {
306 1.1 cgd if (i < (LINES-1)) {
307 1.1 cgd if (((i + i) < COMS) && ((i+i+k) < COMS)) {
308 1.1 cgd mvaddstr(i, 0, com_id_tab[i+i+k].com_desc);
309 1.1 cgd }
310 1.1 cgd if (((i + i + 1) < COMS) && ((i+i+k+1) < COMS)) {
311 1.1 cgd mvaddstr(i, (DCOLS/2),
312 1.1 cgd com_id_tab[i+i+k+1].com_desc);
313 1.1 cgd }
314 1.1 cgd }
315 1.1 cgd }
316 1.1 cgd mvaddstr(rows - 1, 0, need_two_screens ? more : press_space);
317 1.1 cgd refresh();
318 1.1 cgd wait_for_ack();
319 1.1 cgd
320 1.1 cgd if (need_two_screens) {
321 1.1 cgd k += ((rows-1) * 2);
322 1.1 cgd need_two_screens = 0;
323 1.1 cgd goto MORE;
324 1.1 cgd }
325 1.1 cgd for (i = 0; i < rows; i++) {
326 1.1 cgd move(i, 0);
327 1.1 cgd for (j = 0; j < DCOLS; j++) {
328 1.1 cgd addch(save[i][j]);
329 1.1 cgd }
330 1.1 cgd }
331 1.1 cgd }
332 1.1 cgd break;
333 1.1 cgd default:
334 1.1 cgd if (!pr_com_id(ch)) {
335 1.1 cgd if (!pr_motion_char(ch)) {
336 1.1 cgd check_message();
337 1.1 cgd message("unknown character", 0);
338 1.1 cgd }
339 1.1 cgd }
340 1.1 cgd ch = CANCEL;
341 1.1 cgd break;
342 1.1 cgd }
343 1.1 cgd }
344 1.1 cgd }
345 1.1 cgd
346 1.5 lukem int
347 1.1 cgd pr_com_id(ch)
348 1.5 lukem int ch;
349 1.1 cgd {
350 1.1 cgd int i;
351 1.1 cgd
352 1.1 cgd if (!get_com_id(&i, ch)) {
353 1.1 cgd return(0);
354 1.1 cgd }
355 1.1 cgd check_message();
356 1.1 cgd message(com_id_tab[i].com_desc, 0);
357 1.1 cgd return(1);
358 1.1 cgd }
359 1.1 cgd
360 1.5 lukem int
361 1.7 tron get_com_id(indexp, ch)
362 1.7 tron int *indexp;
363 1.5 lukem short ch;
364 1.1 cgd {
365 1.1 cgd short i;
366 1.1 cgd
367 1.1 cgd for (i = 0; i < COMS; i++) {
368 1.1 cgd if (com_id_tab[i].com_char == ch) {
369 1.7 tron *indexp = i;
370 1.1 cgd return(1);
371 1.1 cgd }
372 1.1 cgd }
373 1.1 cgd return(0);
374 1.1 cgd }
375 1.1 cgd
376 1.5 lukem int
377 1.1 cgd pr_motion_char(ch)
378 1.5 lukem int ch;
379 1.1 cgd {
380 1.1 cgd if ( (ch == 'J') ||
381 1.1 cgd (ch == 'K') ||
382 1.1 cgd (ch == 'L') ||
383 1.1 cgd (ch == 'H') ||
384 1.1 cgd (ch == 'Y') ||
385 1.1 cgd (ch == 'U') ||
386 1.1 cgd (ch == 'N') ||
387 1.1 cgd (ch == 'B') ||
388 1.1 cgd (ch == '\012') ||
389 1.1 cgd (ch == '\013') ||
390 1.1 cgd (ch == '\010') ||
391 1.1 cgd (ch == '\014') ||
392 1.1 cgd (ch == '\025') ||
393 1.1 cgd (ch == '\031') ||
394 1.1 cgd (ch == '\016') ||
395 1.1 cgd (ch == '\002')) {
396 1.1 cgd char until[18], buf[DCOLS];
397 1.1 cgd int n;
398 1.1 cgd
399 1.1 cgd if (ch <= '\031') {
400 1.1 cgd ch += 96;
401 1.1 cgd (void) strcpy(until, "until adjascent");
402 1.1 cgd } else {
403 1.1 cgd ch += 32;
404 1.1 cgd until[0] = '\0';
405 1.1 cgd }
406 1.1 cgd (void) get_com_id(&n, ch);
407 1.1 cgd sprintf(buf, "run %s %s", com_id_tab[n].com_desc + 8, until);
408 1.1 cgd check_message();
409 1.1 cgd message(buf, 0);
410 1.1 cgd return(1);
411 1.1 cgd } else {
412 1.1 cgd return(0);
413 1.1 cgd }
414 1.1 cgd }
415 1.1 cgd
416 1.5 lukem void
417 1.1 cgd mix_colors()
418 1.1 cgd {
419 1.1 cgd short i, j, k;
420 1.8 mrg char t[MAX_ID_TITLE_LEN];
421 1.1 cgd
422 1.1 cgd for (i = 0; i <= 32; i++) {
423 1.1 cgd j = get_rand(0, (POTIONS - 1));
424 1.1 cgd k = get_rand(0, (POTIONS - 1));
425 1.8 mrg memcpy(t, id_potions[j].title, MAX_ID_TITLE_LEN);
426 1.8 mrg memcpy(id_potions[j].title, id_potions[k].title, MAX_ID_TITLE_LEN);
427 1.8 mrg memcpy(id_potions[k].title, t, MAX_ID_TITLE_LEN);
428 1.1 cgd }
429 1.1 cgd }
430 1.1 cgd
431 1.5 lukem void
432 1.1 cgd make_scroll_titles()
433 1.1 cgd {
434 1.1 cgd short i, j, n;
435 1.1 cgd short sylls, s;
436 1.1 cgd
437 1.1 cgd for (i = 0; i < SCROLS; i++) {
438 1.1 cgd sylls = get_rand(2, 5);
439 1.1 cgd (void) strcpy(id_scrolls[i].title, "'");
440 1.1 cgd
441 1.1 cgd for (j = 0; j < sylls; j++) {
442 1.1 cgd s = get_rand(1, (MAXSYLLABLES-1));
443 1.1 cgd (void) strcat(id_scrolls[i].title, syllables[s]);
444 1.1 cgd }
445 1.1 cgd n = strlen(id_scrolls[i].title);
446 1.1 cgd (void) strcpy(id_scrolls[i].title+(n-1), "' ");
447 1.1 cgd }
448 1.1 cgd }
449 1.1 cgd
450 1.5 lukem void
451 1.1 cgd get_desc(obj, desc)
452 1.6 hubertf const object *obj;
453 1.5 lukem char *desc;
454 1.1 cgd {
455 1.6 hubertf const char *item_name;
456 1.1 cgd struct id *id_table;
457 1.1 cgd char more_info[32];
458 1.1 cgd short i;
459 1.1 cgd
460 1.1 cgd if (obj->what_is == AMULET) {
461 1.1 cgd (void) strcpy(desc, "the amulet of Yendor ");
462 1.1 cgd return;
463 1.1 cgd }
464 1.1 cgd item_name = name_of(obj);
465 1.1 cgd
466 1.1 cgd if (obj->what_is == GOLD) {
467 1.1 cgd sprintf(desc, "%d pieces of gold", obj->quantity);
468 1.1 cgd return;
469 1.1 cgd }
470 1.1 cgd
471 1.1 cgd if (obj->what_is != ARMOR) {
472 1.1 cgd if (obj->quantity == 1) {
473 1.1 cgd (void) strcpy(desc, "a ");
474 1.1 cgd } else {
475 1.1 cgd sprintf(desc, "%d ", obj->quantity);
476 1.1 cgd }
477 1.1 cgd }
478 1.1 cgd if (obj->what_is == FOOD) {
479 1.1 cgd if (obj->which_kind == RATION) {
480 1.1 cgd if (obj->quantity > 1) {
481 1.1 cgd sprintf(desc, "%d rations of ", obj->quantity);
482 1.1 cgd } else {
483 1.1 cgd (void) strcpy(desc, "some ");
484 1.1 cgd }
485 1.1 cgd } else {
486 1.1 cgd (void) strcpy(desc, "a ");
487 1.1 cgd }
488 1.1 cgd (void) strcat(desc, item_name);
489 1.1 cgd goto ANA;
490 1.1 cgd }
491 1.1 cgd id_table = get_id_table(obj);
492 1.1 cgd
493 1.1 cgd if (wizard) {
494 1.1 cgd goto ID;
495 1.1 cgd }
496 1.1 cgd if (obj->what_is & (WEAPON | ARMOR | WAND | RING)) {
497 1.1 cgd goto CHECK;
498 1.1 cgd }
499 1.1 cgd
500 1.1 cgd switch(id_table[obj->which_kind].id_status) {
501 1.1 cgd case UNIDENTIFIED:
502 1.1 cgd CHECK:
503 1.1 cgd switch(obj->what_is) {
504 1.1 cgd case SCROL:
505 1.1 cgd (void) strcat(desc, item_name);
506 1.1 cgd (void) strcat(desc, "entitled: ");
507 1.1 cgd (void) strcat(desc, id_table[obj->which_kind].title);
508 1.1 cgd break;
509 1.1 cgd case POTION:
510 1.1 cgd (void) strcat(desc, id_table[obj->which_kind].title);
511 1.1 cgd (void) strcat(desc, item_name);
512 1.1 cgd break;
513 1.1 cgd case WAND:
514 1.1 cgd case RING:
515 1.1 cgd if (obj->identified ||
516 1.1 cgd (id_table[obj->which_kind].id_status == IDENTIFIED)) {
517 1.1 cgd goto ID;
518 1.1 cgd }
519 1.1 cgd if (id_table[obj->which_kind].id_status == CALLED) {
520 1.1 cgd goto CALL;
521 1.1 cgd }
522 1.1 cgd (void) strcat(desc, id_table[obj->which_kind].title);
523 1.1 cgd (void) strcat(desc, item_name);
524 1.1 cgd break;
525 1.1 cgd case ARMOR:
526 1.1 cgd if (obj->identified) {
527 1.1 cgd goto ID;
528 1.1 cgd }
529 1.1 cgd (void) strcpy(desc, id_table[obj->which_kind].title);
530 1.1 cgd break;
531 1.1 cgd case WEAPON:
532 1.1 cgd if (obj->identified) {
533 1.1 cgd goto ID;
534 1.1 cgd }
535 1.1 cgd (void) strcat(desc, name_of(obj));
536 1.1 cgd break;
537 1.1 cgd }
538 1.1 cgd break;
539 1.1 cgd case CALLED:
540 1.1 cgd CALL: switch(obj->what_is) {
541 1.1 cgd case SCROL:
542 1.1 cgd case POTION:
543 1.1 cgd case WAND:
544 1.1 cgd case RING:
545 1.1 cgd (void) strcat(desc, item_name);
546 1.1 cgd (void) strcat(desc, "called ");
547 1.1 cgd (void) strcat(desc, id_table[obj->which_kind].title);
548 1.1 cgd break;
549 1.1 cgd }
550 1.1 cgd break;
551 1.1 cgd case IDENTIFIED:
552 1.1 cgd ID: switch(obj->what_is) {
553 1.1 cgd case SCROL:
554 1.1 cgd case POTION:
555 1.1 cgd (void) strcat(desc, item_name);
556 1.1 cgd (void) strcat(desc, id_table[obj->which_kind].real);
557 1.1 cgd break;
558 1.1 cgd case RING:
559 1.1 cgd if (wizard || obj->identified) {
560 1.1 cgd if ((obj->which_kind == DEXTERITY) ||
561 1.1 cgd (obj->which_kind == ADD_STRENGTH)) {
562 1.1 cgd sprintf(more_info, "%s%d ", ((obj->class > 0) ? "+" : ""),
563 1.1 cgd obj->class);
564 1.1 cgd (void) strcat(desc, more_info);
565 1.1 cgd }
566 1.1 cgd }
567 1.1 cgd (void) strcat(desc, item_name);
568 1.1 cgd (void) strcat(desc, id_table[obj->which_kind].real);
569 1.1 cgd break;
570 1.1 cgd case WAND:
571 1.1 cgd (void) strcat(desc, item_name);
572 1.1 cgd (void) strcat(desc, id_table[obj->which_kind].real);
573 1.1 cgd if (wizard || obj->identified) {
574 1.1 cgd sprintf(more_info, "[%d]", obj->class);
575 1.1 cgd (void) strcat(desc, more_info);
576 1.1 cgd }
577 1.1 cgd break;
578 1.1 cgd case ARMOR:
579 1.1 cgd sprintf(desc, "%s%d ", ((obj->d_enchant >= 0) ? "+" : ""),
580 1.1 cgd obj->d_enchant);
581 1.1 cgd (void) strcat(desc, id_table[obj->which_kind].title);
582 1.1 cgd sprintf(more_info, "[%d] ", get_armor_class(obj));
583 1.1 cgd (void) strcat(desc, more_info);
584 1.1 cgd break;
585 1.1 cgd case WEAPON:
586 1.1 cgd sprintf(desc+strlen(desc), "%s%d,%s%d ",
587 1.1 cgd ((obj->hit_enchant >= 0) ? "+" : ""), obj->hit_enchant,
588 1.1 cgd ((obj->d_enchant >= 0) ? "+" : ""), obj->d_enchant);
589 1.1 cgd (void) strcat(desc, name_of(obj));
590 1.1 cgd break;
591 1.1 cgd }
592 1.1 cgd break;
593 1.1 cgd }
594 1.1 cgd ANA:
595 1.1 cgd if (!strncmp(desc, "a ", 2)) {
596 1.1 cgd if (is_vowel(desc[2])) {
597 1.1 cgd for (i = strlen(desc) + 1; i > 1; i--) {
598 1.1 cgd desc[i] = desc[i-1];
599 1.1 cgd }
600 1.1 cgd desc[1] = 'n';
601 1.1 cgd }
602 1.1 cgd }
603 1.1 cgd if (obj->in_use_flags & BEING_WIELDED) {
604 1.1 cgd (void) strcat(desc, "in hand");
605 1.1 cgd } else if (obj->in_use_flags & BEING_WORN) {
606 1.1 cgd (void) strcat(desc, "being worn");
607 1.1 cgd } else if (obj->in_use_flags & ON_LEFT_HAND) {
608 1.1 cgd (void) strcat(desc, "on left hand");
609 1.1 cgd } else if (obj->in_use_flags & ON_RIGHT_HAND) {
610 1.1 cgd (void) strcat(desc, "on right hand");
611 1.1 cgd }
612 1.1 cgd }
613 1.1 cgd
614 1.5 lukem void
615 1.1 cgd get_wand_and_ring_materials()
616 1.1 cgd {
617 1.1 cgd short i, j;
618 1.1 cgd boolean used[WAND_MATERIALS];
619 1.1 cgd
620 1.1 cgd for (i = 0; i < WAND_MATERIALS; i++) {
621 1.1 cgd used[i] = 0;
622 1.1 cgd }
623 1.1 cgd for (i = 0; i < WANDS; i++) {
624 1.1 cgd do {
625 1.1 cgd j = get_rand(0, WAND_MATERIALS-1);
626 1.1 cgd } while (used[j]);
627 1.1 cgd used[j] = 1;
628 1.1 cgd (void) strcpy(id_wands[i].title, wand_materials[j]);
629 1.1 cgd is_wood[i] = (j > MAX_METAL);
630 1.1 cgd }
631 1.1 cgd for (i = 0; i < GEMS; i++) {
632 1.1 cgd used[i] = 0;
633 1.1 cgd }
634 1.1 cgd for (i = 0; i < RINGS; i++) {
635 1.1 cgd do {
636 1.1 cgd j = get_rand(0, GEMS-1);
637 1.1 cgd } while (used[j]);
638 1.1 cgd used[j] = 1;
639 1.1 cgd (void) strcpy(id_rings[i].title, gems[j]);
640 1.1 cgd }
641 1.1 cgd }
642 1.1 cgd
643 1.5 lukem void
644 1.1 cgd single_inv(ichar)
645 1.5 lukem short ichar;
646 1.1 cgd {
647 1.1 cgd short ch;
648 1.1 cgd char desc[DCOLS];
649 1.1 cgd object *obj;
650 1.1 cgd
651 1.1 cgd ch = ichar ? ichar : pack_letter("inventory what?", ALL_OBJECTS);
652 1.1 cgd
653 1.1 cgd if (ch == CANCEL) {
654 1.1 cgd return;
655 1.1 cgd }
656 1.1 cgd if (!(obj = get_letter_object(ch))) {
657 1.1 cgd message("no such item.", 0);
658 1.1 cgd return;
659 1.1 cgd }
660 1.1 cgd desc[0] = ch;
661 1.1 cgd desc[1] = ((obj->what_is & ARMOR) && obj->is_protected) ? '}' : ')';
662 1.1 cgd desc[2] = ' ';
663 1.1 cgd desc[3] = 0;
664 1.1 cgd get_desc(obj, desc+3);
665 1.1 cgd message(desc, 0);
666 1.1 cgd }
667 1.1 cgd
668 1.1 cgd struct id *
669 1.1 cgd get_id_table(obj)
670 1.6 hubertf const object *obj;
671 1.1 cgd {
672 1.1 cgd switch(obj->what_is) {
673 1.1 cgd case SCROL:
674 1.1 cgd return(id_scrolls);
675 1.1 cgd case POTION:
676 1.1 cgd return(id_potions);
677 1.1 cgd case WAND:
678 1.1 cgd return(id_wands);
679 1.1 cgd case RING:
680 1.1 cgd return(id_rings);
681 1.1 cgd case WEAPON:
682 1.1 cgd return(id_weapons);
683 1.1 cgd case ARMOR:
684 1.1 cgd return(id_armors);
685 1.1 cgd }
686 1.1 cgd return((struct id *) 0);
687 1.1 cgd }
688 1.1 cgd
689 1.5 lukem void
690 1.1 cgd inv_armor_weapon(is_weapon)
691 1.5 lukem boolean is_weapon;
692 1.1 cgd {
693 1.1 cgd if (is_weapon) {
694 1.1 cgd if (rogue.weapon) {
695 1.1 cgd single_inv(rogue.weapon->ichar);
696 1.1 cgd } else {
697 1.1 cgd message("not wielding anything", 0);
698 1.1 cgd }
699 1.1 cgd } else {
700 1.1 cgd if (rogue.armor) {
701 1.1 cgd single_inv(rogue.armor->ichar);
702 1.1 cgd } else {
703 1.1 cgd message("not wearing anything", 0);
704 1.1 cgd }
705 1.1 cgd }
706 1.1 cgd }
707 1.1 cgd
708 1.5 lukem void
709 1.1 cgd id_type()
710 1.1 cgd {
711 1.6 hubertf const char *id;
712 1.1 cgd int ch;
713 1.1 cgd char buf[DCOLS];
714 1.1 cgd
715 1.1 cgd message("what do you want identified?", 0);
716 1.1 cgd
717 1.1 cgd ch = rgetchar();
718 1.1 cgd
719 1.1 cgd if ((ch >= 'A') && (ch <= 'Z')) {
720 1.1 cgd id = m_names[ch-'A'];
721 1.1 cgd } else if (ch < 32) {
722 1.1 cgd check_message();
723 1.1 cgd return;
724 1.1 cgd } else {
725 1.1 cgd switch(ch) {
726 1.1 cgd case '@':
727 1.1 cgd id = "you";
728 1.1 cgd break;
729 1.1 cgd case '%':
730 1.1 cgd id = "staircase";
731 1.1 cgd break;
732 1.1 cgd case '^':
733 1.1 cgd id = "trap";
734 1.1 cgd break;
735 1.1 cgd case '+':
736 1.1 cgd id = "door";
737 1.1 cgd break;
738 1.1 cgd case '-':
739 1.1 cgd case '|':
740 1.1 cgd id = "wall of a room";
741 1.1 cgd break;
742 1.1 cgd case '.':
743 1.1 cgd id = "floor";
744 1.1 cgd break;
745 1.1 cgd case '#':
746 1.1 cgd id = "passage";
747 1.1 cgd break;
748 1.1 cgd case ' ':
749 1.1 cgd id = "solid rock";
750 1.1 cgd break;
751 1.1 cgd case '=':
752 1.1 cgd id = "ring";
753 1.1 cgd break;
754 1.1 cgd case '?':
755 1.1 cgd id = "scroll";
756 1.1 cgd break;
757 1.1 cgd case '!':
758 1.1 cgd id = "potion";
759 1.1 cgd break;
760 1.1 cgd case '/':
761 1.1 cgd id = "wand or staff";
762 1.1 cgd break;
763 1.1 cgd case ')':
764 1.1 cgd id = "weapon";
765 1.1 cgd break;
766 1.1 cgd case ']':
767 1.1 cgd id = "armor";
768 1.1 cgd break;
769 1.1 cgd case '*':
770 1.1 cgd id = "gold";
771 1.1 cgd break;
772 1.1 cgd case ':':
773 1.1 cgd id = "food";
774 1.1 cgd break;
775 1.1 cgd case ',':
776 1.1 cgd id = "the Amulet of Yendor";
777 1.1 cgd break;
778 1.1 cgd default:
779 1.1 cgd id = "unknown character";
780 1.1 cgd break;
781 1.1 cgd }
782 1.1 cgd }
783 1.1 cgd check_message();
784 1.1 cgd sprintf(buf, "'%c': %s", ch, id);
785 1.1 cgd message(buf, 0);
786 1.1 cgd }
787