@inventure71/paddockjs 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/INSTALL_AND_UPDATE.md +3 -1
- package/README.md +142 -9
- package/docs/architecture.md +49 -15
- package/docs/concepts.md +20 -3
- package/docs/data_contract.md +185 -27
- package/docs/data_model.md +1 -1
- package/docs/learnings.md +1 -1
- package/docs/rules.md +140 -19
- package/docs/system_specs.md +39 -16
- package/docs/training.md +103 -1
- package/examples/train-basic-policy.mjs +5 -6
- package/examples/trainingData.mjs +133 -0
- package/package.json +5 -2
- package/src/api/PaddockSimulatorController.js +32 -2
- package/src/app/F1SimulatorApp.js +1101 -128
- package/src/app/domBindings.js +10 -1
- package/src/config/defaultOptions.js +4 -4
- package/src/environment/actions.js +25 -2
- package/src/environment/evaluation.js +184 -0
- package/src/environment/index.d.ts +281 -1
- package/src/environment/index.js +13 -0
- package/src/environment/observationOptions.js +12 -0
- package/src/environment/observations.js +189 -17
- package/src/environment/options.js +7 -0
- package/src/environment/recorder.js +28 -0
- package/src/environment/runtime.js +41 -6
- package/src/environment/scenarios.js +220 -0
- package/src/environment/sensors.js +145 -35
- package/src/environment/specs.js +92 -8
- package/src/environment/workerProtocol.js +52 -0
- package/src/index.d.ts +366 -3
- package/src/index.js +21 -0
- package/src/rendering/proceduralTrackAsset.js +336 -23
- package/src/simulation/collisionGeometry.js +214 -0
- package/src/simulation/driverController.js +431 -65
- package/src/simulation/raceSimulation.js +2132 -171
- package/src/simulation/rules/collisionSteward.js +69 -0
- package/src/simulation/rules/penaltyLedger.js +153 -0
- package/src/simulation/rules/pitLaneSpeedingSteward.js +71 -0
- package/src/simulation/rules/tireRequirementSteward.js +29 -0
- package/src/simulation/rules/trackLimitsSteward.js +85 -0
- package/src/simulation/rulesConfig.js +352 -0
- package/src/simulation/trackModel.js +1154 -76
- package/src/simulation/units.js +6 -4
- package/src/simulation/vehicleGeometry.js +247 -0
- package/src/simulation/vehiclePhysics.js +82 -50
- package/src/simulation/wheelSurface.js +338 -0
- package/src/styles.css +300 -42
- package/src/ui/bannerTemplates.js +69 -0
- package/src/ui/componentTemplates.js +36 -96
- package/src/ui/raceControlStatusBanner.js +39 -0
- package/src/ui/shellTemplate.js +1 -1
- package/src/ui/templateUtils.js +23 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
export const TRAINING_DEMO_DRIVERS = [
|
|
2
|
+
{
|
|
3
|
+
id: 'budget',
|
|
4
|
+
code: 'BUD',
|
|
5
|
+
icon: 'BB',
|
|
6
|
+
name: 'Budget Buddy',
|
|
7
|
+
color: '#ff2d55',
|
|
8
|
+
tire: 'M',
|
|
9
|
+
raceData: ['AI finance coach', 'Python + LLM', 'Budget guardrails'],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: 'noir',
|
|
13
|
+
code: 'NOI',
|
|
14
|
+
icon: 'NN',
|
|
15
|
+
name: 'Neural Noir',
|
|
16
|
+
color: '#ffb000',
|
|
17
|
+
tire: 'M',
|
|
18
|
+
raceData: ['Procedural mystery', 'Gemini storytelling', 'Unreal loop'],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'vinyl',
|
|
22
|
+
code: 'HOL',
|
|
23
|
+
icon: 'HV',
|
|
24
|
+
name: 'HoloVinyl',
|
|
25
|
+
color: '#00c2a8',
|
|
26
|
+
tire: 'H',
|
|
27
|
+
raceData: ['Touchless DJ control', 'Computer vision', 'Hand tracking'],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'drsorriso',
|
|
31
|
+
code: 'DRS',
|
|
32
|
+
icon: 'DR',
|
|
33
|
+
name: 'DrSorrisoDonations',
|
|
34
|
+
color: '#e10600',
|
|
35
|
+
tire: 'S',
|
|
36
|
+
raceData: ['Donation intake', 'Database workflow', 'Automation tool'],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'victoria',
|
|
40
|
+
code: 'VIC',
|
|
41
|
+
icon: 'VI',
|
|
42
|
+
name: 'VictorIA',
|
|
43
|
+
color: '#00a3ff',
|
|
44
|
+
tire: 'M',
|
|
45
|
+
raceData: ['Game AI sandbox', 'Robotics ideas', 'Vision systems'],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'reminderz',
|
|
49
|
+
code: 'REM',
|
|
50
|
+
icon: 'RZ',
|
|
51
|
+
name: 'ReminderZ',
|
|
52
|
+
color: '#a3e635',
|
|
53
|
+
tire: 'H',
|
|
54
|
+
raceData: ['Knowledge workflow', 'Personal graph', 'Capture tool'],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'clipclop',
|
|
58
|
+
code: 'CLP',
|
|
59
|
+
icon: 'CC',
|
|
60
|
+
name: 'ClipClop',
|
|
61
|
+
color: '#f97316',
|
|
62
|
+
tire: 'S',
|
|
63
|
+
raceData: ['Mac + Android sync', 'Local clipboard', 'Productivity app'],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'core',
|
|
67
|
+
code: 'COR',
|
|
68
|
+
icon: 'AI',
|
|
69
|
+
name: 'Core Conflict',
|
|
70
|
+
color: '#38bdf8',
|
|
71
|
+
tire: 'M',
|
|
72
|
+
raceData: ['Runtime AI agents', 'Multiplayer state', 'Game systems'],
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
export const TRAINING_DEMO_ENTRIES = [
|
|
77
|
+
{
|
|
78
|
+
driverId: 'budget',
|
|
79
|
+
driverNumber: 71,
|
|
80
|
+
timingName: 'Budget',
|
|
81
|
+
driver: { pace: 52, racecraft: 74, aggression: 38, riskTolerance: 47, patience: 81, consistency: 86 },
|
|
82
|
+
vehicle: { id: 'budget-bb01', name: 'BB-01 Ledger', power: 48, braking: 72, aero: 55, dragEfficiency: 66, mechanicalGrip: 63, weightControl: 58, tireCare: 82 },
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
driverId: 'noir',
|
|
86
|
+
driverNumber: 13,
|
|
87
|
+
timingName: 'Noir',
|
|
88
|
+
driver: { pace: 68, racecraft: 83, aggression: 61, riskTolerance: 72, patience: 57, consistency: 64 },
|
|
89
|
+
vehicle: { id: 'noir-nn13', name: 'NN-13 Shadow', power: 64, braking: 60, aero: 73, dragEfficiency: 57, mechanicalGrip: 69, weightControl: 54, tireCare: 51 },
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
driverId: 'vinyl',
|
|
93
|
+
driverNumber: 33,
|
|
94
|
+
timingName: 'HoloVinyl',
|
|
95
|
+
driver: { pace: 71, racecraft: 66, aggression: 52, riskTolerance: 59, patience: 62, consistency: 58 },
|
|
96
|
+
vehicle: { id: 'vinyl-hv33', name: 'HV-33 Groove', power: 70, braking: 49, aero: 58, dragEfficiency: 74, mechanicalGrip: 52, weightControl: 68, tireCare: 46 },
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
driverId: 'drsorriso',
|
|
100
|
+
driverNumber: 55,
|
|
101
|
+
timingName: 'DrSorriso',
|
|
102
|
+
driver: { pace: 46, racecraft: 69, aggression: 44, riskTolerance: 43, patience: 76, consistency: 73 },
|
|
103
|
+
vehicle: { id: 'sorriso-ds55', name: 'DS-55 Intake', power: 54, braking: 67, aero: 62, dragEfficiency: 49, mechanicalGrip: 71, weightControl: 45, tireCare: 69 },
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
driverId: 'victoria',
|
|
107
|
+
driverNumber: 11,
|
|
108
|
+
timingName: 'VictorIA',
|
|
109
|
+
driver: { pace: 78, racecraft: 79, aggression: 58, riskTolerance: 65, patience: 55, consistency: 68 },
|
|
110
|
+
vehicle: { id: 'victoria-vi11', name: 'VI-11 Vector', power: 76, braking: 58, aero: 65, dragEfficiency: 63, mechanicalGrip: 61, weightControl: 60, tireCare: 48 },
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
driverId: 'reminderz',
|
|
114
|
+
driverNumber: 7,
|
|
115
|
+
timingName: 'ReminderZ',
|
|
116
|
+
driver: { pace: 41, racecraft: 61, aggression: 34, riskTolerance: 39, patience: 85, consistency: 80 },
|
|
117
|
+
vehicle: { id: 'reminderz-rz07', name: 'RZ-07 Recall', power: 42, braking: 76, aero: 50, dragEfficiency: 72, mechanicalGrip: 58, weightControl: 63, tireCare: 88 },
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
driverId: 'clipclop',
|
|
121
|
+
driverNumber: 14,
|
|
122
|
+
timingName: 'ClipClop',
|
|
123
|
+
driver: { pace: 73, racecraft: 88, aggression: 76, riskTolerance: 78, patience: 48, consistency: 61 },
|
|
124
|
+
vehicle: { id: 'clipclop-cc14', name: 'CC-14 Sync', power: 68, braking: 63, aero: 59, dragEfficiency: 61, mechanicalGrip: 78, weightControl: 56, tireCare: 44 },
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
driverId: 'core',
|
|
128
|
+
driverNumber: 91,
|
|
129
|
+
timingName: 'Core',
|
|
130
|
+
driver: { pace: 82, racecraft: 85, aggression: 67, riskTolerance: 74, patience: 53, consistency: 72 },
|
|
131
|
+
vehicle: { id: 'core-ai91', name: 'AI-91 Core', power: 80, braking: 61, aero: 72, dragEfficiency: 59, mechanicalGrip: 75, weightControl: 51, tireCare: 50 },
|
|
132
|
+
},
|
|
133
|
+
];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inventure71/paddockjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A data-driven browser F1 simulator component for host websites.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -70,8 +70,10 @@
|
|
|
70
70
|
"scripts": {
|
|
71
71
|
"test": "vitest run src",
|
|
72
72
|
"types:check": "tsc -p tsconfig.types.json --noEmit",
|
|
73
|
-
"check": "npm test && npm run types:check && npm run pack:dry && npm run showcase:ci",
|
|
73
|
+
"check": "npm test && npm run types:check && npm run pack:dry && npm run consumer:smoke && npm run showcase:ci && npm run browser:smoke",
|
|
74
74
|
"pack:dry": "npm pack --dry-run",
|
|
75
|
+
"consumer:smoke": "node scripts/consumer-package-smoke.mjs",
|
|
76
|
+
"browser:smoke": "node smoke/browser-smoke.mjs",
|
|
75
77
|
"showcase:install": "npm --prefix local-preview ci",
|
|
76
78
|
"showcase:dev": "npm --prefix local-preview run dev",
|
|
77
79
|
"showcase:build": "npm --prefix local-preview run build",
|
|
@@ -86,6 +88,7 @@
|
|
|
86
88
|
},
|
|
87
89
|
"devDependencies": {
|
|
88
90
|
"@changesets/cli": "2.29.7",
|
|
91
|
+
"playwright": "^1.57.0",
|
|
89
92
|
"typescript": "5.9.3",
|
|
90
93
|
"vitest": "4.1.5"
|
|
91
94
|
}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { F1SimulatorApp } from '../app/F1SimulatorApp.js';
|
|
2
|
+
import {
|
|
3
|
+
createRaceDataPanelMarkup,
|
|
4
|
+
createTelemetrySectorBannerMarkup,
|
|
5
|
+
} from '../ui/bannerTemplates.js';
|
|
2
6
|
import {
|
|
3
7
|
createCarDriverOverviewMarkup,
|
|
4
8
|
createCameraControlsMarkup,
|
|
5
9
|
createRaceCanvasMarkup,
|
|
6
10
|
createRaceControlsMarkup,
|
|
7
|
-
createRaceDataPanelMarkup,
|
|
8
11
|
createRaceTelemetryDrawerMarkup,
|
|
9
12
|
createSafetyCarControlMarkup,
|
|
10
13
|
createTelemetryCoreMarkup,
|
|
11
14
|
createTelemetryLapTimesMarkup,
|
|
12
15
|
createTelemetryPanelMarkup,
|
|
13
|
-
createTelemetrySectorBannerMarkup,
|
|
14
16
|
createTelemetrySectorTimesMarkup,
|
|
15
17
|
createTelemetrySectorsMarkup,
|
|
16
18
|
createTimingTowerMarkup,
|
|
@@ -215,6 +217,14 @@ export class PaddockSimulatorController {
|
|
|
215
217
|
this.app?.setSafetyCarDeployed(deployed);
|
|
216
218
|
}
|
|
217
219
|
|
|
220
|
+
setRedFlagDeployed(deployed) {
|
|
221
|
+
this.app?.setRedFlagDeployed?.(deployed);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
setPitLaneOpen(open) {
|
|
225
|
+
this.app?.setPitLaneOpen?.(open);
|
|
226
|
+
}
|
|
227
|
+
|
|
218
228
|
callSafetyCar() {
|
|
219
229
|
this.setSafetyCarDeployed(true);
|
|
220
230
|
}
|
|
@@ -228,6 +238,26 @@ export class PaddockSimulatorController {
|
|
|
228
238
|
this.setSafetyCarDeployed(!active);
|
|
229
239
|
}
|
|
230
240
|
|
|
241
|
+
setPitIntent(driverId, intent, targetCompound) {
|
|
242
|
+
return this.app?.setPitIntent(driverId, intent, targetCompound) ?? false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
getPitIntent(driverId) {
|
|
246
|
+
return this.app?.getPitIntent(driverId) ?? 0;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
getPitTargetCompound(driverId) {
|
|
250
|
+
return this.app?.getPitTargetCompound?.(driverId) ?? null;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
servePenalty(penaltyId) {
|
|
254
|
+
return this.app?.servePenalty(penaltyId) ?? null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
cancelPenalty(penaltyId) {
|
|
258
|
+
return this.app?.cancelPenalty(penaltyId) ?? null;
|
|
259
|
+
}
|
|
260
|
+
|
|
231
261
|
getSnapshot() {
|
|
232
262
|
return this.app?.getSnapshot() ?? null;
|
|
233
263
|
}
|