store relative timestamps in save and bones

This commit is contained in:
nhmall
2026-04-13 06:39:54 -04:00
parent 7ed50f6ef8
commit 337c5189dd
3 changed files with 37 additions and 2 deletions

View File

@@ -2827,6 +2827,8 @@ extern void freedynamicdata(void);
extern void store_savefileinfo(NHFILE *) NONNULLARG1;
extern void store_savefileinfo(NHFILE *) NONNULLARG1;
extern int nhdatatypes_size(void);
extern void moves_to_relative_time(long *);
extern void relative_time_to_moves(long *);
#if 0
extern void assignlog(char *, char*, int);
extern FILE *getlog(NHFILE *);

View File

@@ -35,6 +35,7 @@ staticfn boolean restgamestate(NHFILE *);
staticfn void rest_bubbles(NHFILE *);
staticfn void restore_gamelog(NHFILE *);
staticfn void restore_msghistory(NHFILE *);
staticfn void rest_adjust_levelflags(void);
#endif
/*
@@ -1106,7 +1107,7 @@ getlev(NHFILE *nhfp, int pid, xint8 lev)
Sfi_dest_area(nhfp, &svu.updest, "lev-updest");
Sfi_dest_area(nhfp, &svd.dndest, "lev-dndest");
Sfi_levelflags(nhfp, &svl.level.flags, "lev-level_flags");
rest_adjust_levelflags();
if (svd.doors) {
free(svd.doors);
svd.doors = 0;
@@ -1302,6 +1303,13 @@ getlev(NHFILE *nhfp, int pid, xint8 lev)
program_state.in_getlev = FALSE;
}
void
rest_adjust_levelflags(void)
{
/* adjust timestamps */
relative_time_to_moves(&svl.level.flags.stasis_until);
}
/* "name-role-race-gend-algn" occurs very early in a save file; sometimes we
want the whole thing, other times just "name" (for svp.plname[]) */
void

View File

@@ -31,7 +31,7 @@ staticfn void save_gamelog(NHFILE *);
staticfn void savegamestate(NHFILE *);
staticfn void savelev_core(NHFILE *, xint8);
staticfn void save_msghistory(NHFILE *);
staticfn void save_adjust_levelflags(void);
#if defined(HANGUPHANDLING)
#define HUP if (!program_state.done_hup)
#else
@@ -509,7 +509,9 @@ savelev_core(NHFILE *nhfp, xint8 lev)
save_stairs(nhfp);
Sfo_dest_area(nhfp, &svu.updest, "lev-updest");
Sfo_dest_area(nhfp, &svd.dndest, "lev-dndest");
save_adjust_levelflags();
Sfo_levelflags(nhfp, &svl.level.flags, "lev-level_flags");
rest_adjust_levelflags();
Sfo_int(nhfp, &svd.doors_alloc, "lev-doors_alloc");
/* don't rely on underlying write() behavior to write
@@ -556,6 +558,13 @@ savelev_core(NHFILE *nhfp, xint8 lev)
return;
}
void
save_adjust_levelflags(void)
{
/* adjust any timestamps */
moves_to_relative_time(&svl.level.flags.stasis_until);
}
staticfn void
savelevl(NHFILE *nhfp)
{
@@ -1033,6 +1042,22 @@ save_msghistory(NHFILE *nhfp)
/* note: we don't attempt to handle release_data() here */
}
void
moves_to_relative_time(long *timestamp)
{
long prevts = *timestamp;
*timestamp = prevts - svm.moves;
}
void
relative_time_to_moves(long *timestamp)
{
long prevts = *timestamp;
*timestamp = svm.moves + prevts;
}
/* also called by prscore(); this probably belongs in dungeon.c... */
void
free_dungeons(void)