unleashing untame monsters
Fix several cases that earlier patches didn't address. If a leashed monster becomes untame, detach the leash.
This commit is contained in:
+2
-1
@@ -332,7 +332,8 @@ keep monster from forgetting its weapon is cursed every other round
|
|||||||
multiple shot throwing stops immediately whenever you hurtle backwards
|
multiple shot throwing stops immediately whenever you hurtle backwards
|
||||||
don't panic if being billed for a burning or other timed object
|
don't panic if being billed for a burning or other timed object
|
||||||
food that makes a monster peaceful should not re-anger it at the same time
|
food that makes a monster peaceful should not re-anger it at the same time
|
||||||
abusing a leashed pet can result in a leashed peaceful monster
|
abusing a leashed pet could result in a leashed peaceful monster
|
||||||
|
couldn't unleash steed while mounted
|
||||||
trying and failing to wield an item could leave current weapon flagged as both
|
trying and failing to wield an item could leave current weapon flagged as both
|
||||||
"weapon in hand" and "alternate weapon" when `pushweapon' option is set
|
"weapon in hand" and "alternate weapon" when `pushweapon' option is set
|
||||||
handle OBJ_CONTAINED case for corpse revival so that trolls can revive
|
handle OBJ_CONTAINED case for corpse revival so that trolls can revive
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ boolean quietly;
|
|||||||
if (!quietly)
|
if (!quietly)
|
||||||
You("get a bad feeling about this.");
|
You("get a bad feeling about this.");
|
||||||
mtmp->mpeaceful = 0;
|
mtmp->mpeaceful = 0;
|
||||||
|
set_malign(mtmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* if figurine has been named, give same name to the monster */
|
/* if figurine has been named, give same name to the monster */
|
||||||
@@ -413,6 +414,13 @@ long nmv; /* number of moves */
|
|||||||
mtmp->mtame = mtmp->mpeaceful = 0;
|
mtmp->mtame = mtmp->mpeaceful = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mtmp->mtame && mtmp->mleashed) {
|
||||||
|
/* leashed monsters should always be with hero, consequently
|
||||||
|
never losing any time to be accounted for later */
|
||||||
|
impossible("catching up for leashed monster?");
|
||||||
|
m_unleash(mtmp, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
/* recover lost hit points */
|
/* recover lost hit points */
|
||||||
if (!regenerates(mtmp->data)) imv /= 20;
|
if (!regenerates(mtmp->data)) imv /= 20;
|
||||||
if (mtmp->mhp + imv >= mtmp->mhpmax)
|
if (mtmp->mhp + imv >= mtmp->mhpmax)
|
||||||
@@ -463,11 +471,10 @@ boolean pets_only; /* true for ascension or final escape */
|
|||||||
pline("%s is still trapped.", Monnam(mtmp));
|
pline("%s is still trapped.", Monnam(mtmp));
|
||||||
stay_behind = TRUE;
|
stay_behind = TRUE;
|
||||||
}
|
}
|
||||||
if (stay_behind
|
|
||||||
#ifdef STEED
|
#ifdef STEED
|
||||||
&& mtmp != u.usteed
|
if (mtmp == u.usteed) stay_behind = FALSE;
|
||||||
#endif
|
#endif
|
||||||
) {
|
if (stay_behind) {
|
||||||
if (mtmp->mleashed) {
|
if (mtmp->mleashed) {
|
||||||
pline("%s leash suddenly comes loose.",
|
pline("%s leash suddenly comes loose.",
|
||||||
humanoid(mtmp->data)
|
humanoid(mtmp->data)
|
||||||
@@ -550,14 +557,13 @@ migrate_to_level(mtmp, tolev, xyloc, cc)
|
|||||||
obj->no_charge = 0;
|
obj->no_charge = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mtmp->mleashed) {
|
||||||
|
mtmp->mtame--;
|
||||||
|
m_unleash(mtmp, TRUE);
|
||||||
|
}
|
||||||
relmon(mtmp);
|
relmon(mtmp);
|
||||||
mtmp->nmon = migrating_mons;
|
mtmp->nmon = migrating_mons;
|
||||||
migrating_mons = mtmp;
|
migrating_mons = mtmp;
|
||||||
if (mtmp->mleashed) {
|
|
||||||
m_unleash(mtmp, FALSE);
|
|
||||||
mtmp->mtame--;
|
|
||||||
pline_The("leash comes off!");
|
|
||||||
}
|
|
||||||
newsym(mtmp->mx,mtmp->my);
|
newsym(mtmp->mx,mtmp->my);
|
||||||
|
|
||||||
new_lev.dnum = ledger_to_dnum((xchar)tolev);
|
new_lev.dnum = ledger_to_dnum((xchar)tolev);
|
||||||
@@ -809,7 +815,12 @@ boolean quietly;
|
|||||||
mtmp->mpeaceful = mtmp->mtame = 0;
|
mtmp->mpeaceful = mtmp->mtame = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!mtmp->mtame) newsym(mtmp->mx, mtmp->my);
|
if (!mtmp->mtame) {
|
||||||
|
newsym(mtmp->mx, mtmp->my);
|
||||||
|
/* a life-saved monster might be leashed;
|
||||||
|
don't leave it that way if it's no longer tame */
|
||||||
|
if (mtmp->mleashed) m_unleash(mtmp, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/* if its still a pet, start a clean pet-slate now */
|
/* if its still a pet, start a clean pet-slate now */
|
||||||
if (has_edog && mtmp->mtame) {
|
if (has_edog && mtmp->mtame) {
|
||||||
@@ -831,10 +842,8 @@ struct monst *mtmp;
|
|||||||
if (mtmp->mtame && !mtmp->isminion)
|
if (mtmp->mtame && !mtmp->isminion)
|
||||||
EDOG(mtmp)->abuse++;
|
EDOG(mtmp)->abuse++;
|
||||||
|
|
||||||
if (!mtmp->mtame && mtmp->mleashed) {
|
if (!mtmp->mtame && mtmp->mleashed)
|
||||||
pline("%s breaks loose of %s leash!", Monnam(mtmp), mhis(mtmp));
|
m_unleash(mtmp, TRUE);
|
||||||
m_unleash(mtmp, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* don't make a sound if pet is in the middle of leaving the level */
|
/* don't make a sound if pet is in the middle of leaving the level */
|
||||||
/* newsym isn't necessary in this case either */
|
/* newsym isn't necessary in this case either */
|
||||||
|
|||||||
+2
-1
@@ -1,4 +1,4 @@
|
|||||||
/* SCCS Id: @(#)hack.c 3.4 2002/02/05 */
|
/* SCCS Id: @(#)hack.c 3.4 2002/03/09 */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -1166,6 +1166,7 @@ domove()
|
|||||||
if (mtmp->mtrapped) {
|
if (mtmp->mtrapped) {
|
||||||
if (!rn2(mtmp->mtame)) {
|
if (!rn2(mtmp->mtame)) {
|
||||||
mtmp->mtame = mtmp->mpeaceful = mtmp->msleeping = 0;
|
mtmp->mtame = mtmp->mpeaceful = mtmp->msleeping = 0;
|
||||||
|
if (mtmp->mleashed) m_unleash(mtmp, TRUE);
|
||||||
growl(mtmp);
|
growl(mtmp);
|
||||||
} else {
|
} else {
|
||||||
yelp(mtmp);
|
yelp(mtmp);
|
||||||
|
|||||||
+6
-2
@@ -1,4 +1,4 @@
|
|||||||
/* SCCS Id: @(#)steed.c 3.4 2001/04/12 */
|
/* SCCS Id: @(#)steed.c 3.4 2002/03/09 */
|
||||||
/* Copyright (c) Kevin Hugo, 1998-1999. */
|
/* Copyright (c) Kevin Hugo, 1998-1999. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -272,8 +272,11 @@ mount_steed(mtmp, force)
|
|||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
if (!force && !Role_if(PM_KNIGHT) && !(--mtmp->mtame)) {
|
if (!force && !Role_if(PM_KNIGHT) && !(--mtmp->mtame)) {
|
||||||
|
/* no longer tame */
|
||||||
newsym(mtmp->mx, mtmp->my);
|
newsym(mtmp->mx, mtmp->my);
|
||||||
pline("%s resists!", Monnam(mtmp));
|
pline("%s resists%s!", Monnam(mtmp),
|
||||||
|
mtmp->mleashed ? " and its leash comes off" : "");
|
||||||
|
if (mtmp->mleashed) m_unleash(mtmp, FALSE);
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
if (!force && Underwater && !is_swimmer(ptr)) {
|
if (!force && Underwater && !is_swimmer(ptr)) {
|
||||||
@@ -385,6 +388,7 @@ kick_steed()
|
|||||||
|
|
||||||
/* Make the steed less tame and check if it resists */
|
/* Make the steed less tame and check if it resists */
|
||||||
if (u.usteed->mtame) u.usteed->mtame--;
|
if (u.usteed->mtame) u.usteed->mtame--;
|
||||||
|
if (!u.usteed->mtame && u.usteed->mleashed) m_unleash(u.usteed, TRUE);
|
||||||
if (!u.usteed->mtame || (u.ulevel+u.usteed->mtame < rnd(MAXULEV/2+5))) {
|
if (!u.usteed->mtame || (u.ulevel+u.usteed->mtame < rnd(MAXULEV/2+5))) {
|
||||||
newsym(u.usteed->mx, u.usteed->my);
|
newsym(u.usteed->mx, u.usteed->my);
|
||||||
dismount_steed(DISMOUNT_THROWN);
|
dismount_steed(DISMOUNT_THROWN);
|
||||||
|
|||||||
Reference in New Issue
Block a user