4
4
#include " dotelemetry.h"
5
5
#include " tmtelemetry.h"
6
6
7
+ // Forward declarations
8
+ BOOL IsRaceBeforeStart (STelemetryData* pTelemetry);
9
+ BOOL IsRaceRunning (STelemetryData* pTelemetry);
10
+ BOOL IsRaceFinished (STelemetryData* pTelemetry);
11
+
7
12
// Processing of the telemetry data
8
13
void DoTelemetry (STelemetryData* pTelemetry)
9
14
{
10
15
TCHAR szText[MAX_CONTROLTEXT];
11
16
static int nRaceNumber = 0 ; // Number of attempts
17
+ static Nat32 uLapCount = 0 ; // Current lap
12
18
static BOOL bAddFinalColumns = FALSE ; // Append some stats after the end of each race
13
19
14
20
// Static variables for storing values for the statistics:
@@ -95,9 +101,38 @@ void DoTelemetry(STelemetryData* pTelemetry)
95
101
// Race state
96
102
if (pTelemetry->Current .Race .State != pTelemetry->Previous .Race .State )
97
103
{
98
- // Handle the start of a race (race state changes from "BeforeState" to "Running")
99
- if (pTelemetry->Previous .Race .State == STelemetry::ERaceState_BeforeState &&
100
- pTelemetry->Current .Race .State == STelemetry::ERaceState_Running)
104
+ switch (pTelemetry->Current .Race .State )
105
+ {
106
+ case STelemetry::ERaceState_BeforeState:
107
+ StatusBar_SetText (hwndStatusBar, SBP_RACESTATE, szRaceBeforeStart);
108
+ break ;
109
+
110
+ case STelemetry::ERaceState_Running:
111
+ StatusBar_SetText (hwndStatusBar, SBP_RACESTATE, szRaceRunning);
112
+ break ;
113
+
114
+ case STelemetry::ERaceState_Finished:
115
+ StatusBar_SetText (hwndStatusBar, SBP_RACESTATE, szRaceFinished);
116
+ break ;
117
+
118
+ // case STelemetry::ERaceState_Eliminated:
119
+ // StatusBar_SetText(hwndStatusBar, SBP_RACESTATE, szRaceEliminated);
120
+ // break;
121
+
122
+ default :
123
+ StatusBar_SetText (hwndStatusBar, SBP_RACESTATE, TEXT (" " ));
124
+ }
125
+
126
+ // Handle the countdown
127
+ if (IsRaceBeforeStart (pTelemetry))
128
+ {
129
+ // Reset the lap counter
130
+ uLapCount = 0 ;
131
+ StatusBar_SetLapCount (hwndStatusBar, SBP_LAPS, uLapCount, pTelemetry->Current .Race .NbLaps );
132
+ }
133
+
134
+ // Handle the start of a race
135
+ if (IsRaceRunning (pTelemetry))
101
136
{
102
137
uTopSpeed = 0 ;
103
138
nNbGearchanges = 0 ;
@@ -116,6 +151,10 @@ void DoTelemetry(STelemetryData* pTelemetry)
116
151
bIsSlipping = pTelemetry->Current .Vehicle .WheelsIsSliping [0 ] || pTelemetry->Current .Vehicle .WheelsIsSliping [1 ] ||
117
152
pTelemetry->Current .Vehicle .WheelsIsSliping [2 ] || pTelemetry->Current .Vehicle .WheelsIsSliping [3 ];
118
153
154
+ // Set the lap counter to 1
155
+ uLapCount = 1 ;
156
+ StatusBar_SetLapCount (hwndStatusBar, SBP_LAPS, uLapCount, pTelemetry->Current .Race .NbLaps );
157
+
119
158
// Add a new race to the list-view control and increment the number of attempts
120
159
if (ListView_AddRace (hwndListView, nRaceNumber + 1 , COLUMN_AUTOFIT) != -1 )
121
160
nRaceNumber++;
@@ -158,10 +197,8 @@ void DoTelemetry(STelemetryData* pTelemetry)
158
197
}
159
198
}
160
199
161
- // Handle the end of a race (race state changes from "Running" to "Finished" or "BeforeStart")
162
- if (pTelemetry->Previous .Race .State == STelemetry::ERaceState_Running &&
163
- (pTelemetry->Current .Race .State == STelemetry::ERaceState_Finished ||
164
- pTelemetry->Current .Race .State == STelemetry::ERaceState_BeforeState))
200
+ // Handle the end of a race
201
+ if (IsRaceFinished (pTelemetry))
165
202
{
166
203
// Test if the checkpoint count has increased to differ between finished and restart
167
204
if (pTelemetry->Current .Race .NbCheckpoints > pTelemetry->Previous .Race .NbCheckpoints )
@@ -178,29 +215,59 @@ void DoTelemetry(STelemetryData* pTelemetry)
178
215
nRaceNumber--;
179
216
}
180
217
181
- switch (pTelemetry->Current .Race .State )
218
+ pTelemetry->Previous .Race .State = pTelemetry->Current .Race .State ;
219
+ }
220
+
221
+ // Number of checkpoints
222
+ if (pTelemetry->Current .Race .NbCheckpoints != pTelemetry->Previous .Race .NbCheckpoints )
223
+ {
224
+ // Add the new checkpoint time to the list-view control
225
+ Nat32 uCurrentNbCheckpoints = pTelemetry->Current .Race .NbCheckpoints ;
226
+ if (uCurrentNbCheckpoints > 0 && uCurrentNbCheckpoints <= _countof (pTelemetry->Current .Race .CheckpointTimes ) &&
227
+ uCurrentNbCheckpoints > uMaxNbCheckpoints)
182
228
{
183
- case STelemetry::ERaceState_BeforeState:
184
- StatusBar_SetText (hwndStatusBar, SBP_RACESTATE, szRaceBeforeStart);
185
- break ;
229
+ if (dwColumns & COL_SECTORTIMES)
230
+ ListView_AddSectorTime (hwndListView, nRaceNumber, COLUMN_AUTOFIT, uCurrentNbCheckpoints,
231
+ pTelemetry->Current .Race .CheckpointTimes [uCurrentNbCheckpoints - 1 ],
232
+ uCurrentNbCheckpoints >= 2 ? pTelemetry->Current .Race .CheckpointTimes [uCurrentNbCheckpoints - 2 ] : 0 );
186
233
187
- case STelemetry::ERaceState_Running:
188
- StatusBar_SetText (hwndStatusBar, SBP_RACESTATE, szRaceRunning);
189
- break ;
234
+ if (dwColumns & COL_CHECKPOINTS)
235
+ ListView_AddCheckpointTime (hwndListView, nRaceNumber, COLUMN_AUTOFIT, uCurrentNbCheckpoints,
236
+ pTelemetry->Current .Race .CheckpointTimes [uCurrentNbCheckpoints - 1 ]);
237
+ }
190
238
191
- case STelemetry::ERaceState_Finished:
192
- StatusBar_SetText (hwndStatusBar, SBP_RACESTATE, szRaceFinished);
193
- break ;
239
+ // Update the lap counter after crossing the start/finish line
240
+ Nat32 uCurrentLap = uLapCount;
241
+ Nat32 uNumberOfLaps = pTelemetry->Current .Race .NbLaps ; // Could be zero
242
+ Nat32 uCheckpointsPerLap = pTelemetry->Current .Race .NbCheckpointsPerLap ; // Always 0 with Trackmania Turbo
243
+
244
+ if (uCheckpointsPerLap != 0 )
245
+ {
246
+ uCurrentLap = uCurrentNbCheckpoints / uCheckpointsPerLap;
247
+ // Correct the lap counter by one, except on restart and when crossing the finish line
248
+ if (uCurrentNbCheckpoints != 0 && (uCurrentLap < uNumberOfLaps || uNumberOfLaps == 0 ))
249
+ uCurrentLap++;
250
+ // Keep the number of laps driven after the race is over
251
+ if (uCurrentLap < uLapCount)
252
+ uCurrentLap = uLapCount;
253
+ }
254
+
255
+ if (uCurrentLap != uLapCount)
256
+ {
257
+ uLapCount = uCurrentLap;
258
+ StatusBar_SetLapCount (hwndStatusBar, SBP_LAPS, uLapCount, uNumberOfLaps);
259
+ }
194
260
195
- // case STelemetry::ERaceState_Eliminated:
196
- // StatusBar_SetText(hwndStatusBar, SBP_RACESTATE, szRaceEliminated );
197
- // break ;
261
+ // Update the checkpoint counter
262
+ _sntprintf (szText, _countof (szText), szNbCheckpoints, uCurrentNbCheckpoints );
263
+ StatusBar_SetText (hwndStatusBar, SBP_CHECKPOINTS, szText, TRUE ) ;
198
264
199
- default :
200
- StatusBar_SetText (hwndStatusBar, SBP_RACESTATE, TEXT (" " ));
201
- }
265
+ // Here we have to store the highest number of checkpoints per game client so that
266
+ // the list is not flooded with data when Maniaplanet and Turbo run simultaneously
267
+ if (uCurrentNbCheckpoints > pTelemetry->Previous .Race .NbCheckpoints )
268
+ uMaxNbCheckpoints = uCurrentNbCheckpoints;
202
269
203
- pTelemetry->Previous .Race .State = pTelemetry-> Current . Race . State ;
270
+ pTelemetry->Previous .Race .NbCheckpoints = uCurrentNbCheckpoints ;
204
271
}
205
272
206
273
// Map name
@@ -237,45 +304,6 @@ void DoTelemetry(STelemetryData* pTelemetry)
237
304
pTelemetry->Previous .Race .Time = pTelemetry->Current .Race .Time ;
238
305
}
239
306
240
- // Number of respawns
241
- if (pTelemetry->Current .Race .NbRespawns != pTelemetry->Previous .Race .NbRespawns )
242
- {
243
- _sntprintf (szText, _countof (szText), szNbRespawns, pTelemetry->Current .Race .NbRespawns );
244
- StatusBar_SetText (hwndStatusBar, SBP_RESPAWNS, szText, TRUE );
245
-
246
- pTelemetry->Previous .Race .NbRespawns = pTelemetry->Current .Race .NbRespawns ;
247
- }
248
-
249
- // Number of checkpoints
250
- if (pTelemetry->Current .Race .NbCheckpoints != pTelemetry->Previous .Race .NbCheckpoints )
251
- {
252
- // Add the new checkpoint time to the list-view control
253
- Nat32 uCurrentNbCheckpoints = pTelemetry->Current .Race .NbCheckpoints ;
254
- if (uCurrentNbCheckpoints > 0 && uCurrentNbCheckpoints <= _countof (pTelemetry->Current .Race .CheckpointTimes ) &&
255
- uCurrentNbCheckpoints > uMaxNbCheckpoints)
256
- {
257
- // BUGBUG: It looks like we can't be sure that the checkpoint time was also already updated!
258
- if (dwColumns & COL_SECTORTIMES)
259
- ListView_AddSectorTime (hwndListView, nRaceNumber, COLUMN_AUTOFIT, uCurrentNbCheckpoints,
260
- pTelemetry->Current .Race .CheckpointTimes [uCurrentNbCheckpoints - 1 ],
261
- uCurrentNbCheckpoints >= 2 ? pTelemetry->Current .Race .CheckpointTimes [uCurrentNbCheckpoints - 2 ] : 0 );
262
-
263
- if (dwColumns & COL_CHECKPOINTS)
264
- ListView_AddCheckpointTime (hwndListView, nRaceNumber, COLUMN_AUTOFIT, uCurrentNbCheckpoints,
265
- pTelemetry->Current .Race .CheckpointTimes [uCurrentNbCheckpoints - 1 ]);
266
- }
267
-
268
- // Here we have to store the highest number of checkpoints per game client so that
269
- // the list is not flooded with data when Maniaplanet and Turbo run simultaneously
270
- if (uCurrentNbCheckpoints > pTelemetry->Previous .Race .NbCheckpoints )
271
- uMaxNbCheckpoints = uCurrentNbCheckpoints;
272
-
273
- _sntprintf (szText, _countof (szText), szNbCheckpoints, uCurrentNbCheckpoints);
274
- StatusBar_SetText (hwndStatusBar, SBP_CHECKPOINTS, szText, TRUE );
275
-
276
- pTelemetry->Previous .Race .NbCheckpoints = uCurrentNbCheckpoints;
277
- }
278
-
279
307
// Speed
280
308
if (pTelemetry->Current .Vehicle .SpeedMeter != pTelemetry->Previous .Vehicle .SpeedMeter )
281
309
{
@@ -445,11 +473,17 @@ void DoTelemetry(STelemetryData* pTelemetry)
445
473
// Map UID
446
474
if (strcmp (pTelemetry->Current .Game .MapId , pTelemetry->Previous .Game .MapId ) != 0 )
447
475
{
448
- // Clear all races after map change
449
476
if (strcmp (pTelemetry->Current .Game .MapId , " Unassigned" ) != 0 )
477
+ {
478
+ // Clear all races after map change
450
479
if (ListView_DeleteAllRaces (hwndListView))
451
480
nRaceNumber = 0 ;
452
481
482
+ // Reset the lap counter
483
+ uLapCount = 0 ;
484
+ StatusBar_SetLapCount (hwndStatusBar, SBP_LAPS, uLapCount, pTelemetry->Current .Race .NbLaps );
485
+ }
486
+
453
487
lstrcpynA (pTelemetry->Previous .Game .MapId , pTelemetry->Current .Game .MapId , _countof (pTelemetry->Previous .Game .MapId ));
454
488
}
455
489
@@ -512,6 +546,8 @@ void InitTelemetryData(STelemetryData* pTelemetry)
512
546
pTelemetry->Previous .Race .Time = (Nat32)-2 ; // -1 is a regular value
513
547
pTelemetry->Previous .Race .NbRespawns = (Nat32)-2 ; // -1 is a regular value
514
548
pTelemetry->Previous .Race .NbCheckpoints = (Nat32)-1 ;
549
+ pTelemetry->Previous .Race .NbCheckpointsPerLap = (Nat32)-1 ;
550
+ pTelemetry->Previous .Race .NbLaps = (Nat32)-1 ;
515
551
516
552
pTelemetry->Previous .Vehicle .InputSteer = -2 .0f ; // -1.0 is a regular value
517
553
pTelemetry->Previous .Vehicle .InputGasPedal = -1 .0f ;
@@ -525,3 +561,26 @@ void InitTelemetryData(STelemetryData* pTelemetry)
525
561
pTelemetry->Previous .Vehicle .RumbleIntensity = -1 .0f ;
526
562
pTelemetry->Previous .Vehicle .SpeedMeter = (Nat32)-1 ;
527
563
}
564
+
565
+ // Checks if the countdown has just started (race state changes from "Finished" or "Running" to "BeforeStart")
566
+ __inline BOOL IsRaceBeforeStart (STelemetryData* pTelemetry)
567
+ {
568
+ return ((pTelemetry->Previous .Race .State == STelemetry::ERaceState_Finished ||
569
+ pTelemetry->Previous .Race .State == STelemetry::ERaceState_Running) &&
570
+ pTelemetry->Current .Race .State == STelemetry::ERaceState_BeforeState);
571
+ }
572
+
573
+ // Checks if the race has just started (race state changes from "BeforeStart" to "Running")
574
+ __inline BOOL IsRaceRunning (STelemetryData* pTelemetry)
575
+ {
576
+ return (pTelemetry->Previous .Race .State == STelemetry::ERaceState_BeforeState &&
577
+ pTelemetry->Current .Race .State == STelemetry::ERaceState_Running);
578
+ }
579
+
580
+ // Checks if the race has just finished (race state changes from "Running" to "Finished" or "BeforeStart")
581
+ __inline BOOL IsRaceFinished (STelemetryData* pTelemetry)
582
+ {
583
+ return (pTelemetry->Previous .Race .State == STelemetry::ERaceState_Running &&
584
+ (pTelemetry->Current .Race .State == STelemetry::ERaceState_Finished ||
585
+ pTelemetry->Current .Race .State == STelemetry::ERaceState_BeforeState));
586
+ }
0 commit comments