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