@@ -56,10 +56,17 @@ Int REPLAY_CRC_INTERVAL = 100;
56
56
const char *replayExtention = " .rep" ;
57
57
const char *lastReplayFileName = " 00000000" ; // a name the user is unlikely to ever type, but won't cause panic & confusion
58
58
59
+ // TheSuperHackers @tweak helmutbuhler 25/04/2025
60
+ // The replay header contains two time elements startTime and endTime of type time_t.
61
+ // On VC6 this was 32-bit, but on newer compilers it's 64-bit. In order to remain compatible
62
+ // we need to load and save them as 32-bit and use this type for that.
63
+ // Note that this will overflow on January 18, 2038.
64
+ typedef int32_t replay_time_t ;
65
+
59
66
static time_t startTime;
60
67
static const UnsignedInt startTimeOffset = 6 ;
61
- static const UnsignedInt endTimeOffset = startTimeOffset + sizeof (time_t );
62
- static const UnsignedInt framesOffset = endTimeOffset + sizeof (time_t );
68
+ static const UnsignedInt endTimeOffset = startTimeOffset + sizeof (replay_time_t );
69
+ static const UnsignedInt framesOffset = endTimeOffset + sizeof (replay_time_t );
63
70
static const UnsignedInt desyncOffset = framesOffset + sizeof (UnsignedInt);
64
71
static const UnsignedInt quitEarlyOffset = desyncOffset + sizeof (Bool);
65
72
static const UnsignedInt disconOffset = quitEarlyOffset + sizeof (Bool);
@@ -75,7 +82,8 @@ void RecorderClass::logGameStart(AsciiString options)
75
82
if (!fseek (m_file, startTimeOffset, SEEK_SET))
76
83
{
77
84
// save off start time
78
- fwrite (&startTime, sizeof (time_t ), 1 , m_file);
85
+ replay_time_t tmp = (replay_time_t )startTime;
86
+ fwrite (&tmp, sizeof (replay_time_t ), 1 , m_file);
79
87
}
80
88
// move back to end of stream
81
89
#ifdef DEBUG_CRASHING
@@ -229,7 +237,8 @@ void RecorderClass::logGameEnd( void )
229
237
if (!fseek (m_file, endTimeOffset, SEEK_SET))
230
238
{
231
239
// save off end time
232
- fwrite (&t, sizeof (time_t ), 1 , m_file);
240
+ replay_time_t tmp = (replay_time_t )t;
241
+ fwrite (&tmp, sizeof (replay_time_t ), 1 , m_file);
233
242
}
234
243
// move to appropriate offset
235
244
if (!fseek (m_file, framesOffset, SEEK_SET))
@@ -555,9 +564,9 @@ void RecorderClass::startRecording(GameDifficulty diff, Int originalGameMode, In
555
564
//
556
565
// **** if this changes, change the LAN Playtest code above ****
557
566
//
558
- time_t t = 0 ;
559
- fwrite (&t, sizeof (time_t ), 1 , m_file); // reserve space for start time
560
- fwrite (&t, sizeof (time_t ), 1 , m_file); // reserve space for end time
567
+ replay_time_t t = 0 ;
568
+ fwrite (&t, sizeof (replay_time_t ), 1 , m_file); // reserve space for start time
569
+ fwrite (&t, sizeof (replay_time_t ), 1 , m_file); // reserve space for end time
561
570
562
571
UnsignedInt frames = 0 ;
563
572
fwrite (&frames, sizeof (UnsignedInt), 1 , m_file); // reserve space for duration in frames
@@ -834,8 +843,11 @@ Bool RecorderClass::readReplayHeader(ReplayHeader& header)
834
843
}
835
844
836
845
// read in some stats
837
- fread (&header.startTime , sizeof (time_t ), 1 , m_file);
838
- fread (&header.endTime , sizeof (time_t ), 1 , m_file);
846
+ replay_time_t tmp;
847
+ fread (&tmp, sizeof (replay_time_t ), 1 , m_file);
848
+ header.startTime = tmp;
849
+ fread (&tmp, sizeof (replay_time_t ), 1 , m_file);
850
+ header.endTime = tmp;
839
851
840
852
fread (&header.frameDuration , sizeof (UnsignedInt), 1 , m_file);
841
853
0 commit comments