hack.wield.c 5.6 KB

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