From: Pasi Kallinen Date: Thu, 19 Mar 2015 15:41:14 +0000 (+0200) Subject: Save xlogfile time_t fields correctly X-Git-Tag: NetHack-3.6.0_RC01~585 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3cc3709d9535fc9d3b34b0b45a436a8a707eb35e;p=nethack Save xlogfile time_t fields correctly --- diff --git a/include/decl.h b/include/decl.h index 2071277dc..bacff08d9 100644 --- a/include/decl.h +++ b/include/decl.h @@ -244,6 +244,7 @@ E NEARDATA anything zeroany; /* init'd and defined in decl.c */ #include "you.h" E NEARDATA struct you u; E NEARDATA time_t ubirthday; +E NEARDATA struct u_realtime urealtime; #include "onames.h" #ifndef PM_H /* (pm.h has already been included via youprop.h) */ diff --git a/include/patchlevel.h b/include/patchlevel.h index 00411a2c2..02b8b3bfa 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -14,7 +14,7 @@ * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. */ -#define EDITLEVEL 56 +#define EDITLEVEL 57 #define COPYRIGHT_BANNER_A \ "NetHack, Copyright 1985-2012" diff --git a/include/you.h b/include/you.h index 81aba0ba4..0fc5c6073 100644 --- a/include/you.h +++ b/include/you.h @@ -327,7 +327,6 @@ struct you { unsigned udg_cnt; /* how long you have been demigod */ struct u_achieve uachieve; /* achievements */ - struct u_realtime urealtime; struct u_event uevent; /* certain events have happened */ struct u_have uhave; /* you're carrying special objects */ struct u_conduct uconduct; /* KMH, conduct */ diff --git a/src/allmain.c b/src/allmain.c index eb1f2b69b..45c319037 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -533,11 +533,11 @@ newgame() #endif program_state.something_worth_saving++; /* useful data now exists */ - u.urealtime.realtime = (time_t)0L; + urealtime.realtime = (time_t)0L; #if defined(BSD) && !defined(POSIX_TYPES) - (void) time((long *)&u.urealtime.restored); + (void) time((long *)&urealtime.restored); #else - (void) time(&u.urealtime.restored); + (void) time(&urealtime.restored); #endif /* Success! */ diff --git a/src/decl.c b/src/decl.c index 6c83f0f14..d0d29a35f 100644 --- a/src/decl.c +++ b/src/decl.c @@ -136,6 +136,7 @@ NEARDATA struct sysflag sysflags = DUMMY; NEARDATA struct instance_flags iflags = DUMMY; NEARDATA struct you u = DUMMY; NEARDATA time_t ubirthday = DUMMY; +NEARDATA struct u_realtime urealtime = DUMMY; schar lastseentyp[COLNO][ROWNO] = {DUMMY}; /* last seen/touched dungeon typ */ diff --git a/src/end.c b/src/end.c index 111fd1b3a..7ada39767 100644 --- a/src/end.c +++ b/src/end.c @@ -911,7 +911,7 @@ die: topten figure it out separately and possibly getting different time or even day if player is slow responding to --More-- */ endtime = getnow(); - u.urealtime.realtime += (endtime - u.urealtime.restored); + urealtime.realtime += (endtime - urealtime.restored); /* Sometimes you die on the first move. Life's not fair. * On those rare occasions you get hosed immediately, go out diff --git a/src/restore.c b/src/restore.c index 9f336d3ad..4e4502b53 100644 --- a/src/restore.c +++ b/src/restore.c @@ -551,13 +551,18 @@ unsigned int *stuckid, *steedid; amii_setpens(amii_numcolors); /* use colors from save file */ #endif mread(fd, (genericptr_t) &u, sizeof(struct you)); - mread(fd, (genericptr_t) timebuf, 14); - timebuf[14] = '\0'; - ubirthday = time_from_yyyymmddhhmmss(timebuf); + +#define ReadTimebuf(foo) mread(fd, (genericptr_t) timebuf, 14); \ + timebuf[14] = '\0'; \ + foo = time_from_yyyymmddhhmmss(timebuf); + + ReadTimebuf(ubirthday); + ReadTimebuf(urealtime.realtime); + ReadTimebuf(urealtime.restored); #if defined(BSD) && !defined(POSIX_TYPES) - (void) time((long *)&u.urealtime.restored); + (void) time((long *)&urealtime.restored); #else - (void) time(&u.urealtime.restored); + (void) time(&urealtime.restored); #endif diff --git a/src/save.c b/src/save.c index 964847190..807ecd7dc 100644 --- a/src/save.c +++ b/src/save.c @@ -307,9 +307,11 @@ register int fd, mode; #ifdef SYSFLAGS bwrite(fd, (genericptr_t) &sysflags, sizeof(struct sysflag)); #endif - u.urealtime.realtime += (getnow() - u.urealtime.restored); + urealtime.realtime += (getnow() - urealtime.restored); bwrite(fd, (genericptr_t) &u, sizeof(struct you)); bwrite(fd, yyyymmddhhmmss(ubirthday), 14); + bwrite(fd, yyyymmddhhmmss(urealtime.realtime), 14); + bwrite(fd, yyyymmddhhmmss(urealtime.restored), 14); save_killers(fd, mode); /* must come before migrating_objs and migrating_mons are freed */ diff --git a/src/topten.c b/src/topten.c index 12adcc449..b68ad1bce 100644 --- a/src/topten.c +++ b/src/topten.c @@ -334,10 +334,10 @@ struct toptenentry *tt; XLOG_SEP, encodeconduct(), XLOG_SEP, moves, XLOG_SEP, encodeachieve()); - Fprintf(rfile, "%crealtime=%ld%cstarttime=%ld%cendtime%ld", - XLOG_SEP, (long)u.urealtime.realtime, + Fprintf(rfile, "%crealtime=%ld%cstarttime=%ld%cendtime=%ld", + XLOG_SEP, (long)urealtime.realtime, XLOG_SEP, (long)ubirthday, - XLOG_SEP, (long)u.urealtime.endtime); + XLOG_SEP, (long)urealtime.endtime); Fprintf(rfile, "%cgender0=%s%calign0=%s", XLOG_SEP, genders[flags.initgend].filecode, XLOG_SEP, aligns[1 - u.ualignbase[A_ORIGINAL]].filecode); @@ -480,7 +480,7 @@ time_t when; t0->birthdate = yyyymmdd(ubirthday); t0->deathdate = yyyymmdd(when); t0->tt_next = 0; - u.urealtime.endtime = when; + urealtime.endtime = when; #ifdef UPDATE_RECORD_IN_PLACE t0->fpos = -1L; #endif diff --git a/src/u_init.c b/src/u_init.c index bfe54671c..79954841c 100644 --- a/src/u_init.c +++ b/src/u_init.c @@ -500,6 +500,7 @@ u_init() (void) memset((genericptr_t)&u, 0, sizeof(u)); u.ustuck = (struct monst *)0; (void) memset((genericptr_t)&ubirthday, 0, sizeof(ubirthday)); + (void) memset((genericptr_t)&urealtime, 0, sizeof(urealtime)); #if 0 /* documentation of more zero values as desirable */ u.usick_cause[0] = 0;