revived unicorn horns (trunk only)

Back in Nov'04, <Someone> pointed out that even with only 5%
chance for dropping a horn upon the death of a unicorn which has been
revived from corpse, it's still possible to produce a nearly unlimited
number of them for polypile fodder.  This bumps the chance for a horn up
to 50%, but flags the horn as coming from a revived corpse and makes such
horns be treated by polymoprh as if they're non-magic (which practically
guarantees that they'll poly into mundane tools instead of magic ones).
This commit is contained in:
nethack.rankin
2007-04-01 01:20:57 +00:00
parent b4f39da9dd
commit e91ff47ff0
4 changed files with 17 additions and 10 deletions

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)mon.c 3.5 2007/02/08 */
/* SCCS Id: @(#)mon.c 3.5 2007/03/30 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -191,12 +191,14 @@ unsigned corpseflags;
case PM_WHITE_UNICORN:
case PM_GRAY_UNICORN:
case PM_BLACK_UNICORN:
if (mtmp->mrevived && rn2(20)) {
if (canseemon(mtmp))
pline("%s recently regrown horn crumbles to dust.",
s_suffix(Monnam(mtmp)));
} else
(void) mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE);
if (mtmp->mrevived && rn2(2)) {
if (canseemon(mtmp))
pline("%s recently regrown horn crumbles to dust.",
s_suffix(Monnam(mtmp)));
} else {
obj = mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE);
if (obj && mtmp->mrevived) obj->degraded_horn = 1;
}
goto default_1;
case PM_LONG_WORM:
(void) mksobj_at(WORM_TOOTH, x, y, TRUE, FALSE);

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)zap.c 3.5 2007/02/17 */
/* SCCS Id: @(#)zap.c 3.5 2007/03/30 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1283,6 +1283,9 @@ poly_obj(obj, id)
change_luck(-1); /* Sokoban guilt */
if (id == STRANGE_OBJECT) { /* preserve symbol */
int try_limit = 3;
unsigned magic_obj = objects[obj->otyp].oc_magic;
if (obj->otyp == UNICORN_HORN && obj->degraded_horn) magic_obj = 0;
/* Try up to 3 times to make the magic-or-not status of
the new item be the same as it was for the old one. */
otmp = (struct obj *)0;
@@ -1290,7 +1293,7 @@ poly_obj(obj, id)
if (otmp) delobj(otmp);
otmp = mkobj(obj->oclass, FALSE);
} while (--try_limit > 0 &&
objects[obj->otyp].oc_magic != objects[otmp->otyp].oc_magic);
objects[otmp->otyp].oc_magic != magic_obj);
} else {
/* literally replace obj with this new thing */
otmp = mksobj(id, FALSE, FALSE);