Fix punishment iron ball yanking hero on top of a monster

When attached iron ball was in a pit (or a pool) with a monster,
and your levitation ended, you were put on top of the monster.

Add a sanity check for hero over monster.
This commit is contained in:
Pasi Kallinen
2023-02-03 08:23:31 +02:00
parent cae29f1dfd
commit 0722a5c2dd
3 changed files with 10 additions and 1 deletions

View File

@@ -1103,6 +1103,7 @@ give gremlin the property it stole, if possible
'F'orcefighting with a war hammer has a small chance of breaking iron bars
very rarely random items are generated eroded, erodeproof, or greased
Nazgul can see invisible
fix a case where punished iron ball yanked hero on top of a monster
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -4177,6 +4177,8 @@ wiz_mon_diff(void)
static void
you_sanity_check(void)
{
struct monst *mtmp;
if (u.uswallow && !u.ustuck) {
/* this probably ought to be panic() */
impossible("sanity_check: swallowed by nothing?");
@@ -4186,6 +4188,12 @@ you_sanity_check(void)
u.uswldtim = 0;
docrt();
}
if ((mtmp = m_at(u.ux, u.uy)) != 0) {
/* u.usteed isn't on the map */
if (u.ustuck != mtmp)
impossible("sanity_check: you over monster");
}
(void) check_invent_gold("invent");
}

View File

@@ -3560,7 +3560,7 @@ float_down(
return 1;
}
if (Punished && !carried(uball)
if (Punished && !carried(uball) && !m_at(uball->ox, uball->oy)
&& (is_pool(uball->ox, uball->oy)
|| ((trap = t_at(uball->ox, uball->oy))
&& (is_pit(trap->ttyp) || is_hole(trap->ttyp))))) {