1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-12 10:04:40 +02:00
RedMew/features/turret_active_delay.lua
RedRafe 26e1c28dc0
Factorio 2.0 update (#1436)
* Init Factorio 2.0 update

* add credits

* fix test module

* I know luackeck, I know

* Fixes

* Fix bad event.player_index handling

* Hotfixes

* Remove all filter inserters

* Migrate removed items

* Deprecating spidertron control and landfill features
2024-10-22 20:22:35 +01:00

108 lines
2.6 KiB
Lua

local Event = require 'utils.event'
local Task = require 'utils.task'
local Token = require 'utils.token'
local Global = require 'utils.global'
local config = require 'config'
local turret_types = config.turret_active_delay.turret_types
local techs = config.turret_active_delay.techs
local tau = 2 * math.pi
local start_angle = -tau / 4
local update_rate = 4 -- ticks between updates
local time_to_live = update_rate + 1
local draw_arc = rendering.draw_arc
local set_timeout_in_ticks = Task.set_timeout_in_ticks
Global.register(
turret_types,
function(tbl)
turret_types = tbl
end
)
local entity_built_callback
entity_built_callback =
Token.register(
function(data)
local entity = data.entity
if not entity.valid then
return
end
if entity.health == 0 then
entity.active = true
entity.die('neutral')
return
end
local tick = data.tick
local now = game.tick
if now >= tick then
entity.active = true
return
end
local fraction = ((now - tick) / data.delay) + 1
draw_arc(
{
color = {1 - fraction, fraction, 0},
max_radius = 0.5,
min_radius = 0.4,
start_angle = start_angle,
angle = fraction * tau,
target = entity,
surface = entity.surface,
time_to_live = time_to_live
}
)
set_timeout_in_ticks(update_rate, entity_built_callback, data)
end
)
local function entity_built(event)
local entity = event.entity
if not entity.valid then
return
end
local delay = turret_types[entity.type]
if not delay or delay <= 0 then
return
end
entity.active = false
set_timeout_in_ticks(
update_rate,
entity_built_callback,
{entity = entity, tick = event.tick + delay, delay = delay}
)
end
local function research_finished(event)
local research = event.research
local name = research.name:gsub('%-%d', '')
local data = techs[name]
if not data then
return
end
for _, turret_data in pairs(data) do
local turret_type = turret_data.turret_type
local amount = turret_data.amount
local old = turret_types[turret_type]
turret_types[turret_type] = math.max(old - amount, 0)
end
end
Event.add(defines.events.on_built_entity, entity_built)
Event.add(defines.events.on_robot_built_entity, entity_built)
Event.add(defines.events.on_research_finished, research_finished)