@benev/archimedes 0.1.0-5 → 0.1.0-6
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 +17 -10
- package/package.json +2 -2
- package/s/ecs/index.ts +1 -1
- package/s/ecs/parts/entities.ts +1 -1
- package/s/ecs/parts/execute.ts +29 -0
- package/s/ecs/parts/lifecycle.ts +6 -4
- package/s/ecs/parts/types.ts +3 -5
- package/s/ecs/test/setup-example.ts +22 -18
- package/s/ecs/test/setup-lifecycle-counts.ts +9 -4
- package/s/ecs/test.ts +47 -37
- package/x/ecs/index.d.ts +1 -1
- package/x/ecs/index.js +1 -1
- package/x/ecs/index.js.map +1 -1
- package/x/ecs/parts/entities.d.ts +1 -1
- package/x/ecs/parts/entities.js +1 -1
- package/x/ecs/parts/entities.js.map +1 -1
- package/x/ecs/parts/execute.d.ts +3 -0
- package/x/ecs/parts/execute.js +18 -0
- package/x/ecs/parts/execute.js.map +1 -0
- package/x/ecs/parts/lifecycle.d.ts +3 -2
- package/x/ecs/parts/lifecycle.js +3 -3
- package/x/ecs/parts/lifecycle.js.map +1 -1
- package/x/ecs/parts/types.d.ts +3 -5
- package/x/ecs/parts/types.js +1 -2
- package/x/ecs/parts/types.js.map +1 -1
- package/x/ecs/test/setup-example.d.ts +10 -18
- package/x/ecs/test/setup-example.js +30 -23
- package/x/ecs/test/setup-example.js.map +1 -1
- package/x/ecs/test/setup-lifecycle-counts.d.ts +5 -1
- package/x/ecs/test/setup-lifecycle-counts.js +7 -4
- package/x/ecs/test/setup-lifecycle-counts.js.map +1 -1
- package/x/ecs/test.d.ts +1 -1
- package/x/ecs/test.js +47 -37
- package/x/ecs/test.js.map +1 -1
- package/s/ecs/parts/execute-systems.ts +0 -21
- package/x/ecs/parts/execute-systems.d.ts +0 -3
- package/x/ecs/parts/execute-systems.js +0 -14
- package/x/ecs/parts/execute-systems.js.map +0 -1
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ npm install @benev/archimedes
|
|
|
21
21
|
## 🧩 ecs — entities, components, systems
|
|
22
22
|
|
|
23
23
|
```ts
|
|
24
|
-
import {Entities,
|
|
24
|
+
import {Entities, Change, makeId, makeExecute} from "@benev/archimedes"
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
1. ***define components.*** json-friendly data that entities could have.
|
|
@@ -35,11 +35,15 @@ import {Entities, asSystems, makeId, executeSystems} from "@benev/archimedes"
|
|
|
35
35
|
```ts
|
|
36
36
|
export const entities = new Entities<MyComponents>()
|
|
37
37
|
```
|
|
38
|
-
1. ***
|
|
38
|
+
1. ***readonly entities.*** recommended to use this in your systems.
|
|
39
39
|
```ts
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
export const entitiesReadonly = entities.readonly
|
|
41
|
+
```
|
|
42
|
+
1. ***define systems.*** select entities by components. changes are formalized.
|
|
43
|
+
```ts
|
|
44
|
+
const systems = (change: Change<MyComponents>) => [
|
|
45
|
+
function bleeding() {
|
|
46
|
+
for (const [id, components] of entitiesReadonly.select("health", "bleed")) {
|
|
43
47
|
if (components.bleed > 0) {
|
|
44
48
|
const health = components.health - components.bleed
|
|
45
49
|
change.merge(id, {health})
|
|
@@ -47,13 +51,13 @@ import {Entities, asSystems, makeId, executeSystems} from "@benev/archimedes"
|
|
|
47
51
|
}
|
|
48
52
|
},
|
|
49
53
|
|
|
50
|
-
function death(
|
|
51
|
-
for (const [id, components] of
|
|
54
|
+
function death() {
|
|
55
|
+
for (const [id, components] of entitiesReadonly.select("health")) {
|
|
52
56
|
if (components.health <= 0)
|
|
53
57
|
change.delete(id)
|
|
54
58
|
}
|
|
55
59
|
},
|
|
56
|
-
|
|
60
|
+
]
|
|
57
61
|
```
|
|
58
62
|
1. ***manually insert your first entity.***
|
|
59
63
|
```ts
|
|
@@ -63,9 +67,12 @@ import {Entities, asSystems, makeId, executeSystems} from "@benev/archimedes"
|
|
|
63
67
|
console.log(entities.get(wizardId)?.health)
|
|
64
68
|
// 100
|
|
65
69
|
```
|
|
66
|
-
1. ***execute
|
|
70
|
+
1. ***create an execute fn.*** run one tick at a time.
|
|
67
71
|
```ts
|
|
68
|
-
|
|
72
|
+
const execute = makeExecute(entities, systems)
|
|
73
|
+
|
|
74
|
+
// simulate one tick
|
|
75
|
+
execute()
|
|
69
76
|
|
|
70
77
|
console.log(entities.get(wizardId)?.health)
|
|
71
78
|
// 98
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@benev/archimedes",
|
|
3
|
-
"version": "0.1.0-
|
|
3
|
+
"version": "0.1.0-6",
|
|
4
4
|
"description": "game ecs with auto networking",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@e280/renraku": "^0.5.7",
|
|
20
|
-
"@e280/stz": "^0.2.
|
|
20
|
+
"@e280/stz": "^0.2.30",
|
|
21
21
|
"@msgpack/msgpack": "^3.1.3",
|
|
22
22
|
"sparrow-rtc": "^0.2.15"
|
|
23
23
|
},
|
package/s/ecs/index.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
export * from "./parts/apply-delta.js"
|
|
3
3
|
export * from "./parts/change.js"
|
|
4
4
|
export * from "./parts/entities.js"
|
|
5
|
-
export * from "./parts/execute
|
|
5
|
+
export * from "./parts/execute.js"
|
|
6
6
|
export * from "./parts/lifecycle.js"
|
|
7
7
|
export * from "./parts/make-id.js"
|
|
8
8
|
export * from "./parts/types.js"
|
package/s/ecs/parts/entities.ts
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
|
|
2
|
+
import {Change} from "./change.js"
|
|
3
|
+
import {Entities} from "./entities.js"
|
|
4
|
+
import {applyDelta} from "./apply-delta.js"
|
|
5
|
+
import {Delta, Components, Systems} from "./types.js"
|
|
6
|
+
|
|
7
|
+
export function makeExecute<C extends Components>(
|
|
8
|
+
entities: Entities<C>,
|
|
9
|
+
systems: Systems<C>,
|
|
10
|
+
) {
|
|
11
|
+
|
|
12
|
+
let deltas: Delta<C>[] = []
|
|
13
|
+
|
|
14
|
+
const change = new Change<C>(delta => {
|
|
15
|
+
applyDelta(entities, delta)
|
|
16
|
+
deltas.push(delta)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const fns = systems(change)
|
|
20
|
+
|
|
21
|
+
return () => {
|
|
22
|
+
for (const fn of fns)
|
|
23
|
+
fn()
|
|
24
|
+
const ret = deltas
|
|
25
|
+
deltas = []
|
|
26
|
+
return ret
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
package/s/ecs/parts/lifecycle.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
|
|
2
2
|
import {GMap} from "@e280/stz"
|
|
3
|
-
import {
|
|
3
|
+
import {EntitiesReadonly} from "./entities.js"
|
|
4
|
+
import {Components, Id, LifecycleCallbacks, LifecycleEnter} from "./types.js"
|
|
4
5
|
|
|
5
6
|
export function lifecycle<C extends Components, K extends keyof C>(
|
|
7
|
+
entities: EntitiesReadonly<C>,
|
|
6
8
|
componentKeys: K[],
|
|
7
9
|
enter: LifecycleEnter<C, K>
|
|
8
|
-
)
|
|
10
|
+
) {
|
|
9
11
|
|
|
10
12
|
const alive = new GMap<Id, LifecycleCallbacks<C, K>>()
|
|
11
13
|
|
|
12
|
-
return (
|
|
14
|
+
return () => {
|
|
13
15
|
|
|
14
16
|
// add fresh entities
|
|
15
17
|
for (const [id, components] of entities.select(...componentKeys)) {
|
|
16
|
-
const callbacks = alive.guarantee(id, () => enter(id, components
|
|
18
|
+
const callbacks = alive.guarantee(id, () => enter(id, components))
|
|
17
19
|
callbacks.tick(id, components)
|
|
18
20
|
}
|
|
19
21
|
|
package/s/ecs/parts/types.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
|
|
2
2
|
import {Change} from "./change.js"
|
|
3
|
-
import {EntitiesReadonly} from "./entities.js"
|
|
4
3
|
|
|
5
4
|
export type Id = string
|
|
6
5
|
export type Components = Record<string, unknown>
|
|
@@ -13,9 +12,8 @@ export type DeltaMerge<C extends Components> = [kind: DeltaKind.Merge, id: Id, p
|
|
|
13
12
|
export type DeltaDrop<C extends Components> = [kind: DeltaKind.Drop, id: Id, keys: (keyof C)[]]
|
|
14
13
|
export type Delta<C extends Components> = DeltaSet<C> | DeltaMerge<C> | DeltaDrop<C>
|
|
15
14
|
|
|
16
|
-
export type
|
|
17
|
-
export const
|
|
18
|
-
export const asSystems = <C extends Components>(...systems: System<C>[]) => systems
|
|
15
|
+
export type Systems<C extends Components> = (change: Change<C>) => (() => void)[]
|
|
16
|
+
export const asSystems = <C extends Components>(systems: Systems<C>) => systems
|
|
19
17
|
|
|
20
18
|
export type LifecycleCallbacks<C extends Components, K extends keyof C> = {
|
|
21
19
|
tick: (id: Id, components: Select<C, K>) => void
|
|
@@ -23,6 +21,6 @@ export type LifecycleCallbacks<C extends Components, K extends keyof C> = {
|
|
|
23
21
|
}
|
|
24
22
|
|
|
25
23
|
export type LifecycleEnter<C extends Components, K extends keyof C> = (
|
|
26
|
-
(id: Id, components: Select<C, K
|
|
24
|
+
(id: Id, components: Select<C, K>) => LifecycleCallbacks<C, K>
|
|
27
25
|
)
|
|
28
26
|
|
|
@@ -2,19 +2,23 @@
|
|
|
2
2
|
import {Change} from "../parts/change.js"
|
|
3
3
|
import {asSystems} from "../parts/types.js"
|
|
4
4
|
import {Entities} from "../parts/entities.js"
|
|
5
|
+
import {makeExecute} from "../parts/execute.js"
|
|
5
6
|
import {applyDelta} from "../parts/apply-delta.js"
|
|
6
7
|
|
|
8
|
+
export type ExampleComponents = {
|
|
9
|
+
health: number
|
|
10
|
+
bleed: number
|
|
11
|
+
mana: number
|
|
12
|
+
manaRegen: number
|
|
13
|
+
}
|
|
14
|
+
|
|
7
15
|
export function setupExample() {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
manaRegen
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const systems = asSystems<MyComponents>(
|
|
16
|
-
function manaRegen(entities, change) {
|
|
17
|
-
for (const [id, components] of entities.select("mana", "manaRegen")) {
|
|
16
|
+
const entities = new Entities<ExampleComponents>()
|
|
17
|
+
const rentities = entities.readonly
|
|
18
|
+
|
|
19
|
+
const systems = asSystems<ExampleComponents>(change => [
|
|
20
|
+
function manaRegen() {
|
|
21
|
+
for (const [id, components] of rentities.select("mana", "manaRegen")) {
|
|
18
22
|
if (components.manaRegen !== 0) {
|
|
19
23
|
const mana = components.mana + components.manaRegen
|
|
20
24
|
change.merge(id, {mana})
|
|
@@ -22,8 +26,8 @@ export function setupExample() {
|
|
|
22
26
|
}
|
|
23
27
|
},
|
|
24
28
|
|
|
25
|
-
function bleeding(
|
|
26
|
-
for (const [id, components] of
|
|
29
|
+
function bleeding() {
|
|
30
|
+
for (const [id, components] of rentities.select("health", "bleed")) {
|
|
27
31
|
if (components.bleed >= 0) {
|
|
28
32
|
const health = components.health - components.bleed
|
|
29
33
|
const bleed = components.bleed - 1
|
|
@@ -34,17 +38,17 @@ export function setupExample() {
|
|
|
34
38
|
}
|
|
35
39
|
},
|
|
36
40
|
|
|
37
|
-
function death(
|
|
38
|
-
for (const [id, components] of
|
|
41
|
+
function death() {
|
|
42
|
+
for (const [id, components] of rentities.select("health")) {
|
|
39
43
|
if (components.health <= 0)
|
|
40
44
|
change.delete(id)
|
|
41
45
|
}
|
|
42
46
|
},
|
|
43
|
-
)
|
|
47
|
+
])
|
|
44
48
|
|
|
45
|
-
const
|
|
46
|
-
const
|
|
49
|
+
const change = new Change<ExampleComponents>(delta => applyDelta(entities, delta))
|
|
50
|
+
const execute = makeExecute(entities, systems)
|
|
47
51
|
|
|
48
|
-
return {systems, entities, change}
|
|
52
|
+
return {systems, entities, change, execute}
|
|
49
53
|
}
|
|
50
54
|
|
|
@@ -6,10 +6,15 @@ export function setupLifecycleCounts() {
|
|
|
6
6
|
enters: 0,
|
|
7
7
|
ticks: 0,
|
|
8
8
|
exits: 0,
|
|
9
|
-
expect: (enters: number, ticks: number, exits: number) => {
|
|
10
|
-
expect(counts.enters
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
expect: (e: {enters: number, ticks: number, exits: number}) => {
|
|
10
|
+
expect(counts.enters, `enters, expected ${e.enters}, got ${counts.enters}`)
|
|
11
|
+
.is(e.enters)
|
|
12
|
+
|
|
13
|
+
expect(counts.ticks, `ticks, expected ${e.ticks}, got ${counts.ticks}`)
|
|
14
|
+
.is(e.ticks)
|
|
15
|
+
|
|
16
|
+
expect(counts.exits, `exits, expected ${e.exits}, got ${counts.exits}`)
|
|
17
|
+
.is(e.exits)
|
|
13
18
|
},
|
|
14
19
|
}
|
|
15
20
|
return counts
|
package/s/ecs/test.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
|
|
2
2
|
import {suite, test, expect} from "@e280/science"
|
|
3
|
+
import {asSystems} from "./parts/types.js"
|
|
3
4
|
import {lifecycle} from "./parts/lifecycle.js"
|
|
4
|
-
import {
|
|
5
|
-
import {executeSystems} from "./parts/execute-systems.js"
|
|
5
|
+
import {makeExecute} from "./parts/execute.js"
|
|
6
6
|
import {setupLifecycleCounts} from "./test/setup-lifecycle-counts.js"
|
|
7
|
+
import {ExampleComponents, setupExample} from "./test/setup-example.js"
|
|
7
8
|
|
|
8
9
|
export default suite({
|
|
9
10
|
"create an entity": test(async() => {
|
|
@@ -92,76 +93,85 @@ export default suite({
|
|
|
92
93
|
}),
|
|
93
94
|
|
|
94
95
|
"wizard regens mana": test(async() => {
|
|
95
|
-
const {entities, change,
|
|
96
|
+
const {entities, change, execute} = setupExample()
|
|
96
97
|
const wizardId = change.create({health: 100, mana: 50, manaRegen: 1})
|
|
97
|
-
const changes =
|
|
98
|
+
const changes = execute()
|
|
98
99
|
expect(changes.length).is(1)
|
|
99
100
|
expect(entities.require(wizardId).mana).is(51)
|
|
100
101
|
}),
|
|
101
102
|
|
|
102
103
|
"death by bleeding": test(async() => {
|
|
103
|
-
const {entities, change,
|
|
104
|
+
const {entities, change, execute} = setupExample()
|
|
104
105
|
const wizardId = change.create({health: 3, bleed: 2})
|
|
105
106
|
expect(entities.require(wizardId).health).is(3)
|
|
106
|
-
|
|
107
|
+
execute()
|
|
107
108
|
expect(entities.require(wizardId).health).is(1)
|
|
108
|
-
|
|
109
|
+
execute()
|
|
109
110
|
expect(entities.has(wizardId)).is(false)
|
|
110
111
|
}),
|
|
111
112
|
|
|
112
113
|
"lifecycles": test(async() => {
|
|
113
114
|
const {entities, change} = setupExample()
|
|
114
115
|
const counts = setupLifecycleCounts()
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
116
|
+
const systems = asSystems<ExampleComponents>(() => [
|
|
117
|
+
lifecycle(entities.readonly, ["health"], () => {
|
|
118
|
+
counts.enters++
|
|
119
|
+
return {
|
|
120
|
+
tick: () => void counts.ticks++,
|
|
121
|
+
exit: () => void counts.exits++,
|
|
122
|
+
}
|
|
123
|
+
}),
|
|
124
|
+
])
|
|
125
|
+
const execute = makeExecute(entities, systems)
|
|
126
|
+
counts.expect({enters: 0, ticks: 0, exits: 0})
|
|
123
127
|
|
|
124
128
|
const wizardId = change.create({health: 100, mana: 50})
|
|
125
|
-
|
|
126
|
-
counts.expect(1, 1, 0)
|
|
129
|
+
execute()
|
|
130
|
+
counts.expect({enters: 1, ticks: 1, exits: 0})
|
|
127
131
|
|
|
128
132
|
change.merge(wizardId, {health: 100, mana: 100})
|
|
129
|
-
|
|
130
|
-
counts.expect(1, 2, 0)
|
|
133
|
+
execute()
|
|
134
|
+
counts.expect({enters: 1, ticks: 2, exits: 0})
|
|
131
135
|
|
|
132
136
|
change.delete(wizardId)
|
|
133
|
-
|
|
134
|
-
counts.expect(1, 2, 1)
|
|
137
|
+
execute()
|
|
138
|
+
counts.expect({enters: 1, ticks: 2, exits: 1})
|
|
135
139
|
expect(entities.size).is(0)
|
|
136
140
|
}),
|
|
137
141
|
|
|
138
|
-
"lifecycle can commit": test(async() => {
|
|
142
|
+
"lifecycle can commit changes": test(async() => {
|
|
139
143
|
const {entities, change} = setupExample()
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
144
|
+
const systems = asSystems<ExampleComponents>(change => [
|
|
145
|
+
lifecycle(entities.readonly, ["health"], () => {
|
|
146
|
+
change.create({mana: 50})
|
|
147
|
+
return {
|
|
148
|
+
tick: () => {},
|
|
149
|
+
exit: () => {},
|
|
150
|
+
}
|
|
151
|
+
}),
|
|
152
|
+
])
|
|
153
|
+
const execute = makeExecute(entities, systems)
|
|
147
154
|
change.create({health: 100})
|
|
148
|
-
|
|
155
|
+
execute()
|
|
149
156
|
expect([...entities.select("mana")].length).is(1)
|
|
150
157
|
}),
|
|
151
158
|
|
|
152
159
|
"lifecycle self-deletion immediate cleanup": test(async() => {
|
|
153
160
|
const {entities, change} = setupExample()
|
|
154
161
|
let ranExit = 0
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
162
|
+
const systems = asSystems<ExampleComponents>(change => [
|
|
163
|
+
lifecycle(entities.readonly, ["health"], (id) => {
|
|
164
|
+
return {
|
|
165
|
+
tick: () => change.delete(id),
|
|
166
|
+
exit: () => { ranExit++ },
|
|
167
|
+
}
|
|
168
|
+
}),
|
|
169
|
+
])
|
|
170
|
+
const execute = makeExecute(entities, systems)
|
|
161
171
|
change.create({health: 100})
|
|
162
172
|
expect([...entities.select("health")].length).is(1)
|
|
163
173
|
expect(ranExit).is(0)
|
|
164
|
-
|
|
174
|
+
execute()
|
|
165
175
|
expect(ranExit).is(1)
|
|
166
176
|
expect([...entities.select("health")].length).is(0)
|
|
167
177
|
}),
|
package/x/ecs/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from "./parts/apply-delta.js";
|
|
2
2
|
export * from "./parts/change.js";
|
|
3
3
|
export * from "./parts/entities.js";
|
|
4
|
-
export * from "./parts/execute
|
|
4
|
+
export * from "./parts/execute.js";
|
|
5
5
|
export * from "./parts/lifecycle.js";
|
|
6
6
|
export * from "./parts/make-id.js";
|
|
7
7
|
export * from "./parts/types.js";
|
package/x/ecs/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from "./parts/apply-delta.js";
|
|
2
2
|
export * from "./parts/change.js";
|
|
3
3
|
export * from "./parts/entities.js";
|
|
4
|
-
export * from "./parts/execute
|
|
4
|
+
export * from "./parts/execute.js";
|
|
5
5
|
export * from "./parts/lifecycle.js";
|
|
6
6
|
export * from "./parts/make-id.js";
|
|
7
7
|
export * from "./parts/types.js";
|
package/x/ecs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/ecs/index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/ecs/index.ts"],"names":[],"mappings":"AACA,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA"}
|
|
@@ -6,6 +6,6 @@ export declare class Entities<C extends Components> extends GMap<Id, Partial<C>>
|
|
|
6
6
|
delete(id: Id): boolean;
|
|
7
7
|
clear(): void;
|
|
8
8
|
select<K extends keyof C>(...componentKeys: K[]): Iterable<[Id, Select<C, K>]>;
|
|
9
|
-
readonly(): EntitiesReadonly<C>;
|
|
9
|
+
get readonly(): EntitiesReadonly<C>;
|
|
10
10
|
}
|
|
11
11
|
export type EntitiesReadonly<C extends Components> = Pick<Entities<Readonly<C>>, ("has" | "get" | "require" | "keys" | "values" | "entries" | "select" | typeof Symbol.iterator)>;
|
package/x/ecs/parts/entities.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../s/ecs/parts/entities.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAG9B,MAAM,OAAO,QAA+B,SAAQ,IAAoB;IACvE,MAAM,GAAG,IAAI,IAAI,EAAsC,CAAA;IAEvD,GAAG,CAAC,EAAM,EAAE,UAAsB;QACjC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3C,IAAI,oBAAoB,CAAC,UAAU,EAAE,GAAG,CAAC;gBACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;;gBAE5B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACrB,CAAC;QACD,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,CAAC,EAAM;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,SAAS;YACb,OAAO,KAAK,CAAA;QAEb,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAEpB,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,KAAK;QACJ,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC1C,QAAQ,CAAC,KAAK,EAAE,CAAA;IAClB,CAAC;IAED,CAAC,MAAM,CAAoB,GAAG,aAAkB;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QAC5C,IAAI,MAAM;YACT,KAAK,CAAC,CAAC,MAAM,CAAA;;YAEb,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;IACvC,CAAC;IAED,QAAQ;
|
|
1
|
+
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../s/ecs/parts/entities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Change } from "./change.js";
|
|
2
|
+
import { applyDelta } from "./apply-delta.js";
|
|
3
|
+
export function makeExecute(entities, systems) {
|
|
4
|
+
let deltas = [];
|
|
5
|
+
const change = new Change(delta => {
|
|
6
|
+
applyDelta(entities, delta);
|
|
7
|
+
deltas.push(delta);
|
|
8
|
+
});
|
|
9
|
+
const fns = systems(change);
|
|
10
|
+
return () => {
|
|
11
|
+
for (const fn of fns)
|
|
12
|
+
fn();
|
|
13
|
+
const ret = deltas;
|
|
14
|
+
deltas = [];
|
|
15
|
+
return ret;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../s/ecs/parts/execute.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAElC,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAG3C,MAAM,UAAU,WAAW,CACzB,QAAqB,EACrB,OAAmB;IAGpB,IAAI,MAAM,GAAe,EAAE,CAAA;IAE3B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAI,KAAK,CAAC,EAAE;QACpC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAE3B,OAAO,GAAG,EAAE;QACX,KAAK,MAAM,EAAE,IAAI,GAAG;YACnB,EAAE,EAAE,CAAA;QACL,MAAM,GAAG,GAAG,MAAM,CAAA;QAClB,MAAM,GAAG,EAAE,CAAA;QACX,OAAO,GAAG,CAAA;IACX,CAAC,CAAA;AACF,CAAC"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
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>): () => void;
|
package/x/ecs/parts/lifecycle.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { GMap } from "@e280/stz";
|
|
2
|
-
export function lifecycle(componentKeys, enter) {
|
|
2
|
+
export function lifecycle(entities, componentKeys, enter) {
|
|
3
3
|
const alive = new GMap();
|
|
4
|
-
return (
|
|
4
|
+
return () => {
|
|
5
5
|
// add fresh entities
|
|
6
6
|
for (const [id, components] of entities.select(...componentKeys)) {
|
|
7
|
-
const callbacks = alive.guarantee(id, () => enter(id, components
|
|
7
|
+
const callbacks = alive.guarantee(id, () => enter(id, components));
|
|
8
8
|
callbacks.tick(id, components);
|
|
9
9
|
}
|
|
10
10
|
// delete stale entities
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../s/ecs/parts/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;
|
|
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;IAEtD,OAAO,GAAG,EAAE;QAEX,qBAAqB;QACrB,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC;YAClE,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;QAED,wBAAwB;QACxB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACpF,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAQ;YAChC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YAChB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACnB,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
|
package/x/ecs/parts/types.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Change } from "./change.js";
|
|
2
|
-
import { EntitiesReadonly } from "./entities.js";
|
|
3
2
|
export type Id = string;
|
|
4
3
|
export type Components = Record<string, unknown>;
|
|
5
4
|
export type AsComponents<C extends Components> = C;
|
|
@@ -13,11 +12,10 @@ export type DeltaSet<C extends Components> = [kind: DeltaKind.Set, id: Id, compo
|
|
|
13
12
|
export type DeltaMerge<C extends Components> = [kind: DeltaKind.Merge, id: Id, patch: Partial<C>];
|
|
14
13
|
export type DeltaDrop<C extends Components> = [kind: DeltaKind.Drop, id: Id, keys: (keyof C)[]];
|
|
15
14
|
export type Delta<C extends Components> = DeltaSet<C> | DeltaMerge<C> | DeltaDrop<C>;
|
|
16
|
-
export type
|
|
17
|
-
export declare const
|
|
18
|
-
export declare const asSystems: <C extends Components>(...systems: System<C>[]) => System<C>[];
|
|
15
|
+
export type Systems<C extends Components> = (change: Change<C>) => (() => void)[];
|
|
16
|
+
export declare const asSystems: <C extends Components>(systems: Systems<C>) => Systems<C>;
|
|
19
17
|
export type LifecycleCallbacks<C extends Components, K extends keyof C> = {
|
|
20
18
|
tick: (id: Id, components: Select<C, K>) => void;
|
|
21
19
|
exit: (id: Id) => void;
|
|
22
20
|
};
|
|
23
|
-
export type LifecycleEnter<C extends Components, K extends keyof C> = ((id: Id, components: Select<C, K
|
|
21
|
+
export type LifecycleEnter<C extends Components, K extends keyof C> = ((id: Id, components: Select<C, K>) => LifecycleCallbacks<C, K>);
|
package/x/ecs/parts/types.js
CHANGED
|
@@ -4,6 +4,5 @@ export var DeltaKind;
|
|
|
4
4
|
DeltaKind[DeltaKind["Merge"] = 1] = "Merge";
|
|
5
5
|
DeltaKind[DeltaKind["Drop"] = 2] = "Drop";
|
|
6
6
|
})(DeltaKind || (DeltaKind = {}));
|
|
7
|
-
export const
|
|
8
|
-
export const asSystems = (...systems) => systems;
|
|
7
|
+
export const asSystems = (systems) => systems;
|
|
9
8
|
//# sourceMappingURL=types.js.map
|
package/x/ecs/parts/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../s/ecs/parts/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../s/ecs/parts/types.ts"],"names":[],"mappings":"AAQA,MAAM,CAAN,IAAY,SAA4B;AAAxC,WAAY,SAAS;IAAE,uCAAG,CAAA;IAAE,2CAAK,CAAA;IAAE,yCAAI,CAAA;AAAA,CAAC,EAA5B,SAAS,KAAT,SAAS,QAAmB;AAOxC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAuB,OAAmB,EAAE,EAAE,CAAC,OAAO,CAAA"}
|
|
@@ -1,22 +1,14 @@
|
|
|
1
1
|
import { Change } from "../parts/change.js";
|
|
2
2
|
import { Entities } from "../parts/entities.js";
|
|
3
|
+
export type ExampleComponents = {
|
|
4
|
+
health: number;
|
|
5
|
+
bleed: number;
|
|
6
|
+
mana: number;
|
|
7
|
+
manaRegen: number;
|
|
8
|
+
};
|
|
3
9
|
export declare function setupExample(): {
|
|
4
|
-
systems: import("../parts/types.js").
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
manaRegen: number;
|
|
9
|
-
}>[];
|
|
10
|
-
entities: Entities<{
|
|
11
|
-
health: number;
|
|
12
|
-
bleed: number;
|
|
13
|
-
mana: number;
|
|
14
|
-
manaRegen: number;
|
|
15
|
-
}>;
|
|
16
|
-
change: Change<{
|
|
17
|
-
health: number;
|
|
18
|
-
bleed: number;
|
|
19
|
-
mana: number;
|
|
20
|
-
manaRegen: number;
|
|
21
|
-
}>;
|
|
10
|
+
systems: import("../parts/types.js").Systems<ExampleComponents>;
|
|
11
|
+
entities: Entities<ExampleComponents>;
|
|
12
|
+
change: Change<ExampleComponents>;
|
|
13
|
+
execute: () => import("../parts/types.js").Delta<ExampleComponents>[];
|
|
22
14
|
};
|
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
import { Change } from "../parts/change.js";
|
|
2
2
|
import { asSystems } from "../parts/types.js";
|
|
3
3
|
import { Entities } from "../parts/entities.js";
|
|
4
|
+
import { makeExecute } from "../parts/execute.js";
|
|
4
5
|
import { applyDelta } from "../parts/apply-delta.js";
|
|
5
6
|
export function setupExample() {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
const entities = new Entities();
|
|
8
|
+
const rentities = entities.readonly;
|
|
9
|
+
const systems = asSystems(change => [
|
|
10
|
+
function manaRegen() {
|
|
11
|
+
for (const [id, components] of rentities.select("mana", "manaRegen")) {
|
|
12
|
+
if (components.manaRegen !== 0) {
|
|
13
|
+
const mana = components.mana + components.manaRegen;
|
|
14
|
+
change.merge(id, { mana });
|
|
15
|
+
}
|
|
11
16
|
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
},
|
|
18
|
+
function bleeding() {
|
|
19
|
+
for (const [id, components] of rentities.select("health", "bleed")) {
|
|
20
|
+
if (components.bleed >= 0) {
|
|
21
|
+
const health = components.health - components.bleed;
|
|
22
|
+
const bleed = components.bleed - 1;
|
|
23
|
+
change.merge(id, { health, bleed });
|
|
24
|
+
}
|
|
25
|
+
if (components.bleed <= 0)
|
|
26
|
+
change.drop(id, "bleed");
|
|
19
27
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
});
|
|
29
|
-
const entities = new Entities();
|
|
28
|
+
},
|
|
29
|
+
function death() {
|
|
30
|
+
for (const [id, components] of rentities.select("health")) {
|
|
31
|
+
if (components.health <= 0)
|
|
32
|
+
change.delete(id);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
]);
|
|
30
36
|
const change = new Change(delta => applyDelta(entities, delta));
|
|
31
|
-
|
|
37
|
+
const execute = makeExecute(entities, systems);
|
|
38
|
+
return { systems, entities, change, execute };
|
|
32
39
|
}
|
|
33
40
|
//# sourceMappingURL=setup-example.js.map
|
|
@@ -1 +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;AAC7C,OAAO,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAA;
|
|
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;AAC7C,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAA;AASlD,MAAM,UAAU,YAAY;IAC3B,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAqB,CAAA;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAA;IAEnC,MAAM,OAAO,GAAG,SAAS,CAAoB,MAAM,CAAC,EAAE,CAAC;QACtD,SAAS,SAAS;YACjB,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;gBACtE,IAAI,UAAU,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;oBAChC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAA;oBACnD,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,IAAI,EAAC,CAAC,CAAA;gBACzB,CAAC;YACF,CAAC;QACF,CAAC;QAED,SAAS,QAAQ;YAChB,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBACpE,IAAI,UAAU,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;oBAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,KAAK,CAAA;oBACnD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAA;oBAClC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC,CAAA;gBAClC,CAAC;gBACD,IAAI,UAAU,CAAC,KAAK,IAAI,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YAC1B,CAAC;QACF,CAAC;QAED,SAAS,KAAK;YACb,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3D,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;oBACzB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACnB,CAAC;QACF,CAAC;KACD,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAoB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;IAClF,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAE9C,OAAO,EAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAC,CAAA;AAC5C,CAAC"}
|
|
@@ -4,10 +4,13 @@ export function setupLifecycleCounts() {
|
|
|
4
4
|
enters: 0,
|
|
5
5
|
ticks: 0,
|
|
6
6
|
exits: 0,
|
|
7
|
-
expect: (
|
|
8
|
-
expect(counts.enters
|
|
9
|
-
|
|
10
|
-
expect(counts.
|
|
7
|
+
expect: (e) => {
|
|
8
|
+
expect(counts.enters, `enters, expected ${e.enters}, got ${counts.enters}`)
|
|
9
|
+
.is(e.enters);
|
|
10
|
+
expect(counts.ticks, `ticks, expected ${e.ticks}, got ${counts.ticks}`)
|
|
11
|
+
.is(e.ticks);
|
|
12
|
+
expect(counts.exits, `exits, expected ${e.exits}, got ${counts.exits}`)
|
|
13
|
+
.is(e.exits);
|
|
11
14
|
},
|
|
12
15
|
};
|
|
13
16
|
return counts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-lifecycle-counts.js","sourceRoot":"","sources":["../../../s/ecs/test/setup-lifecycle-counts.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAA;AAEpC,MAAM,UAAU,oBAAoB;IACnC,MAAM,MAAM,GAAG;QACd,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"setup-lifecycle-counts.js","sourceRoot":"","sources":["../../../s/ecs/test/setup-lifecycle-counts.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAA;AAEpC,MAAM,UAAU,oBAAoB;IACnC,MAAM,MAAM,GAAG;QACd,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC,CAAiD,EAAE,EAAE;YAC7D,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC;iBACzE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;YAEd,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,KAAK,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC;iBACrE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YAEb,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,KAAK,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC;iBACrE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QACd,CAAC;KACD,CAAA;IACD,OAAO,MAAM,CAAA;AACd,CAAC"}
|
package/x/ecs/test.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ declare const _default: {
|
|
|
13
13
|
"wizard regens mana": import("@e280/science").Test;
|
|
14
14
|
"death by bleeding": import("@e280/science").Test;
|
|
15
15
|
lifecycles: import("@e280/science").Test;
|
|
16
|
-
"lifecycle can commit": import("@e280/science").Test;
|
|
16
|
+
"lifecycle can commit changes": import("@e280/science").Test;
|
|
17
17
|
"lifecycle self-deletion immediate cleanup": import("@e280/science").Test;
|
|
18
18
|
};
|
|
19
19
|
export default _default;
|
package/x/ecs/test.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { suite, test, expect } from "@e280/science";
|
|
2
|
+
import { asSystems } from "./parts/types.js";
|
|
2
3
|
import { lifecycle } from "./parts/lifecycle.js";
|
|
3
|
-
import {
|
|
4
|
-
import { executeSystems } from "./parts/execute-systems.js";
|
|
4
|
+
import { makeExecute } from "./parts/execute.js";
|
|
5
5
|
import { setupLifecycleCounts } from "./test/setup-lifecycle-counts.js";
|
|
6
|
+
import { setupExample } from "./test/setup-example.js";
|
|
6
7
|
export default suite({
|
|
7
8
|
"create an entity": test(async () => {
|
|
8
9
|
const { entities, change } = setupExample();
|
|
@@ -79,69 +80,78 @@ export default suite({
|
|
|
79
80
|
expect([...entities.select("health")].length).is(1);
|
|
80
81
|
}),
|
|
81
82
|
"wizard regens mana": test(async () => {
|
|
82
|
-
const { entities, change,
|
|
83
|
+
const { entities, change, execute } = setupExample();
|
|
83
84
|
const wizardId = change.create({ health: 100, mana: 50, manaRegen: 1 });
|
|
84
|
-
const changes =
|
|
85
|
+
const changes = execute();
|
|
85
86
|
expect(changes.length).is(1);
|
|
86
87
|
expect(entities.require(wizardId).mana).is(51);
|
|
87
88
|
}),
|
|
88
89
|
"death by bleeding": test(async () => {
|
|
89
|
-
const { entities, change,
|
|
90
|
+
const { entities, change, execute } = setupExample();
|
|
90
91
|
const wizardId = change.create({ health: 3, bleed: 2 });
|
|
91
92
|
expect(entities.require(wizardId).health).is(3);
|
|
92
|
-
|
|
93
|
+
execute();
|
|
93
94
|
expect(entities.require(wizardId).health).is(1);
|
|
94
|
-
|
|
95
|
+
execute();
|
|
95
96
|
expect(entities.has(wizardId)).is(false);
|
|
96
97
|
}),
|
|
97
98
|
"lifecycles": test(async () => {
|
|
98
99
|
const { entities, change } = setupExample();
|
|
99
100
|
const counts = setupLifecycleCounts();
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
101
|
+
const systems = asSystems(() => [
|
|
102
|
+
lifecycle(entities.readonly, ["health"], () => {
|
|
103
|
+
counts.enters++;
|
|
104
|
+
return {
|
|
105
|
+
tick: () => void counts.ticks++,
|
|
106
|
+
exit: () => void counts.exits++,
|
|
107
|
+
};
|
|
108
|
+
}),
|
|
109
|
+
]);
|
|
110
|
+
const execute = makeExecute(entities, systems);
|
|
111
|
+
counts.expect({ enters: 0, ticks: 0, exits: 0 });
|
|
108
112
|
const wizardId = change.create({ health: 100, mana: 50 });
|
|
109
|
-
|
|
110
|
-
counts.expect(1, 1, 0);
|
|
113
|
+
execute();
|
|
114
|
+
counts.expect({ enters: 1, ticks: 1, exits: 0 });
|
|
111
115
|
change.merge(wizardId, { health: 100, mana: 100 });
|
|
112
|
-
|
|
113
|
-
counts.expect(1, 2, 0);
|
|
116
|
+
execute();
|
|
117
|
+
counts.expect({ enters: 1, ticks: 2, exits: 0 });
|
|
114
118
|
change.delete(wizardId);
|
|
115
|
-
|
|
116
|
-
counts.expect(1, 2, 1);
|
|
119
|
+
execute();
|
|
120
|
+
counts.expect({ enters: 1, ticks: 2, exits: 1 });
|
|
117
121
|
expect(entities.size).is(0);
|
|
118
122
|
}),
|
|
119
|
-
"lifecycle can commit": test(async () => {
|
|
123
|
+
"lifecycle can commit changes": test(async () => {
|
|
120
124
|
const { entities, change } = setupExample();
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
const systems = asSystems(change => [
|
|
126
|
+
lifecycle(entities.readonly, ["health"], () => {
|
|
127
|
+
change.create({ mana: 50 });
|
|
128
|
+
return {
|
|
129
|
+
tick: () => { },
|
|
130
|
+
exit: () => { },
|
|
131
|
+
};
|
|
132
|
+
}),
|
|
133
|
+
]);
|
|
134
|
+
const execute = makeExecute(entities, systems);
|
|
128
135
|
change.create({ health: 100 });
|
|
129
|
-
|
|
136
|
+
execute();
|
|
130
137
|
expect([...entities.select("mana")].length).is(1);
|
|
131
138
|
}),
|
|
132
139
|
"lifecycle self-deletion immediate cleanup": test(async () => {
|
|
133
140
|
const { entities, change } = setupExample();
|
|
134
141
|
let ranExit = 0;
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
142
|
+
const systems = asSystems(change => [
|
|
143
|
+
lifecycle(entities.readonly, ["health"], (id) => {
|
|
144
|
+
return {
|
|
145
|
+
tick: () => change.delete(id),
|
|
146
|
+
exit: () => { ranExit++; },
|
|
147
|
+
};
|
|
148
|
+
}),
|
|
149
|
+
]);
|
|
150
|
+
const execute = makeExecute(entities, systems);
|
|
141
151
|
change.create({ health: 100 });
|
|
142
152
|
expect([...entities.select("health")].length).is(1);
|
|
143
153
|
expect(ranExit).is(0);
|
|
144
|
-
|
|
154
|
+
execute();
|
|
145
155
|
expect(ranExit).is(1);
|
|
146
156
|
expect([...entities.select("health")].length).is(0);
|
|
147
157
|
}),
|
package/x/ecs/test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../s/ecs/test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAC,MAAM,eAAe,CAAA;AACjD,OAAO,EAAC,SAAS,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../s/ecs/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {Change} from "./change.js"
|
|
3
|
-
import {Entities} from "./entities.js"
|
|
4
|
-
import {applyDelta} from "./apply-delta.js"
|
|
5
|
-
import {Delta, Components, System} from "./types.js"
|
|
6
|
-
|
|
7
|
-
export function executeSystems<C extends Components>(entities: Entities<C>, systems: System<C>[]) {
|
|
8
|
-
const entitiesReadonly = entities.readonly()
|
|
9
|
-
const deltas: Delta<C>[] = []
|
|
10
|
-
|
|
11
|
-
const change = new Change<C>(delta => {
|
|
12
|
-
applyDelta(entities, delta)
|
|
13
|
-
deltas.push(delta)
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
for (const system of systems)
|
|
17
|
-
system(entitiesReadonly, change)
|
|
18
|
-
|
|
19
|
-
return deltas
|
|
20
|
-
}
|
|
21
|
-
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Change } from "./change.js";
|
|
2
|
-
import { applyDelta } from "./apply-delta.js";
|
|
3
|
-
export function executeSystems(entities, systems) {
|
|
4
|
-
const entitiesReadonly = entities.readonly();
|
|
5
|
-
const deltas = [];
|
|
6
|
-
const change = new Change(delta => {
|
|
7
|
-
applyDelta(entities, delta);
|
|
8
|
-
deltas.push(delta);
|
|
9
|
-
});
|
|
10
|
-
for (const system of systems)
|
|
11
|
-
system(entitiesReadonly, change);
|
|
12
|
-
return deltas;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=execute-systems.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-systems.js","sourceRoot":"","sources":["../../../s/ecs/parts/execute-systems.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAElC,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAG3C,MAAM,UAAU,cAAc,CAAuB,QAAqB,EAAE,OAAoB;IAC/F,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAA;IAC5C,MAAM,MAAM,GAAe,EAAE,CAAA;IAE7B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAI,KAAK,CAAC,EAAE;QACpC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO;QAC3B,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IAEjC,OAAO,MAAM,CAAA;AACd,CAAC"}
|