diff --git a/doc/fixes34.2 b/doc/fixes34.2 index 71c0a623d..487aa56af 100644 --- a/doc/fixes34.2 +++ b/doc/fixes34.2 @@ -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 diff --git a/src/dothrow.c b/src/dothrow.c index f81e307c3..e43b590ed 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -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 {