... deleting the ball & chain, but keeping a boulder in the pit.
Noticed a segfault when fuzzing, teleport while punished caused
a segfault via fill_pit -> flooreffects -> bury_objs -> unpunish,
and then the next line in teleds tried to look up uchain.
Guard against that particular case.
Fix the case of boulder being in a pit, triggered by you being in
a pit and a giant throwing a boulder on top of you.
if (!Passes_walls && !throws_rocks(g.youmonst.data)) {
losehp(Maybe_Half_Phys(rnd(15)),
"squished under a boulder", NO_KILLER_PREFIX);
- return FALSE; /* player remains trapped */
+ goto deletedwithboulder;
} else
reset_utrap(TRUE);
}
* Note: trap might have gone away via ((hmon -> killed -> xkilled)
* || mondied) -> mondead -> m_detach -> fill_pit.
*/
+deletedwithboulder:
if ((t = t_at(x, y)) != 0)
deltrap(t);
useupf(obj, 1L);
the old position if allow_drag is true... */
u_on_newpos(nux, nuy); /* set u.<x,y>, usteed-><mx,my>; cliparound() */
fill_pit(u.ux0, u.uy0);
- if (ball_active && uchain->where == OBJ_FREE)
+ if (ball_active && uchain && uchain->where == OBJ_FREE)
placebc(); /* put back the ball&chain if they were taken off map */
initrack(); /* teleports mess up tracking monsters without this */
update_player_regions();