Browse Source
1. `Events` global is replaced with `require('devilutionx.events')`.
2. Table is simplified and documented.
3. `On` removed from the event names as it was a bit redundant.
4. Functions are camelCase for consistency (e.g. `add` instead of
`Add`).
Example script:
```lua
local events = require("devilutionx.events")
local render = require("devilutionx.render")
local message = require("devilutionx.message")
local function greet()
message("Hello from " .. _VERSION)
print("Hello from ", _VERSION)
end
events.GameStart.add(greet)
local function drawGreet()
render.string("Hello from " .. _VERSION, 10, 40)
end
events.GameDrawComplete.add(drawGreet)
```
pull/6792/head
7 changed files with 81 additions and 39 deletions
@ -0,0 +1,65 @@ |
|||||||
|
local function CreateEvent() |
||||||
|
local functions = {} |
||||||
|
return { |
||||||
|
---Adds an event handler. |
||||||
|
--- |
||||||
|
---The handler called every time an event is triggered. |
||||||
|
---@param func function |
||||||
|
add = function(func) |
||||||
|
table.insert(functions, func) |
||||||
|
end, |
||||||
|
|
||||||
|
---Removes the event handler. |
||||||
|
---@param func function |
||||||
|
remove = function(func) |
||||||
|
for i, f in ipairs(functions) do |
||||||
|
if f == func then |
||||||
|
table.remove(functions, i) |
||||||
|
break |
||||||
|
end |
||||||
|
end |
||||||
|
end, |
||||||
|
|
||||||
|
---Triggers an event. |
||||||
|
--- |
||||||
|
---The arguments are forwarded to handlers. |
||||||
|
---@param ... any |
||||||
|
trigger = function(...) |
||||||
|
if arg ~= nil then |
||||||
|
for _, func in ipairs(functions) do |
||||||
|
func(table.unpack(arg)) |
||||||
|
end |
||||||
|
else |
||||||
|
for _, func in ipairs(functions) do |
||||||
|
func() |
||||||
|
end |
||||||
|
end |
||||||
|
end, |
||||||
|
__sig_trigger = "(...)", |
||||||
|
} |
||||||
|
end |
||||||
|
|
||||||
|
local events = { |
||||||
|
---Called early on game boot. |
||||||
|
GameBoot = CreateEvent(), |
||||||
|
__doc_GameBoot = "Called early on game boot.", |
||||||
|
|
||||||
|
---Called every time a new game is started. |
||||||
|
GameStart = CreateEvent(), |
||||||
|
__doc_GameStart = "Called every time a new game is started.", |
||||||
|
|
||||||
|
---Called every frame at the end. |
||||||
|
GameDrawComplete = CreateEvent(), |
||||||
|
__doc_GameDrawComplete = "Called every frame at the end.", |
||||||
|
} |
||||||
|
|
||||||
|
---Registers a custom event type with the given name. |
||||||
|
---@param name string |
||||||
|
function events.registerCustom(name) |
||||||
|
events[name] = CreateEvent() |
||||||
|
end |
||||||
|
|
||||||
|
events.__sig_registerCustom = "(name: string)" |
||||||
|
events.__doc_registerCustom = "Register a custom event type." |
||||||
|
|
||||||
|
return events |
||||||
@ -1,25 +0,0 @@ |
|||||||
function Events:RegisterEvent(eventName) |
|
||||||
self[eventName] = { |
|
||||||
Functions = {}, |
|
||||||
Add = function(func) |
|
||||||
table.insert(self[eventName].Functions, func) |
|
||||||
end, |
|
||||||
Remove = function(func) |
|
||||||
for i, f in ipairs(self[eventName].Functions) do |
|
||||||
if f == func then |
|
||||||
table.remove(self[eventName].Functions, i) |
|
||||||
break |
|
||||||
end |
|
||||||
end |
|
||||||
end, |
|
||||||
Trigger = function() |
|
||||||
for _, func in ipairs(self[eventName].Functions) do |
|
||||||
func() |
|
||||||
end |
|
||||||
end, |
|
||||||
} |
|
||||||
end |
|
||||||
|
|
||||||
Events:RegisterEvent("OnGameBoot") |
|
||||||
Events:RegisterEvent("OnGameStart") |
|
||||||
Events:RegisterEvent("OnGameDrawComplete") |
|
||||||
Loading…
Reference in new issue