xref: /netbsd-src/games/hack/hack.wield.c (revision 3b01aba77a7a698587faaae455bbfe740923c1f5)
1 /*	$NetBSD: hack.wield.c,v 1.5 2001/03/25 20:44:03 jsm Exp $	*/
2 
3 /*
4  * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
5  */
6 
7 #include <sys/cdefs.h>
8 #ifndef lint
9 __RCSID("$NetBSD: hack.wield.c,v 1.5 2001/03/25 20:44:03 jsm Exp $");
10 #endif				/* not lint */
11 
12 #include "hack.h"
13 #include "extern.h"
14 
15 void
16 setuwep(obj)
17 	struct obj     *obj;
18 {
19 	setworn(obj, W_WEP);
20 }
21 
22 int
23 dowield()
24 {
25 	struct obj     *wep;
26 	int             res = 0;
27 
28 	multi = 0;
29 	if (!(wep = getobj("#-)", "wield")))	/* nothing */
30 		;
31 	else if (uwep == wep)
32 		pline("You are already wielding that!");
33 	else if (uwep && uwep->cursed)
34 		pline("The %s welded to your hand!",
35 		      aobjnam(uwep, "are"));
36 	else if (wep == &zeroobj) {
37 		if (uwep == 0) {
38 			pline("You are already empty handed.");
39 		} else {
40 			setuwep((struct obj *) 0);
41 			res++;
42 			pline("You are empty handed.");
43 		}
44 	} else if (uarms && wep->otyp == TWO_HANDED_SWORD)
45 		pline("You cannot wield a two-handed sword and wear a shield.");
46 	else if (wep->owornmask & (W_ARMOR | W_RING))
47 		pline("You cannot wield that!");
48 	else {
49 		setuwep(wep);
50 		res++;
51 		if (uwep->cursed)
52 			pline("The %s %s to your hand!",
53 			      aobjnam(uwep, "weld"),
54 			      (uwep->quan == 1) ? "itself" : "themselves");	/* a3 */
55 		else
56 			prinv(uwep);
57 	}
58 	return (res);
59 }
60 
61 void
62 corrode_weapon()
63 {
64 	if (!uwep || uwep->olet != WEAPON_SYM)
65 		return;		/* %% */
66 	if (uwep->rustfree)
67 		pline("Your %s not affected.", aobjnam(uwep, "are"));
68 	else {
69 		pline("Your %s!", aobjnam(uwep, "corrode"));
70 		uwep->spe--;
71 	}
72 }
73 
74 int
75 chwepon(otmp, amount)
76 	struct obj     *otmp;
77 	int amount;
78 {
79 	const char *color = (amount < 0) ? "black" : "green";
80 	const char *time;
81 	if (!uwep || uwep->olet != WEAPON_SYM) {
82 		strange_feeling(otmp,
83 				(amount > 0) ? "Your hands twitch."
84 				: "Your hands itch.");
85 		return (0);
86 	}
87 	if (uwep->otyp == WORM_TOOTH && amount > 0) {
88 		uwep->otyp = CRYSKNIFE;
89 		pline("Your weapon seems sharper now.");
90 		uwep->cursed = 0;
91 		return (1);
92 	}
93 	if (uwep->otyp == CRYSKNIFE && amount < 0) {
94 		uwep->otyp = WORM_TOOTH;
95 		pline("Your weapon looks duller now.");
96 		return (1);
97 	}
98 	/* there is a (soft) upper limit to uwep->spe */
99 	if (amount > 0 && uwep->spe > 5 && rn2(3)) {
100 		pline("Your %s violently green for a while and then evaporate%s.",
101 		      aobjnam(uwep, "glow"), plur(uwep->quan));
102 		while (uwep)	/* let all of them disappear */
103 			/* note: uwep->quan = 1 is nogood if unpaid */
104 			useup(uwep);
105 		return (1);
106 	}
107 	if (!rn2(6))
108 		amount *= 2;
109 	time = (amount * amount == 1) ? "moment" : "while";
110 	pline("Your %s %s for a %s.",
111 	      aobjnam(uwep, "glow"), color, time);
112 	uwep->spe += amount;
113 	if (amount > 0)
114 		uwep->cursed = 0;
115 	return (1);
116 }
117