mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-01-08 00:39:30 +02:00
104 lines
4.1 KiB
Lua
104 lines
4.1 KiB
Lua
|
local math_random = math.random
|
||
|
|
||
|
local Global = require 'utils.global'
|
||
|
local tick_schedule = {}
|
||
|
Global.register(
|
||
|
tick_schedule,
|
||
|
function(t)
|
||
|
tick_schedule = t
|
||
|
end
|
||
|
)
|
||
|
|
||
|
local death_animation_ticks = 120
|
||
|
local decay_ticks = 2
|
||
|
|
||
|
local worms = {
|
||
|
["small-worm-turret"] = { corpse="small-worm-corpse", patch_size = { min=30000, max=90000} },
|
||
|
["medium-worm-turret"] = { corpse="medium-worm-corpse", patch_size = { min=60000, max=120000 } },
|
||
|
["big-worm-turret"] = { corpse="big-worm-corpse", patch_size = { min=90000, max=300000 } },
|
||
|
["behemoth-worm-turret"] = { corpse="behemoth-worm-corpse", patch_size = { min=120000, max=600000 } }
|
||
|
}
|
||
|
|
||
|
local function destroy_worm(name, position, surface)
|
||
|
local entity = surface.find_entity(name, position)
|
||
|
if entity ~= nil and entity.valid then entity.destroy() end
|
||
|
local corpse = worms[name].corpse
|
||
|
local remains = surface.find_entity(corpse, position)
|
||
|
if remains ~= nil and remains.valid then
|
||
|
-- show an animation
|
||
|
if math_random(1,40) == 1 then surface.create_entity({name = "explosion", position = {x = position.x + (3 - (math_random(1,60) * 0.1)), y = position.y + (3 - (math_random(1,60) * 0.1))}}) end
|
||
|
if math_random(1,32) == 1 then surface.create_entity({name = "blood-explosion-huge", position = position}) end
|
||
|
if math_random(1,16) == 1 then surface.create_entity({name = "blood-explosion-big", position = position}) end
|
||
|
if math_random(1,8) == 1 then surface.create_entity({name = "blood-explosion-small", position = position}) end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function remove_corpse(name, position, surface)
|
||
|
local corpse = worms[name].corpse
|
||
|
local remains = surface.find_entity(corpse, position)
|
||
|
if remains ~= nil and remains.valid then remains.destroy() end
|
||
|
end
|
||
|
|
||
|
-- place an oil patch at the worm location
|
||
|
local function create_oil_patch(name, position, surface)
|
||
|
local min = worms[name].patch_size.min
|
||
|
local max = worms[name].patch_size.max
|
||
|
surface.create_entity({name="crude-oil", position=position, amount=math_random(min,max)})
|
||
|
end
|
||
|
|
||
|
-- worms create oil patches when killed
|
||
|
local function process_worm(entity)
|
||
|
local name = entity.name
|
||
|
local position = entity.position
|
||
|
local surface = entity.surface
|
||
|
|
||
|
local tick1 = game.tick + death_animation_ticks
|
||
|
if not tick_schedule[tick1] then tick_schedule[tick1] = {} end
|
||
|
tick_schedule[tick1][#tick_schedule[tick1] + 1] = {
|
||
|
callback = 'destroy_worm',
|
||
|
params = {name, position, surface}
|
||
|
}
|
||
|
local tick2 = game.tick + death_animation_ticks + decay_ticks
|
||
|
if not tick_schedule[tick2] then tick_schedule[tick2] = {} end
|
||
|
tick_schedule[tick2][#tick_schedule[tick2] + 1] = {
|
||
|
callback = 'remove_corpse',
|
||
|
params = {name, position, surface}
|
||
|
}
|
||
|
if math_random(1,4) == 1 then
|
||
|
local tick3 = game.tick + death_animation_ticks + decay_ticks + 1
|
||
|
if not tick_schedule[tick3] then tick_schedule[tick3] = {} end
|
||
|
tick_schedule[tick3][#tick_schedule[tick3] + 1] = {
|
||
|
callback = 'create_oil_patch',
|
||
|
params = {name, position, surface}
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function on_entity_died(event)
|
||
|
local entity = event.entity
|
||
|
local test = {
|
||
|
["small-worm-turret"] = true,
|
||
|
["medium-worm-turret"] = true,
|
||
|
["big-worm-turret"] = true,
|
||
|
["behemoth-worm-turret"] = true
|
||
|
}
|
||
|
if test[entity.name] ~= nil then
|
||
|
process_worm(entity)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function on_tick()
|
||
|
if not tick_schedule[game.tick] then return end
|
||
|
for _, token in pairs(tick_schedule[game.tick]) do
|
||
|
local callback = token.callback
|
||
|
local params = token.params
|
||
|
if callback == 'destroy_worm' then destroy_worm(params[1], params[2], params[3]) end
|
||
|
if callback == 'remove_corpse' then remove_corpse(params[1], params[2], params[3]) end
|
||
|
if callback == 'create_oil_patch' then create_oil_patch(params[1], params[2], params[3]) end
|
||
|
end
|
||
|
tick_schedule[game.tick] = nil
|
||
|
end
|
||
|
|
||
|
local Event = require 'utils.event'
|
||
|
Event.add(defines.events.on_tick, on_tick)
|
||
|
Event.add(defines.events.on_entity_died, on_entity_died)
|