]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - games/hack/hack.do_wear.c
This commit was generated by cvs2svn to compensate for changes in r44335,
[FreeBSD/FreeBSD.git] / games / hack / hack.do_wear.c
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 }