1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-08 00:39:30 +02:00
ComfyFactorio/maps/choppy.lua

363 lines
12 KiB
Lua
Raw Normal View History

2019-03-10 22:34:02 +02:00
--choppy-- mewmew made this --
2019-03-17 19:19:40 +02:00
require "on_tick_schedule"
2019-03-13 18:09:06 +02:00
require "modules.dynamic_landfill"
require "modules.satellite_score"
require "modules.spawners_contain_biters"
2019-10-28 18:38:36 +02:00
local Map = require "modules.map_info"
2019-03-10 22:34:02 +02:00
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"
2019-06-11 14:31:00 +02:00
local simplex_noise = require 'utils.simplex_noise'.d2
2019-03-10 22:34:02 +02:00
local event = require 'utils.event'
local table_insert = table.insert
local math_random = math.random
2019-03-13 18:09:06 +02:00
local map_functions = require "tools.map_functions"
2019-03-10 22:34:02 +02:00
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",
2019-06-11 14:31:00 +02:00
["dirt-4"] = "grass-4",
["dirt-5"] = "grass-1",
2019-03-10 22:34:02 +02:00
["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",
}
2019-06-11 14:31:00 +02:00
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
2019-03-10 22:34:02 +02:00
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
2019-06-16 15:27:08 +02:00
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
}
2019-03-10 22:34:02 +02:00
local function process_entity(e)
if not e.valid then return end
2019-06-16 15:27:08 +02:00
if trees_to_remove[e.name] then
2019-03-10 22:34:02 +02:00
e.destroy()
return
end
2019-06-16 15:27:08 +02:00
if entities_to_convert[e.name] then
2019-06-11 14:31:00 +02:00
if math_random(1,100) > 33 then e.surface.create_entity({name = rocks[math_random(1, #rocks)], position = e.position}) end
2019-03-10 22:34:02 +02:00
e.destroy()
return
end
end
2019-06-11 14:31:00 +02:00
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
2019-06-16 15:27:08 +02:00
if math_random(1, 100000) == 1 then
2019-06-11 14:31:00 +02:00
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
2019-03-10 22:34:02 +02:00
local function on_chunk_generated(event)
local surface = event.surface
local left_top = event.area.left_top
local tiles = {}
local entities = {}
2019-06-11 14:31:00 +02:00
local seed = game.surfaces[1].map_gen_settings.seed
--surface.destroy_decoratives({area = event.area})
2019-03-10 22:34:02 +02:00
for _, e in pairs(surface.find_entities_filtered({area = event.area})) do
process_entity(e)
end
2019-03-13 03:38:38 +02:00
for x = 0.5, 31.5, 1 do
for y = 0.5, 31.5, 1 do
2019-03-10 22:34:02 +02:00
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
2019-06-11 14:31:00 +02:00
process_tile(surface, pos, tile, seed)
2019-05-24 21:01:44 +02:00
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
2019-03-10 22:34:02 +02:00
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
2019-03-10 23:48:50 +02:00
if event.entity.type == "tree" then
event.entity.cancel_deconstruction(game.players[event.player_index].force.name)
end
2019-03-10 22:34:02 +02:00
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
2019-06-16 15:27:08 +02:00
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
2019-03-10 22:34:02 +02:00
global.map_init_done = true
2019-06-16 15:27:08 +02:00
end
2019-03-10 22:34:02 +02:00
local function get_amount(entity)
local distance_to_center = math.sqrt(entity.position.x^2 + entity.position.y^2)
2019-05-24 21:01:44 +02:00
local amount = 25 + (distance_to_center * 0.1)
if amount > 1000 then amount = 1000 end
2019-03-10 22:34:02 +02:00
amount = math.random(math.ceil(amount * 0.5), math.ceil(amount * 1.5))
return amount
end
2019-05-24 21:01:44 +02:00
local function trap(entity)
2019-03-11 15:55:01 +02:00
if math_random(1,1024) == 1 then tick_tack_trap(entity.surface, entity.position) return end
2019-03-11 19:58:30 +02:00
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
2019-03-10 22:34:02 +02:00
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
2019-06-16 15:27:08 +02:00
if global.entity_yield[entity.name] then
2019-03-10 22:34:02 +02:00
if event.buffer then event.buffer.clear() end
2019-03-11 23:38:34 +02:00
if not event.player_index then return end
2019-03-10 22:34:02 +02:00
local amount = get_amount(entity)
2019-03-11 19:58:30 +02:00
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
2019-06-16 15:27:08 +02:00
local main_item = global.entity_yield[entity.name][math_random(1,#global.entity_yield[entity.name])]
2019-03-10 22:34:02 +02:00
entity.surface.create_entity({
name = "flying-text",
position = entity.position,
2019-06-16 15:27:08 +02:00
text = "+" .. amount .. " [item=" .. main_item .. "] +" .. second_item_amount .. " [item=" .. second_item .. "]",
2019-03-10 22:34:02 +02:00
color = {r=0.8,g=0.8,b=0.8}})
2019-03-11 19:58:30 +02:00
2019-03-11 23:38:34 +02:00
2019-03-10 22:34:02 +02:00
local player = game.players[event.player_index]
2019-06-16 15:27:08 +02:00
local inserted_count = player.insert({name = main_item, count = amount})
2019-03-10 22:34:02 +02:00
amount = amount - inserted_count
if amount > 0 then
2019-06-16 15:27:08 +02:00
entity.surface.spill_item_stack(entity.position,{name = main_item, count = amount}, true)
2019-03-10 22:34:02 +02:00
end
2019-03-11 19:58:30 +02:00
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)
2019-03-10 22:34:02 +02:00
end
end
end
local function on_research_finished(event)
2019-03-11 04:17:03 +02:00
event.research.force.character_inventory_slots_bonus = game.forces.player.mining_drill_productivity_bonus * 500
2019-03-10 23:48:50 +02:00
if not event.research.force.technologies["steel-axe"].researched then return end
2019-03-11 04:17:03 +02:00
event.research.force.manual_mining_speed_modifier = 1 + game.forces.player.mining_drill_productivity_bonus * 2
2019-03-10 22:34:02 +02:00
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
2019-10-28 18:38:36 +02:00
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)
2019-03-10 22:34:02 +02:00
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)