2018-11-29 20:11:12 +02:00
|
|
|
local Task = require 'utils.Task'
|
|
|
|
local Token = require 'utils.token'
|
2018-11-23 23:04:55 +02:00
|
|
|
local random = math.random
|
|
|
|
|
|
|
|
local CreateParticles = {}
|
|
|
|
|
2018-11-29 20:11:12 +02:00
|
|
|
local on_play_particle = Token.register(function (params)
|
|
|
|
params.surface.create_entity(params.prototype)
|
|
|
|
end)
|
|
|
|
|
|
|
|
local function play_particle_sequence(surface, sequences)
|
|
|
|
local create_entity = surface.create_entity
|
|
|
|
for i = 1, #sequences do
|
|
|
|
local sequence = sequences[i]
|
|
|
|
local frame = sequence.frame
|
|
|
|
if frame == 1 then
|
|
|
|
create_entity(sequence.prototype)
|
|
|
|
else
|
|
|
|
Task.set_timeout_in_ticks(frame, on_play_particle, {surface = surface, prototype = sequence.prototype})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-11-23 23:04:55 +02:00
|
|
|
---@param create_entity function a reference to a surface.create_entity
|
|
|
|
---@param particle_count number particle count to spawn
|
|
|
|
---@param position Position
|
|
|
|
function CreateParticles.destroy_rock(create_entity, particle_count, position)
|
|
|
|
for _ = particle_count, 1, -1 do
|
|
|
|
create_entity({
|
|
|
|
position = position,
|
|
|
|
name = 'stone-particle',
|
|
|
|
movement = {random(-5, 5) * 0.01, random(-5, 5) * 0.01},
|
|
|
|
frame_speed = 1,
|
|
|
|
vertical_speed = random(12, 14) * 0.01,
|
|
|
|
height = random(9, 11) * 0.1,
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
---@param create_entity function a reference to a surface.create_entity
|
|
|
|
---@param particle_count number particle count to spawn
|
|
|
|
---@param position Position
|
|
|
|
function CreateParticles.mine_rock(create_entity, particle_count, position)
|
|
|
|
for _ = particle_count, 1, -1 do
|
|
|
|
create_entity({
|
|
|
|
position = position,
|
|
|
|
name = 'stone-particle',
|
|
|
|
movement = {random(-5, 5) * 0.01, random(-5, 5) * 0.01},
|
|
|
|
frame_speed = 1,
|
|
|
|
vertical_speed = random(8, 10) * 0.01,
|
|
|
|
height = random(5, 8) * 0.1,
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-11-29 20:11:12 +02:00
|
|
|
|
|
|
|
---Creates a prototype for LuaSurface.create_entity
|
|
|
|
---@param particle string name of the particle
|
|
|
|
---@param x number
|
|
|
|
---@param y number
|
|
|
|
local function create_ceiling_prototype(particle, x, y)
|
|
|
|
return {
|
|
|
|
name = particle,
|
|
|
|
position = {x = x + random(0, 1), y = y + random(0, 1)},
|
|
|
|
movement = {random(-5, 5) * 0.002, random(-5, 5) * 0.002},
|
|
|
|
frame_speed = 1,
|
|
|
|
vertical_speed = 0,
|
|
|
|
height = 3
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
---Creates a crumbling effect from the ceiling
|
|
|
|
---@param surface LuaSurface
|
|
|
|
---@param position table
|
|
|
|
function CreateParticles.ceiling_crumble(surface, position)
|
|
|
|
local sequences = {}
|
|
|
|
local x = position.x
|
|
|
|
local y = position.y
|
|
|
|
|
|
|
|
for i = 1, 2 do
|
|
|
|
sequences[i] = {frame = i*random(1,15), prototype = create_ceiling_prototype('explosion-remnants-particle', x, y)}
|
|
|
|
end
|
|
|
|
for i = 3, 6 do
|
|
|
|
sequences[i] = {frame = i*random(1,15), prototype = create_ceiling_prototype('stone-particle', x, y)}
|
|
|
|
end
|
|
|
|
|
|
|
|
play_particle_sequence(surface, sequences)
|
|
|
|
end
|
|
|
|
|
2018-11-23 23:04:55 +02:00
|
|
|
return CreateParticles
|