Annotation of early-roguelike/rogue4/rings.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Routines dealing specifically with rings
! 3: *
! 4: * @(#)rings.c 4.13 (Berkeley) 1/28/82
! 5: *
! 6: * Rogue: Exploring the Dungeons of Doom
! 7: * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
! 8: * All rights reserved.
! 9: *
! 10: * See the file LICENSE.TXT for full copyright and licensing information.
! 11: */
! 12:
! 13: #include <curses.h>
! 14: #include <string.h>
! 15: #include "rogue.h"
! 16:
! 17: int gethand(void);
! 18:
! 19: /*
! 20: * ring_on:
! 21: * Put a ring on a hand
! 22: */
! 23: void
! 24: ring_on(void)
! 25: {
! 26: register THING *obj;
! 27: register int ring;
! 28:
! 29: obj = get_item("put on", RING);
! 30: /*
! 31: * Make certain that it is somethings that we want to wear
! 32: */
! 33: if (obj == NULL)
! 34: return;
! 35: if (obj->o_type != RING)
! 36: {
! 37: if (!terse)
! 38: msg("it would be difficult to wrap that around a finger");
! 39: else
! 40: msg("not a ring");
! 41: return;
! 42: }
! 43:
! 44: /*
! 45: * find out which hand to put it on
! 46: */
! 47: if (is_current(obj))
! 48: return;
! 49:
! 50: if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
! 51: {
! 52: if ((ring = gethand()) < 0)
! 53: return;
! 54: }
! 55: else if (cur_ring[LEFT] == NULL)
! 56: ring = LEFT;
! 57: else if (cur_ring[RIGHT] == NULL)
! 58: ring = RIGHT;
! 59: else
! 60: {
! 61: if (!terse)
! 62: msg("you already have a ring on each hand");
! 63: else
! 64: msg("wearing two");
! 65: return;
! 66: }
! 67: cur_ring[ring] = obj;
! 68:
! 69: /*
! 70: * Calculate the effect it has on the poor guy.
! 71: */
! 72: switch (obj->o_which)
! 73: {
! 74: case R_ADDSTR:
! 75: chg_str(obj->o_ac);
! 76: break;
! 77: case R_SEEINVIS:
! 78: invis_on();
! 79: break;
! 80: case R_AGGR:
! 81: aggravate();
! 82: break;
! 83: }
! 84:
! 85: if (!terse)
! 86: addmsg("you are now wearing ");
! 87: msg("%s (%c)", inv_name(obj, TRUE), pack_char(obj));
! 88: }
! 89:
! 90: /*
! 91: * ring_off:
! 92: * Take off a ring
! 93: */
! 94: void
! 95: ring_off(void)
! 96: {
! 97: register int ring;
! 98: register THING *obj;
! 99: register char packchar;
! 100:
! 101: if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
! 102: {
! 103: if (terse)
! 104: msg("no rings");
! 105: else
! 106: msg("you aren't wearing any rings");
! 107: return;
! 108: }
! 109: else if (cur_ring[LEFT] == NULL)
! 110: ring = RIGHT;
! 111: else if (cur_ring[RIGHT] == NULL)
! 112: ring = LEFT;
! 113: else
! 114: if ((ring = gethand()) < 0)
! 115: return;
! 116: mpos = 0;
! 117: obj = cur_ring[ring];
! 118: if (obj == NULL)
! 119: {
! 120: msg("not wearing such a ring");
! 121: return;
! 122: }
! 123: packchar = pack_char(obj);
! 124: if (dropcheck(obj))
! 125: msg("was wearing %s(%c)", inv_name(obj, TRUE), packchar);
! 126: }
! 127:
! 128: /*
! 129: * gethand:
! 130: * Which hand is the hero interested in?
! 131: */
! 132: int
! 133: gethand(void)
! 134: {
! 135: register int c;
! 136:
! 137: for (;;)
! 138: {
! 139: if (terse)
! 140: msg("left or right ring? ");
! 141: else
! 142: msg("left hand or right hand? ");
! 143: if ((c = readchar()) == ESCAPE)
! 144: return -1;
! 145: mpos = 0;
! 146: if (c == 'l' || c == 'L')
! 147: return LEFT;
! 148: else if (c == 'r' || c == 'R')
! 149: return RIGHT;
! 150: if (terse)
! 151: msg("L or R");
! 152: else
! 153: msg("please type L or R");
! 154: }
! 155: }
! 156:
! 157: /*
! 158: * ring_eat:
! 159: * How much food does this ring use up?
! 160: */
! 161: int
! 162: ring_eat(int hand)
! 163: {
! 164: if (cur_ring[hand] == NULL)
! 165: return 0;
! 166: switch (cur_ring[hand]->o_which)
! 167: {
! 168: case R_REGEN:
! 169: return 2;
! 170: case R_SUSTSTR:
! 171: case R_SUSTARM:
! 172: case R_PROTECT:
! 173: case R_ADDSTR:
! 174: case R_STEALTH:
! 175: return 1;
! 176: case R_SEARCH:
! 177: case R_ADDHIT:
! 178: case R_ADDDAM:
! 179: return (rnd(3) == 0);
! 180: case R_DIGEST:
! 181: return -rnd(2);
! 182: case R_SEEINVIS:
! 183: return (rnd(5) == 0);
! 184: default:
! 185: return 0;
! 186: }
! 187: }
! 188:
! 189: /*
! 190: * ring_num:
! 191: * Print ring bonuses
! 192: */
! 193: char *
! 194: ring_num(THING *obj)
! 195: {
! 196: static char buf[5];
! 197:
! 198: if (!(obj->o_flags & ISKNOW))
! 199: return "";
! 200: switch (obj->o_which)
! 201: {
! 202: case R_PROTECT:
! 203: case R_ADDSTR:
! 204: case R_ADDDAM:
! 205: case R_ADDHIT:
! 206: buf[0] = ' ';
! 207: strcpy(&buf[1], num(obj->o_ac, 0, RING));
! 208: otherwise:
! 209: return "";
! 210: }
! 211: return buf;
! 212: }
CVSweb