@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 +55 -9
- package/dist/browser.d.ts +3 -0
- package/dist/browser.js +2 -0
- package/dist/certification.d.ts +12 -0
- package/dist/certification.js +10 -1
- package/dist/cjs/browser.js +4 -1
- package/dist/cjs/certification.js +9 -0
- package/dist/cjs/collision.js +58 -0
- package/dist/cjs/index.js +16 -3
- package/dist/cjs/math.js +342 -15
- package/dist/cjs/node.js +3 -1
- package/dist/cjs/noise.js +58 -0
- package/dist/cjs/random.js +49 -0
- package/dist/cjs/sdk-offline.js +6 -32
- package/dist/cjs/sdk-session.js +156 -0
- package/dist/cjs/session-build.js +42 -0
- package/dist/cli.js +23 -3
- package/dist/collision.d.ts +12 -0
- package/dist/collision.js +52 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/math.d.ts +59 -6
- package/dist/math.js +342 -15
- package/dist/node.d.ts +2 -0
- package/dist/node.js +1 -0
- package/dist/noise.d.ts +7 -0
- package/dist/noise.js +51 -0
- package/dist/random.d.ts +7 -0
- package/dist/random.js +49 -0
- package/dist/sdk-offline.js +6 -32
- package/dist/sdk-session.d.ts +47 -0
- package/dist/sdk-session.js +153 -0
- package/dist/session-build.d.ts +21 -0
- package/dist/session-build.js +39 -0
- package/dist/tools/vite-plugin.d.ts +8 -0
- package/dist/tools/vite-plugin.js +63 -9
- package/package.json +1 -1
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
|
-
|
|
49
|
-
`project:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
(
|
|
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';
|
package/dist/certification.d.ts
CHANGED
|
@@ -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: {
|
package/dist/certification.js
CHANGED
|
@@ -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,
|
package/dist/cjs/browser.js
CHANGED
|
@@ -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,
|
package/dist/cjs/collision.js
CHANGED
|
@@ -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.
|
|
18
|
-
exports.
|
|
19
|
-
exports.
|
|
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");
|