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: }
Defined functions
dorr
defined in line
71; used 4 times