Home | History | Annotate | Line # | Download | only in rogue
inventory.c revision 1.10
      1  1.10  christos /*	$NetBSD: inventory.c,v 1.10 2006/05/14 03:15:50 christos 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.10  christos __RCSID("$NetBSD: inventory.c,v 1.10 2006/05/14 03:15:50 christos 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.10  christos 		int n = 0;	/* XXX: GCC */
    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