From e91ff47ff0fd88fd5e5e7f956aa1bd19583229d5 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sun, 1 Apr 2007 01:20:57 +0000 Subject: [PATCH] revived unicorn horns (trunk only) Back in Nov'04, 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). --- doc/fixes35.0 | 1 + include/obj.h | 3 ++- src/mon.c | 16 +++++++++------- src/zap.c | 7 +++++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/doc/fixes35.0 b/doc/fixes35.0 index f3ee3c98a..14bb9fe1a 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -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 diff --git a/include/obj.h b/include/obj.h index 2757b53fe..548af127a 100644 --- a/include/obj.h +++ b/include/obj.h @@ -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 */ diff --git a/src/mon.c b/src/mon.c index 42f037102..2c70958e6 100644 --- a/src/mon.c +++ b/src/mon.c @@ -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); diff --git a/src/zap.c b/src/zap.c index 048aa9367..1d9684fa1 100644 --- a/src/zap.c +++ b/src/zap.c @@ -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); -- 2.40.0