mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-28 23:06:38 +02:00
113 lines
2.4 KiB
Lua
113 lines
2.4 KiB
Lua
local Global = require 'utils.global'
|
|
local Token = require 'utils.token'
|
|
|
|
local this = {
|
|
timers = {}
|
|
}
|
|
|
|
Global.register(
|
|
this,
|
|
function(tbl)
|
|
this = tbl
|
|
end
|
|
)
|
|
|
|
local Public = {}
|
|
|
|
--[[
|
|
set_timer - Sets a timer.
|
|
@param time_left - Time time_left on the timer in ticks.
|
|
@param hook - Action executed after timer is elapsed.
|
|
--]]
|
|
Public.set_timer = function(time_left, hook)
|
|
local id = game.tick
|
|
local entry = {
|
|
time_left = time_left,
|
|
hook_finish = hook,
|
|
hook_update = nil,
|
|
deps = nil,
|
|
running = false,
|
|
last_update = 0
|
|
}
|
|
|
|
this.timers[id] = entry
|
|
return id
|
|
end
|
|
|
|
--[[
|
|
set_timer_on_update - Adds a hook that is executed everytime a
|
|
timers is updated.
|
|
@param id - Id of the timer.
|
|
@param hook - Hook that will be executed per update.
|
|
--]]
|
|
Public.set_timer_on_update = function(id, hook)
|
|
this.timers[id].hook_update = hook
|
|
end
|
|
|
|
--[[
|
|
set_timer_dependency - Adds dependency into user callback.
|
|
@param id - Id of the timer,
|
|
@param deps - Dependency of timer to add.
|
|
--]]
|
|
Public.set_timer_dependency = function(id, deps)
|
|
this.timers[id].deps = deps
|
|
end
|
|
|
|
--[[
|
|
set_timer_start - Sets the timer to run.
|
|
@param id - Id of a timer.
|
|
--]]
|
|
Public.set_timer_start = function(id)
|
|
this.timers[id].running = true
|
|
this.timers[id].last_update = game.tick
|
|
end
|
|
|
|
--[[
|
|
kill_timer - Effectivly kills the timer.
|
|
@param id - Timer id.
|
|
--]]
|
|
Public.kill_timer = function(id)
|
|
this.timers[id] = nil
|
|
end
|
|
|
|
--[[
|
|
do_job - Execute timer logic within a tick.
|
|
--]]
|
|
Public.do_job = function()
|
|
for id, entry in pairs(this.timers) do
|
|
if entry.running == false then
|
|
goto continue
|
|
end
|
|
|
|
entry.time_left = entry.time_left - (game.tick - entry.last_update)
|
|
if entry.time_left > 0 then
|
|
entry.last_update = game.tick
|
|
|
|
if entry.hook_update ~= nil then
|
|
local func = Token.get(entry.hook_update)
|
|
local data = entry.deps
|
|
data.time_left = entry.time_left
|
|
if func then
|
|
if not func(data) then
|
|
goto premature_finish
|
|
end
|
|
end
|
|
end
|
|
|
|
goto continue
|
|
end
|
|
|
|
::premature_finish::
|
|
local func = Token.get(entry.hook_finish)
|
|
local data = entry.deps
|
|
if func then
|
|
func(data)
|
|
end
|
|
this.timers[id] = nil
|
|
|
|
::continue::
|
|
end
|
|
end
|
|
|
|
return Public
|