fix #M63: Problem with magic lamp changing

Fix the problem From a bug report, so finding it in a bones file yielded a fully functional magic
lamp.  Fix as user suggested:  convert the lamp first.

     It also left the djinni who would normally have disappeared right after
the wish.  Water demons from fountains have that problem too.  Unfortunately
my fix is a bit buggy:  when removing the monster before granting the wish,
the player can notice.  Is there a straightforward way to display a monster
where none is present on the map?  Or do we need something comparable to the
obj->in_use flag for monsters, so that the bones code can discard particular
ones?
This commit is contained in:
nethack.rankin
2005-04-24 03:43:42 +00:00
parent e88f7cce05
commit a7da903561
4 changed files with 22 additions and 10 deletions

View File

@@ -118,6 +118,7 @@ with astral vision, the ";" command should only display "normal vision"
reanimating a statue containing gold produced double gold
probing the resulting double-gold monster caused "static object freed" panic
cursed wand might explode if used to engrave
fatal wish from magic lamp left functional magic lamp in bones data
Platform- and/or Interface-Specific Fixes

View File

@@ -1271,21 +1271,28 @@ dorub()
if (uwep->otyp == MAGIC_LAMP) {
if (uwep->spe > 0 && !rn2(3)) {
check_unpaid_usage(uwep, TRUE); /* unusual item use */
djinni_from_bottle(uwep);
makeknown(MAGIC_LAMP);
/* bones preparation: perform the lamp transformation
before releasing the djinni in case the latter turns out
to be fatal (a hostile djinni has no chance to attack yet,
but an indebtted one who grants a wish might bestow an
artifact which blasts the hero with lethal results) */
uwep->otyp = OIL_LAMP;
uwep->spe = 0; /* for safety */
uwep->age = rn1(500,1000);
if (uwep->lamplit) begin_burn(uwep, TRUE);
djinni_from_bottle(uwep);
makeknown(MAGIC_LAMP);
update_inventory();
} else if (rn2(2) && !Blind)
You("see a puff of smoke.");
else pline(nothing_happens);
} else if (rn2(2)) {
You("%s smoke.", !Blind ? "see a puff of" : "smell");
} else
pline(nothing_happens);
} else if (obj->otyp == BRASS_LANTERN) {
/* message from Adventure */
pline("Rubbing the electric lamp is not particularly rewarding.");
pline("Anyway, nothing exciting happens.");
} else pline(nothing_happens);
} else
pline(nothing_happens);
return 1;
}

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)fountain.c 3.5 2003/03/23 */
/* SCCS Id: @(#)fountain.c 3.5 2005/04/23 */
/* Copyright Scott R. Turner, srt@ucla, 10/27/86 */
/* NetHack may be freely redistributed. See license for details. */
@@ -56,8 +56,10 @@ dowaterdemon() /* Water demon */
if (rnd(100) > (80 + level_difficulty())) {
pline("Grateful for %s release, %s grants you a wish!",
mhis(mtmp), mhe(mtmp));
makewish();
/* bones prep: remove demon first in case the wish
turns out to be fatal (artifact blast) */
mongone(mtmp);
makewish();
} else if (t_at(mtmp->mx, mtmp->my))
(void) mintrap(mtmp);
}

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)potion.c 3.5 2005/03/26 */
/* SCCS Id: @(#)potion.c 3.5 2005/04/23 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -2070,8 +2070,10 @@ register struct obj *obj;
switch (chance) {
case 0 : verbalize("I am in your debt. I will grant one wish!");
makewish();
/* bones prep: remove djinni first in case the wish
turns out to be fatal (artifact blast) */
mongone(mtmp);
makewish();
break;
case 1 : verbalize("Thank you for freeing me!");
(void) tamedog(mtmp, (struct obj *)0);