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
off_msg(otmp)10 off_msg(otmp) register struct obj *otmp; {
11 pline("You were wearing %s.", doname(otmp));
12 }
13
doremarm()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
doremring()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
dorr(otmp)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
cursed(otmp)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
armoroff(otmp)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
doweararm()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
dowearring()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
ringoff(obj)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
find_ac()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
glibr()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 *
some_armor()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
corrode_armor()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