Skip to content

Commit dcd27e9

Browse files
committed
Merge branch 'feature/prefab_trait' into dev
2 parents 9c81f3f + b263e89 commit dcd27e9

7 files changed

Lines changed: 542 additions & 61 deletions

File tree

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
```
3030
TAG :: fragment
3131
NAME :: fragment
32+
PREFAB :: fragment
33+
34+
UNIQUE :: fragment
35+
EXPLICIT :: fragment
3236
3337
DEFAULT :: fragment
3438
DUPLICATE :: fragment
@@ -140,6 +144,10 @@ builder:clear :: builder
140144
141145
builder:tag :: builder
142146
builder:name :: string -> builder
147+
builder:prefab :: builder
148+
149+
builder:unique :: builder
150+
builder:explicit :: builder
143151
144152
builder:default :: component -> builder
145153
builder:duplicate :: {component -> component} -> builder

ROADMAP.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22

33
## Backlog
44

5-
- add PREFAB entity trait
6-
- is/has_all/any for lists?
7-
85
## After first release
96

107
- cached queries

develop/all.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ print '----------------------------------------'
99
basics.describe_fuzz 'develop.fuzzing.destroy_fuzz'
1010
print '----------------------------------------'
1111
basics.describe_fuzz 'develop.fuzzing.batch_destroy_fuzz'
12+
print '----------------------------------------'
13+
basics.describe_fuzz 'develop.fuzzing.explicit_fuzz'
14+
print '----------------------------------------'
15+
basics.describe_fuzz 'develop.fuzzing.unique_fuzz'

develop/fuzzing/explicit_fuzz.lua

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
local evo = require 'evolved'
2+
3+
evo.debug_mode(true)
4+
5+
---
6+
---
7+
---
8+
---
9+
---
10+
11+
local __table_unpack = (function()
12+
---@diagnostic disable-next-line: deprecated
13+
return table.unpack or unpack
14+
end)()
15+
16+
---
17+
---
18+
---
19+
---
20+
---
21+
22+
local all_entity_list = {} ---@type evolved.entity[]
23+
24+
for i = 1, math.random(1, 10) do
25+
local entity = evo.id()
26+
all_entity_list[i] = entity
27+
end
28+
29+
for _, entity in ipairs(all_entity_list) do
30+
for _ = 0, math.random(0, #all_entity_list) do
31+
local fragment = all_entity_list[math.random(1, #all_entity_list)]
32+
evo.set(entity, fragment)
33+
end
34+
35+
if math.random(1, 5) == 1 then
36+
evo.set(entity, evo.EXPLICIT)
37+
end
38+
end
39+
40+
---
41+
---
42+
---
43+
---
44+
---
45+
46+
for _ = 1, 100 do
47+
local include_set = {} ---@type table<evolved.entity, integer>
48+
local include_list = {} ---@type evolved.entity[]
49+
local include_count = 0
50+
51+
for _ = 1, math.random(1, #all_entity_list) do
52+
local include = all_entity_list[math.random(1, #all_entity_list)]
53+
54+
if not include_set[include] then
55+
include_count = include_count + 1
56+
include_set[include] = include_count
57+
include_list[include_count] = include
58+
end
59+
end
60+
61+
local q = evo.builder():include(__table_unpack(include_list)):spawn()
62+
63+
for chunk in evo.execute(q) do
64+
local fragment_list, fragment_count = chunk:fragments()
65+
for i = 1, fragment_count do
66+
local fragment = fragment_list[i]
67+
assert(include_set[fragment] or not evo.has(fragment, evo.EXPLICIT))
68+
end
69+
end
70+
71+
evo.destroy(q)
72+
end
73+
74+
---
75+
---
76+
---
77+
---
78+
---
79+
80+
evo.destroy(__table_unpack(all_entity_list))
81+
evo.collect_garbage()

develop/fuzzing/unique_fuzz.lua

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
local evo = require 'evolved'
2+
3+
evo.debug_mode(true)
4+
5+
---
6+
---
7+
---
8+
---
9+
---
10+
11+
local __table_unpack = (function()
12+
---@diagnostic disable-next-line: deprecated
13+
return table.unpack or unpack
14+
end)()
15+
16+
---
17+
---
18+
---
19+
---
20+
---
21+
22+
local all_entity_list = {} ---@type evolved.entity[]
23+
24+
for i = 1, math.random(1, 10) do
25+
local entity = evo.id()
26+
all_entity_list[i] = entity
27+
end
28+
29+
for _, entity in ipairs(all_entity_list) do
30+
for _ = 0, math.random(0, #all_entity_list) do
31+
local fragment = all_entity_list[math.random(1, #all_entity_list)]
32+
evo.set(entity, fragment)
33+
end
34+
35+
if math.random(1, 5) == 1 then
36+
evo.set(entity, evo.UNIQUE)
37+
end
38+
end
39+
40+
---
41+
---
42+
---
43+
---
44+
---
45+
46+
for _, entity in ipairs(all_entity_list) do
47+
local entity_clone = evo.clone(entity)
48+
49+
for fragment in evo.each(entity_clone) do
50+
assert(not evo.has(fragment, evo.UNIQUE))
51+
end
52+
53+
for fragment in evo.each(entity) do
54+
assert(evo.has(entity_clone, fragment) or evo.has(fragment, evo.UNIQUE))
55+
end
56+
57+
evo.destroy(entity_clone)
58+
end
59+
60+
---
61+
---
62+
---
63+
---
64+
---
65+
66+
evo.destroy(__table_unpack(all_entity_list))
67+
evo.collect_garbage()

develop/untests.lua

Lines changed: 164 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ local evo = require 'evolved'
55

66
evo.debug_mode(true)
77

8-
do
8+
if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == nil then
99
local i = evo.id()
1010

1111
for _ = 1, 0xFFFFE do
@@ -6156,3 +6156,166 @@ do
61566156
assert(evo.has(e3g, f3) and evo.get(e3g, f3) == 33)
61576157
end
61586158
end
6159+
6160+
do
6161+
local f1, f2, f3 = evo.id(3)
6162+
6163+
evo.set(f2, evo.UNIQUE)
6164+
evo.set(f3, evo.UNIQUE)
6165+
6166+
do
6167+
local p = evo.spawn { [f1] = 11, [f2] = 22 }
6168+
local e = evo.clone(p)
6169+
6170+
assert(evo.has(p, f1) and evo.get(p, f1) == 11)
6171+
assert(evo.has(p, f2) and evo.get(p, f2) == 22)
6172+
6173+
assert(evo.has(e, f1) and evo.get(e, f1) == 11)
6174+
assert(not evo.has(e, f2) and evo.get(e, f2) == nil)
6175+
end
6176+
6177+
do
6178+
local p = evo.spawn { [f1] = 11, [f2] = 22, [f3] = 33 }
6179+
local e = evo.clone(p)
6180+
6181+
assert(evo.has(p, f1) and evo.get(p, f1) == 11)
6182+
assert(evo.has(p, f2) and evo.get(p, f2) == 22)
6183+
assert(evo.has(p, f3) and evo.get(p, f3) == 33)
6184+
6185+
assert(evo.has(e, f1) and evo.get(e, f1) == 11)
6186+
assert(not evo.has(e, f2) and evo.get(e, f2) == nil)
6187+
assert(not evo.has(e, f3) and evo.get(e, f3) == nil)
6188+
end
6189+
6190+
do
6191+
local p = evo.spawn { [f2] = 22 }
6192+
local e = evo.clone(p)
6193+
6194+
assert(not evo.has(p, f1) and evo.get(p, f1) == nil)
6195+
assert(evo.has(p, f2) and evo.get(p, f2) == 22)
6196+
assert(not evo.has(p, f3) and evo.get(p, f3) == nil)
6197+
6198+
assert(not evo.has(e, f1) and evo.get(e, f1) == nil)
6199+
assert(not evo.has(e, f2) and evo.get(e, f2) == nil)
6200+
assert(not evo.has(e, f3) and evo.get(e, f3) == nil)
6201+
end
6202+
do
6203+
local p = evo.spawn { [f2] = 22, [f3] = 33 }
6204+
local e = evo.clone(p)
6205+
6206+
assert(not evo.has(p, f1) and evo.get(p, f1) == nil)
6207+
assert(evo.has(p, f2) and evo.get(p, f2) == 22)
6208+
assert(evo.has(p, f3) and evo.get(p, f3) == 33)
6209+
6210+
assert(not evo.has(e, f1) and evo.get(e, f1) == nil)
6211+
assert(not evo.has(e, f2) and evo.get(e, f2) == nil)
6212+
assert(not evo.has(e, f3) and evo.get(e, f3) == nil)
6213+
end
6214+
6215+
do
6216+
local p = evo.spawn { [f1] = 11, [f2] = 22 }
6217+
local e = evo.clone(p, { [f2] = 2 })
6218+
6219+
assert(evo.has(p, f1) and evo.get(p, f1) == 11)
6220+
assert(evo.has(p, f2) and evo.get(p, f2) == 22)
6221+
6222+
assert(evo.has(e, f1) and evo.get(e, f1) == 11)
6223+
assert(evo.has(e, f2) and evo.get(e, f2) == 2)
6224+
end
6225+
6226+
do
6227+
local p = evo.spawn { [f1] = 11, [f2] = 22 }
6228+
local e = evo.clone(p, { [f2] = 2, [f3] = 3 })
6229+
6230+
assert(evo.has(p, f1) and evo.get(p, f1) == 11)
6231+
assert(evo.has(p, f2) and evo.get(p, f2) == 22)
6232+
6233+
assert(evo.has(e, f1) and evo.get(e, f1) == 11)
6234+
assert(evo.has(e, f2) and evo.get(e, f2) == 2)
6235+
assert(evo.has(e, f3) and evo.get(e, f3) == 3)
6236+
end
6237+
end
6238+
6239+
do
6240+
local f1, f2, f3 = evo.id(3)
6241+
6242+
evo.set(f2, evo.UNIQUE)
6243+
6244+
do
6245+
local p = evo.spawn { [f1] = 11, [f2] = 22, [f3] = 33 }
6246+
local e = evo.clone(p)
6247+
6248+
assert(evo.has(p, f1) and evo.get(p, f1) == 11)
6249+
assert(evo.has(p, f2) and evo.get(p, f2) == 22)
6250+
assert(evo.has(p, f3) and evo.get(p, f3) == 33)
6251+
6252+
assert(evo.has(e, f1) and evo.get(e, f1) == 11)
6253+
assert(not evo.has(e, f2) and evo.get(e, f2) == nil)
6254+
assert(evo.has(e, f3) and evo.get(e, f3) == 33)
6255+
end
6256+
end
6257+
6258+
do
6259+
local f1, f2 = evo.id(2)
6260+
6261+
local p = evo.builder():prefab():set(f1, 11):set(f2, 22):spawn()
6262+
local e = evo.clone(p)
6263+
6264+
do
6265+
local q = evo.builder():include(f1, f2):spawn()
6266+
local iter, state = evo.execute(q)
6267+
local chunk, entity_list, entity_count = iter(state)
6268+
assert(chunk and entity_list and entity_count)
6269+
assert(chunk == evo.chunk(f1, f2))
6270+
assert(entity_count == 1 and entity_list[1] == e)
6271+
end
6272+
6273+
do
6274+
local q = evo.builder():exclude(f1):spawn()
6275+
6276+
for c in evo.execute(q) do
6277+
local fs, fc = c:fragments()
6278+
for i = 1, fc do assert(not evo.has(fs[i], evo.EXPLICIT)) end
6279+
end
6280+
end
6281+
6282+
do
6283+
local q = evo.builder():spawn()
6284+
6285+
for c in evo.execute(q) do
6286+
local fs, fc = c:fragments()
6287+
for i = 1, fc do assert(not evo.has(fs[i], evo.EXPLICIT)) end
6288+
end
6289+
end
6290+
end
6291+
6292+
do
6293+
local f1, f2 = evo.id(2)
6294+
6295+
evo.set(f2, evo.EXPLICIT)
6296+
6297+
local e1 = evo.builder():set(f1, 11):spawn()
6298+
local e2 = evo.builder():set(f1, 11):set(f2, 22):spawn()
6299+
6300+
do
6301+
local q = evo.builder():include(f1):spawn()
6302+
local iter, state = evo.execute(q)
6303+
local chunk, entity_list, entity_count = iter(state)
6304+
assert(chunk and entity_list and entity_count)
6305+
assert(chunk == evo.chunk(f1))
6306+
assert(entity_count == 1 and entity_list[1] == e1)
6307+
chunk, entity_list, entity_count = iter(state)
6308+
assert(not chunk and not entity_list and not entity_count)
6309+
end
6310+
6311+
do
6312+
local q = evo.builder():include(f1, f2):spawn()
6313+
local iter, state = evo.execute(q)
6314+
local chunk, entity_list, entity_count = iter(state)
6315+
assert(chunk and entity_list and entity_count)
6316+
assert(chunk == evo.chunk(f1, f2))
6317+
assert(entity_count == 1 and entity_list[1] == e2)
6318+
chunk, entity_list, entity_count = iter(state)
6319+
assert(not chunk and not entity_list and not entity_count)
6320+
end
6321+
end

0 commit comments

Comments
 (0)