@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 +103 -21
- package/README.md +411 -344
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/package.json +57 -56
package/LICENSE
CHANGED
|
@@ -1,21 +1,103 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
##
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
##
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
`
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
`npm
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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.
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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":"AAAA,oCAAoC;AACpC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,qDAAqD;AAErD,MAAM,CAAC,MAAM,mBAAmB,GAAG,
|
|
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.
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"build
|
|
40
|
-
"build:
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"docs
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
"typedoc
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"
|
|
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
|
+
}
|