lantern-engine 0.0.0-stage → 0.4.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 (178) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/LICENSE +21 -0
  3. package/README.md +113 -2
  4. package/dist/assets/takeCleanerWorker-DTcI_Jqr.js +31 -0
  5. package/dist/assets/takeCleanerWorker-DTcI_Jqr.js.map +1 -0
  6. package/dist/constants-CjYVdFid.js +252 -0
  7. package/dist/constants-CjYVdFid.js.map +1 -0
  8. package/dist/lantern-engine.js +3473 -0
  9. package/dist/lantern-engine.js.map +1 -0
  10. package/dist/pixel.js +1404 -0
  11. package/dist/pixel.js.map +1 -0
  12. package/dist/types/anim/Animator.d.ts +50 -0
  13. package/dist/types/anim/Animator.d.ts.map +1 -0
  14. package/dist/types/anim/animationSystem.d.ts +13 -0
  15. package/dist/types/anim/animationSystem.d.ts.map +1 -0
  16. package/dist/types/assets/AssetLoader.d.ts +85 -0
  17. package/dist/types/assets/AssetLoader.d.ts.map +1 -0
  18. package/dist/types/audio/MusicPlayer.d.ts +57 -0
  19. package/dist/types/audio/MusicPlayer.d.ts.map +1 -0
  20. package/dist/types/audio/SoundEngine.d.ts +42 -0
  21. package/dist/types/audio/SoundEngine.d.ts.map +1 -0
  22. package/dist/types/audio/cleanTake.d.ts +3 -0
  23. package/dist/types/audio/cleanTake.d.ts.map +1 -0
  24. package/dist/types/audio/sampleBank.d.ts +27 -0
  25. package/dist/types/audio/sampleBank.d.ts.map +1 -0
  26. package/dist/types/audio/soundTable.d.ts +14 -0
  27. package/dist/types/audio/soundTable.d.ts.map +1 -0
  28. package/dist/types/audio/synth.d.ts +34 -0
  29. package/dist/types/audio/synth.d.ts.map +1 -0
  30. package/dist/types/audio/takeCleanerWorker.d.ts +2 -0
  31. package/dist/types/audio/takeCleanerWorker.d.ts.map +1 -0
  32. package/dist/types/core/BitmapLabel.d.ts +26 -0
  33. package/dist/types/core/BitmapLabel.d.ts.map +1 -0
  34. package/dist/types/core/Camera.d.ts +90 -0
  35. package/dist/types/core/Camera.d.ts.map +1 -0
  36. package/dist/types/core/Clock.d.ts +11 -0
  37. package/dist/types/core/Clock.d.ts.map +1 -0
  38. package/dist/types/core/Graphics.d.ts +37 -0
  39. package/dist/types/core/Graphics.d.ts.map +1 -0
  40. package/dist/types/core/Group.d.ts +15 -0
  41. package/dist/types/core/Group.d.ts.map +1 -0
  42. package/dist/types/core/Image.d.ts +25 -0
  43. package/dist/types/core/Image.d.ts.map +1 -0
  44. package/dist/types/core/ObjectFactory.d.ts +34 -0
  45. package/dist/types/core/ObjectFactory.d.ts.map +1 -0
  46. package/dist/types/core/Pointer.d.ts +27 -0
  47. package/dist/types/core/Pointer.d.ts.map +1 -0
  48. package/dist/types/core/Rectangle.d.ts +26 -0
  49. package/dist/types/core/Rectangle.d.ts.map +1 -0
  50. package/dist/types/core/Stage.d.ts +58 -0
  51. package/dist/types/core/Stage.d.ts.map +1 -0
  52. package/dist/types/core/Text.d.ts +22 -0
  53. package/dist/types/core/Text.d.ts.map +1 -0
  54. package/dist/types/core/TextureRegistry.d.ts +51 -0
  55. package/dist/types/core/TextureRegistry.d.ts.map +1 -0
  56. package/dist/types/core/Tweener.d.ts +53 -0
  57. package/dist/types/core/Tweener.d.ts.map +1 -0
  58. package/dist/types/core/atlas.d.ts +16 -0
  59. package/dist/types/core/atlas.d.ts.map +1 -0
  60. package/dist/types/core/atlasPlan.d.ts +34 -0
  61. package/dist/types/core/atlasPlan.d.ts.map +1 -0
  62. package/dist/types/core/eases.d.ts +3 -0
  63. package/dist/types/core/eases.d.ts.map +1 -0
  64. package/dist/types/core/gameObject.d.ts +42 -0
  65. package/dist/types/core/gameObject.d.ts.map +1 -0
  66. package/dist/types/core/pixiPatches.d.ts +9 -0
  67. package/dist/types/core/pixiPatches.d.ts.map +1 -0
  68. package/dist/types/core/types.d.ts +4 -0
  69. package/dist/types/core/types.d.ts.map +1 -0
  70. package/dist/types/ecs/SparseSet.d.ts +25 -0
  71. package/dist/types/ecs/SparseSet.d.ts.map +1 -0
  72. package/dist/types/ecs/World.d.ts +133 -0
  73. package/dist/types/ecs/World.d.ts.map +1 -0
  74. package/dist/types/ecs/fields.d.ts +34 -0
  75. package/dist/types/ecs/fields.d.ts.map +1 -0
  76. package/dist/types/engine/Engine.d.ts +80 -0
  77. package/dist/types/engine/Engine.d.ts.map +1 -0
  78. package/dist/types/engine/FixedLoop.d.ts +32 -0
  79. package/dist/types/engine/FixedLoop.d.ts.map +1 -0
  80. package/dist/types/engine/Scene.d.ts +37 -0
  81. package/dist/types/engine/Scene.d.ts.map +1 -0
  82. package/dist/types/engine/SceneManager.d.ts +31 -0
  83. package/dist/types/engine/SceneManager.d.ts.map +1 -0
  84. package/dist/types/events/EventBus.d.ts +20 -0
  85. package/dist/types/events/EventBus.d.ts.map +1 -0
  86. package/dist/types/fx/hitStop.d.ts +20 -0
  87. package/dist/types/fx/hitStop.d.ts.map +1 -0
  88. package/dist/types/fx/viewCull.d.ts +14 -0
  89. package/dist/types/fx/viewCull.d.ts.map +1 -0
  90. package/dist/types/index.d.ts +68 -0
  91. package/dist/types/index.d.ts.map +1 -0
  92. package/dist/types/input/Actions.d.ts +75 -0
  93. package/dist/types/input/Actions.d.ts.map +1 -0
  94. package/dist/types/input/Keyboard.d.ts +25 -0
  95. package/dist/types/input/Keyboard.d.ts.map +1 -0
  96. package/dist/types/input/aimAxis.d.ts +9 -0
  97. package/dist/types/input/aimAxis.d.ts.map +1 -0
  98. package/dist/types/input/longPress.d.ts +21 -0
  99. package/dist/types/input/longPress.d.ts.map +1 -0
  100. package/dist/types/input/stickAxis.d.ts +26 -0
  101. package/dist/types/input/stickAxis.d.ts.map +1 -0
  102. package/dist/types/input/touchDetect.d.ts +18 -0
  103. package/dist/types/input/touchDetect.d.ts.map +1 -0
  104. package/dist/types/light/LightLayer.d.ts +65 -0
  105. package/dist/types/light/LightLayer.d.ts.map +1 -0
  106. package/dist/types/net/Connection.d.ts +66 -0
  107. package/dist/types/net/Connection.d.ts.map +1 -0
  108. package/dist/types/net/InterpolationBuffer.d.ts +36 -0
  109. package/dist/types/net/InterpolationBuffer.d.ts.map +1 -0
  110. package/dist/types/net/PredictedMover.d.ts +43 -0
  111. package/dist/types/net/PredictedMover.d.ts.map +1 -0
  112. package/dist/types/net/Room.d.ts +69 -0
  113. package/dist/types/net/Room.d.ts.map +1 -0
  114. package/dist/types/net/RoomHost.d.ts +74 -0
  115. package/dist/types/net/RoomHost.d.ts.map +1 -0
  116. package/dist/types/net/cadence.d.ts +22 -0
  117. package/dist/types/net/cadence.d.ts.map +1 -0
  118. package/dist/types/net/constants.d.ts +24 -0
  119. package/dist/types/net/constants.d.ts.map +1 -0
  120. package/dist/types/net/movement.d.ts +50 -0
  121. package/dist/types/net/movement.d.ts.map +1 -0
  122. package/dist/types/net/protocol.d.ts +59 -0
  123. package/dist/types/net/protocol.d.ts.map +1 -0
  124. package/dist/types/net/serverClock.d.ts +14 -0
  125. package/dist/types/net/serverClock.d.ts.map +1 -0
  126. package/dist/types/net/snapshotCodec.d.ts +55 -0
  127. package/dist/types/net/snapshotCodec.d.ts.map +1 -0
  128. package/dist/types/pixel/Darkness.d.ts +78 -0
  129. package/dist/types/pixel/Darkness.d.ts.map +1 -0
  130. package/dist/types/pixel/Evaporation.d.ts +30 -0
  131. package/dist/types/pixel/Evaporation.d.ts.map +1 -0
  132. package/dist/types/pixel/PixelLayer.d.ts +85 -0
  133. package/dist/types/pixel/PixelLayer.d.ts.map +1 -0
  134. package/dist/types/pixel/index.d.ts +22 -0
  135. package/dist/types/pixel/index.d.ts.map +1 -0
  136. package/dist/types/pixel/lights.d.ts +34 -0
  137. package/dist/types/pixel/lights.d.ts.map +1 -0
  138. package/dist/types/pixel/palette.d.ts +54 -0
  139. package/dist/types/pixel/palette.d.ts.map +1 -0
  140. package/dist/types/pixel/pixel.d.ts +80 -0
  141. package/dist/types/pixel/pixel.d.ts.map +1 -0
  142. package/dist/types/pixel/pixelPaint.d.ts +43 -0
  143. package/dist/types/pixel/pixelPaint.d.ts.map +1 -0
  144. package/dist/types/pixel/pixelTone.d.ts +49 -0
  145. package/dist/types/pixel/pixelTone.d.ts.map +1 -0
  146. package/dist/types/pixel/propKit.d.ts +26 -0
  147. package/dist/types/pixel/propKit.d.ts.map +1 -0
  148. package/dist/types/pixel/ramp.d.ts +31 -0
  149. package/dist/types/pixel/ramp.d.ts.map +1 -0
  150. package/dist/types/pixel/selout.d.ts +3 -0
  151. package/dist/types/pixel/selout.d.ts.map +1 -0
  152. package/dist/types/pixel/spritePixels.d.ts +29 -0
  153. package/dist/types/pixel/spritePixels.d.ts.map +1 -0
  154. package/dist/types/platform/touch.d.ts +5 -0
  155. package/dist/types/platform/touch.d.ts.map +1 -0
  156. package/dist/types/rig/PosePlayer.d.ts +64 -0
  157. package/dist/types/rig/PosePlayer.d.ts.map +1 -0
  158. package/dist/types/rig/RigView.d.ts +68 -0
  159. package/dist/types/rig/RigView.d.ts.map +1 -0
  160. package/dist/types/rig/Skeleton.d.ts +14 -0
  161. package/dist/types/rig/Skeleton.d.ts.map +1 -0
  162. package/dist/types/rig/humanoid.d.ts +4 -0
  163. package/dist/types/rig/humanoid.d.ts.map +1 -0
  164. package/dist/types/rig/humanoidPoses.d.ts +117 -0
  165. package/dist/types/rig/humanoidPoses.d.ts.map +1 -0
  166. package/dist/types/rig/poseMath.d.ts +14 -0
  167. package/dist/types/rig/poseMath.d.ts.map +1 -0
  168. package/dist/types/rig/rigTypes.d.ts +82 -0
  169. package/dist/types/rig/rigTypes.d.ts.map +1 -0
  170. package/dist/types/settings.d.ts +25 -0
  171. package/dist/types/settings.d.ts.map +1 -0
  172. package/dist/types/tilemap/TilemapView.d.ts +42 -0
  173. package/dist/types/tilemap/TilemapView.d.ts.map +1 -0
  174. package/dist/types/tilemap/collision.d.ts +16 -0
  175. package/dist/types/tilemap/collision.d.ts.map +1 -0
  176. package/dist/types/tilemap/tiled.d.ts +104 -0
  177. package/dist/types/tilemap/tiled.d.ts.map +1 -0
  178. package/package.json +82 -4
@@ -0,0 +1,57 @@
1
+ export interface PlayOptions {
2
+ /** Crossfade from what is playing, ms (default 1200). */
3
+ fadeMs?: number;
4
+ /** Start over at the end (default true). */
5
+ loop?: boolean;
6
+ /** This track's own level, 0–1, under the music volume (default 1). */
7
+ volume?: number;
8
+ }
9
+ /**
10
+ * Background music: one track at a time, crossfaded when it changes, looping, at `engineSettings.musicVolume`.
11
+ * Tracks stream through `<audio>` elements (no decoding a whole song into memory). Where Web Audio exists their level
12
+ * is a gain node, since iOS ignores an element's own `volume`.
13
+ *
14
+ * Browsers start sound only after a user gesture: `play` before one is remembered and starts on the first tap or key.
15
+ *
16
+ * ```ts
17
+ * music.play('music/forest.ogg');
18
+ * music.play('music/boss.ogg', { fadeMs: 600 }); // crossfades
19
+ * music.stop(2000);
20
+ * ```
21
+ */
22
+ export declare class MusicPlayer {
23
+ private ctx;
24
+ private master;
25
+ private readonly tracks;
26
+ private raf;
27
+ private unlocked;
28
+ private readonly cleanup;
29
+ constructor();
30
+ /** The url of the track playing (or fading in), if any. */
31
+ get current(): string | null;
32
+ /** Plays `url`, crossfading from what plays now. The track already playing is left alone. */
33
+ play(url: string, options?: PlayOptions): void;
34
+ /** Fades the music out and stops it. */
35
+ stop(fadeMs?: number): void;
36
+ pause(): void;
37
+ resume(): void;
38
+ destroy(): void;
39
+ private fadeOutAll;
40
+ /** Runs the fades a frame at a time until none is left. */
41
+ private tick;
42
+ private applyVolume;
43
+ private setLevel;
44
+ private release;
45
+ private needsGesture;
46
+ private context;
47
+ }
48
+ /** A fade's value at `now`: linear from `from` to `to` over `ms`. */
49
+ export declare function fadeValue(f: {
50
+ from: number;
51
+ to: number;
52
+ start: number;
53
+ ms: number;
54
+ }, now: number): number;
55
+ /** The shared music player. */
56
+ export declare const music: MusicPlayer;
57
+ //# sourceMappingURL=MusicPlayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MusicPlayer.d.ts","sourceRoot":"","sources":["../../../src/audio/MusicPlayer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAaD;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;;IAgB9C,2DAA2D;IAC3D,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAG3B;IAED,6FAA6F;IAC7F,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,IAAI;IAwBlD,wCAAwC;IACxC,IAAI,CAAC,MAAM,SAAO,GAAG,IAAI;IAKzB,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,UAAU;IASlB,2DAA2D;IAC3D,OAAO,CAAC,IAAI,CAgBV;IAEF,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;CAShB;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIzG;AAED,+BAA+B;AAC/B,eAAO,MAAM,KAAK,aAAoB,CAAC"}
@@ -0,0 +1,42 @@
1
+ export interface SoundOptions {
2
+ /** Where it happened in the world; absent for what happens to or is done by the local player. */
3
+ x?: number;
4
+ y?: number;
5
+ /** Done by (or to) the local player: full weight. */
6
+ local?: boolean;
7
+ /** Extra weight (default 1). */
8
+ gain?: number;
9
+ /** How far away it can be heard (px), when nearer than `HEARING`. */
10
+ range?: number;
11
+ /** Skipped when the mix is busy (footsteps). */
12
+ minor?: boolean;
13
+ /** Cut off after this long (ms), faded over `CUT_FADE_MS`: a cast's sound ends with the cast. */
14
+ maxMs?: number;
15
+ }
16
+ export declare class SoundEngine {
17
+ private ctx;
18
+ private master;
19
+ private readonly buffers;
20
+ private readonly samples;
21
+ private readonly lastAt;
22
+ private voices;
23
+ /** Where the local player stands, set by the world scene; null off the world screens. */
24
+ listener: () => {
25
+ x: number;
26
+ y: number;
27
+ } | null;
28
+ private onRunning;
29
+ constructor();
30
+ play(name: string | undefined, opts?: SoundOptions): void;
31
+ private level;
32
+ private context;
33
+ /**
34
+ * Starts decoding every recorded take and renders every recipe not rendered yet, one per task, once the context
35
+ * first runs — so the first swing of a fight does not pay for its sound in that frame.
36
+ */
37
+ private prerender;
38
+ /** Rendered on first use or by `prerender` (a few ms each), then kept. */
39
+ private buffer;
40
+ }
41
+ export declare const sound: SoundEngine;
42
+ //# sourceMappingURL=SoundEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoundEngine.d.ts","sourceRoot":"","sources":["../../../src/audio/SoundEngine.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,YAAY;IAC3B,iGAAiG;IACjG,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iGAAiG;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,MAAM,CAAK;IACnB,yFAAyF;IACzF,QAAQ,EAAE,MAAM;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAc;IAC7D,OAAO,CAAC,SAAS,CAAwC;;IAmCzD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAE,YAAiB,GAAG,IAAI;IA0D7D,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,OAAO;IA0Bf;;;OAGG;IACH,OAAO,CAAC,SAAS;IAajB,0EAA0E;IAC1E,OAAO,CAAC,MAAM;CAaf;AAED,eAAO,MAAM,KAAK,aAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The cleaned mono samples, or null for a take that is silence. */
2
+ export declare function cleanSamples(channels: Float32Array[], sampleRate: number): Float32Array | null;
3
+ //# sourceMappingURL=cleanTake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanTake.d.ts","sourceRoot":"","sources":["../../../src/audio/cleanTake.ts"],"names":[],"mappings":"AAoBA,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA6B9F"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The recorded takes of the sounds, registered by the game (`registerTakes`): `<sound>.mp3`, and `<sound>_2.mp3`…
3
+ * when a sound has more than one. A
4
+ * sound with takes plays one of them at random, never the same one twice running when it has more; a sound without
5
+ * any — or whose takes have not decoded yet — falls back to its synth recipe in `SoundEngine`.
6
+ *
7
+ * Every take is cleaned once on decode (`cleanTake.ts`: mono, silence trimmed, one loudness), off the main thread
8
+ * in `takeCleanerWorker.ts`, so `sounds.json`'s `fileGain` is the only mix knob. Measured on the first batch, peaks
9
+ * alone left their loudness 20 dB apart.
10
+ */
11
+ /**
12
+ * Registers recorded takes by file path → url, e.g. a Vite `import.meta.glob('./sfx/*.mp3', { query: '?url',
13
+ * import: 'default', eager: true })`. `hit.mp3`, `hit_2.mp3`… are takes of `hit`; sound names carry no digits.
14
+ */
15
+ export declare function registerTakes(urls: Record<string, string>): void;
16
+ /** The sound has recorded takes in the build (decoded or not). */
17
+ export declare const hasTakes: (name: string) => boolean;
18
+ export declare class SampleBank {
19
+ private readonly decoded;
20
+ private readonly loading;
21
+ private readonly last;
22
+ names(): string[];
23
+ /** A decoded take, or null while none is ready (the caller then synthesises); starts loading on first ask. */
24
+ take(ctx: AudioContext, name: string): AudioBuffer | null;
25
+ load(ctx: AudioContext, name: string): void;
26
+ }
27
+ //# sourceMappingURL=sampleBank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleBank.d.ts","sourceRoot":"","sources":["../../../src/audio/sampleBank.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAKhE;AAED,kEAAkE;AAClE,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,OAAwB,CAAC;AAEjE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAElD,KAAK,IAAI,MAAM,EAAE;IAIjB,8GAA8G;IAC9G,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAYzD,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAoB5C"}
@@ -0,0 +1,14 @@
1
+ import type { SynthRecipe } from './synth.js';
2
+ /**
3
+ * The sounds the engine can play: synthesised recipes by name, plus the master share every sound plays at. Empty
4
+ * until the game registers its own (`registerSounds`); the mapping from game happenings to sound names stays in
5
+ * the game.
6
+ */
7
+ export interface SoundTable {
8
+ /** Share of the effects volume everything plays at: keeps full volume modest next to the music. */
9
+ master: number;
10
+ recipes: Record<string, SynthRecipe>;
11
+ }
12
+ export declare const SOUNDS: SoundTable;
13
+ export declare function registerSounds(table: Partial<SoundTable>): void;
14
+ //# sourceMappingURL=soundTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soundTable.d.ts","sourceRoot":"","sources":["../../../src/audio/soundTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,mGAAmG;IACnG,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,MAAM,EAAE,UAAuC,CAAC;AAE7D,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAG/D"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The combat sounds are written, not recorded: a few oscillator or noise layers rendered straight into a buffer
3
+ * (`sounds.json` → `recipes`). Lo-fi on purpose — 22 kHz mono, short and soft — so they sit with the pixel art
4
+ * instead of pretending to be a recording.
5
+ */
6
+ export declare const SYNTH_RATE = 22050;
7
+ export interface SynthLayer {
8
+ /** Waveform; `noise` is white noise, or sample-and-hold noise at `f` Hz when `f` is given (crunchier). */
9
+ w: 'sine' | 'square' | 'tri' | 'saw' | 'noise';
10
+ /** Pitch at the start and at the end of the layer (Hz), swept exponentially. */
11
+ f?: [number, number];
12
+ /** Length (s). */
13
+ t: number;
14
+ /** Delay before the layer starts (s). */
15
+ d?: number;
16
+ /** Attack (s). */
17
+ at?: number;
18
+ g: number;
19
+ /** Decay curve exponent: 1 is linear, higher falls away faster. */
20
+ c?: number;
21
+ duty?: number;
22
+ /** Low- and high-pass cutoff at the start and the end (Hz). */
23
+ lp?: [number, number];
24
+ hp?: [number, number];
25
+ }
26
+ export interface SynthRecipe {
27
+ layers: SynthLayer[];
28
+ /** Random pitch spread per play (share of 1); the engine's default when absent. */
29
+ jitter?: number;
30
+ /** Level of the sound's recorded takes (`registerTakes`), which are normalised on decode; default 1. */
31
+ fileGain?: number;
32
+ }
33
+ export declare function renderRecipe(recipe: SynthRecipe): Float32Array;
34
+ //# sourceMappingURL=synth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../../src/audio/synth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,0GAA0G;IAC1G,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAC/C,gFAAgF;IAChF,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrB,kBAAkB;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,yCAAyC;IACzC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,kBAAkB;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,mEAAmE;IACnE,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wGAAwG;IACxG,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CA8C9D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=takeCleanerWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"takeCleanerWorker.d.ts","sourceRoot":"","sources":["../../../src/audio/takeCleanerWorker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { BitmapText } from 'pixi.js';
2
+ /** Adds letters every label font bakes ahead (accented letters of a language the labels print). Call before `installLabelFont`. */
3
+ export declare function addLabelGlyphs(letters: string): void;
4
+ /**
5
+ * Rasterises one label font once and returns its name. Called ahead of time for the damage numbers
6
+ * : baking a font on its first number froze the first frame that printed one by ~60 ms.
7
+ */
8
+ export declare function installLabelFont(fontFamily: string, size: number, color: string, stroke: string, strokeWidth: number, resolution: number): string;
9
+ declare const BitmapLabel_base: typeof BitmapText & (new (...args: any[]) => import("./gameObject.js").GameObjectMembers);
10
+ /**
11
+ * Text drawn from a bitmap font: the glyphs are rasterised once per font, so changing the string costs no canvas
12
+ * redraw and no texture upload, and every label of one font batches with the others. For the floating numbers, which
13
+ * a crowded fight throws dozens of a second — a plain `Text` repaints its canvas at resolution 4 and uploads it on
14
+ * every change.
15
+ */
16
+ export declare class BitmapLabel extends BitmapLabel_base {
17
+ /**
18
+ * `fontFamily` must already be loaded (`document.fonts.load`), or the glyphs bake in the fallback.
19
+ * Styled like `worldText`: the same font, size, colour and outline, rasterised at the same resolution.
20
+ */
21
+ constructor(x: number, y: number, text: string, fontFamily: string, size: number, color: string, stroke: string, strokeWidth: number, resolution: number);
22
+ setOrigin(x?: number, y?: number): this;
23
+ setText(text: string): this;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=BitmapLabel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitmapLabel.d.ts","sourceRoot":"","sources":["../../../src/core/BitmapLabel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,UAAU,EAAqB,MAAM,SAAS,CAAC;AAYpE,mIAAmI;AACnI,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpD;AAQD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAoBjJ;;AAED;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,gBAAsB;IACrD;;;OAGG;gBACS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAMxJ,SAAS,CAAC,CAAC,SAAM,EAAE,CAAC,SAAI,GAAG,IAAI;IAK/B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAI5B"}
@@ -0,0 +1,90 @@
1
+ import type { Container } from 'pixi.js';
2
+ export interface TrackOptions {
3
+ /**
4
+ * How much of the way to the target the camera closes each 60th of a second (0–1, default 1: locked on). 0.1 is a
5
+ * soft follow; the rate is the same at any frame rate.
6
+ */
7
+ lerp?: number;
8
+ /** A box round the screen's centre (world px) the target may move in without the camera moving. */
9
+ deadzoneWidth?: number;
10
+ deadzoneHeight?: number;
11
+ /** Where on the target to look (world px from its position), e.g. a little above a body's feet. */
12
+ offsetX?: number;
13
+ offsetY?: number;
14
+ }
15
+ export interface ViewRect {
16
+ x: number;
17
+ y: number;
18
+ width: number;
19
+ height: number;
20
+ right: number;
21
+ bottom: number;
22
+ }
23
+ /**
24
+ * Moves and zooms the world layer. `scrollX/scrollY` is the world point at the top-left of the screen, so
25
+ * `round(scroll * zoom) / zoom` snaps the view to whole screen pixels.
26
+ */
27
+ export declare class Camera {
28
+ private readonly world;
29
+ private readonly screen;
30
+ zoom: number;
31
+ /** Backing pixels per screen pixel (the renderer's resolution, `zoomResolution`): what `snap` rounds to. */
32
+ resolution: number;
33
+ /** Lands the view on whole backing pixels (pixel art); off, the world moves smoothly between them. */
34
+ roundPixels: boolean;
35
+ scrollX: number;
36
+ scrollY: number;
37
+ width: number;
38
+ height: number;
39
+ private bounds;
40
+ private shakeUntil;
41
+ private shakeMs;
42
+ private shakeAngle;
43
+ private shakeIntensity;
44
+ private flashRect;
45
+ private flashStart;
46
+ private flashMs;
47
+ private flashPeak;
48
+ /** Screen-layer containers laid over the world with its exact transform, shake included (see `follow`). */
49
+ private readonly followers;
50
+ private target;
51
+ private trackOpts;
52
+ private lastApply;
53
+ constructor(world: Container, screen: Container);
54
+ get worldView(): ViewRect;
55
+ setZoom(z: number): this;
56
+ /** A world coordinate snapped to the nearest backing pixel: one screen pixel, or a half at ×1.5. */
57
+ snap(v: number): number;
58
+ setBounds(x: number, y: number, width: number, height: number): this;
59
+ centerOn(x: number, y: number): this;
60
+ setScroll(x: number, y: number): this;
61
+ /**
62
+ * Screen shake: `intensity` is a fraction of the screen size, like before. With an `angle` (the way a blow travelled)
63
+ * the shake runs back and forth along it instead of at random, so a hit is felt coming from somewhere.
64
+ */
65
+ shake(ms: number, intensity: number, angle?: number): void;
66
+ /**
67
+ * Keeps a container on the screen layer placed exactly over the world layer — zoom, scroll and this frame's
68
+ * shake — for things drawn in world units above the screen-layer night (fireflies). Written in `apply`, after
69
+ * the scene updated, so it never lags the world by a frame or misses a shake the world takes.
70
+ */
71
+ follow(layer: Container): void;
72
+ unfollow(layer: Container): void;
73
+ /** Full-screen colour flash starting at `peak` alpha and fading out over `ms`. */
74
+ flash(ms: number, r: number, g: number, b: number, _force?: boolean, peak?: number): void;
75
+ /**
76
+ * Keeps `target` (anything with `x` and `y`, read every frame: an entity's position, a sprite) in view, inside the
77
+ * bounds if there are any. Replaces any target before.
78
+ */
79
+ track(target: {
80
+ readonly x: number;
81
+ readonly y: number;
82
+ }, options?: TrackOptions): this;
83
+ untrack(): this;
84
+ /** Moves the view toward the tracked target for a frame `dtMs` long. */
85
+ private follow1;
86
+ /** Writes the camera into the world layer; called once per frame after the scene updated. */
87
+ apply(now: number): void;
88
+ private clamp;
89
+ }
90
+ //# sourceMappingURL=Camera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Camera.d.ts","sourceRoot":"","sources":["../../../src/core/Camera.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mGAAmG;IACnG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,MAAM;IA0Bf,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IA1BzB,IAAI,SAAK;IACT,4GAA4G;IAC5G,UAAU,SAAK;IACf,sGAAsG;IACtG,WAAW,UAAS;IACpB,OAAO,SAAK;IACZ,OAAO,SAAK;IACZ,KAAK,SAAK;IACV,MAAM,SAAK;IACX,OAAO,CAAC,MAAM,CAAwE;IACtF,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,SAAS,CAAK;IACtB,2GAA2G;IAC3G,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,OAAO,CAAC,MAAM,CAA2D;IACzE,OAAO,CAAC,SAAS,CAAoG;IACrH,OAAO,CAAC,SAAS,CAAM;gBAGJ,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,SAAS;IAGpC,IAAI,SAAS,IAAI,QAAQ,CAIxB;IAED,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKxB,oGAAoG;IACpG,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAKvB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAKpE,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAOpC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAOrC;;;OAGG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAS1D;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAI9B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIhC,kFAAkF;IAClF,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,UAAQ,EAAE,IAAI,SAAI,GAAG,IAAI;IAWlF;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,IAAI;IAO3F,OAAO,IAAI,IAAI;IAKf,wEAAwE;IACxE,OAAO,CAAC,OAAO;IAqBf,6FAA6F;IAC7F,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAkCxB,OAAO,CAAC,KAAK;CAQd"}
@@ -0,0 +1,11 @@
1
+ /** Scene time and one-shot timers, advanced by the frame loop. */
2
+ export declare class Clock {
3
+ now: number;
4
+ private timers;
5
+ delayedCall(ms: number, fn: () => void): {
6
+ remove: () => void;
7
+ };
8
+ update(now: number): void;
9
+ clear(): void;
10
+ }
11
+ //# sourceMappingURL=Clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Clock.d.ts","sourceRoot":"","sources":["../../../src/core/Clock.ts"],"names":[],"mappings":"AAMA,kEAAkE;AAClE,qBAAa,KAAK;IAChB,GAAG,SAAqB;IACxB,OAAO,CAAC,MAAM,CAAe;IAE7B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG;QAAE,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;IAM/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAezB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,37 @@
1
+ import { Container } from 'pixi.js';
2
+ export interface Vec2 {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ declare const Graphics_base: typeof Container & (new (...args: any[]) => import("./gameObject.js").GameObjectMembers);
7
+ /**
8
+ * Immediate-mode vector drawing with a current fill and line style (fillStyle + fillRect), on top of Pixi's
9
+ * shape-then-fill Graphics. Wrapped rather than subclassed: Pixi's Graphics owns `fillStyle` as a property.
10
+ */
11
+ export declare class Graphics extends Graphics_base {
12
+ private readonly g;
13
+ private fill;
14
+ private line;
15
+ constructor();
16
+ fillStyle(color: number, alpha?: number): this;
17
+ lineStyle(width: number, color: number, alpha?: number): this;
18
+ clear(): this;
19
+ fillRect(x: number, y: number, w: number, h: number): this;
20
+ fillEllipse(x: number, y: number, w: number, h: number): this;
21
+ strokeEllipse(x: number, y: number, w: number, h: number): this;
22
+ fillCircle(x: number, y: number, r: number): this;
23
+ strokeCircle(x: number, y: number, r: number): this;
24
+ lineBetween(x1: number, y1: number, x2: number, y2: number): this;
25
+ fillPoints(points: Vec2[], _closeShape?: boolean): this;
26
+ strokePoints(points: Vec2[], closeShape?: boolean): this;
27
+ /** A pie slice from the centre, for cone telegraphs. */
28
+ slice(x: number, y: number, r: number, start: number, end: number, anticlockwise?: boolean): this;
29
+ beginPath(): this;
30
+ moveTo(x: number, y: number): this;
31
+ lineTo(x: number, y: number): this;
32
+ closePath(): this;
33
+ fillPath(): this;
34
+ strokePath(): this;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=Graphics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Graphics.d.ts","sourceRoot":"","sources":["../../../src/core/Graphics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA4B,MAAM,SAAS,CAAC;AAG9D,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;;AAED;;;GAGG;AACH,qBAAa,QAAS,SAAQ,aAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAsB;IACxC,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,IAAI,CAA2C;;IAOvD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI;IAKzC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI;IAKxD,KAAK,IAAI,IAAI;IAKb,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAK1D,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAK7D,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAK/D,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAKjD,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAKnD,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAKjE,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,UAAO,GAAG,IAAI;IAKpD,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,UAAU,UAAQ,GAAG,IAAI;IAKtD,wDAAwD;IACxD,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,IAAI;IAK/F,SAAS,IAAI,IAAI;IAKjB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAKlC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAKlC,SAAS,IAAI,IAAI;IAKjB,QAAQ,IAAI,IAAI;IAKhB,UAAU,IAAI,IAAI;CAInB"}
@@ -0,0 +1,15 @@
1
+ import { Container, type Container as PixiContainer } from 'pixi.js';
2
+ declare const Group_base: typeof Container & (new (...args: any[]) => import("./gameObject.js").GameObjectMembers);
3
+ /** A container of world objects, drawn in list order (children do not sort by depth). */
4
+ export declare class Group extends Group_base {
5
+ get list(): PixiContainer[];
6
+ add(child: PixiContainer | PixiContainer[]): this;
7
+ addAt(child: PixiContainer, index: number): this;
8
+ remove(child: PixiContainer, destroy?: boolean): this;
9
+ /** Puts `child` directly below `other` in the draw order. */
10
+ moveBelow(child: PixiContainer, other: PixiContainer): this;
11
+ /** Puts `child` directly above `other` in the draw order. */
12
+ moveAbove(child: PixiContainer, other: PixiContainer): this;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=Group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../../src/core/Group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;;AAGrE,yFAAyF;AACzF,qBAAa,KAAM,SAAQ,UAAqB;IAC9C,IAAI,IAAI,IAAI,aAAa,EAAE,CAE1B;IAED,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,EAAE,GAAG,IAAI;IAKjD,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhD,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,UAAQ,GAAG,IAAI;IAMnD,6DAA6D;IAC7D,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IAO3D,6DAA6D;IAC7D,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;CAM5D"}
@@ -0,0 +1,25 @@
1
+ import { Sprite } from 'pixi.js';
2
+ import type { TextureRegistry } from './TextureRegistry.js';
3
+ declare const Image_base: typeof Sprite & (new (...args: any[]) => import("./gameObject.js").GameObjectMembers);
4
+ /** A textured sprite, centred by default; frames are looked up by name in the texture registry. */
5
+ export declare class Image extends Image_base {
6
+ private readonly registry;
7
+ textureKey: string;
8
+ frameName: string;
9
+ constructor(registry: TextureRegistry, x: number, y: number, key: string, frame?: string | number);
10
+ get originX(): number;
11
+ get originY(): number;
12
+ /** Width of the frame itself, unscaled. */
13
+ get frameWidth(): number;
14
+ get frameHeight(): number;
15
+ get displayWidth(): number;
16
+ set displayWidth(w: number);
17
+ get displayHeight(): number;
18
+ set displayHeight(h: number);
19
+ setOrigin(x?: number, y?: number): this;
20
+ setDisplaySize(w: number, h: number): this;
21
+ setFrame(frame: string | number): this;
22
+ setTexture(key: string, frame?: string | number): this;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=Image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/core/Image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;;AAEzD,mGAAmG;AACnG,qBAAa,KAAM,SAAQ,UAAkB;IAKzC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;gBAGC,QAAQ,EAAE,eAAe,EAC1C,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IASzB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,2CAA2C;IAC3C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,CAAC,EAAE,MAAM,EAEzB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,aAAa,CAAC,CAAC,EAAE,MAAM,EAE1B;IAED,SAAS,CAAC,CAAC,SAAM,EAAE,CAAC,SAAI,GAAG,IAAI;IAK/B,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMtC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAMvD"}
@@ -0,0 +1,34 @@
1
+ import type { Container } from 'pixi.js';
2
+ import { BitmapLabel } from './BitmapLabel.js';
3
+ import { Graphics } from './Graphics.js';
4
+ import { Group } from './Group.js';
5
+ import { Image } from './Image.js';
6
+ import { Rectangle } from './Rectangle.js';
7
+ import type { Stage } from './Stage.js';
8
+ import { Text, type TextStyle } from './Text.js';
9
+ /** `scene.add.*`: creates an object and puts it on the world layer, where depth sorts it. */
10
+ export declare class ObjectFactory {
11
+ private readonly stage;
12
+ constructor(stage: Stage);
13
+ image(x: number, y: number, key: string, frame?: string | number): Image;
14
+ /**
15
+ * A copy of `src` as it is drawn right now (afterimages, clones). A live texture, repainted every frame, is
16
+ * snapshotted first, and the snapshot is freed with the copy.
17
+ */
18
+ still(x: number, y: number, src: Image): Image;
19
+ graphics(opts?: {
20
+ x?: number;
21
+ y?: number;
22
+ }): Graphics;
23
+ container(x?: number, y?: number, children?: Container[]): Group;
24
+ rectangle(x: number, y: number, w: number, h: number, color: number, alpha?: number): Rectangle;
25
+ text(x: number, y: number, text: string, style: TextStyle): Text;
26
+ /** A bitmap-font label (`BitmapLabel`): cheap to change, for text rewritten many times a second. */
27
+ label(x: number, y: number, text: string, fontFamily: string, size: number, color: string, stroke: string, strokeWidth: number, resolution: number): BitmapLabel;
28
+ /** Puts an object made elsewhere on the world layer, as the factory's own are (a `PixelLayer`, a custom class). */
29
+ existing<T extends Container & {
30
+ scene: Stage;
31
+ }>(obj: T): T;
32
+ private attach;
33
+ }
34
+ //# sourceMappingURL=ObjectFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectFactory.d.ts","sourceRoot":"","sources":["../../../src/core/ObjectFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE9C,6FAA6F;AAC7F,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAEzC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK;IAIxE;;;OAGG;IACH,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK;IAS9C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,QAAQ;IAMrD,SAAS,CAAC,CAAC,SAAI,EAAE,CAAC,SAAI,EAAE,QAAQ,GAAE,SAAS,EAAO,GAAG,KAAK;IAO1D,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,SAAS;IAM1F,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAIhE,oGAAoG;IACpG,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW;IAIhK,mHAAmH;IACnH,QAAQ,CAAC,CAAC,SAAS,SAAS,GAAG;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IAI3D,OAAO,CAAC,MAAM;CAKf"}
@@ -0,0 +1,27 @@
1
+ import type { Camera } from './Camera.js';
2
+ /**
3
+ * The mouse over the game canvas. Presses count only when they start on the canvas (not on the React UI above it);
4
+ * moves are followed everywhere so aiming keeps working at the edge of a panel.
5
+ */
6
+ export declare class Pointer {
7
+ private readonly canvas;
8
+ /**
9
+ * A press this returns true for is not counted as a held button (e.g. Shift + right-click opening a context menu
10
+ * instead of firing what the right button is bound to). Unset, every press counts.
11
+ */
12
+ static ignorePress: ((e: PointerEvent) => boolean) | null;
13
+ /** Screen position relative to the canvas, in CSS pixels. */
14
+ x: number;
15
+ y: number;
16
+ worldX: number;
17
+ worldY: number;
18
+ private buttons;
19
+ private readonly cleanup;
20
+ constructor(canvas: HTMLCanvasElement);
21
+ leftButtonDown(): boolean;
22
+ rightButtonDown(): boolean;
23
+ updateWorldPoint(cam: Camera): void;
24
+ destroy(): void;
25
+ private track;
26
+ }
27
+ //# sourceMappingURL=Pointer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pointer.d.ts","sourceRoot":"","sources":["../../../src/core/Pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAQvC;;;GAGG;AACH,qBAAa,OAAO;IAeN,OAAO,CAAC,QAAQ,CAAC,MAAM;IAdnC;;;OAGG;IACH,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,GAAG,IAAI,CAAQ;IAEjE,6DAA6D;IAC7D,CAAC,SAAK;IACN,CAAC,SAAK;IACN,MAAM,SAAK;IACX,MAAM,SAAK;IACX,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAEjB,MAAM,EAAE,iBAAiB;IAiCtD,cAAc,IAAI,OAAO;IAIzB,eAAe,IAAI,OAAO;IAI1B,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKnC,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,KAAK;CAKd"}
@@ -0,0 +1,26 @@
1
+ import { Container } from 'pixi.js';
2
+ declare const Rectangle_base: typeof Container & (new (...args: any[]) => import("./gameObject.js").GameObjectMembers);
3
+ /** A filled rectangle placed by its origin (centred by default). */
4
+ export declare class Rectangle extends Rectangle_base {
5
+ private w;
6
+ private h;
7
+ private color;
8
+ private fillAlpha;
9
+ private readonly g;
10
+ private ox;
11
+ private oy;
12
+ constructor(w: number, h: number, color: number, fillAlpha?: number);
13
+ get originX(): number;
14
+ get originY(): number;
15
+ get rectWidth(): number;
16
+ get rectHeight(): number;
17
+ get fillColor(): number;
18
+ get fillOpacity(): number;
19
+ setOrigin(x?: number, y?: number): this;
20
+ setFillStyle(color: number, alpha?: number): this;
21
+ setDisplaySize(w: number, h: number): this;
22
+ resize(w: number, h: number): this;
23
+ private redraw;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=Rectangle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rectangle.d.ts","sourceRoot":"","sources":["../../../src/core/Rectangle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA4B,MAAM,SAAS,CAAC;;AAG9D,oEAAoE;AACpE,qBAAa,SAAU,SAAQ,cAAqB;IAMhD,OAAO,CAAC,CAAC;IACT,OAAO,CAAC,CAAC;IACT,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,SAAS;IARnB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAsB;IACxC,OAAO,CAAC,EAAE,CAAO;IACjB,OAAO,CAAC,EAAE,CAAO;gBAGP,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,SAAS,SAAI;IAOvB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,SAAS,CAAC,CAAC,SAAM,EAAE,CAAC,SAAI,GAAG,IAAI;IAM/B,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI;IAM5C,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1C,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAMlC,OAAO,CAAC,MAAM;CAIf"}
@@ -0,0 +1,58 @@
1
+ import { Container, type Application } from 'pixi.js';
2
+ import { Camera } from './Camera.js';
3
+ import { Clock } from './Clock.js';
4
+ import { ObjectFactory } from './ObjectFactory.js';
5
+ import { Pointer } from './Pointer.js';
6
+ import type { TextureRegistry } from './TextureRegistry.js';
7
+ import { Tweener } from './Tweener.js';
8
+ /**
9
+ * What a world object is created in: a world layer the camera moves (children sorted by depth), a screen layer
10
+ * above it, and the per-frame services (tweens, timers, camera, pointer). Subclasses implement `update`.
11
+ */
12
+ export declare abstract class Stage {
13
+ readonly app: Application;
14
+ readonly textures: TextureRegistry;
15
+ /** Told of every fault a guarded step caught (error telemetry, if the game sets one). */
16
+ static onCaught: ((where: string, err: unknown) => void) | null;
17
+ readonly world: Container<import("pixi.js").ContainerChild>;
18
+ readonly screen: Container<import("pixi.js").ContainerChild>;
19
+ readonly add: ObjectFactory;
20
+ readonly tweens: Tweener;
21
+ readonly time: Clock;
22
+ readonly cameras: {
23
+ main: Camera;
24
+ };
25
+ readonly input: {
26
+ activePointer: Pointer;
27
+ };
28
+ private readonly resizeListeners;
29
+ private lastWidth;
30
+ private lastHeight;
31
+ constructor(app: Application, textures: TextureRegistry);
32
+ get width(): number;
33
+ get height(): number;
34
+ get fps(): number;
35
+ /** Calls `fn` whenever the window changes size; the returned function stops it (a per-map listener must). */
36
+ onResize(fn: () => void): () => void;
37
+ abstract update(now: number, delta: number): void;
38
+ /**
39
+ * One frame: game logic, then tweens and timers, then the camera. Pixi renders after. Each step is guarded: a
40
+ * ticker listener that throws never asks for the next animation frame, so one bad frame used to stop the world for
41
+ * good — the canvas frozen and no input reaching the server (seen on Android).
42
+ */
43
+ frame(delta: number): void;
44
+ private readonly reported;
45
+ /**
46
+ * Runs one step of a frame and swallows what it throws, so the steps after it still run. Subclasses guard the parts
47
+ * of their own `update` too: a fault before the camera follows the player used to leave the view standing on one
48
+ * spot while the world went on.
49
+ */
50
+ protected guard(step: string, fn: () => void): void;
51
+ /** `guard` for a step that answers something: `fallback` when it threw. */
52
+ protected guarded<T>(step: string, fn: () => T, fallback: T): T;
53
+ /** What a guarded step threw: logged once per distinct error, or a fault repeating every frame floods the log at 60 a second. */
54
+ protected caught(step: string, err: unknown): void;
55
+ destroy(): void;
56
+ private syncSize;
57
+ }
58
+ //# sourceMappingURL=Stage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stage.d.ts","sourceRoot":"","sources":["../../../src/core/Stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;GAGG;AACH,8BAAsB,KAAK;IAgBvB,QAAQ,CAAC,GAAG,EAAE,WAAW;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAhBpC,yFAAyF;IACzF,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEvE,QAAQ,CAAC,KAAK,8CAA6C;IAC3D,QAAQ,CAAC,MAAM,8CAAmB;IAClC,QAAQ,CAAC,GAAG,gBAA2B;IACvC,QAAQ,CAAC,MAAM,UAAiB;IAChC,QAAQ,CAAC,IAAI,QAAe;IAC5B,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IACtD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;gBAGZ,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,eAAe;IAQpC,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAQpC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAEjD;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C;;;;OAIG;IACH,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAInD,2EAA2E;IAC3E,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC;IAS/D,iIAAiI;IACjI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;IASlD,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,QAAQ;CAWjB"}