murow 0.1.1 → 0.1.3

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 (105) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/core/clock/clock.js +1 -0
  3. package/dist/cjs/core/clock/index.js +1 -0
  4. package/dist/cjs/core/hitbox/hitbox-library.js +1 -0
  5. package/dist/cjs/core/hitbox/hitbox.js +1 -0
  6. package/dist/cjs/core/hitbox/index.js +1 -0
  7. package/dist/cjs/core/hitbox/test.js +1 -0
  8. package/dist/cjs/core/index.js +1 -1
  9. package/dist/cjs/core/prediction/prediction.js +1 -1
  10. package/dist/cjs/core/ray/ray-3d.js +1 -1
  11. package/dist/cjs/core/raycast/hit-buffer.js +1 -0
  12. package/dist/cjs/core/raycast/index.js +1 -0
  13. package/dist/cjs/core/raycast/raycaster.js +1 -0
  14. package/dist/cjs/core/slot-map/index.js +1 -0
  15. package/dist/cjs/core/slot-map/slot-map.js +1 -0
  16. package/dist/cjs/core/state-machine/index.js +1 -0
  17. package/dist/cjs/core/state-machine/state-machine.js +1 -0
  18. package/dist/cjs/core/timeline/index.js +1 -0
  19. package/dist/cjs/core/timeline/timeline.js +1 -0
  20. package/dist/cjs/game/loop/loop.js +1 -1
  21. package/dist/cjs/game/loop/ticker-schedule.js +1 -0
  22. package/dist/cjs/renderer/index.js +1 -1
  23. package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -1
  24. package/dist/cjs/renderer/prefab-bucket/index.js +1 -1
  25. package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -1
  26. package/dist/cjs/renderer/prefab-bucket/specs.js +1 -1
  27. package/dist/cjs/renderer/raycast/index.js +1 -0
  28. package/dist/cjs/renderer/raycast/raycast.js +1 -0
  29. package/dist/esm/core/clock/clock.js +1 -0
  30. package/dist/esm/core/clock/index.js +1 -0
  31. package/dist/esm/core/hitbox/hitbox-library.js +1 -0
  32. package/dist/esm/core/hitbox/hitbox.js +1 -0
  33. package/dist/esm/core/hitbox/index.js +1 -0
  34. package/dist/esm/core/hitbox/test.js +1 -0
  35. package/dist/esm/core/index.js +1 -1
  36. package/dist/esm/core/prediction/prediction.js +1 -1
  37. package/dist/esm/core/ray/ray-3d.js +1 -1
  38. package/dist/esm/core/raycast/hit-buffer.js +1 -0
  39. package/dist/esm/core/raycast/index.js +1 -0
  40. package/dist/esm/core/raycast/raycaster.js +1 -0
  41. package/dist/esm/core/slot-map/index.js +1 -0
  42. package/dist/esm/core/slot-map/slot-map.js +1 -0
  43. package/dist/esm/core/state-machine/index.js +1 -0
  44. package/dist/esm/core/state-machine/state-machine.js +1 -0
  45. package/dist/esm/core/timeline/index.js +1 -0
  46. package/dist/esm/core/timeline/timeline.js +1 -0
  47. package/dist/esm/game/loop/loop.js +1 -1
  48. package/dist/esm/game/loop/ticker-schedule.js +1 -0
  49. package/dist/esm/renderer/index.js +1 -1
  50. package/dist/esm/renderer/prefab-bucket/concrete.js +1 -1
  51. package/dist/esm/renderer/prefab-bucket/index.js +1 -1
  52. package/dist/esm/renderer/prefab-bucket/parsers.js +1 -1
  53. package/dist/esm/renderer/raycast/index.js +1 -0
  54. package/dist/esm/renderer/raycast/raycast.js +1 -0
  55. package/dist/netcode/cjs/index.js +144 -140
  56. package/dist/netcode/esm/index.js +144 -140
  57. package/dist/netcode/types/client/game-client.d.ts +17 -3
  58. package/dist/netcode/types/client/strategies/snapshot-interpolation.d.ts +33 -0
  59. package/dist/netcode/types/codec/delta-codec.d.ts +1 -1
  60. package/dist/netcode/types/components/sync-spec.d.ts +6 -0
  61. package/dist/types/core/clock/clock.d.ts +37 -0
  62. package/dist/types/core/clock/index.d.ts +1 -0
  63. package/dist/types/core/hitbox/hitbox-library.d.ts +29 -0
  64. package/dist/types/core/hitbox/hitbox.d.ts +50 -0
  65. package/dist/types/core/hitbox/index.d.ts +3 -0
  66. package/dist/types/core/hitbox/test.d.ts +44 -0
  67. package/dist/types/core/index.d.ts +6 -0
  68. package/dist/types/core/prediction/prediction.d.ts +35 -58
  69. package/dist/types/core/ray/ray-3d.d.ts +21 -1
  70. package/dist/types/core/raycast/hit-buffer.d.ts +43 -0
  71. package/dist/types/core/raycast/index.d.ts +2 -0
  72. package/dist/types/core/raycast/raycaster.d.ts +54 -0
  73. package/dist/types/core/slot-map/index.d.ts +1 -0
  74. package/dist/types/core/slot-map/slot-map.d.ts +109 -0
  75. package/dist/types/core/state-machine/index.d.ts +1 -0
  76. package/dist/types/core/state-machine/state-machine.d.ts +114 -0
  77. package/dist/types/core/timeline/index.d.ts +1 -0
  78. package/dist/types/core/timeline/timeline.d.ts +34 -0
  79. package/dist/types/game/loop/loop.d.ts +30 -0
  80. package/dist/types/game/loop/ticker-schedule.d.ts +52 -0
  81. package/dist/types/renderer/index.d.ts +1 -0
  82. package/dist/types/renderer/prefab-bucket/concrete.d.ts +16 -6
  83. package/dist/types/renderer/prefab-bucket/index.d.ts +11 -7
  84. package/dist/types/renderer/prefab-bucket/specs.d.ts +10 -0
  85. package/dist/types/renderer/raycast/index.d.ts +1 -0
  86. package/dist/types/renderer/raycast/raycast.d.ts +24 -0
  87. package/dist/types/renderer/types.d.ts +1 -0
  88. package/dist/webgpu/cjs/index.js +1777 -587
  89. package/dist/webgpu/esm/index.js +1769 -573
  90. package/dist/webgpu/types/2d/raycast.d.ts +45 -0
  91. package/dist/webgpu/types/2d/renderer.d.ts +11 -0
  92. package/dist/webgpu/types/2d/sprite-accessor.d.ts +3 -1
  93. package/dist/webgpu/types/3d/hitbox.d.ts +32 -0
  94. package/dist/webgpu/types/3d/lights.d.ts +113 -0
  95. package/dist/webgpu/types/3d/lights.test.d.ts +1 -0
  96. package/dist/webgpu/types/3d/raycast.d.ts +44 -0
  97. package/dist/webgpu/types/3d/renderer.d.ts +50 -1
  98. package/dist/webgpu/types/3d/shader.d.ts +88 -5
  99. package/dist/webgpu/types/core/types.d.ts +55 -0
  100. package/dist/webgpu/types/geometry/geometry-builder.d.ts +1 -4
  101. package/dist/webgpu/types/index.d.ts +1 -0
  102. package/dist/webgpu/types/shaders/utils.d.ts +24 -0
  103. package/package.json +1 -1
  104. package/dist/netcode/types/client/interpolation-buffer.d.ts +0 -37
  105. /package/dist/netcode/types/client/{interpolation-buffer.test.d.ts → strategies/snapshot-interpolation.test.d.ts} +0 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Fixed-capacity, zero-GC scheduler of tick-interval callbacks for the game loop.
3
+ *
4
+ * Schedules are stored in a pre-allocated object pool indexed by a {@link SlotMap}
5
+ * slot, so registering and cancelling reuse objects instead of producing garbage.
6
+ * Ids returned by {@link every} pack the slot with a generation counter, so an id
7
+ * left over from a cancelled schedule can never cancel the schedule that later
8
+ * reuses its slot.
9
+ */
10
+ export declare class TickerSchedule {
11
+ private readonly _capacity;
12
+ private readonly _slots;
13
+ private readonly _generations;
14
+ private readonly _pool;
15
+ private _dirty;
16
+ private _running;
17
+ constructor(capacity: number);
18
+ /**
19
+ * Number of live schedules.
20
+ */
21
+ get size(): number;
22
+ /**
23
+ * Maximum number of simultaneously live schedules.
24
+ */
25
+ get capacity(): number;
26
+ /**
27
+ * Registers a callback to fire every `intervalTicks`, starting `intervalTicks`
28
+ * after `currentTick`. Returns a stable id for {@link clear}, or `-1` if the
29
+ * scheduler is at capacity.
30
+ */
31
+ every(intervalTicks: number, cb: () => void, currentTick: number): number;
32
+ /**
33
+ * Cancels the schedule for `id`. No-op (returns `false`) if the id is stale,
34
+ * unknown, or already cancelled.
35
+ */
36
+ clear(id: number): boolean;
37
+ /**
38
+ * Cancels every live schedule.
39
+ */
40
+ clearAll(): void;
41
+ /**
42
+ * Fires every schedule whose interval has elapsed at `currentTick`, then
43
+ * realigns it relative to `currentTick` (a long frame fires once, not a burst).
44
+ */
45
+ run(currentTick: number): void;
46
+ /**
47
+ * Re-anchors every live schedule's next fire relative to `baseTick`. Called
48
+ * when the loop restarts and the tick count resets.
49
+ */
50
+ rebase(baseTick: number): void;
51
+ private _compact;
52
+ }
@@ -13,3 +13,4 @@ export * from "./prefab-bucket";
13
13
  export * from "./prefab-bucket/specs";
14
14
  export { PrefabBucket } from "./prefab-bucket/concrete";
15
15
  export type { PrefabBucket2D, PrefabBucket3D } from "./prefab-bucket/concrete";
16
+ export * from "./raycast";
@@ -16,7 +16,8 @@
16
16
  * bucket.get('typo'); // ❌ TS error: '"typo"' not in '"minion" | "floor"'
17
17
  * ```
18
18
  */
19
- import { BasePrefabBucket, type StringOr } from './index';
19
+ import { BasePrefabBucket, type SpecWithHitbox, type StringOr } from './index';
20
+ import type { HitboxLibrary } from '../../core/hitbox/hitbox-library';
20
21
  import type { CompositePrefab, PartOffset, Prefab2D, Prefab2DSpec, Prefab3D, Prefab3DSpec, PrefabFor } from './specs';
21
22
  type SpecForMode<M> = M extends '3d' ? Prefab3DSpec : Prefab2DSpec;
22
23
  type PrefabUnionForMode<M> = M extends '3d' ? Prefab3D : Prefab2D;
@@ -27,20 +28,29 @@ type PrefabUnionForMode<M> = M extends '3d' ? Prefab3D : Prefab2D;
27
28
  * to register new specs and their prefab types. Call `load` to parse all registered
28
29
  * specs and populate the bucket's internal prefab registry.
29
30
  */
30
- export declare class PrefabBucket<M extends '2d' | '3d' = '3d', Specs extends Record<string, SpecForMode<M>> = {}> extends BasePrefabBucket<M, SpecForMode<M>, PrefabUnionForMode<M>, Specs> {
31
+ export declare class PrefabBucket<M extends '2d' | '3d' = '3d', Specs extends Record<string, SpecForMode<M>> = {}, HB extends string = never> extends BasePrefabBucket<M, SpecForMode<M>, PrefabUnionForMode<M>, Specs, HB> {
32
+ private _hitboxLibrary;
31
33
  constructor(mode: M);
34
+ /**
35
+ * Register the hitbox library backing this bucket. Specs may then set
36
+ * `hitbox` to any of the library's names, autocompleted and type-checked.
37
+ */
38
+ hitboxes<N extends string>(library: HitboxLibrary<M, N>): PrefabBucket<M, Specs, N>;
39
+ /** The registered hitbox library, or `null` if none was set. */
40
+ get hitboxLibrary(): HitboxLibrary<M> | null;
32
41
  /**
33
42
  * Add a spec. Chains return the subclass type so the bucket variable's
34
43
  * static type accumulates id→spec mappings, enabling `get` to narrow.
44
+ * When a hitbox library is registered, `hitbox` must be one of its names.
35
45
  */
36
- add<const S extends SpecForMode<M>>(spec: S): PrefabBucket<M, Specs & {
46
+ add<const S extends SpecWithHitbox<SpecForMode<M>, HB>>(spec: S): PrefabBucket<M, Specs & {
37
47
  [K in S['id']]: S;
38
- }>;
39
- addAll<const Ss extends readonly SpecForMode<M>[]>(specs: Ss): PrefabBucket<M, Specs & {
48
+ }, HB>;
49
+ addAll<const Ss extends readonly SpecWithHitbox<SpecForMode<M>, HB>[]>(specs: Ss): PrefabBucket<M, Specs & {
40
50
  [K in Ss[number]['id']]: Extract<Ss[number], {
41
51
  id: K;
42
52
  }>;
43
- }>;
53
+ }, HB>;
44
54
  /**
45
55
  * Return the parsed prefab variant for this id. Narrow type — `get('minion')`
46
56
  * returns `GltfPrefab` (with `.animations`, `.jointCount`), not the union.
@@ -22,6 +22,10 @@ export type PrefabMode = '2d' | '3d';
22
22
  * suggestions for the known set.
23
23
  */
24
24
  export type StringOr<T extends string> = T | (string & {});
25
+ /** A spec union with its `hitbox` field constrained to the hitbox names `HB`. */
26
+ export type SpecWithHitbox<S, HB extends string> = S extends unknown ? Omit<S, 'hitbox'> & {
27
+ readonly hitbox?: StringOr<HB>;
28
+ } : never;
25
29
  export interface PrefabSpecBase {
26
30
  readonly type: string;
27
31
  readonly id: string;
@@ -56,7 +60,7 @@ export interface PrefabParserContext {
56
60
  */
57
61
  export type PrefabParser<Spec extends PrefabSpecBase = PrefabSpecBase, Prefab extends PrefabBase = PrefabBase> = (spec: Spec, ctx: PrefabParserContext) => Promise<Prefab> | Prefab;
58
62
  export type PrefabParserMap<Spec extends PrefabSpecBase, Prefab extends PrefabBase> = Record<string, PrefabParser<Spec, Prefab>>;
59
- export declare class BasePrefabBucket<M extends PrefabMode = PrefabMode, Spec extends PrefabSpecBase = PrefabSpecBase, Prefab extends PrefabBase = PrefabBase, Specs extends Record<string, Spec> = {}> {
63
+ export declare class BasePrefabBucket<M extends PrefabMode = PrefabMode, Spec extends PrefabSpecBase = PrefabSpecBase, Prefab extends PrefabBase = PrefabBase, Specs extends Record<string, Spec> = {}, HB extends string = string> {
60
64
  readonly mode: M;
61
65
  /** Shared notification channel - see `PrefabBucketEvents`. */
62
66
  readonly events: EventSystem<PrefabBucketEvents>;
@@ -68,26 +72,26 @@ export declare class BasePrefabBucket<M extends PrefabMode = PrefabMode, Spec ex
68
72
  protected groups: Map<string, string[]>;
69
73
  constructor(mode: M, parsers?: PrefabParserMap<Spec, Prefab>);
70
74
  /** Add a single spec. Throws if id is a duplicate, contains '.', or if the bucket is already loaded. */
71
- add<const S extends Spec>(spec: S): BasePrefabBucket<M, Spec, Prefab, Specs & {
75
+ add<const S extends SpecWithHitbox<Spec, HB>>(spec: S): BasePrefabBucket<M, Spec, Prefab, Specs & {
72
76
  [K in S['id']]: S;
73
- }>;
77
+ }, HB>;
74
78
  /**
75
79
  * Internal add that skips the '.' validation. Used by `addGroup` on
76
80
  * subclasses to register parts under group-path ids (e.g. `'campfire.logs'`)
77
81
  * after the group itself has validated user input.
78
82
  */
79
- protected addUnchecked<const S extends Spec>(spec: S): BasePrefabBucket<M, Spec, Prefab, Specs & {
83
+ protected addUnchecked<const S extends SpecWithHitbox<Spec, HB>>(spec: S): BasePrefabBucket<M, Spec, Prefab, Specs & {
80
84
  [K in S['id']]: S;
81
- }>;
85
+ }, HB>;
82
86
  /**
83
87
  * Add multiple specs. Validates the whole batch (ids unique, not loaded) before
84
88
  * committing, so the bucket never lands in a half-applied state.
85
89
  */
86
- addAll<const Ss extends readonly Spec[]>(specs: Ss): BasePrefabBucket<M, Spec, Prefab, Specs & {
90
+ addAll<const Ss extends readonly SpecWithHitbox<Spec, HB>[]>(specs: Ss): BasePrefabBucket<M, Spec, Prefab, Specs & {
87
91
  [K in Ss[number]['id']]: Extract<Ss[number], {
88
92
  id: K;
89
93
  }>;
90
- }>;
94
+ }, HB>;
91
95
  /** Load all pending specs in parallel. Idempotent if already loaded. */
92
96
  load(): Promise<void>;
93
97
  /**
@@ -42,6 +42,7 @@ export interface GltfSpec {
42
42
  readonly freezeAnimations?: boolean;
43
43
  /** Optional user-defined sidecar data (scale, speed, gameplay hints, etc). */
44
44
  readonly metadata?: Record<string, unknown>;
45
+ readonly hitbox?: string;
45
46
  }
46
47
  export interface GridSpec {
47
48
  readonly type: 'grid';
@@ -52,6 +53,7 @@ export interface GridSpec {
52
53
  readonly lineWidth: number;
53
54
  /** Optional user-defined sidecar data (scale, speed, gameplay hints, etc). */
54
55
  readonly metadata?: Record<string, unknown>;
56
+ readonly hitbox?: string;
55
57
  }
56
58
  /** Unit cube prefab centered at origin. Use the instance's `scale` to size it. */
57
59
  export interface CubeSpec {
@@ -60,6 +62,7 @@ export interface CubeSpec {
60
62
  /** Edge length. Defaults to 1. */
61
63
  readonly size?: number;
62
64
  readonly metadata?: Record<string, unknown>;
65
+ readonly hitbox?: string;
63
66
  }
64
67
  /** Local transform offset applied to a part inside a composite/group at spawn time. */
65
68
  export interface PartOffset {
@@ -80,6 +83,7 @@ export interface CompositeSpec {
80
83
  readonly offset?: PartOffset;
81
84
  }[];
82
85
  readonly metadata?: Record<string, unknown>;
86
+ readonly hitbox?: string;
83
87
  }
84
88
  export type Prefab3DSpec = GltfSpec | GridSpec | CubeSpec | CompositeSpec;
85
89
  /**
@@ -126,6 +130,7 @@ type GltfPrefabBase<S extends GltfSpec> = {
126
130
  readonly totalVertexCount: number;
127
131
  /** Passed through from the spec. */
128
132
  readonly metadata: MetadataOf<S>;
133
+ readonly hitbox?: string;
129
134
  };
130
135
  /**
131
136
  * Animation record/list fields, narrowed by what the spec declared:
@@ -161,12 +166,14 @@ export interface GridPrefab<S extends GridSpec = GridSpec> {
161
166
  readonly step: number;
162
167
  readonly lineWidth: number;
163
168
  readonly metadata: MetadataOf<S>;
169
+ readonly hitbox?: string;
164
170
  }
165
171
  export interface CubePrefab<S extends CubeSpec = CubeSpec> {
166
172
  readonly type: 'cube';
167
173
  readonly id: S['id'];
168
174
  readonly size: number;
169
175
  readonly metadata: MetadataOf<S>;
176
+ readonly hitbox?: string;
170
177
  }
171
178
  export interface CompositePrefab<S extends CompositeSpec = CompositeSpec> {
172
179
  readonly type: 'composite';
@@ -176,6 +183,7 @@ export interface CompositePrefab<S extends CompositeSpec = CompositeSpec> {
176
183
  readonly offset?: PartOffset;
177
184
  }[];
178
185
  readonly metadata: MetadataOf<S>;
186
+ readonly hitbox?: string;
179
187
  }
180
188
  export type Prefab3D = GltfPrefab | GridPrefab | CubePrefab | CompositePrefab;
181
189
  export interface SpritesheetSpec {
@@ -188,6 +196,7 @@ export interface SpritesheetSpec {
188
196
  /** URL to a texture-packer JSON file. Mutually exclusive with frameWidth/frameHeight. */
189
197
  readonly data?: string;
190
198
  readonly metadata?: Record<string, unknown>;
199
+ readonly hitbox?: string;
191
200
  }
192
201
  export type Prefab2DSpec = SpritesheetSpec;
193
202
  export interface SpritesheetPrefab<S extends SpritesheetSpec = SpritesheetSpec> {
@@ -198,6 +207,7 @@ export interface SpritesheetPrefab<S extends SpritesheetSpec = SpritesheetSpec>
198
207
  readonly width: number;
199
208
  readonly height: number;
200
209
  readonly metadata: MetadataOf<S>;
210
+ readonly hitbox?: string;
201
211
  }
202
212
  export type Prefab2D = SpritesheetPrefab;
203
213
  /**
@@ -0,0 +1 @@
1
+ export * from './raycast';
@@ -0,0 +1,24 @@
1
+ import type { InputSnapshot } from '../../core/input/types';
2
+ export interface RaycastHit<H, Point extends readonly number[] = readonly number[]> {
3
+ handle: H;
4
+ distance: number;
5
+ point: Point;
6
+ /** Name of the hitbox part struck, or `null` for a default-bound (box/quad) hit. */
7
+ part: string | null;
8
+ }
9
+ export interface RaycastOptions<H> {
10
+ filter?: (handle: H) => boolean;
11
+ maxDistance?: number;
12
+ }
13
+ export declare abstract class Raycast<H, Point extends readonly number[] = readonly number[]> {
14
+ abstract update(input: InputSnapshot): void;
15
+ abstract hit(opts?: RaycastOptions<H>): RaycastHit<H, Point> | null;
16
+ abstract hitAll(opts?: RaycastOptions<H>): readonly RaycastHit<H, Point>[];
17
+ abstract memo(opts: RaycastOptions<H>): RaycastMemo<H, Point>;
18
+ abstract clearMemos(): void;
19
+ }
20
+ export declare abstract class RaycastMemo<H, Point extends readonly number[] = readonly number[]> {
21
+ abstract readonly hits: readonly RaycastHit<H, Point>[];
22
+ abstract readonly first: RaycastHit<H, Point> | null;
23
+ abstract dispose(): void;
24
+ }
@@ -78,6 +78,7 @@ export interface SpriteUV {
78
78
  maxY: number;
79
79
  }
80
80
  export interface SpriteHandle {
81
+ readonly id: number;
81
82
  readonly slot: number;
82
83
  x: number;
83
84
  y: number;