@sadhaka/loom-engine 0.10.0 → 0.11.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.
package/LICENSE CHANGED
@@ -1,21 +1,103 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Misha Mitiev
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ Business Source License 1.1 - Loom Engine
2
+
3
+ Parameters
4
+
5
+ Licensor: Misha Mitiev
6
+
7
+ Licensed Work: Loom Engine, version 0.11.0 and later
8
+ (c) 2026 Misha Mitiev
9
+
10
+ Additional Use Grant: You may make use of the Licensed Work, provided
11
+ that your gross revenue from any product, game,
12
+ or service that incorporates the Licensed Work
13
+ does not exceed USD $1,000,000 in any consecutive
14
+ 12-month period.
15
+
16
+ For use above this threshold, you must obtain a
17
+ commercial license by contacting
18
+ licensor@theworldtable.ai. Standard commercial
19
+ terms include a 5% royalty on excess revenue
20
+ above the threshold; alternative arrangements
21
+ (lump-sum buyouts, equity-for-license) are
22
+ negotiable.
23
+
24
+ Change Date: 2030-05-08
25
+
26
+ Change License: Apache License, Version 2.0
27
+
28
+ For information about alternative licensing arrangements for the
29
+ Licensed Work, please contact licensor@theworldtable.ai.
30
+
31
+ ---
32
+
33
+ Business Source License 1.1
34
+
35
+ License text copyright © 2017 MariaDB Corporation Ab, All Rights Reserved.
36
+ "Business Source License" is a trademark of MariaDB Corporation Ab.
37
+
38
+ Terms
39
+
40
+ The Licensor hereby grants you the right to copy, modify, create derivative
41
+ works, redistribute, and make non-production use of the Licensed Work. The
42
+ Licensor may make an Additional Use Grant, above, permitting limited
43
+ production use.
44
+
45
+ Effective on the Change Date, or the fourth anniversary of the first publicly
46
+ available distribution of a specific version of the Licensed Work under this
47
+ License, whichever comes first, the Licensor hereby grants you rights under
48
+ the terms of the Change License, and the rights granted in the paragraph
49
+ above terminate.
50
+
51
+ If your use of the Licensed Work does not comply with the requirements
52
+ currently in effect as described in this License, you must purchase a
53
+ commercial license from the Licensor, its affiliated entities, or authorized
54
+ resellers, or you must refrain from using the Licensed Work.
55
+
56
+ All copies of the original and modified Licensed Work, and derivative works
57
+ of the Licensed Work, are subject to this License. This License applies
58
+ separately for each version of the Licensed Work and the Change Date may vary
59
+ for each version of the Licensed Work released by Licensor.
60
+
61
+ You must conspicuously display this License on each original or modified copy
62
+ of the Licensed Work. If you receive the Licensed Work in original or
63
+ modified form from a third party, the terms and conditions set forth in this
64
+ License apply to your use of that work.
65
+
66
+ Any use of the Licensed Work in violation of this License will automatically
67
+ terminate your rights under this License for the current and all other
68
+ versions of the Licensed Work.
69
+
70
+ This License does not grant you any right in any trademark or logo of
71
+ Licensor or its affiliates (provided that you may use a trademark or logo of
72
+ Licensor as expressly required by this License).
73
+
74
+ TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
75
+ AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
76
+ EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
77
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
78
+ TITLE.
79
+
80
+ MariaDB hereby grants you permission to use this License’s text to license
81
+ your works, and to refer to it using the trademark “Business Source License”,
82
+ as long as you comply with the Covenants of Licensor below.
83
+
84
+ Covenants of Licensor
85
+
86
+ In consideration of the right to use this License’s text and the “Business
87
+ Source License” name and trademark, Licensor covenants to MariaDB, and to all
88
+ other recipients of the licensed work to be provided by Licensor:
89
+
90
+ 1. To specify as the Change License the GPL Version 2.0 or any later version,
91
+ or a license that is compatible with GPL Version 2.0 or a later version,
92
+ where “compatible” means that software provided under the Change License can
93
+ be included in a program with software provided under GPL Version 2.0 or a
94
+ later version. Licensor may specify additional Change Licenses without
95
+ limitation.
96
+
97
+ 2. To either: (a) specify an additional grant of rights to use that does not
98
+ impose any additional restriction on the right granted in this License, as
99
+ the Additional Use Grant; or (b) insert the text “None”.
100
+
101
+ 3. To specify a Change Date.
102
+
103
+ 4. Not to modify this License in any other way.
package/README.md CHANGED
@@ -1,344 +1,411 @@
1
- # Loom Engine
2
-
3
- Browser-first 2D / 2.5D game engine for [TheWorldTable.ai](https://theworldtable.ai).
4
- Canvas2D primary backend, ECS, render-graph stages, Director-bridge
5
- SSE integration. No external engine reuse - built from scratch in
6
- TypeScript.
7
-
8
- Repo: [sadhaka/loom-engine](https://github.com/sadhaka/loom-engine).
9
- API docs: [loom-engine.pages.dev](https://loom-engine.pages.dev/).
10
- The design spec (`LOOM-ENGINE-SPEC.md`) lives in the consuming
11
- TheWorldTable.ai repo and is the canonical source for phase
12
- plans and architectural decisions.
13
-
14
- ## Install
15
-
16
- ```sh
17
- npm install @sadhaka/loom-engine
18
- ```
19
-
20
- Pre-alpha. ESM-only, browser-first. TypeScript types ship in the
21
- package (`dist/index.d.ts`). Node 18+ for the build toolchain;
22
- the runtime targets evergreen browsers (Canvas2D + Web Audio +
23
- EventSource).
24
-
25
- ## Documentation
26
-
27
- API reference (TypeDoc) - generated from the public surface in
28
- [`src/index.ts`](./src/index.ts) on every push to `main`:
29
- **https://loom-engine.pages.dev/**
30
-
31
- Build it locally with `npm run docs` (writes to `./docs/`).
32
-
33
- See [Docs deploy](#docs-deploy) for the hosting chain and one-time
34
- activation steps (Cloudflare Pages, since GitHub Pages is unavailable
35
- on private repos for free user plans).
36
-
37
- ## Quickstart
38
-
39
- ```ts
40
- // 1. Install
41
- // npm install @sadhaka/loom-engine
42
- import {
43
- Engine,
44
- SpriteRenderSystem,
45
- InputSystem,
46
- VeilBudgetSystem,
47
- SYSTEM_PHASE_INPUT,
48
- SYSTEM_PHASE_RENDER,
49
- } from '@sadhaka/loom-engine';
50
-
51
- // 2. Attach to a canvas. Engine.create wires Canvas2DDevice, World,
52
- // TransformPool, SpritePool, Time + Camera resources, and the
53
- // default SpriteRenderSystem in SYSTEM_PHASE_RENDER.
54
- var canvas = document.querySelector('canvas');
55
- var engine = Engine.create({ canvas: canvas });
56
-
57
- // 3. Register the systems your game needs. Order within a phase is
58
- // deterministic; phases run INPUT -> LOGIC -> PHYSICS -> ANIMATION
59
- // -> RENDER -> POST_RENDER per frame.
60
- engine.world.addSystem(new InputSystem(), SYSTEM_PHASE_INPUT);
61
- engine.world.addSystem(new VeilBudgetSystem(), SYSTEM_PHASE_INPUT);
62
-
63
- // 4. Drive the frame loop. engine.tick advances Time, beginFrame on
64
- // the device, world.update across all phases, endFrame.
65
- function tick(now) {
66
- engine.tick(now);
67
- requestAnimationFrame(tick);
68
- }
69
- requestAnimationFrame(tick);
70
- ```
71
-
72
- ## Status
73
-
74
- **Pre-alpha, productized as of 0.10.0** (Phase 11B.3 - npm publish
75
- under MIT). Phases 0 through 9.3 + 11A.2 are shipped; the engine
76
- runs the public TheWorldTable.ai pre-alpha. Productization is a
77
- fund-raising and distribution decision, not a stability claim - the
78
- public API surface will evolve until 1.0.
79
-
80
- | Phase | Status | Surface |
81
- |---|---|---|
82
- | 0 | shipped | scaffolding, package.json, tsconfig, PRIOR-ART log |
83
- | 1 | shipped | Canvas2D iso renderer, camera, transform pool (SoA) |
84
- | 2 | shipped | ECS World, system scheduler, resource registry, Engine facade, asset pipeline |
85
- | 3 | shipped | clip-aware sprite-sheet manifests, AnimationStatePool, AnimationSystem |
86
- | 4 | shipped | particle pool, emitter component, three-system VFX pipeline, additive blend |
87
- | 5 | shipped | Web Audio bus mixer with VE-budget gating, unified keyboard / mouse / touch input |
88
- | 6 | shipped | Director-bridge: SSE event-stream subscription, eventSourceFactory hook, snapshot-recovery |
89
- | 7 | shipped | Survivor combat layer (projectile pool, hit resolution, damage application) ported onto Loom Engine |
90
- | 8 | shipped | 2.5D ARPG hub-and-spoke per LOOM-CLASS-SYSTEM-SPEC, plaza narrator, mobile + touch input (virtual D-pad, tap-to-walk) |
91
- | 9.1 | shipped | perf pass: alloc-churn fixes + bench harness |
92
- | 9.3 | shipped | TypeDoc public-API site with auto-deploy |
93
- | 11A.2 | shipped | docs hosting migrated to Cloudflare Pages |
94
- | 11B.3 | shipped | MIT license + npm publish posture (this release) |
95
-
96
- See [LOOM-ENGINE-SPEC.md](../docker/LOOM-ENGINE-SPEC.md) Section 7
97
- for the full phase plan with effort estimates.
98
-
99
- ## Build
100
-
101
- ```sh
102
- npm install
103
- npm run build # tsc src/ -> dist/
104
- npm run build:demo # tsc demo/*.ts -> demo/*.js
105
- npm run build:all # both
106
- npm run watch # rebuild src on change
107
- npm run test # tsx tests/*.test.ts
108
- npm run clean # remove dist + compiled demo
109
- ```
110
-
111
- ## Run the demo
112
-
113
- ```sh
114
- npm run build:all
115
- python -m http.server 8765
116
- # browse http://localhost:8765/demo/index.html
117
- ```
118
-
119
- Controls:
120
- - **Arrow keys / WASD**: pan camera
121
- - **Click**: burst 24 particles + play SFX chirp (after first click, AudioContext unlocks)
122
- - **Hover**: stats panel shows the iso tile under the cursor
123
-
124
- ## Layout
125
-
126
- ```
127
- loom-engine/
128
- src/
129
- util/ math, color, typed-arrays
130
- components/ transform, sprite, particle-emitter
131
- renderer/ graphics-device, canvas2d-device, camera, iso-projection
132
- animation/ animation-clip, animation-state-pool
133
- asset/ sprite-sheet-loader
134
- audio/ audio-bus
135
- input/ input-manager
136
- systems/ sprite-render, animation, particle-{simulation,emitter,render}, input, veil-budget
137
- vfx/ particle-pool
138
- entity.ts entity allocator (32-bit handle, generation guard)
139
- world.ts ECS World class
140
- system.ts System interface + phase constants
141
- resources.ts ResourceRegistry + Time + VeilBudget
142
- engine.ts Engine facade
143
- index.ts public API barrel
144
- demo/ browser demo (one tile + animated knight + sparkles + click-to-burst)
145
- tests/ node-based smoke tests (tsx --test)
146
- assets/ placeholder game assets (knight walk-cycle PNG + JSON)
147
- tools/ helper scripts (gen-knight.py - Pillow generator)
148
- PRIOR-ART.md cumulative inspirations log (clean-room defense)
149
- package.json tsc + tsx as only dev deps
150
- tsconfig.json ES2022 strict + noUncheckedIndexedAccess
151
- dist/ tsc output (gitignored)
152
- node_modules/ npm install output (gitignored)
153
- ```
154
-
155
- ## Architecture quick-reference
156
-
157
- - **ECS** over god-object scene graph - entities are 32-bit handles,
158
- components live in pools indexed by entity index
159
- - **Structure-of-arrays** for hot data (TransformPool, SpritePool,
160
- ParticlePool, ParticleEmitterPool, AnimationStatePool) - tight
161
- iteration over Float32Arrays, no per-entity object allocation
162
- - **IGraphicsDevice** abstraction with Canvas2D primary backend
163
- (WebGL2 reserved for Phase 2+ if profiling demands)
164
- - **6-phase scheduler** - INPUT -> LOGIC -> PHYSICS -> ANIMATION ->
165
- RENDER -> POST_RENDER, deterministic registration order within each
166
- - **VeilBudgetResource** - the patent-defensible novelty hook. Single
167
- resource with `particleBudget`, `audioBudget`, `shaderBudget`,
168
- `eventBudget`. VeilBudgetSystem propagates updates to ParticlePool,
169
- AudioBus, etc. Director-bridge mutates the budget; subsystems read
170
- - **Frame loop** - `engine.tick(now)` runs in this order:
171
- 1. compute dt (clamped to 1/30s)
172
- 2. advance Time resource
173
- 3. device.beginFrame
174
- 4. world.update (walks all phases)
175
- 5. device.endFrame
176
-
177
- ## Public API surface (Phase 5)
178
-
179
- ```ts
180
- import {
181
- Engine,
182
- // ECS
183
- POOL_TRANSFORM, POOL_SPRITE, POOL_ANIMATION, POOL_PARTICLE,
184
- POOL_EMITTER,
185
- TransformPool, SpritePool, AnimationStatePool, ParticlePool,
186
- ParticleEmitterPool,
187
- SYSTEM_PHASE_INPUT, SYSTEM_PHASE_LOGIC, SYSTEM_PHASE_PHYSICS,
188
- SYSTEM_PHASE_ANIMATION, SYSTEM_PHASE_RENDER, SYSTEM_PHASE_POST_RENDER,
189
- // Default systems
190
- AnimationSystem, SpriteRenderSystem,
191
- ParticleEmitterSystem, ParticleSimulationSystem, ParticleRenderSystem,
192
- InputSystem, VeilBudgetSystem,
193
- // Resources
194
- RESOURCE_TIME, RESOURCE_CAMERA, RESOURCE_DEVICE,
195
- RESOURCE_VEIL_BUDGET, RESOURCE_INPUT, RESOURCE_AUDIO_BUS,
196
- // Renderer
197
- Canvas2DDevice, ISO_TILE_WIDTH, ISO_TILE_HEIGHT,
198
- // Asset
199
- loadSpriteSheet, computeFrameIndex,
200
- // Audio
201
- AudioBus, AUDIO_BUDGET_AMBIENT_FLOOR, AUDIO_BUDGET_ESSENTIAL_FLOOR,
202
- // Input
203
- InputManager,
204
- // Math + color
205
- vec2, vec3, rect, clamp, lerp,
206
- hexToRgba, rgbaToCssString,
207
- COLOR_KNOT_STR, COLOR_KNOT_DEX, COLOR_KNOT_INT, COLOR_KNOT_CENTER,
208
- // Iso
209
- tileToIso, worldToIso, isoToTile, isoDepthKey,
210
- } from '@sadhaka/loom-engine';
211
-
212
- const engine = Engine.create({ canvas });
213
- engine.world.addSystem(new InputSystem(), SYSTEM_PHASE_INPUT);
214
- engine.world.addSystem(new VeilBudgetSystem(), SYSTEM_PHASE_INPUT);
215
- // ... game systems ...
216
- engine.world.addSystem(new SpriteRenderSystem(), SYSTEM_PHASE_RENDER);
217
- function tick(now: number) {
218
- engine.tick(now);
219
- requestAnimationFrame(tick);
220
- }
221
- requestAnimationFrame(tick);
222
- ```
223
-
224
- ## Patent strategy
225
-
226
- The engine's defensible novelty is in the **Loom integration layer**,
227
- not the rasterizer. Director-driven scene state, Veil Essence economy
228
- gating render budget, knot-aware encounter generation, event-sourced
229
- rendering. The renderer underneath uses public-domain techniques
230
- (sprite batching, isometric projection, ECS) implemented from scratch.
231
-
232
- See [PRIOR-ART.md](./PRIOR-ART.md) for the cumulative inspirations
233
- log (public talks, papers, OSS architecture - took / declined per
234
- source).
235
-
236
- Every architectural commit names its inspirations in plain text. No
237
- copy-paste from any external engine source. PRIOR-ART.md is the
238
- audit trail any future productization or patent dispute would lean on.
239
-
240
- ## Test coverage
241
-
242
- 208 / 208 tests pass on Node 24 via `tsx --test`. Coverage spans
243
- all twelve test files in `tests/`:
244
-
245
- - `smoke.test.ts` - public API barrel, version stamp
246
- - `world.test.ts` - ECS world, system scheduling, sprite pool, sprite render, time
247
- - `asset-loader.test.ts` - sprite-sheet manifest, frame stepper, error discriminator
248
- - `animation.test.ts` - animation clip math, state pool, AnimationSystem end-to-end
249
- - `vfx.test.ts` - particle pool, emitter pool, simulation, emitter system, veil budget
250
- - `audio-input.test.ts` - audio bus + ducking, input manager, input system, budget propagation
251
- - `director.test.ts` - SSE bridge, eventSourceFactory hook, scene-state derivation
252
- - `combat.test.ts` - hit resolution, damage application, knockback
253
- - `projectile.test.ts` - projectile pool, lifetime, collision
254
- - `arpg.test.ts` - ARPG hub-and-spoke, plaza narrator, encounter scheduling
255
- - `snapshot-recovery.test.ts` - SnapshotRecoveryHelper for Director reconnect
256
- - `touch-input.test.ts` - virtual D-pad, tap-to-walk, multi-touch arbitration
257
-
258
- Run via `npm test`. Each suite is fully node-based; no DOM dependency.
259
- Browser-only paths (Canvas2DDevice rasterization, AudioContext
260
- unlock, DOM event listeners) are exercised via the demo's preview
261
- verification, not unit tests.
262
-
263
- ## Docs deploy
264
-
265
- The TypeDoc site at **https://loom-engine.pages.dev/** is served by
266
- Cloudflare Pages from the `gh-pages` branch of this repo. The chain:
267
-
268
- 1. Push to `main` triggers `.github/workflows/docs.yml`
269
- 2. Workflow runs `npm ci`, `npm test`, `npm run docs:ci`, then publishes
270
- `./docs-build/` to the `gh-pages` branch via `peaceiris/actions-gh-pages`
271
- 3. Cloudflare Pages watches the `gh-pages` branch and auto-deploys on
272
- every push, typically within 1-2 min
273
-
274
- GitHub Pages itself is **not** used: the repo is private and free user
275
- plans do not include Pages on private repos. The 422 error from the
276
- Pages create API is the canonical signal: `"Your current plan does not
277
- support GitHub Pages for this repository."`
278
-
279
- ### Re-creating the deploy from scratch
280
-
281
- If the Cloudflare Pages project is ever deleted or the repo is forked
282
- to a new owner, re-activate as follows:
283
-
284
- 1. Cloudflare dashboard -> **Workers & Pages** -> **Create** -> **Pages** ->
285
- **Connect to Git**
286
- 2. Authorize Cloudflare on the GitHub account that owns the repo
287
- (only the engine repo needs to be granted access)
288
- 3. Select `loom-engine`, name the project `loom-engine` (default URL
289
- becomes `loom-engine.pages.dev`)
290
- 4. **Production branch**: `gh-pages`
291
- 5. **Build command**: leave empty (the gh-pages branch is already a
292
- built static site)
293
- 6. **Build output directory**: `/` (root)
294
- 7. Save and deploy. First deploy reads whatever is currently on
295
- `gh-pages`; subsequent deploys auto-trigger on push to that branch
296
- 8. Optional: assign a custom domain (e.g. `engine.theworldtable.ai`)
297
- under the project's **Custom domains** tab. CF DNS for
298
- `theworldtable.ai` is already on the same account, so this is a
299
- one-click CNAME add
300
-
301
- If the workflow ever stops updating `gh-pages` (CF Pages will keep
302
- serving the last successful build but go stale), check
303
- `gh run list --repo sadhaka/loom-engine --workflow=docs.yml`.
304
-
305
- ## License
306
-
307
- [MIT](./LICENSE). Copyright (c) 2026 Misha Mitiev.
308
-
309
- You can use the engine in commercial and non-commercial work without
310
- royalties. Attribution is appreciated but not required by the license.
311
- The patent-defensible novelty claims (see [Patent strategy](#patent-strategy))
312
- are about specific architectural patterns documented in PRIOR-ART.md;
313
- they are independent of the source-code license and do not constrain
314
- typical engine reuse.
315
-
316
- ## Publishing
317
-
318
- Tagged releases publish to npm via
319
- [`.github/workflows/npm-publish.yml`](./.github/workflows/npm-publish.yml).
320
- The workflow runs `npm test` and `npm run build`, then
321
- `npm publish --access public`, when a tag matching `v*` is pushed to
322
- `main`. It needs the `NPM_TOKEN` repo secret to authenticate.
323
-
324
- Manual publish from a local checkout:
325
-
326
- ```sh
327
- npm login # one-time, npm account named sadhaka
328
- npm test # 208/208 must pass
329
- npm run build # tsc -> dist/
330
- npm publish --dry-run # inspect tarball contents first
331
- npm publish --access public # scoped packages default to private; flag is required
332
- ```
333
-
334
- `prepublishOnly` in `package.json` re-runs `npm test && npm run build`
335
- before any publish, so the dry-run and the final publish always rebuild
336
- from a clean source tree.
337
-
338
- ## Contributing
339
-
340
- This is a single-author project (Misha Mitiev) for TheWorldTable.ai.
341
- The MIT license permits forking and modification; pull requests are
342
- welcome but not actively triaged - the canonical roadmap is the spec
343
- file (`LOOM-ENGINE-SPEC.md` in the parent repo) and capacity is
344
- limited. For bug reports, file an issue with a minimal repro.
1
+ # Loom Engine
2
+
3
+ Browser-first 2D / 2.5D game engine for [TheWorldTable.ai](https://theworldtable.ai).
4
+ Canvas2D primary backend, ECS, render-graph stages, Director-bridge
5
+ SSE integration. No external engine reuse - built from scratch in
6
+ TypeScript.
7
+
8
+ Repo: [sadhaka/loom-engine](https://github.com/sadhaka/loom-engine).
9
+ API docs: [loom-engine.pages.dev](https://loom-engine.pages.dev/).
10
+ The design spec (`LOOM-ENGINE-SPEC.md`) lives in the consuming
11
+ TheWorldTable.ai repo and is the canonical source for phase
12
+ plans and architectural decisions.
13
+
14
+ ## Install
15
+
16
+ ```sh
17
+ npm install @sadhaka/loom-engine
18
+ ```
19
+
20
+ Pre-alpha. ESM-only, browser-first. TypeScript types ship in the
21
+ package (`dist/index.d.ts`). Node 18+ for the build toolchain;
22
+ the runtime targets evergreen browsers (Canvas2D + Web Audio +
23
+ EventSource).
24
+
25
+ ## Documentation
26
+
27
+ API reference (TypeDoc) - generated from the public surface in
28
+ [`src/index.ts`](./src/index.ts) on every push to `main`:
29
+ **https://loom-engine.pages.dev/**
30
+
31
+ Build it locally with `npm run docs` (writes to `./docs/`).
32
+
33
+ See [Docs deploy](#docs-deploy) for the hosting chain and one-time
34
+ activation steps (Cloudflare Pages, since GitHub Pages is unavailable
35
+ on private repos for free user plans).
36
+
37
+ ## Quickstart
38
+
39
+ ```ts
40
+ // 1. Install
41
+ // npm install @sadhaka/loom-engine
42
+ import {
43
+ Engine,
44
+ SpriteRenderSystem,
45
+ InputSystem,
46
+ VeilBudgetSystem,
47
+ SYSTEM_PHASE_INPUT,
48
+ SYSTEM_PHASE_RENDER,
49
+ } from '@sadhaka/loom-engine';
50
+
51
+ // 2. Attach to a canvas. Engine.create wires Canvas2DDevice, World,
52
+ // TransformPool, SpritePool, Time + Camera resources, and the
53
+ // default SpriteRenderSystem in SYSTEM_PHASE_RENDER.
54
+ var canvas = document.querySelector('canvas');
55
+ var engine = Engine.create({ canvas: canvas });
56
+
57
+ // 3. Register the systems your game needs. Order within a phase is
58
+ // deterministic; phases run INPUT -> LOGIC -> PHYSICS -> ANIMATION
59
+ // -> RENDER -> POST_RENDER per frame.
60
+ engine.world.addSystem(new InputSystem(), SYSTEM_PHASE_INPUT);
61
+ engine.world.addSystem(new VeilBudgetSystem(), SYSTEM_PHASE_INPUT);
62
+
63
+ // 4. Drive the frame loop. engine.tick advances Time, beginFrame on
64
+ // the device, world.update across all phases, endFrame.
65
+ function tick(now) {
66
+ engine.tick(now);
67
+ requestAnimationFrame(tick);
68
+ }
69
+ requestAnimationFrame(tick);
70
+ ```
71
+
72
+ ## Configuration
73
+
74
+ ### Director-bridge credentials (security note)
75
+
76
+ `SSEDirectorBridge` and `SnapshotRecoveryHelper` send credentials with
77
+ their network requests by default. The default `eventSourceFactory`
78
+ constructs `new EventSource(url, { withCredentials: true })` and
79
+ `SnapshotRecoveryHelper` calls `fetch(url, { credentials: 'include' })`.
80
+ This is the right default for the embedded TheWorldTable.ai
81
+ same-origin use case (cookies + auth headers flow with the request
82
+ to the same origin), but **a third-party consumer pointing the bridge
83
+ at a URL configured from user input could end up sending their own
84
+ site's credentials cross-origin** (the browser still requires the
85
+ target server to opt in via `Access-Control-Allow-Credentials: true`
86
+ plus a specific `Access-Control-Allow-Origin`, so this is not a
87
+ one-sided SSRF; it requires attacker control of the target server's
88
+ CORS policy).
89
+
90
+ If you do not want credentials to flow with director-bridge requests,
91
+ override the seams the engine already exposes - no engine code change
92
+ needed:
93
+
94
+ ```ts
95
+ import {
96
+ SSEDirectorBridge,
97
+ SnapshotRecoveryHelper,
98
+ } from '@sadhaka/loom-engine';
99
+
100
+ // Credential-free SSE subscription.
101
+ var bridge = new SSEDirectorBridge({
102
+ baseUrl: directorUrl,
103
+ characterId: characterId,
104
+ eventSourceFactory: function(u) {
105
+ return new EventSource(u, { withCredentials: false });
106
+ },
107
+ });
108
+
109
+ // Credential-free snapshot recovery.
110
+ var recovery = new SnapshotRecoveryHelper({
111
+ baseUrl: snapshotUrl,
112
+ characterId: characterId,
113
+ fetchImpl: function(input, init) {
114
+ var safeInit = Object.assign({}, init, { credentials: 'omit' });
115
+ return fetch(input, safeInit);
116
+ },
117
+ });
118
+ ```
119
+
120
+ Audited as Low-severity finding L-02 in
121
+ [`SECURITY-AUDIT-0.10.0.md`](./SECURITY-AUDIT-0.10.0.md). The
122
+ override hooks have always existed; 0.10.1 documents them.
123
+
124
+ ## Status
125
+
126
+ **Pre-alpha, productized as of 0.10.0** (Phase 11B.3 - npm publish
127
+ under MIT). Phases 0 through 9.3 + 11A.2 are shipped; the engine
128
+ runs the public TheWorldTable.ai pre-alpha. Productization is a
129
+ fund-raising and distribution decision, not a stability claim - the
130
+ public API surface will evolve until 1.0.
131
+
132
+ | Phase | Status | Surface |
133
+ |---|---|---|
134
+ | 0 | shipped | scaffolding, package.json, tsconfig, PRIOR-ART log |
135
+ | 1 | shipped | Canvas2D iso renderer, camera, transform pool (SoA) |
136
+ | 2 | shipped | ECS World, system scheduler, resource registry, Engine facade, asset pipeline |
137
+ | 3 | shipped | clip-aware sprite-sheet manifests, AnimationStatePool, AnimationSystem |
138
+ | 4 | shipped | particle pool, emitter component, three-system VFX pipeline, additive blend |
139
+ | 5 | shipped | Web Audio bus mixer with VE-budget gating, unified keyboard / mouse / touch input |
140
+ | 6 | shipped | Director-bridge: SSE event-stream subscription, eventSourceFactory hook, snapshot-recovery |
141
+ | 7 | shipped | Survivor combat layer (projectile pool, hit resolution, damage application) ported onto Loom Engine |
142
+ | 8 | shipped | 2.5D ARPG hub-and-spoke per LOOM-CLASS-SYSTEM-SPEC, plaza narrator, mobile + touch input (virtual D-pad, tap-to-walk) |
143
+ | 9.1 | shipped | perf pass: alloc-churn fixes + bench harness |
144
+ | 9.3 | shipped | TypeDoc public-API site with auto-deploy |
145
+ | 11A.2 | shipped | docs hosting migrated to Cloudflare Pages |
146
+ | 11B.3 | shipped | MIT license + npm publish posture (this release) |
147
+
148
+ See [LOOM-ENGINE-SPEC.md](../docker/LOOM-ENGINE-SPEC.md) Section 7
149
+ for the full phase plan with effort estimates.
150
+
151
+ ## Build
152
+
153
+ ```sh
154
+ npm install
155
+ npm run build # tsc src/ -> dist/
156
+ npm run build:demo # tsc demo/*.ts -> demo/*.js
157
+ npm run build:all # both
158
+ npm run watch # rebuild src on change
159
+ npm run test # tsx tests/*.test.ts
160
+ npm run clean # remove dist + compiled demo
161
+ ```
162
+
163
+ ## Run the demo
164
+
165
+ ```sh
166
+ npm run build:all
167
+ python -m http.server 8765
168
+ # browse http://localhost:8765/demo/index.html
169
+ ```
170
+
171
+ Controls:
172
+ - **Arrow keys / WASD**: pan camera
173
+ - **Click**: burst 24 particles + play SFX chirp (after first click, AudioContext unlocks)
174
+ - **Hover**: stats panel shows the iso tile under the cursor
175
+
176
+ ## Layout
177
+
178
+ ```
179
+ loom-engine/
180
+ src/
181
+ util/ math, color, typed-arrays
182
+ components/ transform, sprite, particle-emitter
183
+ renderer/ graphics-device, canvas2d-device, camera, iso-projection
184
+ animation/ animation-clip, animation-state-pool
185
+ asset/ sprite-sheet-loader
186
+ audio/ audio-bus
187
+ input/ input-manager
188
+ systems/ sprite-render, animation, particle-{simulation,emitter,render}, input, veil-budget
189
+ vfx/ particle-pool
190
+ entity.ts entity allocator (32-bit handle, generation guard)
191
+ world.ts ECS World class
192
+ system.ts System interface + phase constants
193
+ resources.ts ResourceRegistry + Time + VeilBudget
194
+ engine.ts Engine facade
195
+ index.ts public API barrel
196
+ demo/ browser demo (one tile + animated knight + sparkles + click-to-burst)
197
+ tests/ node-based smoke tests (tsx --test)
198
+ assets/ placeholder game assets (knight walk-cycle PNG + JSON)
199
+ tools/ helper scripts (gen-knight.py - Pillow generator)
200
+ PRIOR-ART.md cumulative inspirations log (clean-room defense)
201
+ package.json tsc + tsx as only dev deps
202
+ tsconfig.json ES2022 strict + noUncheckedIndexedAccess
203
+ dist/ tsc output (gitignored)
204
+ node_modules/ npm install output (gitignored)
205
+ ```
206
+
207
+ ## Architecture quick-reference
208
+
209
+ - **ECS** over god-object scene graph - entities are 32-bit handles,
210
+ components live in pools indexed by entity index
211
+ - **Structure-of-arrays** for hot data (TransformPool, SpritePool,
212
+ ParticlePool, ParticleEmitterPool, AnimationStatePool) - tight
213
+ iteration over Float32Arrays, no per-entity object allocation
214
+ - **IGraphicsDevice** abstraction with Canvas2D primary backend
215
+ (WebGL2 reserved for Phase 2+ if profiling demands)
216
+ - **6-phase scheduler** - INPUT -> LOGIC -> PHYSICS -> ANIMATION ->
217
+ RENDER -> POST_RENDER, deterministic registration order within each
218
+ - **VeilBudgetResource** - the patent-defensible novelty hook. Single
219
+ resource with `particleBudget`, `audioBudget`, `shaderBudget`,
220
+ `eventBudget`. VeilBudgetSystem propagates updates to ParticlePool,
221
+ AudioBus, etc. Director-bridge mutates the budget; subsystems read
222
+ - **Frame loop** - `engine.tick(now)` runs in this order:
223
+ 1. compute dt (clamped to 1/30s)
224
+ 2. advance Time resource
225
+ 3. device.beginFrame
226
+ 4. world.update (walks all phases)
227
+ 5. device.endFrame
228
+
229
+ ## Public API surface (Phase 5)
230
+
231
+ ```ts
232
+ import {
233
+ Engine,
234
+ // ECS
235
+ POOL_TRANSFORM, POOL_SPRITE, POOL_ANIMATION, POOL_PARTICLE,
236
+ POOL_EMITTER,
237
+ TransformPool, SpritePool, AnimationStatePool, ParticlePool,
238
+ ParticleEmitterPool,
239
+ SYSTEM_PHASE_INPUT, SYSTEM_PHASE_LOGIC, SYSTEM_PHASE_PHYSICS,
240
+ SYSTEM_PHASE_ANIMATION, SYSTEM_PHASE_RENDER, SYSTEM_PHASE_POST_RENDER,
241
+ // Default systems
242
+ AnimationSystem, SpriteRenderSystem,
243
+ ParticleEmitterSystem, ParticleSimulationSystem, ParticleRenderSystem,
244
+ InputSystem, VeilBudgetSystem,
245
+ // Resources
246
+ RESOURCE_TIME, RESOURCE_CAMERA, RESOURCE_DEVICE,
247
+ RESOURCE_VEIL_BUDGET, RESOURCE_INPUT, RESOURCE_AUDIO_BUS,
248
+ // Renderer
249
+ Canvas2DDevice, ISO_TILE_WIDTH, ISO_TILE_HEIGHT,
250
+ // Asset
251
+ loadSpriteSheet, computeFrameIndex,
252
+ // Audio
253
+ AudioBus, AUDIO_BUDGET_AMBIENT_FLOOR, AUDIO_BUDGET_ESSENTIAL_FLOOR,
254
+ // Input
255
+ InputManager,
256
+ // Math + color
257
+ vec2, vec3, rect, clamp, lerp,
258
+ hexToRgba, rgbaToCssString,
259
+ COLOR_KNOT_STR, COLOR_KNOT_DEX, COLOR_KNOT_INT, COLOR_KNOT_CENTER,
260
+ // Iso
261
+ tileToIso, worldToIso, isoToTile, isoDepthKey,
262
+ } from '@sadhaka/loom-engine';
263
+
264
+ const engine = Engine.create({ canvas });
265
+ engine.world.addSystem(new InputSystem(), SYSTEM_PHASE_INPUT);
266
+ engine.world.addSystem(new VeilBudgetSystem(), SYSTEM_PHASE_INPUT);
267
+ // ... game systems ...
268
+ engine.world.addSystem(new SpriteRenderSystem(), SYSTEM_PHASE_RENDER);
269
+ function tick(now: number) {
270
+ engine.tick(now);
271
+ requestAnimationFrame(tick);
272
+ }
273
+ requestAnimationFrame(tick);
274
+ ```
275
+
276
+ ## Patent strategy
277
+
278
+ The engine's defensible novelty is in the **Loom integration layer**,
279
+ not the rasterizer. Director-driven scene state, Veil Essence economy
280
+ gating render budget, knot-aware encounter generation, event-sourced
281
+ rendering. The renderer underneath uses public-domain techniques
282
+ (sprite batching, isometric projection, ECS) implemented from scratch.
283
+
284
+ See [PRIOR-ART.md](./PRIOR-ART.md) for the cumulative inspirations
285
+ log (public talks, papers, OSS architecture - took / declined per
286
+ source).
287
+
288
+ Every architectural commit names its inspirations in plain text. No
289
+ copy-paste from any external engine source. PRIOR-ART.md is the
290
+ audit trail any future productization or patent dispute would lean on.
291
+
292
+ ## Test coverage
293
+
294
+ 208 / 208 tests pass on Node 24 via `tsx --test`. Coverage spans
295
+ all twelve test files in `tests/`:
296
+
297
+ - `smoke.test.ts` - public API barrel, version stamp
298
+ - `world.test.ts` - ECS world, system scheduling, sprite pool, sprite render, time
299
+ - `asset-loader.test.ts` - sprite-sheet manifest, frame stepper, error discriminator
300
+ - `animation.test.ts` - animation clip math, state pool, AnimationSystem end-to-end
301
+ - `vfx.test.ts` - particle pool, emitter pool, simulation, emitter system, veil budget
302
+ - `audio-input.test.ts` - audio bus + ducking, input manager, input system, budget propagation
303
+ - `director.test.ts` - SSE bridge, eventSourceFactory hook, scene-state derivation
304
+ - `combat.test.ts` - hit resolution, damage application, knockback
305
+ - `projectile.test.ts` - projectile pool, lifetime, collision
306
+ - `arpg.test.ts` - ARPG hub-and-spoke, plaza narrator, encounter scheduling
307
+ - `snapshot-recovery.test.ts` - SnapshotRecoveryHelper for Director reconnect
308
+ - `touch-input.test.ts` - virtual D-pad, tap-to-walk, multi-touch arbitration
309
+
310
+ Run via `npm test`. Each suite is fully node-based; no DOM dependency.
311
+ Browser-only paths (Canvas2DDevice rasterization, AudioContext
312
+ unlock, DOM event listeners) are exercised via the demo's preview
313
+ verification, not unit tests.
314
+
315
+ ## Docs deploy
316
+
317
+ The TypeDoc site at **https://loom-engine.pages.dev/** is served by
318
+ Cloudflare Pages from the `gh-pages` branch of this repo. The chain:
319
+
320
+ 1. Push to `main` triggers `.github/workflows/docs.yml`
321
+ 2. Workflow runs `npm ci`, `npm test`, `npm run docs:ci`, then publishes
322
+ `./docs-build/` to the `gh-pages` branch via `peaceiris/actions-gh-pages`
323
+ 3. Cloudflare Pages watches the `gh-pages` branch and auto-deploys on
324
+ every push, typically within 1-2 min
325
+
326
+ GitHub Pages itself is **not** used: the repo is private and free user
327
+ plans do not include Pages on private repos. The 422 error from the
328
+ Pages create API is the canonical signal: `"Your current plan does not
329
+ support GitHub Pages for this repository."`
330
+
331
+ ### Re-creating the deploy from scratch
332
+
333
+ If the Cloudflare Pages project is ever deleted or the repo is forked
334
+ to a new owner, re-activate as follows:
335
+
336
+ 1. Cloudflare dashboard -> **Workers & Pages** -> **Create** -> **Pages** ->
337
+ **Connect to Git**
338
+ 2. Authorize Cloudflare on the GitHub account that owns the repo
339
+ (only the engine repo needs to be granted access)
340
+ 3. Select `loom-engine`, name the project `loom-engine` (default URL
341
+ becomes `loom-engine.pages.dev`)
342
+ 4. **Production branch**: `gh-pages`
343
+ 5. **Build command**: leave empty (the gh-pages branch is already a
344
+ built static site)
345
+ 6. **Build output directory**: `/` (root)
346
+ 7. Save and deploy. First deploy reads whatever is currently on
347
+ `gh-pages`; subsequent deploys auto-trigger on push to that branch
348
+ 8. Optional: assign a custom domain (e.g. `engine.theworldtable.ai`)
349
+ under the project's **Custom domains** tab. CF DNS for
350
+ `theworldtable.ai` is already on the same account, so this is a
351
+ one-click CNAME add
352
+
353
+ If the workflow ever stops updating `gh-pages` (CF Pages will keep
354
+ serving the last successful build but go stale), check
355
+ `gh run list --repo sadhaka/loom-engine --workflow=docs.yml`.
356
+
357
+ ## License
358
+
359
+ Versions 0.11.0 and later are licensed under the
360
+ [Business Source License 1.1](./LICENSE) ("BUSL-1.1").
361
+ Copyright (c) 2026 Misha Mitiev.
362
+
363
+ - **Free for use** below USD $1,000,000 annual gross revenue from any
364
+ product, game, or service that incorporates this engine. Personal
365
+ projects, learning, prototyping, and indie games well under that
366
+ threshold all qualify.
367
+ - **Commercial license required** above the threshold. Contact
368
+ `licensor@theworldtable.ai`. Standard terms include a 5% royalty on
369
+ excess revenue; lump-sum buyouts and equity-for-license arrangements
370
+ are negotiable. See
371
+ [COMMERCIAL_LICENSE_TERMS.md](./COMMERCIAL_LICENSE_TERMS.md).
372
+ - **Auto-converts to Apache 2.0** on **2030-05-08** (4-year window per
373
+ BUSL spec). After that date, all 0.11.0+ versions become permissive.
374
+ - **Patent strategy**: novelty claims documented in PRIOR-ART.md are
375
+ independent of the source-code license and apply to all versions
376
+ regardless of license phase.
377
+
378
+ Version 0.10.0 (the only previously-published release) remains
379
+ permanently licensed under MIT for backwards compatibility. Projects
380
+ pinned to `0.10.0` are unaffected by the license change but will not
381
+ receive future updates without accepting BUSL-1.1.
382
+
383
+ ## Publishing
384
+
385
+ Tagged releases publish to npm via
386
+ [`.github/workflows/npm-publish.yml`](./.github/workflows/npm-publish.yml).
387
+ The workflow runs `npm test` and `npm run build`, then
388
+ `npm publish --access public`, when a tag matching `v*` is pushed to
389
+ `main`. It needs the `NPM_TOKEN` repo secret to authenticate.
390
+
391
+ Manual publish from a local checkout:
392
+
393
+ ```sh
394
+ npm login # one-time, npm account named sadhaka
395
+ npm test # 208/208 must pass
396
+ npm run build # tsc -> dist/
397
+ npm publish --dry-run # inspect tarball contents first
398
+ npm publish --access public # scoped packages default to private; flag is required
399
+ ```
400
+
401
+ `prepublishOnly` in `package.json` re-runs `npm test && npm run build`
402
+ before any publish, so the dry-run and the final publish always rebuild
403
+ from a clean source tree.
404
+
405
+ ## Contributing
406
+
407
+ This is a single-author project (Misha Mitiev) for TheWorldTable.ai.
408
+ The MIT license permits forking and modification; pull requests are
409
+ welcome but not actively triaged - the canonical roadmap is the spec
410
+ file (`LOOM-ENGINE-SPEC.md` in the parent repo) and capacity is
411
+ limited. For bug reports, file an issue with a minimal repro.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const LOOM_ENGINE_VERSION = "0.10.0-perf-9-1";
1
+ export declare const LOOM_ENGINE_VERSION = "0.11.0";
2
2
  export type { Vec2, Vec3, Rect } from './util/math.js';
3
3
  export { vec2, vec3, rect, clamp, lerp, smoothstep, approxEq, rectContains, rectIntersects, visibleInView, } from './util/math.js';
4
4
  export type { ColorRGBA } from './util/color.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,7 +3,12 @@
3
3
  // Phase 2 adds the ECS layer: World, System scheduler, Resources,
4
4
  // SpritePool, SpriteRenderSystem, and the high-level Engine facade
5
5
  // that wires everything together with sane defaults.
6
- export const LOOM_ENGINE_VERSION = '0.10.0-perf-9-1';
6
+ // Keep this string in agreement with package.json.version. Bump both
7
+ // in the same commit when cutting a release. Audit L-01 (0.10.0):
8
+ // the previous suffix `-perf-9-1` lingered after package.json was
9
+ // bumped to 0.10.0, surfacing as a drift bug in
10
+ // engine.LOOM_ENGINE_VERSION-based diagnostics.
11
+ export const LOOM_ENGINE_VERSION = '0.11.0';
7
12
  export { vec2, vec3, rect, clamp, lerp, smoothstep, approxEq, rectContains, rectIntersects, visibleInView, } from './util/math.js';
8
13
  export { rgba, hexToRgba, rgbaToHexString, rgbaToCssString, colorLerp, COLOR_WHITE, COLOR_BLACK, COLOR_TRANSPARENT, COLOR_KNOT_STR, COLOR_KNOT_DEX, COLOR_KNOT_INT, COLOR_KNOT_CENTER, } from './util/color.js';
9
14
  export { EntityAllocator, NULL_ENTITY, entityIndex, entityGeneration, makeEntity, } from './entity.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,56 +1,57 @@
1
- {
2
- "name": "@sadhaka/loom-engine",
3
- "version": "0.10.0",
4
- "description": "Browser-first 2D / 2.5D game engine. Canvas2D, ECS, render-graph stages, Director-bridge SSE integration. Built from scratch in TypeScript for TheWorldTable.ai.",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "import": "./dist/index.js",
12
- "types": "./dist/index.d.ts"
13
- }
14
- },
15
- "files": [
16
- "dist",
17
- "README.md",
18
- "LICENSE"
19
- ],
20
- "keywords": [
21
- "game-engine",
22
- "ecs",
23
- "browser",
24
- "typescript",
25
- "isometric",
26
- "sse",
27
- "director-events"
28
- ],
29
- "repository": {
30
- "type": "git",
31
- "url": "https://github.com/sadhaka/loom-engine"
32
- },
33
- "homepage": "https://loom-engine.pages.dev/",
34
- "bugs": {
35
- "url": "https://github.com/sadhaka/loom-engine/issues"
36
- },
37
- "scripts": {
38
- "build": "tsc",
39
- "build:demo": "tsc -p tsconfig.demo.json",
40
- "build:all": "npm run build && npm run build:demo",
41
- "watch": "tsc --watch",
42
- "clean": "rm -rf dist demo/*.js demo/*.js.map",
43
- "test": "tsx --test tests/smoke.test.ts tests/world.test.ts tests/asset-loader.test.ts tests/animation.test.ts tests/vfx.test.ts tests/audio-input.test.ts tests/director.test.ts tests/combat.test.ts tests/projectile.test.ts tests/arpg.test.ts tests/snapshot-recovery.test.ts tests/touch-input.test.ts",
44
- "docs": "typedoc",
45
- "docs:ci": "typedoc --out docs-build --cleanOutputDir",
46
- "prepublishOnly": "npm test && npm run build"
47
- },
48
- "devDependencies": {
49
- "tsx": "^4.19.0",
50
- "typedoc": "^0.28.19",
51
- "typedoc-plugin-markdown": "^4.11.0",
52
- "typescript": "^5.4.0"
53
- },
54
- "license": "MIT",
55
- "author": "Misha Mitiev"
56
- }
1
+ {
2
+ "name": "@sadhaka/loom-engine",
3
+ "version": "0.11.0",
4
+ "description": "Browser-first 2D / 2.5D game engine. Canvas2D, ECS, render-graph stages, Director-bridge SSE integration. Built from scratch in TypeScript for TheWorldTable.ai.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "keywords": [
22
+ "game-engine",
23
+ "ecs",
24
+ "browser",
25
+ "typescript",
26
+ "isometric",
27
+ "sse",
28
+ "director-events"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/sadhaka/loom-engine"
33
+ },
34
+ "homepage": "https://loom-engine.pages.dev/",
35
+ "bugs": {
36
+ "url": "https://github.com/sadhaka/loom-engine/issues"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc",
40
+ "build:demo": "tsc -p tsconfig.demo.json",
41
+ "build:all": "npm run build && npm run build:demo",
42
+ "watch": "tsc --watch",
43
+ "clean": "rm -rf dist demo/*.js demo/*.js.map",
44
+ "test": "tsx --test tests/smoke.test.ts tests/world.test.ts tests/asset-loader.test.ts tests/animation.test.ts tests/vfx.test.ts tests/audio-input.test.ts tests/director.test.ts tests/combat.test.ts tests/projectile.test.ts tests/arpg.test.ts tests/snapshot-recovery.test.ts tests/touch-input.test.ts",
45
+ "docs": "typedoc",
46
+ "docs:ci": "typedoc --out docs-build --cleanOutputDir",
47
+ "prepublishOnly": "npm test && npm run build"
48
+ },
49
+ "devDependencies": {
50
+ "tsx": "^4.19.0",
51
+ "typedoc": "^0.28.19",
52
+ "typedoc-plugin-markdown": "^4.11.0",
53
+ "typescript": "^5.4.0"
54
+ },
55
+ "license": "BUSL-1.1",
56
+ "author": "Misha Mitiev"
57
+ }