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