-
Notifications
You must be signed in to change notification settings - Fork 0
/
gaps-overlay-src.js
322 lines (292 loc) · 9.42 KB
/
gaps-overlay-src.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
/**
* gaps overlay
*/
var textFont = "RussellSquare";
var fontSize = 22;
var leaderBoardName = "gaps";
/**
* check if there is driver on leader board
* @param {number} position driver position in leader board
* @returns true or false
*/
function isDriver(position) {
return driver_Position(position) != null ? true : false;
}
/**
*
* @param {number} position driver position in leader board
* @returns {number} driver overall/class position
*/
function driver_Position(position) {
return DynLeaderboardsPluginProp(leaderBoardName, position, "Position.Dynamic");
}
/**
*
* @param {number} position driver position in leader board
* @returns driver car number in #999 format
*/
function driver_CarNumber(position) {
return "#" + DynLeaderboardsPluginProp(leaderBoardName, position, "Car.Number");
}
/**
*
* @param {number} position driver position in leader board
* @returns {string} driver name with short first name (J. Smith)
*/
function driver_Name(position) {
const teamName = /(\s*\|\s*.+)|(\s*\[.+\]\s*)$/;
return DynLeaderboardsPluginProp(leaderBoardName, position, "Driver.1.InitialPlusLastName").replace(teamName, "");
}
/**
*
* @param {number} position driver position in leader board
* @returns {time} driver best lap time in mm.ss.fff format
*/
function driver_BestLapTime(position) {
return DynLeaderboardsPluginProp(leaderBoardName, position, "Laps.Best.Time");
}
/**
*
* @param {number} position driver position in leader board
* @returns driver best lap delta to focused (from focused POW: negative = slower, positive = faster)
*/
function driver_BestLapDelta(position) {
var _driverBestLapDelta = DynLeaderboardsPluginProp(
leaderBoardName,
position,
"Laps.Best.Delta.Dynamic.ToFocusedBest"
);
return _driverBestLapDelta === null ? null : -Math.min(Math.max(_driverBestLapDelta, -99.9), 99.9);
}
/**
*
* @returns focused car best lap to class best lap delta
*/
function focused_BestToBestDelta() {
const _focusedPosition = $prop("DynLeaderboardsPlugin." + leaderBoardName + ".FocusedPosInCurrentLeaderboard") + 1;
return DynLeaderboardsPluginProp(leaderBoardName, _focusedPosition, "Laps.Best.Delta.ToClassBest");
}
/**
* check if driver has session best lap time
* @param {number} position driver position in leader board
* @returns true or false
*/
function driver_HasBestLap(position) {
if (DynLeaderboardsPluginProp(leaderBoardName, position, "Is" + leaderboardType() + "BestLapCar")) {
return true;
}
return false;
}
/**
*
* @param {number} position driver position in leader board
* @returns {time} driver last lap time in mm.ss.fff format
*/
function driver_LastLapTime(position) {
return DynLeaderboardsPluginProp(leaderBoardName, position, "Laps.Last.Time");
}
/**
*
* @param {number} position driver position in leader board
* @returns driver last lap delta to focused (from focused POW: negative = slower, positive = faster)
*/
function driver_LastLapDelta(position) {
var _driverLastLapDelta = DynLeaderboardsPluginProp(
leaderBoardName,
position,
"Laps.Last.Delta.Dynamic.ToFocusedLast"
);
return _driverLastLapDelta === null ? null : -Math.min(Math.max(_driverLastLapDelta, -99.9), 99.9);
}
/**
*
* @returns focused car last lap to class best lap delta
*/
function focused_LastToBestDelta() {
const _focusedPosition = $prop("DynLeaderboardsPlugin." + leaderBoardName + ".FocusedPosInCurrentLeaderboard") + 1;
return DynLeaderboardsPluginProp(leaderBoardName, _focusedPosition, "Laps.Last.Delta.ToClassBest");
}
/**
*
* @param {number} position driver position in leader board
* @returns driver current gap to focused (negative = behind, positive = ahead)
*/
function driver_Gap(position) {
var _dynamicGapToFocused = DynLeaderboardsPluginProp(leaderBoardName, position, "Gap.Dynamic.ToFocused");
//* https://github.com/kaiusl/KLPlugins.DynLeaderboards/wiki/Available-properties#1-things-to-know
if (_dynamicGapToFocused !== null) {
// No gap can realistically be 50000 seconds without being more than a lap
// and you cannot realistically be more than 50000 laps behind to break following
if (_dynamicGapToFocused > 50000) {
return format(_dynamicGapToFocused - 100000, "0", true) + "L";
}
return format(Math.min(Math.max(_dynamicGapToFocused, -99.9), 99.9), "0.0", true);
}
const _gapToFocusedOnTrack = DynLeaderboardsPluginProp(leaderBoardName, position, "Gap.ToFocused.OnTrack");
return _gapToFocusedOnTrack === null
? null
: format(Math.min(Math.max(_gapToFocusedOnTrack, -99.9), 99.9), "0.0", true);
}
/**
*
* @param {number} position driver position in leader board
* @returns driver lap number relative to focused
*/
function driver_RelativeLapNr(position) {
return DynLeaderboardsPluginProp(leaderBoardName, position, "RelativeOnTrackLapDiff");
}
/**
*
* @param {number} position driver position in leader board
* @param {number} sectorNr sector number
* @returns time in seconds
*/
function driver_LastLapSectorTime(position, sectorNr) {
return DynLeaderboardsPluginProp(leaderBoardName, position, "Laps.Last.S" + sectorNr);
}
/**
* calculate driver last lap sector time delta to focused
* @param {number} position driver position in leader board
* @param {number} sectorNr sector number
* @returns delta in seconds
*/
function driver_LastLapSectorDelta(position, sectorNr) {
const _driverLastLapSector = driver_LastLapSectorTime(position, sectorNr);
const _focusedLastLapSector = driver_LastLapSectorTime(
$prop("DynLeaderboardsPlugin." + leaderBoardName + ".FocusedPosInCurrentLeaderboard") + 1,
sectorNr
);
if (_driverLastLapSector === null || _focusedLastLapSector === null) {
return null;
}
return Math.min(Math.max(_focusedLastLapSector - _driverLastLapSector, -99.9), 99.9);
}
/**
*
* @param {number} position driver position in leader board
* @param {number} sectorNr sector number to compare
* @returns time in seconds
*/
function driver_BestLapSectorTime(position, sectorNr) {
return DynLeaderboardsPluginProp(leaderBoardName, position, "Laps.Best.S" + sectorNr);
}
function driver_BestSectorTime(position, sectorNr) {
return DynLeaderboardsPluginProp(leaderBoardName, position, "BestS" + sectorNr);
}
/**
* calculate driver best sector time delta to focused
* @param {number} position driver position in leader board
* @param {number} sectorNr sector number
* @returns delta in seconds
*/
function driver_BestLapSectorDelta(position, sectorNr) {
const _driverBestLapSector = driver_BestLapSectorTime(position, sectorNr);
const _focusedBestLapSector = driver_BestLapSectorTime(
$prop("DynLeaderboardsPlugin." + leaderBoardName + ".FocusedPosInCurrentLeaderboard") + 1,
sectorNr
);
if (_driverBestLapSector === null || _focusedBestLapSector === null) {
return null;
}
return Math.min(Math.max(_focusedBestLapSector - _driverBestLapSector, -99.9), 99.9);
}
/**
*
* @param {number} position driver position in leader board
* @param {number} sectorNr sector number to compare
* @returns true or false
*/
function driver_LastSectorIsPB(position, sectorNr) {
var _PB = driver_BestSectorTime(position, sectorNr);
var _last = driver_LastLapSectorTime(position, sectorNr);
return _last === _PB ? true : false;
}
/**
*
* @param {string} leaderBoard leader board name
* @param {number} position position in leader board
* @param {string} prop prop to read
* @returns
*/
function DynLeaderboardsPluginProp(leaderBoard, position, prop) {
return $prop("DynLeaderboardsPlugin." + leaderBoard + "." + position + "." + prop);
}
function secToTimeStr(sec) {
return new Date(Math.round(sec * 10) * 100).toISOString().substr(14, 7);
}
function gapBackgroundColor(gap, defaultColor) {
if (gap === null) {
return defaultColor;
}
gap = parseFloat(gap);
if (gap < -0.5) {
return "Green";
}
if (gap < -0.1) {
return "GreenYellow";
}
if (gap >= -0.1 && gap <= 0.1) {
return "White";
}
if (gap > 0.5) {
return "Red";
}
if (gap > 0.1) {
return "OrangeRed";
}
return defaultColor;
}
function gapTextColor(gapBackgroundColor) {
switch (gapBackgroundColor) {
case "Purple":
case "Green":
case "Red":
case "Black":
return "White";
case "DeepSkyBlue":
case "GreenYellow":
case "OrangeRed":
case "White":
return "Black";
default:
return "Black";
}
}
function isPartialLeaderBoard(leaderBoard) {
var currentLeaderboard = $prop("DynLeaderboardsPlugin." + leaderBoard + "." + "CurrentLeaderboard");
return currentLeaderboard.startsWith("PartialRelative");
}
function LBPosition(repeatIndex, screen) {
switch (screen) {
case 1:
return repeatIndex;
case 2:
if (isPartialLeaderBoard(leaderBoardName)) {
var focusedPosition = $prop("DynLeaderboardsPlugin." + leaderBoardName + ".FocusedPosInCurrentLeaderboard") + 1;
switch (focusedPosition) {
case 1:
case 2:
return repeatIndex;
case 3:
return repeatIndex + 1;
case 4:
return repeatIndex + 2;
default:
return repeatIndex + 3;
}
}
return repeatIndex + 2;
default:
return repeatIndex;
}
}
function leaderboardType() {
const _currentLeaderboard = $prop("DynLeaderboardsPlugin." + leaderBoardName + "." + "CurrentLeaderboard");
if (/(Partial)?RelativeClass/.test(_currentLeaderboard)) {
return "Class";
}
if (/(Partial)?RelativeCup/.test(_currentLeaderboard)) {
return "Cup";
}
return "Overall";
}