From 337c5189dd7bdbab102e167dd8c502c144ad4756 Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 13 Apr 2026 06:39:54 -0400 Subject: [PATCH] store relative timestamps in save and bones --- include/extern.h | 2 ++ src/restore.c | 10 +++++++++- src/save.c | 27 ++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/include/extern.h b/include/extern.h index 67a938731..fe1b93b1b 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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 *); diff --git a/src/restore.c b/src/restore.c index 191db7ddd..8f131d111 100644 --- a/src/restore.c +++ b/src/restore.c @@ -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 diff --git a/src/save.c b/src/save.c index a7ea05e7a..e2c0ac5f9 100644 --- a/src/save.c +++ b/src/save.c @@ -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)