Home | History | Annotate | Line # | Download | only in hack
hack.wield.c revision 1.5
      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