@benev/archimedes 0.1.0-3 → 0.1.0-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +86 -10
  2. package/package.json +4 -4
  3. package/s/ecs/index.ts +6 -5
  4. package/s/ecs/parts/apply-change.ts +33 -0
  5. package/s/ecs/parts/change.ts +27 -0
  6. package/s/ecs/parts/entities.ts +98 -0
  7. package/s/ecs/parts/execute-systems.ts +18 -0
  8. package/s/ecs/parts/lifecycle.ts +30 -0
  9. package/s/ecs/parts/types.ts +25 -0
  10. package/s/ecs/test/setup-example.ts +49 -0
  11. package/s/ecs/test.ts +71 -61
  12. package/x/ecs/index.d.ts +6 -4
  13. package/x/ecs/index.js +6 -4
  14. package/x/ecs/index.js.map +1 -1
  15. package/x/ecs/parts/apply-change.d.ts +3 -0
  16. package/x/ecs/parts/apply-change.js +30 -0
  17. package/x/ecs/parts/apply-change.js.map +1 -0
  18. package/x/ecs/parts/change.d.ts +13 -0
  19. package/x/ecs/parts/change.js +15 -0
  20. package/x/ecs/parts/change.js.map +1 -0
  21. package/x/ecs/parts/entities.d.ts +11 -0
  22. package/x/ecs/parts/entities.js +70 -0
  23. package/x/ecs/parts/entities.js.map +1 -0
  24. package/x/ecs/parts/execute-systems.d.ts +3 -0
  25. package/x/ecs/parts/execute-systems.js +12 -0
  26. package/x/ecs/parts/execute-systems.js.map +1 -0
  27. package/x/ecs/parts/lifecycle.d.ts +3 -0
  28. package/x/ecs/parts/lifecycle.js +19 -0
  29. package/x/ecs/parts/lifecycle.js.map +1 -0
  30. package/x/ecs/parts/types.d.ts +21 -0
  31. package/x/ecs/parts/types.js +9 -0
  32. package/x/ecs/parts/types.js.map +1 -0
  33. package/x/ecs/test/setup-example.d.ts +15 -0
  34. package/x/ecs/test/setup-example.js +32 -0
  35. package/x/ecs/test/setup-example.js.map +1 -0
  36. package/x/ecs/test.d.ts +2 -2
  37. package/x/ecs/test.js +71 -61
  38. package/x/ecs/test.js.map +1 -1
  39. package/s/ecs/parts/changers.ts +0 -20
  40. package/s/ecs/parts/world.ts +0 -65
  41. package/s/ecs/test/setup-example-world.ts +0 -42
  42. package/s/ecs/types.ts +0 -24
  43. package/s/ecs/utils/apply-change.ts +0 -32
  44. package/s/ecs/utils/is-match.ts +0 -7
  45. package/s/ecs/utils/optimizer.ts +0 -38
  46. package/x/ecs/parts/changers.d.ts +0 -5
  47. package/x/ecs/parts/changers.js +0 -15
  48. package/x/ecs/parts/changers.js.map +0 -1
  49. package/x/ecs/parts/world.d.ts +0 -11
  50. package/x/ecs/parts/world.js +0 -58
  51. package/x/ecs/parts/world.js.map +0 -1
  52. package/x/ecs/test/setup-example-world.d.ts +0 -10
  53. package/x/ecs/test/setup-example-world.js +0 -31
  54. package/x/ecs/test/setup-example-world.js.map +0 -1
  55. package/x/ecs/types.d.ts +0 -21
  56. package/x/ecs/types.js +0 -6
  57. package/x/ecs/types.js.map +0 -1
  58. package/x/ecs/utils/apply-change.d.ts +0 -2
  59. package/x/ecs/utils/apply-change.js +0 -30
  60. package/x/ecs/utils/apply-change.js.map +0 -1
  61. package/x/ecs/utils/is-match.d.ts +0 -2
  62. package/x/ecs/utils/is-match.js +0 -4
  63. package/x/ecs/utils/is-match.js.map +0 -1
  64. package/x/ecs/utils/optimizer.d.ts +0 -9
  65. package/x/ecs/utils/optimizer.js +0 -37
  66. package/x/ecs/utils/optimizer.js.map +0 -1
@@ -0,0 +1,30 @@
1
+ import { ChangeKind } from "./types.js";
2
+ export function applyChange(entities, change) {
3
+ switch (change[0]) {
4
+ case ChangeKind.Set: return applySet(entities, change);
5
+ case ChangeKind.Merge: return applyMerge(entities, change);
6
+ case ChangeKind.Drop: return applyDrop(entities, change);
7
+ default: throw new Error(`unknown change kind "${change[0]}"`);
8
+ }
9
+ }
10
+ function applySet(entities, [, id, components]) {
11
+ if (components)
12
+ entities.set(id, components);
13
+ else
14
+ entities.delete(id);
15
+ return id;
16
+ }
17
+ function applyMerge(entities, [, id, patch]) {
18
+ const components = entities.guarantee(id, () => ({}));
19
+ Object.assign(components, patch);
20
+ entities.set(id, components);
21
+ return id;
22
+ }
23
+ function applyDrop(entities, [, id, keys]) {
24
+ const components = entities.guarantee(id, () => ({}));
25
+ for (const key of keys)
26
+ delete components[key];
27
+ entities.set(id, components);
28
+ return id;
29
+ }
30
+ //# sourceMappingURL=apply-change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-change.js","sourceRoot":"","sources":["../../../s/ecs/parts/apply-change.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,UAAU,EAA0B,MAAM,YAAY,CAAA;AAE7F,MAAM,UAAU,WAAW,CAAuB,QAAqB,EAAE,MAAiB;IACzF,QAAQ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,KAAK,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAI,QAAQ,EAAgB,MAAM,CAAC,CAAA;QACvE,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,UAAU,CAAI,QAAQ,EAAkB,MAAM,CAAC,CAAA;QAC7E,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,SAAS,CAAI,QAAQ,EAAiB,MAAM,CAAC,CAAA;QAC1E,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC/D,CAAC;AACF,CAAC;AAED,SAAS,QAAQ,CAAuB,QAAqB,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,CAAe;IAC9F,IAAI,UAAU;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,UAAwB,CAAC,CAAA;;QACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxB,OAAO,EAAE,CAAA;AACV,CAAC;AAED,SAAS,UAAU,CAAuB,QAAqB,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,CAAiB;IAC7F,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;IAC5B,OAAO,EAAE,CAAA;AACV,CAAC;AAED,SAAS,SAAS,CAAuB,QAAqB,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAgB;IAC1F,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrD,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9C,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;IAC5B,OAAO,EAAE,CAAA;AACV,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Components, ChangeSet, ChangeMerge, Id, ChangeDrop } from "./types.js";
2
+ export declare const change: {
3
+ /** create a new entity with the given components */
4
+ create: (components: Partial<Components>) => ChangeSet<Components>;
5
+ /** overwrite a whole entity to the given components */
6
+ set: (id: Id, components: Partial<Components>) => ChangeSet<Components>;
7
+ /** remove the entity */
8
+ delete: (id: Id) => ChangeSet<Components>;
9
+ /** update or add the given components onto the entity */
10
+ merge: (id: Id, components: Partial<Components>) => ChangeMerge<Components>;
11
+ /** delete specific components off the entity */
12
+ drop: <C extends Components>(id: Id, ...keys: (keyof C)[]) => ChangeDrop<C>;
13
+ };
@@ -0,0 +1,15 @@
1
+ import { makeId } from "./make-id.js";
2
+ import { ChangeKind } from "./types.js";
3
+ export const change = {
4
+ /** create a new entity with the given components */
5
+ create: (components) => [ChangeKind.Set, makeId(), components],
6
+ /** overwrite a whole entity to the given components */
7
+ set: (id, components) => [ChangeKind.Set, id, components],
8
+ /** remove the entity */
9
+ delete: (id) => [ChangeKind.Set, id],
10
+ /** update or add the given components onto the entity */
11
+ merge: (id, components) => [ChangeKind.Merge, id, components],
12
+ /** delete specific components off the entity */
13
+ drop: (id, ...keys) => [ChangeKind.Drop, id, keys],
14
+ };
15
+ //# sourceMappingURL=change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.js","sourceRoot":"","sources":["../../../s/ecs/parts/change.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAA;AACnC,OAAO,EAAyC,UAAU,EAAa,MAAM,YAAY,CAAA;AAEzF,MAAM,CAAC,MAAM,MAAM,GAAG;IAErB,oDAAoD;IACpD,MAAM,EAAE,CAAC,UAA+B,EAAyB,EAAE,CAClE,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC;IAEvC,uDAAuD;IACvD,GAAG,EAAE,CAAC,EAAM,EAAE,UAA+B,EAAyB,EAAE,CACvE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,UAAU,CAAC;IAEjC,wBAAwB;IACxB,MAAM,EAAE,CAAC,EAAM,EAAyB,EAAE,CACzC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;IAErB,yDAAyD;IACzD,KAAK,EAAE,CAAC,EAAM,EAAE,UAA+B,EAA2B,EAAE,CAC3E,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,UAAU,CAAC;IAEnC,gDAAgD;IAChD,IAAI,EAAE,CAAuB,EAAM,EAAE,GAAG,IAAiB,EAAiB,EAAE,CAC3E,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC;CAC5B,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { GMap } from "@e280/stz";
2
+ import { Components, Id, Select } from "./types.js";
3
+ export declare class Entities<C extends Components> extends GMap<Id, Partial<C>> {
4
+ #private;
5
+ set(id: Id, components: Partial<C>): this;
6
+ delete(id: Id): boolean;
7
+ clear(): void;
8
+ select<K extends keyof C>(...componentKeys: K[]): Iterable<[Id, Select<C, K>]>;
9
+ readonly(): EntitiesReadonly<C>;
10
+ }
11
+ export type EntitiesReadonly<C extends Components> = Pick<Entities<Readonly<C>>, ("has" | "get" | "require" | "keys" | "values" | "entries" | "select" | typeof Symbol.iterator)>;
@@ -0,0 +1,70 @@
1
+ import { GMap } from "@e280/stz";
2
+ export class Entities extends GMap {
3
+ #index = new GMap();
4
+ set(id, components) {
5
+ super.set(id, components);
6
+ for (const [set, entities] of this.#index) {
7
+ if (componentsSatisfySet(components, set))
8
+ entities.set(id, components);
9
+ else
10
+ entities.delete(id);
11
+ }
12
+ return this;
13
+ }
14
+ delete(id) {
15
+ const didDelete = super.delete(id);
16
+ if (!didDelete)
17
+ return false;
18
+ for (const entities of this.#index.values())
19
+ entities.delete(id);
20
+ return true;
21
+ }
22
+ clear() {
23
+ super.clear();
24
+ for (const entities of this.#index.values())
25
+ entities.clear();
26
+ }
27
+ *select(...componentKeys) {
28
+ const cached = this.#getCache(componentKeys);
29
+ if (cached)
30
+ yield* cached;
31
+ else
32
+ yield* this.#makeCache(componentKeys);
33
+ }
34
+ readonly() {
35
+ return this;
36
+ }
37
+ #getCache(componentKeys) {
38
+ for (const set of this.#index.keys()) {
39
+ if (setHasSameValuesAsArray(set, componentKeys))
40
+ return this.#index.require(set);
41
+ }
42
+ }
43
+ *#makeCache(componentKeys) {
44
+ const set = new Set(componentKeys);
45
+ const entities = new GMap();
46
+ this.#index.set(set, entities);
47
+ for (const entity of this) {
48
+ const [id, components] = entity;
49
+ if (componentsSatisfyKeys(components, componentKeys)) {
50
+ entities.set(id, components);
51
+ yield entity;
52
+ }
53
+ }
54
+ }
55
+ }
56
+ function componentsSatisfySet(components, set) {
57
+ for (const key of set)
58
+ if (!(key in components))
59
+ return false;
60
+ return true;
61
+ }
62
+ function setHasSameValuesAsArray(set, keys) {
63
+ if (set.size !== keys.length)
64
+ return false;
65
+ return keys.every(key => set.has(key));
66
+ }
67
+ function componentsSatisfyKeys(components, keys) {
68
+ return keys.every(key => key in components);
69
+ }
70
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../s/ecs/parts/entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Entities } from "./entities.js";
2
+ import { Change, Components, System } from "./types.js";
3
+ export declare function executeSystems<C extends Components>(entities: Entities<C>, systems: System<C>[]): Change<C>[];
@@ -0,0 +1,12 @@
1
+ import { applyChange } from "./apply-change.js";
2
+ export function executeSystems(entities, systems) {
3
+ const changes = [];
4
+ for (const system of systems) {
5
+ for (const change of system()) {
6
+ applyChange(entities, change);
7
+ changes.push(change);
8
+ }
9
+ }
10
+ return changes;
11
+ }
12
+ //# sourceMappingURL=execute-systems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-systems.js","sourceRoot":"","sources":["../../../s/ecs/parts/execute-systems.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAG7C,MAAM,UAAU,cAAc,CAAuB,QAAqB,EAAE,OAAoB;IAC/F,MAAM,OAAO,GAAgB,EAAE,CAAA;IAE/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,EAAE,CAAC;YAC/B,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC;IACF,CAAC;IAED,OAAO,OAAO,CAAA;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { EntitiesReadonly } from "./entities.js";
2
+ import { Components, LifecycleEnter } from "./types.js";
3
+ export declare function lifecycle<C extends Components, K extends keyof C>(entities: EntitiesReadonly<C>, componentKeys: K[], enter: LifecycleEnter<C, K>): () => Generator<never, void, unknown>;
@@ -0,0 +1,19 @@
1
+ import { GMap } from "@e280/stz";
2
+ export function lifecycle(entities, componentKeys, enter) {
3
+ const alive = new GMap();
4
+ const sel = () => entities.select(...componentKeys);
5
+ return function* () {
6
+ const current = new Map(sel());
7
+ for (const [id, callbacks] of alive) {
8
+ if (current.has(id))
9
+ continue;
10
+ alive.delete(id);
11
+ callbacks.exit(id);
12
+ }
13
+ for (const [id, components] of current) {
14
+ const callbacks = alive.guarantee(id, () => enter(id, components));
15
+ callbacks.tick(id, components);
16
+ }
17
+ };
18
+ }
19
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../s/ecs/parts/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAI9B,MAAM,UAAU,SAAS,CACvB,QAA6B,EAC7B,aAAkB,EAClB,KAA2B;IAG5B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAgC,CAAA;IACtD,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,CAAA;IAEnD,OAAO,QAAQ,CAAC;QACf,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;QAE9B,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAQ;YAC7B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAChB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACnB,CAAC;QAED,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAA;YAClE,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;QAC/B,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type Id = string;
2
+ export type Components = Record<string, unknown>;
3
+ export type AsComponents<C extends Components> = C;
4
+ export type Select<C extends Components, K extends keyof C> = Pick<C, K> & Partial<C>;
5
+ export type System<C extends Components> = () => Generator<Change<C>>;
6
+ export declare const asSystem: <C extends Components>(system: System<C>) => System<C>;
7
+ export declare const asSystems: <C extends Components>(...systems: System<C>[]) => System<C>[];
8
+ export declare enum ChangeKind {
9
+ Set = 0,
10
+ Merge = 1,
11
+ Drop = 2
12
+ }
13
+ export type ChangeSet<C extends Components> = [kind: ChangeKind.Set, id: Id, components?: Partial<C>];
14
+ export type ChangeMerge<C extends Components> = [kind: ChangeKind.Merge, id: Id, patch: Partial<C>];
15
+ export type ChangeDrop<C extends Components> = [kind: ChangeKind.Drop, id: Id, keys: (keyof C)[]];
16
+ export type Change<C extends Components> = ChangeSet<C> | ChangeMerge<C> | ChangeDrop<C>;
17
+ export type LifecycleCallbacks<C extends Components, K extends keyof C> = {
18
+ tick: (id: Id, components: Select<C, K>) => void;
19
+ exit: (id: Id) => void;
20
+ };
21
+ export type LifecycleEnter<C extends Components, K extends keyof C> = ((id: Id, components: Select<C, K>) => LifecycleCallbacks<C, K>);
@@ -0,0 +1,9 @@
1
+ export const asSystem = (system) => system;
2
+ export const asSystems = (...systems) => systems;
3
+ export var ChangeKind;
4
+ (function (ChangeKind) {
5
+ ChangeKind[ChangeKind["Set"] = 0] = "Set";
6
+ ChangeKind[ChangeKind["Merge"] = 1] = "Merge";
7
+ ChangeKind[ChangeKind["Drop"] = 2] = "Drop";
8
+ })(ChangeKind || (ChangeKind = {}));
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../s/ecs/parts/types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAuB,MAAiB,EAAE,EAAE,CAAC,MAAM,CAAA;AAC3E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAuB,GAAG,OAAoB,EAAE,EAAE,CAAC,OAAO,CAAA;AAEnF,MAAM,CAAN,IAAY,UAA6B;AAAzC,WAAY,UAAU;IAAE,yCAAG,CAAA;IAAE,6CAAK,CAAA;IAAE,2CAAI,CAAA;AAAA,CAAC,EAA7B,UAAU,KAAV,UAAU,QAAmB"}
@@ -0,0 +1,15 @@
1
+ import { Entities } from "../parts/entities.js";
2
+ export declare function setupExample(): {
3
+ entities: Entities<{
4
+ health: number;
5
+ bleed: number;
6
+ mana: number;
7
+ manaRegen: number;
8
+ }>;
9
+ systems: import("../parts/types.js").System<{
10
+ health: number;
11
+ bleed: number;
12
+ mana: number;
13
+ manaRegen: number;
14
+ }>[];
15
+ };
@@ -0,0 +1,32 @@
1
+ import { change } from "../parts/change.js";
2
+ import { asSystems } from "../parts/types.js";
3
+ import { Entities } from "../parts/entities.js";
4
+ export function setupExample() {
5
+ const writableEntities = new Entities();
6
+ const entities = writableEntities.readonly();
7
+ const systems = asSystems(function* manaRegen() {
8
+ for (const [id, components] of entities.select("mana", "manaRegen")) {
9
+ if (components.manaRegen !== 0) {
10
+ const mana = components.mana + components.manaRegen;
11
+ yield change.merge(id, { mana });
12
+ }
13
+ }
14
+ }, function* bleeding() {
15
+ for (const [id, components] of entities.select("health", "bleed")) {
16
+ if (components.bleed >= 0) {
17
+ const health = components.health - components.bleed;
18
+ const bleed = components.bleed - 1;
19
+ yield change.merge(id, { health, bleed });
20
+ }
21
+ if (components.bleed <= 0)
22
+ yield change.drop(id, "bleed");
23
+ }
24
+ }, function* death() {
25
+ for (const [id, components] of entities.select("health")) {
26
+ if (components.health <= 0)
27
+ yield change.delete(id);
28
+ }
29
+ });
30
+ return { entities: writableEntities, systems };
31
+ }
32
+ //# sourceMappingURL=setup-example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-example.js","sourceRoot":"","sources":["../../../s/ecs/test/setup-example.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAA;AAE7C,MAAM,UAAU,YAAY;IAQ3B,MAAM,gBAAgB,GAAG,IAAI,QAAQ,EAAgB,CAAA;IACrD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAA;IAE5C,MAAM,OAAO,GAAG,SAAS,CACxB,QAAQ,CAAC,CAAC,SAAS;QAClB,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;YACrE,IAAI,UAAU,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAA;gBACnD,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,IAAI,EAAC,CAAC,CAAA;YAC/B,CAAC;QACF,CAAC;IACF,CAAC,EAED,QAAQ,CAAC,CAAC,QAAQ;QACjB,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YACnE,IAAI,UAAU,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,KAAK,CAAA;gBACnD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAA;gBAClC,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,CAAA;YACxC,CAAC;YACD,IAAI,UAAU,CAAC,KAAK,IAAI,CAAC;gBACxB,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAChC,CAAC;IACF,CAAC,EAED,QAAQ,CAAC,CAAC,KAAK;QACd,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1D,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;gBACzB,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACzB,CAAC;IACF,CAAC,CACD,CAAA;IAED,OAAO,EAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAC,CAAA;AAC7C,CAAC"}
package/x/ecs/test.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  declare const _default: {
2
2
  "create an entity": import("@e280/science").Test;
3
3
  "delete an entity": import("@e280/science").Test;
4
- "partial updates": import("@e280/science").Test;
4
+ "merge components into entity": import("@e280/science").Test;
5
5
  "select an entity": import("@e280/science").Test;
6
- "select an entity after shape change": import("@e280/science").Test;
6
+ "drop components from entity": import("@e280/science").Test;
7
7
  "select two entities": import("@e280/science").Test;
8
8
  "select with no component keys selects all": import("@e280/science").Test;
9
9
  "select doesn't include non-match": import("@e280/science").Test;
package/x/ecs/test.js CHANGED
@@ -1,83 +1,91 @@
1
1
  import { suite, test, expect } from "@e280/science";
2
- import { create, del, update } from "./parts/changers.js";
3
- import { setupExampleWorld } from "./test/setup-example-world.js";
2
+ import { change } from "./parts/change.js";
3
+ import { lifecycle } from "./parts/lifecycle.js";
4
+ import { applyChange } from "./parts/apply-change.js";
5
+ import { setupExample } from "./test/setup-example.js";
6
+ import { executeSystems } from "./parts/execute-systems.js";
4
7
  import { setupLifecycleCounts } from "./test/setup-lifecycle-counts.js";
5
8
  export default suite({
6
9
  "create an entity": test(async () => {
7
- const { world } = setupExampleWorld();
8
- expect(world.entities.size).is(0);
9
- world.apply(create({ health: 100 }));
10
- expect(world.entities.size).is(1);
10
+ const { entities } = setupExample();
11
+ expect(entities.size).is(0);
12
+ applyChange(entities, change.create({ health: 100 }));
13
+ expect(entities.size).is(1);
11
14
  }),
12
15
  "delete an entity": test(async () => {
13
- const { world } = setupExampleWorld();
14
- const id = world.apply(create({ health: 100 }));
15
- expect(world.entities.size).is(1);
16
- world.apply(del(id));
17
- expect(world.entities.size).is(0);
16
+ const { entities } = setupExample();
17
+ const id = applyChange(entities, change.create({ health: 100 }));
18
+ expect(entities.size).is(1);
19
+ applyChange(entities, change.delete(id));
20
+ expect(entities.size).is(0);
18
21
  }),
19
- "partial updates": test(async () => {
20
- const { world } = setupExampleWorld();
21
- const id = world.apply(create({ health: 100, mana: 100 }));
22
- expect(world.require(id).health).is(100);
23
- world.apply(update(id, { health: 99 }));
24
- expect(world.require(id).health).is(99);
25
- expect(world.require(id).mana).is(100);
22
+ "merge components into entity": test(async () => {
23
+ const { entities } = setupExample();
24
+ const id = applyChange(entities, change.create({ health: 100, mana: 100 }));
25
+ expect(entities.require(id).health).is(100);
26
+ applyChange(entities, change.merge(id, { health: 99 }));
27
+ expect(entities.require(id).health).is(99);
28
+ expect(entities.require(id).mana).is(100);
26
29
  }),
27
30
  "select an entity": test(async () => {
28
- const { world } = setupExampleWorld();
29
- world.apply(create({ health: 100 }));
30
- expect([...world.select("health")].length).is(1);
31
+ const { entities } = setupExample();
32
+ applyChange(entities, change.create({ health: 100 }));
33
+ expect([...entities.select("health")].length).is(1);
31
34
  }),
32
- "select an entity after shape change": test(async () => {
33
- const { world } = setupExampleWorld();
34
- const id = world.apply(create({ health: 100, mana: 100 }));
35
- expect([...world.select("health", "mana")].length).is(1);
36
- world.apply(update(id, { health: 99, mana: null }));
37
- expect([...world.select("health", "mana")].length).is(0);
35
+ "drop components from entity": test(async () => {
36
+ const { entities } = setupExample();
37
+ const id = applyChange(entities, change.create({ health: 100, mana: 100 }));
38
+ expect([...entities.select("health", "mana")].length).is(1);
39
+ applyChange(entities, change.drop(id, "mana"));
40
+ expect("mana" in entities.require(id)).is(false);
41
+ expect([...entities.select("health", "mana")].length).is(0);
38
42
  }),
39
43
  "select two entities": test(async () => {
40
- const { world } = setupExampleWorld();
41
- world.apply(create({ health: 100 }));
42
- world.apply(create({ health: 100 }));
43
- expect([...world.select("health")].length).is(2);
44
+ const { entities } = setupExample();
45
+ applyChange(entities, change.create({ health: 100 }));
46
+ applyChange(entities, change.create({ health: 100 }));
47
+ expect([...entities.select("health")].length).is(2);
44
48
  }),
45
49
  "select with no component keys selects all": test(async () => {
46
- const { world } = setupExampleWorld();
47
- world.apply(create({ health: 100 }));
48
- world.apply(create({ health: 100 }));
49
- expect([...world.select()].length).is(2);
50
+ const { entities } = setupExample();
51
+ applyChange(entities, change.create({ health: 100 }));
52
+ applyChange(entities, change.create({ health: 100 }));
53
+ expect([...entities.select()].length).is(2);
50
54
  }),
51
55
  "select doesn't include non-match": test(async () => {
52
- const { world } = setupExampleWorld();
53
- world.apply(create({ health: 100 }));
54
- expect([...world.select("mana")].length).is(0);
56
+ const { entities } = setupExample();
57
+ applyChange(entities, change.create({ health: 100 }));
58
+ expect([...entities.select("mana")].length).is(0);
55
59
  }),
56
60
  "select includes entities with extra components": test(async () => {
57
- const { world } = setupExampleWorld();
58
- world.apply(create({ health: 100, mana: 100 }));
59
- expect([...world.select("health")].length).is(1);
61
+ const { entities } = setupExample();
62
+ applyChange(entities, change.create({ health: 100, mana: 100 }));
63
+ expect([...entities.select("health")].length).is(1);
60
64
  }),
61
65
  "wizard regens mana": test(async () => {
62
- const { world, systems } = setupExampleWorld();
63
- const wizardId = world.apply(create({ health: 100, mana: 50, manaRegen: 1 }));
64
- const changes = world.execute(systems);
66
+ const { entities, systems } = setupExample();
67
+ const creating = change.create({ health: 100, mana: 50, manaRegen: 1 });
68
+ const wizardId = creating[1];
69
+ applyChange(entities, creating);
70
+ const changes = executeSystems(entities, systems);
65
71
  expect(changes.length).is(1);
66
- expect(world.require(wizardId).mana).is(51);
72
+ expect(entities.require(wizardId).mana).is(51);
67
73
  }),
68
74
  "death by bleeding": test(async () => {
69
- const { world, systems } = setupExampleWorld();
70
- const wizardId = world.apply(create({ health: 2, bleed: 1 }));
71
- expect(world.require(wizardId).health).is(2);
72
- world.execute(systems);
73
- expect(world.require(wizardId).health).is(1);
74
- world.execute(systems);
75
- expect(world.entities.has(wizardId)).is(false);
75
+ const { entities, systems } = setupExample();
76
+ const creating = change.create({ health: 3, bleed: 2 });
77
+ const wizardId = creating[1];
78
+ applyChange(entities, creating);
79
+ expect(entities.require(wizardId).health).is(3);
80
+ executeSystems(entities, systems);
81
+ expect(entities.require(wizardId).health).is(1);
82
+ executeSystems(entities, systems);
83
+ expect(entities.has(wizardId)).is(false);
76
84
  }),
77
85
  "lifecycles": test(async () => {
78
- const { world } = setupExampleWorld();
86
+ const { entities } = setupExample();
79
87
  const counts = setupLifecycleCounts();
80
- const system = world.lifecycle(["health"], () => {
88
+ const system = lifecycle(entities.readonly(), ["health"], () => {
81
89
  counts.enters++;
82
90
  return {
83
91
  tick: () => void counts.ticks++,
@@ -85,16 +93,18 @@ export default suite({
85
93
  };
86
94
  });
87
95
  counts.expect(0, 0, 0);
88
- const wizardId = world.apply(create({ health: 100, mana: 50 }));
89
- world.execute([system]);
96
+ const creating = change.create({ health: 100, mana: 50 });
97
+ const wizardId = creating[1];
98
+ applyChange(entities, creating);
99
+ executeSystems(entities, [system]);
90
100
  counts.expect(1, 1, 0);
91
- world.apply(update(wizardId, { health: 100, mana: 100 }));
92
- world.execute([system]);
101
+ applyChange(entities, change.merge(wizardId, { health: 100, mana: 100 }));
102
+ executeSystems(entities, [system]);
93
103
  counts.expect(1, 2, 0);
94
- world.apply(del(wizardId));
95
- world.execute([system]);
104
+ applyChange(entities, change.delete(wizardId));
105
+ executeSystems(entities, [system]);
96
106
  counts.expect(1, 2, 1);
97
- expect(world.entities.size).is(0);
107
+ expect(entities.size).is(0);
98
108
  }),
99
109
  });
100
110
  //# sourceMappingURL=test.js.map
package/x/ecs/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../s/ecs/test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../s/ecs/test.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
-
2
- import {makeId} from "./make-id.js"
3
- import {Assign, Components, Delta, Id, Kind, Update} from "../types.js"
4
-
5
- export function create<C extends Components>(components: Partial<C>): Assign {
6
- return [makeId(), Kind.Assign, components]
7
- }
8
-
9
- export function assign<C extends Components>(id: Id, components: undefined | Partial<C>): Assign {
10
- return [id, Kind.Assign, components]
11
- }
12
-
13
- export function del(id: Id): Assign {
14
- return [id, Kind.Assign]
15
- }
16
-
17
- export function update<C extends Components>(id: Id, delta: Delta<C>): Update {
18
- return [id, Kind.Update, delta]
19
- }
20
-
@@ -1,65 +0,0 @@
1
-
2
- import {GMap} from "@e280/stz"
3
- import {Optimizer} from "../utils/optimizer.js"
4
- import {applyChangeToEntities as applyChange} from "../utils/apply-change.js"
5
- import {Change, Components, Entities, Id, LifecycleCallbacks, LifecycleEnter, Select, System} from "../types.js"
6
-
7
- export class World<C extends Components> {
8
- #optimizer
9
-
10
- constructor(public entities: Entities<Partial<C>> = new Map()) {
11
- this.#optimizer = new Optimizer<C>(entities)
12
- }
13
-
14
- require<C2 extends Partial<C> = Partial<C>>(id: Id) {
15
- return GMap.require(this.entities, id) as C2 & Partial<C>
16
- }
17
-
18
- *select<K extends keyof C>(...required: K[]) {
19
- for (const entity of this.#optimizer.obtain(required)) {
20
- const [,components] = entity
21
- if (required.every(r => r in components))
22
- yield entity as [id: Id, components: Select<C, K>]
23
- }
24
- }
25
-
26
- lifecycle<K extends keyof C>(required: K[], enter: LifecycleEnter<C, K>) {
27
- const alive = new GMap<Id, LifecycleCallbacks<C, K>>()
28
- const sel = () => this.select(...required)
29
-
30
- return function*() {
31
- const current = new Map(sel())
32
-
33
- for (const [id, callbacks] of alive) {
34
- if (current.has(id)) continue
35
- alive.delete(id)
36
- callbacks.exit(id)
37
- }
38
-
39
- for (const [id, components] of current) {
40
- const callbacks = alive.guarantee(id, () => enter(id, components))
41
- callbacks.tick(id, components)
42
- }
43
- }
44
- }
45
-
46
- apply(change: Change) {
47
- const [id] = change
48
- const components = applyChange<C>(this.entities, change)
49
- if (components) this.#optimizer.update(id, components)
50
- else this.#optimizer.eliminate(id)
51
- return id
52
- }
53
-
54
- execute(systems: System[]) {
55
- const changes: Change[] = []
56
- for (const system of systems) {
57
- for (const change of system()) {
58
- this.apply(change)
59
- changes.push(change)
60
- }
61
- }
62
- return changes
63
- }
64
- }
65
-