1
0
Fork 0
mirror of https://github.com/Reuh/ubiquitousse.git synced 2025-10-27 09:09:30 +00:00

Add make script and precompile Candran files

This commit is contained in:
Étienne Fildadut 2021-12-27 17:22:50 +01:00
parent bfa73f6dd0
commit bfbe236e58
18 changed files with 1307 additions and 80 deletions

View file

@ -108,7 +108,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -334,7 +334,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -1683,7 +1683,7 @@ its sibling systems (i.e. completely stop the propagation of the event).</li>
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -1829,7 +1829,7 @@ end
Level background. </p> Level background. </p>
<p> If there is a background image, <code>background.image</code> contains a table <code>{image=image, x=number, y=number, sx=number, sy=number}</code> <p> If there is a background image, <code>background.image</code> contains a table <code>{image=image, x=number, y=number, sx=number, sy=number}</code>
where <a href="../modules/ldtk.html#Tileset.image">image</a> is the LÖVE image (or image filepath if LÖVE not available) <a href="../modules/ldtk.html#Tile.x">x</a> and <a href="../modules/ldtk.html#Entity.y">y</a> are the top-left position, where <a href="../modules/ldtk.html#Tileset.image">image</a> is the LÖVE image (or image filepath if LÖVE not available) <a href="../modules/ldtk.html#Level.x">x</a> and <a href="../modules/ldtk.html#Level.y">y</a> are the top-left position,
and <a href="../modules/ldtk.html#Entity.sx">sx</a> and <a href="../modules/ldtk.html#Entity.sy">sy</a> the horizontal and vertical scale factors. and <a href="../modules/ldtk.html#Entity.sx">sx</a> and <a href="../modules/ldtk.html#Entity.sy">sy</a> the horizontal and vertical scale factors.
</ul> </ul>
@ -1904,7 +1904,7 @@ end
<li>Enum are converted into a Lua string giving the currently selected enum value.</li> <li>Enum are converted into a Lua string giving the currently selected enum value.</li>
<li>Filepath are converted into a Lua string giving the file path.</li> <li>Filepath are converted into a Lua string giving the file path.</li>
<li>Arrays are converted into a Lua table with the elements in it as a list.</li> <li>Arrays are converted into a Lua table with the elements in it as a list.</li>
<li>Points are converted into a Lua table with the fields <a href="../modules/ldtk.html#Tile.x">x</a> and <a href="../modules/ldtk.html#Entity.y">y</a>: <code>{ x=number, y=number }</code>.</li> <li>Points are converted into a Lua table with the fields <a href="../modules/ldtk.html#Level.x">x</a> and <a href="../modules/ldtk.html#Level.y">y</a>: <code>{ x=number, y=number }</code>.</li>
<li>Colors are converted into a Lua table with the red, green and blue components in [0-1] as a list: <code>{r,g,b}</code>.</li> <li>Colors are converted into a Lua table with the red, green and blue components in [0-1] as a list: <code>{r,g,b}</code>.</li>
</ul> </ul>
@ -1930,7 +1930,7 @@ end
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -702,7 +702,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -414,7 +414,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -1153,7 +1153,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -60,12 +60,11 @@
<h1>Module <code>ubiquitousse</code></h1> <h1>Module <code>ubiquitousse</code></h1>
<p>Ubiquitousse main module.</p> <p>Ubiquitousse main module.</p>
<p> Set of various Lua libraries to make game development easier, mainly made to be used alongside the <a href="https://love2d.org/">LÖVE</a> game framework. <p><p>Set of various Lua libraries to make game development easier, mainly made to be used alongside the <a href="https://love2d.org/">LÖVE</a> game framework.
Nothing that hasn&rsquo;t been done before, but these are tailored to what I need. They can be used independently too, and are relatively portable, even without LÖVE.</p> Nothing that hasn&rsquo;t been done before, but these are tailored to what I need. They can be used independently too, and are relatively portable, even without LÖVE.</p>
<p> This is the main module, which will try to load every other Ubiquitousse module when required and may even provide a few convenience functions.</p> <p>This is the main module, which will try to load every other Ubiquitousse module when required,
and also perform a quick LÖVE version check and show a warning in case of potential incompatibility.</p>
<p> This also perform a quick LÖVE version check and show a warning in case of potential incompatibility.</p>
<p><strong>Regarding Ubiquitousse&rsquo;s organization</strong></p> <p><strong>Regarding Ubiquitousse&rsquo;s organization</strong></p>
@ -80,7 +79,16 @@
In order to keep a good idea of how portable this all is, other dependencies, including LÖVE, are explicited at the top of every module file and in specific In order to keep a good idea of how portable this all is, other dependencies, including LÖVE, are explicited at the top of every module file and in specific
functions definition using the <code>@require</code> tag (e.g., <code>&mdash; @require love</code> for LÖVE).</p> functions definition using the <code>@require</code> tag (e.g., <code>&mdash; @require love</code> for LÖVE).</p>
<p> Some modules are developped in <a href="https://github.com/Reuh/candran">Candran</a> (.can files), but can easily be compiled into regular Lua code.</p> <p>Some modules are developped in <a href="https://github.com/Reuh/candran">Candran</a> (<code>.can</code> files), but can easily be compiled into regular Lua code. In fact,
you will find precompiled Lua files in the ubiquitousse repository alongside the Candran files, so you don&rsquo;t have to install Candran yourself and everything
should be pretty much plug and play.</p>
<p>Regarding the documentation: Ubiquitousse uses LDoc/LuaDoc styled-comments, but since LDoc hates me and my code, the
generated result is mostly garbage, so to generate the documentation you will need to use my <a href="https://github.com/Reuh/LDoc">LDoc fork</a>
which I modified to force LDoc to like me.</p>
<p>If you want to recompile the Candran files or the documentation yourself, there&rsquo;s a build script <code>make</code> available at the root of
the repository to save you a few seconds.</p>
<p>Units used in the API documentation, unless written otherwise:</p> <p>Units used in the API documentation, unless written otherwise:</p>
@ -102,10 +110,7 @@
<li>lowerCamelCase is expected for everything else.</li> <li>lowerCamelCase is expected for everything else.</li>
</ul> </ul>
</p>
<p> Regarding the documentation: Ubiquitousse uses LDoc/LuaDoc styled-comments, but since LDoc hates me and my code, the
generated result is mostly garbage, so to generate the documentation you will need to use my <a href="https://github.com/Reuh/LDoc">LDoc fork</a>
which I modified to force LDoc to like me.</p>
<h3>Usage:</h3> <h3>Usage:</h3>
<ul> <ul>
<pre class="example">local ubiquitousse = require(&quot;ubiquitousse&quot;) <pre class="example">local ubiquitousse = require(&quot;ubiquitousse&quot;)
@ -362,7 +367,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -784,7 +784,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -64,7 +64,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

View file

@ -71,7 +71,7 @@
</div> <!-- id="main" --> </div> <!-- id="main" -->
<div id="about"> <div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i> <i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.6</a></i>
<i style="float:right;">Last updated 2021-12-27 16:25:25 </i> <i style="float:right;">Last updated 2021-12-27 17:22:39 </i>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->
</body> </body>

33
ecs/children.lua Normal file
View file

@ -0,0 +1,33 @@
return { -- ./ecs/children.can:12
["name"] = "children", -- ./ecs/children.can:13
["filter"] = true, -- ./ecs/children.can:14
["onAdd"] = function(self, e) -- ./ecs/children.can:15
if not e["children"] then -- ./ecs/children.can:16
e["children"] = {} -- ./ecs/children.can:16
end -- ./ecs/children.can:16
if e["parent"] then -- ./ecs/children.can:17
local parentchildren -- ./ecs/children.can:18
parentchildren = e["parent"]["children"] -- ./ecs/children.can:18
table["insert"](parentchildren, e) -- ./ecs/children.can:19
end -- ./ecs/children.can:19
for _, o in ipairs(e["children"]) do -- ./ecs/children.can:21
o["parent"] = e -- ./ecs/children.can:22
self["world"]:add(o) -- ./ecs/children.can:23
end -- ./ecs/children.can:23
end, -- ./ecs/children.can:23
["onRemove"] = function(self, e) -- ./ecs/children.can:26
for i = # e["children"], 1, - 1 do -- ./ecs/children.can:27
self["world"]:remove(e["children"][i]) -- ./ecs/children.can:28
end -- ./ecs/children.can:28
if e["parent"] then -- ./ecs/children.can:30
local parentchildren -- ./ecs/children.can:31
parentchildren = e["parent"]["children"] -- ./ecs/children.can:31
for i = # parentchildren, 1, - 1 do -- ./ecs/children.can:32
if parentchildren[i] == e then -- ./ecs/children.can:33
table["remove"](parentchildren, i) -- ./ecs/children.can:34
break -- ./ecs/children.can:35
end -- ./ecs/children.can:35
end -- ./ecs/children.can:35
end -- ./ecs/children.can:35
end -- ./ecs/children.can:35
} -- ./ecs/children.can:35

494
ecs/ecs.lua Normal file
View file

@ -0,0 +1,494 @@
local loaded, scene -- ./ecs/ecs.can:51
if ... then -- ./ecs/ecs.can:52
loaded, scene = pcall(require, (...):match("^(.-)ecs") .. "scene") -- ./ecs/ecs.can:52
end -- ./ecs/ecs.can:52
if not loaded then -- ./ecs/ecs.can:53
scene = nil -- ./ecs/ecs.can:53
end -- ./ecs/ecs.can:53
local ecs -- ./ecs/ecs.can:55
local recDestroySystems -- ./ecs/ecs.can:102
recDestroySystems = function(system) -- ./ecs/ecs.can:102
for i = # system["systems"], 1, - 1 do -- ./ecs/ecs.can:103
local s -- ./ecs/ecs.can:104
s = system["systems"][i] -- ./ecs/ecs.can:104
recDestroySystems(s) -- ./ecs/ecs.can:105
s:onDestroy() -- ./ecs/ecs.can:106
system["systems"][i] = nil -- ./ecs/ecs.can:107
if s["name"] then -- ./ecs/ecs.can:108
system["world"]["s"][s["name"]] = nil -- ./ecs/ecs.can:109
end -- ./ecs/ecs.can:109
end -- ./ecs/ecs.can:109
end -- ./ecs/ecs.can:109
local recCallOnRemoveFromWorld -- ./ecs/ecs.can:114
recCallOnRemoveFromWorld = function(world, systems) -- ./ecs/ecs.can:114
for _, s in ipairs(systems) do -- ./ecs/ecs.can:115
s:clear() -- ./ecs/ecs.can:116
recCallOnRemoveFromWorld(world, s["systems"]) -- ./ecs/ecs.can:117
s:onRemoveFromWorld(world) -- ./ecs/ecs.can:118
end -- ./ecs/ecs.can:118
end -- ./ecs/ecs.can:118
local nextEntity -- ./ecs/ecs.can:123
nextEntity = function(s) -- ./ecs/ecs.can:123
if s[1] then -- ./ecs/ecs.can:124
local var -- ./ecs/ecs.can:125
var = s[1][1] -- ./ecs/ecs.can:125
s[1] = s[1][2] -- ./ecs/ecs.can:126
return var -- ./ecs/ecs.can:127
else -- ./ecs/ecs.can:127
return nil -- ./ecs/ecs.can:129
end -- ./ecs/ecs.can:129
end -- ./ecs/ecs.can:129
local copy -- ./ecs/ecs.can:135
copy = function(a, b, cache) -- ./ecs/ecs.can:135
if cache == nil then cache = {} end -- ./ecs/ecs.can:135
for k, v in pairs(a) do -- ./ecs/ecs.can:136
if type(v) == "table" then -- ./ecs/ecs.can:137
if b[k] == nil then -- ./ecs/ecs.can:138
if cache[v] then -- ./ecs/ecs.can:139
b[k] = cache[v] -- ./ecs/ecs.can:140
else -- ./ecs/ecs.can:140
cache[v] = {} -- ./ecs/ecs.can:142
b[k] = cache[v] -- ./ecs/ecs.can:143
copy(v, b[k], cache) -- ./ecs/ecs.can:144
setmetatable(b[k], getmetatable(v)) -- ./ecs/ecs.can:145
end -- ./ecs/ecs.can:145
elseif type(b[k]) == "table" then -- ./ecs/ecs.can:147
copy(v, b[k], cache) -- ./ecs/ecs.can:148
end -- ./ecs/ecs.can:148
elseif b[k] == nil then -- ./ecs/ecs.can:150
b[k] = v -- ./ecs/ecs.can:151
end -- ./ecs/ecs.can:151
end -- ./ecs/ecs.can:151
end -- ./ecs/ecs.can:151
local system_mt -- ./ecs/ecs.can:217
system_mt = { -- ./ecs/ecs.can:217
["name"] = nil, -- ./ecs/ecs.can:231
["systems"] = nil, -- ./ecs/ecs.can:239
["interval"] = false, -- ./ecs/ecs.can:245
["active"] = true, -- ./ecs/ecs.can:249
["visible"] = true, -- ./ecs/ecs.can:253
["component"] = nil, -- ./ecs/ecs.can:260
["default"] = nil, -- ./ecs/ecs.can:270
["filter"] = function(self, e) -- ./ecs/ecs.can:291
return false -- ./ecs/ecs.can:291
end, -- ./ecs/ecs.can:291
["compare"] = function(self, e1, e2) -- ./ecs/ecs.can:303
return true -- ./ecs/ecs.can:303
end, -- ./ecs/ecs.can:303
["onAdd"] = function(self, e, c) -- ./ecs/ecs.can:309
-- ./ecs/ecs.can:309
end, -- ./ecs/ecs.can:309
["onRemove"] = function(self, e, c) -- ./ecs/ecs.can:314
-- ./ecs/ecs.can:314
end, -- ./ecs/ecs.can:314
["onInstance"] = function(self) -- ./ecs/ecs.can:317
-- ./ecs/ecs.can:317
end, -- ./ecs/ecs.can:317
["onAddToWorld"] = function(self, world) -- ./ecs/ecs.can:321
-- ./ecs/ecs.can:321
end, -- ./ecs/ecs.can:321
["onRemoveFromWorld"] = function(self, world) -- ./ecs/ecs.can:325
-- ./ecs/ecs.can:325
end, -- ./ecs/ecs.can:325
["onDestroy"] = function(self) -- ./ecs/ecs.can:328
-- ./ecs/ecs.can:328
end, -- ./ecs/ecs.can:328
["onUpdate"] = function(self, dt) -- ./ecs/ecs.can:333
-- ./ecs/ecs.can:333
end, -- ./ecs/ecs.can:333
["onDraw"] = function(self) -- ./ecs/ecs.can:337
-- ./ecs/ecs.can:337
end, -- ./ecs/ecs.can:337
["process"] = function(self, e, c, dt) -- ./ecs/ecs.can:344
-- ./ecs/ecs.can:344
end, -- ./ecs/ecs.can:344
["render"] = function(self, e, c) -- ./ecs/ecs.can:350
-- ./ecs/ecs.can:350
end, -- ./ecs/ecs.can:350
["onUpdateEnd"] = function(self, dt) -- ./ecs/ecs.can:355
-- ./ecs/ecs.can:355
end, -- ./ecs/ecs.can:355
["onDrawEnd"] = function(self) -- ./ecs/ecs.can:359
-- ./ecs/ecs.can:359
end, -- ./ecs/ecs.can:359
["world"] = nil, -- ./ecs/ecs.can:369
["w"] = nil, -- ./ecs/ecs.can:373
["entityCount"] = 0, -- ./ecs/ecs.can:377
["s"] = nil, -- ./ecs/ecs.can:381
["_first"] = nil, -- ./ecs/ecs.can:387
["_previous"] = nil, -- ./ecs/ecs.can:391
["_waited"] = 0, -- ./ecs/ecs.can:394
["add"] = function(self, e, ...) -- ./ecs/ecs.can:415
if e ~= nil and not self["_previous"][e] and self:filter(e) then -- ./ecs/ecs.can:416
if self["component"] and self["default"] then -- ./ecs/ecs.can:418
copy({ [self["component"]] = self["default"] }, e) -- ./ecs/ecs.can:419
end -- ./ecs/ecs.can:419
if self["_first"] == nil then -- ./ecs/ecs.can:422
self["_first"] = { -- ./ecs/ecs.can:423
e, -- ./ecs/ecs.can:423
nil -- ./ecs/ecs.can:423
} -- ./ecs/ecs.can:423
self["_previous"][e] = true -- ./ecs/ecs.can:424
elseif self:compare(e, self["_first"][1]) then -- ./ecs/ecs.can:425
local nxt -- ./ecs/ecs.can:426
nxt = self["_first"] -- ./ecs/ecs.can:426
self["_first"] = { -- ./ecs/ecs.can:427
e, -- ./ecs/ecs.can:427
nxt -- ./ecs/ecs.can:427
} -- ./ecs/ecs.can:427
self["_previous"][e] = true -- ./ecs/ecs.can:428
self["_previous"][nxt[1]] = self["_first"] -- ./ecs/ecs.can:429
else -- ./ecs/ecs.can:429
local entity -- ./ecs/ecs.can:431
entity = self["_first"] -- ./ecs/ecs.can:431
while entity[2] ~= nil do -- ./ecs/ecs.can:432
if self:compare(e, entity[2][1]) then -- ./ecs/ecs.can:433
local nxt -- ./ecs/ecs.can:434
nxt = entity[2] -- ./ecs/ecs.can:434
entity[2] = { -- ./ecs/ecs.can:435
e, -- ./ecs/ecs.can:435
nxt -- ./ecs/ecs.can:435
} -- ./ecs/ecs.can:435
self["_previous"][e] = entity -- ./ecs/ecs.can:436
self["_previous"][nxt[1]] = entity[2] -- ./ecs/ecs.can:437
break -- ./ecs/ecs.can:438
end -- ./ecs/ecs.can:438
entity = entity[2] -- ./ecs/ecs.can:440
end -- ./ecs/ecs.can:440
if entity[2] == nil then -- ./ecs/ecs.can:442
entity[2] = { -- ./ecs/ecs.can:443
e, -- ./ecs/ecs.can:443
nil -- ./ecs/ecs.can:443
} -- ./ecs/ecs.can:443
self["_previous"][e] = entity -- ./ecs/ecs.can:444
end -- ./ecs/ecs.can:444
end -- ./ecs/ecs.can:444
self["entityCount"] = self["entityCount"] + (1) -- ./ecs/ecs.can:448
self:onAdd(e, e[self["component"]]) -- ./ecs/ecs.can:449
if self["_previous"][e] then -- ./ecs/ecs.can:451
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:452
s:add(e) -- ./ecs/ecs.can:453
end -- ./ecs/ecs.can:453
end -- ./ecs/ecs.can:453
end -- ./ecs/ecs.can:453
if ... then -- ./ecs/ecs.can:457
return e, self:add(...) -- ./ecs/ecs.can:458
else -- ./ecs/ecs.can:458
return e -- ./ecs/ecs.can:460
end -- ./ecs/ecs.can:460
end, -- ./ecs/ecs.can:460
["remove"] = function(self, e, ...) -- ./ecs/ecs.can:475
if e ~= nil then -- ./ecs/ecs.can:476
if self["_previous"][e] then -- ./ecs/ecs.can:477
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:479
s:remove(e) -- ./ecs/ecs.can:480
end -- ./ecs/ecs.can:480
end -- ./ecs/ecs.can:480
if self["_previous"][e] then -- ./ecs/ecs.can:483
local prev -- ./ecs/ecs.can:485
prev = self["_previous"][e] -- ./ecs/ecs.can:485
if prev == true then -- ./ecs/ecs.can:486
self["_first"] = self["_first"][2] -- ./ecs/ecs.can:487
if self["_first"] then -- ./ecs/ecs.can:488
self["_previous"][self["_first"][1]] = true -- ./ecs/ecs.can:489
end -- ./ecs/ecs.can:489
else -- ./ecs/ecs.can:489
prev[2] = prev[2][2] -- ./ecs/ecs.can:492
if prev[2] then -- ./ecs/ecs.can:493
self["_previous"][prev[2][1]] = prev -- ./ecs/ecs.can:494
end -- ./ecs/ecs.can:494
end -- ./ecs/ecs.can:494
self["_previous"][e] = nil -- ./ecs/ecs.can:498
self["entityCount"] = self["entityCount"] - (1) -- ./ecs/ecs.can:499
self:onRemove(e, e[self["component"]]) -- ./ecs/ecs.can:500
end -- ./ecs/ecs.can:500
end -- ./ecs/ecs.can:500
if ... then -- ./ecs/ecs.can:503
return e, self:remove(...) -- ./ecs/ecs.can:504
else -- ./ecs/ecs.can:504
return e -- ./ecs/ecs.can:506
end -- ./ecs/ecs.can:506
end, -- ./ecs/ecs.can:506
["refresh"] = function(self, e, ...) -- ./ecs/ecs.can:518
if e ~= nil then -- ./ecs/ecs.can:519
if not self["_previous"][e] then -- ./ecs/ecs.can:520
self:add(e) -- ./ecs/ecs.can:521
elseif self["_previous"][e] then -- ./ecs/ecs.can:522
if not self:filter(e) then -- ./ecs/ecs.can:523
self:remove(e) -- ./ecs/ecs.can:524
else -- ./ecs/ecs.can:524
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:526
s:refresh(e) -- ./ecs/ecs.can:527
end -- ./ecs/ecs.can:527
end -- ./ecs/ecs.can:527
end -- ./ecs/ecs.can:527
end -- ./ecs/ecs.can:527
if ... then -- ./ecs/ecs.can:532
return e, self:refresh(...) -- ./ecs/ecs.can:533
else -- ./ecs/ecs.can:533
return e -- ./ecs/ecs.can:535
end -- ./ecs/ecs.can:535
end, -- ./ecs/ecs.can:535
["reorder"] = function(self, e, ...) -- ./ecs/ecs.can:547
if e ~= nil then -- ./ecs/ecs.can:548
if self["_previous"][e] then -- ./ecs/ecs.can:549
local prev -- ./ecs/ecs.can:550
prev = self["_previous"][e] -- ./ecs/ecs.can:550
local next -- ./ecs/ecs.can:551
next = prev == true and self["_first"][2] or prev[2][2] -- ./ecs/ecs.can:551
if prev == true then -- ./ecs/ecs.can:553
self["_first"] = self["_first"][2] -- ./ecs/ecs.can:554
else -- ./ecs/ecs.can:554
prev[2] = next -- ./ecs/ecs.can:556
end -- ./ecs/ecs.can:556
if next then -- ./ecs/ecs.can:558
self["_previous"][next[1]] = prev -- ./ecs/ecs.can:559
end -- ./ecs/ecs.can:559
while prev ~= true and self:compare(e, prev[1]) do -- ./ecs/ecs.can:562
next = prev -- ./ecs/ecs.can:563
prev = self["_previous"][prev[1]] -- ./ecs/ecs.can:564
end -- ./ecs/ecs.can:564
while next ~= nil and not self:compare(e, next[1]) do -- ./ecs/ecs.can:566
prev = next -- ./ecs/ecs.can:567
next = next[2] -- ./ecs/ecs.can:568
end -- ./ecs/ecs.can:568
local new -- ./ecs/ecs.can:571
new = { -- ./ecs/ecs.can:571
e, -- ./ecs/ecs.can:571
next -- ./ecs/ecs.can:571
} -- ./ecs/ecs.can:571
self["_previous"][e] = prev -- ./ecs/ecs.can:572
if next then -- ./ecs/ecs.can:573
self["_previous"][next[1]] = new -- ./ecs/ecs.can:574
end -- ./ecs/ecs.can:574
if prev == true then -- ./ecs/ecs.can:576
self["_first"] = new -- ./ecs/ecs.can:577
else -- ./ecs/ecs.can:577
prev[2] = new -- ./ecs/ecs.can:579
end -- ./ecs/ecs.can:579
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:582
s:reorder(e) -- ./ecs/ecs.can:583
end -- ./ecs/ecs.can:583
end -- ./ecs/ecs.can:583
end -- ./ecs/ecs.can:583
if ... then -- ./ecs/ecs.can:587
return e, self:reorder(...) -- ./ecs/ecs.can:588
else -- ./ecs/ecs.can:588
return e -- ./ecs/ecs.can:590
end -- ./ecs/ecs.can:590
end, -- ./ecs/ecs.can:590
["has"] = function(self, e, ...) -- ./ecs/ecs.can:599
local has -- ./ecs/ecs.can:600
has = e == nil or not not self["_previous"][e] -- ./ecs/ecs.can:600
if ... then -- ./ecs/ecs.can:601
return has and self:has(...) -- ./ecs/ecs.can:602
else -- ./ecs/ecs.can:602
return has -- ./ecs/ecs.can:604
end -- ./ecs/ecs.can:604
end, -- ./ecs/ecs.can:604
["iter"] = function(self) -- ./ecs/ecs.can:609
return nextEntity, { self["_first"] } -- ./ecs/ecs.can:610
end, -- ./ecs/ecs.can:610
["clear"] = function(self) -- ./ecs/ecs.can:613
for e in self:iter() do -- ./ecs/ecs.can:614
self:remove(e) -- ./ecs/ecs.can:615
end -- ./ecs/ecs.can:615
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:617
s:clear() -- ./ecs/ecs.can:618
end -- ./ecs/ecs.can:618
end, -- ./ecs/ecs.can:618
["update"] = function(self, dt) -- ./ecs/ecs.can:625
if self["active"] then -- ./ecs/ecs.can:626
if self["interval"] then -- ./ecs/ecs.can:627
self["_waited"] = self["_waited"] + (dt) -- ./ecs/ecs.can:628
if self["_waited"] < self["interval"] then -- ./ecs/ecs.can:629
return -- ./ecs/ecs.can:630
end -- ./ecs/ecs.can:630
end -- ./ecs/ecs.can:630
self:onUpdate(dt) -- ./ecs/ecs.can:633
if self["process"] ~= system_mt["process"] then -- ./ecs/ecs.can:634
for e in self:iter() do -- ./ecs/ecs.can:635
self:process(e, e[self["component"]], dt) -- ./ecs/ecs.can:636
end -- ./ecs/ecs.can:636
end -- ./ecs/ecs.can:636
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:639
s:update(dt) -- ./ecs/ecs.can:640
end -- ./ecs/ecs.can:640
self:onUpdateEnd(dt) -- ./ecs/ecs.can:642
if self["interval"] then -- ./ecs/ecs.can:643
self["_waited"] = self["_waited"] - (self["interval"]) -- ./ecs/ecs.can:644
end -- ./ecs/ecs.can:644
end -- ./ecs/ecs.can:644
end, -- ./ecs/ecs.can:644
["draw"] = function(self) -- ./ecs/ecs.can:651
if self["visible"] then -- ./ecs/ecs.can:652
self:onDraw() -- ./ecs/ecs.can:653
if self["render"] ~= system_mt["render"] then -- ./ecs/ecs.can:654
for e in self:iter() do -- ./ecs/ecs.can:655
self:render(e, e[self["component"]]) -- ./ecs/ecs.can:656
end -- ./ecs/ecs.can:656
end -- ./ecs/ecs.can:656
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:659
s:draw() -- ./ecs/ecs.can:660
end -- ./ecs/ecs.can:660
self:onDrawEnd() -- ./ecs/ecs.can:662
end -- ./ecs/ecs.can:662
end, -- ./ecs/ecs.can:662
["callback"] = function(self, name, e, ...) -- ./ecs/ecs.can:675
if self["_previous"][e] and self[name] then -- ./ecs/ecs.can:677
self[name](self, e, e[self["component"]], ...) -- ./ecs/ecs.can:678
end -- ./ecs/ecs.can:678
if self["_previous"][e] then -- ./ecs/ecs.can:681
for _, ss in ipairs(self["systems"]) do -- ./ecs/ecs.can:682
ss:callback(name, e, ...) -- ./ecs/ecs.can:683
end -- ./ecs/ecs.can:683
end -- ./ecs/ecs.can:683
end, -- ./ecs/ecs.can:683
["emit"] = function(self, name, ...) -- ./ecs/ecs.can:708
local status -- ./ecs/ecs.can:710
if self[name] then -- ./ecs/ecs.can:711
status = self[name](self, ...) -- ./ecs/ecs.can:712
end -- ./ecs/ecs.can:712
if status ~= "stop" and status ~= "capture" then -- ./ecs/ecs.can:715
for _, s in ipairs(self["systems"]) do -- ./ecs/ecs.can:716
status = s:emit(name, ...) -- ./ecs/ecs.can:717
if status == "capture" then -- ./ecs/ecs.can:718
break -- ./ecs/ecs.can:718
end -- ./ecs/ecs.can:718
end -- ./ecs/ecs.can:718
end -- ./ecs/ecs.can:718
return status -- ./ecs/ecs.can:721
end, -- ./ecs/ecs.can:721
["destroy"] = function(self) -- ./ecs/ecs.can:724
recCallOnRemoveFromWorld(self["world"], { self }) -- ./ecs/ecs.can:725
recDestroySystems({ ["systems"] = { self } }) -- ./ecs/ecs.can:726
end -- ./ecs/ecs.can:726
} -- ./ecs/ecs.can:726
local alwaysTrue -- ./ecs/ecs.can:731
alwaysTrue = function() -- ./ecs/ecs.can:731
return true -- ./ecs/ecs.can:731
end -- ./ecs/ecs.can:731
local alwaysFalse -- ./ecs/ecs.can:732
alwaysFalse = function() -- ./ecs/ecs.can:732
return false -- ./ecs/ecs.can:732
end -- ./ecs/ecs.can:732
local recInstanciateSystems -- ./ecs/ecs.can:737
recInstanciateSystems = function(world, systems) -- ./ecs/ecs.can:737
local t -- ./ecs/ecs.can:738
t = {} -- ./ecs/ecs.can:738
for _, s in ipairs(systems) do -- ./ecs/ecs.can:739
local system -- ./ecs/ecs.can:740
system = setmetatable({ -- ./ecs/ecs.can:742
["systems"] = recInstanciateSystems(world, s["systems"] or {}), -- ./ecs/ecs.can:743
["world"] = world, -- ./ecs/ecs.can:744
["w"] = world, -- ./ecs/ecs.can:745
["s"] = world["s"], -- ./ecs/ecs.can:746
["_previous"] = {} -- ./ecs/ecs.can:747
}, { ["__index"] = function(self, k) -- ./ecs/ecs.can:749
if s[k] ~= nil then -- ./ecs/ecs.can:750
return s[k] -- ./ecs/ecs.can:751
else -- ./ecs/ecs.can:751
return system_mt[k] -- ./ecs/ecs.can:753
end -- ./ecs/ecs.can:753
end }) -- ./ecs/ecs.can:753
if type(s["filter"]) == "string" then -- ./ecs/ecs.can:758
system["filter"] = function(_, e) -- ./ecs/ecs.can:759
return e[s["filter"]] ~= nil -- ./ecs/ecs.can:759
end -- ./ecs/ecs.can:759
elseif type(s["filter"]) == "table" then -- ./ecs/ecs.can:760
system["filter"] = ecs["all"](unpack(s["filter"])) -- ./ecs/ecs.can:761
elseif type(s["filter"]) == "boolean" then -- ./ecs/ecs.can:762
if s["filter"] then -- ./ecs/ecs.can:763
system["filter"] = alwaysTrue -- ./ecs/ecs.can:764
else -- ./ecs/ecs.can:764
system["filter"] = alwaysFalse -- ./ecs/ecs.can:766
end -- ./ecs/ecs.can:766
end -- ./ecs/ecs.can:766
if not s["component"] and s["name"] then -- ./ecs/ecs.can:770
s["component"] = s["name"] -- ./ecs/ecs.can:771
end -- ./ecs/ecs.can:771
table["insert"](t, system) -- ./ecs/ecs.can:774
if s["name"] then -- ./ecs/ecs.can:775
world["s"][s["name"]] = system -- ./ecs/ecs.can:776
end -- ./ecs/ecs.can:776
system:onInstance() -- ./ecs/ecs.can:778
end -- ./ecs/ecs.can:778
return t -- ./ecs/ecs.can:780
end -- ./ecs/ecs.can:780
local recCallOnAddToWorld -- ./ecs/ecs.can:783
recCallOnAddToWorld = function(world, systems) -- ./ecs/ecs.can:783
for _, s in ipairs(systems) do -- ./ecs/ecs.can:784
recCallOnAddToWorld(world, s["systems"]) -- ./ecs/ecs.can:785
s:onAddToWorld(world) -- ./ecs/ecs.can:786
end -- ./ecs/ecs.can:786
end -- ./ecs/ecs.can:786
ecs = { -- ./ecs/ecs.can:792
["world"] = function(...) -- ./ecs/ecs.can:797
local world -- ./ecs/ecs.can:798
world = setmetatable({ -- ./ecs/ecs.can:798
["filter"] = ecs["all"](), -- ./ecs/ecs.can:799
["s"] = {}, -- ./ecs/ecs.can:800
["_previous"] = {} -- ./ecs/ecs.can:801
}, { ["__index"] = system_mt }) -- ./ecs/ecs.can:802
world["world"] = world -- ./ecs/ecs.can:803
world["w"] = world -- ./ecs/ecs.can:804
world["systems"] = recInstanciateSystems(world, { ... }) -- ./ecs/ecs.can:805
recCallOnAddToWorld(world, world["systems"]) -- ./ecs/ecs.can:806
return world -- ./ecs/ecs.can:807
end, -- ./ecs/ecs.can:807
["all"] = function(...) -- ./ecs/ecs.can:813
if ... then -- ./ecs/ecs.can:814
local l -- ./ecs/ecs.can:815
l = { ... } -- ./ecs/ecs.can:815
return function(s, e) -- ./ecs/ecs.can:816
for _, k in ipairs(l) do -- ./ecs/ecs.can:817
if e[k] == nil then -- ./ecs/ecs.can:818
return false -- ./ecs/ecs.can:819
end -- ./ecs/ecs.can:819
end -- ./ecs/ecs.can:819
return true -- ./ecs/ecs.can:822
end -- ./ecs/ecs.can:822
else -- ./ecs/ecs.can:822
return alwaysTrue -- ./ecs/ecs.can:825
end -- ./ecs/ecs.can:825
end, -- ./ecs/ecs.can:825
["any"] = function(...) -- ./ecs/ecs.can:832
if ... then -- ./ecs/ecs.can:833
local l -- ./ecs/ecs.can:834
l = { ... } -- ./ecs/ecs.can:834
return function(s, e) -- ./ecs/ecs.can:835
for _, k in ipairs(l) do -- ./ecs/ecs.can:836
if e[k] ~= nil then -- ./ecs/ecs.can:837
return true -- ./ecs/ecs.can:838
end -- ./ecs/ecs.can:838
end -- ./ecs/ecs.can:838
return false -- ./ecs/ecs.can:841
end -- ./ecs/ecs.can:841
else -- ./ecs/ecs.can:841
return alwaysFalse -- ./ecs/ecs.can:844
end -- ./ecs/ecs.can:844
end, -- ./ecs/ecs.can:844
["scene"] = function(name, systems, entities) -- ./ecs/ecs.can:854
if systems == nil then systems = {} end -- ./ecs/ecs.can:854
if entities == nil then entities = {} end -- ./ecs/ecs.can:854
assert(scene, "ubiquitousse.scene unavailable") -- ./ecs/ecs.can:855
local s -- ./ecs/ecs.can:856
s = scene["new"](name) -- ./ecs/ecs.can:856
local w -- ./ecs/ecs.can:857
s["enter"] = function(self) -- ./ecs/ecs.can:859
w = ecs["world"](unpack(systems)) -- ./ecs/ecs.can:860
w:add(unpack(entities)) -- ./ecs/ecs.can:861
end -- ./ecs/ecs.can:861
s["exit"] = function(self) -- ./ecs/ecs.can:863
w:destroy() -- ./ecs/ecs.can:864
end -- ./ecs/ecs.can:864
s["update"] = function(self, dt) -- ./ecs/ecs.can:866
w:update(dt) -- ./ecs/ecs.can:867
end -- ./ecs/ecs.can:867
s["draw"] = function(self) -- ./ecs/ecs.can:869
w:draw() -- ./ecs/ecs.can:870
end -- ./ecs/ecs.can:870
return s -- ./ecs/ecs.can:873
end -- ./ecs/ecs.can:873
} -- ./ecs/ecs.can:873
return ecs -- ./ecs/ecs.can:877

23
ecs/timer.lua Normal file
View file

@ -0,0 +1,23 @@
local timer -- ./ecs/timer.can:4
timer = require((...):match("^(.-)ecs%.timer") .. "scene") -- ./ecs/timer.can:4
return { -- ./ecs/timer.can:6
["name"] = "timer", -- ./ecs/timer.can:7
["filter"] = "timer", -- ./ecs/timer.can:8
["default"] = {}, -- ./ecs/timer.can:9
["process"] = function(self, t, dt) -- ./ecs/timer.can:12
t:update(dt) -- ./ecs/timer.can:13
if t:dead() then -- ./ecs/timer.can:14
self["world"]:remove(t["entity"]) -- ./ecs/timer.can:15
end -- ./ecs/timer.can:15
end, -- ./ecs/timer.can:15
["run"] = function(self, func) -- ./ecs/timer.can:20
local t = timer["run"](func) -- ./ecs/timer.can:21
self["world"]:add({ ["timer"] = t }) -- ./ecs/timer.can:23
return t -- ./ecs/timer.can:25
end, -- ./ecs/timer.can:25
["tween"] = function(self, duration, tbl, to, method) -- ./ecs/timer.can:28
local t = timer["tween"](duration, tbl, to, method) -- ./ecs/timer.can:29
self["world"]:add({ ["timer"] = t }) -- ./ecs/timer.can:31
return t -- ./ecs/timer.can:33
end -- ./ecs/timer.can:33
} -- ./ecs/timer.can:33

View file

@ -1,49 +1,53 @@
-- ubiquitousse --[[-- Ubiquitousse main module.
--- Ubiquitousse main module. Set of various Lua libraries to make game development easier, mainly made to be used alongside the [LÖVE](https://love2d.org/) game framework.
-- Set of various Lua libraries to make game development easier, mainly made to be used alongside the [LÖVE](https://love2d.org/) game framework. Nothing that hasn't been done before, but these are tailored to what I need. They can be used independently too, and are relatively portable, even without LÖVE.
-- Nothing that hasn't been done before, but these are tailored to what I need. They can be used independently too, and are relatively portable, even without LÖVE.
-- This is the main module, which will try to load every other Ubiquitousse module when required,
-- This is the main module, which will try to load every other Ubiquitousse module when required and may even provide a few convenience functions. and also perform a quick LÖVE version check and show a warning in case of potential incompatibility.
--
-- This also perform a quick LÖVE version check and show a warning in case of potential incompatibility. **Regarding Ubiquitousse's organization**
--
-- **Regarding Ubiquitousse's organization** Ubiquitousse may or may not be used in its totality. You can delete the modules directories you don't need and Ubiquitousse
-- should adapt accordingly. You can also simply copy the modules directories you need and use them directly, without using this
-- Ubiquitousse may or may not be used in its totality. You can delete the modules directories you don't need and Ubiquitousse file at all.
-- should adapt accordingly. You can also simply copy the modules directories you need and use them directly, without using this However, some modules may provide more feature when other modules are available.
-- file at all. These dependencies are written at the top of every main module file.
-- However, some modules may provide more feature when other modules are available.
-- These dependencies are written at the top of every main module file. Ubiquitousse's original goal was to run everywhere with the least porting effort possible, so while the current version now mainly focus LÖVE, it
-- should still be easily modifiable to work with something else. Ubiquitousse is mainly tested on LuaJIT and Lua 5.3 but should also support Lua 5.1 and 5.2.
-- Ubiquitousse's original goal was to run everywhere with the least porting effort possible, so while the current version now mainly focus LÖVE, it In order to keep a good idea of how portable this all is, other dependencies, including LÖVE, are explicited at the top of every module file and in specific
-- should still be easily modifiable to work with something else. Ubiquitousse is mainly tested on LuaJIT and Lua 5.3 but should also support Lua 5.1 and 5.2. functions definition using the `@require` tag (e.g., `-- @require love` for LÖVE).
-- In order to keep a good idea of how portable this all is, other dependencies, including LÖVE, are explicited at the top of every module file and in specific
-- functions definition using the `@require` tag (e.g., `-- @require love` for LÖVE). Some modules are developped in [Candran](https://github.com/Reuh/candran) (`.can` files), but can easily be compiled into regular Lua code. In fact,
-- you will find precompiled Lua files in the ubiquitousse repository alongside the Candran files, so you don't have to install Candran yourself and everything
-- Some modules are developped in [Candran](https://github.com/Reuh/candran) (.can files), but can easily be compiled into regular Lua code. should be pretty much plug and play.
--
-- Units used in the API documentation, unless written otherwise: Regarding the documentation: Ubiquitousse uses LDoc/LuaDoc styled-comments, but since LDoc hates me and my code, the
-- generated result is mostly garbage, so to generate the documentation you will need to use my [LDoc fork](https://github.com/Reuh/LDoc)
-- * All distances are expressed in pixels (px) which I modified to force LDoc to like me.
-- * All durations are expressed in seconds (s)
-- If you want to recompile the Candran files or the documentation yourself, there's a build script `make` available at the root of
-- These units are only used to make writing documentation easier; you can use other units if you want, as long as you're consistent. the repository to save you a few seconds.
--
-- Style: Units used in the API documentation, unless written otherwise:
--
-- * tabs for indentation, spaces for esthetic whitespace (notably in comments) * All distances are expressed in pixels (px)
-- * no globals * All durations are expressed in seconds (s)
-- * UPPERCASE for constants (or maybe not).
-- * CamelCase for class names. These units are only used to make writing documentation easier; you can use other units if you want, as long as you're consistent.
-- * lowerCamelCase is expected for everything else.
-- Style:
-- Regarding the documentation: Ubiquitousse uses LDoc/LuaDoc styled-comments, but since LDoc hates me and my code, the
-- generated result is mostly garbage, so to generate the documentation you will need to use my [LDoc fork](https://github.com/Reuh/LDoc) * tabs for indentation, spaces for esthetic whitespace (notably in comments)
-- which I modified to force LDoc to like me. * no globals
-- * UPPERCASE for constants (or maybe not).
-- @module ubiquitousse * CamelCase for class names.
-- @usage local ubiquitousse = require("ubiquitousse") * lowerCamelCase is expected for everything else.
@module ubiquitousse
@usage local ubiquitousse = require("ubiquitousse")
--]]
local p = ... -- require path local p = ... -- require path
local ubiquitousse local ubiquitousse

489
ldtk/ldtk.lua Normal file
View file

@ -0,0 +1,489 @@
local lg -- ./ldtk/ldtk.can:38
lg = (love or {})["graphics"] -- ./ldtk/ldtk.can:38
local newQuad -- ./ldtk/ldtk.can:39
if lg then -- ./ldtk/ldtk.can:40
newQuad = lg["newQuad"] -- ./ldtk/ldtk.can:41
else -- ./ldtk/ldtk.can:41
newQuad = function(x, y, w, h, image) -- ./ldtk/ldtk.can:43
return { -- ./ldtk/ldtk.can:44
x, -- ./ldtk/ldtk.can:44
y, -- ./ldtk/ldtk.can:44
w, -- ./ldtk/ldtk.can:44
h -- ./ldtk/ldtk.can:44
} -- ./ldtk/ldtk.can:44
end -- ./ldtk/ldtk.can:44
end -- ./ldtk/ldtk.can:44
local json_decode -- ./ldtk/ldtk.can:49
json_decode = require((...):gsub("ldtk$", "json"))["decode"] -- ./ldtk/ldtk.can:49
local readJson -- ./ldtk/ldtk.can:50
readJson = function(file) -- ./ldtk/ldtk.can:50
local f -- ./ldtk/ldtk.can:51
f = assert(io["open"](file, "r")) -- ./ldtk/ldtk.can:51
local t = json_decode(f:read("*a")) -- ./ldtk/ldtk.can:52
f:close() -- ./ldtk/ldtk.can:53
return t -- ./ldtk/ldtk.can:54
end -- ./ldtk/ldtk.can:54
local parseColor -- ./ldtk/ldtk.can:58
parseColor = function(str) -- ./ldtk/ldtk.can:58
local r, g, b = str:match("^#(..)(..)(..)") -- ./ldtk/ldtk.can:59
r, g, b = tonumber(r, 16), tonumber(g, 16), tonumber(b, 16) -- ./ldtk/ldtk.can:60
return { -- ./ldtk/ldtk.can:61
r / 255, -- ./ldtk/ldtk.can:61
g / 255, -- ./ldtk/ldtk.can:61
b / 255 -- ./ldtk/ldtk.can:61
} -- ./ldtk/ldtk.can:61
end -- ./ldtk/ldtk.can:61
local white -- ./ldtk/ldtk.can:63
white = { -- ./ldtk/ldtk.can:63
1, -- ./ldtk/ldtk.can:63
1, -- ./ldtk/ldtk.can:63
1 -- ./ldtk/ldtk.can:63
} -- ./ldtk/ldtk.can:63
local toLua -- ./ldtk/ldtk.can:66
toLua = function(type, val) -- ./ldtk/ldtk.can:66
if val == nil then -- ./ldtk/ldtk.can:67
return val -- ./ldtk/ldtk.can:67
end -- ./ldtk/ldtk.can:67
if type:match("^Array%<") then -- ./ldtk/ldtk.can:68
local itype = type:match("^Array%<(.*)%>$") -- ./ldtk/ldtk.can:69
for i, v in ipairs(val) do -- ./ldtk/ldtk.can:70
val[i] = toLua(itype, v) -- ./ldtk/ldtk.can:71
end -- ./ldtk/ldtk.can:71
elseif type == "Color" then -- ./ldtk/ldtk.can:73
return parseColor(val) -- ./ldtk/ldtk.can:74
elseif type == "Point" then -- ./ldtk/ldtk.can:75
return { -- ./ldtk/ldtk.can:76
["x"] = val["cx"], -- ./ldtk/ldtk.can:76
["y"] = val["cy"] -- ./ldtk/ldtk.can:76
} -- ./ldtk/ldtk.can:76
end -- ./ldtk/ldtk.can:76
return val -- ./ldtk/ldtk.can:78
end -- ./ldtk/ldtk.can:78
local getFields -- ./ldtk/ldtk.can:80
getFields = function(f) -- ./ldtk/ldtk.can:80
local t = {} -- ./ldtk/ldtk.can:81
for _, v in ipairs(f) do -- ./ldtk/ldtk.can:82
t[v["__identifier"]] = toLua(v["__type"], v["__value"]) -- ./ldtk/ldtk.can:83
end -- ./ldtk/ldtk.can:83
return t -- ./ldtk/ldtk.can:85
end -- ./ldtk/ldtk.can:85
local tileset_mt -- ./ldtk/ldtk.can:88
local make_cache -- ./ldtk/ldtk.can:91
make_cache = function(new_fn) -- ./ldtk/ldtk.can:91
return setmetatable({}, { -- ./ldtk/ldtk.can:92
["__mode"] = "v", -- ./ldtk/ldtk.can:93
["__call"] = function(cache, id) -- ./ldtk/ldtk.can:94
if not cache[id] then -- ./ldtk/ldtk.can:95
cache[id] = new_fn(id) -- ./ldtk/ldtk.can:96
end -- ./ldtk/ldtk.can:96
return cache[id] -- ./ldtk/ldtk.can:98
end -- ./ldtk/ldtk.can:98
}) -- ./ldtk/ldtk.can:98
end -- ./ldtk/ldtk.can:98
local cache -- ./ldtk/ldtk.can:102
cache = { -- ./ldtk/ldtk.can:102
["tileset"] = make_cache(function(tilesetDef) -- ./ldtk/ldtk.can:103
return tileset_mt["_init"](tilesetDef) -- ./ldtk/ldtk.can:104
end), -- ./ldtk/ldtk.can:104
["image"] = make_cache(function(path) -- ./ldtk/ldtk.can:106
if lg then -- ./ldtk/ldtk.can:107
return lg["newImage"](path) -- ./ldtk/ldtk.can:108
else -- ./ldtk/ldtk.can:108
return path -- ./ldtk/ldtk.can:110
end -- ./ldtk/ldtk.can:110
end) -- ./ldtk/ldtk.can:110
} -- ./ldtk/ldtk.can:110
tileset_mt = { -- ./ldtk/ldtk.can:118
["_newQuad"] = function(self, x, y, width, height) -- ./ldtk/ldtk.can:119
return newQuad(x, y, width, height, self["image"]) -- ./ldtk/ldtk.can:120
end, -- ./ldtk/ldtk.can:120
["_getTileQuad"] = function(self, tileid, x, y, size) -- ./ldtk/ldtk.can:122
if not self["_tileQuads"][tileid] then -- ./ldtk/ldtk.can:123
self["_tileQuads"][tileid] = self:_newQuad(x, y, size, size) -- ./ldtk/ldtk.can:124
end -- ./ldtk/ldtk.can:124
return self["_tileQuads"][tileid] -- ./ldtk/ldtk.can:126
end, -- ./ldtk/ldtk.can:126
["_init"] = function(tilesetDef) -- ./ldtk/ldtk.can:128
local t = { -- ./ldtk/ldtk.can:129
["image"] = cache["image"](tilesetDef["path"]), -- ./ldtk/ldtk.can:132
["_tileQuads"] = {} -- ./ldtk/ldtk.can:134
} -- ./ldtk/ldtk.can:134
return setmetatable(t, tileset_mt) -- ./ldtk/ldtk.can:136
end -- ./ldtk/ldtk.can:136
} -- ./ldtk/ldtk.can:136
tileset_mt["__index"] = tileset_mt -- ./ldtk/ldtk.can:139
local layer_mt -- ./ldtk/ldtk.can:146
layer_mt = { -- ./ldtk/ldtk.can:146
["draw"] = function(self, x, y) -- ./ldtk/ldtk.can:154
if x == nil then x = 0 end -- ./ldtk/ldtk.can:154
if y == nil then y = 0 end -- ./ldtk/ldtk.can:154
if self["visible"] then -- ./ldtk/ldtk.can:155
lg["push"]() -- ./ldtk/ldtk.can:156
lg["translate"](x + self["x"], y + self["y"]) -- ./ldtk/ldtk.can:157
if self["spritebatch"] then -- ./ldtk/ldtk.can:158
lg["setColor"](1, 1, 1, self["opacity"]) -- ./ldtk/ldtk.can:159
lg["draw"](self["spritebatch"]) -- ./ldtk/ldtk.can:160
elseif self["intTiles"] then -- ./ldtk/ldtk.can:161
for _, t in ipairs(self["intTiles"]) do -- ./ldtk/ldtk.can:162
lg["setColor"](t["color"]) -- ./ldtk/ldtk.can:163
lg["rectangle"]("fill", t["x"], t["y"], t["layer"]["gridSize"], t["layer"]["gridSize"]) -- ./ldtk/ldtk.can:164
end -- ./ldtk/ldtk.can:164
elseif self["entities"] then -- ./ldtk/ldtk.can:166
for _, e in ipairs(self["entities"]) do -- ./ldtk/ldtk.can:167
if e["draw"] then -- ./ldtk/ldtk.can:168
e:draw() -- ./ldtk/ldtk.can:168
end -- ./ldtk/ldtk.can:168
end -- ./ldtk/ldtk.can:168
end -- ./ldtk/ldtk.can:168
lg["pop"]() -- ./ldtk/ldtk.can:171
end -- ./ldtk/ldtk.can:171
end, -- ./ldtk/ldtk.can:171
["_unloadCallbacks"] = function(self, callbacks) -- ./ldtk/ldtk.can:175
local onRemoveTile = callbacks["onRemoveTile"] -- ./ldtk/ldtk.can:176
if self["tiles"] and onRemoveTile then -- ./ldtk/ldtk.can:177
for _, t in ipairs(self["tiles"]) do -- ./ldtk/ldtk.can:178
onRemoveTile(t) -- ./ldtk/ldtk.can:179
end -- ./ldtk/ldtk.can:179
end -- ./ldtk/ldtk.can:179
local onRemoveIntTile = callbacks["onRemoveIntTile"] -- ./ldtk/ldtk.can:182
if self["intTiles"] and onRemoveIntTile then -- ./ldtk/ldtk.can:183
for _, t in ipairs(self["intTiles"]) do -- ./ldtk/ldtk.can:184
onRemoveIntTile(t) -- ./ldtk/ldtk.can:185
end -- ./ldtk/ldtk.can:185
end -- ./ldtk/ldtk.can:185
local onRemoveEntity = callbacks["onRemoveEntity"] -- ./ldtk/ldtk.can:188
if self["entities"] and onRemoveEntity then -- ./ldtk/ldtk.can:189
for _, e in ipairs(self["entities"]) do -- ./ldtk/ldtk.can:190
onRemoveEntity(e) -- ./ldtk/ldtk.can:191
end -- ./ldtk/ldtk.can:191
end -- ./ldtk/ldtk.can:191
end, -- ./ldtk/ldtk.can:191
["_init"] = function(layer, level, order, callbacks) -- ./ldtk/ldtk.can:195
local gridSize -- ./ldtk/ldtk.can:196
gridSize = layer["__gridSize"] -- ./ldtk/ldtk.can:196
local t -- ./ldtk/ldtk.can:197
t = { -- ./ldtk/ldtk.can:197
["level"] = level, -- ./ldtk/ldtk.can:200
["identifier"] = layer["__identifier"], -- ./ldtk/ldtk.can:203
["type"] = layer["__type"], -- ./ldtk/ldtk.can:206
["visible"] = layer["visible"], -- ./ldtk/ldtk.can:209
["opacity"] = layer["opacity"], -- ./ldtk/ldtk.can:212
["order"] = order, -- ./ldtk/ldtk.can:215
["x"] = layer["__pxTotalOffsetX"], -- ./ldtk/ldtk.can:218
["y"] = layer["__pxTotalOffsetY"], -- ./ldtk/ldtk.can:221
["gridSize"] = gridSize, -- ./ldtk/ldtk.can:224
["gridWidth"] = layer["__cWid"], -- ./ldtk/ldtk.can:227
["gridHeight"] = layer["__cHei"], -- ./ldtk/ldtk.can:230
["entities"] = nil, -- ./ldtk/ldtk.can:233
["tiles"] = nil, -- ./ldtk/ldtk.can:237
["tileset"] = nil, -- ./ldtk/ldtk.can:241
["spritebatch"] = nil, -- ./ldtk/ldtk.can:246
["intTiles"] = nil -- ./ldtk/ldtk.can:250
} -- ./ldtk/ldtk.can:250
if layer["__tilesetDefUid"] then -- ./ldtk/ldtk.can:253
t["tiles"] = {} -- ./ldtk/ldtk.can:254
local tilesetData = level["project"]["_tilesetData"][layer["__tilesetDefUid"]] -- ./ldtk/ldtk.can:255
t["tileset"] = cache["tileset"](tilesetData) -- ./ldtk/ldtk.can:256
local tiles = layer["__type"] == "Tiles" and layer["gridTiles"] or layer["autoLayerTiles"] -- ./ldtk/ldtk.can:257
local onAddTile = callbacks["onAddTile"] -- ./ldtk/ldtk.can:258
if lg then -- ./ldtk/ldtk.can:259
t["spritebatch"] = lg["newSpriteBatch"](t["tileset"]["image"]) -- ./ldtk/ldtk.can:259
end -- ./ldtk/ldtk.can:259
for _, tl in ipairs(tiles) do -- ./ldtk/ldtk.can:260
local quad -- ./ldtk/ldtk.can:261
quad = t["tileset"]:_getTileQuad(tl["t"], tl["src"][1], tl["src"][2], gridSize) -- ./ldtk/ldtk.can:261
local sx, sy = 1, 1 -- ./ldtk/ldtk.can:262
local x, y -- ./ldtk/ldtk.can:263
x, y = tl["px"][1], tl["px"][2] -- ./ldtk/ldtk.can:263
local tile -- ./ldtk/ldtk.can:271
tile = { -- ./ldtk/ldtk.can:271
["layer"] = t, -- ./ldtk/ldtk.can:274
["x"] = x, -- ./ldtk/ldtk.can:277
["y"] = y, -- ./ldtk/ldtk.can:280
["flipX"] = false, -- ./ldtk/ldtk.can:283
["flipY"] = false, -- ./ldtk/ldtk.can:286
["tags"] = tilesetData[tl["t"]]["tags"], -- ./ldtk/ldtk.can:289
["data"] = tilesetData[tl["t"]]["data"], -- ./ldtk/ldtk.can:292
["quad"] = quad -- ./ldtk/ldtk.can:296
} -- ./ldtk/ldtk.can:296
if tl["f"] == 1 or tl["f"] == 3 then -- ./ldtk/ldtk.can:298
sx = - 1 -- ./ldtk/ldtk.can:299
x = x + (gridSize) -- ./ldtk/ldtk.can:300
tile["flipX"] = true -- ./ldtk/ldtk.can:301
end -- ./ldtk/ldtk.can:301
if tl["f"] == 2 or tl["f"] == 3 then -- ./ldtk/ldtk.can:303
sy = - 1 -- ./ldtk/ldtk.can:304
y = y + (gridSize) -- ./ldtk/ldtk.can:305
tile["flipY"] = true -- ./ldtk/ldtk.can:306
end -- ./ldtk/ldtk.can:306
if t["spritebatch"] then -- ./ldtk/ldtk.can:308
t["spritebatch"]:add(quad, x, y, 0, sx, sy) -- ./ldtk/ldtk.can:308
end -- ./ldtk/ldtk.can:308
table["insert"](t["tiles"], tile) -- ./ldtk/ldtk.can:309
if onAddTile then -- ./ldtk/ldtk.can:310
onAddTile(tile) -- ./ldtk/ldtk.can:310
end -- ./ldtk/ldtk.can:310
end -- ./ldtk/ldtk.can:310
elseif layer["__type"] == "IntGrid" then -- ./ldtk/ldtk.can:313
t["intTiles"] = {} -- ./ldtk/ldtk.can:314
local onAddIntTile = callbacks["onAddIntTile"] -- ./ldtk/ldtk.can:315
local values = level["project"]["_layerDef"][layer["layerDefUid"]]["intGridValues"] -- ./ldtk/ldtk.can:316
for i, tl in ipairs(layer["intGridCsv"]) do -- ./ldtk/ldtk.can:317
if tl > 0 then -- ./ldtk/ldtk.can:318
local y -- ./ldtk/ldtk.can:319
y = math["floor"]((i - 1) / t["gridWidth"]) * gridSize -- ./ldtk/ldtk.can:319
local x -- ./ldtk/ldtk.can:320
x = ((i - 1) % t["gridWidth"]) * gridSize -- ./ldtk/ldtk.can:320
local tile -- ./ldtk/ldtk.can:328
tile = { -- ./ldtk/ldtk.can:328
["layer"] = t, -- ./ldtk/ldtk.can:331
["x"] = x, -- ./ldtk/ldtk.can:334
["y"] = y, -- ./ldtk/ldtk.can:337
["identifier"] = values[tl]["identifier"], -- ./ldtk/ldtk.can:340
["value"] = tl, -- ./ldtk/ldtk.can:343
["color"] = values[tl]["color"] -- ./ldtk/ldtk.can:346
} -- ./ldtk/ldtk.can:346
table["insert"](t["intTiles"], tile) -- ./ldtk/ldtk.can:348
if onAddIntTile then -- ./ldtk/ldtk.can:349
onAddIntTile(tile) -- ./ldtk/ldtk.can:349
end -- ./ldtk/ldtk.can:349
end -- ./ldtk/ldtk.can:349
end -- ./ldtk/ldtk.can:349
end -- ./ldtk/ldtk.can:349
if layer["__type"] == "Entities" then -- ./ldtk/ldtk.can:354
t["entities"] = {} -- ./ldtk/ldtk.can:355
local onAddEntity = callbacks["onAddEntity"] -- ./ldtk/ldtk.can:356
for _, e in ipairs(layer["entityInstances"]) do -- ./ldtk/ldtk.can:357
local entityDef -- ./ldtk/ldtk.can:358
entityDef = level["project"]["_entityData"][e["defUid"]] -- ./ldtk/ldtk.can:358
local entity -- ./ldtk/ldtk.can:366
entity = { -- ./ldtk/ldtk.can:366
["layer"] = t, -- ./ldtk/ldtk.can:369
["identifier"] = e["__identifier"], -- ./ldtk/ldtk.can:372
["x"] = e["px"][1], -- ./ldtk/ldtk.can:375
["y"] = e["px"][2], -- ./ldtk/ldtk.can:378
["width"] = e["width"], -- ./ldtk/ldtk.can:381
["height"] = e["height"], -- ./ldtk/ldtk.can:384
["sx"] = e["width"] / entityDef["width"], -- ./ldtk/ldtk.can:387
["sy"] = e["height"] / entityDef["height"], -- ./ldtk/ldtk.can:390
["pivotX"] = e["__pivot"][1] * e["width"], -- ./ldtk/ldtk.can:393
["pivotY"] = e["__pivot"][2] * e["height"], -- ./ldtk/ldtk.can:396
["color"] = entityDef["color"], -- ./ldtk/ldtk.can:399
["tile"] = nil, -- ./ldtk/ldtk.can:403
["fields"] = getFields(e["fieldInstances"]), -- ./ldtk/ldtk.can:406
["draw"] = function(self) -- ./ldtk/ldtk.can:412
if self["tile"] then -- ./ldtk/ldtk.can:413
local _, _, w, h -- ./ldtk/ldtk.can:414
_, _, w, h = self["tile"]["quad"]:getViewport() -- ./ldtk/ldtk.can:414
lg["setColor"](white) -- ./ldtk/ldtk.can:415
lg["draw"](self["tile"]["tileset"]["image"], self["tile"]["quad"], self["x"] - self["pivotX"], self["y"] - self["pivotY"], 0, self["width"] / w, self["height"] / h) -- ./ldtk/ldtk.can:416
else -- ./ldtk/ldtk.can:416
lg["setColor"](self["color"]) -- ./ldtk/ldtk.can:418
lg["rectangle"]("line", self["x"] - self["pivotX"], self["y"] - self["pivotY"], self["width"], self["height"]) -- ./ldtk/ldtk.can:419
end -- ./ldtk/ldtk.can:419
end -- ./ldtk/ldtk.can:419
} -- ./ldtk/ldtk.can:419
if e["__tile"] then -- ./ldtk/ldtk.can:423
local tileset = cache["tileset"](level["project"]["_tilesetData"][e["__tile"]["tilesetUid"]]) -- ./ldtk/ldtk.can:424
local srcRect = e["__tile"]["srcRect"] -- ./ldtk/ldtk.can:425
local quad = tileset:_newQuad(srcRect[1], srcRect[2], srcRect[3], srcRect[4]) -- ./ldtk/ldtk.can:426
entity["tile"] = { -- ./ldtk/ldtk.can:427
["tileset"] = tileset, -- ./ldtk/ldtk.can:428
["quad"] = quad -- ./ldtk/ldtk.can:429
} -- ./ldtk/ldtk.can:429
end -- ./ldtk/ldtk.can:429
table["insert"](t["entities"], entity) -- ./ldtk/ldtk.can:432
if onAddEntity then -- ./ldtk/ldtk.can:433
onAddEntity(entity) -- ./ldtk/ldtk.can:433
end -- ./ldtk/ldtk.can:433
end -- ./ldtk/ldtk.can:433
end -- ./ldtk/ldtk.can:433
return setmetatable(t, layer_mt) -- ./ldtk/ldtk.can:436
end -- ./ldtk/ldtk.can:436
} -- ./ldtk/ldtk.can:436
layer_mt["__index"] = layer_mt -- ./ldtk/ldtk.can:439
local level_mt -- ./ldtk/ldtk.can:448
level_mt = { -- ./ldtk/ldtk.can:448
["draw"] = function(self, x, y) -- ./ldtk/ldtk.can:459
if x == nil then x = 0 end -- ./ldtk/ldtk.can:459
if y == nil then y = 0 end -- ./ldtk/ldtk.can:459
assert(self["loaded"] == true, "level not loaded") -- ./ldtk/ldtk.can:460
lg["push"]() -- ./ldtk/ldtk.can:461
lg["translate"](x + self["x"], y + self["y"]) -- ./ldtk/ldtk.can:462
self:drawBackground() -- ./ldtk/ldtk.can:463
for _, l in ipairs(self["layers"]) do -- ./ldtk/ldtk.can:465
l:draw() -- ./ldtk/ldtk.can:466
end -- ./ldtk/ldtk.can:466
lg["pop"]() -- ./ldtk/ldtk.can:468
end, -- ./ldtk/ldtk.can:468
["drawBackground"] = function(self, x, y) -- ./ldtk/ldtk.can:479
if x == nil then x = 0 end -- ./ldtk/ldtk.can:479
if y == nil then y = 0 end -- ./ldtk/ldtk.can:479
assert(self["loaded"] == true, "level not loaded") -- ./ldtk/ldtk.can:480
lg["setColor"](self["background"]["color"]) -- ./ldtk/ldtk.can:482
lg["rectangle"]("fill", x, y, self["width"], self["height"]) -- ./ldtk/ldtk.can:483
lg["setColor"](white) -- ./ldtk/ldtk.can:485
local bgImage -- ./ldtk/ldtk.can:486
bgImage = self["background"]["image"] -- ./ldtk/ldtk.can:486
if bgImage then -- ./ldtk/ldtk.can:487
lg["draw"](bgImage["image"], bgImage["quad"], x + bgImage["x"], y + bgImage["y"], 0, bgImage["sx"], bgImage["sy"]) -- ./ldtk/ldtk.can:488
end -- ./ldtk/ldtk.can:488
end, -- ./ldtk/ldtk.can:488
["load"] = function(self, callbacks) -- ./ldtk/ldtk.can:506
if callbacks == nil then callbacks = {} end -- ./ldtk/ldtk.can:506
assert(self["loaded"] == false, "level already loaded") -- ./ldtk/ldtk.can:507
if self["_json"]["bgRelPath"] then -- ./ldtk/ldtk.can:508
local pos -- ./ldtk/ldtk.can:509
pos = self["_json"]["__bgPos"] -- ./ldtk/ldtk.can:509
local cropRect -- ./ldtk/ldtk.can:510
cropRect = pos["cropRect"] -- ./ldtk/ldtk.can:510
local image -- ./ldtk/ldtk.can:511
image = cache["image"](self["project"]["_directory"] .. self["_json"]["bgRelPath"]) -- ./ldtk/ldtk.can:511
self["background"]["image"] = { -- ./ldtk/ldtk.can:512
["image"] = image, -- ./ldtk/ldtk.can:513
["quad"] = newQuad(cropRect[1], cropRect[2], cropRect[3], cropRect[4], image), -- ./ldtk/ldtk.can:514
["x"] = pos["topLeftPx"][1], -- ./ldtk/ldtk.can:515
["y"] = pos["topLeftPx"][2], -- ./ldtk/ldtk.can:516
["sx"] = pos["scale"][1], -- ./ldtk/ldtk.can:517
["sy"] = pos["scale"][1] -- ./ldtk/ldtk.can:518
} -- ./ldtk/ldtk.can:518
end -- ./ldtk/ldtk.can:518
local layerInstances -- ./ldtk/ldtk.can:521
if self["_json"]["externalRelPath"] then -- ./ldtk/ldtk.can:522
layerInstances = readJson(self["project"]["_directory"] .. self["_json"]["externalRelPath"])["layerInstances"] -- ./ldtk/ldtk.can:523
else -- ./ldtk/ldtk.can:523
layerInstances = self["_json"]["layerInstances"] -- ./ldtk/ldtk.can:525
end -- ./ldtk/ldtk.can:525
self["layers"] = {} -- ./ldtk/ldtk.can:527
local onAddLayer -- ./ldtk/ldtk.can:528
onAddLayer = callbacks["onAddLayer"] -- ./ldtk/ldtk.can:528
for i = # layerInstances, 1, - 1 do -- ./ldtk/ldtk.can:529
local layer = layer_mt["_init"](layerInstances[i], self, i, callbacks) -- ./ldtk/ldtk.can:530
table["insert"](self["layers"], layer) -- ./ldtk/ldtk.can:531
if onAddLayer then -- ./ldtk/ldtk.can:532
onAddLayer(layer) -- ./ldtk/ldtk.can:532
end -- ./ldtk/ldtk.can:532
end -- ./ldtk/ldtk.can:532
self["loaded"] = true -- ./ldtk/ldtk.can:534
end, -- ./ldtk/ldtk.can:534
["unload"] = function(self, callbacks) -- ./ldtk/ldtk.can:547
if callbacks == nil then callbacks = {} end -- ./ldtk/ldtk.can:547
assert(self["loaded"] == true, "level not loaded") -- ./ldtk/ldtk.can:548
local onRemoveLayer -- ./ldtk/ldtk.can:549
onRemoveLayer = callbacks["onRemoveLayer"] -- ./ldtk/ldtk.can:549
for _, l in ipairs(self["layers"]) do -- ./ldtk/ldtk.can:550
l:_unloadCallbacks(callbacks) -- ./ldtk/ldtk.can:551
if onRemoveLayer then -- ./ldtk/ldtk.can:552
onRemoveLayer(l) -- ./ldtk/ldtk.can:552
end -- ./ldtk/ldtk.can:552
end -- ./ldtk/ldtk.can:552
self["loaded"] = false -- ./ldtk/ldtk.can:554
self["background"]["image"] = nil -- ./ldtk/ldtk.can:555
self["layers"] = nil -- ./ldtk/ldtk.can:556
end, -- ./ldtk/ldtk.can:556
["_init"] = function(level, project) -- ./ldtk/ldtk.can:559
local t -- ./ldtk/ldtk.can:560
t = { -- ./ldtk/ldtk.can:560
["project"] = project, -- ./ldtk/ldtk.can:563
["loaded"] = false, -- ./ldtk/ldtk.can:566
["identifier"] = level["identifier"], -- ./ldtk/ldtk.can:569
["x"] = level["worldX"], -- ./ldtk/ldtk.can:572
["y"] = level["worldY"], -- ./ldtk/ldtk.can:575
["width"] = level["pxWid"], -- ./ldtk/ldtk.can:578
["height"] = level["pxHei"], -- ./ldtk/ldtk.can:581
["fields"] = getFields(level["fieldInstances"]), -- ./ldtk/ldtk.can:584
["layers"] = nil, -- ./ldtk/ldtk.can:587
["background"] = { -- ./ldtk/ldtk.can:595
["color"] = parseColor(level["__bgColor"]), -- ./ldtk/ldtk.can:596
["image"] = nil -- ./ldtk/ldtk.can:597
}, -- ./ldtk/ldtk.can:597
["_json"] = level -- ./ldtk/ldtk.can:601
} -- ./ldtk/ldtk.can:601
return setmetatable(t, level_mt) -- ./ldtk/ldtk.can:603
end -- ./ldtk/ldtk.can:603
} -- ./ldtk/ldtk.can:603
level_mt["__index"] = level_mt -- ./ldtk/ldtk.can:606
local project_mt -- ./ldtk/ldtk.can:613
project_mt = { ["_init"] = function(project, directory) -- ./ldtk/ldtk.can:614
assert(project["jsonVersion"] == "0.9.3", ("the map was made with LDtk version %s but the importer is made for 0.9.3"):format(project["jsonVersion"])) -- ./ldtk/ldtk.can:615
local t -- ./ldtk/ldtk.can:616
t = { -- ./ldtk/ldtk.can:616
["levels"] = nil, -- ./ldtk/ldtk.can:619
["_directory"] = directory, -- ./ldtk/ldtk.can:622
["_layerDef"] = nil, -- ./ldtk/ldtk.can:623
["_tilesetData"] = nil, -- ./ldtk/ldtk.can:624
["_entityData"] = nil -- ./ldtk/ldtk.can:625
} -- ./ldtk/ldtk.can:625
t["levels"] = (function() -- ./ldtk/ldtk.can:627
local self = {} -- ./ldtk/ldtk.can:627
for _, lvl in ipairs(project["levels"]) do -- ./ldtk/ldtk.can:628
do -- ./ldtk/ldtk.can:629
local __CAN_a = table.pack(level_mt["_init"](lvl, t)) -- ./ldtk/ldtk.can:629
table.move(__CAN_a, 1, __CAN_a.n, #self+1, self) -- ./ldtk/ldtk.can:629
end -- ./ldtk/ldtk.can:629
end -- ./ldtk/ldtk.can:629
return self -- ./ldtk/ldtk.can:629
end)() -- ./ldtk/ldtk.can:629
t["_tilesetData"] = (function() -- ./ldtk/ldtk.can:632
local self = {} -- ./ldtk/ldtk.can:632
for _, ts in ipairs(project["defs"]["tilesets"]) do -- ./ldtk/ldtk.can:633
self[ts["uid"]] = { ["path"] = directory .. ts["relPath"] } -- ./ldtk/ldtk.can:635
local tilesetData = self[ts["uid"]] -- ./ldtk/ldtk.can:637
for gridx = 0, ts["__cWid"] - 1 do -- ./ldtk/ldtk.can:638
for gridy = 0, ts["__cHei"] - 1 do -- ./ldtk/ldtk.can:639
tilesetData[gridx + gridy * ts["__cWid"]] = { -- ./ldtk/ldtk.can:640
["tags"] = {}, -- ./ldtk/ldtk.can:641
["data"] = nil -- ./ldtk/ldtk.can:642
} -- ./ldtk/ldtk.can:642
end -- ./ldtk/ldtk.can:642
end -- ./ldtk/ldtk.can:642
for _, custom in ipairs(ts["customData"]) do -- ./ldtk/ldtk.can:646
tilesetData[custom["tileId"]]["data"] = custom["data"] -- ./ldtk/ldtk.can:647
end -- ./ldtk/ldtk.can:647
for _, tag in ipairs(ts["enumTags"]) do -- ./ldtk/ldtk.can:649
local value = tag["enumValueId"] -- ./ldtk/ldtk.can:650
for _, tileId in ipairs(tag["tileIds"]) do -- ./ldtk/ldtk.can:651
table["insert"](tilesetData[tileId]["tags"], value) -- ./ldtk/ldtk.can:652
tilesetData[tileId]["tags"][value] = true -- ./ldtk/ldtk.can:653
end -- ./ldtk/ldtk.can:653
end -- ./ldtk/ldtk.can:653
end -- ./ldtk/ldtk.can:653
return self -- ./ldtk/ldtk.can:653
end)() -- ./ldtk/ldtk.can:653
t["_layerDef"] = (function() -- ./ldtk/ldtk.can:658
local self = {} -- ./ldtk/ldtk.can:658
for _, lay in ipairs(project["defs"]["layers"]) do -- ./ldtk/ldtk.can:659
self[lay["uid"]] = { ["intGridValues"] = nil } -- ./ldtk/ldtk.can:661
local layerDef = self[lay["uid"]] -- ./ldtk/ldtk.can:663
if lay["__type"] == "IntGrid" then -- ./ldtk/ldtk.can:664
layerDef["intGridValues"] = (function() -- ./ldtk/ldtk.can:665
local self = {} -- ./ldtk/ldtk.can:665
for _, v in ipairs(lay["intGridValues"]) do -- ./ldtk/ldtk.can:666
self[v["value"]] = { -- ./ldtk/ldtk.can:667
["color"] = parseColor(v["color"]), -- ./ldtk/ldtk.can:668
["identifier"] = v["identifier"] -- ./ldtk/ldtk.can:669
} -- ./ldtk/ldtk.can:669
end -- ./ldtk/ldtk.can:669
return self -- ./ldtk/ldtk.can:669
end)() -- ./ldtk/ldtk.can:669
end -- ./ldtk/ldtk.can:669
end -- ./ldtk/ldtk.can:669
return self -- ./ldtk/ldtk.can:669
end)() -- ./ldtk/ldtk.can:669
t["_entityData"] = (function() -- ./ldtk/ldtk.can:676
local self = {} -- ./ldtk/ldtk.can:676
for _, ent in ipairs(project["defs"]["entities"]) do -- ./ldtk/ldtk.can:677
self[ent["uid"]] = { -- ./ldtk/ldtk.can:678
["color"] = parseColor(ent["color"]), -- ./ldtk/ldtk.can:679
["width"] = ent["width"], -- ./ldtk/ldtk.can:680
["height"] = ent["height"] -- ./ldtk/ldtk.can:681
} -- ./ldtk/ldtk.can:681
end -- ./ldtk/ldtk.can:681
return self -- ./ldtk/ldtk.can:681
end)() -- ./ldtk/ldtk.can:681
return setmetatable(t, project_mt) -- ./ldtk/ldtk.can:685
end } -- ./ldtk/ldtk.can:685
project_mt["__index"] = project_mt -- ./ldtk/ldtk.can:688
return function(file) -- ./ldtk/ldtk.can:719
return project_mt["_init"](readJson(file), file:match("^(.-)[^%/%\\]+$")) -- ./ldtk/ldtk.can:720
end -- ./ldtk/ldtk.can:720

36
make Executable file
View file

@ -0,0 +1,36 @@
#!/bin/sh
set -e
script="$(realpath $0)"
dir="$(dirname $0)"
cd "$dir"
case "$1" in
can)
canc $(find . -type f -iname '*.can')
;;
docs)
ldoc .
;;
clean)
rm -rf docs
for f in $(find . -type f -iname '*.can'); do
rm -f "${f%.can}.lua"
done
;;
all)
$script docs
$script can
;;
*)
echo "make all: build everything"
echo "make can: build Candran files into Lua files"
echo "make docs: build HTML documentation in docs/"
echo "make clean: remove built documentation & Lua files"
;;
esac

143
signal/signal.lua Normal file
View file

@ -0,0 +1,143 @@
local registry_mt -- ./signal/signal.can:13
registry_mt = { -- ./signal/signal.can:13
["signals"] = {}, -- ./signal/signal.can:16
["bind"] = function(self, name, fn, ...) -- ./signal/signal.can:22
if not self["signals"][name] then -- ./signal/signal.can:23
self["signals"][name] = {} -- ./signal/signal.can:24
end -- ./signal/signal.can:24
table["insert"](self["signals"][name], fn) -- ./signal/signal.can:26
if ... then -- ./signal/signal.can:27
self:bind(name, ...) -- ./signal/signal.can:28
end -- ./signal/signal.can:28
end, -- ./signal/signal.can:28
["unbind"] = function(self, name, fn, ...) -- ./signal/signal.can:36
if not self["signals"][name] then -- ./signal/signal.can:37
return -- ./signal/signal.can:38
end -- ./signal/signal.can:38
for i = # self["signals"][name], 1, - 1 do -- ./signal/signal.can:40
if self["signals"][name] == fn then -- ./signal/signal.can:41
table["remove"](self["signals"][name], i) -- ./signal/signal.can:42
end -- ./signal/signal.can:42
end -- ./signal/signal.can:42
if ... then -- ./signal/signal.can:45
self:unbind(name, ...) -- ./signal/signal.can:46
end -- ./signal/signal.can:46
end, -- ./signal/signal.can:46
["unbindAll"] = function(self, name) -- ./signal/signal.can:52
self["signals"][name] = nil -- ./signal/signal.can:53
end, -- ./signal/signal.can:53
["replace"] = function(self, name, sourceFn, destFn) -- ./signal/signal.can:60
if not self["signals"][name] then -- ./signal/signal.can:61
self["signals"][name] = {} -- ./signal/signal.can:62
end -- ./signal/signal.can:62
for i, fn in ipairs(self["signals"][name]) do -- ./signal/signal.can:64
if fn == sourceFn then -- ./signal/signal.can:65
self["signals"][name][i] = destFn -- ./signal/signal.can:66
break -- ./signal/signal.can:67
end -- ./signal/signal.can:67
end -- ./signal/signal.can:67
end, -- ./signal/signal.can:67
["clear"] = function(self) -- ./signal/signal.can:73
self["signals"] = {} -- ./signal/signal.can:74
end, -- ./signal/signal.can:74
["emit"] = function(self, name, ...) -- ./signal/signal.can:80
if self["signals"][name] then -- ./signal/signal.can:81
for _, fn in ipairs(self["signals"][name]) do -- ./signal/signal.can:82
fn(...) -- ./signal/signal.can:83
end -- ./signal/signal.can:83
end -- ./signal/signal.can:83
end -- ./signal/signal.can:83
} -- ./signal/signal.can:83
registry_mt["__index"] = registry_mt -- ./signal/signal.can:88
local signal -- ./signal/signal.can:96
signal = { -- ./signal/signal.can:96
["new"] = function() -- ./signal/signal.can:99
return setmetatable({ ["signals"] = {} }, registry_mt) -- ./signal/signal.can:100
end, -- ./signal/signal.can:100
["signals"] = {}, -- ./signal/signal.can:104
["bind"] = function(...) -- ./signal/signal.can:105
return registry_mt["bind"](signal, ...) -- ./signal/signal.can:106
end, -- ./signal/signal.can:106
["unbind"] = function(...) -- ./signal/signal.can:108
return registry_mt["unbind"](signal, ...) -- ./signal/signal.can:109
end, -- ./signal/signal.can:109
["unbindAll"] = function(...) -- ./signal/signal.can:111
return registry_mt["unbindAll"](signal, ...) -- ./signal/signal.can:112
end, -- ./signal/signal.can:112
["replace"] = function(...) -- ./signal/signal.can:114
return registry_mt["replace"](signal, ...) -- ./signal/signal.can:115
end, -- ./signal/signal.can:115
["clear"] = function(...) -- ./signal/signal.can:117
return registry_mt["clear"](signal, ...) -- ./signal/signal.can:118
end, -- ./signal/signal.can:118
["emit"] = function(...) -- ./signal/signal.can:120
return registry_mt["emit"](signal, ...) -- ./signal/signal.can:121
end, -- ./signal/signal.can:121
["event"] = nil, -- ./signal/signal.can:136
["registerEvents"] = function() -- ./signal/signal.can:141
local callbacks = { -- ./signal/signal.can:142
"displayrotated", -- ./signal/signal.can:143
"draw", -- ./signal/signal.can:143
"load", -- ./signal/signal.can:143
"lowmemory", -- ./signal/signal.can:143
"quit", -- ./signal/signal.can:143
"update", -- ./signal/signal.can:143
"directorydropped", -- ./signal/signal.can:144
"filedropped", -- ./signal/signal.can:144
"focus", -- ./signal/signal.can:144
"mousefocus", -- ./signal/signal.can:144
"resize", -- ./signal/signal.can:144
"visible", -- ./signal/signal.can:144
"keypressed", -- ./signal/signal.can:145
"keyreleased", -- ./signal/signal.can:145
"textedited", -- ./signal/signal.can:145
"textinput", -- ./signal/signal.can:145
"mousemoved", -- ./signal/signal.can:146
"mousepressed", -- ./signal/signal.can:146
"mousereleased", -- ./signal/signal.can:146
"wheelmoved", -- ./signal/signal.can:146
"gamepadaxis", -- ./signal/signal.can:147
"gamepadpressed", -- ./signal/signal.can:147
"gamepadreleased", -- ./signal/signal.can:147
"joystickadded", -- ./signal/signal.can:148
"joystickaxis", -- ./signal/signal.can:148
"joystickhat", -- ./signal/signal.can:148
"joystickpressed", -- ./signal/signal.can:148
"joystickreleased", -- ./signal/signal.can:148
"joystickremoved", -- ./signal/signal.can:148
"touchmoved", -- ./signal/signal.can:149
"touchpressed", -- ./signal/signal.can:149
"touchreleased" -- ./signal/signal.can:149
} -- ./signal/signal.can:149
local event = signal["event"] -- ./signal/signal.can:151
for _, callback in ipairs(callbacks) do -- ./signal/signal.can:152
if callback == "update" then -- ./signal/signal.can:153
if love[callback] then -- ./signal/signal.can:154
local old = love[callback] -- ./signal/signal.can:155
love[callback] = function(dt) -- ./signal/signal.can:156
old(dt) -- ./signal/signal.can:157
event:emit(callback, dt) -- ./signal/signal.can:158
end -- ./signal/signal.can:158
else -- ./signal/signal.can:158
love[callback] = function(dt) -- ./signal/signal.can:161
event:emit(callback, dt) -- ./signal/signal.can:162
end -- ./signal/signal.can:162
end -- ./signal/signal.can:162
else -- ./signal/signal.can:162
if love[callback] then -- ./signal/signal.can:166
local old = love[callback] -- ./signal/signal.can:167
love[callback] = function(...) -- ./signal/signal.can:168
old(...) -- ./signal/signal.can:169
event:emit(callback, ...) -- ./signal/signal.can:170
end -- ./signal/signal.can:170
else -- ./signal/signal.can:170
love[callback] = function(...) -- ./signal/signal.can:173
event:emit(callback, ...) -- ./signal/signal.can:174
end -- ./signal/signal.can:174
end -- ./signal/signal.can:174
end -- ./signal/signal.can:174
end -- ./signal/signal.can:174
end -- ./signal/signal.can:174
} -- ./signal/signal.can:174
signal["event"] = signal["new"]() -- ./signal/signal.can:182
return signal -- ./signal/signal.can:184