Fix #812: recovered stair dlevel

Stair dlevels weren't being restored with the correct values when
recovered after the game crashed, apparently because they weren't being
reset back to their 'absolute' level from a 'relative' level.  I'm not
totally sure of why this affected only recovered games (maybe that's the
only time when the 'relative' stair values are used?) but this fix seems
to work.

Fixes #812
This commit is contained in:
Michael Meyer
2022-07-01 12:29:47 -04:00
committed by PatR
parent 70b8bc04e7
commit cc46da90e0
3 changed files with 14 additions and 4 deletions

View File

@@ -254,6 +254,11 @@ enum saveformats {
ascii = 3 /* each field, ascii text (just proof of concept) */
};
enum restore_stages {
REST_GSTATE = 1, /* restoring current level and game state */
REST_LEVELS = 2, /* restoring remainder of dungeon */
};
/* sortloot() return type; needed before extern.h */
struct sortloot_item {
struct obj *obj;

View File

@@ -749,7 +749,7 @@ dorecover(NHFILE* nhfp)
int rtmp;
/* suppress map display if some part of the code tries to update that */
g.program_state.restoring = 1;
g.program_state.restoring = REST_GSTATE;
get_plname_from_file(nhfp, g.plname);
getlev(nhfp, 0, (xint8) 0);
@@ -776,6 +776,8 @@ dorecover(NHFILE* nhfp)
if (rtmp < 2)
return rtmp; /* dorecover called recursively */
g.program_state.restoring = REST_LEVELS;
/* these pointers won't be valid while we're processing the
* other levels, but they'll be reset again by restlevelstate()
* afterwards, and in the meantime at least u.usteed may mislead
@@ -909,7 +911,8 @@ rest_stairs(NHFILE* nhfp)
if (nhfp->structlevel) {
mread(nhfp->fd, (genericptr_t) &stway, sizeof (stairway));
}
if (stway.tolev.dnum == u.uz.dnum) {
if (g.program_state.restoring != REST_GSTATE
&& stway.tolev.dnum == u.uz.dnum) {
/* stairway dlevel is relative, make it absolute */
stway.tolev.dlevel += u.uz.dlevel;
}

View File

@@ -717,7 +717,9 @@ save_stairs(NHFILE* nhfp)
while (stway) {
if (perform_bwrite(nhfp)) {
if (stway->tolev.dnum == u.uz.dnum) {
boolean use_relative = (g.program_state.restoring != REST_GSTATE
&& stway->tolev.dnum == u.uz.dnum);
if (use_relative) {
/* make dlevel relative to current level */
stway->tolev.dlevel -= u.uz.dlevel;
}
@@ -725,7 +727,7 @@ save_stairs(NHFILE* nhfp)
bwrite(nhfp->fd, (genericptr_t) &buflen, sizeof buflen);
bwrite(nhfp->fd, (genericptr_t) stway, sizeof *stway);
}
if (stway->tolev.dnum == u.uz.dnum) {
if (use_relative) {
/* reset staiway dlevel back to absolute */
stway->tolev.dlevel += u.uz.dlevel;
}