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

433 lines
14 KiB
Lua

--luacheck: ignore
--choppy-- mewmew made this --
require 'modules.dynamic_landfill'
require 'modules.satellite_score'
require 'modules.spawners_contain_biters'
local Map = require 'modules.map_info'
local unearthing_worm = require 'functions.unearthing_worm'
local unearthing_biters = require 'functions.unearthing_biters'
local tick_tack_trap = require 'functions.tick_tack_trap'
local create_entity_chain = require 'functions.create_entity_chain'
local create_tile_chain = require 'functions.create_tile_chain'
local simplex_noise = require 'utils.simplex_noise'.d2
local event = require 'utils.event'
local table_insert = table.insert
local math_random = math.random
local map_functions = require 'tools.map_functions'
local disabled_for_deconstruction = {
['fish'] = true,
['rock-huge'] = true,
['rock-big'] = true,
['sand-rock-big'] = true,
['mineable-wreckage'] = true
}
local tile_replacements = {
['dirt-1'] = 'grass-1',
['dirt-2'] = 'grass-2',
['dirt-3'] = 'grass-3',
['dirt-4'] = 'grass-4',
['dirt-5'] = 'grass-1',
['sand-1'] = 'grass-1',
['sand-2'] = 'grass-2',
['sand-3'] = 'grass-3',
['dry-dirt'] = 'grass-2',
['red-desert-0'] = 'grass-1',
['red-desert-1'] = 'grass-2',
['red-desert-2'] = 'grass-3',
['red-desert-3'] = 'grass-4'
}
local rocks = {'rock-big', 'rock-big', 'rock-huge'}
local decos = {
'green-hairy-grass',
'green-hairy-grass',
'green-hairy-grass',
'green-hairy-grass',
'green-hairy-grass',
'green-hairy-grass',
'green-carpet-grass',
'green-carpet-grass',
'green-pita'
}
local decos_inside_forest = {'brown-asterisk', 'brown-asterisk', 'brown-carpet-grass', 'brown-hairy-grass'}
local noises = {
['forest_location'] = {{modifier = 0.006, weight = 1}, {modifier = 0.01, weight = 0.25}, {modifier = 0.05, weight = 0.15}, {modifier = 0.1, weight = 0.05}},
['forest_density'] = {{modifier = 0.01, weight = 1}, {modifier = 0.05, weight = 0.5}, {modifier = 0.1, weight = 0.025}}
}
local function get_noise(name, pos, seed)
local noise = 0
for _, n in pairs(noises[name]) do
noise = noise + simplex_noise(pos.x * n.modifier, pos.y * n.modifier, seed) * n.weight
seed = seed + 10000
end
return noise
end
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 entities_to_convert = {
['coal'] = true,
['copper-ore'] = true,
['iron-ore'] = true,
['uranium-ore'] = true,
['stone'] = true,
['angels-ore1'] = true,
['angels-ore2'] = true,
['angels-ore3'] = true,
['angels-ore4'] = true,
['angels-ore5'] = true,
['angels-ore6'] = true,
['thorium-ore'] = true
}
local trees_to_remove = {
['dead-dry-hairy-tree'] = true,
['dead-grey-trunk'] = true,
['dead-tree-desert'] = true,
['dry-hairy-tree'] = true,
['dry-tree'] = true,
['tree-01'] = true,
['tree-02'] = true,
['tree-02-red'] = true,
['tree-03'] = true,
['tree-04'] = true,
['tree-05'] = true,
['tree-06'] = true,
['tree-06-brown'] = true,
['tree-07'] = true,
['tree-08'] = true,
['tree-08-brown'] = true,
['tree-08-red'] = true,
['tree-09'] = true,
['tree-09-brown'] = true,
['tree-09-red'] = true
}
local function process_entity(e)
if not e.valid then
return
end
if trees_to_remove[e.name] then
e.destroy()
return
end
if entities_to_convert[e.name] then
if math_random(1, 100) > 33 then
e.surface.create_entity({name = rocks[math_random(1, #rocks)], position = e.position})
end
e.destroy()
return
end
end
local function process_tile(surface, pos, tile, seed)
if tile.collides_with('player-layer') then
return
end
if not surface.can_place_entity({name = 'tree-01', position = pos}) then
return
end
if math_random(1, 100000) == 1 then
local wrecks = {'big-ship-wreck-1', 'big-ship-wreck-2', 'big-ship-wreck-3'}
local e = surface.create_entity {name = wrecks[math_random(1, #wrecks)], position = pos, force = 'neutral'}
e.insert({name = 'raw-fish', count = math_random(3, 25)})
if math_random(1, 3) == 1 then
e.insert({name = 'wood', count = math_random(11, 44)})
end
end
local noise_forest_location = get_noise('forest_location', pos, seed)
--local r = math.ceil(math.abs(get_noise("forest_density", pos, seed + 4096)) * 10)
--local r = 5 - math.ceil(math.abs(noise_forest_location) * 3)
--r = 2
if noise_forest_location > 0.095 then
if noise_forest_location > 0.6 then
if math_random(1, 100) > 42 then
surface.create_entity({name = 'tree-08-brown', position = pos})
end
else
if math_random(1, 100) > 42 then
surface.create_entity({name = 'tree-01', position = pos})
end
end
surface.create_decoratives(
{check_collision = false, decoratives = {{name = decos_inside_forest[math_random(1, #decos_inside_forest)], position = pos, amount = math_random(1, 2)}}}
)
return
end
if noise_forest_location < -0.095 then
if noise_forest_location < -0.6 then
if math_random(1, 100) > 42 then
surface.create_entity({name = 'tree-04', position = pos})
end
else
if math_random(1, 100) > 42 then
surface.create_entity({name = 'tree-02-red', position = pos})
end
end
surface.create_decoratives(
{check_collision = false, decoratives = {{name = decos_inside_forest[math_random(1, #decos_inside_forest)], position = pos, amount = math_random(1, 2)}}}
)
return
end
surface.create_decoratives({check_collision = false, decoratives = {{name = decos[math_random(1, #decos)], position = pos, amount = math_random(1, 2)}}})
end
local function on_chunk_generated(event)
local surface = event.surface
local left_top = event.area.left_top
local tiles = {}
local entities = {}
local seed = game.surfaces[1].map_gen_settings.seed
--surface.destroy_decoratives({area = event.area})
for _, e in pairs(surface.find_entities_filtered({area = event.area})) do
process_entity(e)
end
for x = 0.5, 31.5, 1 do
for y = 0.5, 31.5, 1 do
local tile_to_insert = false
local pos = {x = left_top.x + x, y = left_top.y + y}
local tile = surface.get_tile(pos)
if tile_replacements[tile.name] then
table_insert(tiles, {name = tile_replacements[tile.name], position = pos})
end
process_tile(surface, pos, tile, seed)
end
end
surface.set_tiles(tiles, true)
for _, e in pairs(surface.find_entities_filtered({area = event.area, type = 'unit-spawner'})) do
for _, entity in pairs(e.surface.find_entities_filtered({area = {{e.position.x - 7, e.position.y - 7}, {e.position.x + 7, e.position.y + 7}}, force = 'neutral'})) do
if entity.valid then
entity.destroy()
end
end
end
if global.spawn_generated then
return
end
if left_top.x < 96 then
return
end
for _, e in pairs(surface.find_entities_filtered({area = {{-50, -50}, {50, 50}}})) do
local distance_to_center = math.sqrt(e.position.x ^ 2 + e.position.y ^ 2)
if e.valid then
if distance_to_center < 8 and e.type == 'tree' and math_random(1, 5) ~= 1 then
e.destroy()
end
end
end
global.spawn_generated = true
end
local function on_marked_for_deconstruction(event)
if disabled_for_deconstruction[event.entity.name] then
event.entity.cancel_deconstruction(game.players[event.player_index].force.name)
end
if event.entity.type == 'tree' then
event.entity.cancel_deconstruction(game.players[event.player_index].force.name)
end
end
local function on_player_joined_game(event)
local player = game.players[event.player_index]
if player.online_time == 0 then
player.insert({name = 'pistol', count = 1})
player.insert({name = 'firearm-magazine', count = 8})
end
if global.map_init_done then
return
end
--game.map_settings.pollution.min_pollution_to_damage_trees = 1000000
--game.map_settings.pollution.pollution_per_tree_damage = 0
--game.map_settings.pollution.pollution_restored_per_tree_damage = 0
game.surfaces['nauvis'].ticks_per_day = game.surfaces['nauvis'].ticks_per_day * 2
global.entity_yield = {
['tree-01'] = {'iron-ore'},
['tree-02-red'] = {'copper-ore'},
['tree-04'] = {'coal'},
['tree-08-brown'] = {'stone'},
['rock-big'] = {'uranium-ore'},
['rock-huge'] = {'uranium-ore'}
}
if game.item_prototypes['angels-ore1'] then
global.entity_yield['tree-01'] = {'angels-ore1', 'angels-ore2'}
global.entity_yield['tree-02-red'] = {'angels-ore5', 'angels-ore6'}
global.entity_yield['tree-04'] = {'coal'}
global.entity_yield['tree-08-brown'] = {'angels-ore3', 'angels-ore4'}
else
game.map_settings.pollution.ageing = 0
end
if game.item_prototypes['thorium-ore'] then
global.entity_yield['rock-big'] = {'uranium-ore', 'thorium-ore'}
global.entity_yield['rock-huge'] = {'uranium-ore', 'thorium-ore'}
end
global.map_init_done = true
end
local function get_amount(entity)
local distance_to_center = math.sqrt(entity.position.x ^ 2 + entity.position.y ^ 2)
local amount = 25 + (distance_to_center * 0.1)
if amount > 1000 then
amount = 1000
end
amount = math.random(math.ceil(amount * 0.5), math.ceil(amount * 1.5))
return amount
end
local function trap(entity)
if math_random(1, 1024) == 1 then
tick_tack_trap(entity.surface, entity.position)
return
end
if math_random(1, 256) == 1 then
unearthing_worm(entity.surface, entity.position)
end
if math_random(1, 128) == 1 then
unearthing_biters(entity.surface, entity.position, math_random(4, 8))
end
end
local function on_player_mined_entity(event)
local entity = event.entity
if not entity.valid then
return
end
if entity.type == 'tree' then
trap(entity)
end
if global.entity_yield[entity.name] then
if event.buffer then
event.buffer.clear()
end
if not event.player_index then
return
end
local amount = get_amount(entity)
local second_item_amount = math_random(2, 5)
local second_item = 'wood'
if entity.type == 'simple-entity' then
amount = amount * 2
second_item_amount = math_random(8, 16)
second_item = 'stone'
end
local main_item = global.entity_yield[entity.name][math_random(1, #global.entity_yield[entity.name])]
entity.surface.create_entity(
{
name = 'flying-text',
position = entity.position,
text = '+' .. amount .. ' [item=' .. main_item .. '] +' .. second_item_amount .. ' [item=' .. second_item .. ']',
color = {r = 0.8, g = 0.8, b = 0.8}
}
)
local player = game.players[event.player_index]
local inserted_count = player.insert({name = main_item, count = amount})
amount = amount - inserted_count
if amount > 0 then
entity.surface.spill_item_stack(entity.position, {name = main_item, count = amount}, true)
end
local inserted_count = player.insert({name = second_item, count = second_item_amount})
second_item_amount = second_item_amount - inserted_count
if second_item_amount > 0 then
entity.surface.spill_item_stack(entity.position, {name = second_item, count = second_item_amount}, true)
end
end
end
local function on_research_finished(event)
event.research.force.character_inventory_slots_bonus = game.forces.player.mining_drill_productivity_bonus * 500
if not event.research.force.technologies['steel-axe'].researched then
return
end
event.research.force.manual_mining_speed_modifier = 1 + game.forces.player.mining_drill_productivity_bonus * 2
end
local function on_entity_died(event)
on_player_mined_entity(event)
if not event.entity.valid then
return
end
if event.entity.type == 'tree' then
for _, entity in pairs(
event.entity.surface.find_entities_filtered(
{area = {{event.entity.position.x - 4, event.entity.position.y - 4}, {event.entity.position.x + 4, event.entity.position.y + 4}}, name = 'fire-flame-on-tree'}
)
) do
if entity.valid then
entity.destroy()
end
end
end
end
local on_init = function()
local T = Map.Pop_info()
T.main_caption = 'Choppy'
T.sub_caption = ''
T.text =
[[
You are a lumberjack with a passion to chop.
Different kinds of trees, yield different kinds of ore and wood.
Yes, they seem to draw minerals out of the ground and manifesting it as "fruit".
Their yield increases with distance. Mining Productivity Research will increase chopping speed and backpack size.
Beware, sometimes there are some bugs hiding underneath the trees.
Even dangerous traps have been encountered before.
Also, these mysterious ore trees don't burn very well, so do not worry if some of them catch on fire.
Choppy Choppy Wood
]]
T.main_caption_color = {r = 0, g = 120, b = 0}
T.sub_caption_color = {r = 255, g = 0, b = 255}
end
event.on_init(on_init)
event.add(defines.events.on_research_finished, on_research_finished)
event.add(defines.events.on_marked_for_deconstruction, on_marked_for_deconstruction)
event.add(defines.events.on_player_joined_game, on_player_joined_game)
event.add(defines.events.on_player_mined_entity, on_player_mined_entity)
event.add(defines.events.on_entity_died, on_entity_died)
event.add(defines.events.on_chunk_generated, on_chunk_generated)