Include partner in score list.
[rogue-pphs.git] / rings.c
1 /*
2 * routines dealing specifically with rings
3 *
4 * @(#)rings.c 3.17 (Berkeley) 6/15/81
5 *
6 * Rogue: Exploring the Cavern of Cuties
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 ring_on()
19 {
20 register struct object *obj;
21 register struct linked_list *item;
22 register int ring;
23 str_t save_max;
24 char buf[80];
25
26 item = get_item("put on", RING);
27 /*
28 * Make certain that it is somethings that we want to wear
29 */
30 if (item == NULL)
31 return;
32 obj = (struct object *) ldata(item);
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 save_max = max_stats.s_str;
74 chg_str(obj->o_ac);
75 max_stats.s_str = save_max;
76 break;
77 case R_SEEINVIS:
78 player.t_flags |= CANSEE;
79 light(&hero);
80 mvwaddch(cw, hero.y, hero.x, PLAYER);
81 break;
82 case R_AGGR:
83 aggravate();
84 break;
85 }
86 status();
87 if (r_know[obj->o_which] && r_guess[obj->o_which])
88 {
89 free(r_guess[obj->o_which]);
90 r_guess[obj->o_which] = NULL;
91 }
92 else if (!r_know[obj->o_which] && askme && r_guess[obj->o_which] == NULL)
93 {
94 mpos = 0;
95 msg(terse ? "Call it: " : "What do you want to call it? ");
96 if (get_str(buf, cw) == NORM)
97 {
98 r_guess[obj->o_which] = malloc((unsigned int) strlen(buf) + 1);
99 if (r_guess[obj->o_which] != NULL)
100 strcpy(r_guess[obj->o_which], buf);
101 }
102 msg("");
103 }
104 }
105
106 ring_off()
107 {
108 register int ring;
109 register struct object *obj;
110
111 if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
112 {
113 if (terse)
114 msg("No rings");
115 else
116 msg("You aren't wearing any rings");
117 return;
118 }
119 else if (cur_ring[LEFT] == NULL)
120 ring = RIGHT;
121 else if (cur_ring[RIGHT] == NULL)
122 ring = LEFT;
123 else
124 if ((ring = gethand()) < 0)
125 return;
126 mpos = 0;
127 obj = cur_ring[ring];
128 if (obj == NULL)
129 {
130 msg("Not wearing such a ring");
131 return;
132 }
133 if (dropcheck(obj))
134 msg("Was wearing %s", inv_name(obj, TRUE));
135 }
136
137 gethand()
138 {
139 register int c;
140
141 for (;;)
142 {
143 if (terse)
144 msg("Left or Right ring? ");
145 else
146 msg("Left hand or right hand? ");
147 if ((c = readchar(cw)) == 'l' || c == 'L')
148 return LEFT;
149 else if (c == 'r' || c == 'R')
150 return RIGHT;
151 else if (c == ESCAPE)
152 return -1;
153 mpos = 0;
154 if (terse)
155 msg("L or R");
156 else
157 msg("Please type L or R");
158 }
159 }
160
161 /*
162 * how much food does this ring use up?
163 */
164 ring_eat(hand)
165 register int hand;
166 {
167 if (cur_ring[hand] == NULL)
168 return 0;
169 switch (cur_ring[hand]->o_which)
170 {
171 case R_REGEN:
172 return 2;
173 case R_SUSTSTR:
174 return 1;
175 case R_SEARCH:
176 return (rnd(100) < 33);
177 case R_DIGEST:
178 return -(rnd(100) < 50);
179 default:
180 return 0;
181 }
182 }
183
184 /*
185 * print ring bonuses
186 */
187 char *
188 ring_num(obj)
189 register struct object *obj;
190 {
191 static char buf[5];
192
193 if (!(obj->o_flags & ISKNOW))
194 return "";
195 switch (obj->o_which)
196 {
197 case R_PROTECT:
198 case R_ADDSTR:
199 case R_ADDDAM:
200 case R_ADDHIT:
201 buf[0] = ' ';
202 strcpy(&buf[1], num(obj->o_ac, 0));
203 otherwise:
204 return "";
205 }
206 return buf;
207 }