From fab1048f2fb2b44bc5fdf00bedfd5afe33b37127 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 5 Mar 2022 10:06:01 +0200 Subject: [PATCH] Fix segfault with uball Drowning in a pool while punished and carrying the ball, and the only available space to crawl back on dry land has a magic trap, which unpunishes you. --- src/teleport.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/teleport.c b/src/teleport.c index baae6f350..37bbcdef9 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -365,8 +365,14 @@ teleds(int nux, int nuy, int teleds_flags) if (drag_ball(nux, nuy, &bc_control, &ballx, &bally, &chainx, &chainy, &cause_delay, allow_drag)) move_bc(0, bc_control, ballx, bally, chainx, chainy); - else /* dragging fails if hero is encumbered beyond 'burdened' */ - unplacebc(); /* to match placebc() below */ + else { + /* dragging fails if hero is encumbered beyond 'burdened' */ + /* uball might've been cleared via drag_ball -> spoteffects -> + dotrap -> magic trap unpunishment */ + ball_active = (Punished && uball->where != OBJ_FREE); + if (ball_active) + unplacebc(); /* to match placebc() below */ + } } /* must set u.ux, u.uy after drag_ball(), which may need to know