Annotation of early-roguelike/urogue/rings.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: rings.c - Routines dealing specificaly with rings
! 3:
! 4: UltraRogue: The Ultimate Adventure in the Dungeons of Doom
! 5: Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
! 6: All rights reserved.
! 7:
! 8: Based on "Advanced Rogue"
! 9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
! 10: All rights reserved.
! 11:
! 12: Based on "Rogue: Exploring the Dungeons of Doom"
! 13: Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 14: All rights reserved.
! 15:
! 16: See the file LICENSE.TXT for full copyright and licensing information.
! 17: */
! 18:
! 19: #include <string.h>
! 20: #include <stdlib.h>
! 21: #include "rogue.h"
! 22:
! 23: void
! 24: ring_on(void)
! 25: {
! 26: struct object *obj;
! 27: struct linked_list *item;
! 28: int ring;
! 29: char buf[2 * LINELEN];
! 30:
! 31: if ((item = get_item("put on", RING)) == NULL)
! 32: return;
! 33:
! 34: obj = OBJPTR(item);
! 35:
! 36: if (obj->o_type != RING)
! 37: {
! 38: msg("You can't put that on!");
! 39: return;
! 40: }
! 41:
! 42: /* find out which hand to put it on */
! 43:
! 44: if (is_current(obj))
! 45: {
! 46: msg("Already wearing that!");
! 47: return;
! 48: }
! 49:
! 50: if (cur_ring[LEFT_1] == NULL)
! 51: ring = LEFT_1;
! 52: else if (cur_ring[LEFT_2] == NULL)
! 53: ring = LEFT_2;
! 54: else if (cur_ring[LEFT_3] == NULL)
! 55: ring = LEFT_3;
! 56: else if (cur_ring[LEFT_4] == NULL)
! 57: ring = LEFT_4;
! 58: else if (cur_ring[LEFT_5] == NULL)
! 59: ring = LEFT_5;
! 60: else if (cur_ring[RIGHT_1] == NULL)
! 61: ring = RIGHT_1;
! 62: else if (cur_ring[RIGHT_2] == NULL)
! 63: ring = RIGHT_2;
! 64: else if (cur_ring[RIGHT_3] == NULL)
! 65: ring = RIGHT_3;
! 66: else if (cur_ring[RIGHT_4] == NULL)
! 67: ring = RIGHT_4;
! 68: else if (cur_ring[RIGHT_5] == NULL)
! 69: ring = RIGHT_5;
! 70: else
! 71: {
! 72: msg("You already have on ten rings.");
! 73: return;
! 74: }
! 75:
! 76: cur_ring[ring] = obj;
! 77:
! 78: /* Calculate the effect it has on the poor guy. */
! 79:
! 80: switch (obj->o_which)
! 81: {
! 82: case R_ADDSTR:
! 83: pstats.s_str += obj->o_ac;
! 84: break;
! 85: case R_ADDHIT:
! 86: pstats.s_dext += obj->o_ac;
! 87: break;
! 88: case R_ADDINTEL:
! 89: pstats.s_intel += obj->o_ac;
! 90: break;
! 91: case R_ADDWISDOM:
! 92: pstats.s_wisdom += obj->o_ac;
! 93: break;
! 94: case R_FREEDOM:
! 95: turn_off(player, ISHELD);
! 96: hold_count = 0;
! 97: break;
! 98: case R_TRUESEE:
! 99: if (off(player, PERMBLIND))
! 100: {
! 101: turn_on(player, CANTRUESEE);
! 102: msg("You become more aware of your surroundings.");
! 103: sight(NULL);
! 104: light(&hero);
! 105: mvwaddch(cw, hero.y, hero.x, PLAYER);
! 106: }
! 107: break;
! 108:
! 109: case R_SEEINVIS:
! 110: if (off(player, PERMBLIND))
! 111: {
! 112: turn_on(player, CANTRUESEE);
! 113: msg("Your eyes begin to tingle.");
! 114: sight(NULL);
! 115: light(&hero);
! 116: mvwaddch(cw, hero.y, hero.x, PLAYER);
! 117: }
! 118: break;
! 119:
! 120: case R_AGGR:
! 121: aggravate();
! 122: break;
! 123:
! 124: case R_CARRYING:
! 125: updpack();
! 126: break;
! 127:
! 128: case R_LEVITATION:
! 129: msg("You begin to float in the air!");
! 130: break;
! 131:
! 132: case R_LIGHT:
! 133: if (roomin(hero) != NULL)
! 134: {
! 135: light(&hero);
! 136: mvwaddch(cw, hero.y, hero.x, PLAYER);
! 137: }
! 138: }
! 139:
! 140: status(FALSE);
! 141:
! 142: if (know_items[TYP_RING][obj->o_which] &&
! 143: guess_items[TYP_RING][obj->o_which])
! 144: {
! 145: mem_free(guess_items[TYP_RING][obj->o_which]);
! 146: guess_items[TYP_RING][obj->o_which] = NULL;
! 147: }
! 148: else if (!know_items[TYP_RING][obj->o_which] &&
! 149: askme &&
! 150: (obj->o_flags & ISKNOW) == 0 &&
! 151: guess_items[TYP_RING][obj->o_which] == NULL)
! 152: {
! 153: mpos = 0;
! 154: msg("What do you want to call it? ");
! 155:
! 156: if (get_string(buf, cw) == NORM)
! 157: {
! 158: guess_items[TYP_RING][obj->o_which] =
! 159: new_alloc(strlen(buf) + 1);
! 160: strcpy(guess_items[TYP_RING][obj->o_which], buf);
! 161: }
! 162: msg("");
! 163: }
! 164: }
! 165:
! 166: void
! 167: ring_off(void)
! 168: {
! 169: struct object *obj;
! 170: struct linked_list *item;
! 171:
! 172: if (cur_ring[LEFT_1] == NULL && cur_ring[LEFT_2] == NULL &&
! 173: cur_ring[LEFT_3] == NULL && cur_ring[LEFT_4] == NULL &&
! 174: cur_ring[LEFT_5] == NULL &&
! 175: cur_ring[RIGHT_1] == NULL && cur_ring[RIGHT_2] == NULL &&
! 176: cur_ring[RIGHT_3] == NULL && cur_ring[RIGHT_4] == NULL &&
! 177: cur_ring[RIGHT_5] == NULL)
! 178: {
! 179: msg("You aren't wearing any rings.");
! 180: return;
! 181: }
! 182: else if ((item = get_item("remove", RING)) == NULL)
! 183: return;
! 184:
! 185: mpos = 0;
! 186: obj = OBJPTR(item);
! 187:
! 188: if ((obj = OBJPTR(item)) == NULL)
! 189: msg("You are not wearing that!");
! 190:
! 191: if (dropcheck(obj))
! 192: {
! 193: switch (obj->o_which)
! 194: {
! 195: case R_SEEINVIS:
! 196: msg("Your eyes stop tingling.");
! 197: break;
! 198:
! 199: case R_CARRYING:
! 200: updpack();
! 201: break;
! 202:
! 203: case R_LEVITATION:
! 204: msg("You float gently to the ground.");
! 205: break;
! 206:
! 207: case R_LIGHT:
! 208: if (roomin(hero) != NULL)
! 209: {
! 210: light(&hero);
! 211: mvwaddch(cw, hero.y, hero.x, PLAYER);
! 212: }
! 213: break;
! 214:
! 215: case R_TRUESEE:
! 216: msg("Your sensory perceptions return to normal.");
! 217: break;
! 218: }
! 219:
! 220: msg("Was wearing %s.", inv_name(obj, LOWERCASE));
! 221: }
! 222: }
! 223:
! 224: /*
! 225: ring_eat()
! 226: how much food does this ring use up?
! 227: */
! 228:
! 229: int
! 230: ring_eat(int hand)
! 231: {
! 232: int ret_val = 0;
! 233: int ac;
! 234:
! 235: if (cur_ring[hand] != NULL)
! 236: {
! 237: switch (cur_ring[hand]->o_which)
! 238: {
! 239: case R_REGEN:
! 240: case R_VREGEN:
! 241: ret_val = rnd(pstats.s_lvl > 10 ? 10 : pstats.s_lvl);
! 242:
! 243: case R_DIGEST:
! 244:
! 245: ac = cur_ring[hand]->o_ac;
! 246:
! 247: if (ac < 0 && rnd(1 - (ac / 3)) == 0)
! 248: ret_val = -ac + 1;
! 249: else if (rnd((ac / 2) + 2) == 0)
! 250: ret_val = -1 - ac;
! 251: break;
! 252:
! 253: case R_SEARCH:
! 254: ret_val = rnd(100) < 33;
! 255: break;
! 256:
! 257: default:
! 258: ret_val = 1;
! 259: }
! 260: }
! 261:
! 262: ret_val += rnd(luck);
! 263:
! 264: return(ret_val);
! 265: }
! 266:
! 267: /*
! 268: ring_num()
! 269: print ring bonuses
! 270: */
! 271:
! 272: char *
! 273: ring_num(struct object *obj, char *buf)
! 274: {
! 275: char buffer[1024];
! 276:
! 277: if (buf == NULL)
! 278: return("A bug in UltraRogue #101");
! 279:
! 280: buf[0] = 0;
! 281:
! 282: if (obj->o_flags & ISKNOW)
! 283: {
! 284: switch (obj->o_which)
! 285: {
! 286: case R_SEARCH:
! 287: case R_PROTECT:
! 288: case R_ADDSTR:
! 289: case R_ADDDAM:
! 290: case R_ADDHIT:
! 291: case R_ADDINTEL:
! 292: case R_ADDWISDOM:
! 293: case R_CARRYING:
! 294: case R_VREGEN:
! 295: case R_RESURRECT:
! 296: case R_TELCONTROL:
! 297: case R_REGEN:
! 298: case R_PIETY:
! 299: case R_WIZARD:
! 300: buf[0] = ' ';
! 301: strcpy(&buf[1], num(obj->o_ac, 0,buffer));
! 302: break;
! 303:
! 304: case R_DIGEST:
! 305: buf[0] = ' ';
! 306: strcpy(&buf[1], num(obj->o_ac < 0 ?
! 307: obj->o_ac : obj->o_ac - 1, 0, buffer));
! 308: break;
! 309:
! 310: default:
! 311: if (obj->o_flags & ISCURSED)
! 312: strcpy(buf, " cursed");
! 313: break;
! 314: }
! 315: }
! 316:
! 317: return(buf);
! 318: }
! 319:
! 320: /*
! 321: ring_value()
! 322: Return the effect of the specified ring
! 323: */
! 324:
! 325: #define ISRING(h, r) (cur_ring[h] != NULL && cur_ring[h]->o_which == r)
! 326:
! 327: int
! 328: ring_value(int type)
! 329: {
! 330: int result = 0;
! 331:
! 332: if (ISRING(LEFT_1, type))
! 333: result += cur_ring[LEFT_1]->o_ac;
! 334: if (ISRING(LEFT_2, type))
! 335: result += cur_ring[LEFT_2]->o_ac;
! 336: if (ISRING(LEFT_3, type))
! 337: result += cur_ring[LEFT_3]->o_ac;
! 338: if (ISRING(LEFT_4, type))
! 339: result += cur_ring[LEFT_4]->o_ac;
! 340: if (ISRING(LEFT_5, type))
! 341: result += cur_ring[LEFT_5]->o_ac;
! 342: if (ISRING(RIGHT_1, type))
! 343: result += cur_ring[RIGHT_1]->o_ac;
! 344: if (ISRING(RIGHT_2, type))
! 345: result += cur_ring[RIGHT_2]->o_ac;
! 346: if (ISRING(RIGHT_3, type))
! 347: result += cur_ring[RIGHT_3]->o_ac;
! 348: if (ISRING(RIGHT_4, type))
! 349: result += cur_ring[RIGHT_4]->o_ac;
! 350: if (ISRING(RIGHT_5, type))
! 351: result += cur_ring[RIGHT_5]->o_ac;
! 352:
! 353: return(result);
! 354: }
CVSweb