@fundamental-engine/core 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +7 -7
  2. package/dist/config/themes.d.ts +22 -0
  3. package/dist/config/themes.d.ts.map +1 -0
  4. package/dist/config/themes.js +9 -0
  5. package/dist/config/themes.js.map +1 -0
  6. package/dist/contracts/guards.d.ts +14 -0
  7. package/dist/contracts/guards.d.ts.map +1 -1
  8. package/dist/contracts/guards.js +21 -0
  9. package/dist/contracts/guards.js.map +1 -1
  10. package/dist/core/agents.d.ts +1 -1
  11. package/dist/core/agents.d.ts.map +1 -1
  12. package/dist/core/agents.js +5 -2
  13. package/dist/core/agents.js.map +1 -1
  14. package/dist/core/events.d.ts +15 -0
  15. package/dist/core/events.d.ts.map +1 -1
  16. package/dist/core/events.js.map +1 -1
  17. package/dist/core/field.d.ts.map +1 -1
  18. package/dist/core/field.js +295 -99
  19. package/dist/core/field.js.map +1 -1
  20. package/dist/core/host.d.ts +8 -1
  21. package/dist/core/host.d.ts.map +1 -1
  22. package/dist/core/host.js +1 -1
  23. package/dist/core/math.d.ts +4 -3
  24. package/dist/core/math.d.ts.map +1 -1
  25. package/dist/core/math.js +10 -9
  26. package/dist/core/math.js.map +1 -1
  27. package/dist/core/scanner.d.ts +1 -1
  28. package/dist/core/scanner.d.ts.map +1 -1
  29. package/dist/core/scanner.js +8 -4
  30. package/dist/core/scanner.js.map +1 -1
  31. package/dist/core/temporal.d.ts +2 -2
  32. package/dist/core/temporal.js +2 -2
  33. package/dist/core/types.d.ts +81 -43
  34. package/dist/core/types.d.ts.map +1 -1
  35. package/dist/export.d.ts +1 -1
  36. package/dist/forces/index.d.ts.map +1 -1
  37. package/dist/forces/index.js +3 -1
  38. package/dist/forces/index.js.map +1 -1
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +2 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/recipes/compile.d.ts +1 -1
  44. package/dist/recipes/index.js +1 -1
  45. package/dist/recipes/index.js.map +1 -1
  46. package/dist/version.d.ts +8 -0
  47. package/dist/version.d.ts.map +1 -0
  48. package/dist/version.js +8 -0
  49. package/dist/version.js.map +1 -0
  50. package/package.json +1 -1
package/README.md CHANGED
@@ -18,7 +18,7 @@ renderer other than the DOM canvas.
18
18
  npm i @fundamental-engine/core
19
19
  ```
20
20
 
21
- The browser host lives in [`@fundamental-engine/platform`](../platform); most apps reach for a thin adapter
21
+ The browser host lives in [`@fundamental-engine/dom`](../platform); most apps reach for a thin adapter
22
22
  ([`@fundamental-engine/elements`](../elements), [`@fundamental-engine/react`](../react), [`@fundamental-engine/vanilla`](../vanilla))
23
23
  instead of wiring the host themselves. The public surface is frozen for `0.x` (see
24
24
  [API stability](../../docs/canonical/api-stability.md)).
@@ -37,18 +37,18 @@ instead of wiring the host themselves. The public surface is frozen for `0.x` (s
37
37
  `voronoi`, `field-lines`, `heatmap`) and diagnostics (`force-vectors`, `contours`, `potential`,
38
38
  `energy`, `topology`, `inspector`, `causality`, `prediction`).
39
39
  - **64 recipes** across 4 tiers: a recipe is a portable field program. `compileRecipe()` lives here
40
- (pure, no DOM); `applyRecipe()` and `bindData()` are in [`@fundamental-engine/platform`](../platform).
40
+ (pure, no DOM); `applyRecipe()` and `bindData()` are in [`@fundamental-engine/dom`](../platform).
41
41
  - **A conformance framework** that fires known particles into each force and checks the measured
42
42
  trajectory against the math. The same catalog drives the tests and the visual Lab.
43
43
 
44
44
  ## Quick start
45
45
 
46
46
  `createField` is renderer-agnostic, so it **requires a host** (a `FieldHost`: viewport, scroll, raf,
47
- and a canvas). In the browser, the host comes from [`@fundamental-engine/platform`](../platform):
47
+ and a canvas). In the browser, the host comes from [`@fundamental-engine/dom`](../platform):
48
48
 
49
49
  ```ts
50
50
  import { createField } from '@fundamental-engine/core';
51
- import { browserHost } from '@fundamental-engine/platform';
51
+ import { browserHost } from '@fundamental-engine/dom';
52
52
 
53
53
  const canvas = document.querySelector('canvas')!;
54
54
  const field = createField(canvas, { host: browserHost(), accent: '#4da3ff' });
@@ -108,18 +108,18 @@ const plan = compileRecipe(recipeById('priority-well')!);
108
108
  ```
109
109
 
110
110
  `applyRecipe()` (run a recipe on a live DOM platform) and `bindData()` (records → bodies) are in
111
- [`@fundamental-engine/platform`](../platform). Browse all 64 at [`/docs/gallery`](https://fundamental-engine.com/docs/gallery).
111
+ [`@fundamental-engine/dom`](../platform). Browse all 64 at [`/docs/gallery`](https://fundamental-engine.com/docs/gallery).
112
112
 
113
113
  ## Renderer-agnostic
114
114
 
115
115
  The engine touches no DOM globals (a boundary test keeps the allowlist empty). Everything the browser
116
116
  provides arrives through an injected `FieldHost`, so the same engine runs on a DOM canvas, an offscreen
117
117
  canvas, a headless harness, or any renderer you implement. `browserHost()` (in
118
- [`@fundamental-engine/platform`](../platform)) is the canonical DOM implementation of that contract.
118
+ [`@fundamental-engine/dom`](../platform)) is the canonical DOM implementation of that contract.
119
119
 
120
120
  ## Related
121
121
 
122
- [`@fundamental-engine/platform`](../platform) · [`@fundamental-engine/elements`](../elements) ·
122
+ [`@fundamental-engine/dom`](../platform) · [`@fundamental-engine/elements`](../elements) ·
123
123
  [`@fundamental-engine/react`](../react) · [`@fundamental-engine/vanilla`](../vanilla) · the
124
124
  [documentation map](../../docs/README.md).
125
125
 
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Field themes (#529) — the ambient palette as a first-class contract, not a fork. A theme bundles the
3
+ * free-particle **heat ramp** (`cool` → `warm` ends, §20.8) and the background-wave **baseline**. Before
4
+ * this, those were hardcoded module constants (`COOL`/`WARM` in `math.ts`, `WAVE_RGB` in `field.ts`), so
5
+ * changing the look meant patching core. Now `FieldOptions.theme` picks a preset and
6
+ * `gradientCool`/`gradientWarm`/`waveBaseline` override individual lanes — additive, the frozen surface
7
+ * intact, and `theme: 'warm'` reproduces the shipped defaults byte-for-byte.
8
+ */
9
+ import type { RGB } from '../core/math.ts';
10
+ export interface FieldTheme {
11
+ /** the resting (cool) end of the free-particle heat ramp. */
12
+ cool: RGB;
13
+ /** the energized (warm) end of the heat ramp. */
14
+ warm: RGB;
15
+ /** the background-wave baseline colors (hex), built into the resting Currents. */
16
+ wave: readonly string[];
17
+ }
18
+ /** Named presets. `warm` is the shipped 0.8.0 default; `cool` and `mono` are alternatives. */
19
+ export declare const THEMES: Record<string, FieldTheme>;
20
+ /** The default theme id — the shipped warm palette. */
21
+ export declare const DEFAULT_THEME = "warm";
22
+ //# sourceMappingURL=themes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../../src/config/themes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,IAAI,EAAE,GAAG,CAAC;IACV,iDAAiD;IACjD,IAAI,EAAE,GAAG,CAAC;IACV,kFAAkF;IAClF,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAED,8FAA8F;AAC9F,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAI7C,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,aAAa,SAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** Named presets. `warm` is the shipped 0.8.0 default; `cool` and `mono` are alternatives. */
2
+ export const THEMES = {
3
+ warm: { cool: [255, 224, 200], warm: [255, 110, 80], wave: ['#ff8a5c', '#f0628e', '#ffc46b'] },
4
+ cool: { cool: [206, 226, 255], warm: [74, 132, 255], wave: ['#5c8aff', '#62a0f0', '#6bc4ff'] },
5
+ mono: { cool: [232, 232, 238], warm: [148, 148, 158], wave: ['#8a8a96', '#b0b0bc', '#9a9aa6'] },
6
+ };
7
+ /** The default theme id — the shipped warm palette. */
8
+ export const DEFAULT_THEME = 'warm';
9
+ //# sourceMappingURL=themes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.js","sourceRoot":"","sources":["../../src/config/themes.ts"],"names":[],"mappings":"AAmBA,8FAA8F;AAC9F,MAAM,CAAC,MAAM,MAAM,GAA+B;IAChD,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;IAC9F,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;IAC9F,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;CAChG,CAAC;AAEF,uDAAuD;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC"}
@@ -22,6 +22,20 @@ export declare class FieldUIError extends Error {
22
22
  export declare function setContractChecks(on: boolean): void;
23
23
  /** Whether contract checks are currently active. */
24
24
  export declare function contractChecksEnabled(): boolean;
25
+ /** Diagnostic codes for SILENT no-ops — a call that returned a neutral value (0, {0,0}, nothing)
26
+ * because a prerequisite was missing. Advisory, not a contract violation: the call is legal, it
27
+ * just couldn't do anything. */
28
+ export type FieldUINoOpCode = 'NOOP_NO_HEATMAP';
29
+ /**
30
+ * Dev-only, deduped `console.warn` for a SILENT no-op: a method that returned a neutral value
31
+ * because a prerequisite is missing, so an embedder learns *why* nothing happened instead of
32
+ * debugging a mysterious zero. No-op in production (gated by the same `CHECKS` flag the guards use,
33
+ * so a bundler that defines `NODE_ENV` dead-code-eliminates it). Deduped by message, so a call made
34
+ * every frame warns at most once. Never throws — the no-op is legal; this only explains it.
35
+ */
36
+ export declare function devWarnNoOp(code: FieldUINoOpCode, message: string): void;
37
+ /** Clear the no-op warning dedup set — for tests that assert the warn fires. */
38
+ export declare function resetNoOpWarnings(): void;
25
39
  /** A particle's numeric state must stay finite (no NaN/Infinity). */
26
40
  export declare function assertParticleFinite(p: Particle, where?: string): void;
27
41
  /** A registered Shadow-DOM body must produce a usable rectangle. */
@@ -1 +1 @@
1
- {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/contracts/guards.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,sCAAsC;AACtC,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,cAAc,GACd,0BAA0B,GAC1B,wBAAwB,GACxB,+BAA+B,GAC/B,oBAAoB,CAAC;AAEzB,wDAAwD;AACxD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;gBACpB,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;CAKpD;AAUD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAEnD;AACD,oDAAoD;AACpD,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAQD,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,SAAa,GAAG,IAAI,CAI1E;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,IAAI,CAIjF;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAKpG;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,SAAc,GAAG,IAAI,CAI5F;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAIpE;AAED,oFAAoF;AACpF,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,SAAU,GAAG,IAAI,CAIvF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,SAAkB,GAAG,CAAC,CAO5G;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACzC,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,IAAI,CAMN"}
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/contracts/guards.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,sCAAsC;AACtC,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,GACjB,cAAc,GACd,0BAA0B,GAC1B,wBAAwB,GACxB,+BAA+B,GAC/B,oBAAoB,CAAC;AAEzB,wDAAwD;AACxD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;gBACpB,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;CAKpD;AAUD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAEnD;AACD,oDAAoD;AACpD,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAQD;;iCAEiC;AACjC,MAAM,MAAM,eAAe,GACvB,iBAAiB,CAAC;AAItB;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMxE;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAID,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,SAAa,GAAG,IAAI,CAI1E;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,IAAI,CAIjF;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAKpG;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,SAAc,GAAG,IAAI,CAI5F;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAIpE;AAED,oFAAoF;AACpF,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,SAAU,GAAG,IAAI,CAIvF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,SAAkB,GAAG,CAAC,CAO5G;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACzC,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,IAAI,CAMN"}
@@ -25,6 +25,27 @@ export function contractChecksEnabled() {
25
25
  function fail(code, message) {
26
26
  throw new FieldUIError(code, message);
27
27
  }
28
+ const warnedOnce = new Set();
29
+ /**
30
+ * Dev-only, deduped `console.warn` for a SILENT no-op: a method that returned a neutral value
31
+ * because a prerequisite is missing, so an embedder learns *why* nothing happened instead of
32
+ * debugging a mysterious zero. No-op in production (gated by the same `CHECKS` flag the guards use,
33
+ * so a bundler that defines `NODE_ENV` dead-code-eliminates it). Deduped by message, so a call made
34
+ * every frame warns at most once. Never throws — the no-op is legal; this only explains it.
35
+ */
36
+ export function devWarnNoOp(code, message) {
37
+ if (!CHECKS)
38
+ return;
39
+ const key = `${code}:${message}`;
40
+ if (warnedOnce.has(key))
41
+ return;
42
+ warnedOnce.add(key);
43
+ console.warn(`[Fundamental:${code}] ${message}`);
44
+ }
45
+ /** Clear the no-op warning dedup set — for tests that assert the warn fires. */
46
+ export function resetNoOpWarnings() {
47
+ warnedOnce.clear();
48
+ }
28
49
  // ── guards ──────────────────────────────────────────────────────────────────────────────────
29
50
  /** A particle's numeric state must stay finite (no NaN/Infinity). */
30
51
  export function assertParticleFinite(p, where = 'particle') {
@@ -1 +1 @@
1
- {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/contracts/guards.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/contracts/guards.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ export declare function elementMass(area: number): number;
21
21
  * `Σ C·(c − cⱼ)/|c − cⱼ|²` — so a cluster spreads out. Softened near coincidence so
22
22
  * fully-overlapping elements don't blow up. `others` are the other element centres.
23
23
  */
24
- export declare function repelForce(self: Vec2, others: readonly Vec2[], C?: number, soft?: number): Vec2;
24
+ export declare function repelForce(self: Vec2, others: readonly Vec2[], skip?: number, C?: number, soft?: number): Vec2;
25
25
  /**
26
26
  * Density-pressure force (Concept 3): push an element *down* the local density gradient
27
27
  * (toward emptier field), `−∇ρ`, estimated by a 4-tap finite difference of a density
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAC7B,CAAC,EAAE,aAAa,EAChB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,QAAQ,SAAM,EACd,SAAS,SAAK,GACb,IAAI,CAWN;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,SAAO,GAAG,IAAI,CAE5D;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC,SAAO,EAAE,IAAI,SAAK,GAAG,IAAI,CAYzF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EACxC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,SAAK,EACV,KAAK,SAAI,GACR,IAAI,CAIN"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAC7B,CAAC,EAAE,aAAa,EAChB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,QAAQ,SAAM,EACd,SAAS,SAAK,GACb,IAAI,CAWN;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,SAAO,GAAG,IAAI,CAE5D;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,SAAK,EAAE,CAAC,SAAO,EAAE,IAAI,SAAK,GAAG,IAAI,CAcpG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,EACxC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,SAAK,EACV,KAAK,SAAI,GACR,IAAI,CAIN"}
@@ -25,11 +25,14 @@ export function elementMass(area) {
25
25
  * `Σ C·(c − cⱼ)/|c − cⱼ|²` — so a cluster spreads out. Softened near coincidence so
26
26
  * fully-overlapping elements don't blow up. `others` are the other element centres.
27
27
  */
28
- export function repelForce(self, others, C = 1600, soft = 26) {
28
+ export function repelForce(self, others, skip = -1, C = 1600, soft = 26) {
29
29
  let fx = 0;
30
30
  let fy = 0;
31
31
  const s2 = soft * soft;
32
- for (const o of others) {
32
+ for (let i = 0; i < others.length; i++) {
33
+ if (i === skip)
34
+ continue; // exclude self by index — saves a per-frame `others.filter(j !== i)` alloc (#530)
35
+ const o = others[i];
33
36
  const dx = self.x - o.x;
34
37
  const dy = self.y - o.y;
35
38
  const d2 = dx * dx + dy * dy + s2; // softened |c − cⱼ|²
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,21 @@ export interface FieldEventMap {
17
17
  body: Body;
18
18
  count: number;
19
19
  };
20
+ /** another body crossed INTO this body's `range` (#441) — the gameplay "entered radius" trigger. */
21
+ enter: {
22
+ body: Body;
23
+ other: Body;
24
+ };
25
+ /** another body crossed OUT of this body's `range` (#441). */
26
+ exit: {
27
+ body: Body;
28
+ other: Body;
29
+ };
30
+ /** two bodies came into contact — their boxes touched/overlapped (#441), once on the rising edge. */
31
+ met: {
32
+ a: Body;
33
+ b: Body;
34
+ };
20
35
  }
21
36
  export type FieldEventType = keyof FieldEventMap;
22
37
  export interface EventBinding {
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,mFAAmF;IACnF,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AACD,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAU/D;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAavE"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,mFAAmF;IACnF,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,oGAAoG;IACpG,KAAK,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IACnC,8DAA8D;IAC9D,IAAI,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IAClC,qGAAqG;IACrG,GAAG,EAAE;QAAE,CAAC,EAAE,IAAI,CAAC;QAAC,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;CAC3B;AACD,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAU/D;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAavE"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyBH,0FAA0F;AAC1F,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AASD,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,CAAe;IAC5D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,EAAE,CAAC;QACd,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,0FAA0F;AAC1F,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AASD,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,CAAe;IAC5D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,EAAE,CAAC;QACd,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/core/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAA4C,WAAW,EAAE,YAAY,EAAkD,MAAM,YAAY,CAAC;AA2DtJ,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW,CAq+D3F"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/core/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAA4C,WAAW,EAAE,YAAY,EAAkD,MAAM,YAAY,CAAC;AA2DtJ,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW,CA2oE3F"}