2018-09-08 18:29:27 +02:00
--[[-- info
Provides the ability to " mine " through out - of - map tiles by destroying or
mining rocks next to it .
] ]
-- dependencies
local Event = require ' utils.event '
2018-09-14 22:12:55 +02:00
local Scanner = require ' map_gen.Diggy.Scanner '
local Template = require ' map_gen.Diggy.Template '
2018-09-27 20:56:29 +02:00
local Debug = require ' map_gen.Diggy.Debug '
2018-10-11 19:43:04 +02:00
local insert = table.insert
local random = math.random
2018-09-08 18:29:27 +02:00
-- this
local DiggyHole = { }
--[[--
Triggers a diggy diggy hole for a given sand - rock - big .
Will return true even if the tile behind it is immune .
@ param entity LuaEntity
] ]
2018-10-06 12:40:03 +02:00
local function diggy_hole ( entity )
2018-09-08 18:29:27 +02:00
if ( entity.name ~= ' sand-rock-big ' ) then
return
end
local tiles = { }
local rocks = { }
2018-10-11 20:13:42 +02:00
local surface = entity.surface
2018-09-08 18:29:27 +02:00
2018-10-11 20:13:42 +02:00
local out_of_map_found = Scanner.scan_around_position ( surface , entity.position , ' out-of-map ' ) ;
2018-09-08 18:29:27 +02:00
for _ , position in pairs ( out_of_map_found ) do
2018-10-11 20:13:42 +02:00
insert ( tiles , { name = ' dirt- ' .. random ( 1 , 7 ) , position = position } )
insert ( rocks , { name = ' sand-rock-big ' , position = position } )
2018-09-08 18:29:27 +02:00
end
2018-10-11 20:13:42 +02:00
Template.insert ( surface , tiles , rocks )
2018-09-08 18:29:27 +02:00
end
2018-09-26 22:15:39 +02:00
local artificial_tiles = {
[ ' stone-brick ' ] = true ,
[ ' stone-path ' ] = true ,
[ ' concrete ' ] = true ,
[ ' hazard-concrete-left ' ] = true ,
[ ' hazard-concrete-right ' ] = true ,
[ ' refined-concrete ' ] = true ,
[ ' refined-hazard-concrete-left ' ] = true ,
[ ' refined-hazard-concrete-right ' ] = true ,
}
2018-10-07 19:40:30 +02:00
local function on_mined_tile ( surface , tiles )
local new_tiles = { }
for _ , tile in pairs ( tiles ) do
if ( artificial_tiles [ tile.old_tile . name ] ) then
2018-10-11 19:43:04 +02:00
insert ( new_tiles , { name = ' dirt- ' .. random ( 1 , 7 ) , position = tile.position } )
2018-10-07 19:40:30 +02:00
end
end
Template.insert ( surface , new_tiles , { } )
end
2018-09-08 18:29:27 +02:00
--[[--
Registers all event handlers .
] ]
2018-10-07 17:05:59 +02:00
function DiggyHole . register ( config )
2018-09-08 18:29:27 +02:00
Event.add ( defines.events . on_entity_died , function ( event )
2018-10-16 09:59:58 +02:00
local entity = event.entity
diggy_hole ( entity )
local position = entity.position
local surface = entity.surface
-- fixes massive frame drops when too much stone is spilled
local stones = surface.find_entities_filtered ( {
2018-11-06 19:12:58 +01:00
area = { { position.x - 2 , position.y - 2 } , { position.x + 2 , position.y + 2 } } ,
limit = 60 ,
2018-10-16 09:59:58 +02:00
type = ' item-entity ' ,
name = ' item-on-ground ' ,
} )
for _ , stone in ipairs ( stones ) do
if ( stone.stack . name == ' stone ' ) then
stone.destroy ( )
end
end
2018-09-08 18:29:27 +02:00
end )
Event.add ( defines.events . on_player_mined_entity , function ( event )
2018-10-06 12:40:03 +02:00
diggy_hole ( event.entity )
2018-09-08 18:29:27 +02:00
end )
2018-09-26 22:15:39 +02:00
Event.add ( defines.events . on_robot_mined_tile , function ( event )
2018-10-07 19:40:30 +02:00
on_mined_tile ( event.robot . surface , event.tiles )
2018-09-26 22:15:39 +02:00
end )
Event.add ( defines.events . on_player_mined_tile , function ( event )
2018-10-07 19:40:30 +02:00
on_mined_tile ( game.surfaces [ event.surface_index ] , event.tiles )
end )
2018-09-26 22:15:39 +02:00
2018-10-21 20:15:39 +02:00
if config.enable_debug_commands then
commands.add_command ( ' clear-void ' , ' <left top x> <left top y> <width> <height> <surface index> triggers Template.insert for the given area. ' , function ( cmd )
local params = { }
local args = cmd.parameter or ' '
for param in string.gmatch ( args , ' %S+ ' ) do
table.insert ( params , param )
end
2018-09-26 22:15:39 +02:00
2018-10-21 20:15:39 +02:00
if ( # params ~= 5 ) then
game.player . print ( ' /clear-void requires exactly 5 arguments: <left top x> <left top y> <width> <height> <surface index> ' )
return
end
local left_top_x = tonumber ( params [ 1 ] )
local left_top_y = tonumber ( params [ 2 ] )
local width = tonumber ( params [ 3 ] )
local height = tonumber ( params [ 4 ] )
local surface_index = params [ 5 ]
local tiles = { }
local entities = { }
for x = 0 , width do
for y = 0 , height do
insert ( tiles , { name = ' dirt- ' .. random ( 1 , 7 ) , position = { x = x + left_top_x , y = y + left_top_y } } )
end
end
Template.insert ( game.surfaces [ surface_index ] , tiles , entities )
end
)
end
2018-09-08 18:29:27 +02:00
end
2018-10-16 10:00:28 +02:00
function DiggyHole . on_init ( )
game.forces . player.technologies [ ' landfill ' ] . enabled = false
end
2018-09-08 18:29:27 +02:00
return DiggyHole