Annotation of early-roguelike/arogue7/wear.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * wear.c - functions for dealing with armor
! 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: * This file contains misc functions for dealing with armor
! 17: */
! 18:
! 19: #include <stdlib.h>
! 20: #include "curses.h"
! 21: #include "rogue.h"
! 22:
! 23:
! 24: /*
! 25: * take_off:
! 26: * Get the armor off of the players back
! 27: */
! 28:
! 29: void
! 30: take_off(void)
! 31: {
! 32: register struct object *obj;
! 33: register struct linked_list *item;
! 34:
! 35: /* It takes time to take things off */
! 36: if (player.t_action != C_TAKEOFF) {
! 37: /* What does player want to take off? */
! 38: if ((item = get_item(pack, "take off", REMOVABLE, FALSE, FALSE))==NULL)
! 39: return;
! 40:
! 41: obj = OBJPTR(item);
! 42: if (!is_current(obj)) {
! 43: msg("Not wearing %c) %s", pack_char(pack, obj),inv_name(obj, TRUE));
! 44: return;
! 45: }
! 46:
! 47: player.t_using = item; /* Remember what it is */
! 48: player.t_action = C_TAKEOFF; /* We are taking something off */
! 49:
! 50: /* Cursed items take almost no time */
! 51: if (obj->o_flags & ISCURSED) player.t_no_move = movement(&player);
! 52: else player.t_no_move = dress_units(item) * movement(&player);
! 53: return;
! 54: }
! 55:
! 56: /* We have waited our time, let's take off our item */
! 57: item = player.t_using;
! 58: player.t_using = NULL;
! 59: player.t_action = A_NIL;
! 60:
! 61: obj = OBJPTR(item);
! 62: if (!is_current(obj)) { /* Just to be on the safe side */
! 63: msg("Not wearing %c) %s", pack_char(pack, obj),inv_name(obj, TRUE));
! 64: return;
! 65: }
! 66:
! 67: /* Can the player remove the item? */
! 68: if (!dropcheck(obj)) return;
! 69: updpack(TRUE, &player);
! 70:
! 71: msg("Was wearing %c) %s", pack_char(pack, obj),inv_name(obj,TRUE));
! 72: }
! 73:
! 74: /*
! 75: * wear:
! 76: * The player wants to wear something, so let him/her put it on.
! 77: */
! 78:
! 79: void
! 80: wear(void)
! 81: {
! 82: register struct linked_list *item;
! 83: register struct object *obj;
! 84: register int i;
! 85:
! 86: /* It takes time to put things on */
! 87: if (player.t_action != C_WEAR) {
! 88: /* What does player want to wear? */
! 89: if ((item = get_item(pack, "wear", WEARABLE, FALSE, FALSE)) == NULL)
! 90: return;
! 91:
! 92: obj = OBJPTR(item);
! 93:
! 94: switch (obj->o_type) {
! 95: case ARMOR:
! 96: if (cur_armor != NULL) {
! 97: addmsg("You are already wearing armor");
! 98: if (!terse) addmsg(". You'll have to take it off first.");
! 99: endmsg();
! 100: after = FALSE;
! 101: return;
! 102: }
! 103: if (player.t_ctype == C_MONK) {
! 104: msg("Monks can't wear armor!");
! 105: return;
! 106: }
! 107: if (cur_misc[WEAR_BRACERS] != NULL) {
! 108: msg("You can't wear armor with bracers of defense.");
! 109: return;
! 110: }
! 111: if (cur_misc[WEAR_CLOAK] != NULL || cur_relic[EMORI_CLOAK]) {
! 112: msg("You can't wear armor with a cloak.");
! 113: return;
! 114: }
! 115: if (player.t_ctype == C_THIEF &&
! 116: (obj->o_which != LEATHER &&
! 117: obj->o_which != STUDDED_LEATHER)) {
! 118: if (terse) msg("Thieves can't wear that type of armor");
! 119: else
! 120: msg("Thieves can only wear leather or studded leather armor");
! 121: return;
! 122: }
! 123: if (player.t_ctype == C_ASSASIN &&
! 124: (obj->o_which != LEATHER &&
! 125: obj->o_which != STUDDED_LEATHER)) {
! 126: if (terse) msg("Assassins can't wear that type of armor");
! 127: else
! 128: msg("Assassins can only wear leather or studded leather armor");
! 129: return;
! 130: }
! 131:
! 132: when MM:
! 133: switch (obj->o_which) {
! 134: /*
! 135: * when wearing the boots of elvenkind the player will not
! 136: * set off any traps
! 137: */
! 138: case MM_ELF_BOOTS:
! 139: if (cur_misc[WEAR_BOOTS] != NULL) {
! 140: msg("Already wearing a pair of boots");
! 141: return;
! 142: }
! 143: /*
! 144: * when wearing the boots of dancing the player will dance
! 145: * uncontrollably
! 146: */
! 147: when MM_DANCE:
! 148: if (cur_misc[WEAR_BOOTS] != NULL) {
! 149: msg("Already wearing a pair of boots");
! 150: return;
! 151: }
! 152: /*
! 153: * bracers give the hero protection in he same way armor does.
! 154: * they cannot be used with armor but can be used with cloaks
! 155: */
! 156: when MM_BRACERS:
! 157: if (cur_misc[WEAR_BRACERS] != NULL) {
! 158: msg("Already wearing bracers");
! 159: return;
! 160: }
! 161: else {
! 162: if (cur_armor != NULL) {
! 163: msg("You can't wear bracers of defense with armor.");
! 164: return;
! 165: }
! 166: }
! 167:
! 168: /*
! 169: * The robe (cloak) of powerlessness disallows any spell casting
! 170: */
! 171: when MM_R_POWERLESS:
! 172: /*
! 173: * the cloak of displacement gives the hero an extra +2 on AC
! 174: * and saving throws. Cloaks cannot be used with armor.
! 175: */
! 176: case MM_DISP:
! 177: /*
! 178: * the cloak of protection gives the hero +n on AC and saving
! 179: * throws with a max of +3 on saves
! 180: */
! 181: case MM_PROTECT:
! 182: if (cur_misc[WEAR_CLOAK] != NULL ||
! 183: cur_relic[EMORI_CLOAK]) {
! 184: msg("%slready wearing a cloak.", terse ? "A"
! 185: : "You are a");
! 186: return;
! 187: }
! 188: else {
! 189: if (cur_armor != NULL) {
! 190: msg("You can't wear a cloak with armor.");
! 191: return;
! 192: }
! 193: }
! 194: /*
! 195: * the gauntlets of dexterity give the hero a dexterity of 18
! 196: * the gauntlets of ogre power give the hero a strength of 18
! 197: * the gauntlets of fumbling cause the hero to drop his weapon
! 198: */
! 199: when MM_G_DEXTERITY:
! 200: case MM_G_OGRE:
! 201: case MM_FUMBLE:
! 202: if (cur_misc[WEAR_GAUNTLET] != NULL) {
! 203: msg("Already wearing a pair of gauntlets.");
! 204: return;
! 205: }
! 206: /*
! 207: * the jewel of attacks does an aggavate monster
! 208: */
! 209: when MM_JEWEL:
! 210: if (cur_misc[WEAR_JEWEL] != NULL ||
! 211: cur_relic[YENDOR_AMULET] ||
! 212: cur_relic[STONEBONES_AMULET]) {
! 213: msg("Already wearing an amulet.");
! 214: return;
! 215: }
! 216: /*
! 217: * the necklace of adaption makes the hero immune to
! 218: * chlorine gas
! 219: */
! 220: when MM_ADAPTION:
! 221: if (cur_misc[WEAR_NECKLACE] != NULL) {
! 222: msg("Already wearing a necklace");
! 223: return;
! 224: }
! 225: /*
! 226: * the necklace of stragulation will try to strangle the
! 227: * hero to death
! 228: */
! 229: when MM_STRANGLE:
! 230: if (cur_misc[WEAR_NECKLACE] != NULL) {
! 231: msg("Already wearing a necklace");
! 232: return;
! 233: }
! 234: otherwise:
! 235: msg("what a strange item you have!");
! 236: return;
! 237: }
! 238:
! 239: when RING:
! 240: if (cur_misc[WEAR_GAUNTLET] != NULL) {
! 241: msg ("You have to remove your gauntlets first!");
! 242: return;
! 243: }
! 244:
! 245: /* Is there room to put the ring on */
! 246: for (i=0; i<NUM_FINGERS; i++)
! 247: if (cur_ring[i] == NULL) {
! 248: break;
! 249: }
! 250: if (i == NUM_FINGERS) { /* No room */
! 251: if (terse) msg("Wearing enough rings");
! 252: else msg("You already have on eight rings");
! 253: return;
! 254: }
! 255: }
! 256:
! 257: player.t_using = item; /* Remember what it is */
! 258: player.t_action = C_WEAR; /* We are taking something off */
! 259: player.t_no_move = dress_units(item) * movement(&player);
! 260: return;
! 261: }
! 262:
! 263: /* We have waited our time, let's put on our item */
! 264: item = player.t_using;
! 265: player.t_using = NULL;
! 266: player.t_action = A_NIL;
! 267:
! 268: obj = OBJPTR(item);
! 269:
! 270: switch (obj->o_type) {
! 271: case ARMOR:
! 272: obj->o_flags |= ISKNOW;
! 273: cur_armor = obj;
! 274: addmsg(terse ? "W" : "You are now w");
! 275: msg("earing %s.", armors[obj->o_which].a_name);
! 276:
! 277: when MM:
! 278: switch (obj->o_which) {
! 279: /*
! 280: * when wearing the boots of elvenkind the player will not
! 281: * set off any traps
! 282: */
! 283: case MM_ELF_BOOTS:
! 284: msg("Wearing %s",inv_name(obj,TRUE));
! 285: cur_misc[WEAR_BOOTS] = obj;
! 286: /*
! 287: * when wearing the boots of dancing the player will dance
! 288: * uncontrollably
! 289: */
! 290: when MM_DANCE:
! 291: msg("Wearing %s",inv_name(obj,TRUE));
! 292: cur_misc[WEAR_BOOTS] = obj;
! 293: msg("You begin to dance uncontrollably!");
! 294: turn_on(player, ISDANCE);
! 295: /*
! 296: * bracers give the hero protection in he same way armor does.
! 297: * they cannot be used with armor but can be used with cloaks
! 298: */
! 299: when MM_BRACERS:
! 300: msg("wearing %s",inv_name(obj,TRUE));
! 301: cur_misc[WEAR_BRACERS] = obj;
! 302:
! 303: /*
! 304: * The robe (cloak) of powerlessness disallows any spell casting
! 305: */
! 306: when MM_R_POWERLESS:
! 307: /*
! 308: * the cloak of displacement gives the hero an extra +2 on AC
! 309: * and saving throws. Cloaks cannot be used with armor.
! 310: */
! 311: case MM_DISP:
! 312: /*
! 313: * the cloak of protection gives the hero +n on AC and saving
! 314: * throws with a max of +3 on saves
! 315: */
! 316: case MM_PROTECT:
! 317: msg("wearing %s",inv_name(obj,TRUE));
! 318: cur_misc[WEAR_CLOAK] = obj;
! 319: /*
! 320: * the gauntlets of dexterity give the hero a dexterity of 18
! 321: * the gauntlets of ogre power give the hero a strength of 18
! 322: * the gauntlets of fumbling cause the hero to drop his weapon
! 323: */
! 324: when MM_G_DEXTERITY:
! 325: case MM_G_OGRE:
! 326: case MM_FUMBLE:
! 327: msg("Wearing %s", inv_name(obj,TRUE));
! 328: cur_misc[WEAR_GAUNTLET] = obj;
! 329: if (obj->o_which == MM_FUMBLE)
! 330: start_daemon(fumble, NULL, AFTER);
! 331: /*
! 332: * the jewel of attacks does an aggavate monster
! 333: */
! 334: when MM_JEWEL:
! 335: msg("Wearing %s",inv_name(obj,TRUE));
! 336: cur_misc[WEAR_JEWEL] = obj;
! 337: aggravate(TRUE, TRUE);
! 338: /*
! 339: * the necklace of adaption makes the hero immune to
! 340: * chlorine gas
! 341: */
! 342: when MM_ADAPTION:
! 343: msg("Wearing %s",inv_name(obj,TRUE));
! 344: cur_misc[WEAR_NECKLACE] = obj;
! 345: turn_on(player, NOGAS);
! 346: /*
! 347: * the necklace of stragulation will try to strangle the
! 348: * hero to death
! 349: */
! 350: when MM_STRANGLE:
! 351: msg("Wearing %s",inv_name(obj,TRUE));
! 352: cur_misc[WEAR_NECKLACE] = obj;
! 353: msg("The necklace is beginning to strangle you!");
! 354: start_daemon(strangle, NULL, AFTER);
! 355: otherwise:
! 356: msg("What a strange item you have!");
! 357: }
! 358: status(FALSE);
! 359: if (m_know[obj->o_which] && m_guess[obj->o_which]) {
! 360: free(m_guess[obj->o_which]);
! 361: m_guess[obj->o_which] = NULL;
! 362: }
! 363: else if (!m_know[obj->o_which] &&
! 364: askme &&
! 365: (obj->o_flags & ISKNOW) == 0 &&
! 366: m_guess[obj->o_which] == NULL) {
! 367: nameitem(item, FALSE);
! 368: }
! 369:
! 370: when RING:
! 371: /* If there is room, put on the ring */
! 372: for (i=0; i<NUM_FINGERS; i++)
! 373: if (cur_ring[i] == NULL) {
! 374: cur_ring[i] = obj;
! 375: break;
! 376: }
! 377: if (i == NUM_FINGERS) { /* No room */
! 378: if (terse) msg("Wearing enough rings");
! 379: else msg("You already have on eight rings");
! 380: return;
! 381: }
! 382:
! 383: /* Calculate the effect of the ring */
! 384: ring_on(item);
! 385: }
! 386: updpack(TRUE, &player);
! 387: }
! 388:
! 389: /*
! 390: * dress_units:
! 391: * How many movements periods does it take to put on or remove the
! 392: * given item of "clothing"?
! 393: */
! 394: int
! 395: dress_units(struct linked_list *item)
! 396: {
! 397: register struct object *obj;
! 398:
! 399: obj = OBJPTR(item);
! 400:
! 401: switch (obj->o_type) {
! 402: case ARMOR:
! 403: return(10-armors[obj->o_which].a_class);
! 404: when RING:
! 405: return(2);
! 406: when MM:
! 407: switch (obj->o_which) {
! 408: case MM_ELF_BOOTS:
! 409: case MM_DANCE:
! 410: /* Boots */
! 411: return(4);
! 412: when MM_R_POWERLESS:
! 413: case MM_DISP:
! 414: case MM_PROTECT:
! 415: /* Robes */
! 416: return(4);
! 417: when MM_BRACERS:
! 418: case MM_G_DEXTERITY:
! 419: case MM_G_OGRE:
! 420: case MM_FUMBLE:
! 421: /* Hand garments */
! 422: return(3);
! 423: when MM_JEWEL:
! 424: case MM_ADAPTION:
! 425: case MM_STRANGLE:
! 426: /* Jewelry */
! 427: return(2);
! 428: otherwise:
! 429: return(1); /* What is it? */
! 430: }
! 431: otherwise:
! 432: return(1); /* What is it? */
! 433: }
! 434: }
CVSweb