Fix: rn2(0) when trying to displace peaceful out of trap
A side effect of making is_safepet() count peacefuls. Now checks directly for a trapped, peaceful monster and says "they can't move out of the trap"; this is inconsistent with pet behavior, and pet behavior should probably be changed to be in line with it (ie they can't be displaced out of a trap at all.) Also refactor the code here a bit: a bunch of different if statements have the exact same resetting code and steed resetting code in them. Change this to a boolean flag and put the resetting code in one place checked by that flag.
This commit is contained in:
committed by
Pasi Kallinen
parent
21351fc13c
commit
5a1bbb4d16
40
src/hack.c
40
src/hack.c
@@ -1802,40 +1802,48 @@ domove_core()
|
|||||||
* be caught by the normal falling-monster code.
|
* be caught by the normal falling-monster code.
|
||||||
*/
|
*/
|
||||||
if (is_safepet(mtmp) && !(is_hider(mtmp->data) && mtmp->mundetected)) {
|
if (is_safepet(mtmp) && !(is_hider(mtmp->data) && mtmp->mundetected)) {
|
||||||
|
/* if it turns out we can't actually move */
|
||||||
|
boolean didnt_move = FALSE;
|
||||||
|
|
||||||
|
/* seemimic/newsym should be done before moving hero, otherwise
|
||||||
|
the display code will draw the hero here before we possibly
|
||||||
|
cancel the swap below (we can ignore steed mx,my here) */
|
||||||
|
u.ux = u.ux0, u.uy = u.uy0;
|
||||||
mtmp->mundetected = 0;
|
mtmp->mundetected = 0;
|
||||||
if (M_AP_TYPE(mtmp))
|
if (M_AP_TYPE(mtmp))
|
||||||
seemimic(mtmp);
|
seemimic(mtmp);
|
||||||
|
u.ux = mtmp->mx, u.uy = mtmp->my; /* resume swapping positions */
|
||||||
|
|
||||||
if (mtmp->mtrapped && (trap = t_at(mtmp->mx, mtmp->my)) != 0
|
if (mtmp->mtrapped && (trap = t_at(mtmp->mx, mtmp->my)) != 0
|
||||||
&& is_pit(trap->ttyp)
|
&& is_pit(trap->ttyp)
|
||||||
&& sobj_at(BOULDER, trap->tx, trap->ty)) {
|
&& sobj_at(BOULDER, trap->tx, trap->ty)) {
|
||||||
/* can't swap places with pet pinned in a pit by a boulder */
|
/* can't swap places with pet pinned in a pit by a boulder */
|
||||||
u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */
|
didnt_move = TRUE;
|
||||||
if (u.usteed)
|
|
||||||
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
|
||||||
} else if (u.ux0 != x && u.uy0 != y && NODIAG(mtmp->data - mons)) {
|
} else if (u.ux0 != x && u.uy0 != y && NODIAG(mtmp->data - mons)) {
|
||||||
/* can't swap places when pet can't move to your spot */
|
/* can't swap places when pet can't move to your spot */
|
||||||
u.ux = u.ux0, u.uy = u.uy0;
|
|
||||||
if (u.usteed)
|
|
||||||
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
|
||||||
You("stop. %s can't move diagonally.", upstart(y_monnam(mtmp)));
|
You("stop. %s can't move diagonally.", upstart(y_monnam(mtmp)));
|
||||||
|
didnt_move = TRUE;
|
||||||
} else if (u_with_boulder
|
} else if (u_with_boulder
|
||||||
&& !(verysmall(mtmp->data)
|
&& !(verysmall(mtmp->data)
|
||||||
&& (!mtmp->minvent || (curr_mon_load(mtmp) <= 600)))) {
|
&& (!mtmp->minvent || (curr_mon_load(mtmp) <= 600)))) {
|
||||||
/* can't swap places when pet won't fit there with the boulder */
|
/* can't swap places when pet won't fit there with the boulder */
|
||||||
u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */
|
|
||||||
if (u.usteed)
|
|
||||||
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
|
||||||
You("stop. %s won't fit into the same spot that you're at.",
|
You("stop. %s won't fit into the same spot that you're at.",
|
||||||
upstart(y_monnam(mtmp)));
|
upstart(y_monnam(mtmp)));
|
||||||
|
didnt_move = TRUE;
|
||||||
} else if (u.ux0 != x && u.uy0 != y && bad_rock(mtmp->data, x, u.uy0)
|
} else if (u.ux0 != x && u.uy0 != y && bad_rock(mtmp->data, x, u.uy0)
|
||||||
&& bad_rock(mtmp->data, u.ux0, y)
|
&& bad_rock(mtmp->data, u.ux0, y)
|
||||||
&& (bigmonst(mtmp->data) || (curr_mon_load(mtmp) > 600))) {
|
&& (bigmonst(mtmp->data) || (curr_mon_load(mtmp) > 600))) {
|
||||||
/* can't swap places when pet won't fit thru the opening */
|
/* can't swap places when pet won't fit thru the opening */
|
||||||
u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */
|
|
||||||
if (u.usteed)
|
|
||||||
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
|
||||||
You("stop. %s won't fit through.", upstart(y_monnam(mtmp)));
|
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. */
|
||||||
|
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 && !mtmp->mtame
|
||||||
&& (!goodpos(u.ux0, u.uy0, mtmp, 0)
|
&& (!goodpos(u.ux0, u.uy0, mtmp, 0)
|
||||||
|| t_at(u.ux0, u.uy0) != NULL
|
|| t_at(u.ux0, u.uy0) != NULL
|
||||||
@@ -1844,9 +1852,9 @@ domove_core()
|
|||||||
|| mtmp->m_id == g.quest_status.leader_m_id)) {
|
|| mtmp->m_id == g.quest_status.leader_m_id)) {
|
||||||
/* displacing peaceful into unsafe or trapped space, or trying to
|
/* displacing peaceful into unsafe or trapped space, or trying to
|
||||||
* displace quest leader, Oracle, or priest */
|
* displace quest leader, Oracle, or priest */
|
||||||
u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */
|
|
||||||
You("stop. %s doesn't want to swap places.",
|
You("stop. %s doesn't want to swap places.",
|
||||||
upstart(y_monnam(mtmp)));
|
upstart(y_monnam(mtmp)));
|
||||||
|
didnt_move = TRUE;
|
||||||
} else {
|
} else {
|
||||||
/* if trapped, there's a chance the pet goes wild */
|
/* if trapped, there's a chance the pet goes wild */
|
||||||
if (mtmp->mtrapped) {
|
if (mtmp->mtrapped) {
|
||||||
@@ -1916,6 +1924,12 @@ domove_core()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (didnt_move) {
|
||||||
|
u.ux = u.ux0, u.uy = u.uy0; /* didn't move after all */
|
||||||
|
if (u.usteed)
|
||||||
|
u.usteed->mx = u.ux, u.usteed->my = u.uy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reset_occupations();
|
reset_occupations();
|
||||||
|
|||||||
Reference in New Issue
Block a user