@inventure71/paddockjs 1.0.0 → 2.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.
Files changed (190) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/INSTALL_AND_UPDATE.md +4 -3
  3. package/README.md +194 -12
  4. package/docs/architecture.md +119 -44
  5. package/docs/concepts.md +4 -2
  6. package/docs/custom_model_controller.md +329 -0
  7. package/docs/data_contract.md +299 -17
  8. package/docs/index.md +1 -0
  9. package/docs/learnings.md +22 -0
  10. package/docs/rules.md +37 -10
  11. package/docs/system_specs.md +23 -10
  12. package/docs/training.md +272 -30
  13. package/examples/python/README.md +62 -0
  14. package/examples/python/base_policy_server.py +191 -0
  15. package/examples/python/requirements.txt +2 -0
  16. package/package.json +12 -4
  17. package/src/api/PaddockSimulatorController.js +4 -0
  18. package/src/app/BrowserExpertAdapter.js +367 -9
  19. package/src/app/F1SimulatorApp.js +305 -1603
  20. package/src/app/banners/bannerFormatters.js +55 -0
  21. package/src/app/banners/raceDataBannerController.js +141 -0
  22. package/src/app/banners/stewardMessageController.js +99 -0
  23. package/src/app/camera/cameraConstants.js +21 -0
  24. package/src/app/camera/cameraController.js +265 -0
  25. package/src/app/camera/cameraGeometry.js +176 -0
  26. package/src/app/domBindings.js +4 -0
  27. package/src/app/readouts/carOverviewRenderer.js +109 -0
  28. package/src/app/readouts/controlStateRenderer.js +37 -0
  29. package/src/app/readouts/raceStatusRenderer.js +133 -0
  30. package/src/app/readouts/readoutFormatters.js +58 -0
  31. package/src/app/readouts/telemetryRenderer.js +113 -0
  32. package/src/app/readouts/timingTowerRenderer.js +177 -0
  33. package/src/app/rendering/appAssets.js +38 -0
  34. package/src/app/rendering/carRenderer.js +286 -0
  35. package/src/app/rendering/displayUtils.js +22 -0
  36. package/src/app/rendering/drsTrailRenderer.js +90 -0
  37. package/src/app/rendering/expertSensorRenderer.js +126 -0
  38. package/src/app/rendering/pitLaneStatusRenderer.js +50 -0
  39. package/src/app/rendering/replayGhostRenderer.js +124 -0
  40. package/src/app/rendering/trackRenderer.js +25 -0
  41. package/src/app/runtime/frameLoop.js +66 -0
  42. package/src/app/runtime/runtimeTiming.js +34 -0
  43. package/src/app/runtime/runtimeVisibility.js +45 -0
  44. package/src/config/defaultOptions.js +20 -0
  45. package/src/environment/actions.js +13 -5
  46. package/src/environment/controllerLoop.js +246 -0
  47. package/src/environment/episode.js +86 -2
  48. package/src/environment/evaluation.js +54 -32
  49. package/src/environment/index.d.ts +361 -9
  50. package/src/environment/index.js +1 -0
  51. package/src/environment/metrics.js +159 -0
  52. package/src/environment/observationOptions.js +22 -1
  53. package/src/environment/observations.js +325 -40
  54. package/src/environment/options.js +37 -5
  55. package/src/environment/runtime.js +222 -21
  56. package/src/environment/scenarios.js +37 -8
  57. package/src/environment/sensors/bodySenses.js +23 -0
  58. package/src/environment/sensors/boundarySenses.js +17 -0
  59. package/src/environment/sensors/carRays.js +75 -0
  60. package/src/environment/sensors/contactSenses.js +32 -0
  61. package/src/environment/sensors/index.js +157 -0
  62. package/src/environment/sensors/indexedRayBands.js +103 -0
  63. package/src/environment/sensors/nearbyCars.js +52 -0
  64. package/src/environment/sensors/opponentRadar.js +65 -0
  65. package/src/environment/sensors/rayConfig.js +110 -0
  66. package/src/environment/sensors/rayDefaults.js +6 -0
  67. package/src/environment/sensors/rayGeometry.js +60 -0
  68. package/src/environment/sensors/rayGuards.js +19 -0
  69. package/src/environment/sensors/sensorTargets.js +60 -0
  70. package/src/environment/sensors/surfaceRays.js +296 -0
  71. package/src/environment/sensors/trackRays.js +261 -0
  72. package/src/environment/sensors.js +1 -367
  73. package/src/environment/specs.js +100 -5
  74. package/src/environment/workerProtocol.js +13 -1
  75. package/src/index.d.ts +169 -6
  76. package/src/index.js +5 -0
  77. package/src/rendering/proceduralTrackAsset.js +20 -823
  78. package/src/rendering/renderSnapshot.js +38 -12
  79. package/src/rendering/track/finishLineRenderer.js +34 -0
  80. package/src/rendering/track/gridRenderer.js +47 -0
  81. package/src/rendering/track/offsetStrokeSafety.js +136 -0
  82. package/src/rendering/track/pitLaneRenderer.js +248 -0
  83. package/src/rendering/track/trackMaterialRenderer.js +326 -0
  84. package/src/rendering/track/trackRenderConstants.js +38 -0
  85. package/src/rendering/track/trackRenderGeometry.js +94 -0
  86. package/src/simulation/collisionGeometry.js +1 -1
  87. package/src/simulation/driver/driverControlConstants.js +28 -0
  88. package/src/simulation/driver/driverController.js +47 -0
  89. package/src/simulation/driver/driverInput.js +28 -0
  90. package/src/simulation/driver/driverMath.js +6 -0
  91. package/src/simulation/driver/driverPersonality.js +25 -0
  92. package/src/simulation/driver/edgeRecovery.js +48 -0
  93. package/src/simulation/driver/racingControls.js +399 -0
  94. package/src/simulation/driver/racingLinePlan.js +166 -0
  95. package/src/simulation/driver/recoveryDynamics.js +38 -0
  96. package/src/simulation/driver/rejoinControls.js +213 -0
  97. package/src/simulation/driver/safetyCarControls.js +35 -0
  98. package/src/simulation/driver/trafficScan.js +51 -0
  99. package/src/simulation/driverController.js +4 -619
  100. package/src/simulation/participants/participantInteractions.js +120 -0
  101. package/src/simulation/pit/pitFlow.js +234 -0
  102. package/src/simulation/pit/pitIntent.js +92 -0
  103. package/src/simulation/pit/pitOccupancy.js +47 -0
  104. package/src/simulation/pit/pitPenaltyService.js +71 -0
  105. package/src/simulation/pit/pitQueue.js +55 -0
  106. package/src/simulation/pit/pitRouteMovement.js +160 -0
  107. package/src/simulation/pit/pitRouting.js +319 -0
  108. package/src/simulation/pit/pitService.js +41 -0
  109. package/src/simulation/pit/pitServiceConstants.js +21 -0
  110. package/src/simulation/pit/pitServiceProfile.js +45 -0
  111. package/src/simulation/pit/pitSnapshots.js +61 -0
  112. package/src/simulation/pit/pitState.js +113 -0
  113. package/src/simulation/pit/pitTireService.js +92 -0
  114. package/src/simulation/race/classification.js +104 -0
  115. package/src/simulation/race/gridPenalties.js +37 -0
  116. package/src/simulation/race/raceControlState.js +38 -0
  117. package/src/simulation/race/raceDistance.js +32 -0
  118. package/src/simulation/race/raceFinish.js +65 -0
  119. package/src/simulation/race/raceLifecycle.js +71 -0
  120. package/src/simulation/race/raceOrder.js +113 -0
  121. package/src/simulation/race/raceProgress.js +124 -0
  122. package/src/simulation/race/raceSetup.js +93 -0
  123. package/src/simulation/race/raceStep.js +80 -0
  124. package/src/simulation/race/redFlag.js +15 -0
  125. package/src/simulation/race/retirements.js +44 -0
  126. package/src/simulation/race/safetyCar.js +86 -0
  127. package/src/simulation/race/stalledDnf.js +86 -0
  128. package/src/simulation/raceSimulation.js +230 -2817
  129. package/src/simulation/replay/replayGhosts.js +128 -0
  130. package/src/simulation/rules/moduleConfig.js +72 -0
  131. package/src/simulation/rules/penaltyConfig.js +99 -0
  132. package/src/simulation/rules/penaltyEvents.js +18 -0
  133. package/src/simulation/rules/penaltyStats.js +26 -0
  134. package/src/simulation/rules/ruleConfigMerge.js +41 -0
  135. package/src/simulation/rules/ruleDefaults.js +85 -0
  136. package/src/simulation/rules/rulesReview.js +141 -0
  137. package/src/simulation/rules/rulesetPresets.js +47 -0
  138. package/src/simulation/rules/trackLimitsSteward.js +1 -1
  139. package/src/simulation/rulesConfig.js +5 -323
  140. package/src/simulation/snapshots/raceSnapshots.js +192 -0
  141. package/src/simulation/timing/drsTiming.js +87 -0
  142. package/src/simulation/timing/gapEstimation.js +38 -0
  143. package/src/simulation/timing/lapTelemetry.js +182 -0
  144. package/src/simulation/timing/raceTiming.js +15 -0
  145. package/src/simulation/timing/sectorPerformance.js +60 -0
  146. package/src/simulation/timing/timingConstants.js +5 -0
  147. package/src/simulation/timing/timingHistory.js +46 -0
  148. package/src/simulation/timing/timingLines.js +79 -0
  149. package/src/simulation/track/centerlineSpline.js +59 -0
  150. package/src/simulation/track/drsZones.js +67 -0
  151. package/src/simulation/track/pitLaneAccess.js +103 -0
  152. package/src/simulation/track/pitLaneLayout.js +395 -0
  153. package/src/simulation/track/pitLaneState.js +160 -0
  154. package/src/simulation/track/proceduralCenterline.js +237 -0
  155. package/src/simulation/track/sampleGeometry.js +49 -0
  156. package/src/simulation/track/spatialQueries.js +154 -0
  157. package/src/simulation/track/startStraight.js +141 -0
  158. package/src/simulation/track/trackConstants.js +109 -0
  159. package/src/simulation/track/trackGenerationOptions.js +283 -0
  160. package/src/simulation/track/trackMath.js +241 -0
  161. package/src/simulation/track/trackModel.js +240 -0
  162. package/src/simulation/track/trackQueryIndex.js +945 -0
  163. package/src/simulation/track/trackSectors.js +19 -0
  164. package/src/simulation/track/trackStatePolicy.js +24 -0
  165. package/src/simulation/track/trackValidation.js +98 -0
  166. package/src/simulation/trackModel.js +1 -1706
  167. package/src/simulation/vehicle/contactResolution.js +116 -0
  168. package/src/simulation/vehicle/mainTrackWheelSurface.js +82 -0
  169. package/src/simulation/vehicle/pitWheelSurface.js +69 -0
  170. package/src/simulation/vehicle/runoffResponse.js +88 -0
  171. package/src/simulation/vehicle/surfacePriority.js +28 -0
  172. package/src/simulation/vehicle/vehicleGeometry.js +247 -0
  173. package/src/simulation/vehicle/vehiclePhysics.js +363 -0
  174. package/src/simulation/vehicle/vehicleSnapshots.js +316 -0
  175. package/src/simulation/vehicle/vehicleState.js +186 -0
  176. package/src/simulation/vehicle/wheelSurface.js +150 -0
  177. package/src/simulation/vehicleGeometry.js +1 -247
  178. package/src/simulation/vehiclePhysics.js +1 -136
  179. package/src/simulation/warmup/runtimeWarmup.js +224 -0
  180. package/src/simulation/wheelSurface.js +1 -338
  181. package/src/styles.css +42 -0
  182. package/src/ui/cameraControlsTemplate.js +20 -0
  183. package/src/ui/carOverviewTemplate.js +33 -0
  184. package/src/ui/componentTemplates.js +14 -360
  185. package/src/ui/raceCanvasTemplate.js +69 -0
  186. package/src/ui/raceControlsTemplate.js +36 -0
  187. package/src/ui/shellTemplate.js +5 -4
  188. package/src/ui/telemetryDrawerTemplate.js +55 -0
  189. package/src/ui/telemetryTemplates.js +136 -0
  190. package/src/ui/timingTowerTemplate.js +34 -0
package/src/index.d.ts CHANGED
@@ -1,8 +1,76 @@
1
- import type { PaddockActionSpec, PaddockObservationSpec } from './environment/index.js';
2
-
3
- export type { PaddockActionSpec, PaddockObservationSpec } from './environment/index.js';
1
+ import type {
2
+ PaddockActionSpec,
3
+ PaddockDriverControllerLoop,
4
+ PaddockDriverControllerLoopOptions,
5
+ PaddockObservationSpec,
6
+ PaddockParticipantInteraction as EnvPaddockParticipantInteraction,
7
+ PaddockParticipantInteractionsOptions as EnvPaddockParticipantInteractionsOptions,
8
+ PaddockParticipantInteractionOverride as EnvPaddockParticipantInteractionOverride,
9
+ PaddockParticipantInteractionProfile as EnvPaddockParticipantInteractionProfile,
10
+ PaddockReplayGhostOptions as EnvPaddockReplayGhostOptions,
11
+ PaddockReplayGhostSnapshot as EnvPaddockReplayGhostSnapshot,
12
+ PaddockReplayGhostTrajectorySample as EnvPaddockReplayGhostTrajectorySample,
13
+ } from './environment/index.js';
14
+
15
+ export type {
16
+ PaddockActionSpec,
17
+ PaddockControllerRuntime,
18
+ PaddockDriverController,
19
+ PaddockDriverControllerContext,
20
+ PaddockDriverControllerLoop,
21
+ PaddockDriverControllerLoopOptions,
22
+ PaddockObservationSpec,
23
+ } from './environment/index.js';
4
24
 
5
25
  export type TireCompound = 'S' | 'M' | 'H';
26
+ export type PaddockPhysicsMode = 'arcade' | 'simulator';
27
+ export type PaddockWarmupPolicy = 'config-change' | 'always' | 'never';
28
+ export type PaddockProceduralTrackProfile = 'race' | 'training-short' | 'training-medium' | 'training-technical';
29
+
30
+ export interface PaddockWarmupOptions {
31
+ enabled?: boolean;
32
+ policy?: PaddockWarmupPolicy;
33
+ steps?: number;
34
+ }
35
+
36
+ export interface PaddockProceduralTrackOptions {
37
+ profile?: PaddockProceduralTrackProfile;
38
+ minLengthMeters?: number;
39
+ maxLengthMeters?: number;
40
+ startStraightMeters?: number;
41
+ includePitLane?: boolean;
42
+ length?: {
43
+ minMeters?: number;
44
+ maxMeters?: number;
45
+ };
46
+ startStraight?: {
47
+ gridMeters?: number;
48
+ exitMeters?: number;
49
+ blendMeters?: number;
50
+ lockExtraMeters?: number;
51
+ };
52
+ pitLane?: {
53
+ enabled?: boolean;
54
+ };
55
+ shape?: {
56
+ scale?: number;
57
+ cornerDensity?: number;
58
+ variation?: number;
59
+ };
60
+ validation?: {
61
+ minClearanceMultiplier?: number;
62
+ minShapeVariation?: number;
63
+ minNonAdjacentArcMeters?: number;
64
+ maxLocalTurnRadians?: number;
65
+ maxSampleHeadingDeltaRadians?: number;
66
+ };
67
+ attempts?: {
68
+ primary?: number;
69
+ fallback?: number;
70
+ };
71
+ }
72
+
73
+ export type PaddockStabilityState = 'stable' | 'understeer' | 'oversteer' | 'spin-risk' | 'destroyed';
6
74
  export type PaddockPitIntent = 0 | 1 | 2;
7
75
  export type PaddockPitIntentRequest = PaddockPitIntent | {
8
76
  intent?: PaddockPitIntent;
@@ -23,6 +91,13 @@ export type CameraControlsMode = 'embedded' | 'external' | false;
23
91
  export type PaddockPresetName = 'dashboard' | 'timing-overlay' | 'compact-race' | 'full-dashboard';
24
92
  export type TelemetryModuleName = 'core' | 'sectors' | 'lapTimes' | 'sectorTimes';
25
93
  export type SectorPerformanceStatus = 'overall-best' | 'personal-best' | 'slower';
94
+ export type PaddockParticipantInteractionProfile = EnvPaddockParticipantInteractionProfile;
95
+ export type PaddockParticipantInteraction = EnvPaddockParticipantInteraction;
96
+ export type PaddockParticipantInteractionOverride = EnvPaddockParticipantInteractionOverride;
97
+ export type PaddockParticipantInteractionsOptions = EnvPaddockParticipantInteractionsOptions;
98
+ export type PaddockReplayGhostTrajectorySample = EnvPaddockReplayGhostTrajectorySample;
99
+ export type PaddockReplayGhostOptions = EnvPaddockReplayGhostOptions;
100
+ export type PaddockReplayGhostSnapshot = EnvPaddockReplayGhostSnapshot;
26
101
 
27
102
  export interface CustomField {
28
103
  label: string;
@@ -208,6 +283,10 @@ export interface F1SimulatorUiOptions {
208
283
  timingTowerVerticalFit?: TimingTowerVerticalFit;
209
284
  }
210
285
 
286
+ export interface F1SimulatorDebugOptions {
287
+ physicsModeIndicator?: boolean;
288
+ }
289
+
211
290
  export interface TrackTextureAssets {
212
291
  asphalt?: string;
213
292
  }
@@ -437,6 +516,16 @@ export interface PaddockTireStrategyRules {
437
516
  mandatoryDistinctDryCompounds?: number | null;
438
517
  }
439
518
 
519
+ export interface PaddockTireDegradationRules {
520
+ enabled?: boolean;
521
+ }
522
+
523
+ export interface PaddockStalledDnfRules {
524
+ enabled?: boolean;
525
+ maxStoppedSeconds?: number;
526
+ speedThresholdKph?: number;
527
+ }
528
+
440
529
  export interface PaddockPenaltySubsectionRules {
441
530
  strictness?: number;
442
531
  timePenaltySeconds?: number;
@@ -484,6 +573,8 @@ export interface PaddockPenaltyRules {
484
573
  export interface PaddockRaceModules {
485
574
  pitStops?: PaddockPitStopRules;
486
575
  tireStrategy?: PaddockTireStrategyRules;
576
+ tireDegradation?: PaddockTireDegradationRules;
577
+ stalledDnf?: PaddockStalledDnfRules;
487
578
  penalties?: PaddockPenaltyRules;
488
579
  weather?: { enabled?: boolean };
489
580
  reliability?: { enabled?: boolean };
@@ -549,19 +640,28 @@ export interface WheelSurfaceSnapshot {
549
640
 
550
641
  export interface CarSnapshot {
551
642
  id: string;
552
- rank: number;
643
+ rank: number | null;
553
644
  code: string;
554
645
  timingCode: string;
555
646
  name: string;
556
647
  color: string;
557
648
  tire: TireCompound;
649
+ interaction?: PaddockParticipantInteraction;
558
650
  lap: number;
559
651
  speedKph: number;
560
652
  finishRank?: number | null;
561
- status?: 'racing' | 'waved-flag' | string;
562
- raceStatus?: 'racing' | 'waved-flag' | string;
653
+ status?: 'racing' | 'waved-flag' | 'destroyed' | string;
654
+ raceStatus?: 'racing' | 'waved-flag' | 'destroyed' | string;
563
655
  wavedFlag?: boolean;
564
656
  finished?: boolean;
657
+ destroyed?: boolean;
658
+ destroyReason?: string | null;
659
+ destroyedAt?: number | null;
660
+ dnf?: boolean;
661
+ dnfReason?: string | null;
662
+ dnfAt?: number | null;
663
+ dnfOrder?: number | null;
664
+ outOfRace?: boolean;
565
665
  finishTime?: number | null;
566
666
  penaltySeconds?: number;
567
667
  adjustedFinishTime?: number | null;
@@ -573,6 +673,12 @@ export interface CarSnapshot {
573
673
  leaderGapLaps?: number;
574
674
  lapTelemetry?: LapTelemetrySnapshot;
575
675
  surface?: string;
676
+ lateralG?: number;
677
+ longitudinalG?: number;
678
+ gripUsage?: number;
679
+ slipAngleRadians?: number;
680
+ tractionLimited?: boolean;
681
+ stabilityState?: PaddockStabilityState;
576
682
  signedOffset?: number;
577
683
  crossTrackError?: number;
578
684
  inPitLane?: boolean;
@@ -593,6 +699,10 @@ export interface RaceClassificationEntry {
593
699
  lap: number;
594
700
  finished: boolean;
595
701
  finishTime?: number | null;
702
+ dnf?: boolean;
703
+ dnfReason?: string | null;
704
+ dnfAt?: number | null;
705
+ dnfOrder?: number | null;
596
706
  penaltySeconds?: number;
597
707
  adjustedFinishTime?: number | null;
598
708
  gapLaps?: number;
@@ -604,6 +714,7 @@ export interface RaceClassificationEntry {
604
714
 
605
715
  export interface RaceSnapshot {
606
716
  time: number;
717
+ physicsMode: PaddockPhysicsMode;
607
718
  world: {
608
719
  width: number;
609
720
  height: number;
@@ -646,6 +757,7 @@ export interface RaceSnapshot {
646
757
  events: RaceEvent[];
647
758
  penalties: PaddockPenaltyEntry[];
648
759
  cars: CarSnapshot[];
760
+ replayGhosts: PaddockReplayGhostSnapshot[];
649
761
  }
650
762
 
651
763
  export interface LifecycleErrorContext {
@@ -679,6 +791,8 @@ export interface F1SimulatorExpertOptions {
679
791
  frameSkip?: number;
680
792
  visualizeSensors?: boolean | {
681
793
  rays?: boolean;
794
+ drivers?: 'selected' | 'all' | string[];
795
+ selectedDriverId?: string;
682
796
  };
683
797
  }
684
798
 
@@ -691,13 +805,51 @@ export interface F1SimulatorExpertAction {
691
805
  pitTargetCompound?: TireCompound | string;
692
806
  }
693
807
 
808
+ export interface PaddockExternalRenderFrame {
809
+ snapshot: RaceSnapshot;
810
+ observation: Record<string, unknown>;
811
+ meta?: Record<string, unknown> | null;
812
+ }
813
+
814
+ export interface PaddockExternalRendererSource {
815
+ subscribe(onFrame: (frame: PaddockExternalRenderFrame) => void): () => void;
816
+ }
817
+
818
+ export interface PaddockExternalRendererState {
819
+ attached: boolean;
820
+ lastMeta: Record<string, unknown> | null;
821
+ lastFrameAt: number | null;
822
+ lastError: string | null;
823
+ }
824
+
825
+ export interface PaddockScenarioPlacement {
826
+ distanceMeters?: number;
827
+ startDistanceMeters?: number;
828
+ offsetMeters?: number;
829
+ speedKph?: number;
830
+ headingErrorRadians?: number;
831
+ }
832
+
833
+ export interface PaddockEnvironmentResultOptions {
834
+ stateOutput?: 'full' | 'minimal' | 'none';
835
+ observationScope?: 'all' | 'reset';
836
+ resetDriversObservationScope?: 'all' | 'reset';
837
+ }
838
+
694
839
  export interface F1SimulatorExpertApi {
695
840
  reset(options?: unknown): unknown;
696
841
  step(actions: Record<string, F1SimulatorExpertAction>): unknown;
842
+ resetDrivers?(
843
+ placements: Record<string, PaddockScenarioPlacement>,
844
+ resultOptions?: PaddockEnvironmentResultOptions
845
+ ): unknown;
697
846
  getObservation(): unknown;
698
847
  getState(): unknown;
699
848
  getActionSpec(): PaddockActionSpec;
700
849
  getObservationSpec(): PaddockObservationSpec;
850
+ attachExternalRenderer(source: PaddockExternalRendererSource): void;
851
+ detachExternalRenderer(): void;
852
+ getExternalRendererState(): PaddockExternalRendererState;
701
853
  destroy(): void;
702
854
  }
703
855
 
@@ -707,8 +859,14 @@ export interface F1SimulatorOptions extends F1SimulatorCallbacks {
707
859
  entries?: ChampionshipEntryBlueprint[];
708
860
  seed?: number;
709
861
  trackSeed?: number;
862
+ trackGeneration?: PaddockProceduralTrackOptions;
863
+ trackQueryIndex?: boolean;
864
+ warmup?: PaddockWarmupOptions | boolean;
710
865
  totalLaps?: number;
866
+ physicsMode?: PaddockPhysicsMode;
711
867
  rules?: PaddockRaceRules;
868
+ participantInteractions?: PaddockParticipantInteractionsOptions;
869
+ replayGhosts?: PaddockReplayGhostOptions[];
712
870
  initialCameraMode?: CameraMode;
713
871
  theme?: F1SimulatorTheme;
714
872
  title?: string;
@@ -717,6 +875,7 @@ export interface F1SimulatorOptions extends F1SimulatorCallbacks {
717
875
  backLinkLabel?: string;
718
876
  showBackLink?: boolean;
719
877
  ui?: F1SimulatorUiOptions;
878
+ debug?: F1SimulatorDebugOptions;
720
879
  assets?: F1SimulatorAssets;
721
880
  expert?: F1SimulatorExpertOptions;
722
881
  }
@@ -754,6 +913,7 @@ export interface F1MountedSimulator {
754
913
  setPitIntent(driverId: string, intent: PaddockPitIntentRequest, targetCompound?: TireCompound | string): boolean;
755
914
  getPitIntent(driverId: string): PaddockPitIntent;
756
915
  getPitTargetCompound(driverId: string): TireCompound | string | null;
916
+ getSimulationSpeed(): number;
757
917
  servePenalty(penaltyId: string): PaddockPenaltyEntry | null;
758
918
  cancelPenalty(penaltyId: string): PaddockPenaltyEntry | null;
759
919
  getSnapshot(): RaceSnapshot | null;
@@ -790,6 +950,7 @@ export interface PaddockSimulatorController {
790
950
  setPitIntent(driverId: string, intent: PaddockPitIntentRequest, targetCompound?: TireCompound | string): boolean;
791
951
  getPitIntent(driverId: string): PaddockPitIntent;
792
952
  getPitTargetCompound(driverId: string): TireCompound | string | null;
953
+ getSimulationSpeed(): number;
793
954
  servePenalty(penaltyId: string): PaddockPenaltyEntry | null;
794
955
  cancelPenalty(penaltyId: string): PaddockPenaltyEntry | null;
795
956
  getSnapshot(): RaceSnapshot | null;
@@ -826,6 +987,8 @@ export function simSpeedToMetersPerSecond(simSpeed: number): number;
826
987
 
827
988
  export function createPaddockSimulator(options: F1SimulatorOptions): PaddockSimulatorController;
828
989
  export function mountF1Simulator(root: Element, options: F1SimulatorOptions): Promise<F1MountedSimulator>;
990
+ export function createProceduralTrack(seed?: number | string, options?: PaddockProceduralTrackOptions): unknown;
991
+ export function createPaddockDriverControllerLoop(options: PaddockDriverControllerLoopOptions): PaddockDriverControllerLoop;
829
992
 
830
993
  export function mountRaceControls<T extends Element>(root: T, simulator: PaddockSimulatorController): T;
831
994
  export function mountCameraControls<T extends Element>(root: T, simulator: PaddockSimulatorController): T;
package/src/index.js CHANGED
@@ -30,7 +30,9 @@ export {
30
30
  export { DEMO_PROJECT_DRIVERS } from './data/demoDrivers.js';
31
31
  export { DEFAULT_F1_SIMULATOR_ASSETS } from './config/defaultAssets.js';
32
32
  export { PADDOCK_SIMULATOR_PRESETS } from './config/defaultOptions.js';
33
+ export { createPaddockDriverControllerLoop } from './environment/controllerLoop.js';
33
34
  export { normalizeSimulatorDrivers } from './data/normalizeDrivers.js';
35
+ export { createProceduralTrack } from './simulation/track/trackModel.js';
34
36
  export {
35
37
  REAL_F1_CAR_LENGTH_METERS,
36
38
  SIM_UNITS_PER_METER,
@@ -134,6 +136,9 @@ export async function mountF1Simulator(root, options = {}) {
134
136
  getPitTargetCompound(driverId) {
135
137
  return app.getPitTargetCompound(driverId);
136
138
  },
139
+ getSimulationSpeed() {
140
+ return app.simulationSpeed;
141
+ },
137
142
  servePenalty(penaltyId) {
138
143
  return app.servePenalty(penaltyId);
139
144
  },