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