2019-02-09 12:42:02 +02:00
local event = require ' utils.event '
local math_random = math.random
local valid_entities = {
[ " rock-big " ] = true ,
[ " rock-huge " ] = true ,
[ " sand-rock-big " ] = true
}
local rock_mining_chance_weights = {
{ " iron-ore " , 25 } ,
{ " copper-ore " , 18 } ,
{ " coal " , 14 } ,
{ " stone " , 10 } ,
{ " uranium-ore " , 3 }
}
local ore_raffle = { }
for _ , t in pairs ( rock_mining_chance_weights ) do
for x = 1 , t [ 2 ] , 1 do
table.insert ( ore_raffle , t [ 1 ] )
end
end
local size_raffle = {
{ " huge " , 33 , 42 } ,
{ " big " , 17 , 32 } ,
{ " " , 8 , 16 } ,
{ " tiny " , 3 , 7 }
}
local ore_prints = {
[ " coal " ] = { " dark " , " Coal " } ,
[ " iron-ore " ] = { " shiny " , " Iron " } ,
[ " copper-ore " ] = { " glimmering " , " Copper " } ,
[ " uranium-ore " ] = { " glowing " , " Uranium " } ,
[ " stone " ] = { " solid " , " Stone " }
}
local function on_player_mined_entity ( event )
local entity = event.entity
if not entity.valid then return end
if valid_entities [ entity.name ] then
2019-02-10 10:56:23 +02:00
if math_random ( 1 , 128 ) == 1 then
2019-02-09 12:42:02 +02:00
local player = game.players [ event.player_index ]
local p = { x = entity.position . x , y = entity.position . y }
local tile_distance_to_center = p.x ^ 2 + p.y ^ 2
local radius = 32
if entity.surface . count_entities_filtered { area = { { p.x - radius , p.y - radius } , { p.x + radius , p.y + radius } } , type = " resource " , limit = 1 } == 0 then
local size = size_raffle [ math_random ( 1 , # size_raffle ) ]
local ore = ore_raffle [ math_random ( 1 , # ore_raffle ) ]
player.print ( " You notice something " .. ore_prints [ ore ] [ 1 ] .. " underneath the rubble covered floor. It's a " .. size [ 1 ] .. " vein of " .. ore_prints [ ore ] [ 2 ] .. " !! " , { r = 0.98 , g = 0.66 , b = 0.22 } )
tile_distance_to_center = math.sqrt ( tile_distance_to_center )
local ore_entities_placed = 0
local modifier_raffle = { { 0 , - 1 } , { - 1 , 0 } , { 1 , 0 } , { 0 , 1 } }
while ore_entities_placed < math_random ( size [ 2 ] , size [ 3 ] ) do
local a = math.ceil ( ( math_random ( tile_distance_to_center * 4 , tile_distance_to_center * 5 ) ) / 1 + ore_entities_placed * 0.5 , 0 )
for x = 1 , 150 , 1 do
local m = modifier_raffle [ math_random ( 1 , # modifier_raffle ) ]
local pos = { x = p.x + m [ 1 ] , y = p.y + m [ 2 ] }
if entity.surface . can_place_entity ( { name = ore , position = pos , amount = a } ) then
entity.surface . create_entity { name = ore , position = pos , amount = a }
p = pos
break
end
end
ore_entities_placed = ore_entities_placed + 1
end
end
end
end
end
event.add ( defines.events . on_player_mined_entity , on_player_mined_entity )