@futdevpro/fsm-dynamo 1.20.95 → 1.20.97

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 (23) hide show
  1. package/build/_modules/game/_models/flying-effect.control-model.d.ts +7 -0
  2. package/build/_modules/game/_models/flying-effect.control-model.d.ts.map +1 -1
  3. package/build/_modules/game/_models/flying-effect.control-model.js +12 -1
  4. package/build/_modules/game/_models/flying-effect.control-model.js.map +1 -1
  5. package/build/_modules/game/_models/flying-effect.interface.d.ts +3 -0
  6. package/build/_modules/game/_models/flying-effect.interface.d.ts.map +1 -1
  7. package/build/_modules/game/_models/simulation-clock.control-model.d.ts +39 -0
  8. package/build/_modules/game/_models/simulation-clock.control-model.d.ts.map +1 -0
  9. package/build/_modules/game/_models/simulation-clock.control-model.js +122 -0
  10. package/build/_modules/game/_models/simulation-clock.control-model.js.map +1 -0
  11. package/build/_modules/game/_models/simulation-clock.interface.d.ts +44 -0
  12. package/build/_modules/game/_models/simulation-clock.interface.d.ts.map +1 -0
  13. package/build/_modules/game/_models/simulation-clock.interface.js +3 -0
  14. package/build/_modules/game/_models/simulation-clock.interface.js.map +1 -0
  15. package/build/_modules/game/index.d.ts +2 -0
  16. package/build/_modules/game/index.d.ts.map +1 -1
  17. package/build/_modules/game/index.js +2 -0
  18. package/build/_modules/game/index.js.map +1 -1
  19. package/build-esm/_modules/game/_models/flying-effect.control-model.js +12 -1
  20. package/build-esm/_modules/game/_models/simulation-clock.control-model.js +117 -0
  21. package/build-esm/_modules/game/_models/simulation-clock.interface.js +1 -0
  22. package/build-esm/_modules/game/index.js +2 -0
  23. package/package.json +1 -1
@@ -5,6 +5,7 @@ export declare class DyFM_FlyingEffect_ControlModel {
5
5
  private readonly defaultDurationMs;
6
6
  private readonly defaultRisePx;
7
7
  private readonly defaultStackGapPx;
8
+ private reducedMotion;
8
9
  private items;
9
10
  private sequence;
10
11
  private paused;
@@ -16,6 +17,12 @@ export declare class DyFM_FlyingEffect_ControlModel {
16
17
  private evictedCount;
17
18
  private highWatermark;
18
19
  constructor(config?: DyFM_FlyingEffect_Config);
20
+ /**
21
+ * BFR-WARFACTORY-006 — reduced motion (e.g. the player setting or `prefers-reduced-motion`): the text no longer RISES,
22
+ * it stays at its anchor + stack offset and only fades (a fade is not motion). Takes effect from the next snapshot —
23
+ * lifetimes, stacking and expiry are unchanged, so switching it mid-game is safe.
24
+ */
25
+ setReducedMotion(reducedMotion: boolean): void;
19
26
  spawn(command: DyFM_FlyingEffect_SpawnCommand, nowMs: number): DyFM_FlyingEffect_Snapshot;
20
27
  advanceTo(nowMs: number): readonly DyFM_FlyingEffect_Snapshot[];
21
28
  setPaused(paused: boolean, nowMs: number): readonly DyFM_FlyingEffect_Snapshot[];
@@ -1 +1 @@
1
- {"version":3,"file":"flying-effect.control-model.d.ts","sourceRoot":"","sources":["../../../../src/_modules/game/_models/flying-effect.control-model.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAE7B,0BAA0B,EAC1B,8BAA8B,EAE/B,MAAM,2BAA2B,CAAC;AAiBnC,+FAA+F;AAC/F,qBAAa,8BAA8B;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;gBAEd,MAAM,GAAE,wBAA6B;IAOjD,KAAK,CAAC,OAAO,EAAE,8BAA8B,EAAE,KAAK,EAAE,MAAM,GAAG,0BAA0B;IAsDzF,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,0BAA0B,EAAE;IAW/D,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,0BAA0B,EAAE;IAoBhF,KAAK,IAAI,IAAI;IAIb,YAAY,IAAI,SAAS,0BAA0B,EAAE;IA+BrD,cAAc,IAAI,6BAA6B;IAa/C,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,IAAI;CAGb"}
1
+ {"version":3,"file":"flying-effect.control-model.d.ts","sourceRoot":"","sources":["../../../../src/_modules/game/_models/flying-effect.control-model.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAE7B,0BAA0B,EAC1B,8BAA8B,EAE/B,MAAM,2BAA2B,CAAC;AAiBnC,+FAA+F;AAC/F,qBAAa,8BAA8B;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;gBAEd,MAAM,GAAE,wBAA6B;IAQjD;;;;OAIG;IACH,gBAAgB,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI;IAI9C,KAAK,CAAC,OAAO,EAAE,8BAA8B,EAAE,KAAK,EAAE,MAAM,GAAG,0BAA0B;IAsDzF,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,0BAA0B,EAAE;IAW/D,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,0BAA0B,EAAE;IAoBhF,KAAK,IAAI,IAAI;IAIb,YAAY,IAAI,SAAS,0BAA0B,EAAE;IA+BrD,cAAc,IAAI,6BAA6B;IAc/C,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,IAAI;CAGb"}
@@ -8,6 +8,7 @@ class DyFM_FlyingEffect_ControlModel {
8
8
  defaultDurationMs;
9
9
  defaultRisePx;
10
10
  defaultStackGapPx;
11
+ reducedMotion;
11
12
  items = [];
12
13
  sequence = 0;
13
14
  paused = false;
@@ -23,6 +24,15 @@ class DyFM_FlyingEffect_ControlModel {
23
24
  this.defaultDurationMs = this.positive(config.defaultDurationMs ?? 1_400, 'defaultDurationMs');
24
25
  this.defaultRisePx = this.nonNegative(config.defaultRisePx ?? 52, 'defaultRisePx');
25
26
  this.defaultStackGapPx = this.nonNegative(config.defaultStackGapPx ?? 18, 'defaultStackGapPx');
27
+ this.reducedMotion = config.reducedMotion === true;
28
+ }
29
+ /**
30
+ * BFR-WARFACTORY-006 — reduced motion (e.g. the player setting or `prefers-reduced-motion`): the text no longer RISES,
31
+ * it stays at its anchor + stack offset and only fades (a fade is not motion). Takes effect from the next snapshot —
32
+ * lifetimes, stacking and expiry are unchanged, so switching it mid-game is safe.
33
+ */
34
+ setReducedMotion(reducedMotion) {
35
+ this.reducedMotion = reducedMotion === true;
26
36
  }
27
37
  spawn(command, nowMs) {
28
38
  this.validateCommand(command);
@@ -132,7 +142,7 @@ class DyFM_FlyingEffect_ControlModel {
132
142
  mergeKey: item.mergeKey,
133
143
  progress,
134
144
  opacity: 1 - progress,
135
- offsetY: -(item.risePx * progress + item.stackGapPx * stackIndex),
145
+ offsetY: -((this.reducedMotion ? 0 : item.risePx * progress) + item.stackGapPx * stackIndex),
136
146
  stackIndex,
137
147
  };
138
148
  });
@@ -146,6 +156,7 @@ class DyFM_FlyingEffect_ControlModel {
146
156
  expiredCount: this.expiredCount,
147
157
  evictedCount: this.evictedCount,
148
158
  paused: this.paused,
159
+ reducedMotion: this.reducedMotion,
149
160
  lastTimeMs: this.lastTimeMs,
150
161
  };
151
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flying-effect.control-model.js","sourceRoot":"","sources":["../../../../src/_modules/game/_models/flying-effect.control-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flying-effect.control-model.js","sourceRoot":"","sources":["../../../../src/_modules/game/_models/flying-effect.control-model.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,8 @@ export interface DyFM_FlyingEffect_Config {
39
39
  defaultDurationMs?: number;
40
40
  defaultRisePx?: number;
41
41
  defaultStackGapPx?: number;
42
+ /** BFR-WARFACTORY-006 — no rise, fade only (switchable later with `setReducedMotion`). Default: `false`. */
43
+ reducedMotion?: boolean;
42
44
  }
43
45
  export interface DyFM_FlyingEffect_Diagnostics {
44
46
  activeCount: number;
@@ -48,6 +50,7 @@ export interface DyFM_FlyingEffect_Diagnostics {
48
50
  expiredCount: number;
49
51
  evictedCount: number;
50
52
  paused: boolean;
53
+ reducedMotion: boolean;
51
54
  lastTimeMs: number | null;
52
55
  }
53
56
  //# sourceMappingURL=flying-effect.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flying-effect.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/game/_models/flying-effect.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,uBAAuB,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,uBAAuB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
1
+ {"version":3,"file":"flying-effect.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/game/_models/flying-effect.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,uBAAuB,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,uBAAuB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4GAA4G;IAC5G,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
@@ -0,0 +1,39 @@
1
+ import { DyFM_SimulationClock_AdvanceInput, DyFM_SimulationClock_AdvanceResult, DyFM_SimulationClock_Config, DyFM_SimulationClock_State } from './simulation-clock.interface';
2
+ /**
3
+ * BFR-WARFACTORY-010 — framework-independent, monotonic simulation clock.
4
+ *
5
+ * - The CALLER supplies real delta, speed and pause; the clock never reads wall time (deterministic, replayable).
6
+ * - Fixed-step mode (`fixedStepSeconds`): scaled time goes into an accumulator, whole steps are committed and the
7
+ * remainder carries over — at speed 10 the loop runs ten times as many steps of the same size, so fast-forward is
8
+ * behaviour-neutral. Variable mode (no `fixedStepSeconds`): one step of `realDelta * speed` (not neutral).
9
+ * - Real deltas are clamped (`maxRealDeltaSeconds`) and fixed steps capped (`maxStepsPerAdvance`); what is cut or
10
+ * dropped is reported, never silently lost.
11
+ * - `exportState` / `importState` (versioned; the legacy `{ elapsedSimulationSeconds }` shape is accepted) / `reset`.
12
+ * An invalid snapshot is rejected WITHOUT touching the running clock.
13
+ */
14
+ export declare class DyFM_SimulationClock_ControlModel {
15
+ private readonly fixedStepSeconds;
16
+ private readonly maxRealDeltaSeconds;
17
+ private readonly maxStepsPerAdvance;
18
+ private elapsedSeconds;
19
+ private accumulatorSeconds;
20
+ /** Creates the clock; an invalid configuration throws (`DYFM-SIM-CLOCK-CONFIG`). */
21
+ constructor(config?: DyFM_SimulationClock_Config);
22
+ /** Total committed simulation seconds. */
23
+ now(): number;
24
+ /** Advances by one real frame. Paused, speed ≤ 0 or a non-finite input ⇒ nothing passes (a zero result). */
25
+ advance(input: DyFM_SimulationClock_AdvanceInput): DyFM_SimulationClock_AdvanceResult;
26
+ /** The save/load snapshot. */
27
+ exportState(): DyFM_SimulationClock_State;
28
+ /**
29
+ * Restores a snapshot; returns `false` (and changes NOTHING) when it is invalid. Accepts the legacy
30
+ * `{ elapsedSimulationSeconds }` shape (no `schemaVersion`) as an empty accumulator.
31
+ */
32
+ importState(snapshot: unknown): boolean;
33
+ /** A new run: zero elapsed time and accumulator. */
34
+ reset(): void;
35
+ private static isNonNegative;
36
+ private static positive;
37
+ private static configError;
38
+ }
39
+ //# sourceMappingURL=simulation-clock.control-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulation-clock.control-model.d.ts","sourceRoot":"","sources":["../../../../src/_modules/game/_models/simulation-clock.control-model.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iCAAiC,EACjC,kCAAkC,EAClC,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,8BAA8B,CAAC;AAEtC;;;;;;;;;;;GAWG;AACH,qBAAa,iCAAiC;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,kBAAkB,CAAa;IAEvC,oFAAoF;gBACxE,MAAM,GAAE,2BAAgC;IAcpD,0CAA0C;IAC1C,GAAG,IAAI,MAAM;IAIb,4GAA4G;IAC5G,OAAO,CAAC,KAAK,EAAE,iCAAiC,GAAG,kCAAkC;IA4CrF,8BAA8B;IAC9B,WAAW,IAAI,0BAA0B;IAIzC;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO;IAoBvC,oDAAoD;IACpD,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,OAAO,CAAC,MAAM,CAAC,QAAQ;IAQvB,OAAO,CAAC,MAAM,CAAC,WAAW;CAO3B"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyFM_SimulationClock_ControlModel = void 0;
4
+ const error_control_model_1 = require("../../../_models/control-models/error.control-model");
5
+ /**
6
+ * BFR-WARFACTORY-010 — framework-independent, monotonic simulation clock.
7
+ *
8
+ * - The CALLER supplies real delta, speed and pause; the clock never reads wall time (deterministic, replayable).
9
+ * - Fixed-step mode (`fixedStepSeconds`): scaled time goes into an accumulator, whole steps are committed and the
10
+ * remainder carries over — at speed 10 the loop runs ten times as many steps of the same size, so fast-forward is
11
+ * behaviour-neutral. Variable mode (no `fixedStepSeconds`): one step of `realDelta * speed` (not neutral).
12
+ * - Real deltas are clamped (`maxRealDeltaSeconds`) and fixed steps capped (`maxStepsPerAdvance`); what is cut or
13
+ * dropped is reported, never silently lost.
14
+ * - `exportState` / `importState` (versioned; the legacy `{ elapsedSimulationSeconds }` shape is accepted) / `reset`.
15
+ * An invalid snapshot is rejected WITHOUT touching the running clock.
16
+ */
17
+ class DyFM_SimulationClock_ControlModel {
18
+ fixedStepSeconds;
19
+ maxRealDeltaSeconds;
20
+ maxStepsPerAdvance;
21
+ elapsedSeconds = 0;
22
+ accumulatorSeconds = 0;
23
+ /** Creates the clock; an invalid configuration throws (`DYFM-SIM-CLOCK-CONFIG`). */
24
+ constructor(config = {}) {
25
+ this.fixedStepSeconds = config.fixedStepSeconds === undefined
26
+ ? undefined
27
+ : DyFM_SimulationClock_ControlModel.positive(config.fixedStepSeconds, 'fixedStepSeconds');
28
+ this.maxRealDeltaSeconds =
29
+ DyFM_SimulationClock_ControlModel.positive(config.maxRealDeltaSeconds ?? 0.25, 'maxRealDeltaSeconds');
30
+ this.maxStepsPerAdvance = DyFM_SimulationClock_ControlModel.positive(config.maxStepsPerAdvance ?? 240, 'maxStepsPerAdvance');
31
+ if (!Number.isInteger(this.maxStepsPerAdvance)) {
32
+ throw DyFM_SimulationClock_ControlModel.configError('maxStepsPerAdvance must be an integer');
33
+ }
34
+ }
35
+ /** Total committed simulation seconds. */
36
+ now() {
37
+ return this.elapsedSeconds;
38
+ }
39
+ /** Advances by one real frame. Paused, speed ≤ 0 or a non-finite input ⇒ nothing passes (a zero result). */
40
+ advance(input) {
41
+ const idle = {
42
+ simulationDeltaSeconds: 0, steps: 0, stepSeconds: this.fixedStepSeconds ?? 0,
43
+ clampedRealSeconds: 0, droppedSimulationSeconds: 0,
44
+ };
45
+ if (input.paused || !Number.isFinite(input.realDeltaSeconds) || !Number.isFinite(input.speed)
46
+ || input.speed <= 0 || input.realDeltaSeconds <= 0) {
47
+ return idle;
48
+ }
49
+ const realSeconds = Math.min(input.realDeltaSeconds, this.maxRealDeltaSeconds);
50
+ const clampedRealSeconds = input.realDeltaSeconds - realSeconds;
51
+ const scaledSeconds = realSeconds * input.speed;
52
+ if (this.fixedStepSeconds === undefined) {
53
+ // Variable step: one update of the scaled delta (documented as NOT behaviour-neutral across speeds)
54
+ this.elapsedSeconds += scaledSeconds;
55
+ return {
56
+ simulationDeltaSeconds: scaledSeconds, steps: 1, stepSeconds: scaledSeconds,
57
+ clampedRealSeconds: clampedRealSeconds, droppedSimulationSeconds: 0,
58
+ };
59
+ }
60
+ // Fixed step: commit whole steps, carry the remainder, cap the burst (spiral-of-death guard)
61
+ this.accumulatorSeconds += scaledSeconds;
62
+ // the epsilon keeps 3 × (1/60) from rounding down to 2 steps
63
+ const available = Math.floor(this.accumulatorSeconds / this.fixedStepSeconds + 1e-9);
64
+ const steps = Math.min(available, this.maxStepsPerAdvance);
65
+ let droppedSimulationSeconds = 0;
66
+ this.accumulatorSeconds = Math.max(0, this.accumulatorSeconds - available * this.fixedStepSeconds);
67
+ if (available > steps) {
68
+ droppedSimulationSeconds = (available - steps) * this.fixedStepSeconds;
69
+ }
70
+ this.elapsedSeconds += steps * this.fixedStepSeconds;
71
+ return {
72
+ simulationDeltaSeconds: steps * this.fixedStepSeconds, steps: steps, stepSeconds: this.fixedStepSeconds,
73
+ clampedRealSeconds: clampedRealSeconds, droppedSimulationSeconds: droppedSimulationSeconds,
74
+ };
75
+ }
76
+ /** The save/load snapshot. */
77
+ exportState() {
78
+ return { schemaVersion: 1, elapsedSimulationSeconds: this.elapsedSeconds, accumulatorSeconds: this.accumulatorSeconds };
79
+ }
80
+ /**
81
+ * Restores a snapshot; returns `false` (and changes NOTHING) when it is invalid. Accepts the legacy
82
+ * `{ elapsedSimulationSeconds }` shape (no `schemaVersion`) as an empty accumulator.
83
+ */
84
+ importState(snapshot) {
85
+ if (!snapshot || typeof snapshot !== 'object') {
86
+ return false;
87
+ }
88
+ const state = snapshot;
89
+ const accumulator = state.schemaVersion === undefined ? 0 : state.accumulatorSeconds;
90
+ if ((state.schemaVersion !== undefined && state.schemaVersion !== 1)
91
+ || !DyFM_SimulationClock_ControlModel.isNonNegative(state.elapsedSimulationSeconds)
92
+ || !DyFM_SimulationClock_ControlModel.isNonNegative(accumulator)) {
93
+ return false;
94
+ }
95
+ this.elapsedSeconds = state.elapsedSimulationSeconds;
96
+ this.accumulatorSeconds = accumulator;
97
+ return true;
98
+ }
99
+ /** A new run: zero elapsed time and accumulator. */
100
+ reset() {
101
+ this.elapsedSeconds = 0;
102
+ this.accumulatorSeconds = 0;
103
+ }
104
+ static isNonNegative(value) {
105
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0;
106
+ }
107
+ static positive(value, field) {
108
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
109
+ throw DyFM_SimulationClock_ControlModel.configError(`${field} must be a finite number > 0 (got ${value})`);
110
+ }
111
+ return value;
112
+ }
113
+ static configError(message) {
114
+ return new error_control_model_1.DyFM_Error({
115
+ message: `DyFM_SimulationClock: ${message}`,
116
+ errorCode: 'DYFM-SIM-CLOCK-CONFIG',
117
+ issuerService: 'DyFM_SimulationClock_ControlModel',
118
+ });
119
+ }
120
+ }
121
+ exports.DyFM_SimulationClock_ControlModel = DyFM_SimulationClock_ControlModel;
122
+ //# sourceMappingURL=simulation-clock.control-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulation-clock.control-model.js","sourceRoot":"","sources":["../../../../src/_modules/game/_models/simulation-clock.control-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /** BFR-WARFACTORY-010 — `DyFM_SimulationClock_ControlModel` configuration. */
2
+ export interface DyFM_SimulationClock_Config {
3
+ /**
4
+ * Fixed simulation step in seconds (e.g. `1 / 60`). When set, `advance` accumulates scaled time and returns how many
5
+ * fixed steps to run — fast-forward then runs MORE steps of the SAME size, so gameplay is behaviour-neutral across
6
+ * speeds. When unset, one variable step of `realDelta * speed` is returned (NOT behaviour-neutral across speeds).
7
+ */
8
+ fixedStepSeconds?: number;
9
+ /** Real-delta clamp in seconds (a tab switch / breakpoint must not become one giant step). Default: `0.25`. */
10
+ maxRealDeltaSeconds?: number;
11
+ /** Fixed mode: at most this many steps per `advance`; the excess is DROPPED and reported. Default: `240`. */
12
+ maxStepsPerAdvance?: number;
13
+ }
14
+ /** BFR-WARFACTORY-010 — the input of one `advance` (the caller owns real time, speed and pause). */
15
+ export interface DyFM_SimulationClock_AdvanceInput {
16
+ /** Real (wall) seconds since the previous frame — measured by the caller; the clock never reads wall time. */
17
+ realDeltaSeconds: number;
18
+ /** Simulation speed multiplier (`0` = stopped). The UI's speed choices stay the caller's. */
19
+ speed: number;
20
+ /** Paused ⇒ no simulation time passes. */
21
+ paused: boolean;
22
+ }
23
+ /** BFR-WARFACTORY-010 — what one `advance` produced. */
24
+ export interface DyFM_SimulationClock_AdvanceResult {
25
+ /** Simulation seconds committed by this call (`steps * stepSeconds`). */
26
+ simulationDeltaSeconds: number;
27
+ /** How many simulation updates to run now (fixed mode: 0..maxStepsPerAdvance; variable mode: 0 or 1). */
28
+ steps: number;
29
+ /** The size of each step in seconds. */
30
+ stepSeconds: number;
31
+ /** Real seconds cut off by `maxRealDeltaSeconds`. */
32
+ clampedRealSeconds: number;
33
+ /** Simulation seconds dropped by `maxStepsPerAdvance` (fixed mode). */
34
+ droppedSimulationSeconds: number;
35
+ }
36
+ /** BFR-WARFACTORY-010 — the save/load snapshot (versioned). */
37
+ export interface DyFM_SimulationClock_State {
38
+ schemaVersion: 1;
39
+ /** Total committed simulation seconds. */
40
+ elapsedSimulationSeconds: number;
41
+ /** Fixed mode: scaled time not yet committed to a step (carried over, so no time is lost between frames). */
42
+ accumulatorSeconds: number;
43
+ }
44
+ //# sourceMappingURL=simulation-clock.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulation-clock.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/game/_models/simulation-clock.interface.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+GAA+G;IAC/G,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,6GAA6G;IAC7G,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,oGAAoG;AACpG,MAAM,WAAW,iCAAiC;IAChD,8GAA8G;IAC9G,gBAAgB,EAAE,MAAM,CAAC;IACzB,6FAA6F;IAC7F,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wDAAwD;AACxD,MAAM,WAAW,kCAAkC;IACjD,yEAAyE;IACzE,sBAAsB,EAAE,MAAM,CAAC;IAC/B,yGAAyG;IACzG,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,+DAA+D;AAC/D,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,CAAC,CAAC;IACjB,0CAA0C;IAC1C,wBAAwB,EAAE,MAAM,CAAC;IACjC,6GAA6G;IAC7G,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=simulation-clock.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulation-clock.interface.js","sourceRoot":"","sources":["../../../../src/_modules/game/_models/simulation-clock.interface.ts"],"names":[],"mappings":""}
@@ -10,6 +10,8 @@ export * from './_models/seeded-random-registry.interface';
10
10
  export * from './_models/seeded-random-registry.control-model';
11
11
  export * from './_models/flying-effect.interface';
12
12
  export * from './_models/flying-effect.control-model';
13
+ export * from './_models/simulation-clock.interface';
14
+ export * from './_models/simulation-clock.control-model';
13
15
  export * from './_collections/audio-mixer.util';
14
16
  export * from './_collections/audio-scale.util';
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/game/index.ts"],"names":[],"mappings":"AACA,cAAc,6BAA6B,CAAC;AAG5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/game/index.ts"],"names":[],"mappings":"AACA,cAAc,6BAA6B,CAAC;AAG5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC"}
@@ -15,6 +15,8 @@ tslib_1.__exportStar(require("./_models/seeded-random-registry.interface"), expo
15
15
  tslib_1.__exportStar(require("./_models/seeded-random-registry.control-model"), exports);
16
16
  tslib_1.__exportStar(require("./_models/flying-effect.interface"), exports);
17
17
  tslib_1.__exportStar(require("./_models/flying-effect.control-model"), exports);
18
+ tslib_1.__exportStar(require("./_models/simulation-clock.interface"), exports);
19
+ tslib_1.__exportStar(require("./_models/simulation-clock.control-model"), exports);
18
20
  // COLLECTIONS
19
21
  tslib_1.__exportStar(require("./_collections/audio-mixer.util"), exports);
20
22
  tslib_1.__exportStar(require("./_collections/audio-scale.util"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/game/index.ts"],"names":[],"mappings":";;;AAAA,QAAQ;AACR,sEAA4C;AAE5C,SAAS;AACT,iFAAuD;AACvD,mFAAyD;AACzD,gFAAsD;AACtD,8EAAoD;AACpD,0EAAgD;AAChD,kFAAwD;AACxD,gFAAsD;AACtD,qFAA2D;AAC3D,yFAA+D;AAC/D,4EAAkD;AAClD,gFAAsD;AAEtD,cAAc;AACd,0EAAgD;AAChD,0EAAgD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/game/index.ts"],"names":[],"mappings":";;;AAAA,QAAQ;AACR,sEAA4C;AAE5C,SAAS;AACT,iFAAuD;AACvD,mFAAyD;AACzD,gFAAsD;AACtD,8EAAoD;AACpD,0EAAgD;AAChD,kFAAwD;AACxD,gFAAsD;AACtD,qFAA2D;AAC3D,yFAA+D;AAC/D,4EAAkD;AAClD,gFAAsD;AACtD,+EAAqD;AACrD,mFAAyD;AAEzD,cAAc;AACd,0EAAgD;AAChD,0EAAgD"}
@@ -5,6 +5,7 @@ export class DyFM_FlyingEffect_ControlModel {
5
5
  defaultDurationMs;
6
6
  defaultRisePx;
7
7
  defaultStackGapPx;
8
+ reducedMotion;
8
9
  items = [];
9
10
  sequence = 0;
10
11
  paused = false;
@@ -20,6 +21,15 @@ export class DyFM_FlyingEffect_ControlModel {
20
21
  this.defaultDurationMs = this.positive(config.defaultDurationMs ?? 1_400, 'defaultDurationMs');
21
22
  this.defaultRisePx = this.nonNegative(config.defaultRisePx ?? 52, 'defaultRisePx');
22
23
  this.defaultStackGapPx = this.nonNegative(config.defaultStackGapPx ?? 18, 'defaultStackGapPx');
24
+ this.reducedMotion = config.reducedMotion === true;
25
+ }
26
+ /**
27
+ * BFR-WARFACTORY-006 — reduced motion (e.g. the player setting or `prefers-reduced-motion`): the text no longer RISES,
28
+ * it stays at its anchor + stack offset and only fades (a fade is not motion). Takes effect from the next snapshot —
29
+ * lifetimes, stacking and expiry are unchanged, so switching it mid-game is safe.
30
+ */
31
+ setReducedMotion(reducedMotion) {
32
+ this.reducedMotion = reducedMotion === true;
23
33
  }
24
34
  spawn(command, nowMs) {
25
35
  this.validateCommand(command);
@@ -129,7 +139,7 @@ export class DyFM_FlyingEffect_ControlModel {
129
139
  mergeKey: item.mergeKey,
130
140
  progress,
131
141
  opacity: 1 - progress,
132
- offsetY: -(item.risePx * progress + item.stackGapPx * stackIndex),
142
+ offsetY: -((this.reducedMotion ? 0 : item.risePx * progress) + item.stackGapPx * stackIndex),
133
143
  stackIndex,
134
144
  };
135
145
  });
@@ -143,6 +153,7 @@ export class DyFM_FlyingEffect_ControlModel {
143
153
  expiredCount: this.expiredCount,
144
154
  evictedCount: this.evictedCount,
145
155
  paused: this.paused,
156
+ reducedMotion: this.reducedMotion,
146
157
  lastTimeMs: this.lastTimeMs,
147
158
  };
148
159
  }
@@ -0,0 +1,117 @@
1
+ import { DyFM_Error } from '../../../_models/control-models/error.control-model';
2
+ /**
3
+ * BFR-WARFACTORY-010 — framework-independent, monotonic simulation clock.
4
+ *
5
+ * - The CALLER supplies real delta, speed and pause; the clock never reads wall time (deterministic, replayable).
6
+ * - Fixed-step mode (`fixedStepSeconds`): scaled time goes into an accumulator, whole steps are committed and the
7
+ * remainder carries over — at speed 10 the loop runs ten times as many steps of the same size, so fast-forward is
8
+ * behaviour-neutral. Variable mode (no `fixedStepSeconds`): one step of `realDelta * speed` (not neutral).
9
+ * - Real deltas are clamped (`maxRealDeltaSeconds`) and fixed steps capped (`maxStepsPerAdvance`); what is cut or
10
+ * dropped is reported, never silently lost.
11
+ * - `exportState` / `importState` (versioned; the legacy `{ elapsedSimulationSeconds }` shape is accepted) / `reset`.
12
+ * An invalid snapshot is rejected WITHOUT touching the running clock.
13
+ */
14
+ export class DyFM_SimulationClock_ControlModel {
15
+ fixedStepSeconds;
16
+ maxRealDeltaSeconds;
17
+ maxStepsPerAdvance;
18
+ elapsedSeconds = 0;
19
+ accumulatorSeconds = 0;
20
+ /** Creates the clock; an invalid configuration throws (`DYFM-SIM-CLOCK-CONFIG`). */
21
+ constructor(config = {}) {
22
+ this.fixedStepSeconds = config.fixedStepSeconds === undefined
23
+ ? undefined
24
+ : DyFM_SimulationClock_ControlModel.positive(config.fixedStepSeconds, 'fixedStepSeconds');
25
+ this.maxRealDeltaSeconds =
26
+ DyFM_SimulationClock_ControlModel.positive(config.maxRealDeltaSeconds ?? 0.25, 'maxRealDeltaSeconds');
27
+ this.maxStepsPerAdvance = DyFM_SimulationClock_ControlModel.positive(config.maxStepsPerAdvance ?? 240, 'maxStepsPerAdvance');
28
+ if (!Number.isInteger(this.maxStepsPerAdvance)) {
29
+ throw DyFM_SimulationClock_ControlModel.configError('maxStepsPerAdvance must be an integer');
30
+ }
31
+ }
32
+ /** Total committed simulation seconds. */
33
+ now() {
34
+ return this.elapsedSeconds;
35
+ }
36
+ /** Advances by one real frame. Paused, speed ≤ 0 or a non-finite input ⇒ nothing passes (a zero result). */
37
+ advance(input) {
38
+ const idle = {
39
+ simulationDeltaSeconds: 0, steps: 0, stepSeconds: this.fixedStepSeconds ?? 0,
40
+ clampedRealSeconds: 0, droppedSimulationSeconds: 0,
41
+ };
42
+ if (input.paused || !Number.isFinite(input.realDeltaSeconds) || !Number.isFinite(input.speed)
43
+ || input.speed <= 0 || input.realDeltaSeconds <= 0) {
44
+ return idle;
45
+ }
46
+ const realSeconds = Math.min(input.realDeltaSeconds, this.maxRealDeltaSeconds);
47
+ const clampedRealSeconds = input.realDeltaSeconds - realSeconds;
48
+ const scaledSeconds = realSeconds * input.speed;
49
+ if (this.fixedStepSeconds === undefined) {
50
+ // Variable step: one update of the scaled delta (documented as NOT behaviour-neutral across speeds)
51
+ this.elapsedSeconds += scaledSeconds;
52
+ return {
53
+ simulationDeltaSeconds: scaledSeconds, steps: 1, stepSeconds: scaledSeconds,
54
+ clampedRealSeconds: clampedRealSeconds, droppedSimulationSeconds: 0,
55
+ };
56
+ }
57
+ // Fixed step: commit whole steps, carry the remainder, cap the burst (spiral-of-death guard)
58
+ this.accumulatorSeconds += scaledSeconds;
59
+ // the epsilon keeps 3 × (1/60) from rounding down to 2 steps
60
+ const available = Math.floor(this.accumulatorSeconds / this.fixedStepSeconds + 1e-9);
61
+ const steps = Math.min(available, this.maxStepsPerAdvance);
62
+ let droppedSimulationSeconds = 0;
63
+ this.accumulatorSeconds = Math.max(0, this.accumulatorSeconds - available * this.fixedStepSeconds);
64
+ if (available > steps) {
65
+ droppedSimulationSeconds = (available - steps) * this.fixedStepSeconds;
66
+ }
67
+ this.elapsedSeconds += steps * this.fixedStepSeconds;
68
+ return {
69
+ simulationDeltaSeconds: steps * this.fixedStepSeconds, steps: steps, stepSeconds: this.fixedStepSeconds,
70
+ clampedRealSeconds: clampedRealSeconds, droppedSimulationSeconds: droppedSimulationSeconds,
71
+ };
72
+ }
73
+ /** The save/load snapshot. */
74
+ exportState() {
75
+ return { schemaVersion: 1, elapsedSimulationSeconds: this.elapsedSeconds, accumulatorSeconds: this.accumulatorSeconds };
76
+ }
77
+ /**
78
+ * Restores a snapshot; returns `false` (and changes NOTHING) when it is invalid. Accepts the legacy
79
+ * `{ elapsedSimulationSeconds }` shape (no `schemaVersion`) as an empty accumulator.
80
+ */
81
+ importState(snapshot) {
82
+ if (!snapshot || typeof snapshot !== 'object') {
83
+ return false;
84
+ }
85
+ const state = snapshot;
86
+ const accumulator = state.schemaVersion === undefined ? 0 : state.accumulatorSeconds;
87
+ if ((state.schemaVersion !== undefined && state.schemaVersion !== 1)
88
+ || !DyFM_SimulationClock_ControlModel.isNonNegative(state.elapsedSimulationSeconds)
89
+ || !DyFM_SimulationClock_ControlModel.isNonNegative(accumulator)) {
90
+ return false;
91
+ }
92
+ this.elapsedSeconds = state.elapsedSimulationSeconds;
93
+ this.accumulatorSeconds = accumulator;
94
+ return true;
95
+ }
96
+ /** A new run: zero elapsed time and accumulator. */
97
+ reset() {
98
+ this.elapsedSeconds = 0;
99
+ this.accumulatorSeconds = 0;
100
+ }
101
+ static isNonNegative(value) {
102
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0;
103
+ }
104
+ static positive(value, field) {
105
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
106
+ throw DyFM_SimulationClock_ControlModel.configError(`${field} must be a finite number > 0 (got ${value})`);
107
+ }
108
+ return value;
109
+ }
110
+ static configError(message) {
111
+ return new DyFM_Error({
112
+ message: `DyFM_SimulationClock: ${message}`,
113
+ errorCode: 'DYFM-SIM-CLOCK-CONFIG',
114
+ issuerService: 'DyFM_SimulationClock_ControlModel',
115
+ });
116
+ }
117
+ }
@@ -12,6 +12,8 @@ export * from './_models/seeded-random-registry.interface';
12
12
  export * from './_models/seeded-random-registry.control-model';
13
13
  export * from './_models/flying-effect.interface';
14
14
  export * from './_models/flying-effect.control-model';
15
+ export * from './_models/simulation-clock.interface';
16
+ export * from './_models/simulation-clock.control-model';
15
17
  // COLLECTIONS
16
18
  export * from './_collections/audio-mixer.util';
17
19
  export * from './_collections/audio-scale.util';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/fsm-dynamo",
3
- "version": "1.20.95",
3
+ "version": "1.20.97",
4
4
  "description": "Full Stack Model Collection for Dynamic (NodeJS-Typescript) Framework called Dynamo, by Future Development Ltd.",
5
5
  "DyBu_settings": {
6
6
  "packageType": "full-stack-package",