@inventure71/paddockjs 4.1.0 → 4.2.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 +42 -0
- package/INSTALL_AND_UPDATE.md +9 -2
- package/README.md +4 -2
- package/docs/architecture.md +2 -0
- package/docs/component_inventory.md +1 -1
- package/docs/getting-started.md +3 -0
- package/docs/index.md +4 -2
- package/docs/loading.md +141 -0
- package/docs/system_specs.md +4 -1
- package/docs/testing-reliability-guide.md +62 -0
- package/package.json +5 -7
- package/src/data/index.d.ts +64 -1
- package/src/environment/index.d.ts +75 -12
- package/src/index.d.ts +72 -6
- package/src/simulation/collisionGeometry.js +7 -9
- package/src/simulation/driver/driverController.js +2 -2
- package/src/simulation/driver/edgeRecovery.js +2 -2
- package/src/simulation/driver/racingControls.js +35 -25
- package/src/simulation/driver/racingLinePlan.js +6 -5
- package/src/simulation/driver/rejoinControls.js +3 -3
- package/src/simulation/driver/trafficScan.js +48 -22
- package/src/simulation/participants/participantInteractions.js +24 -15
- package/src/simulation/race/raceStep.js +19 -10
- package/src/simulation/race/safetyCar.js +2 -1
- package/src/simulation/rules/pitLaneSpeedingSteward.js +1 -1
- package/src/simulation/rules/rulesReview.js +19 -9
- package/src/simulation/rules/trackLimitsSteward.js +2 -2
- package/src/simulation/timing/sectorPerformance.js +11 -3
- package/src/simulation/track/spatialQueries.js +80 -11
- package/src/simulation/track/trackModel.js +10 -1
- package/src/simulation/vehicle/contactResolution.js +4 -4
- package/src/simulation/vehicle/vehicleGeometry.js +87 -49
- package/src/simulation/vehicle/vehiclePhysics.js +7 -2
- package/src/simulation/vehicle/vehicleSnapshots.js +5 -2
- package/src/simulation/vehicle/vehicleState.js +3 -2
- package/src/ui/raceCanvasTemplate.js +3 -2
- package/examples/train-basic-policy.mjs +0 -276
- package/examples/trainingData.mjs +0 -133
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Tighten the package boundary around supported simulator, environment, display, data, and Python policy-server example surfaces. Local JavaScript training experiments now live outside the published package surface, and release-facing docs no longer advertise the removed local starter trainer as packaged guidance.
|
|
8
|
+
- Keep browser expert resets aligned with the resolved `physicsMode` and harden unsupported physics-mode handling so documented hosts continue to use only `arcade` or `advanced`.
|
|
9
|
+
- Add stricter CLI validation for release and diagnostic scripts. Browser smoke, consumer smoke, bundle-boundary checks, runtime benchmarks, track-query benchmarks, and hotspot profiling now provide clean help output and reject unknown or conflicting arguments before running expensive work.
|
|
10
|
+
- Clean up showcase/package-boundary examples so rendered snippets import only public package symbols and leave preview-local policy adapters as host-owned code.
|
|
11
|
+
|
|
12
|
+
### Performance And Runtime
|
|
13
|
+
|
|
14
|
+
- Reduce hot-loop allocations in built-in driver control by reusing racing-line profiles, traffic scan entries, lookahead sample objects, and target-point scratch while preserving the same steering/throttle/brake action contract.
|
|
15
|
+
- Add allocation-light track sampling helpers and a prepared sample-index lookup table so repeated `pointAt`/heading/curvature queries avoid binary-search and temporary-object churn on the common simulation paths.
|
|
16
|
+
- Reuse vehicle geometry, body AABB, swept AABB, and interpolated body-shape containers across collision and render paths instead of rebuilding geometry wrappers and axis objects every step.
|
|
17
|
+
- Reuse participant-interaction serialization for render snapshots and avoid repeated spread/object reconstruction in participant interaction resolution.
|
|
18
|
+
- Reduce per-step race/rules/timing churn by replacing transient race-order maps, steward review spreads, repeated inactive-steward state objects, and sector serialization maps with pooled or direct loop paths.
|
|
19
|
+
- Keep advanced/simulator-mode checks behind one helper so browser expert resets, red-flag release, collision damping, driver stabilization, and external state placement stay aligned with the documented `physicsMode` contract.
|
|
20
|
+
|
|
21
|
+
### Fixes And Hardening
|
|
22
|
+
|
|
23
|
+
- Preserve the resolved advanced physics mode when the browser expert adapter resets its environment, so expert-controlled browser runs do not silently fall back to arcade behavior.
|
|
24
|
+
- Keep unsupported browser and headless `physicsMode` values normalized to `arcade`, including explicit regression coverage for both surfaces.
|
|
25
|
+
- Carry optional `driverModel` metadata from driver or vehicle input into runtime car state for host-owned model/controller bookkeeping without adding a package-owned model loader.
|
|
26
|
+
- Tighten the environment performance characterization threshold for vector/object observation runs so ray-enabled physical-driver observations remain under the fixed local timing budget.
|
|
27
|
+
|
|
28
|
+
### Showcase And Tooling
|
|
29
|
+
|
|
30
|
+
- Add a playable-preview physics selector so the keyboard workbench can switch between arcade and advanced physics through the same documented query-parameter path as the rest of the preview.
|
|
31
|
+
- Add the `scripts/profile-hotspots.mjs` local profiling helper for advanced-mode race hot spots, with validated `--steps`, `--help`, and extra-argument handling.
|
|
32
|
+
- Split browser-smoke and runtime-benchmark argument parsing into focused helpers with direct unit coverage, and extend script coverage across consumer smoke, bundle-boundary, track-query benchmark, and profiler entrypoints.
|
|
33
|
+
- Keep the packed release contents focused on published package assets, docs, Python policy-server examples, source modules, public styles, and placeholder assets.
|
|
34
|
+
|
|
35
|
+
### Migration Notes
|
|
36
|
+
|
|
37
|
+
- No breaking host migration is required from `4.1.0`.
|
|
38
|
+
- Supported browser mounts, composable mounts, `@inventure71/paddockjs/environment`, `@inventure71/paddockjs/data`, and `@inventure71/paddockjs/placeholder` keep their documented public import contracts.
|
|
39
|
+
- Hosts should not depend on removed repository-local JavaScript training scripts or preview-only policy helper names. Use the documented environment API, custom model controller guide, or Python policy-server bridge for external training and policy integration.
|
|
40
|
+
|
|
41
|
+
### Verification Notes
|
|
42
|
+
|
|
43
|
+
- The final release gate is `npm run check:release`.
|
|
44
|
+
|
|
3
45
|
## 4.1.0
|
|
4
46
|
|
|
5
47
|
### Minor Changes
|
package/INSTALL_AND_UPDATE.md
CHANGED
|
@@ -114,16 +114,22 @@ npm run check
|
|
|
114
114
|
Install a specific version when the host needs a controlled upgrade:
|
|
115
115
|
|
|
116
116
|
```bash
|
|
117
|
-
npm install @inventure71/paddockjs@4.
|
|
117
|
+
npm install @inventure71/paddockjs@4.2.0
|
|
118
118
|
npm run check
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
After updating, smoke-test the page that mounts the simulator. Browser behavior changes should be checked in the consuming host, because host CSS, container size, and route handling are outside the package.
|
|
122
122
|
|
|
123
|
+
### 4.2.0 Migration Notes
|
|
124
|
+
|
|
125
|
+
- No breaking host migration is required from `4.1.0`.
|
|
126
|
+
- Browser mounts, composable mounts, `@inventure71/paddockjs/environment`, `@inventure71/paddockjs/data`, and `@inventure71/paddockjs/placeholder` keep their documented public import contracts.
|
|
127
|
+
- Do not rely on repository-local JavaScript trainer scripts or preview-only policy helper names as package API. Local model experiments belong outside the package surface; production integrations should use the documented environment API, custom model controller guide, or Python policy-server bridge.
|
|
128
|
+
|
|
123
129
|
### 4.1.0 Migration Notes
|
|
124
130
|
|
|
125
131
|
- No breaking host migration is required from `4.0.0`.
|
|
126
|
-
- Hosts that want visible simulator startup UI before the full PaddockJS browser bundle downloads can render the new `@inventure71/paddockjs/placeholder` HTML helper with the optional `@inventure71/paddockjs/placeholder.css` stylesheet. This placeholder subpath is intentionally independent of PixiJS, simulator assets, root runtime CSS, and the browser mount.
|
|
132
|
+
- Hosts that want visible simulator startup UI before the full PaddockJS browser bundle downloads can render the new `@inventure71/paddockjs/placeholder` HTML helper with the optional `@inventure71/paddockjs/placeholder.css` stylesheet. This placeholder subpath is intentionally independent of PixiJS, simulator assets, root runtime CSS, and the browser mount. Static HTML hosts should generate the placeholder HTML during their build and copy the CSS into their static output; see [Startup Loading](docs/loading.md).
|
|
127
133
|
- Existing `mountF1Simulator()` and composable `mount*()` integrations keep their normal automatic package loading overlays after PaddockJS JavaScript starts.
|
|
128
134
|
|
|
129
135
|
### 4.0.0 Migration Notes
|
|
@@ -151,6 +157,7 @@ The package repo owns its release process:
|
|
|
151
157
|
- `npm run check` runs docs checks, fast runtime tests, public type verification, dry-pack verification, packed-consumer install/build verification, the tracked showcase build, and a quick Chromium browser smoke test.
|
|
152
158
|
- `npm run check:release` runs the exhaustive release gate, including slow characterization tests and the full Chromium browser smoke matrix.
|
|
153
159
|
- `npm run consumer:smoke` packs the package, installs the tarball into a fresh temporary Vite app, and builds that app through public package imports.
|
|
160
|
+
- `npm run consumer:bundle-boundaries` packs the package, installs the tarball into a fresh temporary Vite app, and verifies the root browser import remains the CSS/asset-owning simulator bundle while `/placeholder`, `/data`, and `/environment` stay CSS-free or lightweight according to their documented roles.
|
|
154
161
|
- `npm run browser:smoke` builds `local-preview`, starts a local preview server, and checks desktop/mobile canvas rendering, overflow constraints, API buttons, and visual policy-runner stepping in Chromium. Use `npm run browser:smoke:quick` for the smaller local browser pass and `npm run browser:smoke:full` for the full matrix.
|
|
155
162
|
- `npm run changeset` records the next version bump and changelog note.
|
|
156
163
|
- `npm run version-packages` applies pending Changesets locally.
|
package/README.md
CHANGED
|
@@ -82,11 +82,12 @@ if ('requestIdleCallback' in window) {
|
|
|
82
82
|
}
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
`@inventure71/paddockjs/placeholder` does not import PixiJS, simulator assets, package runtime CSS, or the root browser mount. It is intended for the pre-JS/network gap. The full simulator mount replaces that placeholder and then uses the built-in package overlays while PixiJS and the race runtime finish booting.
|
|
85
|
+
`@inventure71/paddockjs/placeholder` does not import PixiJS, simulator assets, package runtime CSS, or the root browser mount. It is intended for the pre-JS/network gap. The full simulator mount replaces that placeholder and then uses the built-in package overlays while PixiJS and the race runtime finish booting. Static HTML hosts should run the placeholder helper in their build step and copy `@inventure71/paddockjs/placeholder.css` into their static output instead of expecting a plain browser page to resolve bare npm imports.
|
|
86
86
|
|
|
87
87
|
Start here:
|
|
88
88
|
|
|
89
89
|
- [Getting Started](docs/getting-started.md): install, browser mount, CSS, assets, host responsibilities, and container sizing.
|
|
90
|
+
- [Startup Loading](docs/loading.md): pre-JS placeholders, package loading overlays, and static-host build-time integration.
|
|
90
91
|
- [Data Contract](docs/data_contract.md): driver, entry, callback, rules, and option shapes.
|
|
91
92
|
- [Troubleshooting](docs/troubleshooting.md): common integration failures and supported checks.
|
|
92
93
|
|
|
@@ -176,11 +177,12 @@ npm run docs:check
|
|
|
176
177
|
npm run check
|
|
177
178
|
npm run check:release
|
|
178
179
|
npm run consumer:smoke
|
|
180
|
+
npm run consumer:bundle-boundaries
|
|
179
181
|
npm run browser:smoke:quick -- --skip-build
|
|
180
182
|
npm run showcase:dev
|
|
181
183
|
```
|
|
182
184
|
|
|
183
|
-
`npm run check` is the normal local gate: docs checks, fast runtime tests, public declarations, dry package contents, packed-package consumption in a fresh Vite app, the showcase build, and a quick Chromium smoke against the showcase. `npm run check:release` adds slow characterization tests and the full browser smoke matrix.
|
|
185
|
+
`npm run check` is the normal local gate: docs checks, fast runtime tests, public declarations, dry package contents, packed-package consumption in a fresh Vite app, packed subpath bundle-boundary checks, the showcase build, and a quick Chromium smoke against the showcase. `npm run check:release` adds slow characterization tests and the full browser smoke matrix.
|
|
184
186
|
|
|
185
187
|
## License
|
|
186
188
|
|
package/docs/architecture.md
CHANGED
|
@@ -281,6 +281,8 @@ Timing maintenance is also kept allocation-light now. Runtime timing writes in `
|
|
|
281
281
|
|
|
282
282
|
`src/simulation/vehicle/vehicleState.js` owns external state mutation from simulator and environment reset APIs. It rejects non-finite numeric partial state and resynchronizes advanced-mode velocity from speed/heading when callers do not provide an explicit velocity vector, so scenario placement and `resetDrivers()` cannot leave stale physics velocity behind.
|
|
283
283
|
|
|
284
|
+
Local model training experiments belong outside the committed package surface. The ignored `training-lab/` folder may hold local trainer scripts, checkpoints, model loaders, and research harnesses, but package modules, preview routes, public exports, published types, and consumer docs must stay focused on simulator/environment/display contracts.
|
|
285
|
+
|
|
284
286
|
`src/simulation/rules/pitLaneSpeedingSteward.js` owns pit-speed-limit review. `raceSimulation.js` calls it after authoritative race-state recalculation so it reads the same pit-lane part classification as snapshots and track-limit stewarding. The steward only checks speed-limited pit-lane parts (`fast-lane`, `working-lane`, service areas, and garage boxes), leaving pit-entry and pit-exit connector roads legal but not speed-limited.
|
|
285
287
|
|
|
286
288
|
Browser mounts generate a fresh procedural seed when `trackSeed` is omitted; explicit procedural track seeds are cached by seed plus resolved generation options so repeated mounts with the same procedural contract do not regenerate or rebuild the same model. The canonical generator owns both the default `race` profile and the smaller training profiles. Profile resolution lives beside the track model, merges `race` defaults, selected profile defaults, and explicit overrides, then feeds the same centerline, validation, start-straight, spatial-query, surface, and physics pipeline. Procedural generation starts from seeded connected coarse region masks, traces the outer boundary, smooths and warps the boundary into centerline controls, validates shape, clearance, local turn accumulation, length, and per-sample heading jumps, and retries with another region-derived control set instead of immediately falling back to an oval control ring when attempts fail.
|
|
@@ -34,7 +34,7 @@ This inventory maps package-owned UI surfaces to their shared bases, owner modul
|
|
|
34
34
|
| Telemetry sector times | `mountTelemetrySectorTimes()` and telemetry stack | `src/ui/telemetryTemplates.js` | Telemetry module class helper, loading overlay, unsupported overlay | `telemetryRenderer.js` | Last/best sector table only. |
|
|
35
35
|
| Car/driver overview | `mountCarDriverOverview()` and optional telemetry stack embed | `src/ui/carOverviewTemplate.js` | Component surface frame helper, overview field slots, loading overlay, unsupported overlay | `domBindings.js` cached field bindings, `carOverviewRenderer.js` | Standalone and stack-embedded variants share identical markup. Runtime toggles vehicle vs driver fields without remounting and updates cached label/value bindings instead of querying each field during render. |
|
|
36
36
|
| Race telemetry drawer | `mountRaceTelemetryDrawer()` and complete preview template | `src/ui/telemetryDrawerTemplate.js` | Component surface frame helper, loading overlay, camera controls, compact safety-car control, race canvas with timing/data panel, telemetry stack, unsupported overlay | `F1SimulatorApp.setTelemetryDrawerOpen()`, `controlStateRenderer.js`, normal race/telemetry renderers | Higher-level mixed template. It intentionally owns toolbar placement, drawer ids, open/closed inert state, and responsive narrow drawer behavior. |
|
|
37
|
-
| Loading overlay | All public startup-capable mounted surfaces, including all-in-one shell children and composable roots | `src/ui/templateUtils.js` | `createLoadingMarkup(label)` | `F1SimulatorApp.completeComponentLoading()` | Removed after startup after the initial frame. Component labels remain surface-specific for accessibility. Pre-JS placeholders are host
|
|
37
|
+
| Loading overlay | All public startup-capable mounted surfaces, including all-in-one shell children and composable roots | `src/ui/templateUtils.js` | `createLoadingMarkup(label)` | `F1SimulatorApp.completeComponentLoading()` | Removed after startup after the initial frame. Component labels remain surface-specific for accessibility. Pre-JS placeholders are rendered by the host before package runtime starts, not by `F1SimulatorApp`. |
|
|
38
38
|
| Pre-JS startup placeholder | `@inventure71/paddockjs/placeholder` and `@inventure71/paddockjs/placeholder.css` | `src/placeholder/index.js`, `src/placeholder.css` | Escaped inert HTML helper, optional tiny CSS start-light animation | Host page before root simulator import | Covers the network/import gap before the root package can render. It must stay independent of PixiJS, simulator assets, root runtime CSS, and app modules. |
|
|
39
39
|
| Unsupported-size overlay | Public mount roots, shell, drawer, race/data/telemetry surfaces | `src/ui/templateUtils.js` | `createUnsupportedSizeMarkup(label)` | `installLayoutSupport()` | Display is driven by measured support state. Minimum size thresholds remain centralized in `layoutSupport.js`. |
|
|
40
40
|
|
package/docs/getting-started.md
CHANGED
|
@@ -68,6 +68,8 @@ await mountF1Simulator(root, { drivers, entries });
|
|
|
68
68
|
|
|
69
69
|
That placeholder covers the time before the full PaddockJS bundle executes. Once the bundle runs, PaddockJS owns the root markup and shows its package loading overlays until the first real simulator frame is ready.
|
|
70
70
|
|
|
71
|
+
Plain static HTML pages cannot resolve bare npm imports such as `@inventure71/paddockjs/placeholder` directly in the browser without a bundler or import map. Static hosts should run `createPaddockLoadingPlaceholder()` in the site build script, inject the generated HTML into the static page, and copy `@inventure71/paddockjs/placeholder.css` into the static output. See [Startup Loading](loading.md) for the bundled and static-host patterns.
|
|
72
|
+
|
|
71
73
|
## CSS
|
|
72
74
|
|
|
73
75
|
Most browser bundlers consume the root package stylesheet automatically. If your host build does not, import the stylesheet explicitly from a browser entry:
|
|
@@ -100,6 +102,7 @@ If a package surface is constrained below its supported size, PaddockJS shows an
|
|
|
100
102
|
## Where To Go Next
|
|
101
103
|
|
|
102
104
|
- Use [Composable Layouts](composable-layouts.md) when the host needs separate package-owned surfaces.
|
|
105
|
+
- Use [Startup Loading](loading.md) when the host needs instant first paint, static HTML integration, or a clearer split between placeholders and runtime overlays.
|
|
103
106
|
- Use [Theming](theming.md) for runtime light/dark sync and token customization.
|
|
104
107
|
- Use [Data Contract](data_contract.md) for full driver, entry, rule, UI, callback, and asset option shapes.
|
|
105
108
|
- Use [Troubleshooting](troubleshooting.md) when a host build or browser smoke fails.
|
package/docs/index.md
CHANGED
|
@@ -7,6 +7,7 @@ Code snippets in the documentation are illustrative host integration fragments u
|
|
|
7
7
|
Start with the consumer task docs:
|
|
8
8
|
|
|
9
9
|
- [Getting Started](getting-started.md): install, browser mount, package CSS, bundled assets, host responsibilities, and container sizing.
|
|
10
|
+
- [Startup Loading](loading.md): pre-JS placeholders, package loading overlays, static-host build-time integration, and unsupported-size placeholders.
|
|
10
11
|
- [Composable Layouts](composable-layouts.md): building host layouts from package-owned simulator surfaces.
|
|
11
12
|
- [Headless Environment](headless-environment.md): browser-free environment imports, expert-mode boundary, and basic stepping.
|
|
12
13
|
- [Data Helpers](data-helpers.md): CSS-free data/tooling imports and procedural track helpers.
|
|
@@ -25,16 +26,17 @@ Reference docs:
|
|
|
25
26
|
- [Custom Model Controller Guide](custom_model_controller.md): how to wrap a trained model as a batched driver controller for browser playback or headless loops.
|
|
26
27
|
- [Architecture](architecture.md): module ownership and data/control flow.
|
|
27
28
|
- [Component Inventory](component_inventory.md): package-owned UI surfaces, shared bases, derived/mixed variants, and remaining intentional duplication.
|
|
29
|
+
- [Testing Reliability Guide](testing-reliability-guide.md): risk-driven test selection, behavior maps, required gates, and audit reporting standards.
|
|
28
30
|
- [Data Model Notes](data_model.md): lower-level simulator data model notes kept with package docs.
|
|
29
31
|
- [Learnings](learnings.md): implementation lessons and layout verification rules learned from simulator integration issues.
|
|
30
32
|
|
|
31
33
|
Common paths:
|
|
32
34
|
|
|
33
|
-
- Installing PaddockJS into a browser host: read [Getting Started](getting-started.md), then [Data Contract](data_contract.md) for full option shapes.
|
|
35
|
+
- Installing PaddockJS into a browser host: read [Getting Started](getting-started.md), [Startup Loading](loading.md), then [Data Contract](data_contract.md) for full option shapes.
|
|
34
36
|
- Upgrading an existing browser host from 2.x-era usage: read [Upgrading Hosts to 4.x](upgrading-hosts-to-3.md), then [Troubleshooting](troubleshooting.md) if the host build fails.
|
|
35
37
|
- Building a package-owned composable layout: read [Composable Layouts](composable-layouts.md), then the sizing and UI options in [Data Contract](data_contract.md).
|
|
36
38
|
- Enabling pits, penalties, tire requirements, safety car, or stalled off-track DNF: read [Rules](rules.md) first. Pit stops require `rules.modules.pitStops.enabled`; `tireStrategy` alone only controls compounds, tire-requirement stewarding, and pit target choices.
|
|
37
39
|
- Connecting a trained model: read [Headless Environment](headless-environment.md), [Bring Your Own Model](training.md), then [Custom Model Controller Guide](custom_model_controller.md). PaddockJS owns observations, actions, specs, scenarios, and browser playback; the host owns the model, reward, storage, and training framework.
|
|
38
|
-
- Changing internals: read [Architecture](architecture.md) before editing source so new code lands in the feature-owned module instead of a facade or compatibility barrel.
|
|
40
|
+
- Changing internals: read [Architecture](architecture.md) before editing source so new code lands in the feature-owned module instead of a facade or compatibility barrel. Read [Testing Reliability Guide](testing-reliability-guide.md) before adding or changing tests.
|
|
39
41
|
|
|
40
42
|
When simulator behavior changes, update the relevant doc in this folder in the same change.
|
package/docs/loading.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Startup Loading
|
|
2
|
+
|
|
3
|
+
PaddockJS has two different startup loading surfaces. They solve different timing problems and should not be treated as interchangeable.
|
|
4
|
+
|
|
5
|
+
## The Two Phases
|
|
6
|
+
|
|
7
|
+
| Phase | When it can appear | Owner | Purpose |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| Pre-JS placeholder | Before the full PaddockJS browser bundle has downloaded, parsed, and imported | Host page, using the optional package placeholder helper/CSS | Give the user immediate lightweight visual feedback during the network/import gap |
|
|
10
|
+
| Package loading overlays | After `mountF1Simulator()` or a composable `mount*()` call starts | PaddockJS runtime | Cover PixiJS setup, asset loading, control binding, simulation creation, readout initialization, and the first real frame |
|
|
11
|
+
|
|
12
|
+
The pre-JS placeholder exists because PaddockJS cannot render anything before PaddockJS code exists on the page. The package loading overlays exist because, once the package has started, the runtime still needs time to build the simulator.
|
|
13
|
+
|
|
14
|
+
## Phase 1: Pre-JS Placeholder
|
|
15
|
+
|
|
16
|
+
Use the optional placeholder subpath when a host wants visible simulator UI before importing the full browser runtime:
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
import { createPaddockLoadingPlaceholder } from '@inventure71/paddockjs/placeholder';
|
|
20
|
+
import '@inventure71/paddockjs/placeholder.css';
|
|
21
|
+
|
|
22
|
+
root.innerHTML = createPaddockLoadingPlaceholder({
|
|
23
|
+
label: 'Loading simulator',
|
|
24
|
+
detail: 'Preparing race control',
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`@inventure71/paddockjs/placeholder` is intentionally separate from the root package. It does not import PixiJS, simulator assets, package runtime CSS, `F1SimulatorApp`, or the browser mount. The stylesheet at `@inventure71/paddockjs/placeholder.css` is a tiny standalone stylesheet for the default start-light placeholder.
|
|
29
|
+
|
|
30
|
+
The helper returns inert escaped HTML. It does not mount the simulator, register event listeners, fetch assets, or start any timers. The default `lights` variant uses CSS animation only.
|
|
31
|
+
|
|
32
|
+
## Bundled Browser Hosts
|
|
33
|
+
|
|
34
|
+
In Vite, Rollup, Webpack, or another browser bundler, render the placeholder first, then dynamically import the full simulator:
|
|
35
|
+
|
|
36
|
+
```js
|
|
37
|
+
import { createPaddockLoadingPlaceholder } from '@inventure71/paddockjs/placeholder';
|
|
38
|
+
import '@inventure71/paddockjs/placeholder.css';
|
|
39
|
+
|
|
40
|
+
const root = document.getElementById('f1-simulator-root');
|
|
41
|
+
|
|
42
|
+
root.innerHTML = createPaddockLoadingPlaceholder({
|
|
43
|
+
label: 'Loading simulator',
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const startSimulator = async () => {
|
|
47
|
+
const { mountF1Simulator } = await import('@inventure71/paddockjs');
|
|
48
|
+
await mountF1Simulator(root, { drivers, entries });
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
if ('requestIdleCallback' in window) {
|
|
52
|
+
window.requestIdleCallback(startSimulator);
|
|
53
|
+
} else {
|
|
54
|
+
setTimeout(startSimulator, 0);
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The dynamic root import lets the page paint the placeholder before paying for the full browser simulator bundle. The full mount replaces the placeholder root content when PaddockJS starts.
|
|
59
|
+
|
|
60
|
+
## Static HTML Hosts
|
|
61
|
+
|
|
62
|
+
Plain static HTML pages cannot resolve bare npm imports such as `@inventure71/paddockjs/placeholder` directly in the browser unless the page also provides a bundler output or import map. Do not add a runtime bundling step only to render the placeholder.
|
|
63
|
+
|
|
64
|
+
For static hosts with a build script, run the helper at build time and inject the generated HTML into the static page:
|
|
65
|
+
|
|
66
|
+
```js
|
|
67
|
+
import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
68
|
+
import { createRequire } from 'node:module';
|
|
69
|
+
import { dirname } from 'node:path';
|
|
70
|
+
import { createPaddockLoadingPlaceholder } from '@inventure71/paddockjs/placeholder';
|
|
71
|
+
|
|
72
|
+
const require = createRequire(import.meta.url);
|
|
73
|
+
|
|
74
|
+
const placeholderHtml = createPaddockLoadingPlaceholder({
|
|
75
|
+
label: 'Loading simulator',
|
|
76
|
+
detail: 'Preparing race preview',
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const cssSource = require.resolve('@inventure71/paddockjs/placeholder.css');
|
|
80
|
+
const cssTarget = 'dist/f1-simulator/paddock-placeholder.css';
|
|
81
|
+
|
|
82
|
+
mkdirSync(dirname(cssTarget), { recursive: true });
|
|
83
|
+
copyFileSync(cssSource, cssTarget);
|
|
84
|
+
|
|
85
|
+
const html = readFileSync('projects.html', 'utf8')
|
|
86
|
+
.replace('<!-- paddock-placeholder -->', placeholderHtml)
|
|
87
|
+
.replace(
|
|
88
|
+
'</head>',
|
|
89
|
+
' <link rel="stylesheet" href="/f1-simulator/paddock-placeholder.css">\n</head>',
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
writeFileSync('dist/projects.html', html);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
That pattern keeps the first paint static and cheap while avoiding manual markup drift. The HTML still comes from the package helper, and the CSS still comes from the package stylesheet.
|
|
96
|
+
|
|
97
|
+
If a static host cannot run the helper during its build, copying the generated placeholder markup contract is acceptable as a fallback, but it is weaker. Manual markup can drift if the package changes the placeholder structure in a later release.
|
|
98
|
+
|
|
99
|
+
## Phase 2: Package Loading Overlays
|
|
100
|
+
|
|
101
|
+
After PaddockJS JavaScript starts, `mountF1Simulator(root, options)` synchronously writes a lightweight package shell into the mount root. The shell includes package-owned loading overlays for startup-capable surfaces such as the race canvas, controls, timing tower, race-data panel, telemetry stack, and composable component roots.
|
|
102
|
+
|
|
103
|
+
Composable hosts get the same behavior per mounted surface:
|
|
104
|
+
|
|
105
|
+
```js
|
|
106
|
+
const simulator = createPaddockSimulator(options);
|
|
107
|
+
|
|
108
|
+
simulator.mountRaceCanvas(canvasRoot);
|
|
109
|
+
simulator.mountTimingTower(timingRoot);
|
|
110
|
+
simulator.mountTelemetryPanel(telemetryRoot);
|
|
111
|
+
|
|
112
|
+
await simulator.start();
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Each `mount*()` call writes static package markup and a surface-specific `data-paddock-loading` overlay immediately. `start()` removes those overlays only after PixiJS, assets, controls, initial DOM readouts, and the first frame have initialized.
|
|
116
|
+
|
|
117
|
+
These overlays are automatic. Hosts should not recreate them, query them for simulator state, or patch package internals to hide them. If a host needs a different pre-PaddockJS first paint, use the phase-1 placeholder around or inside the same root before calling the package mount.
|
|
118
|
+
|
|
119
|
+
## Replacement Flow
|
|
120
|
+
|
|
121
|
+
A typical lazy startup flow is:
|
|
122
|
+
|
|
123
|
+
1. Host HTML/CSS paints the page and optional pre-JS placeholder.
|
|
124
|
+
2. Host code imports the full PaddockJS browser bundle.
|
|
125
|
+
3. `mountF1Simulator()` or composable `mount*()` calls replace the placeholder with package startup markup.
|
|
126
|
+
4. PaddockJS shows package loading overlays while runtime setup finishes.
|
|
127
|
+
5. PaddockJS removes those overlays after the first real simulator frame is ready.
|
|
128
|
+
|
|
129
|
+
The pre-JS placeholder and package overlays can look similar, but they are intentionally separate. The first is a host-rendered shell for the network/import gap. The second is package runtime UI for simulator boot.
|
|
130
|
+
|
|
131
|
+
## What Not To Do
|
|
132
|
+
|
|
133
|
+
- Do not expect a plain static HTML page to resolve `@inventure71/paddockjs/placeholder` as a browser import without a bundler or import map.
|
|
134
|
+
- Do not eagerly import the root `@inventure71/paddockjs` package just to show a loading screen; that defeats the payload split.
|
|
135
|
+
- Do not copy simulator assets or PixiJS into the pre-JS placeholder.
|
|
136
|
+
- Do not manually maintain copied placeholder markup when the host has a build step that can call `createPaddockLoadingPlaceholder()`.
|
|
137
|
+
- Do not style package runtime internals such as `.start-lights`, `.timing-list`, or `.race-data-panel` from host CSS. Size the host root and let PaddockJS own runtime layout.
|
|
138
|
+
|
|
139
|
+
## Related Placeholders
|
|
140
|
+
|
|
141
|
+
PaddockJS also shows an `Unsupported size` placeholder when a shell or component is constrained below its supported bounds. That is not a startup loader. It is a layout safety state that tells the host to fix the container size rather than letting package controls overlap or clip.
|
package/docs/system_specs.md
CHANGED
|
@@ -367,7 +367,7 @@ Full public race snapshots include `car.trackState` as the serialized car-center
|
|
|
367
367
|
- `pixi.js` available through the package dependency graph.
|
|
368
368
|
|
|
369
369
|
Raw Node imports of the package root are not a supported runtime check because the browser component entry imports CSS and image assets. The `@inventure71/paddockjs/environment` subpath is the supported browser-free import path for headless JavaScript training.
|
|
370
|
-
The
|
|
370
|
+
The package exposes a JSON-serializable worker protocol wrapper so external processes can bridge to the JavaScript environment without PaddockJS choosing Python, Gymnasium, PettingZoo, model storage, training algorithms, checkpoint formats, or training infrastructure.
|
|
371
371
|
|
|
372
372
|
## Verification
|
|
373
373
|
|
|
@@ -382,9 +382,12 @@ Expected:
|
|
|
382
382
|
- Fast Vitest tests pass in the normal local gate. Slow characterization tests run under `npm run check:release`.
|
|
383
383
|
- `npm pack --dry-run` succeeds and includes source files plus bundled assets.
|
|
384
384
|
- A packed tarball installs and builds inside a fresh temporary Vite consumer app.
|
|
385
|
+
- Packed subpath bundle-boundary checks verify that the root import remains the CSS/asset-owning browser simulator bundle while `/placeholder`, `/data`, and `/environment` stay CSS-free or lightweight according to their documented roles.
|
|
385
386
|
- The tracked showcase host builds.
|
|
386
387
|
- The quick Chromium browser smoke verifies showcase canvas rendering, overflow constraints, one public API action, and live customization theme switching. The release browser smoke verifies the desktop/mobile matrix, package-panel overflow constraints, customization route interactions, public API buttons, and visual policy-runner stepping across generation and race configurations.
|
|
387
388
|
|
|
389
|
+
Use [Testing Reliability Guide](testing-reliability-guide.md) to choose the smallest behavior-focused proof for a change before relying on the broad package gate. The guide is authoritative for mapping package/API, simulation, environment, browser, performance, and docs changes to focused tests and required broader verification.
|
|
390
|
+
|
|
388
391
|
For internal runtime-efficiency development only, also run:
|
|
389
392
|
|
|
390
393
|
```bash
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Testing Reliability Guide
|
|
2
|
+
|
|
3
|
+
PaddockJS reliability work is risk-driven. Do not add tests for coverage vanity. Add or change tests when they protect a package contract, a simulator state transition, a browser lifecycle path, or a performance invariant that can silently regress.
|
|
4
|
+
|
|
5
|
+
## Confidence Model
|
|
6
|
+
|
|
7
|
+
Use the smallest verification layer that proves the behavior, then run the broader gate before claiming package quality.
|
|
8
|
+
|
|
9
|
+
- Unit tests in `src/__tests__/` prove deterministic simulation, data normalization, sensor math, controller loops, and focused UI rendering helpers.
|
|
10
|
+
- Public type tests in `src/__tests__/publicApi.types.ts` prove the TypeScript consumer contract for root, `/data`, `/environment`, and `/placeholder` imports.
|
|
11
|
+
- `npm run consumer:smoke` proves the packed tarball installs and builds in a fresh Vite consumer through public package imports.
|
|
12
|
+
- `npm run consumer:bundle-boundaries` proves the packed root browser import remains the CSS/asset-owning simulator bundle while `/placeholder`, `/data`, and `/environment` stay CSS-free or lightweight according to their documented roles.
|
|
13
|
+
- `npm run showcase:ci` proves the tracked browser showcase still builds.
|
|
14
|
+
- `npm run browser:smoke:quick -- --skip-build` proves the built showcase can mount, paint a nonblank canvas, avoid key overflow regressions, exercise public controls, and keep live customization paths working.
|
|
15
|
+
- `npm run browser:smoke:full -- --skip-build` is required for broad browser/showcase/layout behavior and release handoff.
|
|
16
|
+
- `npm run benchmark:runtime -- --profile=standard --verify --json` proves simulation, sensor, rendering-data, snapshot, DOM-readout, and compact-transport performance contracts.
|
|
17
|
+
|
|
18
|
+
## Change Matrix
|
|
19
|
+
|
|
20
|
+
| Change area | Required focused proof | Required broader proof |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Public root, `/data`, `/environment`, or `/placeholder` API/types | `npm run types:check` plus a public API type assertion when the contract changes | `npm run check` |
|
|
23
|
+
| Package install, exports, files, CSS/assets, subpath bundle boundaries, or build assumptions | `npm run pack:dry`, `npm run consumer:smoke`, or `npm run consumer:bundle-boundaries` | `npm run check` |
|
|
24
|
+
| Race rules, ordering, DRS, starts, safety car, red flag, pits, penalties, collisions, or finish/classification | Focused Vitest file for the changed rule path | `npm run check`; use `npm run check:release` for broad behavior |
|
|
25
|
+
| Track geometry, query index, wheel surfaces, runoff, contact patches, or sensor rays | Focused geometry/sensor tests plus benchmark verification when hot paths change | `npm run check`; benchmark command required for performance-sensitive edits |
|
|
26
|
+
| Headless environment, controller loop, worker protocol, Policy Runner, observation/vector/schema contract | Focused environment/controller/transport tests and active observation contract assertions | `npm run check`; benchmark if compact/vector/snapshot cost changes |
|
|
27
|
+
| Browser runtime, Pixi lifecycle, layout support, readouts, controls, theme, loading, or smoke pages | Focused DOM/render helper tests where possible | `npm run check`; full browser smoke for broad layout/showcase changes |
|
|
28
|
+
| Docs-only consumer guidance | `npm run docs:check` | `npm run check` when docs describe package behavior changed in code |
|
|
29
|
+
|
|
30
|
+
## Test Quality Rules
|
|
31
|
+
|
|
32
|
+
- Test behavior through the production path whenever practical. Avoid tests that recreate private helper logic and only prove the helper still matches itself.
|
|
33
|
+
- Include negative, stale-state, restart/remount, and partial-update cases for lifecycle code.
|
|
34
|
+
- For deterministic simulation changes, fix the seed, track seed, drivers, entries, rules, and scenario inputs in the test.
|
|
35
|
+
- For model-facing senses, assert the active observation/vector/schema contract. Debug overlays may have extra data, but no model-sense panel should display a recomputed or more precise value as model input.
|
|
36
|
+
- For performance-sensitive paths, assert counters that explain the cost, such as fallback counts, allocation counters, or compact payload sizes. Do not rely only on elapsed time.
|
|
37
|
+
- For package boundary work, prove public imports from the packed package, not internal relative paths.
|
|
38
|
+
- For browser layout work, prove rendered behavior with browser smoke or a focused DOM/canvas check. Static markup snapshots are not enough when resize observers, canvas painting, or runtime CSS state are involved.
|
|
39
|
+
|
|
40
|
+
## High-Risk Behaviors To Map In Audits
|
|
41
|
+
|
|
42
|
+
- `mountF1Simulator()` and `createPaddockSimulator()` lifecycle: initial shell, loading overlays, start, restart, theme sync, destroy, and repeated mount behavior.
|
|
43
|
+
- Public subpath boundaries: root imports browser/CSS runtime, `/environment` stays browser-free and CSS-free, `/data` stays CSS-free, `/placeholder` stays tiny and inert.
|
|
44
|
+
- Determinism: same seed, track seed, drivers, entries, rules, and scenario produce stable simulation behavior.
|
|
45
|
+
- Track query index propagation: built runtime tracks keep the internal non-enumerable index, while public JSON snapshots do not leak engine helpers.
|
|
46
|
+
- Race state transitions: start sequence, safety car, red flag, pit-lane open/closed, pit stops, penalties, DNF, finish, and final classification.
|
|
47
|
+
- Model-facing observations: object/vector/schema alignment, per-driver overrides, compact/vector-only outputs, reset-only observations, and external renderer frames.
|
|
48
|
+
- Rendering and layout: nonblank canvas, timing tower constraints, unsupported-size placeholders, lower-third/timing clearance, theme variables, and composable roots.
|
|
49
|
+
- Package consumption: dry pack contents, fresh consumer install/build, browser showcase build, and documented host update path.
|
|
50
|
+
|
|
51
|
+
## Reporting Standard
|
|
52
|
+
|
|
53
|
+
Every reliability audit should report:
|
|
54
|
+
|
|
55
|
+
- current confidence: what is proven and what remains unproven;
|
|
56
|
+
- findings ranked by user impact and regression likelihood;
|
|
57
|
+
- exact files and behavior paths affected;
|
|
58
|
+
- smallest test or verification change that would close each gap;
|
|
59
|
+
- commands run, with the gate level they prove;
|
|
60
|
+
- any rejected critique, with the technical reason it is not accepted.
|
|
61
|
+
|
|
62
|
+
If a required command is blocked by the environment, report the command, failure text, retry state, and the exact proof still missing. Do not replace a broad required gate with a narrow check.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inventure71/paddockjs",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A data-driven browser F1 simulator component for host websites.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -68,8 +68,6 @@
|
|
|
68
68
|
"examples/python/README.md",
|
|
69
69
|
"examples/python/base_policy_server.py",
|
|
70
70
|
"examples/python/requirements.txt",
|
|
71
|
-
"examples/train-basic-policy.mjs",
|
|
72
|
-
"examples/trainingData.mjs",
|
|
73
71
|
"src/api",
|
|
74
72
|
"src/app",
|
|
75
73
|
"src/config",
|
|
@@ -90,10 +88,11 @@
|
|
|
90
88
|
"test:fast": "node scripts/run-vitest.mjs",
|
|
91
89
|
"types:check": "tsc -p tsconfig.types.json --noEmit",
|
|
92
90
|
"docs:check": "node scripts/docs-check.mjs",
|
|
93
|
-
"check": "npm run docs:check && npm run test:fast && npm run types:check && npm run pack:dry && npm run consumer:smoke && npm run showcase:ci && npm run browser:smoke:quick -- --skip-build",
|
|
94
|
-
"check:release": "npm run docs:check && npm test && npm run types:check && npm run pack:dry && npm run consumer:smoke && npm run showcase:ci && npm run browser:smoke:full -- --skip-build",
|
|
91
|
+
"check": "npm run docs:check && npm run test:fast && npm run types:check && npm run pack:dry && npm run consumer:smoke && npm run consumer:bundle-boundaries && npm run showcase:ci && npm run browser:smoke:quick -- --skip-build",
|
|
92
|
+
"check:release": "npm run docs:check && npm test && npm run types:check && npm run pack:dry && npm run consumer:smoke && npm run consumer:bundle-boundaries && npm run showcase:ci && npm run browser:smoke:full -- --skip-build",
|
|
95
93
|
"pack:dry": "npm pack --dry-run",
|
|
96
94
|
"consumer:smoke": "node scripts/consumer-package-smoke.mjs",
|
|
95
|
+
"consumer:bundle-boundaries": "node scripts/consumer-bundle-boundaries.mjs",
|
|
97
96
|
"browser:smoke": "node smoke/browser-smoke.mjs",
|
|
98
97
|
"browser:smoke:quick": "node smoke/browser-smoke.mjs --quick",
|
|
99
98
|
"browser:smoke:full": "node smoke/browser-smoke.mjs --full",
|
|
@@ -104,8 +103,7 @@
|
|
|
104
103
|
"showcase:ci": "npm --prefix local-preview ci && npm --prefix local-preview run build",
|
|
105
104
|
"changeset": "changeset",
|
|
106
105
|
"version-packages": "changeset version",
|
|
107
|
-
"release": "npm publish --provenance"
|
|
108
|
-
"example:train": "node examples/train-basic-policy.mjs"
|
|
106
|
+
"release": "npm publish --provenance"
|
|
109
107
|
},
|
|
110
108
|
"dependencies": {
|
|
111
109
|
"pixi.js": "8.18.1"
|
package/src/data/index.d.ts
CHANGED
|
@@ -38,6 +38,69 @@ export interface PaddockProceduralTrackOptions {
|
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
export interface PaddockTrackPoint {
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface PaddockDrsZone {
|
|
47
|
+
id: string;
|
|
48
|
+
startRatio: number;
|
|
49
|
+
endRatio: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface PaddockResolvedProceduralTrackOptions {
|
|
53
|
+
profile: PaddockProceduralTrackProfile;
|
|
54
|
+
length: {
|
|
55
|
+
min: number;
|
|
56
|
+
max: number;
|
|
57
|
+
};
|
|
58
|
+
startStraight: {
|
|
59
|
+
grid: number;
|
|
60
|
+
exit: number;
|
|
61
|
+
blend: number;
|
|
62
|
+
lockExtra: number;
|
|
63
|
+
};
|
|
64
|
+
pitLane: {
|
|
65
|
+
enabled: boolean;
|
|
66
|
+
};
|
|
67
|
+
shape: {
|
|
68
|
+
scale: number;
|
|
69
|
+
cornerDensity: number;
|
|
70
|
+
variation: number;
|
|
71
|
+
};
|
|
72
|
+
validation: {
|
|
73
|
+
minClearanceMultiplier: number;
|
|
74
|
+
minShapeVariation: number;
|
|
75
|
+
minNonAdjacentArcDistance: number;
|
|
76
|
+
maxLocalTurnRadians: number;
|
|
77
|
+
maxSampleHeadingDeltaRadians: number;
|
|
78
|
+
};
|
|
79
|
+
attempts: {
|
|
80
|
+
primary: number;
|
|
81
|
+
fallback: number;
|
|
82
|
+
};
|
|
83
|
+
cacheKey: string;
|
|
84
|
+
[key: string]: unknown;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface PaddockProceduralTrack {
|
|
88
|
+
name: string;
|
|
89
|
+
width: number;
|
|
90
|
+
kerbWidth: number;
|
|
91
|
+
gravelWidth: number;
|
|
92
|
+
runoffWidth: number;
|
|
93
|
+
barrierWidth: number;
|
|
94
|
+
sampleCount: number;
|
|
95
|
+
seed?: number;
|
|
96
|
+
curveInterpolation?: string;
|
|
97
|
+
centerlineControls?: readonly PaddockTrackPoint[];
|
|
98
|
+
drsZones?: readonly PaddockDrsZone[] | null;
|
|
99
|
+
pitLane?: { enabled?: boolean } | null;
|
|
100
|
+
generationOptions?: PaddockResolvedProceduralTrackOptions;
|
|
101
|
+
[key: string]: unknown;
|
|
102
|
+
}
|
|
103
|
+
|
|
41
104
|
export interface CustomField {
|
|
42
105
|
label: string;
|
|
43
106
|
value: string;
|
|
@@ -207,6 +270,6 @@ export function normalizeSimulatorDrivers(
|
|
|
207
270
|
drivers: SimulatorDriver[],
|
|
208
271
|
options?: { entries?: ChampionshipEntryBlueprint[]; caller?: string },
|
|
209
272
|
): NormalizedSimulatorDriver[];
|
|
210
|
-
export function createProceduralTrack(seed?: number | string, options?: PaddockProceduralTrackOptions):
|
|
273
|
+
export function createProceduralTrack(seed?: number | string, options?: PaddockProceduralTrackOptions): PaddockProceduralTrack;
|
|
211
274
|
export function kphToSimSpeed(kph: number): number;
|
|
212
275
|
export function simSpeedToKph(simSpeed: number): number;
|