Annotation of early-roguelike/rogue3/rings.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * routines dealing specifically with rings
! 3: *
! 4: * @(#)rings.c 3.17 (Berkeley) 6/15/81
! 5: *
! 6: * Rogue: Exploring the Dungeons of Doom
! 7: * Copyright (C) 1980, 1981 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 <stdlib.h>
! 15: #include <string.h>
! 16: #include "rogue.h"
! 17:
! 18: void
! 19: ring_on()
! 20: {
! 21: struct object *obj;
! 22: struct linked_list *item;
! 23: int ring;
! 24: str_t save_max;
! 25: char buf[80];
! 26:
! 27: item = get_item("put on", RING);
! 28: /*
! 29: * Make certain that it is somethings that we want to wear
! 30: */
! 31: if (item == NULL)
! 32: return;
! 33: obj = (struct object *) ldata(item);
! 34: if (obj->o_type != RING)
! 35: {
! 36: if (!terse)
! 37: msg("It would be difficult to wrap that around a finger");
! 38: else
! 39: msg("Not a ring");
! 40: return;
! 41: }
! 42:
! 43: /*
! 44: * find out which hand to put it on
! 45: */
! 46: if (is_current(obj))
! 47: return;
! 48:
! 49: if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
! 50: {
! 51: if ((ring = gethand()) < 0)
! 52: return;
! 53: }
! 54: else if (cur_ring[LEFT] == NULL)
! 55: ring = LEFT;
! 56: else if (cur_ring[RIGHT] == NULL)
! 57: ring = RIGHT;
! 58: else
! 59: {
! 60: if (!terse)
! 61: msg("You already have a ring on each hand");
! 62: else
! 63: msg("Wearing two");
! 64: return;
! 65: }
! 66: cur_ring[ring] = obj;
! 67:
! 68: /*
! 69: * Calculate the effect it has on the poor guy.
! 70: */
! 71: switch (obj->o_which)
! 72: {
! 73: case R_ADDSTR:
! 74: save_max = max_stats.s_str;
! 75: chg_str(obj->o_ac);
! 76: max_stats.s_str = save_max;
! 77: break;
! 78: case R_SEEINVIS:
! 79: player.t_flags |= CANSEE;
! 80: light(&hero);
! 81: mvwaddch(cw, hero.y, hero.x, PLAYER);
! 82: break;
! 83: case R_AGGR:
! 84: aggravate();
! 85: break;
! 86: }
! 87: status();
! 88:
! 89: if (obj->o_which >= MAXRINGS)
! 90: return;
! 91:
! 92: if (r_know[obj->o_which] && r_guess[obj->o_which])
! 93: {
! 94: free(r_guess[obj->o_which]);
! 95: r_guess[obj->o_which] = NULL;
! 96: }
! 97: else if (!r_know[obj->o_which] && askme && r_guess[obj->o_which] == NULL)
! 98: {
! 99: mpos = 0;
! 100: msg(terse ? "Call it: " : "What do you want to call it? ");
! 101: if (get_str(buf, cw) == NORM)
! 102: {
! 103: r_guess[obj->o_which] = malloc(strlen(buf) + 1);
! 104: if (r_guess[obj->o_which] != NULL)
! 105: strcpy(r_guess[obj->o_which], buf);
! 106: }
! 107: msg("");
! 108: }
! 109: }
! 110:
! 111: void
! 112: ring_off()
! 113: {
! 114: int ring;
! 115: struct object *obj;
! 116:
! 117: if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
! 118: {
! 119: if (terse)
! 120: msg("No rings");
! 121: else
! 122: msg("You aren't wearing any rings");
! 123: return;
! 124: }
! 125: else if (cur_ring[LEFT] == NULL)
! 126: ring = RIGHT;
! 127: else if (cur_ring[RIGHT] == NULL)
! 128: ring = LEFT;
! 129: else
! 130: if ((ring = gethand()) < 0)
! 131: return;
! 132: mpos = 0;
! 133: obj = cur_ring[ring];
! 134: if (obj == NULL)
! 135: {
! 136: msg("Not wearing such a ring");
! 137: return;
! 138: }
! 139: if (dropcheck(obj))
! 140: msg("Was wearing %s", inv_name(obj, TRUE));
! 141: }
! 142:
! 143: int
! 144: gethand()
! 145: {
! 146: int c;
! 147:
! 148: for (;;)
! 149: {
! 150: if (terse)
! 151: msg("Left or Right ring? ");
! 152: else
! 153: msg("Left hand or right hand? ");
! 154: if ((c = readchar(cw)) == 'l' || c == 'L')
! 155: return LEFT;
! 156: else if (c == 'r' || c == 'R')
! 157: return RIGHT;
! 158: else if (c == ESCAPE)
! 159: return -1;
! 160: mpos = 0;
! 161: if (terse)
! 162: msg("L or R");
! 163: else
! 164: msg("Please type L or R");
! 165: }
! 166: }
! 167:
! 168: /*
! 169: * how much food does this ring use up?
! 170: */
! 171: int
! 172: ring_eat(int hand)
! 173: {
! 174: if (cur_ring[hand] == NULL)
! 175: return 0;
! 176: switch (cur_ring[hand]->o_which)
! 177: {
! 178: case R_REGEN:
! 179: return 2;
! 180: case R_SUSTSTR:
! 181: return 1;
! 182: case R_SEARCH:
! 183: return (rnd(100) < 33);
! 184: case R_DIGEST:
! 185: return -(rnd(100) < 50);
! 186: default:
! 187: return 0;
! 188: }
! 189: }
! 190:
! 191: /*
! 192: * print ring bonuses
! 193: */
! 194: char *
! 195: ring_num(struct object *obj)
! 196: {
! 197: static char buf[5];
! 198:
! 199: if (!(obj->o_flags & ISKNOW))
! 200: return "";
! 201: switch (obj->o_which)
! 202: {
! 203: case R_PROTECT:
! 204: case R_ADDSTR:
! 205: case R_ADDDAM:
! 206: case R_ADDHIT:
! 207: buf[0] = ' ';
! 208: strcpy(&buf[1], num(obj->o_ac, 0));
! 209: otherwise:
! 210: return "";
! 211: }
! 212: return buf;
! 213: }
CVSweb