mirror of
https://github.com/Reuh/ubiquitousse.git
synced 2025-10-27 09:09:30 +00:00
552 lines
21 KiB
Lua
552 lines
21 KiB
Lua
local loaded, scene -- ./ecs/ecs.can:54
|
|
if ... then -- ./ecs/ecs.can:55
|
|
loaded, scene = pcall(require, (...):match("^(.-)ecs") .. "scene") -- ./ecs/ecs.can:55
|
|
end -- ./ecs/ecs.can:55
|
|
if not loaded then -- ./ecs/ecs.can:56
|
|
scene = nil -- ./ecs/ecs.can:56
|
|
end -- ./ecs/ecs.can:56
|
|
local ecs -- ./ecs/ecs.can:58
|
|
local recDestroySystems -- ./ecs/ecs.can:104
|
|
recDestroySystems = function(system) -- ./ecs/ecs.can:104
|
|
for i = # system["systems"], 1, - 1 do -- ./ecs/ecs.can:105
|
|
local s -- ./ecs/ecs.can:106
|
|
s = system["systems"][i] -- ./ecs/ecs.can:106
|
|
recDestroySystems(s) -- ./ecs/ecs.can:107
|
|
s:onDestroy() -- ./ecs/ecs.can:108
|
|
system["systems"][i] = nil -- ./ecs/ecs.can:109
|
|
if s["name"] then -- ./ecs/ecs.can:110
|
|
system["world"]["s"][s["name"]] = nil -- ./ecs/ecs.can:111
|
|
end -- ./ecs/ecs.can:111
|
|
end -- ./ecs/ecs.can:111
|
|
end -- ./ecs/ecs.can:111
|
|
local recCallOnRemoveFromWorld -- ./ecs/ecs.can:116
|
|
recCallOnRemoveFromWorld = function(world, systems) -- ./ecs/ecs.can:116
|
|
for _, s in ipairs(systems) do -- ./ecs/ecs.can:117
|
|
s:clear() -- ./ecs/ecs.can:118
|
|
recCallOnRemoveFromWorld(world, s["systems"]) -- ./ecs/ecs.can:119
|
|
s:onRemoveFromWorld(world) -- ./ecs/ecs.can:120
|
|
end -- ./ecs/ecs.can:120
|
|
end -- ./ecs/ecs.can:120
|
|
local copy -- ./ecs/ecs.can:126
|
|
copy = function(a, b, cache) -- ./ecs/ecs.can:126
|
|
if cache == nil then cache = {} end -- ./ecs/ecs.can:126
|
|
for k, v in pairs(a) do -- ./ecs/ecs.can:127
|
|
if type(v) == "table" then -- ./ecs/ecs.can:128
|
|
if b[k] == nil then -- ./ecs/ecs.can:129
|
|
if cache[v] then -- ./ecs/ecs.can:130
|
|
b[k] = cache[v] -- ./ecs/ecs.can:131
|
|
else -- ./ecs/ecs.can:131
|
|
cache[v] = {} -- ./ecs/ecs.can:133
|
|
b[k] = cache[v] -- ./ecs/ecs.can:134
|
|
copy(v, b[k], cache) -- ./ecs/ecs.can:135
|
|
setmetatable(b[k], getmetatable(v)) -- ./ecs/ecs.can:136
|
|
end -- ./ecs/ecs.can:136
|
|
elseif type(b[k]) == "table" then -- ./ecs/ecs.can:138
|
|
copy(v, b[k], cache) -- ./ecs/ecs.can:139
|
|
end -- ./ecs/ecs.can:139
|
|
elseif b[k] == nil then -- ./ecs/ecs.can:141
|
|
b[k] = v -- ./ecs/ecs.can:142
|
|
end -- ./ecs/ecs.can:142
|
|
end -- ./ecs/ecs.can:142
|
|
end -- ./ecs/ecs.can:142
|
|
local alwaysTrue -- ./ecs/ecs.can:148
|
|
alwaysTrue = function() -- ./ecs/ecs.can:148
|
|
return true -- ./ecs/ecs.can:148
|
|
end -- ./ecs/ecs.can:148
|
|
local alwaysFalse -- ./ecs/ecs.can:149
|
|
alwaysFalse = function() -- ./ecs/ecs.can:149
|
|
return false -- ./ecs/ecs.can:149
|
|
end -- ./ecs/ecs.can:149
|
|
local head -- ./ecs/ecs.can:155
|
|
head = {} -- ./ecs/ecs.can:155
|
|
local skipNew -- ./ecs/ecs.can:158
|
|
skipNew = function() -- ./ecs/ecs.can:158
|
|
local s -- ./ecs/ecs.can:159
|
|
s = { -- ./ecs/ecs.can:159
|
|
["first"] = { -- ./ecs/ecs.can:162
|
|
head, -- ./ecs/ecs.can:162
|
|
nil -- ./ecs/ecs.can:162
|
|
}, -- ./ecs/ecs.can:162
|
|
["firstBase"] = nil, -- ./ecs/ecs.can:164
|
|
["previous"] = { {} }, -- ./ecs/ecs.can:168
|
|
["nLayers"] = 1, -- ./ecs/ecs.can:170
|
|
["n"] = 0 -- ./ecs/ecs.can:172
|
|
} -- ./ecs/ecs.can:172
|
|
s["firstBase"] = s["first"] -- ./ecs/ecs.can:174
|
|
return s -- ./ecs/ecs.can:175
|
|
end -- ./ecs/ecs.can:175
|
|
local nextEntity -- ./ecs/ecs.can:179
|
|
nextEntity = function(s) -- ./ecs/ecs.can:179
|
|
if s[1] then -- ./ecs/ecs.can:180
|
|
local var -- ./ecs/ecs.can:181
|
|
var = s[1][1] -- ./ecs/ecs.can:181
|
|
s[1] = s[1][2] -- ./ecs/ecs.can:182
|
|
return var -- ./ecs/ecs.can:183
|
|
else -- ./ecs/ecs.can:183
|
|
return nil -- ./ecs/ecs.can:185
|
|
end -- ./ecs/ecs.can:185
|
|
end -- ./ecs/ecs.can:185
|
|
local skipIter -- ./ecs/ecs.can:190
|
|
skipIter = function(self) -- ./ecs/ecs.can:190
|
|
return nextEntity, { self["firstBase"][2] } -- ./ecs/ecs.can:191
|
|
end -- ./ecs/ecs.can:191
|
|
local skipAddLayers -- ./ecs/ecs.can:197
|
|
skipAddLayers = function(self) -- ./ecs/ecs.can:197
|
|
while self["n"] > 2 ^ self["nLayers"] do -- ./ecs/ecs.can:198
|
|
self["first"] = { -- ./ecs/ecs.can:199
|
|
head, -- ./ecs/ecs.can:199
|
|
nil, -- ./ecs/ecs.can:199
|
|
self["first"] -- ./ecs/ecs.can:199
|
|
} -- ./ecs/ecs.can:199
|
|
table["insert"](self["previous"], {}) -- ./ecs/ecs.can:200
|
|
self["nLayers"] = self["nLayers"] + (1) -- ./ecs/ecs.can:201
|
|
end -- ./ecs/ecs.can:201
|
|
end -- ./ecs/ecs.can:201
|
|
local coinFlip -- ./ecs/ecs.can:206
|
|
coinFlip = function() -- ./ecs/ecs.can:206
|
|
return math["random"](0, 1) == 1 -- ./ecs/ecs.can:207
|
|
end -- ./ecs/ecs.can:207
|
|
local skipInsert -- ./ecs/ecs.can:212
|
|
skipInsert = function(self, system, e) -- ./ecs/ecs.can:212
|
|
local prevLayer -- ./ecs/ecs.can:214
|
|
prevLayer = {} -- ./ecs/ecs.can:214
|
|
local prev -- ./ecs/ecs.can:215
|
|
prev = self["first"] -- ./ecs/ecs.can:215
|
|
for i = self["nLayers"], 1, - 1 do -- ./ecs/ecs.can:216
|
|
while true do -- ./ecs/ecs.can:217
|
|
if prev[2] == nil or system:compare(e, prev[2][1]) then -- ./ecs/ecs.can:219
|
|
prevLayer[i] = prev -- ./ecs/ecs.can:220
|
|
if prev[3] then -- ./ecs/ecs.can:222
|
|
prev = prev[3] -- ./ecs/ecs.can:223
|
|
break -- ./ecs/ecs.can:224
|
|
end -- ./ecs/ecs.can:224
|
|
break -- ./ecs/ecs.can:226
|
|
else -- ./ecs/ecs.can:226
|
|
prev = prev[2] -- ./ecs/ecs.can:229
|
|
end -- ./ecs/ecs.can:229
|
|
end -- ./ecs/ecs.can:229
|
|
end -- ./ecs/ecs.can:229
|
|
local inLowerLayer -- ./ecs/ecs.can:234
|
|
for i = 1, self["nLayers"] do -- ./ecs/ecs.can:235
|
|
prev = prevLayer[i] -- ./ecs/ecs.can:236
|
|
if i == 1 or coinFlip() then -- ./ecs/ecs.can:237
|
|
local nxt -- ./ecs/ecs.can:238
|
|
nxt = prev[2] -- ./ecs/ecs.can:238
|
|
prev[2] = { -- ./ecs/ecs.can:239
|
|
e, -- ./ecs/ecs.can:239
|
|
nxt, -- ./ecs/ecs.can:239
|
|
inLowerLayer -- ./ecs/ecs.can:239
|
|
} -- ./ecs/ecs.can:239
|
|
self["previous"][i][e] = prev -- ./ecs/ecs.can:240
|
|
if nxt then -- ./ecs/ecs.can:241
|
|
self["previous"][i][nxt[1]] = prev[2] -- ./ecs/ecs.can:242
|
|
end -- ./ecs/ecs.can:242
|
|
inLowerLayer = prev[2] -- ./ecs/ecs.can:244
|
|
else -- ./ecs/ecs.can:244
|
|
break -- ./ecs/ecs.can:246
|
|
end -- ./ecs/ecs.can:246
|
|
end -- ./ecs/ecs.can:246
|
|
self["n"] = self["n"] + (1) -- ./ecs/ecs.can:249
|
|
end -- ./ecs/ecs.can:249
|
|
local skipDelete -- ./ecs/ecs.can:255
|
|
skipDelete = function(self, e) -- ./ecs/ecs.can:255
|
|
for i = 1, self["nLayers"] do -- ./ecs/ecs.can:257
|
|
local previous -- ./ecs/ecs.can:258
|
|
previous = self["previous"][i] -- ./ecs/ecs.can:258
|
|
if previous[e] then -- ./ecs/ecs.can:259
|
|
local prev -- ./ecs/ecs.can:260
|
|
prev = previous[e] -- ./ecs/ecs.can:260
|
|
prev[2] = prev[2][2] -- ./ecs/ecs.can:261
|
|
previous[e] = nil -- ./ecs/ecs.can:262
|
|
if prev[2] then -- ./ecs/ecs.can:263
|
|
previous[prev[2][1]] = prev -- ./ecs/ecs.can:264
|
|
end -- ./ecs/ecs.can:264
|
|
else -- ./ecs/ecs.can:264
|
|
break -- ./ecs/ecs.can:267
|
|
end -- ./ecs/ecs.can:267
|
|
end -- ./ecs/ecs.can:267
|
|
self["n"] = self["n"] - (1) -- ./ecs/ecs.can:270
|
|
end -- ./ecs/ecs.can:270
|
|
local skipReorder -- ./ecs/ecs.can:276
|
|
skipReorder = function(self, system, e) -- ./ecs/ecs.can:276
|
|
skipDelete(self, e) -- ./ecs/ecs.can:277
|
|
skipInsert(self, system, e) -- ./ecs/ecs.can:278
|
|
end -- ./ecs/ecs.can:278
|
|
local skipIndex -- ./ecs/ecs.can:283
|
|
skipIndex = function(self, i) -- ./ecs/ecs.can:283
|
|
local n = 1 -- ./ecs/ecs.can:284
|
|
for e in skipIter(self) do -- ./ecs/ecs.can:285
|
|
if n == i then -- ./ecs/ecs.can:286
|
|
return e -- ./ecs/ecs.can:287
|
|
end -- ./ecs/ecs.can:287
|
|
n = n + (1) -- ./ecs/ecs.can:289
|
|
end -- ./ecs/ecs.can:289
|
|
return nil -- ./ecs/ecs.can:291
|
|
end -- ./ecs/ecs.can:291
|
|
local system_mt -- ./ecs/ecs.can:355
|
|
system_mt = { -- ./ecs/ecs.can:355
|
|
["name"] = nil, -- ./ecs/ecs.can:369
|
|
["systems"] = nil, -- ./ecs/ecs.can:377
|
|
["interval"] = false, -- ./ecs/ecs.can:383
|
|
["active"] = true, -- ./ecs/ecs.can:387
|
|
["visible"] = true, -- ./ecs/ecs.can:391
|
|
["component"] = nil, -- ./ecs/ecs.can:398
|
|
["default"] = nil, -- ./ecs/ecs.can:408
|
|
["filter"] = function(self, e) -- ./ecs/ecs.can:429
|
|
return false -- ./ecs/ecs.can:429
|
|
end, -- ./ecs/ecs.can:429
|
|
["compare"] = function(self, e1, e2) -- ./ecs/ecs.can:441
|
|
return true -- ./ecs/ecs.can:441
|
|
end, -- ./ecs/ecs.can:441
|
|
["onAdd"] = function(self, e, c) -- ./ecs/ecs.can:447
|
|
-- ./ecs/ecs.can:447
|
|
end, -- ./ecs/ecs.can:447
|
|
["onRemove"] = function(self, e, c) -- ./ecs/ecs.can:452
|
|
-- ./ecs/ecs.can:452
|
|
end, -- ./ecs/ecs.can:452
|
|
["onInstance"] = function(self) -- ./ecs/ecs.can:455
|
|
-- ./ecs/ecs.can:455
|
|
end, -- ./ecs/ecs.can:455
|
|
["onAddToWorld"] = function(self, world) -- ./ecs/ecs.can:459
|
|
-- ./ecs/ecs.can:459
|
|
end, -- ./ecs/ecs.can:459
|
|
["onRemoveFromWorld"] = function(self, world) -- ./ecs/ecs.can:463
|
|
-- ./ecs/ecs.can:463
|
|
end, -- ./ecs/ecs.can:463
|
|
["onDestroy"] = function(self) -- ./ecs/ecs.can:466
|
|
-- ./ecs/ecs.can:466
|
|
end, -- ./ecs/ecs.can:466
|
|
["onUpdate"] = function(self, dt) -- ./ecs/ecs.can:471
|
|
-- ./ecs/ecs.can:471
|
|
end, -- ./ecs/ecs.can:471
|
|
["onDraw"] = function(self) -- ./ecs/ecs.can:475
|
|
-- ./ecs/ecs.can:475
|
|
end, -- ./ecs/ecs.can:475
|
|
["process"] = function(self, e, c, dt) -- ./ecs/ecs.can:482
|
|
-- ./ecs/ecs.can:482
|
|
end, -- ./ecs/ecs.can:482
|
|
["render"] = function(self, e, c) -- ./ecs/ecs.can:488
|
|
-- ./ecs/ecs.can:488
|
|
end, -- ./ecs/ecs.can:488
|
|
["onUpdateEnd"] = function(self, dt) -- ./ecs/ecs.can:493
|
|
-- ./ecs/ecs.can:493
|
|
end, -- ./ecs/ecs.can:493
|
|
["onDrawEnd"] = function(self) -- ./ecs/ecs.can:497
|
|
-- ./ecs/ecs.can:497
|
|
end, -- ./ecs/ecs.can:497
|
|
["world"] = nil, -- ./ecs/ecs.can:507
|
|
["w"] = nil, -- ./ecs/ecs.can:511
|
|
["entityCount"] = 0, -- ./ecs/ecs.can:515
|
|
["s"] = nil, -- ./ecs/ecs.can:519
|
|
["_has"] = nil, -- ./ecs/ecs.can:527
|
|
["_waited"] = 0, -- ./ecs/ecs.can:531
|
|
["add"] = function(self, e, ...) -- ./ecs/ecs.can:552
|
|
if e ~= nil and not self["_has"][e] and self:filter(e) then -- ./ecs/ecs.can:553
|
|
if self["component"] and self["default"] then -- ./ecs/ecs.can:555
|
|
copy({ [self["component"]] = self["default"] }, e) -- ./ecs/ecs.can:556
|
|
end -- ./ecs/ecs.can:556
|
|
if self["compare"] ~= system_mt["compare"] then -- ./ecs/ecs.can:559
|
|
skipAddLayers(self["_skiplist"]) -- ./ecs/ecs.can:560
|
|
end -- ./ecs/ecs.can:560
|
|
skipInsert(self["_skiplist"], self, e) -- ./ecs/ecs.can:563
|
|
self["entityCount"] = self["entityCount"] + (1) -- ./ecs/ecs.can:565
|
|
self:onAdd(e, e[self["component"]]) -- ./ecs/ecs.can:566
|
|
if self["_has"][e] then -- ./ecs/ecs.can:568
|
|
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:569
|
|
s:add(e) -- ./ecs/ecs.can:570
|
|
end -- ./ecs/ecs.can:570
|
|
end -- ./ecs/ecs.can:570
|
|
end -- ./ecs/ecs.can:570
|
|
if ... then -- ./ecs/ecs.can:574
|
|
return e, self:add(...) -- ./ecs/ecs.can:575
|
|
else -- ./ecs/ecs.can:575
|
|
return e -- ./ecs/ecs.can:577
|
|
end -- ./ecs/ecs.can:577
|
|
end, -- ./ecs/ecs.can:577
|
|
["remove"] = function(self, e, ...) -- ./ecs/ecs.can:592
|
|
if e ~= nil then -- ./ecs/ecs.can:593
|
|
if self["_has"][e] then -- ./ecs/ecs.can:594
|
|
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:596
|
|
s:remove(e) -- ./ecs/ecs.can:597
|
|
end -- ./ecs/ecs.can:597
|
|
end -- ./ecs/ecs.can:597
|
|
if self["_has"][e] then -- ./ecs/ecs.can:600
|
|
skipDelete(self["_skiplist"], e) -- ./ecs/ecs.can:601
|
|
self["entityCount"] = self["entityCount"] - (1) -- ./ecs/ecs.can:603
|
|
self:onRemove(e, e[self["component"]]) -- ./ecs/ecs.can:604
|
|
end -- ./ecs/ecs.can:604
|
|
end -- ./ecs/ecs.can:604
|
|
if ... then -- ./ecs/ecs.can:607
|
|
return e, self:remove(...) -- ./ecs/ecs.can:608
|
|
else -- ./ecs/ecs.can:608
|
|
return e -- ./ecs/ecs.can:610
|
|
end -- ./ecs/ecs.can:610
|
|
end, -- ./ecs/ecs.can:610
|
|
["refresh"] = function(self, e, ...) -- ./ecs/ecs.can:622
|
|
if e ~= nil then -- ./ecs/ecs.can:623
|
|
if not self["_has"][e] then -- ./ecs/ecs.can:624
|
|
self:add(e) -- ./ecs/ecs.can:625
|
|
else -- ./ecs/ecs.can:625
|
|
if not self:filter(e) then -- ./ecs/ecs.can:627
|
|
self:remove(e) -- ./ecs/ecs.can:628
|
|
else -- ./ecs/ecs.can:628
|
|
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:630
|
|
s:refresh(e) -- ./ecs/ecs.can:631
|
|
end -- ./ecs/ecs.can:631
|
|
end -- ./ecs/ecs.can:631
|
|
end -- ./ecs/ecs.can:631
|
|
end -- ./ecs/ecs.can:631
|
|
if ... then -- ./ecs/ecs.can:636
|
|
return e, self:refresh(...) -- ./ecs/ecs.can:637
|
|
else -- ./ecs/ecs.can:637
|
|
return e -- ./ecs/ecs.can:639
|
|
end -- ./ecs/ecs.can:639
|
|
end, -- ./ecs/ecs.can:639
|
|
["reorder"] = function(self, e, ...) -- ./ecs/ecs.can:651
|
|
if e ~= nil and self["_has"][e] then -- ./ecs/ecs.can:652
|
|
skipReorder(self["_skiplist"], self, e) -- ./ecs/ecs.can:653
|
|
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:655
|
|
s:reorder(e) -- ./ecs/ecs.can:656
|
|
end -- ./ecs/ecs.can:656
|
|
end -- ./ecs/ecs.can:656
|
|
if ... then -- ./ecs/ecs.can:659
|
|
return e, self:reorder(...) -- ./ecs/ecs.can:660
|
|
else -- ./ecs/ecs.can:660
|
|
return e -- ./ecs/ecs.can:662
|
|
end -- ./ecs/ecs.can:662
|
|
end, -- ./ecs/ecs.can:662
|
|
["has"] = function(self, e, ...) -- ./ecs/ecs.can:671
|
|
local has -- ./ecs/ecs.can:672
|
|
has = e == nil or not not self["_has"][e] -- ./ecs/ecs.can:672
|
|
if ... then -- ./ecs/ecs.can:673
|
|
return has and self:has(...) -- ./ecs/ecs.can:674
|
|
else -- ./ecs/ecs.can:674
|
|
return has -- ./ecs/ecs.can:676
|
|
end -- ./ecs/ecs.can:676
|
|
end, -- ./ecs/ecs.can:676
|
|
["iter"] = function(self) -- ./ecs/ecs.can:683
|
|
return skipIter(self["_skiplist"]) -- ./ecs/ecs.can:684
|
|
end, -- ./ecs/ecs.can:684
|
|
["get"] = function(self, i) -- ./ecs/ecs.can:691
|
|
return skipIndex(self["_skiplist"], i) -- ./ecs/ecs.can:692
|
|
end, -- ./ecs/ecs.can:692
|
|
["clear"] = function(self) -- ./ecs/ecs.can:697
|
|
for e in skipIter(self["_skiplist"]) do -- ./ecs/ecs.can:698
|
|
self:remove(e) -- ./ecs/ecs.can:699
|
|
end -- ./ecs/ecs.can:699
|
|
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:701
|
|
s:clear() -- ./ecs/ecs.can:702
|
|
end -- ./ecs/ecs.can:702
|
|
end, -- ./ecs/ecs.can:702
|
|
["update"] = function(self, dt) -- ./ecs/ecs.can:711
|
|
if self["active"] then -- ./ecs/ecs.can:712
|
|
if self["interval"] then -- ./ecs/ecs.can:713
|
|
self["_waited"] = self["_waited"] + (dt) -- ./ecs/ecs.can:714
|
|
if self["_waited"] < self["interval"] then -- ./ecs/ecs.can:715
|
|
return -- ./ecs/ecs.can:716
|
|
end -- ./ecs/ecs.can:716
|
|
end -- ./ecs/ecs.can:716
|
|
self:onUpdate(dt) -- ./ecs/ecs.can:719
|
|
if self["process"] ~= system_mt["process"] then -- ./ecs/ecs.can:720
|
|
for e in skipIter(self["_skiplist"]) do -- ./ecs/ecs.can:721
|
|
self:process(e, e[self["component"]], dt) -- ./ecs/ecs.can:722
|
|
end -- ./ecs/ecs.can:722
|
|
end -- ./ecs/ecs.can:722
|
|
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:725
|
|
s:update(dt) -- ./ecs/ecs.can:726
|
|
end -- ./ecs/ecs.can:726
|
|
self:onUpdateEnd(dt) -- ./ecs/ecs.can:728
|
|
if self["interval"] then -- ./ecs/ecs.can:729
|
|
self["_waited"] = self["_waited"] - (self["interval"]) -- ./ecs/ecs.can:730
|
|
end -- ./ecs/ecs.can:730
|
|
end -- ./ecs/ecs.can:730
|
|
end, -- ./ecs/ecs.can:730
|
|
["draw"] = function(self) -- ./ecs/ecs.can:739
|
|
if self["visible"] then -- ./ecs/ecs.can:740
|
|
self:onDraw() -- ./ecs/ecs.can:741
|
|
if self["render"] ~= system_mt["render"] then -- ./ecs/ecs.can:742
|
|
for e in skipIter(self["_skiplist"]) do -- ./ecs/ecs.can:743
|
|
self:render(e, e[self["component"]]) -- ./ecs/ecs.can:744
|
|
end -- ./ecs/ecs.can:744
|
|
end -- ./ecs/ecs.can:744
|
|
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:747
|
|
s:draw() -- ./ecs/ecs.can:748
|
|
end -- ./ecs/ecs.can:748
|
|
self:onDrawEnd() -- ./ecs/ecs.can:750
|
|
end -- ./ecs/ecs.can:750
|
|
end, -- ./ecs/ecs.can:750
|
|
["callback"] = function(self, name, e, ...) -- ./ecs/ecs.can:765
|
|
return self:callbackFiltered(alwaysTrue, name, e, ...) -- ./ecs/ecs.can:766
|
|
end, -- ./ecs/ecs.can:766
|
|
["callbackFiltered"] = function(self, filter, name, e, ...) -- ./ecs/ecs.can:779
|
|
if filter(self, name, e, ...) then -- ./ecs/ecs.can:780
|
|
if self["_has"][e] and self[name] then -- ./ecs/ecs.can:782
|
|
self[name](self, e, e[self["component"]], ...) -- ./ecs/ecs.can:783
|
|
end -- ./ecs/ecs.can:783
|
|
if self["_has"][e] then -- ./ecs/ecs.can:786
|
|
for _, ss in ipairs(self["systems"]) do -- ./ecs/ecs.can:787
|
|
ss:callbackFiltered(filter, name, e, ...) -- ./ecs/ecs.can:788
|
|
end -- ./ecs/ecs.can:788
|
|
end -- ./ecs/ecs.can:788
|
|
end -- ./ecs/ecs.can:788
|
|
end, -- ./ecs/ecs.can:788
|
|
["emit"] = function(self, name, ...) -- ./ecs/ecs.can:815
|
|
return self:emitFiltered(alwaysTrue, name, ...) -- ./ecs/ecs.can:816
|
|
end, -- ./ecs/ecs.can:816
|
|
["emitFiltered"] = function(self, filter, name, ...) -- ./ecs/ecs.can:828
|
|
if filter(self, name, ...) then -- ./ecs/ecs.can:829
|
|
local status -- ./ecs/ecs.can:831
|
|
if self[name] then -- ./ecs/ecs.can:832
|
|
status = self[name](self, ...) -- ./ecs/ecs.can:833
|
|
end -- ./ecs/ecs.can:833
|
|
if status ~= "stop" and status ~= "capture" then -- ./ecs/ecs.can:836
|
|
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:837
|
|
status = s:emitFiltered(filter, name, ...) -- ./ecs/ecs.can:838
|
|
if status == "capture" then -- ./ecs/ecs.can:839
|
|
break -- ./ecs/ecs.can:839
|
|
end -- ./ecs/ecs.can:839
|
|
end -- ./ecs/ecs.can:839
|
|
end -- ./ecs/ecs.can:839
|
|
return status -- ./ecs/ecs.can:842
|
|
end -- ./ecs/ecs.can:842
|
|
end, -- ./ecs/ecs.can:842
|
|
["destroy"] = function(self) -- ./ecs/ecs.can:847
|
|
recCallOnRemoveFromWorld(self["world"], { self }) -- ./ecs/ecs.can:848
|
|
recDestroySystems({ ["systems"] = { self } }) -- ./ecs/ecs.can:849
|
|
end -- ./ecs/ecs.can:849
|
|
} -- ./ecs/ecs.can:849
|
|
local recInstanciateSystems -- ./ecs/ecs.can:856
|
|
recInstanciateSystems = function(world, systems) -- ./ecs/ecs.can:856
|
|
local t -- ./ecs/ecs.can:857
|
|
t = {} -- ./ecs/ecs.can:857
|
|
for _, s in ipairs(systems) do -- ./ecs/ecs.can:858
|
|
local system -- ./ecs/ecs.can:859
|
|
system = setmetatable({ -- ./ecs/ecs.can:861
|
|
["systems"] = recInstanciateSystems(world, s["systems"] or {}), -- ./ecs/ecs.can:862
|
|
["world"] = world, -- ./ecs/ecs.can:863
|
|
["w"] = world, -- ./ecs/ecs.can:864
|
|
["s"] = world["s"], -- ./ecs/ecs.can:865
|
|
["_skiplist"] = skipNew() -- ./ecs/ecs.can:866
|
|
}, { ["__index"] = function(self, k) -- ./ecs/ecs.can:868
|
|
if s[k] ~= nil then -- ./ecs/ecs.can:869
|
|
return s[k] -- ./ecs/ecs.can:870
|
|
else -- ./ecs/ecs.can:870
|
|
return system_mt[k] -- ./ecs/ecs.can:872
|
|
end -- ./ecs/ecs.can:872
|
|
end }) -- ./ecs/ecs.can:872
|
|
system["_has"] = system["_skiplist"]["previous"][1] -- ./ecs/ecs.can:876
|
|
if type(s["filter"]) == "string" then -- ./ecs/ecs.can:878
|
|
system["filter"] = function(_, e) -- ./ecs/ecs.can:879
|
|
return e[s["filter"]] ~= nil -- ./ecs/ecs.can:879
|
|
end -- ./ecs/ecs.can:879
|
|
elseif type(s["filter"]) == "table" then -- ./ecs/ecs.can:880
|
|
system["filter"] = ecs["all"](unpack(s["filter"])) -- ./ecs/ecs.can:881
|
|
elseif type(s["filter"]) == "boolean" then -- ./ecs/ecs.can:882
|
|
if s["filter"] then -- ./ecs/ecs.can:883
|
|
system["filter"] = alwaysTrue -- ./ecs/ecs.can:884
|
|
else -- ./ecs/ecs.can:884
|
|
system["filter"] = alwaysFalse -- ./ecs/ecs.can:886
|
|
end -- ./ecs/ecs.can:886
|
|
end -- ./ecs/ecs.can:886
|
|
if not s["component"] and s["name"] then -- ./ecs/ecs.can:890
|
|
s["component"] = s["name"] -- ./ecs/ecs.can:891
|
|
end -- ./ecs/ecs.can:891
|
|
table["insert"](t, system) -- ./ecs/ecs.can:894
|
|
if s["name"] then -- ./ecs/ecs.can:895
|
|
world["s"][s["name"]] = system -- ./ecs/ecs.can:896
|
|
end -- ./ecs/ecs.can:896
|
|
system:onInstance() -- ./ecs/ecs.can:898
|
|
end -- ./ecs/ecs.can:898
|
|
return t -- ./ecs/ecs.can:900
|
|
end -- ./ecs/ecs.can:900
|
|
local recCallOnAddToWorld -- ./ecs/ecs.can:903
|
|
recCallOnAddToWorld = function(world, systems) -- ./ecs/ecs.can:903
|
|
for _, s in ipairs(systems) do -- ./ecs/ecs.can:904
|
|
recCallOnAddToWorld(world, s["systems"]) -- ./ecs/ecs.can:905
|
|
s:onAddToWorld(world) -- ./ecs/ecs.can:906
|
|
end -- ./ecs/ecs.can:906
|
|
end -- ./ecs/ecs.can:906
|
|
ecs = { -- ./ecs/ecs.can:912
|
|
["world"] = function(...) -- ./ecs/ecs.can:917
|
|
local world -- ./ecs/ecs.can:918
|
|
world = setmetatable({ -- ./ecs/ecs.can:918
|
|
["filter"] = ecs["all"](), -- ./ecs/ecs.can:919
|
|
["s"] = {}, -- ./ecs/ecs.can:920
|
|
["_skiplist"] = skipNew() -- ./ecs/ecs.can:921
|
|
}, { ["__index"] = system_mt }) -- ./ecs/ecs.can:922
|
|
world["_has"] = world["_skiplist"]["previous"][1] -- ./ecs/ecs.can:923
|
|
world["world"] = world -- ./ecs/ecs.can:924
|
|
world["w"] = world -- ./ecs/ecs.can:925
|
|
world["systems"] = recInstanciateSystems(world, { ... }) -- ./ecs/ecs.can:926
|
|
recCallOnAddToWorld(world, world["systems"]) -- ./ecs/ecs.can:927
|
|
return world -- ./ecs/ecs.can:928
|
|
end, -- ./ecs/ecs.can:928
|
|
["all"] = function(...) -- ./ecs/ecs.can:934
|
|
if ... then -- ./ecs/ecs.can:935
|
|
local l -- ./ecs/ecs.can:936
|
|
l = { ... } -- ./ecs/ecs.can:936
|
|
return function(s, e) -- ./ecs/ecs.can:937
|
|
for _, k in ipairs(l) do -- ./ecs/ecs.can:938
|
|
if e[k] == nil then -- ./ecs/ecs.can:939
|
|
return false -- ./ecs/ecs.can:940
|
|
end -- ./ecs/ecs.can:940
|
|
end -- ./ecs/ecs.can:940
|
|
return true -- ./ecs/ecs.can:943
|
|
end -- ./ecs/ecs.can:943
|
|
else -- ./ecs/ecs.can:943
|
|
return alwaysTrue -- ./ecs/ecs.can:946
|
|
end -- ./ecs/ecs.can:946
|
|
end, -- ./ecs/ecs.can:946
|
|
["any"] = function(...) -- ./ecs/ecs.can:953
|
|
if ... then -- ./ecs/ecs.can:954
|
|
local l -- ./ecs/ecs.can:955
|
|
l = { ... } -- ./ecs/ecs.can:955
|
|
return function(s, e) -- ./ecs/ecs.can:956
|
|
for _, k in ipairs(l) do -- ./ecs/ecs.can:957
|
|
if e[k] ~= nil then -- ./ecs/ecs.can:958
|
|
return true -- ./ecs/ecs.can:959
|
|
end -- ./ecs/ecs.can:959
|
|
end -- ./ecs/ecs.can:959
|
|
return false -- ./ecs/ecs.can:962
|
|
end -- ./ecs/ecs.can:962
|
|
else -- ./ecs/ecs.can:962
|
|
return alwaysFalse -- ./ecs/ecs.can:965
|
|
end -- ./ecs/ecs.can:965
|
|
end, -- ./ecs/ecs.can:965
|
|
["scene"] = function(name, systems, entities) -- ./ecs/ecs.can:983
|
|
if systems == nil then systems = {} end -- ./ecs/ecs.can:983
|
|
if entities == nil then entities = {} end -- ./ecs/ecs.can:983
|
|
assert(scene, "ubiquitousse.scene unavailable") -- ./ecs/ecs.can:984
|
|
local s -- ./ecs/ecs.can:985
|
|
s = scene["new"](name) -- ./ecs/ecs.can:985
|
|
local w -- ./ecs/ecs.can:986
|
|
s["enter"] = function(self) -- ./ecs/ecs.can:988
|
|
local sys, ent = systems, entities -- ./ecs/ecs.can:989
|
|
if type(systems) == "function" then -- ./ecs/ecs.can:990
|
|
sys = { systems() } -- ./ecs/ecs.can:990
|
|
end -- ./ecs/ecs.can:990
|
|
if type(entities) == "function" then -- ./ecs/ecs.can:991
|
|
ent = { entities() } -- ./ecs/ecs.can:991
|
|
end -- ./ecs/ecs.can:991
|
|
w = ecs["world"](unpack(sys)) -- ./ecs/ecs.can:992
|
|
w:add(unpack(ent)) -- ./ecs/ecs.can:993
|
|
end -- ./ecs/ecs.can:993
|
|
s["exit"] = function(self) -- ./ecs/ecs.can:995
|
|
w:destroy() -- ./ecs/ecs.can:996
|
|
end -- ./ecs/ecs.can:996
|
|
s["suspend"] = function(self) -- ./ecs/ecs.can:998
|
|
w:emit("onSuspend") -- ./ecs/ecs.can:999
|
|
end -- ./ecs/ecs.can:999
|
|
s["resume"] = function(self) -- ./ecs/ecs.can:1001
|
|
w:emit("onResume") -- ./ecs/ecs.can:1002
|
|
end -- ./ecs/ecs.can:1002
|
|
s["update"] = function(self, dt) -- ./ecs/ecs.can:1004
|
|
w:update(dt) -- ./ecs/ecs.can:1005
|
|
end -- ./ecs/ecs.can:1005
|
|
s["draw"] = function(self) -- ./ecs/ecs.can:1007
|
|
w:draw() -- ./ecs/ecs.can:1008
|
|
end -- ./ecs/ecs.can:1008
|
|
return s -- ./ecs/ecs.can:1011
|
|
end -- ./ecs/ecs.can:1011
|
|
} -- ./ecs/ecs.can:1011
|
|
return ecs -- ./ecs/ecs.can:1015
|