mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-14 10:13:13 +02:00
Merge pull request #220 from Valansch/cave_miner_merge
Implemented cave miner
This commit is contained in:
commit
2c84ece924
11
config.lua
11
config.lua
@ -7,7 +7,16 @@ global.scenario.variables.player_positions = {}
|
||||
global.player_walk_distances = {}
|
||||
global.scenario.variables.player_deaths = {}
|
||||
global.scenario.config = {}
|
||||
global.scenario.config.player_list = {}
|
||||
global.scenario.config.player_list.enable_coin_col = true
|
||||
global.scenario.config.paint = {}
|
||||
global.scenario.config.paint.enable = true
|
||||
global.scenario.config.fish_market = {}
|
||||
global.scenario.config.fish_market.enable = true
|
||||
global.scenario.config.nuke_control = {}
|
||||
global.scenario.config.nuke_control.enable_autokick = true
|
||||
global.scenario.config.nuke_control.enable_autoban = true
|
||||
global.scenario.custom_functions = {}
|
||||
global.scenario.config.nuke_min_time_hours = 3 --how long a player must be on the server to be allowed to use the nuke
|
||||
global.scenario.config.nuke_control.nuke_min_time_hours = 3 --how long a player must be on the server to be allowed to use the nuke
|
||||
global.newline = '\n'
|
||||
newline = '\n'
|
||||
|
@ -30,6 +30,7 @@ local function spawn_market(cmd)
|
||||
cant_run(cmd.name)
|
||||
return
|
||||
end
|
||||
|
||||
local surface = player.surface
|
||||
local force = player.force
|
||||
|
||||
@ -447,10 +448,17 @@ local function fish_player_crafted_item(event)
|
||||
end
|
||||
end
|
||||
|
||||
commands.add_command('market', 'Places a fish market near you. (Admins only)', spawn_market)
|
||||
local function on_init()
|
||||
|
||||
Event.on_nth_tick(180, on_180_ticks)
|
||||
Event.add(defines.events.on_pre_player_mined_item, pre_player_mined_item)
|
||||
Event.add(defines.events.on_entity_died, fish_drop_entity_died)
|
||||
Event.add(defines.events.on_market_item_purchased, market_item_purchased)
|
||||
Event.add(defines.events.on_player_crafted_item, fish_player_crafted_item)
|
||||
if global.scenario.config.fish_market.enable then
|
||||
commands.add_command('market', 'Places a fish market near you. (Admins only)', spawn_market)
|
||||
|
||||
Event.on_nth_tick(180, on_180_ticks)
|
||||
Event.add(defines.events.on_pre_player_mined_item, pre_player_mined_item)
|
||||
Event.add(defines.events.on_entity_died, fish_drop_entity_died)
|
||||
Event.add(defines.events.on_market_item_purchased, market_item_purchased)
|
||||
Event.add(defines.events.on_player_crafted_item, fish_player_crafted_item)
|
||||
end
|
||||
end
|
||||
Event.on_init(init)
|
||||
Event.on_load(init)
|
||||
|
36
info.lua
36
info.lua
@ -701,3 +701,39 @@ Gui.on_custom_close(
|
||||
Gui.destroy(event.element)
|
||||
end
|
||||
)
|
||||
|
||||
local Public = {}
|
||||
|
||||
function Public.get_map_name()
|
||||
return editable_info[map_name_key]
|
||||
end
|
||||
|
||||
function Public.set_map_name(value)
|
||||
editable_info[map_name_key] = value
|
||||
end
|
||||
|
||||
function Public.get_map_description()
|
||||
return editable_info[map_description_key]
|
||||
end
|
||||
|
||||
function Public.set_map_description(value)
|
||||
editable_info[map_description_key] = value
|
||||
end
|
||||
|
||||
function Public.get_map_extra_info()
|
||||
return editable_info[map_extra_info_key]
|
||||
end
|
||||
|
||||
function Public.set_map_extra_info(value)
|
||||
editable_info[map_extra_info_key] = value
|
||||
end
|
||||
|
||||
function Public.get_new_info()
|
||||
return editable_info[new_info_key]
|
||||
end
|
||||
|
||||
function Public.set_new_info(value)
|
||||
editable_info[new_info_key] = value
|
||||
end
|
||||
|
||||
return Public
|
||||
|
995
map_gen/combined/cave_miner/cave_miner.lua
Normal file
995
map_gen/combined/cave_miner/cave_miner.lua
Normal file
@ -0,0 +1,995 @@
|
||||
--Factorio Cave Miner -- mewmew made this --
|
||||
--You can use /c map_pregen() to pre-generate the world before playing to avoid microstutter while playing.--
|
||||
|
||||
--[[
|
||||
To do(maybe):
|
||||
cliffs
|
||||
standalone info
|
||||
2nd biome rock labyrinth
|
||||
oil >> spawn
|
||||
explosives filled chest explosion
|
||||
cliff explosives // rock mining
|
||||
treasure chests get better with distance
|
||||
random game events // earthquake, biters, rock treasure, messages
|
||||
]]--
|
||||
|
||||
local simplex_noise = require 'map_gen.shared.simplex_noise'
|
||||
local Event = require 'utils.event'
|
||||
local market_items = require "map_gen.combined.cave_miner.market_items"
|
||||
|
||||
|
||||
local Info = require 'info'
|
||||
|
||||
Info.set_map_name('Cave Miner')
|
||||
Info.set_map_description([[
|
||||
Diggy Diggy Hole.
|
||||
]])
|
||||
Info.set_map_extra_info([[
|
||||
Delve deep for greater treasures, but also face increased dangers.
|
||||
|
||||
Mining productivity research, will overhaul your whole mining equipment,
|
||||
reinforcing your pickaxe as well as increasing the size of your backpack.
|
||||
|
||||
Darkness is a hazard in the mines, stay near your lamps.
|
||||
|
||||
Breaking rocks is exhausting work and will make you hungry.
|
||||
So don´t forget to eat some fish once in a while to stay well fed.
|
||||
But be careful, eating too much might have it´s consequences too...
|
||||
]])
|
||||
|
||||
|
||||
if global.scenario and global.scenario.config then
|
||||
if global.scenario.config.player_list then
|
||||
global.scenario.config.player_list.enable_coin_col = nil
|
||||
end
|
||||
if global.scenario.config.fish_market then
|
||||
global.scenario.config.fish_market.enable = nil
|
||||
end
|
||||
if global.scenario.config.paint then
|
||||
global.scenario.config.paint.enable = nil
|
||||
end
|
||||
if global.scenario.nuke_control then
|
||||
global.scenario.nuke_control.enable_autokick = nil
|
||||
global.scenario.nuke_control.enable_autoban = nil
|
||||
end
|
||||
if global.scenario.config.fish_market then
|
||||
global.scenario.config.fish_market.enable = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function create_cave_miner_button(player)
|
||||
local button = player.gui.top.add({ type = "sprite-button", name = "caver_miner_stats_toggle_button", sprite = "item/iron-axe" })
|
||||
button.style.minimal_height = 38
|
||||
button.style.minimal_width = 38
|
||||
button.style.top_padding = 2
|
||||
button.style.left_padding = 4
|
||||
button.style.right_padding = 4
|
||||
button.style.bottom_padding = 2
|
||||
end
|
||||
|
||||
local function create_cave_miner_stats_gui(player)
|
||||
if player.gui.top["hunger_frame"] then
|
||||
player.gui.top["hunger_frame"].destroy()
|
||||
end
|
||||
if player.gui.top["caver_miner_stats_frame"] then
|
||||
player.gui.top["caver_miner_stats_frame"].destroy()
|
||||
end
|
||||
|
||||
local captions = {}
|
||||
local caption_style = {{"font", "default-bold"}, {"font_color",{ r=0.63, g=0.63, b=0.63}}, {"top_padding",2}, {"left_padding",0},{"right_padding",0},{"minimal_width",0}}
|
||||
local stat_numbers = {}
|
||||
local stat_number_style = {{"font", "default-bold"}, {"font_color",{ r=0.77, g=0.77, b=0.77}}, {"top_padding",2}, {"left_padding",0},{"right_padding",0},{"minimal_width",0}}
|
||||
local separators = {}
|
||||
local separator_style = {{"font", "default-bold"}, {"font_color",{ r=0.15, g=0.15, b=0.89}}, {"top_padding",2}, {"left_padding",2},{"right_padding",2},{"minimal_width",0}}
|
||||
|
||||
local frame = player.gui.top.add { type = "frame", name = "hunger_frame" }
|
||||
|
||||
local str = tostring(global.player_hunger[player.name])
|
||||
str = str .. "% "
|
||||
str = str .. global.player_hunger_stages[global.player_hunger[player.name]]
|
||||
local caption_hunger = frame.add { type = "label", caption = str }
|
||||
caption_hunger.style.font = "default-bold"
|
||||
caption_hunger.style.font_color = global.player_hunger_color_list[global.player_hunger[player.name]]
|
||||
caption_hunger.style.top_padding = 2
|
||||
|
||||
local frame = player.gui.top.add { type = "frame", name = "caver_miner_stats_frame" }
|
||||
|
||||
local t = frame.add { type = "table", column_count = 11 }
|
||||
|
||||
captions[1] = t.add { type = "label", caption = "Ores mined:" }
|
||||
|
||||
global.total_ores_mined = global.stats_ores_found + game.forces.player.item_production_statistics.get_input_count("coal") + game.forces.player.item_production_statistics.get_input_count("iron-ore") + game.forces.player.item_production_statistics.get_input_count("copper-ore") + game.forces.player.item_production_statistics.get_input_count("uranium-ore")
|
||||
|
||||
stat_numbers[1] = t.add { type = "label", caption = global.total_ores_mined }
|
||||
|
||||
separators[1] = t.add { type = "label", caption = "|"}
|
||||
|
||||
captions[2] = t.add { type = "label", caption = "Rocks broken:" }
|
||||
stat_numbers[2] = t.add { type = "label", caption = global.stats_rocks_brocken }
|
||||
|
||||
separators[2] = t.add { type = "label", caption = "|"}
|
||||
|
||||
captions[3] = t.add { type = "label", caption = "Efficiency" }
|
||||
local x = math.ceil(game.forces.player.manual_mining_speed_modifier * 100 + global.player_hunger_buff[global.player_hunger[player.name]] * 100, 0)
|
||||
local str = ""
|
||||
if x > 0 then str = str .. "+" end
|
||||
str = str .. tostring(x)
|
||||
str = str .. "%"
|
||||
stat_numbers[3] = t.add { type = "label", caption = str }
|
||||
|
||||
if game.forces.player.manual_mining_speed_modifier > 0 or game.forces.player.mining_drill_productivity_bonus > 0 then
|
||||
separators[3] = t.add { type = "label", caption = "|"}
|
||||
|
||||
captions[5] = t.add { type = "label", caption = "Fortune" }
|
||||
local str = "+"
|
||||
str = str .. tostring(game.forces.player.mining_drill_productivity_bonus * 100)
|
||||
str = str .. "%"
|
||||
stat_numbers[4] = t.add { type = "label", caption = str }
|
||||
|
||||
end
|
||||
|
||||
for _, s in pairs (caption_style) do
|
||||
for _, l in pairs (captions) do
|
||||
l.style[s[1]] = s[2]
|
||||
end
|
||||
end
|
||||
for _, s in pairs (stat_number_style) do
|
||||
for _, l in pairs (stat_numbers) do
|
||||
l.style[s[1]] = s[2]
|
||||
end
|
||||
end
|
||||
for _, s in pairs (separator_style) do
|
||||
for _, l in pairs (separators) do
|
||||
l.style[s[1]] = s[2]
|
||||
end
|
||||
end
|
||||
stat_numbers[1].style.minimal_width = 9 * string.len(tostring(global.stats_ores_found))
|
||||
stat_numbers[2].style.minimal_width = 9 * string.len(tostring(global.stats_rocks_brocken))
|
||||
end
|
||||
|
||||
local function refresh_gui()
|
||||
for _, player in pairs(game.connected_players) do
|
||||
local frame = player.gui.top["caver_miner_stats_frame"]
|
||||
if (frame) then
|
||||
frame.destroy()
|
||||
create_cave_miner_stats_gui(player)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function treasure_chest(position)
|
||||
local p = game.surfaces[1].find_non_colliding_position("wooden-chest",position, 2,0.5)
|
||||
if not p then return end
|
||||
local e = game.surfaces[1].create_entity {name="wooden-chest",position=p, force="player"}
|
||||
e.minable = false
|
||||
local i = e.get_inventory(defines.inventory.chest)
|
||||
for x = 1, math.random(3,8), 1 do
|
||||
local loot = global.treasure_chest_raffle_table[math.random(1,#global.treasure_chest_raffle_table)]
|
||||
i.insert(loot)
|
||||
end
|
||||
end
|
||||
|
||||
local function secret_shop(pos)
|
||||
local secret_market_items = {
|
||||
{price = {{"raw-fish", math.random(250,450)}}, offer = {type = 'give-item', item = 'combat-shotgun'}},
|
||||
{price = {{"raw-fish", math.random(250,450)}}, offer = {type = 'give-item', item = 'flamethrower'}},
|
||||
{price = {{"raw-fish", math.random(75,125)}}, offer = {type = 'give-item', item = 'rocket-launcher'}},
|
||||
{price = {{"raw-fish", math.random(2,4)}}, offer = {type = 'give-item', item = 'piercing-rounds-magazine'}},
|
||||
{price = {{"raw-fish", math.random(14,28)}}, offer = {type = 'give-item', item = 'uranium-rounds-magazine'}},
|
||||
{price = {{"raw-fish", math.random(9,20)}}, offer = {type = 'give-item', item = 'piercing-shotgun-shell'}},
|
||||
{price = {{"raw-fish", math.random(6,12)}}, offer = {type = 'give-item', item = 'flamethrower-ammo'}},
|
||||
{price = {{"raw-fish", math.random(10,20)}}, offer = {type = 'give-item', item = 'rocket'}},
|
||||
{price = {{"raw-fish", math.random(15,25)}}, offer = {type = 'give-item', item = 'explosive-rocket'}},
|
||||
{price = {{"raw-fish", math.random(15,30)}}, offer = {type = 'give-item', item = 'explosive-cannon-shell'}},
|
||||
{price = {{"raw-fish", math.random(25,45)}}, offer = {type = 'give-item', item = 'explosive-uranium-cannon-shell'}},
|
||||
{price = {{"raw-fish", math.random(20,40)}}, offer = {type = 'give-item', item = 'cluster-grenade'}},
|
||||
{price = {{"raw-fish", math.random(1,3)}}, offer = {type = 'give-item', item = 'land-mine'}},
|
||||
{price = {{"raw-fish", math.random(250,500)}}, offer = {type = 'give-item', item = 'modular-armor'}},
|
||||
{price = {{"raw-fish", math.random(1500,3000)}}, offer = {type = 'give-item', item = 'power-armor'}},
|
||||
{price = {{"raw-fish", math.random(20000,25000)}}, offer = {type = 'give-item', item = 'power-armor-mk2'}},
|
||||
{price = {{"raw-fish", math.random(4500,9000)}}, offer = {type = 'give-item', item = 'fusion-reactor-equipment'}},
|
||||
{price = {{"raw-fish", math.random(50,100)}}, offer = {type = 'give-item', item = 'battery-equipment'}},
|
||||
{price = {{"raw-fish", math.random(700,1100)}}, offer = {type = 'give-item', item = 'battery-mk2-equipment'}},
|
||||
{price = {{"raw-fish", math.random(400,700)}}, offer = {type = 'give-item', item = 'belt-immunity-equipment'}},
|
||||
{price = {{"raw-fish", math.random(12000,16000)}}, offer = {type = 'give-item', item = 'night-vision-equipment'}},
|
||||
{price = {{"raw-fish", math.random(300,500)}}, offer = {type = 'give-item', item = 'exoskeleton-equipment'}},
|
||||
{price = {{"raw-fish", math.random(350,500)}}, offer = {type = 'give-item', item = 'personal-roboport-equipment'}},
|
||||
{price = {{"raw-fish", math.random(25,50)}}, offer = {type = 'give-item', item = 'construction-robot'}},
|
||||
{price = {{"raw-fish", math.random(250,450)}}, offer = {type = 'give-item', item = 'energy-shield-equipment'}},
|
||||
{price = {{"raw-fish", math.random(350,550)}}, offer = {type = 'give-item', item = 'personal-laser-defense-equipment'}},
|
||||
{price = {{"raw-fish", math.random(125,250)}}, offer = {type = 'give-item', item = 'railgun'}},
|
||||
{price = {{"raw-fish", math.random(2,4)}}, offer = {type = 'give-item', item = 'railgun-dart'}},
|
||||
{price = {{"raw-fish", math.random(100,175)}}, offer = {type = 'give-item', item = 'loader'}},
|
||||
{price = {{"raw-fish", math.random(200,350)}}, offer = {type = 'give-item', item = 'fast-loader'}},
|
||||
{price = {{"raw-fish", math.random(400,600)}}, offer = {type = 'give-item', item = 'express-loader'}}
|
||||
}
|
||||
local surface = game.surfaces[1]
|
||||
local market = surface.create_entity {name = "market", position = pos}
|
||||
market.destructible = false
|
||||
local market_items_to_add = math.random(8,12)
|
||||
while market_items_to_add >= 0 do
|
||||
local i = math.random(1,#secret_market_items)
|
||||
if secret_market_items[i] then
|
||||
market.add_market_item(secret_market_items[i])
|
||||
market_items_to_add = market_items_to_add - 1
|
||||
secret_market_items[i] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_chunk_generated(event)
|
||||
if not global.noise_seed then global.noise_seed = math.random(1,5000000) end
|
||||
local surface = game.surfaces[1]
|
||||
local noise = {}
|
||||
local tiles = {}
|
||||
local enemy_building_positions = {}
|
||||
local enemy_worm_positions = {}
|
||||
local rock_positions = {}
|
||||
local fish_positions = {}
|
||||
local treasure_chest_positions = {}
|
||||
local secret_shop_locations = {}
|
||||
local extra_tree_positions = {}
|
||||
local tile_to_insert = false
|
||||
local entity_has_been_placed = false
|
||||
local pos_x = 0
|
||||
local pos_y = 0
|
||||
local tile_distance_to_center = 0
|
||||
local entities = surface.find_entities(event.area)
|
||||
for _, e in pairs(entities) do
|
||||
if e.type == "resource" or e.type == "tree" or e.force.name == "enemy" then
|
||||
e.destroy()
|
||||
end
|
||||
end
|
||||
local noise_seed_add = 25000
|
||||
local current_noise_seed_add = noise_seed_add
|
||||
local m1 = 0.12
|
||||
local m2 = 0.10
|
||||
local m3 = 0.07
|
||||
|
||||
for x = 0, 31, 1 do
|
||||
for y = 0, 31, 1 do
|
||||
pos_x = event.area.left_top.x + x
|
||||
pos_y = event.area.left_top.y + y
|
||||
tile_distance_to_center = pos_x^2 + pos_y^2
|
||||
|
||||
noise[1] = simplex_noise.d2(pos_x/350, pos_y/350,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[2] = simplex_noise.d2(pos_x/200, pos_y/200,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[3] = simplex_noise.d2(pos_x/50, pos_y/50,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[4] = simplex_noise.d2(pos_x/20, pos_y/20,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
local cave_noise = noise[1] + noise[2]*0.3 + noise[3]*0.1 + noise[4]*0.02
|
||||
|
||||
noise[1] = simplex_noise.d2(pos_x/120, pos_y/120,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[2] = simplex_noise.d2(pos_x/60, pos_y/60,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[3] = simplex_noise.d2(pos_x/40, pos_y/40,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[4] = simplex_noise.d2(pos_x/20, pos_y/20,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
local cave_noise_2 = noise[1] + noise[2]*0.4 + noise[3]*0.25 + noise[4]*0.1
|
||||
|
||||
noise[1] = simplex_noise.d2(pos_x/50, pos_y/50,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[2] = simplex_noise.d2(pos_x/30, pos_y/30,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[3] = simplex_noise.d2(pos_x/20, pos_y/20,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
noise[4] = simplex_noise.d2(pos_x/10, pos_y/10,global.noise_seed+current_noise_seed_add)
|
||||
current_noise_seed_add = current_noise_seed_add + noise_seed_add
|
||||
local cave_noise_3 = noise[1] + noise[2]*0.5 + noise[3]*0.25 + noise[4]*0.1
|
||||
|
||||
current_noise_seed_add = noise_seed_add
|
||||
|
||||
tile_to_insert = false
|
||||
if tile_distance_to_center > global.spawn_dome_size then
|
||||
|
||||
if tile_distance_to_center > (global.spawn_dome_size + 5000) * (cave_noise_3 * 0.05 + 1.1) then
|
||||
if cave_noise > 1 then
|
||||
tile_to_insert = "deepwater"
|
||||
table.insert(fish_positions, {pos_x,pos_y})
|
||||
else
|
||||
if cave_noise > 0.98 then
|
||||
tile_to_insert = "water"
|
||||
else
|
||||
if cave_noise > 0.82 then
|
||||
tile_to_insert = "grass-1"
|
||||
table.insert(enemy_building_positions, {pos_x,pos_y})
|
||||
--tile_to_insert = "grass-4"
|
||||
--if cave_noise > 0.88 then tile_to_insert = "grass-2" end
|
||||
if cave_noise > 0.94 then
|
||||
table.insert(extra_tree_positions, {pos_x,pos_y})
|
||||
table.insert(secret_shop_locations, {pos_x,pos_y})
|
||||
end
|
||||
else
|
||||
if cave_noise > 0.72 then
|
||||
tile_to_insert = "dirt-6"
|
||||
if cave_noise < 0.79 then table.insert(rock_positions, {pos_x,pos_y}) end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if tile_to_insert == false then
|
||||
if cave_noise < m1 and cave_noise > m1*-1 then
|
||||
tile_to_insert = "dirt-7"
|
||||
table.insert(enemy_worm_positions, {pos_x,pos_y})
|
||||
if cave_noise_2 > 0.85 and tile_distance_to_center > global.spawn_dome_size + 40000 then
|
||||
if math.random(1,48) == 1 then
|
||||
local p = surface.find_non_colliding_position("crude-oil",{pos_x,pos_y}, 5,1)
|
||||
local e = surface.create_entity {name="crude-oil", position={pos_x,pos_y}, amount=math.floor(math.random(25000+tile_distance_to_center*0.5,50000+tile_distance_to_center),0)}
|
||||
end
|
||||
end
|
||||
else
|
||||
if cave_noise_2 < m2 and cave_noise_2 > m2*-1 and cave_noise > (m2*-1) - 0.3 then
|
||||
tile_to_insert = "dirt-4"
|
||||
table.insert(treasure_chest_positions, {pos_x,pos_y})
|
||||
else
|
||||
if cave_noise_3 < m3 and cave_noise_3 > m3*-1 and cave_noise_2 < m2+0.3 and cave_noise_2 > (m2*-1)-0.3 then
|
||||
tile_to_insert = "dirt-2"
|
||||
table.insert(treasure_chest_positions, {pos_x,pos_y})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if tile_distance_to_center < global.spawn_dome_size * (cave_noise_3 * 0.05 + 1.1) then
|
||||
tile_to_insert = "dirt-7"
|
||||
end
|
||||
else
|
||||
if tile_distance_to_center < 750 * (1 + cave_noise_3 * 0.8) then
|
||||
tile_to_insert = "water"
|
||||
table.insert(fish_positions, {pos_x,pos_y})
|
||||
else
|
||||
tile_to_insert = "grass-1"
|
||||
end
|
||||
end
|
||||
|
||||
if tile_distance_to_center < global.spawn_dome_size and tile_distance_to_center > global.spawn_dome_size - 500 and tile_to_insert == "grass-1" then
|
||||
table.insert(rock_positions, {pos_x,pos_y})
|
||||
end
|
||||
if tile_to_insert == "dirt-7" or tile_to_insert == "dirt-4" or tile_to_insert == "dirt-2" then
|
||||
table.insert(rock_positions, {pos_x,pos_y})
|
||||
end
|
||||
|
||||
if tile_to_insert == false then
|
||||
table.insert(tiles, {name = "out-of-map", position = {pos_x,pos_y}})
|
||||
else
|
||||
table.insert(tiles, {name = tile_to_insert, position = {pos_x,pos_y}})
|
||||
end
|
||||
end
|
||||
end
|
||||
surface.set_tiles(tiles,true)
|
||||
|
||||
for _, p in pairs(treasure_chest_positions) do
|
||||
if math.random(1,200)==1 then
|
||||
treasure_chest(p)
|
||||
end
|
||||
end
|
||||
|
||||
for _, p in pairs(enemy_building_positions) do
|
||||
if math.random(1,50)==1 then
|
||||
local pos = surface.find_non_colliding_position("biter-spawner", p, 16, 1)
|
||||
if pos then
|
||||
if math.random(1,3) == 1 then
|
||||
surface.create_entity {name="spitter-spawner",position=pos}
|
||||
else
|
||||
surface.create_entity {name="biter-spawner",position=pos}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for _, p in pairs(enemy_worm_positions) do
|
||||
if math.random(1,300)==1 then
|
||||
local tile_distance_to_center = math.sqrt(p[1]^2 + p[2]^2)
|
||||
if tile_distance_to_center > global.worm_free_zone_radius then
|
||||
local raffle_index = math.ceil((tile_distance_to_center-global.worm_free_zone_radius)*0.01, 0)
|
||||
if raffle_index < 1 then raffle_index = 1 end
|
||||
if raffle_index > 10 then raffle_index = 10 end
|
||||
local entity_name = global.worm_raffle_table[raffle_index][math.random(1,#global.worm_raffle_table[raffle_index])]
|
||||
surface.create_entity {name=entity_name, position=p}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for _, p in pairs(fish_positions) do
|
||||
if math.random(1,16)==1 then
|
||||
if surface.can_place_entity({name="fish",position=p}) then
|
||||
surface.create_entity {name="fish",position=p}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for _, p in pairs(secret_shop_locations) do
|
||||
if math.random(1,10)==1 then
|
||||
if surface.count_entities_filtered{area={{p[1]-125,p[2]-125},{p[1]+125,p[2]+125}}, name="market", limit=1} == 0 then
|
||||
secret_shop(p)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for _, p in pairs(extra_tree_positions) do
|
||||
if math.random(1,20)==1 then
|
||||
surface.create_entity {name="tree-02",position=p}
|
||||
end
|
||||
end
|
||||
|
||||
for _, p in pairs(rock_positions) do
|
||||
if math.random(1,3) ~= 1 then
|
||||
surface.create_entity {name=global.rock_raffle[math.random(1,#global.rock_raffle)], position=p}
|
||||
end
|
||||
end
|
||||
|
||||
local decorative_names = {}
|
||||
for k,v in pairs(game.decorative_prototypes) do
|
||||
if v.autoplace_specification then
|
||||
decorative_names[#decorative_names+1] = k
|
||||
end
|
||||
end
|
||||
surface.regenerate_decorative(decorative_names, {{x=math.floor(event.area.left_top.x/32),y=math.floor(event.area.left_top.y/32)}})
|
||||
end
|
||||
|
||||
local function hunger_update(player, food_value)
|
||||
|
||||
local past_hunger = global.player_hunger[player.name]
|
||||
global.player_hunger[player.name] = global.player_hunger[player.name] + food_value
|
||||
if global.player_hunger[player.name] > 200 then global.player_hunger[player.name] = 200 end
|
||||
|
||||
if past_hunger == 200 and global.player_hunger[player.name] + food_value > 200 then
|
||||
global.player_hunger[player.name] = global.player_hunger_spawn_value
|
||||
player.character.die("player")
|
||||
local t = {" ate too much and exploded.", " should have gone on a diet.", " needs to work on their bad eating habbits.", " should have skipped dinner today."}
|
||||
game.print(player.name .. t[math.random(1,#t)], { r=0.75, g=0.0, b=0.0})
|
||||
end
|
||||
|
||||
if global.player_hunger[player.name] < 1 then
|
||||
global.player_hunger[player.name] = global.player_hunger_spawn_value
|
||||
player.character.die("player")
|
||||
local t = {" ran out of foodstamps.", " starved.", " should not have skipped breakfast today."}
|
||||
game.print(player.name .. t[math.random(1,#t)], { r=0.75, g=0.0, b=0.0})
|
||||
end
|
||||
|
||||
if player.character then
|
||||
if global.player_hunger_stages[global.player_hunger[player.name]] ~= global.player_hunger_stages[past_hunger] then
|
||||
local print_message = "You are feeling " .. global.player_hunger_stages[global.player_hunger[player.name]] .. "."
|
||||
if global.player_hunger_stages[global.player_hunger[player.name]] == "Obese" then
|
||||
print_message = "You have become " .. global.player_hunger_stages[global.player_hunger[player.name]] .. "."
|
||||
end
|
||||
if global.player_hunger_stages[global.player_hunger[player.name]] == "Starving" then
|
||||
print_message = "You are starving!"
|
||||
end
|
||||
player.print(print_message, global.player_hunger_color_list[global.player_hunger[player.name]])
|
||||
end
|
||||
end
|
||||
|
||||
player.character.character_running_speed_modifier = global.player_hunger_buff[global.player_hunger[player.name]]
|
||||
player.character.character_mining_speed_modifier = global.player_hunger_buff[global.player_hunger[player.name]]
|
||||
end
|
||||
|
||||
local function on_player_joined_game(event)
|
||||
local surface = game.surfaces[1]
|
||||
local player = game.players[event.player_index]
|
||||
if not global.cave_miner_init_done then
|
||||
local p = surface.find_non_colliding_position("player", {0,-40}, 10, 1)
|
||||
game.forces["player"].set_spawn_position(p,surface)
|
||||
player.teleport(p)
|
||||
surface.daytime = 0.5
|
||||
surface.freeze_daytime = 1
|
||||
game.forces["player"].technologies["landfill"].enabled = false
|
||||
game.forces["player"].technologies["night-vision-equipment"].enabled = false
|
||||
game.map_settings.enemy_evolution.destroy_factor = 0.004
|
||||
|
||||
global.spawn_dome_size = 20000
|
||||
|
||||
global.player_hunger_fish_food_value = 10
|
||||
global.player_hunger_spawn_value = 80
|
||||
global.player_hunger = {}
|
||||
global.player_hunger_stages = {}
|
||||
for x = 1, 200, 1 do
|
||||
if x <= 200 then global.player_hunger_stages[x] = "Obese" end
|
||||
if x <= 179 then global.player_hunger_stages[x] = "Stuffed" end
|
||||
if x <= 150 then global.player_hunger_stages[x] = "Bloated" end
|
||||
if x <= 130 then global.player_hunger_stages[x] = "Sated" end
|
||||
if x <= 110 then global.player_hunger_stages[x] = "Well fed" end
|
||||
if x <= 89 then global.player_hunger_stages[x] = "Fed" end
|
||||
if x <= 70 then global.player_hunger_stages[x] = "Hungry" end
|
||||
if x <= 35 then global.player_hunger_stages[x] = "Starving" end
|
||||
end
|
||||
|
||||
global.player_hunger_color_list = {}
|
||||
for x = 1, 50, 1 do
|
||||
global.player_hunger_color_list[x] = {r = 0.5 + x*0.01, g = x*0.01, b = x*0.005}
|
||||
global.player_hunger_color_list[50+x] = {r = 1 - x*0.02, g = 0.5 + x*0.01, b = 0.25}
|
||||
global.player_hunger_color_list[100+x] = {r = 0 + x*0.02, g = 1 - x*0.01, b = 0.25}
|
||||
global.player_hunger_color_list[150+x] = {r = 1 - x*0.01, g = 0.5 - x*0.01, b = 0.25 - x*0.005}
|
||||
end
|
||||
|
||||
global.player_hunger_buff = {}
|
||||
local buff_top_value = 0.35
|
||||
for x = 1, 200, 1 do
|
||||
global.player_hunger_buff[x] = buff_top_value
|
||||
end
|
||||
local y = 1
|
||||
for x = 89, 1, -1 do
|
||||
global.player_hunger_buff[x] = buff_top_value - y * 0.01
|
||||
y = y + 1
|
||||
end
|
||||
local y = 1
|
||||
for x = 111, 200, 1 do
|
||||
global.player_hunger_buff[x] = buff_top_value - y * 0.01
|
||||
y = y + 1
|
||||
end
|
||||
|
||||
global.rock_inhabitants = {}
|
||||
global.rock_inhabitants[1] = {"small-biter"}
|
||||
global.rock_inhabitants[2] = {"small-biter","small-biter","small-biter","small-biter","small-biter","medium-biter"}
|
||||
global.rock_inhabitants[3] = {"small-biter","small-biter","small-biter","small-biter","medium-biter","medium-biter"}
|
||||
global.rock_inhabitants[4] = {"small-biter","small-biter","small-biter","medium-biter","medium-biter","small-spitter"}
|
||||
global.rock_inhabitants[5] = {"small-biter","small-biter","medium-biter","medium-biter","medium-biter","small-spitter"}
|
||||
global.rock_inhabitants[6] = {"small-biter","small-biter","medium-biter","medium-biter","big-biter","small-spitter"}
|
||||
global.rock_inhabitants[7] = {"small-biter","small-biter","medium-biter","medium-biter","big-biter","medium-spitter"}
|
||||
global.rock_inhabitants[8] = {"small-biter","medium-biter","medium-biter","medium-biter","big-biter","medium-spitter"}
|
||||
global.rock_inhabitants[9] = {"small-biter","medium-biter","medium-biter","big-biter","big-biter","medium-spitter"}
|
||||
global.rock_inhabitants[10] = {"medium-biter","medium-biter","medium-biter","big-biter","big-biter","big-spitter"}
|
||||
global.rock_inhabitants[11] = {"medium-biter","medium-biter","big-biter","big-biter","big-biter","big-spitter"}
|
||||
global.rock_inhabitants[12] = {"medium-biter","big-biter","big-biter","big-biter","big-biter","big-spitter"}
|
||||
global.rock_inhabitants[13] = {"big-biter","big-biter","big-biter","big-biter","big-biter","big-spitter"}
|
||||
global.rock_inhabitants[14] = {"big-biter","big-biter","big-biter","big-biter","behemoth-biter","big-spitter"}
|
||||
global.rock_inhabitants[15] = {"big-biter","big-biter","big-biter","behemoth-biter","behemoth-biter","big-spitter"}
|
||||
global.rock_inhabitants[16] = {"big-biter","big-biter","big-biter","behemoth-biter","behemoth-biter","behemoth-spitter"}
|
||||
global.rock_inhabitants[17] = {"big-biter","big-biter","behemoth-biter","behemoth-biter","behemoth-biter","behemoth-spitter"}
|
||||
global.rock_inhabitants[18] = {"big-biter","behemoth-biter","behemoth-biter","behemoth-biter","behemoth-biter","behemoth-spitter"}
|
||||
global.rock_inhabitants[19] = {"behemoth-biter","behemoth-biter","behemoth-biter","behemoth-biter","behemoth-biter","behemoth-spitter"}
|
||||
global.rock_inhabitants[20] = {"behemoth-biter","behemoth-biter","behemoth-biter","behemoth-biter","behemoth-spitter","behemoth-spitter"}
|
||||
|
||||
global.rock_raffle = {"sand-rock-big","sand-rock-big","rock-big","rock-big","rock-big","rock-huge"}
|
||||
|
||||
global.worm_raffle_table = {}
|
||||
global.worm_raffle_table[1] = {"small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret"}
|
||||
global.worm_raffle_table[2] = {"small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret"}
|
||||
global.worm_raffle_table[3] = {"small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret", "medium-worm-turret"}
|
||||
global.worm_raffle_table[4] = {"small-worm-turret", "small-worm-turret", "small-worm-turret", "small-worm-turret", "medium-worm-turret", "medium-worm-turret"}
|
||||
global.worm_raffle_table[5] = {"small-worm-turret", "small-worm-turret", "small-worm-turret", "medium-worm-turret", "medium-worm-turret", "medium-worm-turret"}
|
||||
global.worm_raffle_table[6] = {"small-worm-turret", "small-worm-turret", "small-worm-turret", "medium-worm-turret", "medium-worm-turret", "big-worm-turret"}
|
||||
global.worm_raffle_table[7] = {"small-worm-turret", "small-worm-turret", "small-worm-turret", "medium-worm-turret", "medium-worm-turret", "big-worm-turret"}
|
||||
global.worm_raffle_table[8] = {"small-worm-turret", "small-worm-turret", "small-worm-turret", "medium-worm-turret", "medium-worm-turret", "big-worm-turret"}
|
||||
global.worm_raffle_table[9] = {"small-worm-turret", "small-worm-turret", "medium-worm-turret", "medium-worm-turret", "big-worm-turret", "big-worm-turret"}
|
||||
global.worm_raffle_table[10] = {"small-worm-turret", "medium-worm-turret", "medium-worm-turret", "big-worm-turret", "big-worm-turret", "big-worm-turret"}
|
||||
global.worm_free_zone_radius = math.sqrt(global.spawn_dome_size) + 40
|
||||
|
||||
global.biter_spawn_schedule = {}
|
||||
|
||||
global.treasure_chest_raffle_table = {}
|
||||
global.treasure_chest_loot_weights = {}
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'iron-gear-wheel', count = 32},10})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'coal', count = 3},8})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'copper-cable', count = 128},10})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'inserter', count = 16},4})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'fast-inserter', count = 7},3})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'stack-filter-inserter', count = 2},1})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'stack-inserter', count = 2},1})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'burner-inserter', count = 16},6})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'electric-engine-unit', count = 11},3})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'rocket-fuel', count = 1},3})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'empty-barrel', count = 3},7})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'lubricant-barrel', count = 1},3})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'crude-oil-barrel', count = 4},3})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'iron-stick', count = 3},8})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = "small-electric-pole", count = 13},9})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = "firearm-magazine", count = 32},8})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'grenade', count = 8},5})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'land-mine', count = 15},4})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'light-armor', count = 1},1})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'heavy-armor', count = 1},2})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'pipe', count = 26},6})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'wooden-chest', count = 1},3})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'burner-mining-drill', count = 1},1})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'iron-axe', count = 1},2})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'steel-axe', count = 1},3})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'raw-wood', count = 24},5})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'sulfur', count = 27},7})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'explosives', count = 36},6})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'shotgun', count = 1},2})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'stone-brick', count = 72},4})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'small-lamp', count = 4},4})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'rail', count = 57},4})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'coin', count = 1},1})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'assembling-machine-1', count = 1},2})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'assembling-machine-2', count = 1},2})
|
||||
table.insert(global.treasure_chest_loot_weights, {{name = 'assembling-machine-3', count = 1},1})
|
||||
|
||||
for _, t in pairs (global.treasure_chest_loot_weights) do
|
||||
for x = 1, t[2], 1 do
|
||||
table.insert(global.treasure_chest_raffle_table, t[1])
|
||||
end
|
||||
end
|
||||
|
||||
global.ore_spill_cap = 35
|
||||
global.stats_rocks_brocken = 0
|
||||
global.stats_ores_found = 0
|
||||
global.total_ores_mined = 0
|
||||
|
||||
global.rock_mining_chance_weights = {}
|
||||
global.rock_mining_chance_weights[1] = {"iron-ore",25}
|
||||
global.rock_mining_chance_weights[2] = {"copper-ore",18}
|
||||
global.rock_mining_chance_weights[3] = {"coal",14}
|
||||
--global.rock_mining_chance_weights[4] = {"stone",8}
|
||||
global.rock_mining_chance_weights[4] = {"uranium-ore",3}
|
||||
global.rock_mining_raffle_table = {}
|
||||
for _, t in pairs (global.rock_mining_chance_weights) do
|
||||
for x = 1, t[2], 1 do
|
||||
table.insert(global.rock_mining_raffle_table, t[1])
|
||||
end
|
||||
end
|
||||
|
||||
global.darkness_threat_level = {}
|
||||
global.darkness_messages = {
|
||||
"Something is lurking in the dark...",
|
||||
"A shadow moves. I doubt it is friendly...",
|
||||
"The silence grows louder...",
|
||||
"Trust not your eyes. They are useless in the dark.",
|
||||
"The darkness hides only death. Turn back now.",
|
||||
"You hear noises...",
|
||||
"They chitter as if laughing, hungry for their next foolish meal...",
|
||||
"Despite what the radars tell you, it is not safe here...",
|
||||
"The shadows are moving...",
|
||||
"You feel like, something is watching you...",
|
||||
}
|
||||
|
||||
global.cave_miner_init_done = true
|
||||
end
|
||||
if player.online_time < 10 then
|
||||
create_cave_miner_button(player)
|
||||
global.player_hunger[player.name] = global.player_hunger_spawn_value
|
||||
hunger_update(player, 0)
|
||||
global.darkness_threat_level[player.name] = 0
|
||||
player.insert {name = 'pistol', count = 1}
|
||||
--player.insert {name = 'raw-fish', count = 1}
|
||||
player.insert {name = 'firearm-magazine', count = 16}
|
||||
player.insert {name = 'iron-axe', count = 1}
|
||||
end
|
||||
create_cave_miner_stats_gui(player)
|
||||
end
|
||||
|
||||
local function spawn_cave_inhabitant(pos)
|
||||
if not pos.x then return nil end
|
||||
if not pos.y then return nil end
|
||||
local tile_distance_to_center = math.sqrt(pos.x^2 + pos.y^2)
|
||||
local rock_inhabitants_index = math.ceil((tile_distance_to_center-math.sqrt(global.spawn_dome_size))*0.02, 0)
|
||||
if rock_inhabitants_index < 1 then rock_inhabitants_index = 1 end
|
||||
if rock_inhabitants_index > 20 then rock_inhabitants_index = 20 end
|
||||
local entity_name = global.rock_inhabitants[rock_inhabitants_index][math.random(1,#global.rock_inhabitants[rock_inhabitants_index])]
|
||||
local p = game.surfaces[1].find_non_colliding_position(entity_name , pos, 7, 0.5)
|
||||
if p then game.surfaces[1].create_entity {name=entity_name, position=p} end
|
||||
end
|
||||
|
||||
local function darkness_events()
|
||||
for _, p in pairs (game.connected_players) do
|
||||
if global.darkness_threat_level[p.name] > 4 then
|
||||
for x = 1, global.darkness_threat_level[p.name], 1 do
|
||||
spawn_cave_inhabitant(p.position)
|
||||
end
|
||||
local biters_found = game.surfaces[1].find_enemy_units(p.position, 12, "player")
|
||||
for _, biter in pairs(biters_found) do
|
||||
biter.set_command({type=defines.command.attack, target=p.character, distraction=defines.distraction.none})
|
||||
end
|
||||
p.character.damage(math.random(global.darkness_threat_level[p.name]*2,global.darkness_threat_level[p.name]*3),"enemy")
|
||||
end
|
||||
if global.darkness_threat_level[p.name] == 2 then
|
||||
p.print(global.darkness_messages[math.random(1,#global.darkness_messages)],{ r=0.65, g=0.0, b=0.0})
|
||||
end
|
||||
global.darkness_threat_level[p.name] = global.darkness_threat_level[p.name] + 1
|
||||
end
|
||||
end
|
||||
|
||||
local function darkness_checks()
|
||||
for _, p in pairs (game.connected_players) do
|
||||
p.character.disable_flashlight()
|
||||
local tile_distance_to_center = math.sqrt(p.position.x^2 + p.position.y^2)
|
||||
if tile_distance_to_center < math.sqrt(global.spawn_dome_size) then
|
||||
global.darkness_threat_level[p.name] = 0
|
||||
else
|
||||
if p.character.driving == true then
|
||||
global.darkness_threat_level[p.name] = 0
|
||||
else
|
||||
local light_source_entities = game.surfaces[1].find_entities_filtered{area={{p.position.x-12,p.position.y-12},{p.position.x+12,p.position.y+12}}, name="small-lamp"}
|
||||
for _, lamp in pairs (light_source_entities) do
|
||||
local circuit = lamp.get_or_create_control_behavior()
|
||||
if circuit then
|
||||
if lamp.energy > 50 and circuit.disabled == false then
|
||||
global.darkness_threat_level[p.name] = 0
|
||||
break
|
||||
end
|
||||
else
|
||||
if lamp.energy > 50 then
|
||||
global.darkness_threat_level[p.name] = 0
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_tick(event)
|
||||
|
||||
if game.tick % 30 == 0 then
|
||||
if global.biter_spawn_schedule then
|
||||
for x, b in pairs (global.biter_spawn_schedule) do
|
||||
if game.tick > b[1] then
|
||||
spawn_cave_inhabitant(b[2])
|
||||
global.biter_spawn_schedule[x] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if game.tick % 240 == 0 then
|
||||
darkness_checks()
|
||||
darkness_events()
|
||||
end
|
||||
|
||||
if game.tick % 3600 == 1800 then
|
||||
for _, player in pairs(game.connected_players) do
|
||||
if player.afk_time < 18000 then hunger_update(player, -1) end
|
||||
end
|
||||
refresh_gui()
|
||||
end
|
||||
|
||||
if game.tick == 30 then
|
||||
local surface = game.surfaces[1]
|
||||
--p = game.forces["player"].get_spawn_position(surface)
|
||||
local p = game.surfaces[1].find_non_colliding_position("market",{0,-15},60,0.5)
|
||||
local market = surface.create_entity {name = "market", position = p}
|
||||
market.destructible = false
|
||||
|
||||
for _, item in pairs(market_items.spawn) do
|
||||
market.add_market_item(item)
|
||||
end
|
||||
surface.regenerate_entity({"tree-01", "tree-02","tree-03","tree-04","tree-05","tree-06","tree-07","tree-08","tree-09","dead-dry-hairy-tree","dead-grey-trunk","dead-tree-desert","dry-hairy-tree","dry-tree","rock-big","rock-huge"})
|
||||
end
|
||||
|
||||
if global.map_pregeneration_is_active then
|
||||
if game.tick % 600 == 0 then
|
||||
local r = 1
|
||||
for x = 1,40,1 do
|
||||
if game.forces.map_pregen.is_chunk_charted(game.surfaces[1], {x,x}) then r = x end
|
||||
end
|
||||
game.print("Map chunks are generating... current radius " .. r, { r=0.22, g=0.99, b=0.99})
|
||||
if game.forces.map_pregen.is_chunk_charted(game.surfaces[1], {40,40}) then
|
||||
game.print("Map generation done!", { r=0.22, g=0.99, b=0.99})
|
||||
|
||||
game.players[1].force = game.forces["player"]
|
||||
global.map_pregeneration_is_active = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_marked_for_deconstruction(event)
|
||||
if event.entity.name == "rock-huge" or event.entity.name == "rock-big" or event.entity.name == "sand-rock-big" then
|
||||
event.entity.cancel_deconstruction(game.players[event.player_index].force.name)
|
||||
end
|
||||
end
|
||||
|
||||
local function pre_player_mined_item(event)
|
||||
local surface = game.surfaces[1]
|
||||
|
||||
if math.random(1,10) == 1 then
|
||||
if event.entity.name == "rock-huge" or event.entity.name == "rock-big" or event.entity.name == "sand-rock-big" then
|
||||
for x = 1, math.random(6,10), 1 do
|
||||
table.insert(global.biter_spawn_schedule, {game.tick + 30*x, event.entity.position})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if event.entity.name == "rock-huge" or event.entity.name == "rock-big" or event.entity.name == "sand-rock-big" then
|
||||
local player = game.players[event.player_index]
|
||||
local rock_position = {x = event.entity.position.x, y = event.entity.position.y}
|
||||
event.entity.destroy()
|
||||
local tile_distance_to_center = math.sqrt(rock_position.x^2 + rock_position.y^2)
|
||||
|
||||
if math.random(1,3) == 1 then hunger_update(player, -1) end
|
||||
|
||||
surface.spill_item_stack(player.position,{name = "raw-fish", count = math.random(3,4)},true)
|
||||
local bonus_amount = math.ceil((tile_distance_to_center - math.sqrt(global.spawn_dome_size)) * 0.38, 0)
|
||||
if bonus_amount < 1 then bonus_amount = 0 end
|
||||
local amount = (math.random(45,55) + bonus_amount)*(1+game.forces.player.mining_drill_productivity_bonus)
|
||||
|
||||
amount = math.round(amount, 0)
|
||||
amount_of_stone = math.round(amount * 0.1,0)
|
||||
|
||||
global.stats_ores_found = global.stats_ores_found + amount + amount_of_stone
|
||||
|
||||
local mined_loot = global.rock_mining_raffle_table[math.random(1,#global.rock_mining_raffle_table)]
|
||||
if amount > global.ore_spill_cap then
|
||||
surface.spill_item_stack(rock_position,{name = mined_loot, count = global.ore_spill_cap},true)
|
||||
amount = amount - global.ore_spill_cap
|
||||
local i = player.insert {name = mined_loot, count = amount}
|
||||
amount = amount - i
|
||||
if amount > 0 then
|
||||
surface.spill_item_stack(rock_position,{name = mined_loot, count = amount},true)
|
||||
end
|
||||
else
|
||||
surface.spill_item_stack(rock_position,{name = mined_loot, count = amount},true)
|
||||
end
|
||||
|
||||
if amount_of_stone > global.ore_spill_cap then
|
||||
surface.spill_item_stack(rock_position,{name = "stone", count = global.ore_spill_cap},true)
|
||||
amount_of_stone = amount_of_stone - global.ore_spill_cap
|
||||
local i = player.insert {name = "stone", count = amount_of_stone}
|
||||
amount_of_stone = amount_of_stone - i
|
||||
if amount_of_stone > 0 then
|
||||
surface.spill_item_stack(rock_position,{name = "stone", count = amount_of_stone},true)
|
||||
end
|
||||
else
|
||||
surface.spill_item_stack(rock_position,{name = "stone", count = amount_of_stone},true)
|
||||
end
|
||||
|
||||
global.stats_rocks_brocken = global.stats_rocks_brocken + 1
|
||||
refresh_gui()
|
||||
|
||||
if math.random(1,100) == 1 and mined_loot ~= "stone" then
|
||||
local p = {x = rock_position.x, y = rock_position.y}
|
||||
local tile_distance_to_center = p.x^2 + p.y^2
|
||||
if tile_distance_to_center > global.spawn_dome_size + 3000 then
|
||||
local radius = 50
|
||||
if 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_raffle = {{"huge", 20, 30},{"big", 11, 20},{"", 5, 10},{"", 5, 10},{"tiny", 2, 5},{"tiny", 2, 5},{"tiny", 2, 5}}
|
||||
local size = size_raffle[math.random(1,#size_raffle)]
|
||||
local ore_prints = {coal = {"dark", "Coal"}, ["iron-ore"] = {"shiny", "Iron"}, ["copper-ore"] = {"glimmering", "Copper"}, ["uranium-ore"] = {"glowing", "Uranium"}}
|
||||
player.print("You notice something " .. ore_prints[mined_loot][1] .. " underneath the rubble covered floor. It´s a " .. size[1] .. " vein of " .. ore_prints[mined_loot][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},{0,-1},{0,1}}
|
||||
while ore_entities_placed < math.random(size[2],size[3]) do
|
||||
local a = math.ceil((math.random(tile_distance_to_center*3, tile_distance_to_center*4)) / 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 surface.can_place_entity({name=mined_loot, position=pos, amount=a}) then
|
||||
surface.create_entity {name=mined_loot, position=pos, amount=a}
|
||||
p = pos
|
||||
break
|
||||
end
|
||||
end
|
||||
ore_entities_placed = ore_entities_placed + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_player_mined_entity(event)
|
||||
if event.entity.name == "rock-huge" or event.entity.name == "rock-big" or event.entity.name == "sand-rock-big" then
|
||||
event.buffer.clear()
|
||||
end
|
||||
if event.entity.name == "fish" then
|
||||
if math.random(1,2) == 1 then
|
||||
local player = game.players[event.player_index]
|
||||
local health = player.character.health
|
||||
player.character.damage(math.random(50,150),"enemy")
|
||||
if not player.character then
|
||||
game.print(player.name .. " should have kept their hands out of the foggy lake waters.",{ r=0.75, g=0.0, b=0.0} )
|
||||
else
|
||||
if health > 200 then
|
||||
player.print("You got bitten by an angry cave piranha.",{ r=0.75, g=0.0, b=0.0})
|
||||
else
|
||||
local messages = {"Ouch.. That hurt! Better be careful now.", "Just a fleshwound.", "Better keep those hands to yourself or you might loose them."}
|
||||
player.print(messages[math.random(1,#messages)],{ r=0.75, g=0.0, b=0.0})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_entity_damaged(event)
|
||||
if event.entity.name == "rock-huge" or event.entity.name == "rock-big" or event.entity.name == "sand-rock-big" then
|
||||
local rock_is_alive = true
|
||||
if event.force.name == "enemy" then
|
||||
event.entity.health = event.entity.health + (event.final_damage_amount - 0.05)
|
||||
if event.entity.health <= event.final_damage_amount then
|
||||
rock_is_alive = false
|
||||
end
|
||||
end
|
||||
if event.entity.health <= 0 then rock_is_alive = false end
|
||||
if rock_is_alive == false then
|
||||
if event.force.name == "player" then
|
||||
if math.random(1,8) == 1 then
|
||||
for x = 1, math.random(8,12), 1 do
|
||||
table.insert(global.biter_spawn_schedule, {game.tick + 5*x, event.entity.position})
|
||||
end
|
||||
end
|
||||
end
|
||||
local p = event.entity.position
|
||||
local drop_amount = math.random(10,20)
|
||||
event.entity.destroy()
|
||||
game.surfaces[1].spill_item_stack(p,{name = "stone", count = drop_amount},true)
|
||||
global.stats_rocks_brocken = global.stats_rocks_brocken + 1
|
||||
global.stats_ores_found = global.stats_ores_found + drop_amount
|
||||
refresh_gui()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_player_respawned(event)
|
||||
local player = game.players[event.player_index]
|
||||
player.character.disable_flashlight()
|
||||
global.player_hunger[player.name] = global.player_hunger_spawn_value
|
||||
hunger_update(player, 0)
|
||||
refresh_gui()
|
||||
end
|
||||
|
||||
local function on_research_finished(event)
|
||||
game.forces.player.manual_mining_speed_modifier = game.forces.player.mining_drill_productivity_bonus * 3
|
||||
game.forces.player.character_inventory_slots_bonus = game.forces.player.mining_drill_productivity_bonus * 500
|
||||
refresh_gui()
|
||||
end
|
||||
|
||||
local function on_gui_click(event)
|
||||
if not (event and event.element and event.element.valid) then return end
|
||||
|
||||
local player = game.players[event.element.player_index]
|
||||
local name = event.element.name
|
||||
local frame = player.gui.top["caver_miner_stats_frame"]
|
||||
|
||||
if (name == "caver_miner_stats_toggle_button") and (frame == nil) then
|
||||
create_cave_miner_stats_gui(player)
|
||||
else
|
||||
if (name == "caver_miner_stats_toggle_button") then
|
||||
frame.destroy()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_player_used_capsule(event)
|
||||
if event.item.name == "raw-fish" then
|
||||
local player = game.players[event.player_index]
|
||||
hunger_update(player, global.player_hunger_fish_food_value)
|
||||
player.play_sound{path="utility/armor_insert", volume_modifier=1}
|
||||
refresh_gui()
|
||||
end
|
||||
end
|
||||
|
||||
function map_pregen()
|
||||
local radius = 1280
|
||||
if not game.forces.map_pregen then game.create_force("map_pregen") end
|
||||
game.players[1].force = game.forces["map_pregen"]
|
||||
game.forces.map_pregen.chart(game.surfaces[1],{{x = -1 * radius, y = -1 * radius}, {x = radius, y = radius}})
|
||||
global.map_pregeneration_is_active = true
|
||||
end
|
||||
|
||||
function test()
|
||||
local x = 0
|
||||
if x == 1 then
|
||||
local surface = game.surfaces[1]
|
||||
game.player.cheat_mode=true
|
||||
game.speed = 1
|
||||
surface.daytime = 1
|
||||
game.player.force.research_all_technologies()
|
||||
game.forces["enemy"].evolution_factor = 0.2
|
||||
local chart = 200
|
||||
local surface = game.surfaces[1]
|
||||
game.forces["player"].chart(surface, {lefttop = {x = chart*-1, y = chart*-1}, rightbottom = {x = chart, y = chart}})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Event.add(defines.events.on_player_used_capsule, on_player_used_capsule)
|
||||
Event.add(defines.events.on_gui_click, on_gui_click)
|
||||
Event.add(defines.events.on_research_finished, on_research_finished)
|
||||
Event.add(defines.events.on_player_respawned, on_player_respawned)
|
||||
Event.add(defines.events.on_player_mined_entity, on_player_mined_entity)
|
||||
Event.add(defines.events.on_entity_damaged, on_entity_damaged)
|
||||
Event.add(defines.events.on_pre_player_mined_item, pre_player_mined_item)
|
||||
Event.add(defines.events.on_marked_for_deconstruction, on_marked_for_deconstruction)
|
||||
Event.add(defines.events.on_chunk_generated, on_chunk_generated)
|
||||
Event.add(defines.events.on_tick, on_tick)
|
||||
Event.add(defines.events.on_player_joined_game, on_player_joined_game)
|
33
map_gen/combined/cave_miner/market_items.lua
Normal file
33
map_gen/combined/cave_miner/market_items.lua
Normal file
@ -0,0 +1,33 @@
|
||||
local items = {}
|
||||
items.spawn = {
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'rail', count = 4}},
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'rail-signal', count = 2}},
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'rail-chain-signal', count = 2}},
|
||||
{price = {{"raw-fish", 10}}, offer = {type = 'give-item', item = 'train-stop'}},
|
||||
{price = {{"raw-fish", 94}}, offer = {type = 'give-item', item = 'locomotive'}},
|
||||
{price = {{"raw-fish", 35}}, offer = {type = 'give-item', item = 'cargo-wagon'}},
|
||||
{price = {{"raw-fish", 1}}, offer = {type = 'give-item', item = 'red-wire', count = 1}},
|
||||
{price = {{"raw-fish", 1}}, offer = {type = 'give-item', item = 'green-wire', count = 1}},
|
||||
{price = {{"raw-fish", 4}}, offer = {type = 'give-item', item = 'decider-combinator'}},
|
||||
{price = {{"raw-fish", 4}}, offer = {type = 'give-item', item = 'arithmetic-combinator'}},
|
||||
{price = {{"raw-fish", 2}}, offer = {type = 'give-item', item = 'constant-combinator'}},
|
||||
{price = {{"raw-fish", 4}}, offer = {type = 'give-item', item = 'programmable-speaker'}},
|
||||
{price = {{"raw-fish", 2}}, offer = {type = 'give-item', item = 'small-lamp'}},
|
||||
{price = {{"raw-fish", 2}}, offer = {type = 'give-item', item = 'firearm-magazine'}},
|
||||
{price = {{"raw-fish", 4}}, offer = {type = 'give-item', item = 'piercing-rounds-magazine'}},
|
||||
{price = {{"raw-fish", 3}}, offer = {type = 'give-item', item = 'grenade'}},
|
||||
{price = {{"raw-fish", 2}}, offer = {type = 'give-item', item = 'land-mine'}},
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'raw-wood', count = 25}},
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'iron-ore', count = 25}},
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'copper-ore', count = 25}},
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'stone', count = 25}},
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'coal', count = 25}},
|
||||
{price = {{"raw-fish", 5}}, offer = {type = 'give-item', item = 'uranium-ore', count = 20}},
|
||||
{price = {{'raw-wood', 25}}, offer = {type = 'give-item', item = "raw-fish", count = 2}},
|
||||
{price = {{'iron-ore', 25}}, offer = {type = 'give-item', item = "raw-fish", count = 2}},
|
||||
{price = {{'copper-ore', 25}}, offer = {type = 'give-item', item = "raw-fish", count = 2}},
|
||||
{price = {{'stone', 25}}, offer = {type = 'give-item', item = "raw-fish", count = 2}},
|
||||
{price = {{'coal', 25}}, offer = {type = 'give-item', item = "raw-fish", count = 2}},
|
||||
{price = {{'uranium-ore', 20}}, offer = {type = 'give-item', item = "raw-fish", count = 2}}
|
||||
}
|
||||
return items
|
@ -19,6 +19,8 @@ local tiles_per_tick = 32
|
||||
--require "map_gen.combined.dimensions"
|
||||
--require "map_gen.combined.dagobah_swamp"
|
||||
--require "map_gen.combined.meteor_strike" --unfinished
|
||||
--require 'map_gen.combined.cave_miner.cave_miner'
|
||||
|
||||
|
||||
--presets--
|
||||
--shape = require "map_gen.presets.template"
|
||||
|
@ -4,7 +4,7 @@ local Utils = require "utils.utils"
|
||||
|
||||
function allowed_to_nuke(player)
|
||||
if type(player) == "table" then
|
||||
return player.admin or UserGroups.is_regular(player.name) or ((player.online_time / 216000) > global.scenario.config.nuke_min_time_hours)
|
||||
return player.admin or UserGroups.is_regular(player.name) or ((player.online_time / 216000) > global.scenario.config.nuke_control.nuke_min_time_hours)
|
||||
elseif type(player) == "number" then
|
||||
return allowed_to_nuke(game.players[player])
|
||||
end
|
||||
@ -109,7 +109,8 @@ local function on_capsule_used(event)
|
||||
local item = event.item
|
||||
local player = game.players[event.player_index]
|
||||
|
||||
if not player or not player.valid then
|
||||
if not player or not player.valid or
|
||||
(global.scenario.config.nuke_control.enable_autokick and global.scenario.config.nuke_control.enable_autoban) then
|
||||
return
|
||||
end
|
||||
|
||||
@ -128,10 +129,14 @@ local function on_capsule_used(event)
|
||||
end
|
||||
if count > 8 then
|
||||
if global.players_warned[event.player_index] then
|
||||
game.ban_player(player, string.format("Damaged %i entities with %s. This action was performed automatically. If you want to contest this ban please visit redmew.com/discord.", count, event.item.name))
|
||||
if global.scenario.config.nuke_control.enable_autokick then
|
||||
game.ban_player(player, string.format("Damaged %i entities with %s. This action was performed automatically. If you want to contest this ban please visit redmew.com/discord.", count, event.item.name))
|
||||
end
|
||||
else
|
||||
global.players_warned[event.player_index] = true
|
||||
game.kick_player(player, string.format("Damaged %i entities with %s -Antigrief", count, event.item.name))
|
||||
if global.scenario.config.nuke_control.enable_autoban then
|
||||
game.print(player, string.format("Damaged %i entities with %s -Antigrief", count, event.item.name))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -40,6 +40,9 @@ local filter_table_close_button_name = Gui.uid_name()
|
||||
|
||||
global.paint_brushes_by_player = {}
|
||||
local function player_build_tile(event)
|
||||
if not global.scenario.config.paint.enable then
|
||||
return
|
||||
end
|
||||
if event.item.name ~= brush_tool then
|
||||
return
|
||||
end
|
||||
@ -71,6 +74,9 @@ local function player_build_tile(event)
|
||||
end
|
||||
|
||||
local function player_joined(event)
|
||||
if not global.scenario.config.paint.enable then
|
||||
return
|
||||
end
|
||||
local player = game.players[event.player_index]
|
||||
if not player or not player.valid then
|
||||
return
|
||||
|
@ -439,18 +439,23 @@ local column_builders = {
|
||||
}
|
||||
|
||||
local function get_default_player_settings()
|
||||
return {
|
||||
columns = {
|
||||
columns = {
|
||||
sprite_heading_name,
|
||||
player_name_heading_name,
|
||||
time_heading_name,
|
||||
rank_heading_name,
|
||||
distance_heading_name,
|
||||
coin_heading_name,
|
||||
deaths_heading_name,
|
||||
poke_name_heading_name,
|
||||
report_heading_name
|
||||
},
|
||||
distance_heading_name
|
||||
}
|
||||
local offset = 6
|
||||
if global.scenario.config.player_list.enable_coin_col then
|
||||
columns[6] = coin_heading_name
|
||||
offset = 7
|
||||
end
|
||||
columns[offset] = deaths_heading_name
|
||||
columns[offset + 1] = poke_name_heading_name
|
||||
columns[offset + 2] = report_heading_name
|
||||
return {
|
||||
columns = columns,
|
||||
sort = -3
|
||||
}
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user