1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-30 23:17:53 +02:00
ComfyFactorio/modules/area_unlocked_on_rotated_entity.lua
2021-03-24 20:14:55 +01:00

108 lines
4.0 KiB
Lua

--luacheck: ignore
--unlocks areas when the entity at the position is rotated
--define the entities by position like this:
-- global.level_unlocks = {
-- ["x:0.5 y:0.5"] = {left_top = {x = 0,y = 0}, right_bottom = {x = 50, y = 50}, tile = "dirt-4", unlocked = false},
-- ["x:0.5 y:1.5"] = {left_top = {x = 0,y = 0}, right_bottom = {x = 50, y = 50}, tile = "grass-2", unlocked = false}
-- }
local event = require 'utils.event'
local math_random = math.random
local function shuffle(tbl)
local size = #tbl
for i = size, 1, -1 do
local rand = math_random(size)
tbl[i], tbl[rand] = tbl[rand], tbl[i]
end
return tbl
end
local particles = {'coal-particle', 'copper-ore-particle', 'iron-ore-particle', 'stone-particle'}
local function create_particles(surface, position)
local particle = particles[math_random(1, #particles)]
local m = math_random(10, 30)
local m2 = m * 0.005
for i = 1, 75, 1 do
surface.create_entity(
{
name = particle,
position = position,
frame_speed = 0.1,
vertical_speed = 0.1,
height = 0.1,
movement = {m2 - (math_random(0, m) * 0.01), m2 - (math_random(0, m) * 0.01)}
}
)
end
end
local function on_player_rotated_entity(event)
if not global.level_unlocks then
return
end
local position_string = 'x:' .. tostring(event.entity.position.x)
position_string = position_string .. ' y:'
position_string = position_string .. tostring(event.entity.position.y)
if not global.level_unlocks[position_string] then
return
end
if global.level_unlocks[position_string].unlocked then
return
end
global.level_unlocks[position_string].unlocked = true
if not global.area_tiles_unlock_schedule then
global.area_tiles_unlock_schedule = {}
end
local level_unlocked = 0
for _, level in pairs(global.level_unlocks) do
if level.unlocked == true then
level_unlocked = level_unlocked + 1
end
end
game.print(game.players[event.player_index].name .. ' unlocked the path to Chapter ' .. tostring(level_unlocked) .. '!')
for x = global.level_unlocks[position_string].left_top.x, global.level_unlocks[position_string].right_bottom.x, 1 do
for y = global.level_unlocks[position_string].left_top.y, global.level_unlocks[position_string].right_bottom.y, 1 do
global.area_tiles_unlock_schedule[#global.area_tiles_unlock_schedule + 1] = {
surface = event.entity.surface,
tile = {
name = global.level_unlocks[position_string].tile,
position = {x = event.entity.position.x + x, y = event.entity.position.y + y}
}
}
end
end
global.area_tiles_unlock_schedule = shuffle(global.area_tiles_unlock_schedule)
for _, player in pairs(game.connected_players) do
player.play_sound {path = 'utility/new_objective', volume_modifier = 0.4}
end
end
local function on_tick(event)
if not global.area_tiles_unlock_schedule then
return
end
global.area_tiles_unlock_schedule[#global.area_tiles_unlock_schedule].surface.set_tiles({global.area_tiles_unlock_schedule[#global.area_tiles_unlock_schedule].tile}, true)
create_particles(
global.area_tiles_unlock_schedule[#global.area_tiles_unlock_schedule].surface,
global.area_tiles_unlock_schedule[#global.area_tiles_unlock_schedule].tile.position
)
global.area_tiles_unlock_schedule[#global.area_tiles_unlock_schedule] = nil
if #global.area_tiles_unlock_schedule == 0 then
global.area_tiles_unlock_schedule = nil
end
end
event.add(defines.events.on_tick, on_tick)
event.add(defines.events.on_player_rotated_entity, on_player_rotated_entity)
--global.area_tiles_unlock_schedule[#global.area_tiles_unlock_schedule].surface.create_entity({name = "blood-explosion-huge", position = global.area_tiles_unlock_schedule[#global.area_tiles_unlock_schedule].tile.position})