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

@@ -206,6 +206,7 @@ charge for kicked shop-owned food if it gets used up taming a monster
give better feedback when thrown shop-owned food gets used up taming a monster
effect of negative AC on damage received was calculated differently than
normal when deciding whether hero poly'd into pudding would split
unicorn horn produced by revived monster will polymorph as if non-magic
Platform- and/or Interface-Specific Fixes

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)obj.h 3.5 2007/02/17 */
/* SCCS Id: @(#)obj.h 3.5 2007/03/30 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -85,6 +85,7 @@ struct obj {
Bitfield(oerodeproof,1); /* erodeproof weapon/armor */
Bitfield(olocked,1); /* object is locked */
Bitfield(obroken,1); /* lock has been broken */
#define degraded_horn obroken /* unicorn horn will poly to non-magic */
Bitfield(otrapped,1); /* container is trapped */
/* or accidental tripped rolling boulder trap */
#define opoisoned otrapped /* object (weapon) is coated with poison */

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);