
1: /* $NetBSD: hack.wield.c,v 1.6 2003/04/02 18:36:41 jsm Exp $ */ 2: 3: /* 4: * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, 5: * Amsterdam 6: * All rights reserved. 7: * 8: * Redistribution and use in source and binary forms, with or without 9: * modification, are permitted provided that the following conditions are 10: * met: 11: * 12: * - Redistributions of source code must retain the above copyright notice, 13: * this list of conditions and the following disclaimer. 14: * 15: * - Redistributions in binary form must reproduce the above copyright 16: * notice, this list of conditions and the following disclaimer in the 17: * documentation and/or other materials provided with the distribution. 18: * 19: * - Neither the name of the Stichting Centrum voor Wiskunde en 20: * Informatica, nor the names of its contributors may be used to endorse or 21: * promote products derived from this software without specific prior 22: * written permission. 23: * 24: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 25: * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 26: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 27: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 28: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 29: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 30: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 31: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 32: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 33: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 34: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35: */ 36: 37: /* 38: * Copyright (c) 1982 Jay Fenlason <hack@gnu.org> 39: * All rights reserved. 40: * 41: * Redistribution and use in source and binary forms, with or without 42: * modification, are permitted provided that the following conditions 43: * are met: 44: * 1. Redistributions of source code must retain the above copyright 45: * notice, this list of conditions and the following disclaimer. 46: * 2. Redistributions in binary form must reproduce the above copyright 47: * notice, this list of conditions and the following disclaimer in the 48: * documentation and/or other materials provided with the distribution. 49: * 3. The name of the author may not be used to endorse or promote products 50: * derived from this software without specific prior written permission. 51: * 52: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 53: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 54: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 55: * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 56: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 57: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 58: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 59: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 60: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 61: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62: */ 63: 64: #include <sys/cdefs.h> 65: #ifndef lint 66: __RCSID("$NetBSD: hack.wield.c,v 1.6 2003/04/02 18:36:41 jsm Exp $"); 67: #endif /* not lint */ 68: 69: #include "hack.h" 70: #include "extern.h" 71: 72: void 73: setuwep(obj) 74: struct obj *obj; 75: { 76: setworn(obj, W_WEP); 77: } 78: 79: int 80: dowield() 81: { 82: struct obj *wep; 83: int res = 0; 84: 85: multi = 0; 86: if (!(wep = getobj("#-)", "wield"))) /* nothing */ 87: ; 88: else if (uwep == wep) 89: pline("You are already wielding that!"); 90: else if (uwep && uwep->cursed) 91: pline("The %s welded to your hand!", 92: aobjnam(uwep, "are")); 93: else if (wep == &zeroobj) { 94: if (uwep == 0) { 95: pline("You are already empty handed."); 96: } else { 97: setuwep((struct obj *) 0); 98: res++; 99: pline("You are empty handed."); 100: } 101: } else if (uarms && wep->otyp == TWO_HANDED_SWORD) 102: pline("You cannot wield a two-handed sword and wear a shield."); 103: else if (wep->owornmask & (W_ARMOR | W_RING)) 104: pline("You cannot wield that!"); 105: else { 106: setuwep(wep); 107: res++; 108: if (uwep->cursed) 109: pline("The %s %s to your hand!", 110: aobjnam(uwep, "weld"), 111: (uwep->quan == 1) ? "itself" : "themselves"); /* a3 */ 112: else 113: prinv(uwep); 114: } 115: return (res); 116: } 117: 118: void 119: corrode_weapon() 120: { 121: if (!uwep || uwep->olet != WEAPON_SYM) 122: return; /* %% */ 123: if (uwep->rustfree) 124: pline("Your %s not affected.", aobjnam(uwep, "are")); 125: else { 126: pline("Your %s!", aobjnam(uwep, "corrode")); 127: uwep->spe--; 128: } 129: } 130: 131: int 132: chwepon(otmp, amount) 133: struct obj *otmp; 134: int amount; 135: { 136: const char *color = (amount < 0) ? "black" : "green"; 137: const char *time; 138: if (!uwep || uwep->olet != WEAPON_SYM) { 139: strange_feeling(otmp, 140: (amount > 0) ? "Your hands twitch." 141: : "Your hands itch."); 142: return (0); 143: } 144: if (uwep->otyp == WORM_TOOTH && amount > 0) { 145: uwep->otyp = CRYSKNIFE; 146: pline("Your weapon seems sharper now."); 147: uwep->cursed = 0; 148: return (1); 149: } 150: if (uwep->otyp == CRYSKNIFE && amount < 0) { 151: uwep->otyp = WORM_TOOTH; 152: pline("Your weapon looks duller now."); 153: return (1); 154: } 155: /* there is a (soft) upper limit to uwep->spe */ 156: if (amount > 0 && uwep->spe > 5 && rn2(3)) { 157: pline("Your %s violently green for a while and then evaporate%s.", 158: aobjnam(uwep, "glow"), plur(uwep->quan)); 159: while (uwep) /* let all of them disappear */ 160: /* note: uwep->quan = 1 is nogood if unpaid */ 161: useup(uwep); 162: return (1); 163: } 164: if (!rn2(6)) 165: amount *= 2; 166: time = (amount * amount == 1) ? "moment" : "while"; 167: pline("Your %s %s for a %s.", 168: aobjnam(uwep, "glow"), color, time); 169: uwep->spe += amount; 170: if (amount > 0) 171: uwep->cursed = 0; 172: return (1); 173: }