From cf888082853c206df429126d653c6995e52ac495 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Thu, 3 Dec 2020 16:38:17 +0200 Subject: [PATCH] Fix stairs on oracle level bones Recent change to the stairs structure now lets each stair keep the destination level number and dungeon where the stairs go to. When a level that can be on different depth (such as the Oracle) became a bones level, and it was loaded in another game at different depth, the stairs were still pointing to the old level number. Save it as relative to the current level instead of absolute. --- src/restore.c | 4 ++++ src/save.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/restore.c b/src/restore.c index 3622c02ab..e28648769 100644 --- a/src/restore.c +++ b/src/restore.c @@ -926,6 +926,10 @@ NHFILE *nhfp; if (nhfp->structlevel) { len += (int) sizeof (stairway); mread(nhfp->fd, (genericptr_t) &stway, sizeof (stairway)); + if (stway.tolev.dnum == u.uz.dnum) { + /* stairway dlevel is relative, make it absolute */ + stway.tolev.dlevel += u.uz.dlevel; + } } stairway_add(stway.sx, stway.sy, stway.up, stway.isladder, diff --git a/src/save.c b/src/save.c index d1dcf15fd..bc8def125 100644 --- a/src/save.c +++ b/src/save.c @@ -669,8 +669,16 @@ NHFILE *nhfp; while (stway) { if (perform_bwrite(nhfp)) { if (nhfp->structlevel) { + if (stway->tolev.dnum == u.uz.dnum) { + /* make dlevel relative to current level */ + stway->tolev.dlevel -= u.uz.dlevel; + } bwrite(nhfp->fd, (genericptr_t) &buflen, sizeof buflen); bwrite(nhfp->fd, (genericptr_t) stway, sizeof *stway); + if (stway->tolev.dnum == u.uz.dnum) { + /* reset staiway dlevel back to absolute */ + stway->tolev.dlevel += u.uz.dlevel; + } } } stway = stway->next;