Pet displacement improvements

Pets can no longer be displaced out of a trap, because that was
inconsistent with peaceful monsters refusing to be displaced out of a
trap. The untaming-via-displacement-out-of-trap code is removed.

Pets also now have a better survival instinct: they follow the code for
peaceful displacement into a bad position, and refuse to swap places.
This means it's no longer possible to accidentally kill a pet by
levitating/walking over water and displacing it.
This commit is contained in:
copperwater
2018-03-20 12:17:38 -04:00
committed by Pasi Kallinen
parent 92b9db7630
commit 6134c6f165

View File

@@ -1793,10 +1793,7 @@ domove_core()
* previous location using the same conditions as in attack().
* there are special extenuating circumstances:
* (1) if the pet dies then your god angers,
* (2) if the pet gets trapped then your god may disapprove,
* (3) if the pet was already trapped and you attempt to free it
* not only do you encounter the trap but you may frighten your
* pet causing it to go wild! moral: don't abuse this privilege.
* (2) if the pet gets trapped then your god may disapprove.
*
* Ceiling-hiding pets are skipped by this section of code, to
* be caught by the normal falling-monster code.
@@ -1836,15 +1833,14 @@ domove_core()
/* can't swap places when pet won't fit thru the opening */
You("stop. %s won't fit through.", upstart(y_monnam(mtmp)));
didnt_move = TRUE;
} else if (mtmp->mpeaceful && !mtmp->mtame && mtmp->mtrapped) {
/* TODO: pets can get angered when displaced out of a trap.
* Having peaceful monsters simply refuse is inconsistent.
* Probably, pets should not be able to be displaced out of a
* trap like a pit or bear trap at all. */
} else if ((mtmp->mpeaceful || mtmp->mtame) && mtmp->mtrapped) {
/* Since peaceful monsters simply being unable to move out of traps
* was inconsistent with pets being able to but being untamed in the
* process, apply this logic equally to pets and peacefuls. */
You("stop. %s can't move out of that trap.",
upstart(y_monnam(mtmp)));
didnt_move = TRUE;
} else if (mtmp->mpeaceful && !mtmp->mtame
} else if (mtmp->mpeaceful
&& (!goodpos(u.ux0, u.uy0, mtmp, 0)
|| t_at(u.ux0, u.uy0) != NULL
|| mtmp->ispriest
@@ -1857,17 +1853,6 @@ domove_core()
upstart(y_monnam(mtmp)));
didnt_move = TRUE;
} else {
/* if trapped, there's a chance the pet goes wild */
if (mtmp->mtrapped) {
if (!rn2(mtmp->mtame)) {
mtmp->mtame = mtmp->mpeaceful = mtmp->msleeping = 0;
if (mtmp->mleashed)
m_unleash(mtmp, TRUE);
growl(mtmp);
} else {
yelp(mtmp);
}
}
char pnambuf[BUFSZ];
/* save its current description in case of polymorph */