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