]> granicus.if.org Git - nethack/commitdiff
Make enhanced ammo last longer.
authorjwalz <jwalz>
Wed, 28 May 2003 21:54:37 +0000 (21:54 +0000)
committerjwalz <jwalz>
Wed, 28 May 2003 21:54:37 +0000 (21:54 +0000)
Since traps can no longer provide an infinite supply, and people were
complaining that they always ran out of ammo before, make it less likely
to break enchanted and blessed ammo, and more likely to break eroded
ones.

doc/fixes34.2
src/dothrow.c

index 71c0a623dcaa3bd64ef80a16acba0c918478cb63..487aa56af245b9e89fff3c7392eff588753db317 100644 (file)
@@ -31,6 +31,7 @@ allow all tame monsters that eat to consider food thrown to them
 the screen display wasn't always up to date after map topology changes
 jumping over a sokobon pit would result in the player next to, not in, the pit
 don't let arrow, rock or dart traps provide an infinite number of objects
+make enhanced ammo harder to break to make lesser number last longer
 dropping from height or throwing a normal container may damage contents
 some Magicbane messages treated "erinys" as plural
 initialize artifacts before processing $WIZKIT
index f81e307c3a690013fe0147aaf324221f4768cedf..e43b590ed5e730f98a1140a26777d8a022e2b619 100644 (file)
@@ -1309,11 +1309,26 @@ register struct obj   *obj;
                   sometimes disappear when thrown */
                if (objects[otyp].oc_skill < P_NONE &&
                                objects[otyp].oc_skill > -P_BOOMERANG &&
-                               !objects[otyp].oc_magic && rn2(3)) {
-                   if (*u.ushops)
-                       check_shop_obj(obj, bhitpos.x,bhitpos.y, TRUE);
-                   obfree(obj, (struct obj *)0);
-                   return 1;
+                               !objects[otyp].oc_magic) {
+                   /* we were breaking 2/3 of everything unconditionally.
+                    * we still don't want anything to survive unconditionally,
+                    * but we need ammo to stay around longer on average.
+                    */
+                   int broken, chance;
+                   chance = 3 + greatest_erosion(obj) - obj->spe;
+                   if (chance > 1)
+                       broken = rn2(chance);
+                   else
+                       broken = !rn2(4);
+                   if (obj->blessed && !rnl(4))
+                       broken = 0;
+
+                   if (broken) {
+                       if (*u.ushops)
+                           check_shop_obj(obj, bhitpos.x,bhitpos.y, TRUE);
+                       obfree(obj, (struct obj *)0);
+                       return 1;
+                   }
                }
                passive_obj(mon, obj, (struct attack *)0);
            } else {