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