doukutsu-rs/src/scripting/boot.lua

91 lines
2.1 KiB
Lua

doukutsu = {}
doukutsu._registered = {
tick = {},
}
doukutsu._handlers = setmetatable({
tick = function(scene)
for _, h in pairs(doukutsu._registered.tick) do
pcall(h, scene)
end
end,
}, {
__index = function(self, event)
error("Unknown event: " .. event)
end,
})
doukutsu._initializeScript = function(script)
-- for compatibility with Lua 5.2+, copy-pasted from Lua mailing list
-- http://lua-users.org/lists/lua-l/2010-06/msg00313.html
local _setfenv = setfenv or function(f, t)
f = (type(f) == 'function' and f or debug.getinfo(f + 1, 'f').func)
local name
local up = 0
repeat
up = up + 1
name = debug.getupvalue(f, up)
until name == '_ENV' or name == nil
if name then
debug.upvaluejoin(f, up, function()
return name
end, 1)
debug.setupvalue(f, up, t)
end
end
global_copy = {}
for k, v in pairs(_G) do
global_copy[k] = v
end
_setfenv(script, global_copy)
script()
end
doukutsu.playSfx = function(id)
__doukutsu:playSfx(id)
end
doukutsu.playSong = function(id)
__doukutsu:playSong(id)
end
doukutsu.on = function(event, handler)
assert(type(event) == "string", "event type must be a string.")
assert(type(handler) == "function", "event handler must be a function.")
if doukutsu._registered[event] == nil then
error("Unknown event: " .. event)
end
table.insert(doukutsu._registered[event], handler)
return handler
end
doukutsu.removeHandler = function(event, handler)
assert(type(event) == "string", "event type must be a string.")
assert(type(handler) == "function", "event handler must be a function.")
if doukutsu._registered[event] == nil then
error("Unknown event: " .. event)
end
local index = -1
for i, h in pairs(doukutsu._registered[event]) do
if handler == h then
index = i
break
end
end
if index ~= -1 then
table.remove(doukutsu._registered[event], index)
end
return handler
end