From 4e119f4f007d2a20be1b62cef92d4585c6be0d2b Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 2 Jun 2019 05:02:08 -0700 Subject: [PATCH 1/3] place_object(obj,0,0) debugging Got a hit (on Plane of Water) pretty quickly. --- src/dungeon.c | 9 ++++++++- src/mkobj.c | 13 +++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/dungeon.c b/src/dungeon.c index d473e1c2e..27b748104 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 dungeon.c $NHDT-Date: 1558853012 2019/05/26 06:43:32 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.94 $ */ +/* NetHack 3.6 dungeon.c $NHDT-Date: 1559476918 2019/06/02 12:01:58 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.95 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1190,6 +1190,13 @@ void u_on_newpos(x, y) int x, y; { + if (!isok(x, y)) { /* validate location */ + void VDECL((*func), (const char *, ...)) PRINTF_F(1, 2); + + func = (x < 0 || y < 0 || x > COLNO - 1 || y > ROWNO - 1) ? panic + : impossible; + (*func)("u_on_newpos: trying to place hero off map <%d,%d>", x, y); + } u.ux = x; u.uy = y; #ifdef CLIPPING diff --git a/src/mkobj.c b/src/mkobj.c index 94370c96d..4b64a3f44 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mkobj.c $NHDT-Date: 1558124913 2019/05/17 20:28:33 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.147 $ */ +/* NetHack 3.6 mkobj.c $NHDT-Date: 1559476922 2019/06/02 12:02:02 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.149 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Derek S. Ray, 2015. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1723,8 +1723,17 @@ int x, y; { register struct obj *otmp2 = level.objects[x][y]; + if (!isok(x, y)) { /* validate location */ + void VDECL((*func), (const char *, ...)) PRINTF_F(1, 2); + + func = (x < 0 || y < 0 || x > COLNO - 1 || y > ROWNO - 1) ? panic + : impossible; + (*func)("place_object: \"%s\" [%d] off map <%d,%d>", + safe_typename(otmp->otyp), otmp->where, x, y); + } if (otmp->where != OBJ_FREE) - panic("place_object: obj not free"); + panic("place_object: obj \"%s\" [%d] not free", + safe_typename(otmp->otyp), otmp->where); obj_no_longer_held(otmp); if (otmp->otyp == BOULDER) { From 5c30cc5890c837e2b62dc29c36b2a319cfd72d44 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 2 Jun 2019 08:15:41 -0400 Subject: [PATCH 2/3] elemental_clog() should not destroy the very monster trying to be placed --- doc/fixes36.3 | 2 ++ src/mon.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/fixes36.3 b/doc/fixes36.3 index bf389167d..82ada4627 100644 --- a/doc/fixes36.3 +++ b/doc/fixes36.3 @@ -42,6 +42,8 @@ some improvement to the handling of endgame levels filling up with monsters Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository ------------------------------------------------------------------ +elemental_clog() loop needed to guard against obliteration of the monster + that was trying to be placed curses: sometimes the message window would show a blank line after a prompt diff --git a/src/mon.c b/src/mon.c index 511f80a95..690b67b7c 100644 --- a/src/mon.c +++ b/src/mon.c @@ -2635,7 +2635,7 @@ struct monst *mon; m1 = m2 = m3 = m4 = m5 = zm = (struct monst *) 0; if (!msgmv || (moves - msgmv) > 200L) { if (!msgmv || rn2(2)) - You("feel besieged."); + You_feel("besieged."); msgmv = moves; } /* @@ -2646,7 +2646,7 @@ struct monst *mon; * m5 a pet. */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { - if (DEADMONSTER(mtmp)) + if (DEADMONSTER(mtmp) || mtmp == mon) continue; if (mtmp->mx == 0 && mtmp->my == 0) continue; From 7d38435a9b388cf5aa51c20bf6c3ca380ec8206b Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 2 Jun 2019 10:34:38 -0400 Subject: [PATCH 3/3] don't clear mtmp->mx, mtmp->my even when obliterating --- src/mon.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mon.c b/src/mon.c index 690b67b7c..ac29cf866 100644 --- a/src/mon.c +++ b/src/mon.c @@ -1847,10 +1847,9 @@ struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */ shkgone(mtmp); if (mtmp->wormno) wormgone(mtmp); - if (In_endgame(&u.uz)) { - mtmp->mx = mtmp->my = 0; + if (In_endgame(&u.uz)) mtmp->mstate |= MON_ENDGAME_FREE; - } + mtmp->mstate |= MON_DETACH; iflags.purge_monsters++; } @@ -2681,8 +2680,9 @@ struct monst *mon; mtmp->mstate |= MON_OBLITERATE; mongone(mtmp); - mtmp->mx = mtmp->my = 0; - rloc_to(mon, mx, my); + /* some places in the code might still reference mtmp->mx, mtmp->my */ + /* mtmp->mx = mtmp->my = 0; */ + rloc_to(mon, mx, my); /* note: mon, not mtmp */ } else { /* last resort - migrate mon to the next plane */ if (Is_waterlevel(&u.uz) || Is_firelevel(&u.uz) || Is_earthlevel(&u.uz)) {