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