From f360dee4dde0c1846232cfb139a8d68425320779 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 18 Mar 2023 07:30:25 +0200 Subject: [PATCH] Engraving sanity checking --- include/extern.h | 1 + src/cmd.c | 1 + src/engrave.c | 28 ++++++++++++++++++++++++++++ src/sp_lev.c | 5 +++++ 4 files changed, 35 insertions(+) diff --git a/include/extern.h b/include/extern.h index 1443013c2..938adcb21 100644 --- a/include/extern.h +++ b/include/extern.h @@ -827,6 +827,7 @@ extern void del_engr_at(coordxy, coordxy); extern int freehand(void); extern int doengrave(void); extern void sanitize_engravings(void); +extern void engraving_sanity_check(void); extern void save_engravings(NHFILE *); extern void rest_engravings(NHFILE *); extern void engr_stats(const char *, char *, long *, long *); diff --git a/src/cmd.c b/src/cmd.c index 08fdadde1..d979ea2f4 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -4247,6 +4247,7 @@ sanity_check(void) light_sources_sanity_check(); bc_sanity_check(); trap_sanity_check(); + engraving_sanity_check(); } /* qsort() comparison routine for use in list_migrating_mons() */ diff --git a/src/engrave.c b/src/engrave.c index eac177b28..1033334c2 100644 --- a/src/engrave.c +++ b/src/engrave.c @@ -1376,6 +1376,34 @@ sanitize_engravings(void) } } +void +engraving_sanity_check(void) +{ + struct engr *ep; + schar typ; + + if (head_engr && (Is_airlevel(&u.uz) || Is_waterlevel(&u.uz))) { + impossible("engraving sanity: on plane of air/water"); + return; + } + + for (ep = head_engr; ep; ep = ep->nxt_engr) { + coordxy x = ep->engr_x, y = ep->engr_y; + + if (!isok(x, y)) { + impossible("engraving sanity: !isok <%i,%i>", x, y); + return; + } + + typ = levl[x][y].typ; + if (typ == LAVAPOOL || typ == LAVAWALL || IS_POOL(typ) + || typ == AIR || !accessible(x, y)) { + impossible("engraving sanity: illegal surface (%i)", typ); + return; + } + } +} + void save_engravings(NHFILE *nhfp) { diff --git a/src/sp_lev.c b/src/sp_lev.c index 4a53eb4ac..0d26aa670 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -330,6 +330,7 @@ map_cleanup(void) { struct obj *otmp; struct trap *ttmp; + struct engr *etmp; coordxy x, y; for (x = 0; x < COLNO; x++) @@ -347,6 +348,10 @@ map_cleanup(void) if (((ttmp = t_at(x, y)) != 0) && !undestroyable_trap(ttmp->ttyp)) deltrap(ttmp); + + /* engravings? */ + if ((etmp = engr_at(x, y)) != 0) + del_engr(etmp); } } }