Save xlogfile time_t fields correctly

This commit is contained in:
Pasi Kallinen
2015-03-19 17:41:14 +02:00
parent 02cdaf5a09
commit 3cc3709d95
10 changed files with 25 additions and 16 deletions

View File

@@ -244,6 +244,7 @@ E NEARDATA anything zeroany; /* init'd and defined in decl.c */
#include "you.h" #include "you.h"
E NEARDATA struct you u; E NEARDATA struct you u;
E NEARDATA time_t ubirthday; E NEARDATA time_t ubirthday;
E NEARDATA struct u_realtime urealtime;
#include "onames.h" #include "onames.h"
#ifndef PM_H /* (pm.h has already been included via youprop.h) */ #ifndef PM_H /* (pm.h has already been included via youprop.h) */

View File

@@ -14,7 +14,7 @@
* Incrementing EDITLEVEL can be used to force invalidation of old bones * Incrementing EDITLEVEL can be used to force invalidation of old bones
* and save files. * and save files.
*/ */
#define EDITLEVEL 56 #define EDITLEVEL 57
#define COPYRIGHT_BANNER_A \ #define COPYRIGHT_BANNER_A \
"NetHack, Copyright 1985-2012" "NetHack, Copyright 1985-2012"

View File

@@ -327,7 +327,6 @@ struct you {
unsigned udg_cnt; /* how long you have been demigod */ unsigned udg_cnt; /* how long you have been demigod */
struct u_achieve uachieve; /* achievements */ struct u_achieve uachieve; /* achievements */
struct u_realtime urealtime;
struct u_event uevent; /* certain events have happened */ struct u_event uevent; /* certain events have happened */
struct u_have uhave; /* you're carrying special objects */ struct u_have uhave; /* you're carrying special objects */
struct u_conduct uconduct; /* KMH, conduct */ struct u_conduct uconduct; /* KMH, conduct */

View File

@@ -533,11 +533,11 @@ newgame()
#endif #endif
program_state.something_worth_saving++; /* useful data now exists */ 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) #if defined(BSD) && !defined(POSIX_TYPES)
(void) time((long *)&u.urealtime.restored); (void) time((long *)&urealtime.restored);
#else #else
(void) time(&u.urealtime.restored); (void) time(&urealtime.restored);
#endif #endif
/* Success! */ /* Success! */

View File

@@ -136,6 +136,7 @@ NEARDATA struct sysflag sysflags = DUMMY;
NEARDATA struct instance_flags iflags = DUMMY; NEARDATA struct instance_flags iflags = DUMMY;
NEARDATA struct you u = DUMMY; NEARDATA struct you u = DUMMY;
NEARDATA time_t ubirthday = DUMMY; NEARDATA time_t ubirthday = DUMMY;
NEARDATA struct u_realtime urealtime = DUMMY;
schar lastseentyp[COLNO][ROWNO] = {DUMMY}; /* last seen/touched dungeon typ */ schar lastseentyp[COLNO][ROWNO] = {DUMMY}; /* last seen/touched dungeon typ */

View File

@@ -911,7 +911,7 @@ die:
topten figure it out separately and possibly getting different topten figure it out separately and possibly getting different
time or even day if player is slow responding to --More-- */ time or even day if player is slow responding to --More-- */
endtime = getnow(); 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. /* Sometimes you die on the first move. Life's not fair.
* On those rare occasions you get hosed immediately, go out * On those rare occasions you get hosed immediately, go out

View File

@@ -551,13 +551,18 @@ unsigned int *stuckid, *steedid;
amii_setpens(amii_numcolors); /* use colors from save file */ amii_setpens(amii_numcolors); /* use colors from save file */
#endif #endif
mread(fd, (genericptr_t) &u, sizeof(struct you)); mread(fd, (genericptr_t) &u, sizeof(struct you));
mread(fd, (genericptr_t) timebuf, 14);
timebuf[14] = '\0'; #define ReadTimebuf(foo) mread(fd, (genericptr_t) timebuf, 14); \
ubirthday = time_from_yyyymmddhhmmss(timebuf); timebuf[14] = '\0'; \
foo = time_from_yyyymmddhhmmss(timebuf);
ReadTimebuf(ubirthday);
ReadTimebuf(urealtime.realtime);
ReadTimebuf(urealtime.restored);
#if defined(BSD) && !defined(POSIX_TYPES) #if defined(BSD) && !defined(POSIX_TYPES)
(void) time((long *)&u.urealtime.restored); (void) time((long *)&urealtime.restored);
#else #else
(void) time(&u.urealtime.restored); (void) time(&urealtime.restored);
#endif #endif

View File

@@ -307,9 +307,11 @@ register int fd, mode;
#ifdef SYSFLAGS #ifdef SYSFLAGS
bwrite(fd, (genericptr_t) &sysflags, sizeof(struct sysflag)); bwrite(fd, (genericptr_t) &sysflags, sizeof(struct sysflag));
#endif #endif
u.urealtime.realtime += (getnow() - u.urealtime.restored); urealtime.realtime += (getnow() - urealtime.restored);
bwrite(fd, (genericptr_t) &u, sizeof(struct you)); bwrite(fd, (genericptr_t) &u, sizeof(struct you));
bwrite(fd, yyyymmddhhmmss(ubirthday), 14); bwrite(fd, yyyymmddhhmmss(ubirthday), 14);
bwrite(fd, yyyymmddhhmmss(urealtime.realtime), 14);
bwrite(fd, yyyymmddhhmmss(urealtime.restored), 14);
save_killers(fd, mode); save_killers(fd, mode);
/* must come before migrating_objs and migrating_mons are freed */ /* must come before migrating_objs and migrating_mons are freed */

View File

@@ -334,10 +334,10 @@ struct toptenentry *tt;
XLOG_SEP, encodeconduct(), XLOG_SEP, encodeconduct(),
XLOG_SEP, moves, XLOG_SEP, moves,
XLOG_SEP, encodeachieve()); XLOG_SEP, encodeachieve());
Fprintf(rfile, "%crealtime=%ld%cstarttime=%ld%cendtime%ld", Fprintf(rfile, "%crealtime=%ld%cstarttime=%ld%cendtime=%ld",
XLOG_SEP, (long)u.urealtime.realtime, XLOG_SEP, (long)urealtime.realtime,
XLOG_SEP, (long)ubirthday, XLOG_SEP, (long)ubirthday,
XLOG_SEP, (long)u.urealtime.endtime); XLOG_SEP, (long)urealtime.endtime);
Fprintf(rfile, "%cgender0=%s%calign0=%s", Fprintf(rfile, "%cgender0=%s%calign0=%s",
XLOG_SEP, genders[flags.initgend].filecode, XLOG_SEP, genders[flags.initgend].filecode,
XLOG_SEP, aligns[1 - u.ualignbase[A_ORIGINAL]].filecode); XLOG_SEP, aligns[1 - u.ualignbase[A_ORIGINAL]].filecode);
@@ -480,7 +480,7 @@ time_t when;
t0->birthdate = yyyymmdd(ubirthday); t0->birthdate = yyyymmdd(ubirthday);
t0->deathdate = yyyymmdd(when); t0->deathdate = yyyymmdd(when);
t0->tt_next = 0; t0->tt_next = 0;
u.urealtime.endtime = when; urealtime.endtime = when;
#ifdef UPDATE_RECORD_IN_PLACE #ifdef UPDATE_RECORD_IN_PLACE
t0->fpos = -1L; t0->fpos = -1L;
#endif #endif

View File

@@ -500,6 +500,7 @@ u_init()
(void) memset((genericptr_t)&u, 0, sizeof(u)); (void) memset((genericptr_t)&u, 0, sizeof(u));
u.ustuck = (struct monst *)0; u.ustuck = (struct monst *)0;
(void) memset((genericptr_t)&ubirthday, 0, sizeof(ubirthday)); (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 */ #if 0 /* documentation of more zero values as desirable */
u.usick_cause[0] = 0; u.usick_cause[0] = 0;