comparison rogue4/rings.c @ 12:9535a08ddc39

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