mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-12 10:04:40 +02:00
optimized collapse: collapses now happen every 80 ticks
This commit is contained in:
parent
ba739a8563
commit
5c6f92a5bc
@ -48,15 +48,19 @@ local stress_threshold_causing_collapse = 0.9
|
||||
local deconstruction_alert_message_shown = {}
|
||||
local stress_map_storage = {}
|
||||
local new_tile_map = {}
|
||||
local collapse_positions_storage = {}
|
||||
|
||||
|
||||
Global.register({
|
||||
new_tile_map = new_tile_map,
|
||||
stress_map_storage = stress_map_storage,
|
||||
deconstruction_alert_message_shown = deconstruction_alert_message_shown,
|
||||
collapse_positions_storage = collapse_positions_storage,
|
||||
}, function(tbl)
|
||||
new_tile_map = tbl.new_tile_map
|
||||
stress_map_storage = tbl.stress_map_storage
|
||||
deconstruction_alert_message_shown = tbl.deconstruction_alert_message_shown
|
||||
collapse_positions_storage = tbl.collapse_positions_storage
|
||||
end)
|
||||
|
||||
local defaultValue = 0
|
||||
@ -70,20 +74,12 @@ DiggyCaveCollapse.events = {
|
||||
on_collapse_triggered = script.generate_event_name()
|
||||
}
|
||||
|
||||
local function create_collapse_template(positions, surface)
|
||||
local function create_collapse_template(map, surface)
|
||||
local entities = {}
|
||||
local tiles = {}
|
||||
local map = {}
|
||||
for _, position in pairs(positions) do
|
||||
local x = position.x
|
||||
local y = position.y
|
||||
map[x] = map[x] or {}
|
||||
map[x][y] = map[x][y] or true
|
||||
insert(tiles, {position = {x = x, y = y}, name = 'out-of-map'})
|
||||
end
|
||||
|
||||
for x, y_tbl in pairs(map) do
|
||||
for y, _ in pairs(y_tbl) do
|
||||
for x,y_tbl in pairs(map) do
|
||||
for y,_ in pairs(y_tbl) do
|
||||
insert(tiles, {position = {x = x, y = y}, name = 'out-of-map'})
|
||||
if not map[x] or not map[x][y - 1] then
|
||||
insert(entities, {position = {x = x, y = y - 1}, name = 'sand-rock-big'})
|
||||
end
|
||||
@ -106,10 +102,9 @@ local function create_collapse_template(positions, surface)
|
||||
for _, entity in pairs(find_entities_filtered({position = tile.position})) do
|
||||
pcall(function()
|
||||
local strength = support_beam_entities[entity.name]
|
||||
local position = entity.position
|
||||
|
||||
entity.die()
|
||||
if strength then
|
||||
local position = entity.position
|
||||
stress_map_blur_add(surface, position, strength)
|
||||
end
|
||||
end)
|
||||
@ -120,32 +115,6 @@ local function create_collapse_template(positions, surface)
|
||||
return tiles, entities
|
||||
end
|
||||
|
||||
local function collapse(args)
|
||||
local position = args.position
|
||||
local surface = args.surface
|
||||
local positions = {}
|
||||
local tiles = {}
|
||||
local entities
|
||||
mask_disc_blur(
|
||||
position.x, position.y,
|
||||
config.collapse_threshold_total_strength,
|
||||
function(x, y, value)
|
||||
stress_map_check_stress_in_threshold(
|
||||
surface,
|
||||
{x = x, y = y},
|
||||
value,
|
||||
function(_, position)
|
||||
insert(positions, position)
|
||||
end
|
||||
)
|
||||
end
|
||||
)
|
||||
tiles, entities = create_collapse_template(positions, surface)
|
||||
Template.insert(surface, tiles, entities)
|
||||
end
|
||||
|
||||
local on_collapse_timeout_finished = Token.register(collapse)
|
||||
|
||||
local function spawn_cracking_sound_text(surface, position)
|
||||
local text = config.cracking_sounds[random(1, #config.cracking_sounds)]
|
||||
|
||||
@ -167,6 +136,45 @@ local function spawn_cracking_sound_text(surface, position)
|
||||
end
|
||||
end
|
||||
|
||||
local function schedule_collapse(args)
|
||||
local surface = args.surface
|
||||
local surface_index = surface.index
|
||||
local collapse_positions_map = collapse_positions_storage[surface_index]
|
||||
local position = args.position
|
||||
|
||||
mask_disc_blur(
|
||||
position.x, position.y,
|
||||
config.collapse_threshold_total_strength,
|
||||
function(x, y, value) --optimize this!
|
||||
stress_map_check_stress_in_threshold(
|
||||
surface,
|
||||
{x = x, y = y},
|
||||
value,
|
||||
function(_, position)
|
||||
local x = position.x
|
||||
local y = position.y
|
||||
if collapse_positions_map[x] then
|
||||
collapse_positions_map[x][y] = true
|
||||
else
|
||||
collapse_positions_map[x] = {[y] = true}
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
local on_collapse_timeout_finished = Token.register(schedule_collapse)
|
||||
|
||||
local function execute_collapses()
|
||||
for surface_index, map in pairs(collapse_positions_storage) do
|
||||
local surface = game.surfaces[surface_index]
|
||||
local tiles, entities = create_collapse_template(map, surface)
|
||||
collapse_positions_storage[surface_index] = {}
|
||||
Template.insert(surface, tiles, entities)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_collapse_triggered(event)
|
||||
local surface = event.surface
|
||||
local position = event.position
|
||||
@ -316,6 +324,8 @@ function DiggyCaveCollapse.register(cfg)
|
||||
Event.add(Template.events.on_void_added, on_void_added)
|
||||
Event.add(defines.events.on_surface_created, on_surface_created)
|
||||
|
||||
Event.on_nth_tick(80, execute_collapses)
|
||||
|
||||
Event.add(defines.events.on_marked_for_deconstruction, function (event)
|
||||
if (nil ~= support_beam_entities[event.entity.name]) then
|
||||
event.entity.cancel_deconstruction(game.players[event.player_index].force)
|
||||
@ -362,7 +372,7 @@ end
|
||||
|
||||
@return number sum of old fraction + new fraction
|
||||
]]
|
||||
function add_fraction(stress_map, x, y, fraction)
|
||||
local function add_fraction(stress_map, x, y, fraction, no_collapse)
|
||||
local quadrant = 1
|
||||
if x < 0 then
|
||||
quadrant = quadrant + 1
|
||||
@ -397,10 +407,12 @@ function add_fraction(stress_map, x, y, fraction)
|
||||
if quadrant % 2 == 0 then
|
||||
x = -x
|
||||
end
|
||||
script.raise_event(
|
||||
DiggyCaveCollapse.events.on_collapse_triggered,
|
||||
{surface = game.surfaces[stress_map.surface_index], position = {x = x, y = y}}
|
||||
)
|
||||
if not no_collapse then
|
||||
script.raise_event(
|
||||
DiggyCaveCollapse.events.on_collapse_triggered,
|
||||
{surface = game.surfaces[stress_map.surface_index], position = {x = x, y = y}}
|
||||
)
|
||||
end
|
||||
end
|
||||
if (enable_stress_grid) then
|
||||
local surface = game.surfaces[stress_map.surface_index]
|
||||
@ -415,7 +427,7 @@ function add_fraction(stress_map, x, y, fraction)
|
||||
return value
|
||||
end
|
||||
|
||||
function add_fraction_by_quadrant(stress_map, x, y, fraction, quadrant)
|
||||
local function add_fraction_by_quadrant(stress_map, x, y, fraction, quadrant)
|
||||
local x_t = quadrant[x]
|
||||
if not x_t then
|
||||
x_t = {}
|
||||
@ -462,6 +474,8 @@ end
|
||||
on_surface_created = function(event)
|
||||
stress_map_storage[event.surface_index] = {}
|
||||
|
||||
collapse_positions_storage[event.surface_index] = {}
|
||||
|
||||
local map = stress_map_storage[event.surface_index]
|
||||
|
||||
map['surface_index'] = event.surface_index
|
||||
@ -480,7 +494,7 @@ end
|
||||
]]
|
||||
stress_map_check_stress_in_threshold = function(surface, position, threshold, callback)
|
||||
local stress_map = stress_map_storage[surface.index]
|
||||
local value = add_fraction(stress_map, position.x, position.y, 0)
|
||||
local value = add_fraction(stress_map, position.x, position.y, 0, true)
|
||||
|
||||
if (value >= stress_threshold_causing_collapse - threshold) then
|
||||
callback(surface, position)
|
||||
@ -488,6 +502,8 @@ stress_map_check_stress_in_threshold = function(surface, position, threshold, ca
|
||||
end
|
||||
|
||||
stress_map_blur_add = function(surface, position, factor)
|
||||
|
||||
|
||||
local x_start = floor(position.x)
|
||||
local y_start = floor(position.y)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user