hack.do_wear.c revision 1.2 1 1.2 mycroft /*
2 1.2 mycroft * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
3 1.2 mycroft */
4 1.2 mycroft
5 1.2 mycroft #ifndef lint
6 1.2 mycroft static char rcsid[] = "$Id: hack.do_wear.c,v 1.2 1993/08/02 17:17:06 mycroft Exp $";
7 1.2 mycroft #endif /* not lint */
8 1.1 cgd
9 1.1 cgd #include "hack.h"
10 1.1 cgd #include <stdio.h>
11 1.1 cgd extern char *nomovemsg;
12 1.1 cgd extern char quitchars[];
13 1.1 cgd extern char *Doname();
14 1.1 cgd
15 1.1 cgd off_msg(otmp) register struct obj *otmp; {
16 1.1 cgd pline("You were wearing %s.", doname(otmp));
17 1.1 cgd }
18 1.1 cgd
19 1.1 cgd doremarm() {
20 1.1 cgd register struct obj *otmp;
21 1.1 cgd if(!uarm && !uarmh && !uarms && !uarmg) {
22 1.1 cgd pline("Not wearing any armor.");
23 1.1 cgd return(0);
24 1.1 cgd }
25 1.1 cgd otmp = (!uarmh && !uarms && !uarmg) ? uarm :
26 1.1 cgd (!uarms && !uarm && !uarmg) ? uarmh :
27 1.1 cgd (!uarmh && !uarm && !uarmg) ? uarms :
28 1.1 cgd (!uarmh && !uarm && !uarms) ? uarmg :
29 1.1 cgd getobj("[", "take off");
30 1.1 cgd if(!otmp) return(0);
31 1.1 cgd if(!(otmp->owornmask & (W_ARMOR - W_ARM2))) {
32 1.1 cgd pline("You can't take that off.");
33 1.1 cgd return(0);
34 1.1 cgd }
35 1.1 cgd if( otmp == uarmg && uwep && uwep->cursed ) { /* myers@uwmacc */
36 1.1 cgd pline("You seem not able to take off the gloves while holding your weapon.");
37 1.1 cgd return(0);
38 1.1 cgd }
39 1.1 cgd (void) armoroff(otmp);
40 1.1 cgd return(1);
41 1.1 cgd }
42 1.1 cgd
43 1.1 cgd doremring() {
44 1.1 cgd if(!uleft && !uright){
45 1.1 cgd pline("Not wearing any ring.");
46 1.1 cgd return(0);
47 1.1 cgd }
48 1.1 cgd if(!uleft)
49 1.1 cgd return(dorr(uright));
50 1.1 cgd if(!uright)
51 1.1 cgd return(dorr(uleft));
52 1.1 cgd if(uleft && uright) while(1) {
53 1.1 cgd char answer;
54 1.1 cgd
55 1.1 cgd pline("What ring, Right or Left? [ rl?]");
56 1.1 cgd if(index(quitchars, (answer = readchar())))
57 1.1 cgd return(0);
58 1.1 cgd switch(answer) {
59 1.1 cgd case 'l':
60 1.1 cgd case 'L':
61 1.1 cgd return(dorr(uleft));
62 1.1 cgd case 'r':
63 1.1 cgd case 'R':
64 1.1 cgd return(dorr(uright));
65 1.1 cgd case '?':
66 1.1 cgd (void) doprring();
67 1.1 cgd /* might look at morc here %% */
68 1.1 cgd }
69 1.1 cgd }
70 1.1 cgd /* NOTREACHED */
71 1.1 cgd #ifdef lint
72 1.1 cgd return(0);
73 1.1 cgd #endif lint
74 1.1 cgd }
75 1.1 cgd
76 1.1 cgd dorr(otmp) register struct obj *otmp; {
77 1.1 cgd if(cursed(otmp)) return(0);
78 1.1 cgd ringoff(otmp);
79 1.1 cgd off_msg(otmp);
80 1.1 cgd return(1);
81 1.1 cgd }
82 1.1 cgd
83 1.1 cgd cursed(otmp) register struct obj *otmp; {
84 1.1 cgd if(otmp->cursed){
85 1.1 cgd pline("You can't. It appears to be cursed.");
86 1.1 cgd return(1);
87 1.1 cgd }
88 1.1 cgd return(0);
89 1.1 cgd }
90 1.1 cgd
91 1.1 cgd armoroff(otmp) register struct obj *otmp; {
92 1.1 cgd register int delay = -objects[otmp->otyp].oc_delay;
93 1.1 cgd if(cursed(otmp)) return(0);
94 1.1 cgd setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
95 1.1 cgd if(delay) {
96 1.1 cgd nomul(delay);
97 1.1 cgd switch(otmp->otyp) {
98 1.1 cgd case HELMET:
99 1.1 cgd nomovemsg = "You finished taking off your helmet.";
100 1.1 cgd break;
101 1.1 cgd case PAIR_OF_GLOVES:
102 1.1 cgd nomovemsg = "You finished taking off your gloves";
103 1.1 cgd break;
104 1.1 cgd default:
105 1.1 cgd nomovemsg = "You finished taking off your suit.";
106 1.1 cgd }
107 1.1 cgd } else {
108 1.1 cgd off_msg(otmp);
109 1.1 cgd }
110 1.1 cgd return(1);
111 1.1 cgd }
112 1.1 cgd
113 1.1 cgd doweararm() {
114 1.1 cgd register struct obj *otmp;
115 1.1 cgd register int delay;
116 1.1 cgd register int err = 0;
117 1.1 cgd long mask = 0;
118 1.1 cgd
119 1.1 cgd otmp = getobj("[", "wear");
120 1.1 cgd if(!otmp) return(0);
121 1.1 cgd if(otmp->owornmask & W_ARMOR) {
122 1.1 cgd pline("You are already wearing that!");
123 1.1 cgd return(0);
124 1.1 cgd }
125 1.1 cgd if(otmp->otyp == HELMET){
126 1.1 cgd if(uarmh) {
127 1.1 cgd pline("You are already wearing a helmet.");
128 1.1 cgd err++;
129 1.1 cgd } else
130 1.1 cgd mask = W_ARMH;
131 1.1 cgd } else if(otmp->otyp == SHIELD){
132 1.1 cgd if(uarms) pline("You are already wearing a shield."), err++;
133 1.1 cgd if(uwep && uwep->otyp == TWO_HANDED_SWORD)
134 1.1 cgd pline("You cannot wear a shield and wield a two-handed sword."), err++;
135 1.1 cgd if(!err) mask = W_ARMS;
136 1.1 cgd } else if(otmp->otyp == PAIR_OF_GLOVES) {
137 1.1 cgd if(uarmg) {
138 1.1 cgd pline("You are already wearing gloves.");
139 1.1 cgd err++;
140 1.1 cgd } else
141 1.1 cgd if(uwep && uwep->cursed) {
142 1.1 cgd pline("You cannot wear gloves over your weapon.");
143 1.1 cgd err++;
144 1.1 cgd } else
145 1.1 cgd mask = W_ARMG;
146 1.1 cgd } else {
147 1.1 cgd if(uarm) {
148 1.1 cgd if(otmp->otyp != ELVEN_CLOAK || uarm2) {
149 1.1 cgd pline("You are already wearing some armor.");
150 1.1 cgd err++;
151 1.1 cgd }
152 1.1 cgd }
153 1.1 cgd if(!err) mask = W_ARM;
154 1.1 cgd }
155 1.1 cgd if(otmp == uwep && uwep->cursed) {
156 1.1 cgd if(!err++)
157 1.1 cgd pline("%s is welded to your hand.", Doname(uwep));
158 1.1 cgd }
159 1.1 cgd if(err) return(0);
160 1.1 cgd setworn(otmp, mask);
161 1.1 cgd if(otmp == uwep)
162 1.1 cgd setuwep((struct obj *) 0);
163 1.1 cgd delay = -objects[otmp->otyp].oc_delay;
164 1.1 cgd if(delay){
165 1.1 cgd nomul(delay);
166 1.1 cgd nomovemsg = "You finished your dressing manoeuvre.";
167 1.1 cgd }
168 1.1 cgd otmp->known = 1;
169 1.1 cgd return(1);
170 1.1 cgd }
171 1.1 cgd
172 1.1 cgd dowearring() {
173 1.1 cgd register struct obj *otmp;
174 1.1 cgd long mask = 0;
175 1.1 cgd long oldprop;
176 1.1 cgd
177 1.1 cgd if(uleft && uright){
178 1.1 cgd pline("There are no more ring-fingers to fill.");
179 1.1 cgd return(0);
180 1.1 cgd }
181 1.1 cgd otmp = getobj("=", "wear");
182 1.1 cgd if(!otmp) return(0);
183 1.1 cgd if(otmp->owornmask & W_RING) {
184 1.1 cgd pline("You are already wearing that!");
185 1.1 cgd return(0);
186 1.1 cgd }
187 1.1 cgd if(otmp == uleft || otmp == uright) {
188 1.1 cgd pline("You are already wearing that.");
189 1.1 cgd return(0);
190 1.1 cgd }
191 1.1 cgd if(otmp == uwep && uwep->cursed) {
192 1.1 cgd pline("%s is welded to your hand.", Doname(uwep));
193 1.1 cgd return(0);
194 1.1 cgd }
195 1.1 cgd if(uleft) mask = RIGHT_RING;
196 1.1 cgd else if(uright) mask = LEFT_RING;
197 1.1 cgd else do {
198 1.1 cgd char answer;
199 1.1 cgd
200 1.1 cgd pline("What ring-finger, Right or Left? ");
201 1.1 cgd if(index(quitchars, (answer = readchar())))
202 1.1 cgd return(0);
203 1.1 cgd switch(answer){
204 1.1 cgd case 'l':
205 1.1 cgd case 'L':
206 1.1 cgd mask = LEFT_RING;
207 1.1 cgd break;
208 1.1 cgd case 'r':
209 1.1 cgd case 'R':
210 1.1 cgd mask = RIGHT_RING;
211 1.1 cgd break;
212 1.1 cgd }
213 1.1 cgd } while(!mask);
214 1.1 cgd setworn(otmp, mask);
215 1.1 cgd if(otmp == uwep)
216 1.1 cgd setuwep((struct obj *) 0);
217 1.1 cgd oldprop = u.uprops[PROP(otmp->otyp)].p_flgs;
218 1.1 cgd u.uprops[PROP(otmp->otyp)].p_flgs |= mask;
219 1.1 cgd switch(otmp->otyp){
220 1.1 cgd case RIN_LEVITATION:
221 1.1 cgd if(!oldprop) float_up();
222 1.1 cgd break;
223 1.1 cgd case RIN_PROTECTION_FROM_SHAPE_CHANGERS:
224 1.1 cgd rescham();
225 1.1 cgd break;
226 1.1 cgd case RIN_GAIN_STRENGTH:
227 1.1 cgd u.ustr += otmp->spe;
228 1.1 cgd u.ustrmax += otmp->spe;
229 1.1 cgd if(u.ustr > 118) u.ustr = 118;
230 1.1 cgd if(u.ustrmax > 118) u.ustrmax = 118;
231 1.1 cgd flags.botl = 1;
232 1.1 cgd break;
233 1.1 cgd case RIN_INCREASE_DAMAGE:
234 1.1 cgd u.udaminc += otmp->spe;
235 1.1 cgd break;
236 1.1 cgd }
237 1.1 cgd prinv(otmp);
238 1.1 cgd return(1);
239 1.1 cgd }
240 1.1 cgd
241 1.1 cgd ringoff(obj)
242 1.1 cgd register struct obj *obj;
243 1.1 cgd {
244 1.1 cgd register long mask;
245 1.1 cgd mask = obj->owornmask & W_RING;
246 1.1 cgd setworn((struct obj *) 0, obj->owornmask);
247 1.1 cgd if(!(u.uprops[PROP(obj->otyp)].p_flgs & mask))
248 1.1 cgd impossible("Strange... I didnt know you had that ring.");
249 1.1 cgd u.uprops[PROP(obj->otyp)].p_flgs &= ~mask;
250 1.1 cgd switch(obj->otyp) {
251 1.1 cgd case RIN_FIRE_RESISTANCE:
252 1.1 cgd /* Bad luck if the player is in hell... --jgm */
253 1.1 cgd if (!Fire_resistance && dlevel >= 30) {
254 1.1 cgd pline("The flames of Hell burn you to a crisp.");
255 1.1 cgd killer = "stupidity in hell";
256 1.1 cgd done("burned");
257 1.1 cgd }
258 1.1 cgd break;
259 1.1 cgd case RIN_LEVITATION:
260 1.1 cgd if(!Levitation) { /* no longer floating */
261 1.1 cgd float_down();
262 1.1 cgd }
263 1.1 cgd break;
264 1.1 cgd case RIN_GAIN_STRENGTH:
265 1.1 cgd u.ustr -= obj->spe;
266 1.1 cgd u.ustrmax -= obj->spe;
267 1.1 cgd if(u.ustr > 118) u.ustr = 118;
268 1.1 cgd if(u.ustrmax > 118) u.ustrmax = 118;
269 1.1 cgd flags.botl = 1;
270 1.1 cgd break;
271 1.1 cgd case RIN_INCREASE_DAMAGE:
272 1.1 cgd u.udaminc -= obj->spe;
273 1.1 cgd break;
274 1.1 cgd }
275 1.1 cgd }
276 1.1 cgd
277 1.1 cgd find_ac(){
278 1.1 cgd register int uac = 10;
279 1.1 cgd if(uarm) uac -= ARM_BONUS(uarm);
280 1.1 cgd if(uarm2) uac -= ARM_BONUS(uarm2);
281 1.1 cgd if(uarmh) uac -= ARM_BONUS(uarmh);
282 1.1 cgd if(uarms) uac -= ARM_BONUS(uarms);
283 1.1 cgd if(uarmg) uac -= ARM_BONUS(uarmg);
284 1.1 cgd if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe;
285 1.1 cgd if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe;
286 1.1 cgd if(uac != u.uac){
287 1.1 cgd u.uac = uac;
288 1.1 cgd flags.botl = 1;
289 1.1 cgd }
290 1.1 cgd }
291 1.1 cgd
292 1.1 cgd glibr(){
293 1.1 cgd register struct obj *otmp;
294 1.1 cgd int xfl = 0;
295 1.1 cgd if(!uarmg) if(uleft || uright) {
296 1.1 cgd /* Note: at present also cursed rings fall off */
297 1.1 cgd pline("Your %s off your fingers.",
298 1.1 cgd (uleft && uright) ? "rings slip" : "ring slips");
299 1.1 cgd xfl++;
300 1.1 cgd if((otmp = uleft) != Null(obj)){
301 1.1 cgd ringoff(uleft);
302 1.1 cgd dropx(otmp);
303 1.1 cgd }
304 1.1 cgd if((otmp = uright) != Null(obj)){
305 1.1 cgd ringoff(uright);
306 1.1 cgd dropx(otmp);
307 1.1 cgd }
308 1.1 cgd }
309 1.1 cgd if((otmp = uwep) != Null(obj)){
310 1.1 cgd /* Note: at present also cursed weapons fall */
311 1.1 cgd setuwep((struct obj *) 0);
312 1.1 cgd dropx(otmp);
313 1.1 cgd pline("Your weapon %sslips from your hands.",
314 1.1 cgd xfl ? "also " : "");
315 1.1 cgd }
316 1.1 cgd }
317 1.1 cgd
318 1.1 cgd struct obj *
319 1.1 cgd some_armor(){
320 1.1 cgd register struct obj *otmph = uarm;
321 1.1 cgd if(uarmh && (!otmph || !rn2(4))) otmph = uarmh;
322 1.1 cgd if(uarmg && (!otmph || !rn2(4))) otmph = uarmg;
323 1.1 cgd if(uarms && (!otmph || !rn2(4))) otmph = uarms;
324 1.1 cgd return(otmph);
325 1.1 cgd }
326 1.1 cgd
327 1.1 cgd corrode_armor(){
328 1.1 cgd register struct obj *otmph = some_armor();
329 1.1 cgd if(otmph){
330 1.1 cgd if(otmph->rustfree ||
331 1.1 cgd otmph->otyp == ELVEN_CLOAK ||
332 1.1 cgd otmph->otyp == LEATHER_ARMOR ||
333 1.1 cgd otmph->otyp == STUDDED_LEATHER_ARMOR) {
334 1.1 cgd pline("Your %s not affected!",
335 1.1 cgd aobjnam(otmph, "are"));
336 1.1 cgd return;
337 1.1 cgd }
338 1.1 cgd pline("Your %s!", aobjnam(otmph, "corrode"));
339 1.1 cgd otmph->spe--;
340 1.1 cgd }
341 1.1 cgd }
342