iris-ecs 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -36
- package/dist/component.d.ts.map +1 -1
- package/dist/component.js +5 -5
- package/dist/component.js.map +1 -1
- package/dist/entity.d.ts +6 -5
- package/dist/entity.d.ts.map +1 -1
- package/dist/entity.js +14 -15
- package/dist/entity.js.map +1 -1
- package/dist/error.d.ts +129 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +150 -0
- package/dist/error.js.map +1 -0
- package/dist/event.d.ts +19 -20
- package/dist/event.d.ts.map +1 -1
- package/dist/event.js +91 -65
- package/dist/event.js.map +1 -1
- package/dist/filters.d.ts.map +1 -1
- package/dist/filters.js +7 -6
- package/dist/filters.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/name.d.ts +2 -1
- package/dist/name.d.ts.map +1 -1
- package/dist/name.js +5 -7
- package/dist/name.js.map +1 -1
- package/dist/query.d.ts +3 -12
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +11 -17
- package/dist/query.js.map +1 -1
- package/dist/registry.d.ts +3 -3
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +7 -12
- package/dist/registry.js.map +1 -1
- package/dist/relation.d.ts.map +1 -1
- package/dist/relation.js +4 -3
- package/dist/relation.js.map +1 -1
- package/dist/scheduler.d.ts +129 -27
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +258 -65
- package/dist/scheduler.js.map +1 -1
- package/dist/world.d.ts +33 -9
- package/dist/world.d.ts.map +1 -1
- package/dist/world.js +20 -6
- package/dist/world.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# iris-ecs
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Entity Component System implementation for TypeScript.
|
|
4
|
+
|
|
5
|
+
> **Early stage implementation.** APIs are unstable and breaking changes can happen between versions.
|
|
4
6
|
|
|
5
7
|
## What is ECS?
|
|
6
8
|
|
|
@@ -41,8 +43,7 @@ import {
|
|
|
41
43
|
setComponentValue,
|
|
42
44
|
fetchEntities,
|
|
43
45
|
addSystem,
|
|
44
|
-
|
|
45
|
-
executeSchedule,
|
|
46
|
+
runOnce,
|
|
46
47
|
Type,
|
|
47
48
|
} from "iris-ecs";
|
|
48
49
|
|
|
@@ -72,10 +73,9 @@ function movementSystem(world) {
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
// Register and run
|
|
76
|
+
// Register and run
|
|
76
77
|
addSystem(world, movementSystem);
|
|
77
|
-
|
|
78
|
-
executeSchedule(world);
|
|
78
|
+
await runOnce(world);
|
|
79
79
|
|
|
80
80
|
// Position is now { x: 1, y: 0 }
|
|
81
81
|
```
|
|
@@ -416,8 +416,8 @@ A **System** is a function that operates on the world. Systems query entities, r
|
|
|
416
416
|
```typescript
|
|
417
417
|
import {
|
|
418
418
|
addSystem,
|
|
419
|
-
|
|
420
|
-
|
|
419
|
+
run,
|
|
420
|
+
stop,
|
|
421
421
|
fetchEntities,
|
|
422
422
|
getComponentValue,
|
|
423
423
|
setComponentValue,
|
|
@@ -436,15 +436,13 @@ function movementSystem(world) {
|
|
|
436
436
|
}
|
|
437
437
|
|
|
438
438
|
addSystem(world, movementSystem);
|
|
439
|
-
|
|
439
|
+
run(world);
|
|
440
440
|
|
|
441
|
-
//
|
|
442
|
-
|
|
443
|
-
executeSchedule(world);
|
|
444
|
-
}
|
|
441
|
+
// ... later
|
|
442
|
+
await stop(world);
|
|
445
443
|
```
|
|
446
444
|
|
|
447
|
-
Systems are registered with `addSystem()
|
|
445
|
+
Systems are registered with `addSystem()` and executed automatically when the world runs. The system function's name becomes its identifier.
|
|
448
446
|
|
|
449
447
|
#### Ordering Constraints
|
|
450
448
|
|
|
@@ -458,8 +456,6 @@ function renderSystem(world) { /* draw frame */ }
|
|
|
458
456
|
addSystem(world, inputSystem);
|
|
459
457
|
addSystem(world, physicsSystem, { after: "inputSystem" });
|
|
460
458
|
addSystem(world, renderSystem, { after: "physicsSystem" });
|
|
461
|
-
|
|
462
|
-
buildSchedule(world);
|
|
463
459
|
// Executes: inputSystem -> physicsSystem -> renderSystem
|
|
464
460
|
```
|
|
465
461
|
|
|
@@ -469,27 +465,70 @@ Without constraints, systems run in registration order. Use arrays for multiple
|
|
|
469
465
|
|
|
470
466
|
#### Schedules
|
|
471
467
|
|
|
472
|
-
Systems are grouped into **schedules
|
|
468
|
+
Systems are grouped into **schedules** -- named execution phases. The default pipeline runs these schedules every frame:
|
|
469
|
+
|
|
470
|
+
```
|
|
471
|
+
First -> PreUpdate -> Update -> PostUpdate -> Last
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
`Update` is the default schedule. Assign systems to other phases based on when they should run:
|
|
473
475
|
|
|
474
476
|
```typescript
|
|
475
|
-
addSystem
|
|
476
|
-
addSystem(world, saveGameSystem, { schedule: "shutdown" });
|
|
477
|
-
addSystem(world, physicsSystem); // defaults to "runtime"
|
|
477
|
+
import { addSystem, First, PreUpdate, PostUpdate, Last, run, stop } from "iris-ecs";
|
|
478
478
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
479
|
+
addSystem(world, inputSystem, { schedule: First });
|
|
480
|
+
addSystem(world, physicsSystem, { schedule: PreUpdate });
|
|
481
|
+
addSystem(world, movementSystem); // defaults to Update
|
|
482
|
+
addSystem(world, collisionSystem, { schedule: PostUpdate });
|
|
483
|
+
addSystem(world, renderSystem, { schedule: Last });
|
|
482
484
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
485
|
+
run(world);
|
|
486
|
+
|
|
487
|
+
// ... later
|
|
488
|
+
await stop(world);
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
Two additional schedules run outside the main loop:
|
|
492
|
+
|
|
493
|
+
- **Startup** runs once before the first frame (asset loading, initialization)
|
|
494
|
+
- **Shutdown** runs once when `stop()` is called (cleanup, save state)
|
|
495
|
+
|
|
496
|
+
```typescript
|
|
497
|
+
import { Startup, Shutdown } from "iris-ecs";
|
|
498
|
+
|
|
499
|
+
addSystem(world, loadAssetsSystem, { schedule: Startup });
|
|
500
|
+
addSystem(world, saveGameSystem, { schedule: Shutdown });
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
#### Custom Schedules
|
|
504
|
+
|
|
505
|
+
Create custom pipeline phases with `defineSchedule()` and insert them relative to existing ones:
|
|
506
|
+
|
|
507
|
+
```typescript
|
|
508
|
+
import { defineSchedule, insertScheduleAfter, PreUpdate } from "iris-ecs";
|
|
509
|
+
|
|
510
|
+
const Physics = defineSchedule("Physics");
|
|
511
|
+
insertScheduleAfter(world, Physics, PreUpdate);
|
|
512
|
+
addSystem(world, gravitySystem, { schedule: Physics });
|
|
513
|
+
|
|
514
|
+
// Pipeline is now: First -> PreUpdate -> Physics -> Update -> PostUpdate -> Last
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
#### Running the World
|
|
518
|
+
|
|
519
|
+
`run(world)` starts a `requestAnimationFrame` loop. Each frame runs all pipeline schedules then flushes events. `stop(world)` stops the loop and runs Shutdown. Calling `stop()` then `run()` again re-triggers Startup and Shutdown for each cycle.
|
|
520
|
+
|
|
521
|
+
For manual frame stepping (tests, server-side), use `runOnce()`:
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
import { runOnce } from "iris-ecs";
|
|
525
|
+
|
|
526
|
+
await runOnce(world); // one frame
|
|
488
527
|
```
|
|
489
528
|
|
|
490
529
|
#### Async Systems
|
|
491
530
|
|
|
492
|
-
|
|
531
|
+
Systems can be async. Both `run()` and `runOnce()` handle sync and async systems transparently:
|
|
493
532
|
|
|
494
533
|
```typescript
|
|
495
534
|
async function loadAssetsSystem(world) {
|
|
@@ -497,14 +536,9 @@ async function loadAssetsSystem(world) {
|
|
|
497
536
|
// ...
|
|
498
537
|
}
|
|
499
538
|
|
|
500
|
-
addSystem(world, loadAssetsSystem, { schedule:
|
|
501
|
-
buildSchedule(world, "startup");
|
|
502
|
-
|
|
503
|
-
await executeScheduleAsync(world, "startup");
|
|
539
|
+
addSystem(world, loadAssetsSystem, { schedule: Startup });
|
|
504
540
|
```
|
|
505
541
|
|
|
506
|
-
⚠️ `executeSchedule()` throws if any system returns a Promise. Use `executeScheduleAsync()` for schedules with async systems.
|
|
507
|
-
|
|
508
542
|
### Actions
|
|
509
543
|
|
|
510
544
|
**Actions** bundle reusable operations with a world captured in closure. Define actions once, then call them without repeatedly passing the world.
|
|
@@ -614,7 +648,7 @@ if (isPaused) {
|
|
|
614
648
|
|
|
615
649
|
#### Event Lifetime
|
|
616
650
|
|
|
617
|
-
Events
|
|
651
|
+
Events use double-buffered storage. Buffers rotate automatically at the end of each frame -- events survive one frame (so systems that run next frame can still read them), then are discarded. Calling `fetchEvents()` marks events as read for that system -- a second call in the same system sees nothing new.
|
|
618
652
|
|
|
619
653
|
⚠️ **Events are not entities.** Unlike components and tags, events exist outside the entity-component model. You cannot query for events or attach them to entities.
|
|
620
654
|
|
package/dist/component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAMtF,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAChE,IAAI,CAAC;AAER,wBAAgB,YAAY,CAAC,CAAC,SAAS,YAAY,EACjD,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC7C,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACzB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAMtF,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAChE,IAAI,CAAC;AAER,wBAAgB,YAAY,CAAC,CAAC,SAAS,YAAY,EACjD,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC7C,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACzB,IAAI,CAAC;AAyER;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,GAAG,IAAI,CAsD7F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAI7F;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,MAAM,CAAC,EACzE,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC7C,SAAS,EAAE,CAAC,GACX,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAc/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,MAAM,CAAC,EACzE,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC7C,SAAS,EAAE,CAAC,EACZ,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACvB,IAAI,CAqBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,GAAG,IAAI,CASlG;AAMD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,GAAG,IAAI,CAiBhF"}
|
package/dist/component.js
CHANGED
|
@@ -21,8 +21,9 @@ import { getPairRelation, getPairTarget, getRelationTargets } from "./relation.j
|
|
|
21
21
|
* addComponent(world, child, pair(ChildOf, parent));
|
|
22
22
|
*/
|
|
23
23
|
export function addComponent(world, entityId, componentId, data) {
|
|
24
|
+
const entityMeta = ensureEntity(world, entityId);
|
|
24
25
|
// Idempotent: already has component
|
|
25
|
-
if (
|
|
26
|
+
if (entityMeta.archetype.typesSet.has(componentId)) {
|
|
26
27
|
return;
|
|
27
28
|
}
|
|
28
29
|
// Exclusive enforcement: remove old target before adding new
|
|
@@ -36,7 +37,6 @@ export function addComponent(world, entityId, componentId, data) {
|
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
|
-
const entityMeta = ensureEntity(world, entityId);
|
|
40
40
|
const componentMeta = ensureEntity(world, componentId);
|
|
41
41
|
const schema = componentMeta.schema;
|
|
42
42
|
// Find target archetype
|
|
@@ -48,7 +48,7 @@ export function addComponent(world, entityId, componentId, data) {
|
|
|
48
48
|
toArchetype = archetypeTraverseAdd(world, toArchetype, encodePair(Wildcard, target));
|
|
49
49
|
toArchetype = archetypeTraverseAdd(world, toArchetype, encodePair(relation, Wildcard));
|
|
50
50
|
}
|
|
51
|
-
moveEntityToArchetype(world,
|
|
51
|
+
moveEntityToArchetype(world, entityMeta, toArchetype);
|
|
52
52
|
if (data) {
|
|
53
53
|
for (const fieldName in data) {
|
|
54
54
|
const value = data[fieldName];
|
|
@@ -112,7 +112,7 @@ export function removeComponent(world, entityId, componentId) {
|
|
|
112
112
|
}
|
|
113
113
|
// Fire before move so observers can access component data
|
|
114
114
|
fireObserverEvent(world, "componentRemoved", componentId, entityId);
|
|
115
|
-
moveEntityToArchetype(world,
|
|
115
|
+
moveEntityToArchetype(world, meta, toArchetype);
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
118
|
* Check if entity has component.
|
|
@@ -221,7 +221,7 @@ export function emitComponentChanged(world, entityId, componentId) {
|
|
|
221
221
|
* @param componentId - Component to remove from all entities
|
|
222
222
|
*/
|
|
223
223
|
export function cascadeRemoveComponent(world, componentId) {
|
|
224
|
-
const meta =
|
|
224
|
+
const meta = world.entities.byId.get(componentId);
|
|
225
225
|
// Copy records - will be modified during iteration as entities move
|
|
226
226
|
const archetypes = [...meta.records];
|
|
227
227
|
for (const archetype of archetypes) {
|
package/dist/component.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEjG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAqBnF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAY,EACZ,QAAkB,EAClB,WAAqB,EACrB,IAA2B;IAE3B,oCAAoC;IACpC,IAAI,
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
|
package/dist/entity.d.ts
CHANGED
|
@@ -35,7 +35,8 @@ export type EntityMeta = {
|
|
|
35
35
|
* @param world - World instance
|
|
36
36
|
* @param entityId - Entity or component ID
|
|
37
37
|
* @returns Entity metadata
|
|
38
|
-
* @throws {
|
|
38
|
+
* @throws {NotFound} If entity not registered (ENTITY_TYPE)
|
|
39
|
+
* @throws {InvalidState} If unknown entity type
|
|
39
40
|
*
|
|
40
41
|
* @example
|
|
41
42
|
* ```typescript
|
|
@@ -49,7 +50,7 @@ export declare function ensureEntity(world: World, entityId: EntityId): EntityMe
|
|
|
49
50
|
*
|
|
50
51
|
* @param world - World instance
|
|
51
52
|
* @returns Encoded entity ID
|
|
52
|
-
* @throws {
|
|
53
|
+
* @throws {LimitExceeded} If entity limit (1,048,576) exceeded
|
|
53
54
|
*
|
|
54
55
|
* @example
|
|
55
56
|
* ```typescript
|
|
@@ -90,16 +91,16 @@ export declare function isEntityAlive(world: World, entity: EntityId): boolean;
|
|
|
90
91
|
* Moves entity to a different archetype, transferring component data.
|
|
91
92
|
*
|
|
92
93
|
* @param world - World instance
|
|
93
|
-
* @param
|
|
94
|
+
* @param meta - Entity metadata
|
|
94
95
|
* @param toArchetype - Target archetype
|
|
95
96
|
*
|
|
96
97
|
* @example
|
|
97
98
|
* ```typescript
|
|
98
99
|
* const archetype = getOrCreateArchetype(world, [Position, Velocity]);
|
|
99
|
-
* moveEntityToArchetype(world,
|
|
100
|
+
* moveEntityToArchetype(world, meta, archetype);
|
|
100
101
|
* ```
|
|
101
102
|
*/
|
|
102
|
-
export declare function moveEntityToArchetype(world: World,
|
|
103
|
+
export declare function moveEntityToArchetype(world: World, meta: EntityMeta, toArchetype: Archetype): void;
|
|
103
104
|
/**
|
|
104
105
|
* Registers archetype in entity records for all its component types.
|
|
105
106
|
*
|
package/dist/entity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,KAAK,EAAa,MAAM,EAAE,QAAQ,EAAY,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,KAAK,EAAa,MAAM,EAAE,QAAQ,EAAY,MAAM,eAAe,CAAC;AAkB3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,SAAS,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,OAAO,EAAE,SAAS,EAAE,CAAC;IAErB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AA0CF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAkDzE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAOjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CA0CpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAErE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,GAAG,IAAI,CAkBlG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAOxE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAU3E"}
|
package/dist/entity.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { addEntityToArchetype, removeEntityFromArchetypeByRow, transferEntityToArchetypeByRow } from "./archetype.js";
|
|
2
2
|
import { addComponent, cascadeRemoveComponent } from "./component.js";
|
|
3
3
|
import { COMPONENT_TYPE, ENTITY_TYPE, encodeEntity, extractId, extractMeta, extractType, ID_MASK_8, ID_MASK_20, isPair, RELATIONSHIP_TYPE, TAG_TYPE, } from "./encoding.js";
|
|
4
|
+
import { assert, InvalidState, LimitExceeded, NotFound } from "./error.js";
|
|
4
5
|
import { fireObserverEvent } from "./observer.js";
|
|
5
6
|
import { Exclusive, OnDeleteTarget } from "./registry.js";
|
|
6
7
|
import { cleanupPairsTargetingEntity, getPairRelation } from "./relation.js";
|
|
@@ -16,9 +17,7 @@ function allocateEntityId(world) {
|
|
|
16
17
|
return encodeEntity(rawId, generation);
|
|
17
18
|
}
|
|
18
19
|
const newRawId = world.entities.nextId++;
|
|
19
|
-
|
|
20
|
-
throw new RangeError(`Entity ID limit exceeded: cannot allocate ID ${newRawId} (max ${ID_MASK_20})`);
|
|
21
|
-
}
|
|
20
|
+
assert(newRawId <= ID_MASK_20, LimitExceeded, { resource: "Entity", max: ID_MASK_20, id: newRawId });
|
|
22
21
|
world.entities.generations.set(newRawId, 0);
|
|
23
22
|
return encodeEntity(newRawId, 0);
|
|
24
23
|
}
|
|
@@ -44,7 +43,8 @@ function registerEntity(world, entityId, schema) {
|
|
|
44
43
|
* @param world - World instance
|
|
45
44
|
* @param entityId - Entity or component ID
|
|
46
45
|
* @returns Entity metadata
|
|
47
|
-
* @throws {
|
|
46
|
+
* @throws {NotFound} If entity not registered (ENTITY_TYPE)
|
|
47
|
+
* @throws {InvalidState} If unknown entity type
|
|
48
48
|
*
|
|
49
49
|
* @example
|
|
50
50
|
* ```typescript
|
|
@@ -85,10 +85,10 @@ export function ensureEntity(world, entityId) {
|
|
|
85
85
|
return meta;
|
|
86
86
|
}
|
|
87
87
|
case ENTITY_TYPE: {
|
|
88
|
-
throw new
|
|
88
|
+
throw new NotFound({ resource: "Entity", id: entityId, context: "world" });
|
|
89
89
|
}
|
|
90
90
|
default: {
|
|
91
|
-
throw new
|
|
91
|
+
throw new InvalidState({ message: `Invalid entity type: ${type}` });
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
}
|
|
@@ -97,7 +97,7 @@ export function ensureEntity(world, entityId) {
|
|
|
97
97
|
*
|
|
98
98
|
* @param world - World instance
|
|
99
99
|
* @returns Encoded entity ID
|
|
100
|
-
* @throws {
|
|
100
|
+
* @throws {LimitExceeded} If entity limit (1,048,576) exceeded
|
|
101
101
|
*
|
|
102
102
|
* @example
|
|
103
103
|
* ```typescript
|
|
@@ -128,7 +128,7 @@ export function destroyEntity(world, entityId) {
|
|
|
128
128
|
if (!isEntityAlive(world, entityId)) {
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
|
-
const meta =
|
|
131
|
+
const meta = world.entities.byId.get(entityId);
|
|
132
132
|
// Cycle protection - prevent infinite loops from cascade deletes
|
|
133
133
|
if (meta.destroying) {
|
|
134
134
|
return;
|
|
@@ -141,7 +141,7 @@ export function destroyEntity(world, entityId) {
|
|
|
141
141
|
const swappedEntityId = removeEntityFromArchetypeByRow(meta.archetype, meta.row);
|
|
142
142
|
// Swap-remove updates: entity swapped into our slot needs row update
|
|
143
143
|
if (swappedEntityId !== undefined) {
|
|
144
|
-
const swappedMeta =
|
|
144
|
+
const swappedMeta = world.entities.byId.get(swappedEntityId);
|
|
145
145
|
swappedMeta.row = meta.row;
|
|
146
146
|
}
|
|
147
147
|
fireObserverEvent(world, "entityDestroyed", entityId);
|
|
@@ -177,24 +177,23 @@ export function isEntityAlive(world, entity) {
|
|
|
177
177
|
* Moves entity to a different archetype, transferring component data.
|
|
178
178
|
*
|
|
179
179
|
* @param world - World instance
|
|
180
|
-
* @param
|
|
180
|
+
* @param meta - Entity metadata
|
|
181
181
|
* @param toArchetype - Target archetype
|
|
182
182
|
*
|
|
183
183
|
* @example
|
|
184
184
|
* ```typescript
|
|
185
185
|
* const archetype = getOrCreateArchetype(world, [Position, Velocity]);
|
|
186
|
-
* moveEntityToArchetype(world,
|
|
186
|
+
* moveEntityToArchetype(world, meta, archetype);
|
|
187
187
|
* ```
|
|
188
188
|
*/
|
|
189
|
-
export function moveEntityToArchetype(world,
|
|
190
|
-
const meta = ensureEntity(world, entityId);
|
|
189
|
+
export function moveEntityToArchetype(world, meta, toArchetype) {
|
|
191
190
|
const fromRow = meta.row;
|
|
192
191
|
const { toRow, swappedEntityId } = transferEntityToArchetypeByRow(meta.archetype, meta.row, toArchetype, world.execution.tick);
|
|
193
192
|
meta.archetype = toArchetype;
|
|
194
193
|
meta.row = toRow;
|
|
195
194
|
// Swap-remove updates: entity swapped into our old slot needs row update
|
|
196
195
|
if (swappedEntityId !== undefined) {
|
|
197
|
-
const swappedMeta =
|
|
196
|
+
const swappedMeta = world.entities.byId.get(swappedEntityId);
|
|
198
197
|
swappedMeta.row = fromRow;
|
|
199
198
|
}
|
|
200
199
|
}
|
|
@@ -233,7 +232,7 @@ export function addEntityRecord(world, archetype) {
|
|
|
233
232
|
export function removeEntityRecord(world, archetype) {
|
|
234
233
|
for (let i = 0; i < archetype.types.length; i++) {
|
|
235
234
|
const typeId = archetype.types[i];
|
|
236
|
-
const meta =
|
|
235
|
+
const meta = world.entities.byId.get(typeId);
|
|
237
236
|
const idx = meta.records.indexOf(archetype);
|
|
238
237
|
if (idx !== -1) {
|
|
239
238
|
meta.records.splice(idx, 1);
|
package/dist/entity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AACtH,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EACL,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,iBAAiB,EACjB,QAAQ,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAwC7E;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAY;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,gDAAgD;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;QAC1D,OAAO,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAEzC,
|
|
1
|
+
{"version":3,"file":"entity.js","sourceRoot":"","sources":["../src/entity.ts"],"names":[],"mappings":"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"}
|
package/dist/error.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all Iris ECS errors.
|
|
3
|
+
*
|
|
4
|
+
* Provides structured error categories with typed parameters for
|
|
5
|
+
* programmatic error handling via `instanceof` checks.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* try {
|
|
10
|
+
* createEntity(world);
|
|
11
|
+
* } catch (error) {
|
|
12
|
+
* if (error instanceof LimitExceeded) {
|
|
13
|
+
* console.log(error.resource, error.max);
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare class IrisError extends Error {
|
|
19
|
+
constructor(message: string, options?: {
|
|
20
|
+
cause?: unknown;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Thrown when an ID space is exhausted.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Thrown when entity limit (1,048,576) is exceeded
|
|
29
|
+
* const entity = createEntity(world);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class LimitExceeded extends IrisError {
|
|
33
|
+
readonly resource: string;
|
|
34
|
+
readonly max: number;
|
|
35
|
+
readonly id?: number;
|
|
36
|
+
constructor(params: {
|
|
37
|
+
resource: string;
|
|
38
|
+
max: number;
|
|
39
|
+
id?: number;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Thrown when a referenced item does not exist.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* // Thrown when accessing a destroyed entity
|
|
48
|
+
* ensureEntity(world, destroyedEntity);
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class NotFound extends IrisError {
|
|
52
|
+
readonly resource: string;
|
|
53
|
+
readonly id: string | number;
|
|
54
|
+
readonly context?: string;
|
|
55
|
+
constructor(params: {
|
|
56
|
+
resource: string;
|
|
57
|
+
id: string | number;
|
|
58
|
+
context?: string;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Thrown when attempting to register a duplicate item.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* // Thrown when registering a system with the same name twice
|
|
67
|
+
* addSystem(world, mySystem);
|
|
68
|
+
* addSystem(world, mySystem); // throws Duplicate
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare class Duplicate extends IrisError {
|
|
72
|
+
readonly resource: string;
|
|
73
|
+
readonly id: string | number;
|
|
74
|
+
constructor(params: {
|
|
75
|
+
resource: string;
|
|
76
|
+
id: string | number;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Thrown when a function argument fails validation.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* // Thrown when registering an anonymous system without a name
|
|
85
|
+
* addSystem(world, () => {});
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare class InvalidArgument extends IrisError {
|
|
89
|
+
readonly expected: string;
|
|
90
|
+
readonly actual?: string;
|
|
91
|
+
constructor(params: {
|
|
92
|
+
expected: string;
|
|
93
|
+
actual?: string;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Thrown when the system reaches an invalid or unexpected state.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // Thrown on circular system dependencies
|
|
102
|
+
* addSystem(world, a, { before: "b" });
|
|
103
|
+
* addSystem(world, b, { before: "a" });
|
|
104
|
+
* await runOnce(world);
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
export declare class InvalidState extends IrisError {
|
|
108
|
+
constructor(params: {
|
|
109
|
+
message: string;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Assert a condition, throwing a typed error if false.
|
|
114
|
+
*
|
|
115
|
+
* Error is only constructed when the condition fails (lazy construction).
|
|
116
|
+
* TypeScript `asserts condition` narrows the type at call sites.
|
|
117
|
+
*
|
|
118
|
+
* @param condition - Value to check for truthiness
|
|
119
|
+
* @param ErrorClass - Error class to instantiate on failure
|
|
120
|
+
* @param params - Constructor parameters for the error class
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* assert(rawId <= ID_MASK_20, LimitExceeded, { resource: "Entity", max: ID_MASK_20, id: rawId });
|
|
125
|
+
* // rawId is narrowed to truthy after this point
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export declare function assert<P>(condition: unknown, ErrorClass: new (params: P) => IrisError, params: P): asserts condition;
|
|
129
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAMD;;;;;;;;GAQG;AACH,qBAAa,aAAc,SAAQ,SAAS;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;gBAET,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE;CAOnE;AAED;;;;;;;;GAQG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEd,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;CAOhF;AAED;;;;;;;;;GASG;AACH,qBAAa,SAAU,SAAQ,SAAS;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;gBAEjB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;CAK9D;AAED;;;;;;;;GAQG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEb,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;CAM1D;AAED;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,SAAQ,SAAS;gBAC7B,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;CAGxC;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC,KAAK,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAIpH"}
|