mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-12 10:04:40 +02:00
81 lines
2.4 KiB
Lua
81 lines
2.4 KiB
Lua
-- Cut off a limb, and two more shall take its place!
|
|
local Event = require 'utils.event'
|
|
local CreateParticles = require 'features.create_particles'
|
|
local random = math.random
|
|
local floor = math.floor
|
|
local ceil = math.ceil
|
|
local pairs = pairs
|
|
local compound = defines.command.compound
|
|
local logical_or = defines.compound_command.logical_or
|
|
local attack = defines.command.attack
|
|
local attack_area = defines.command.attack_area
|
|
local config = global.config.hail_hydra
|
|
local evolution_scale = config.evolution_scale
|
|
local hydras = config.hydras
|
|
|
|
local function create_attack_command(position, target)
|
|
local command = {type = attack_area, destination = position, radius = 10}
|
|
if target then
|
|
command = {type = compound, structure_type = logical_or, commands = {
|
|
{type = attack, target = target},
|
|
command,
|
|
}}
|
|
end
|
|
|
|
return command
|
|
end
|
|
|
|
|
|
Event.add(defines.events.on_entity_died, function (event)
|
|
local entity = event.entity
|
|
local name = entity.name
|
|
|
|
local hydra = hydras[name]
|
|
if not hydra then
|
|
return
|
|
end
|
|
|
|
local position = entity.position
|
|
local force = entity.force
|
|
local evolution_factor = force.evolution_factor * evolution_scale
|
|
local cause = event.cause
|
|
|
|
local surface = entity.surface
|
|
local create_entity = surface.create_entity
|
|
local find_non_colliding_position = surface.find_non_colliding_position
|
|
|
|
local command = create_attack_command(position, cause)
|
|
|
|
for hydra_spawn, amount in pairs(hydra) do
|
|
amount = amount + evolution_factor
|
|
|
|
local extra_chance = amount % 1
|
|
if extra_chance > 0 then
|
|
if random() <= extra_chance then
|
|
amount = ceil(amount)
|
|
else
|
|
amount = floor(amount)
|
|
end
|
|
end
|
|
local particle_count
|
|
|
|
if amount > 4 then
|
|
particle_count = 60
|
|
else
|
|
particle_count = amount * 15
|
|
end
|
|
|
|
CreateParticles.blood_explosion(create_entity, particle_count, position)
|
|
|
|
for _ = amount, 1, -1 do
|
|
position = find_non_colliding_position(hydra_spawn, position, 2, 0.4) or position
|
|
local spawned = create_entity({name = hydra_spawn, force = force, position = position})
|
|
if spawned and spawned.type == 'unit' then
|
|
spawned.set_command(command)
|
|
elseif spawned and cause then
|
|
spawned.shooting_target = cause
|
|
end
|
|
end
|
|
end
|
|
end)
|