@series-inc/rundot-syncplay 5.23.0-beta.7 → 5.23.0-beta.8

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/README.md CHANGED
@@ -45,11 +45,16 @@ creators. See `docs/syncplay-netcode-observability.md`,
45
45
  `docs/syncplay-replay-verified-leaderboards.md`, and
46
46
  `docs/syncplay-wire-format.md`.
47
47
 
48
- The deterministic deploy check (`project:deploy-check` /
49
- `project:deploy-check-verify`) is an internal-consistency **receipt** — it
50
- proves the bundle it describes is the bundle that was checked — not a
51
- cryptographic signature or provenance proof
52
- (see `.plans/deterministic-multiplayer-branch-cleanup.md`).
48
+ Deployability is gated by build-time certification, not by stamped proof
49
+ artifacts. The deployable preflight is `project:check` with the
50
+ `static-determinism` section required it proves the simulation is a real,
51
+ file-backed, replayable module before upload. The optional deploy-check
52
+ commands (`project:deploy-check` / `project:deploy-check-verify`) remain as a
53
+ local, internal-consistency **receipt** — they prove the bundle they describe is
54
+ the bundle that was checked — but they are **not** a cryptographic signature,
55
+ provenance proof, or a backend admission gate. Venus upload validation and
56
+ room-server startup accept a bare `deterministic: true` room and never read
57
+ these artifacts.
53
58
 
54
59
  CI lanes:
55
60
 
@@ -268,6 +273,51 @@ Implemented:
268
273
  checksums, and CLI-certified mechanic invariants.
269
274
  - Counter Duel package-local example with replay verification and event output.
270
275
 
276
+ ## Deterministic Standard Library
277
+
278
+ The determinism static checker blocks the entire transcendental family
279
+ (`Math.sin/cos/tan/atan2/sqrt/hypot/pow/...`), `Math.random`, and `Date.now`
280
+ inside simulation code — those can differ in low bits across JS engines and
281
+ desync a lockstep match. Every simulation surface these primitives cover is
282
+ provided as a pure-integer, byte-identical replacement. **Never hand-roll fixed
283
+ math or reach for `Math.*`; use these.**
284
+
285
+ `ctx.math` (`createDeterministicMath`, wired into every step context):
286
+
287
+ - **Scalar:** `sqrt` (throws on negative), `abs`, `sign`, `min`, `max`, `lerp`,
288
+ `mod` (Euclidean; throws on modulus 0), `inverseLerp`, `remap`, `smoothstep`,
289
+ `exp`, `log`/`log2Fixed` (throw on non-positive). `exp`/`log` are ≤1% over
290
+ their fixed-representable range; `sqrt` is exact-to-a-unit.
291
+ - **Trig & angles (unit is TURNS, one revolution == `fixedScale`):** accurate
292
+ `sinTurns`/`cosTurns` (5th-order minimax, exact at cardinal turns, ≤5e-3 sweep
293
+ error), `tanTurns`, `atan2(y, x)` → turns in `[0, fixedScale)` CCW from +x
294
+ (`atan2(0,0) === 0`), `wrapTurns`, `angleDeltaTurns` (shortest signed),
295
+ `turnsToRadians`/`radiansToTurns`. `createDeterministicMath` requires
296
+ `fixedScale % 4 === 0`.
297
+ - **Vectors:** vec2 `sub/scale/dot/cross/lengthSq/length/distanceSq/distance/
298
+ normalize` (zero → `{0,0}`), `hypot`, `perp/negate/rotate/fromAngleTurns/
299
+ angleTurns`; vec3 core `add/sub/scale/dot/cross/lengthSq/length/distance/
300
+ normalize/lerp/negate`.
301
+ - **Domains & overflow:** domain violations (`sqrt(neg)`, `log(≤0)`, `mod(_,0)`,
302
+ non-integer fixed inputs) fail fast. Vector/`abs`/`sign`/negation ops saturate
303
+ at `±maxFixed` rather than throw. `mul`/`div` are integer-exact only while
304
+ `|a·b| ≤ 2^53` (~95k real units at the default `fixedScale` 1000).
305
+
306
+ `ctx.random` (`DeterministicRandom`) — seeded, reproducible sampling on top of
307
+ the existing `nextInt/nextFixed/fork`: `nextBool`, `nextRangeFixed`,
308
+ `nextAngleTurns`, `pickOne` (throws on empty), `weighted` (throws on length
309
+ mismatch / non-positive total), `gaussian(math)` (Box-Muller).
310
+
311
+ Segment geometry (imported from the package, like the AABB/circle primitives):
312
+ `orientation`, `pointOnSegment`, `segmentsIntersect`, `closestPointOnSegment`,
313
+ `segmentPointDistance`, `segmentSegmentDistance` (the distance/closest ops take a
314
+ `DeterministicMath` for their `sqrt`).
315
+
316
+ Hash & value noise (`noise.ts`, pure importable functions — replaces the
317
+ cross-engine `Math.sin`-hash desync class): `hashUint32`, `hash2` (integer
318
+ avalanche hashes), `valueNoise1D`/`valueNoise2D` (smooth, in `[-fixedScale,
319
+ fixedScale]`), `fbm2D`.
320
+
271
321
  ## Commands
272
322
 
273
323
  ```bash
@@ -283,16 +333,12 @@ npm run project:release-verify -- ./deterministic-game/artifacts/deterministic/p
283
333
  npm run project:release-bundle -- ./deterministic-game/artifacts/deterministic/project-release-evidence.json --json ./deterministic-game/artifacts/deterministic/project-release-bundle.json
284
334
  npm run project:release-bundle-verify -- ./deterministic-game/artifacts/deterministic/project-release-bundle.json --out ./deterministic-game/artifacts/deterministic/project-release-bundle-verification.md --json ./deterministic-game/artifacts/deterministic/project-release-bundle-verification.json --junit ./deterministic-game/artifacts/deterministic/project-release-bundle-verification.xml
285
335
  npm run project:release-bundle-schema -- --json artifacts/reports/project-release-bundle-schema.json
286
- npm run project:deploy-check -- ./deterministic-game/syncplay.project.json --bundle ./deterministic-game/artifacts/deterministic/project-release-bundle.json --out ./deterministic-game/artifacts/deterministic/project-deploy-check.md --json ./deterministic-game/artifacts/deterministic/project-deploy-check.json --junit ./deterministic-game/artifacts/deterministic/project-deploy-check.xml
287
- npm run project:deploy-check-verify -- ./deterministic-game/artifacts/deterministic/project-deploy-check.json --out ./deterministic-game/artifacts/deterministic/project-deploy-check-verification.md --json ./deterministic-game/artifacts/deterministic/project-deploy-check-verification.json --junit ./deterministic-game/artifacts/deterministic/project-deploy-check-verification.xml
288
336
  npm run project:ci-workflow -- --out .github/workflows/syncplay-ci.yml --json artifacts/reports/project-ci-workflow.json
289
337
  npm run project:scaffold -- ./deterministic-h5 --name "H5 Arena" --template h5 --sdk-version ^0.8.0 --deterministic-version ^0.3.0
290
338
  npm run project:check -- ./deterministic-h5/syncplay.project.json --require descriptor,assets,config,replay-runtime,creator-boundary,static-determinism --frames 32 --out-dir ./deterministic-h5/artifacts/deterministic --dist ./deterministic-h5/dist --out ./deterministic-h5/artifacts/deterministic/project-check-browser.md --json ./deterministic-h5/artifacts/deterministic/project-check-browser.json --junit ./deterministic-h5/artifacts/deterministic/project-check-browser.xml --release-json ./deterministic-h5/artifacts/deterministic/project-release-evidence-browser.json --browser-runtime chromium --browser-json ./deterministic-h5/artifacts/deterministic/project-browser-proof-chromium.json
291
339
  npm run project:release-verify -- ./deterministic-h5/artifacts/deterministic/project-release-evidence-browser.json --require-browser-proof --json ./deterministic-h5/artifacts/deterministic/project-release-verification-browser.json
292
340
  npm run project:release-bundle -- ./deterministic-h5/artifacts/deterministic/project-release-evidence-browser.json --require-browser-proof --json ./deterministic-h5/artifacts/deterministic/project-release-bundle-browser.json
293
341
  npm run project:release-bundle-verify -- ./deterministic-h5/artifacts/deterministic/project-release-bundle-browser.json --out ./deterministic-h5/artifacts/deterministic/project-release-bundle-verification-browser.md --json ./deterministic-h5/artifacts/deterministic/project-release-bundle-verification-browser.json --junit ./deterministic-h5/artifacts/deterministic/project-release-bundle-verification-browser.xml
294
- npm run project:deploy-check -- ./deterministic-h5/syncplay.project.json --require-browser-proof --bundle ./deterministic-h5/artifacts/deterministic/project-release-bundle-browser.json --out ./deterministic-h5/artifacts/deterministic/project-deploy-check.md --json ./deterministic-h5/artifacts/deterministic/project-deploy-check.json --junit ./deterministic-h5/artifacts/deterministic/project-deploy-check.xml
295
- npm run project:deploy-check-verify -- ./deterministic-h5/artifacts/deterministic/project-deploy-check.json --out ./deterministic-h5/artifacts/deterministic/project-deploy-check-verification.md --json ./deterministic-h5/artifacts/deterministic/project-deploy-check-verification.json --junit ./deterministic-h5/artifacts/deterministic/project-deploy-check-verification.xml
296
342
  npm run project:doctor -- ./deterministic-h5/syncplay.project.json --require-browser-proof --json ./deterministic-h5/artifacts/deterministic/project-doctor-ci.json --junit ./deterministic-h5/artifacts/deterministic/project-doctor-ci.xml
297
343
  npm run --prefix ./deterministic-h5 build
298
344
  npm run project:scaffold -- ./deterministic-systems --name "Systems Test" --template systems
package/dist/browser.d.ts CHANGED
@@ -3,6 +3,8 @@ export { verifyReplayWithDescriptor as verifyDeterministicReplay } from './repla
3
3
  export { createOfflineSession } from './offline-session.js';
4
4
  export { createSyncplayOfflineRuntime } from './sdk-offline.js';
5
5
  export { createSyncplayOfflineRuntime as createSyncplayGameRuntime } from './sdk-offline.js';
6
+ export { createSyncplaySession } from './sdk-session.js';
7
+ export type { SyncplaySession, SyncplaySessionConfig, SyncplaySessionMode, OpenRoomTransport } from './sdk-session.js';
6
8
  export { runNumberLab } from './number-lab.js';
7
9
  export { runDeterministicEngineCoreNumericProof } from './engine-core-proof.js';
8
10
  export { hydrateLabInput, labDefaultInput, labStep } from './sample-lab.js';
@@ -42,6 +44,7 @@ export * from './movement3d.js';
42
44
  export * from './navigation.js';
43
45
  export * from './navmesh.js';
44
46
  export * from './collision.js';
47
+ export * from './noise.js';
45
48
  export * from './physics2d.js';
46
49
  export * from './physics3d.js';
47
50
  export * from './replay-bundle.js';
package/dist/browser.js CHANGED
@@ -3,6 +3,7 @@ export { verifyReplayWithDescriptor as verifyDeterministicReplay } from './repla
3
3
  export { createOfflineSession } from './offline-session.js';
4
4
  export { createSyncplayOfflineRuntime } from './sdk-offline.js';
5
5
  export { createSyncplayOfflineRuntime as createSyncplayGameRuntime } from './sdk-offline.js';
6
+ export { createSyncplaySession } from './sdk-session.js';
6
7
  export { runNumberLab } from './number-lab.js';
7
8
  export { runDeterministicEngineCoreNumericProof } from './engine-core-proof.js';
8
9
  export { hydrateLabInput, labDefaultInput, labStep } from './sample-lab.js';
@@ -40,6 +41,7 @@ export * from './movement3d.js';
40
41
  export * from './navigation.js';
41
42
  export * from './navmesh.js';
42
43
  export * from './collision.js';
44
+ export * from './noise.js';
43
45
  export * from './physics2d.js';
44
46
  export * from './physics3d.js';
45
47
  export * from './replay-bundle.js';
@@ -171,6 +171,18 @@ export interface CertificationFixedFoundationMetrics {
171
171
  readonly mul: number;
172
172
  readonly div: number;
173
173
  readonly clamp: number;
174
+ readonly sqrt: number;
175
+ readonly exp: number;
176
+ readonly atan2Axis: number;
177
+ readonly normalizeLen: number;
178
+ readonly vec3Cross: {
179
+ readonly x: number;
180
+ readonly y: number;
181
+ readonly z: number;
182
+ };
183
+ readonly segmentDistance: number;
184
+ readonly sample: number;
185
+ readonly noiseSample: number;
174
186
  };
175
187
  readonly vectors: {
176
188
  readonly a: {
@@ -1,8 +1,9 @@
1
1
  import { canonicalize, canonicalStringify, cloneCanonical, defaultChecksum } from './canonical.js';
2
- import { fixedCircle, fixedVec2, circleIntersects } from './collision.js';
2
+ import { fixedCircle, fixedVec2, circleIntersects, segmentPointDistance } from './collision.js';
3
3
  import { createStableIndexedMap, deterministicShuffle, stableEntries, stableSortedKeys } from './collections.js';
4
4
  import { createDeterministicEventTimeline } from './events.js';
5
5
  import { createDeterministicMath } from './math.js';
6
+ import { valueNoise2D } from './noise.js';
6
7
  import { runPhysicsCert } from './physics-cert.js';
7
8
  import { runPredictionCullingLab } from './prediction-culling.js';
8
9
  import { runProtocolRollbackLab } from './protocol-lab.js';
@@ -332,6 +333,14 @@ function runFixedFoundationFixture(manifest, fixture) {
332
333
  mul: math.mul(a, b),
333
334
  div: math.div(b, a),
334
335
  clamp: math.clamp(4_000, 0, b),
336
+ sqrt: math.sqrt(math.toFixed(9)),
337
+ exp: math.exp(math.toFixed(1)),
338
+ atan2Axis: math.atan2(math.toFixed(1), 0),
339
+ normalizeLen: math.vec2Length(math.vec2Normalize(math.vec2(math.toFixed(3), math.toFixed(4)))),
340
+ vec3Cross: math.vec3Cross(math.vec3(math.toFixed(1), 0, 0), math.vec3(0, math.toFixed(1), 0)),
341
+ segmentDistance: segmentPointDistance({ x: 0, y: math.toFixed(1) }, { x: -math.toFixed(1), y: 0 }, { x: math.toFixed(1), y: 0 }, math),
342
+ sample: new DeterministicRandom(7).nextRangeFixed(0, math.toFixed(10)),
343
+ noiseSample: valueNoise2D(math, math.toFixed(1.5), math.toFixed(2.5), 3),
335
344
  },
336
345
  vectors: {
337
346
  a: circleA.center,
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.createSyncplayClient = exports.stepDeterministicButton = exports.runDeterministicDescriptorButtonFixture = exports.runDeterministicButtonFixture = exports.deterministicButtonInitialState = exports.interpolateDeterministicRenderVec2 = exports.interpolateDeterministicRenderNumber = exports.createDeterministicR3fRenderAdapter = exports.createDeterministicR3fAdapter = exports.runFixedArenaExample = exports.projectFixedArenaRenderState = exports.projectFixedArenaReferenceView = exports.fixedArenaStep = exports.fixedArenaDefaultInput = exports.createInitialFixedArenaState = exports.createFixedArenaDescriptor = exports.labStep = exports.labDefaultInput = exports.hydrateLabInput = exports.runDeterministicEngineCoreNumericProof = exports.runNumberLab = exports.createSyncplayGameRuntime = exports.createSyncplayOfflineRuntime = exports.createOfflineSession = exports.verifyDeterministicReplay = exports.verifyReplay = void 0;
17
+ exports.createSyncplayClient = exports.stepDeterministicButton = exports.runDeterministicDescriptorButtonFixture = exports.runDeterministicButtonFixture = exports.deterministicButtonInitialState = exports.interpolateDeterministicRenderVec2 = exports.interpolateDeterministicRenderNumber = exports.createDeterministicR3fRenderAdapter = exports.createDeterministicR3fAdapter = exports.runFixedArenaExample = exports.projectFixedArenaRenderState = exports.projectFixedArenaReferenceView = exports.fixedArenaStep = exports.fixedArenaDefaultInput = exports.createInitialFixedArenaState = exports.createFixedArenaDescriptor = exports.labStep = exports.labDefaultInput = exports.hydrateLabInput = exports.runDeterministicEngineCoreNumericProof = exports.runNumberLab = exports.createSyncplaySession = exports.createSyncplayGameRuntime = exports.createSyncplayOfflineRuntime = exports.createOfflineSession = exports.verifyDeterministicReplay = exports.verifyReplay = void 0;
18
18
  var replay_js_1 = require("./replay.js");
19
19
  Object.defineProperty(exports, "verifyReplay", { enumerable: true, get: function () { return replay_js_1.verifyReplay; } });
20
20
  var replay_js_2 = require("./replay.js");
@@ -25,6 +25,8 @@ var sdk_offline_js_1 = require("./sdk-offline.js");
25
25
  Object.defineProperty(exports, "createSyncplayOfflineRuntime", { enumerable: true, get: function () { return sdk_offline_js_1.createSyncplayOfflineRuntime; } });
26
26
  var sdk_offline_js_2 = require("./sdk-offline.js");
27
27
  Object.defineProperty(exports, "createSyncplayGameRuntime", { enumerable: true, get: function () { return sdk_offline_js_2.createSyncplayOfflineRuntime; } });
28
+ var sdk_session_js_1 = require("./sdk-session.js");
29
+ Object.defineProperty(exports, "createSyncplaySession", { enumerable: true, get: function () { return sdk_session_js_1.createSyncplaySession; } });
28
30
  var number_lab_js_1 = require("./number-lab.js");
29
31
  Object.defineProperty(exports, "runNumberLab", { enumerable: true, get: function () { return number_lab_js_1.runNumberLab; } });
30
32
  var engine_core_proof_js_1 = require("./engine-core-proof.js");
@@ -83,6 +85,7 @@ __exportStar(require("./movement3d.js"), exports);
83
85
  __exportStar(require("./navigation.js"), exports);
84
86
  __exportStar(require("./navmesh.js"), exports);
85
87
  __exportStar(require("./collision.js"), exports);
88
+ __exportStar(require("./noise.js"), exports);
86
89
  __exportStar(require("./physics2d.js"), exports);
87
90
  __exportStar(require("./physics3d.js"), exports);
88
91
  __exportStar(require("./replay-bundle.js"), exports);
@@ -8,6 +8,7 @@ const collision_js_1 = require("./collision.js");
8
8
  const collections_js_1 = require("./collections.js");
9
9
  const events_js_1 = require("./events.js");
10
10
  const math_js_1 = require("./math.js");
11
+ const noise_js_1 = require("./noise.js");
11
12
  const physics_cert_js_1 = require("./physics-cert.js");
12
13
  const prediction_culling_js_1 = require("./prediction-culling.js");
13
14
  const protocol_lab_js_1 = require("./protocol-lab.js");
@@ -337,6 +338,14 @@ function runFixedFoundationFixture(manifest, fixture) {
337
338
  mul: math.mul(a, b),
338
339
  div: math.div(b, a),
339
340
  clamp: math.clamp(4_000, 0, b),
341
+ sqrt: math.sqrt(math.toFixed(9)),
342
+ exp: math.exp(math.toFixed(1)),
343
+ atan2Axis: math.atan2(math.toFixed(1), 0),
344
+ normalizeLen: math.vec2Length(math.vec2Normalize(math.vec2(math.toFixed(3), math.toFixed(4)))),
345
+ vec3Cross: math.vec3Cross(math.vec3(math.toFixed(1), 0, 0), math.vec3(0, math.toFixed(1), 0)),
346
+ segmentDistance: (0, collision_js_1.segmentPointDistance)({ x: 0, y: math.toFixed(1) }, { x: -math.toFixed(1), y: 0 }, { x: math.toFixed(1), y: 0 }, math),
347
+ sample: new random_js_1.DeterministicRandom(7).nextRangeFixed(0, math.toFixed(10)),
348
+ noiseSample: (0, noise_js_1.valueNoise2D)(math, math.toFixed(1.5), math.toFixed(2.5), 3),
340
349
  },
341
350
  vectors: {
342
351
  a: circleA.center,
@@ -9,6 +9,12 @@ exports.circleIntersects = circleIntersects;
9
9
  exports.circleIntersectsAabb = circleIntersectsAabb;
10
10
  exports.translateAabb = translateAabb;
11
11
  exports.sortAabbsByStableId = sortAabbsByStableId;
12
+ exports.orientation = orientation;
13
+ exports.pointOnSegment = pointOnSegment;
14
+ exports.segmentsIntersect = segmentsIntersect;
15
+ exports.closestPointOnSegment = closestPointOnSegment;
16
+ exports.segmentPointDistance = segmentPointDistance;
17
+ exports.segmentSegmentDistance = segmentSegmentDistance;
12
18
  function fixedVec2(x, y) {
13
19
  assertInteger(x, 'x');
14
20
  assertInteger(y, 'y');
@@ -94,3 +100,55 @@ function assertInteger(value, name) {
94
100
  throw new Error(`${name} must be an integer fixed-point value`);
95
101
  }
96
102
  }
103
+ /**
104
+ * Orientation of the ordered triple (a, b, c): +1 counter-clockwise, -1
105
+ * clockwise, 0 collinear. Pure integer cross-product; scale-free.
106
+ */
107
+ function orientation(a, b, c) {
108
+ const v = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
109
+ return v > 0 ? 1 : v < 0 ? -1 : 0;
110
+ }
111
+ /** True when p lies within the axis-aligned bounding box of segment [a, b]. */
112
+ function pointOnSegment(p, a, b) {
113
+ return (p.x >= Math.min(a.x, b.x) &&
114
+ p.x <= Math.max(a.x, b.x) &&
115
+ p.y >= Math.min(a.y, b.y) &&
116
+ p.y <= Math.max(a.y, b.y));
117
+ }
118
+ function segmentsIntersect(a0, a1, b0, b1) {
119
+ const d1 = orientation(a0, a1, b0);
120
+ const d2 = orientation(a0, a1, b1);
121
+ const d3 = orientation(b0, b1, a0);
122
+ const d4 = orientation(b0, b1, a1);
123
+ if (d1 === 0 && pointOnSegment(b0, a0, a1))
124
+ return true;
125
+ if (d2 === 0 && pointOnSegment(b1, a0, a1))
126
+ return true;
127
+ if (d3 === 0 && pointOnSegment(a0, b0, b1))
128
+ return true;
129
+ if (d4 === 0 && pointOnSegment(a1, b0, b1))
130
+ return true;
131
+ return d1 !== d2 && d3 !== d4;
132
+ }
133
+ function closestPointOnSegment(p, a, b, math) {
134
+ const abx = b.x - a.x;
135
+ const aby = b.y - a.y;
136
+ const abLenSq = math.mul(abx, abx) + math.mul(aby, aby);
137
+ if (abLenSq === 0) {
138
+ return { x: a.x, y: a.y };
139
+ }
140
+ const apx = p.x - a.x;
141
+ const apy = p.y - a.y;
142
+ const t = math.clamp(math.div(math.mul(apx, abx) + math.mul(apy, aby), abLenSq), 0, math.fixedScale);
143
+ return { x: a.x + math.mul(abx, t), y: a.y + math.mul(aby, t) };
144
+ }
145
+ function segmentPointDistance(p, a, b, math) {
146
+ const c = closestPointOnSegment(p, a, b, math);
147
+ return math.hypot(p.x - c.x, p.y - c.y);
148
+ }
149
+ function segmentSegmentDistance(a0, a1, b0, b1, math) {
150
+ if (segmentsIntersect(a0, a1, b0, b1)) {
151
+ return 0;
152
+ }
153
+ return math.min(math.min(segmentPointDistance(a0, b0, b1, math), segmentPointDistance(a1, b0, b1, math)), math.min(segmentPointDistance(b0, a0, a1, math), segmentPointDistance(b1, a0, a1, math)));
154
+ }
package/dist/cjs/index.js CHANGED
@@ -14,9 +14,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.makeCounterDuelInput = exports.counterDuelDefaultInput = exports.createCounterDuelSession = exports.stepDeterministicButton = exports.runDeterministicDescriptorButtonFixture = exports.runDeterministicButtonFixture = exports.deterministicButtonInitialState = exports.createEcsLiteWorld = exports.runDeterministicEventKeywordFixture = exports.filterDeterministicEventsForPlayer = exports.createDeterministicEventTimeline = exports.createDeterministicEventEffectsAdapter = exports.stepTopDownBody = exports.stepKccLiteBody = exports.quantizeFpsAim = exports.detectVerticalCcdHit = exports.cookStaticColliders = exports.combineDeterministicPhysicsMaterial = exports.stableSortedKeys = exports.stableEntries = exports.deterministicShuffle = exports.createStableIndexedMap = exports.translateAabb = exports.sortAabbsByStableId = exports.fixedVec2 = exports.fixedCircle = exports.fixedAabb = exports.circleIntersectsAabb = exports.circleIntersects = exports.aabbIntersects = exports.aabbContainsPoint = exports.stableAssetCookJson = exports.materializePrototypeEntities = exports.cookDeterministicAssets = exports.assertAssetManifestMatches = exports.tickDeterministicHfsm = exports.tickDeterministicBehaviorTreeWithMemory = exports.tickDeterministicBehaviorTree = exports.selectDeterministicUtility = exports.runDeterministicBotSimulation = exports.getBlackboardValue = exports.createDeterministicBotBlackboard = exports.cookDeterministicBotAsset = exports.encodeUtf8 = exports.defaultChecksum = exports.decodeUtf8 = exports.decodeCanonicalValue = exports.cloneCanonical = exports.canonicalStringify = exports.canonicalize = void 0;
18
- exports.diffDeterministicReports = exports.createProtocolRollbackReport = exports.runProtocolRollbackLab = exports.interpolateDeterministicRenderVec2 = exports.interpolateDeterministicRenderNumber = exports.createDeterministicR3fRenderAdapter = exports.createDeterministicR3fDebugOverlay = exports.runPredictionCullingLab = exports.runRapierPhysicsCert = exports.runPhysicsCert = exports.stepDeterministicPhysicsWorld2D = exports.raycastDeterministicPhysics2D = exports.raycastAllDeterministicPhysics2D = exports.queryDeterministicPhysicsShapeOverlap2D = exports.queryDeterministicPhysicsAabb2D = exports.nearestDeterministicPhysicsHit2D = exports.createDeterministicPhysicsWorld2D = exports.circleCastDeterministicPhysics2D = exports.createSyncplayOfflineRuntime = exports.createOfflineSession = exports.runNumberLab = exports.stepDeterministicNavigationAgents = exports.smoothDeterministicPath = exports.findDeterministicPath = exports.createDeterministicFlowField = exports.cookTilemapNavigationGraph = exports.cookDeterministicNavigationGraph = exports.applyDeterministicReciprocalAvoidance = exports.validateDeterministicLagCompensatedHit = exports.stepDeterministicTopDownMover = exports.stepDeterministicKcc2D = exports.stepDeterministicFpsAim = exports.runDeterministicMovementSimulation = exports.rewindDeterministicTargets = exports.runDeterministicMovementCrowdSimulation = exports.createDeterministicMockNetworkAdapter = exports.createDeterministicMath = exports.SyncplayError = exports.verifyFixedArenaReplay = exports.runFixedArenaExample = exports.projectFixedArenaRenderState = exports.projectFixedArenaReferenceView = exports.makeFixedArenaInput = exports.fixedArenaStep = exports.fixedArenaDefaultInput = exports.createInitialFixedArenaState = exports.createFixedArenaSession = exports.createFixedArenaDescriptor = exports.verifyCounterDuelReplay = exports.runCounterDuelExample = void 0;
19
- exports.runVenusMpBudgetLab = exports.tickCooldown = exports.scheduleFrameEvent = exports.popDueFrameEvents = exports.millisecondsToFrames = exports.framesToMilliseconds = exports.createCooldown = exports.stableDescriptorId = exports.defineSyncplayGame = exports.proveSchemaBinaryRoundTrip = exports.generateSchemaTypes = exports.generateSchemaBinarySource = exports.createDeterministicDescriptorBinarySchema = exports.createSchemaArtifacts = exports.labStep = exports.labDefaultInput = exports.hydrateLabInput = exports.createLabSession = exports.withRuntimeDeterminismGuards = exports.verifyDeterministicSelfContainedFrameRuntimeReplayBundle = exports.verifyDeterministicReplayBundle = exports.verifyDeterministicFrameRuntimeReplayBundle = exports.sliceDeterministicReplayBundle = exports.minimizeDeterministicReplayDesyncBundle = exports.minimizeDeterministicReplayDesync = exports.createDeterministicReplayRuntimeManifest = exports.createDeterministicReplayDebugTables = exports.createDeterministicReplayBundle = exports.verifyReplayWithDescriptor = exports.verifyReplay = exports.DeterministicRandom = exports.runDeterministicSampleScene = exports.runDeterministicIntegratedHeadlessScene = exports.runAllDeterministicSampleScenes = exports.deterministicSampleSceneIds = exports.stableFrameDumpJson = exports.stableFrameDiffJson = exports.inspectReplayFrameWithDescriptor = exports.inspectReplayFrame = exports.explainReplayChecksum = exports.diffReplayFrames = exports.stableReportJson = exports.stableReportDiffJson = exports.renderDeterministicReportHtml = void 0;
17
+ exports.deterministicButtonInitialState = exports.createEcsLiteWorld = exports.runDeterministicEventKeywordFixture = exports.filterDeterministicEventsForPlayer = exports.createDeterministicEventTimeline = exports.createDeterministicEventEffectsAdapter = exports.stepTopDownBody = exports.stepKccLiteBody = exports.quantizeFpsAim = exports.detectVerticalCcdHit = exports.cookStaticColliders = exports.combineDeterministicPhysicsMaterial = exports.stableSortedKeys = exports.stableEntries = exports.deterministicShuffle = exports.createStableIndexedMap = exports.translateAabb = exports.sortAabbsByStableId = exports.segmentsIntersect = exports.segmentSegmentDistance = exports.segmentPointDistance = exports.pointOnSegment = exports.orientation = exports.fixedVec2 = exports.fixedCircle = exports.fixedAabb = exports.closestPointOnSegment = exports.circleIntersectsAabb = exports.circleIntersects = exports.aabbIntersects = exports.aabbContainsPoint = exports.stableAssetCookJson = exports.materializePrototypeEntities = exports.cookDeterministicAssets = exports.assertAssetManifestMatches = exports.tickDeterministicHfsm = exports.tickDeterministicBehaviorTreeWithMemory = exports.tickDeterministicBehaviorTree = exports.selectDeterministicUtility = exports.runDeterministicBotSimulation = exports.getBlackboardValue = exports.createDeterministicBotBlackboard = exports.cookDeterministicBotAsset = exports.encodeUtf8 = exports.defaultChecksum = exports.decodeUtf8 = exports.decodeCanonicalValue = exports.cloneCanonical = exports.canonicalStringify = exports.canonicalize = void 0;
18
+ exports.raycastDeterministicPhysics2D = exports.raycastAllDeterministicPhysics2D = exports.queryDeterministicPhysicsShapeOverlap2D = exports.queryDeterministicPhysicsAabb2D = exports.nearestDeterministicPhysicsHit2D = exports.createDeterministicPhysicsWorld2D = exports.circleCastDeterministicPhysics2D = exports.createSyncplayOfflineRuntime = exports.createOfflineSession = exports.runNumberLab = exports.stepDeterministicNavigationAgents = exports.smoothDeterministicPath = exports.findDeterministicPath = exports.createDeterministicFlowField = exports.cookTilemapNavigationGraph = exports.cookDeterministicNavigationGraph = exports.applyDeterministicReciprocalAvoidance = exports.validateDeterministicLagCompensatedHit = exports.stepDeterministicTopDownMover = exports.stepDeterministicKcc2D = exports.stepDeterministicFpsAim = exports.runDeterministicMovementSimulation = exports.rewindDeterministicTargets = exports.runDeterministicMovementCrowdSimulation = exports.createDeterministicMockNetworkAdapter = exports.valueNoise2D = exports.valueNoise1D = exports.hashUint32 = exports.hash2 = exports.fbm2D = exports.createDeterministicMath = exports.SyncplayError = exports.verifyFixedArenaReplay = exports.runFixedArenaExample = exports.projectFixedArenaRenderState = exports.projectFixedArenaReferenceView = exports.makeFixedArenaInput = exports.fixedArenaStep = exports.fixedArenaDefaultInput = exports.createInitialFixedArenaState = exports.createFixedArenaSession = exports.createFixedArenaDescriptor = exports.verifyCounterDuelReplay = exports.runCounterDuelExample = exports.makeCounterDuelInput = exports.counterDuelDefaultInput = exports.createCounterDuelSession = exports.stepDeterministicButton = exports.runDeterministicDescriptorButtonFixture = exports.runDeterministicButtonFixture = void 0;
19
+ exports.framesToMilliseconds = exports.createCooldown = exports.stableDescriptorId = exports.defineSyncplayGame = exports.proveSchemaBinaryRoundTrip = exports.generateSchemaTypes = exports.generateSchemaBinarySource = exports.createDeterministicDescriptorBinarySchema = exports.createSchemaArtifacts = exports.labStep = exports.labDefaultInput = exports.hydrateLabInput = exports.createLabSession = exports.withRuntimeDeterminismGuards = exports.verifyDeterministicSelfContainedFrameRuntimeReplayBundle = exports.verifyDeterministicReplayBundle = exports.verifyDeterministicFrameRuntimeReplayBundle = exports.sliceDeterministicReplayBundle = exports.minimizeDeterministicReplayDesyncBundle = exports.minimizeDeterministicReplayDesync = exports.createDeterministicReplayRuntimeManifest = exports.createDeterministicReplayDebugTables = exports.createDeterministicReplayBundle = exports.verifyReplayWithDescriptor = exports.verifyReplay = exports.DeterministicRandom = exports.runDeterministicSampleScene = exports.runDeterministicIntegratedHeadlessScene = exports.runAllDeterministicSampleScenes = exports.deterministicSampleSceneIds = exports.stableFrameDumpJson = exports.stableFrameDiffJson = exports.inspectReplayFrameWithDescriptor = exports.inspectReplayFrame = exports.explainReplayChecksum = exports.diffReplayFrames = exports.stableReportJson = exports.stableReportDiffJson = exports.renderDeterministicReportHtml = exports.diffDeterministicReports = exports.createProtocolRollbackReport = exports.runProtocolRollbackLab = exports.interpolateDeterministicRenderVec2 = exports.interpolateDeterministicRenderNumber = exports.createDeterministicR3fRenderAdapter = exports.createDeterministicR3fDebugOverlay = exports.runPredictionCullingLab = exports.runRapierPhysicsCert = exports.runPhysicsCert = exports.stepDeterministicPhysicsWorld2D = void 0;
20
+ exports.runVenusMpBudgetLab = exports.tickCooldown = exports.scheduleFrameEvent = exports.popDueFrameEvents = exports.millisecondsToFrames = void 0;
20
21
  var canonical_js_1 = require("./canonical.js");
21
22
  Object.defineProperty(exports, "canonicalize", { enumerable: true, get: function () { return canonical_js_1.canonicalize; } });
22
23
  Object.defineProperty(exports, "canonicalStringify", { enumerable: true, get: function () { return canonical_js_1.canonicalStringify; } });
@@ -50,9 +51,15 @@ Object.defineProperty(exports, "aabbContainsPoint", { enumerable: true, get: fun
50
51
  Object.defineProperty(exports, "aabbIntersects", { enumerable: true, get: function () { return collision_js_1.aabbIntersects; } });
51
52
  Object.defineProperty(exports, "circleIntersects", { enumerable: true, get: function () { return collision_js_1.circleIntersects; } });
52
53
  Object.defineProperty(exports, "circleIntersectsAabb", { enumerable: true, get: function () { return collision_js_1.circleIntersectsAabb; } });
54
+ Object.defineProperty(exports, "closestPointOnSegment", { enumerable: true, get: function () { return collision_js_1.closestPointOnSegment; } });
53
55
  Object.defineProperty(exports, "fixedAabb", { enumerable: true, get: function () { return collision_js_1.fixedAabb; } });
54
56
  Object.defineProperty(exports, "fixedCircle", { enumerable: true, get: function () { return collision_js_1.fixedCircle; } });
55
57
  Object.defineProperty(exports, "fixedVec2", { enumerable: true, get: function () { return collision_js_1.fixedVec2; } });
58
+ Object.defineProperty(exports, "orientation", { enumerable: true, get: function () { return collision_js_1.orientation; } });
59
+ Object.defineProperty(exports, "pointOnSegment", { enumerable: true, get: function () { return collision_js_1.pointOnSegment; } });
60
+ Object.defineProperty(exports, "segmentPointDistance", { enumerable: true, get: function () { return collision_js_1.segmentPointDistance; } });
61
+ Object.defineProperty(exports, "segmentSegmentDistance", { enumerable: true, get: function () { return collision_js_1.segmentSegmentDistance; } });
62
+ Object.defineProperty(exports, "segmentsIntersect", { enumerable: true, get: function () { return collision_js_1.segmentsIntersect; } });
56
63
  Object.defineProperty(exports, "sortAabbsByStableId", { enumerable: true, get: function () { return collision_js_1.sortAabbsByStableId; } });
57
64
  Object.defineProperty(exports, "translateAabb", { enumerable: true, get: function () { return collision_js_1.translateAabb; } });
58
65
  var collections_js_1 = require("./collections.js");
@@ -105,6 +112,12 @@ var errors_js_1 = require("./errors.js");
105
112
  Object.defineProperty(exports, "SyncplayError", { enumerable: true, get: function () { return errors_js_1.SyncplayError; } });
106
113
  var math_js_1 = require("./math.js");
107
114
  Object.defineProperty(exports, "createDeterministicMath", { enumerable: true, get: function () { return math_js_1.createDeterministicMath; } });
115
+ var noise_js_1 = require("./noise.js");
116
+ Object.defineProperty(exports, "fbm2D", { enumerable: true, get: function () { return noise_js_1.fbm2D; } });
117
+ Object.defineProperty(exports, "hash2", { enumerable: true, get: function () { return noise_js_1.hash2; } });
118
+ Object.defineProperty(exports, "hashUint32", { enumerable: true, get: function () { return noise_js_1.hashUint32; } });
119
+ Object.defineProperty(exports, "valueNoise1D", { enumerable: true, get: function () { return noise_js_1.valueNoise1D; } });
120
+ Object.defineProperty(exports, "valueNoise2D", { enumerable: true, get: function () { return noise_js_1.valueNoise2D; } });
108
121
  var mock_network_adapter_js_1 = require("./mock-network-adapter.js");
109
122
  Object.defineProperty(exports, "createDeterministicMockNetworkAdapter", { enumerable: true, get: function () { return mock_network_adapter_js_1.createDeterministicMockNetworkAdapter; } });
110
123
  var movement_js_1 = require("./movement.js");