comparison arogue7/things.c @ 125:adfa37e67084

Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Fri, 08 May 2015 15:24:40 -0400
parents
children b786053d2f37
comparison
equal deleted inserted replaced
124:d10fc4a065ac 125:adfa37e67084
1 /*
2 * things.c - functions for dealing with things like potions and scrolls
3 *
4 * Advanced Rogue
5 * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
6 * All rights reserved.
7 *
8 * Based on "Rogue: Exploring the Dungeons of Doom"
9 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
10 * All rights reserved.
11 *
12 * See the file LICENSE.TXT for full copyright and licensing information.
13 */
14
15 /*
16 * Contains functions for dealing with things like
17 * potions and scrolls
18 *
19 */
20
21 #include "curses.h"
22 #include <ctype.h>
23 #include "rogue.h"
24
25 /*
26 * print out the number of charges on a stick
27 */
28 char *
29 charge_str(obj)
30 register struct object *obj;
31 {
32 static char buf[20];
33
34 if (!(obj->o_flags & ISKNOW))
35 buf[0] = '\0';
36 else if (terse)
37 sprintf(buf, " [%d]", obj->o_charges);
38 else
39 sprintf(buf, " [%d charges]", obj->o_charges);
40 return buf;
41 }
42 /*
43 * inv_name:
44 * return the name of something as it would appear in an
45 * inventory.
46 */
47 char *
48 inv_name(obj, drop)
49 register struct object *obj;
50 bool drop;
51 {
52 register char *pb;
53
54 pb = prbuf;
55 pb[0] = '\0';
56 switch(obj->o_type) {
57 case SCROLL:
58 if (obj->o_count == 1)
59 sprintf(pb, "A %sscroll ", blesscurse(obj->o_flags));
60 else
61 sprintf(pb, "%d %sscrolls ",
62 obj->o_count, blesscurse(obj->o_flags));
63 pb = &pb[strlen(pb)];
64 if (s_know[obj->o_which] || (obj->o_flags & ISPOST))
65 sprintf(pb, "of %s", s_magic[obj->o_which].mi_name);
66 else if (s_guess[obj->o_which])
67 sprintf(pb, "named %s", s_guess[obj->o_which]);
68 else
69 sprintf(pb, "titled '%s'", s_names[obj->o_which]);
70 when POTION:
71 if (obj->o_count == 1)
72 sprintf(pb, "A %spotion ", blesscurse(obj->o_flags));
73 else
74 sprintf(pb, "%d %spotions ",
75 obj->o_count, blesscurse(obj->o_flags));
76 pb = &pb[strlen(pb)];
77 if (p_know[obj->o_which])
78 sprintf(pb, "of %s (%s)", p_magic[obj->o_which].mi_name,
79 p_kind(obj));
80 else if (obj->o_flags & ISPOST)
81 sprintf(pb, "of %s", p_magic[obj->o_which].mi_name);
82 else if (p_guess[obj->o_which])
83 sprintf(pb, "named %s (%s)", p_guess[obj->o_which],
84 p_colors[obj->o_which]);
85 else {
86 pb = prbuf;
87 if (obj->o_count == 1)
88 sprintf(pb, "A%s %s potion",
89 vowelstr(p_colors[obj->o_which]),
90 p_colors[obj->o_which]);
91 else
92 sprintf(pb, "%d %s potions",
93 obj->o_count, p_colors[obj->o_which]);
94 }
95 when FOOD:
96 if (obj->o_count == 1)
97 sprintf(pb, "A%s %s", vowelstr(foods[obj->o_which].mi_name),
98 foods[obj->o_which].mi_name);
99 else
100 sprintf(pb, "%d %ss", obj->o_count,foods[obj->o_which].mi_name);
101 when WEAPON:
102 if (obj->o_count > 1)
103 sprintf(pb, "%d ", obj->o_count);
104 else
105 strcpy(pb, "A ");
106 pb = &pb[strlen(pb)];
107 if (obj->o_flags & ISKNOW) {
108 strcat(pb, num(obj->o_hplus, obj->o_dplus));
109 strcat (pb, " ");
110 }
111 strcat(pb, weaps[obj->o_which].w_name);
112 if (obj->o_count > 1)
113 strcat(pb, "s");
114 if (obj == cur_weapon)
115 strcat(pb, " (weapon in hand)");
116 if (obj->o_flags & ISPOISON)
117 strcat(pb, " {Poisoned}");
118 when ARMOR:
119 if (obj->o_flags & ISKNOW) {
120 strcat(pb, num(armors[obj->o_which].a_class - obj->o_ac, 0));
121 strcat(pb, " ");
122 }
123 strcat(pb, armors[obj->o_which].a_name);
124 if (obj == cur_armor)
125 strcat(pb, " (being worn)");
126 when STICK:
127 sprintf(pb, "A %s%s ",
128 blesscurse(obj->o_flags), ws_type[obj->o_which]);
129 pb = &pb[strlen(pb)];
130 if (ws_know[obj->o_which] || obj->o_flags & ISKNOW)
131 sprintf(pb, "of %s%s (%s)", ws_magic[obj->o_which].mi_name,
132 charge_str(obj), ws_made[obj->o_which]);
133 else if (obj->o_flags & ISPOST)
134 sprintf(pb, "of %s", ws_magic[obj->o_which].mi_name);
135 else if (ws_guess[obj->o_which])
136 sprintf(pb, "named %s (%s)", ws_guess[obj->o_which],
137 ws_made[obj->o_which]);
138 else {
139 pb = prbuf;
140 sprintf(pb, "A %s %s", ws_made[obj->o_which],
141 ws_type[obj->o_which]);
142 }
143 if (obj == cur_weapon)
144 strcat(prbuf, " (weapon in hand)");
145 when RING:
146 if (r_know[obj->o_which] || obj->o_flags & ISKNOW)
147 sprintf(pb, "A%s ring of %s (%s)", ring_num(obj),
148 r_magic[obj->o_which].mi_name, r_stones[obj->o_which]);
149 else if (obj->o_flags & ISPOST)
150 sprintf(pb, "A ring of %s", r_magic[obj->o_which].mi_name);
151 else if (r_guess[obj->o_which])
152 sprintf(pb, "A ring named %s (%s)",
153 r_guess[obj->o_which], r_stones[obj->o_which]);
154 else
155 sprintf(pb, "A%s %s ring", vowelstr(r_stones[obj->o_which]),
156 r_stones[obj->o_which]);
157 if (obj == cur_ring[LEFT_1] || obj == cur_ring[LEFT_2] ||
158 obj == cur_ring[LEFT_3] || obj == cur_ring[LEFT_4])
159 strcat(pb, " (on left hand)");
160 if (obj == cur_ring[RIGHT_1] || obj == cur_ring[RIGHT_2] ||
161 obj == cur_ring[RIGHT_3] || obj == cur_ring[RIGHT_4])
162 strcat(pb, " (on right hand)");
163 when RELIC:
164 if (obj->o_flags & ISKNOW)
165 switch(obj->o_which) {
166 case QUILL_NAGROM:
167 sprintf(pb, "%s%s", rel_magic[obj->o_which].mi_name,
168 charge_str(obj));
169 otherwise:
170 strcpy(pb, rel_magic[obj->o_which].mi_name);
171 }
172 else switch(obj->o_which) {
173 case MUSTY_DAGGER:
174 strcpy(pb, "Two very fine daggers marked MDDE");
175 when EMORI_CLOAK:
176 strcpy(pb, "A silk cloak");
177 when HEIL_ANKH:
178 strcpy(pb, "A golden ankh");
179 when MING_STAFF:
180 strcpy(pb, "A finely carved staff");
181 when ORCUS_WAND:
182 strcpy(pb, "A sparkling ivory wand");
183 when ASMO_ROD:
184 strcpy(pb, "A glistening ebony rod");
185 when YENDOR_AMULET:
186 strcpy(pb, "A silver amulet");
187 when STONEBONES_AMULET:
188 strcpy(pb, "A stone amulet");
189 when BRIAN_MANDOLIN:
190 strcpy(pb, "A gleaming mandolin");
191 when HRUGGEK_MSTAR:
192 strcpy(pb, "A huge morning star");
193 when AXE_AKLAD:
194 strcpy(pb, "A jewel encrusted axe");
195 when QUILL_NAGROM:
196 strcpy(pb, "A bright white feather");
197 when GERYON_HORN:
198 strcpy(pb, "A jet black horn");
199 when YEENOGHU_FLAIL:
200 strcpy(pb, "A shimmering flail");
201 when SURTUR_RING:
202 strcpy(pb, "A fiery red ring");
203 otherwise:
204 strcpy(pb, "A magical item");
205 }
206
207 /* Take care of wielding and wearing */
208 switch (obj->o_which) {
209 case EMORI_CLOAK:
210 if (cur_armor == NULL && cur_misc[WEAR_CLOAK] == NULL)
211 strcat(pb, " (being worn)");
212 if (obj->o_charges)
213 strcat(pb, " [charged]");
214 else
215 strcat(pb, " [discharged]");
216 when HEIL_ANKH:
217 if (cur_relic[HEIL_ANKH]) strcat(pb, " (in hand)");
218 when EYE_VECNA:
219 if (cur_relic[EYE_VECNA]) strcat(pb, " (in eye socket)");
220 when STONEBONES_AMULET:
221 if (cur_relic[STONEBONES_AMULET])
222 strcat(pb, " (in chest)");
223 when YENDOR_AMULET:
224 if (cur_relic[YENDOR_AMULET])
225 strcat(pb, " (in chest)");
226 when MUSTY_DAGGER:
227 case HRUGGEK_MSTAR:
228 case AXE_AKLAD:
229 case YEENOGHU_FLAIL:
230 case MING_STAFF:
231 case ASMO_ROD:
232 case ORCUS_WAND:
233 if (cur_weapon == obj) strcat(pb, " (weapon in hand)");
234 when SURTUR_RING:
235 if (cur_relic[SURTUR_RING])
236 strcat(pb, " (in nose)");
237 }
238 when MM:
239 if (m_know[obj->o_which])
240 strcpy(pb, misc_name(obj));
241 else {
242 switch (obj->o_which) {
243 case MM_JUG:
244 case MM_BEAKER:
245 strcpy(pb, "A bottle");
246 when MM_KEOGHTOM:
247 strcpy(pb, "A jar");
248 when MM_JEWEL:
249 strcpy(pb, "An amulet");
250 when MM_BOOK:
251 case MM_SKILLS:
252 strcpy(pb, "A book");
253 when MM_ELF_BOOTS:
254 case MM_DANCE:
255 strcpy(pb, "A pair of boots");
256 when MM_BRACERS:
257 strcpy(pb, "A pair of bracers");
258 when MM_OPEN:
259 case MM_HUNGER:
260 strcpy(pb, "A chime");
261 when MM_DISP:
262 case MM_R_POWERLESS:
263 case MM_PROTECT:
264 strcpy(pb, "A cloak");
265 when MM_DRUMS:
266 strcpy(pb, "A set of drums");
267 when MM_DISAPPEAR:
268 case MM_CHOKE:
269 strcpy(pb, "A pouch of dust");
270 when MM_G_DEXTERITY:
271 case MM_G_OGRE:
272 case MM_FUMBLE:
273 strcpy(pb, "A pair of gauntlets");
274 when MM_ADAPTION:
275 case MM_STRANGLE:
276 strcpy(pb, "A necklace");
277 otherwise:
278 strcpy(pb, "A magical item");
279 }
280 if (m_guess[obj->o_which]) {
281 strcat(pb, " named: ");
282 strcat(pb, m_guess[obj->o_which]);
283 }
284 }
285 if (obj == cur_misc[WEAR_BOOTS] ||
286 obj == cur_misc[WEAR_BRACERS] ||
287 obj == cur_misc[WEAR_CLOAK] ||
288 obj == cur_misc[WEAR_GAUNTLET] ||
289 obj == cur_misc[WEAR_NECKLACE] ||
290 obj == cur_misc[WEAR_JEWEL])
291 strcat(pb, " (being worn)");
292 when GOLD:
293 sprintf(pb, "%d Pieces of Gold", obj->o_count);
294 otherwise:
295 debug("Picked up something funny");
296 sprintf(pb, "Something bizarre %s", unctrl(obj->o_type));
297 }
298
299 /* Is it marked? */
300 if (obj->o_mark[0]) {
301 pb = &pb[strlen(pb)];
302 sprintf(pb, " <%s>", obj->o_mark);
303 }
304
305 if (obj->o_flags & ISPROT)
306 strcat(pb, " [protected]");
307 if (drop && isupper(prbuf[0]))
308 prbuf[0] = tolower(prbuf[0]);
309 else if (!drop && islower(*prbuf))
310 *prbuf = toupper(*prbuf);
311 if (!drop)
312 strcat(pb, ".");
313 /*
314 * Truncate if long. Use cols-4 to offset the "pack letter" of a normal
315 * inventory listing.
316 */
317 prbuf[cols-4] = '\0';
318 return prbuf;
319 }
320
321 /*
322 * weap_name:
323 * Return the name of a weapon.
324 */
325 char *
326 weap_name(obj)
327 register struct object *obj;
328 {
329 switch (obj->o_type) {
330 case WEAPON:
331 return(weaps[obj->o_which].w_name);
332 when MISSILE:
333 return(ws_magic[obj->o_which].mi_name);
334 when RELIC:
335 switch (obj->o_which) {
336 case MUSTY_DAGGER:
337 return("daggers");
338 when YEENOGHU_FLAIL:
339 return("flail");
340 when AXE_AKLAD:
341 return("axe");
342 when HRUGGEK_MSTAR:
343 return("morning star");
344 when MING_STAFF:
345 return("staff");
346 when ORCUS_WAND:
347 return("wand");
348 when ASMO_ROD:
349 return("rod");
350 }
351 }
352 return("weapon");
353 }
354
355 /*
356 * drop:
357 * put something down
358 */
359 drop(item)
360 struct linked_list *item;
361 {
362 register char ch;
363 register struct linked_list *obj, *nobj;
364 register struct object *op;
365