1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-03-17 20:58:13 +02:00

mirror terrain

This commit is contained in:
MewMew 2019-11-06 12:36:31 +01:00
parent 950aa6febe
commit ed8aefc867
5 changed files with 181 additions and 85 deletions

View File

@ -16,13 +16,13 @@ end
function Public.unit_health_buttons(player)
if player.gui.top.health_boost_west then return end
local button = player.gui.top.add({type = "sprite-button", name = "health_boost_west", caption = 1, tooltip = "Health increase of west side biters."})
local button = player.gui.top.add({type = "sprite-button", name = "health_boost_west", caption = 1, tooltip = "Health modfier of west side biters.\nIncreases by feeding."})
button.style.font = "heading-1"
button.style.font_color = {r = 0, g = 180, b = 0}
button.style.minimal_height = 38
button.style.minimal_width = 78
button.style.padding = 2
local button = player.gui.top.add({type = "sprite-button", name = "health_boost_east", caption = 1, tooltip = "Health increase of east side biters."})
local button = player.gui.top.add({type = "sprite-button", name = "health_boost_east", caption = 1, tooltip = "Health modfier of east side biters.\nIncreases by feeding."})
button.style.font = "heading-1"
button.style.font_color = {r = 180, g = 180, b = 0}
button.style.minimal_height = 38

View File

@ -4,7 +4,6 @@ local Tabs = require 'comfy_panel.main'
local Map_score = require "modules.map_score"
local Unit_health_booster = require "modules.biter_health_booster"
local unit_raffle = require "maps.biter_hatchery.raffle_tables"
local map_functions = require "tools.map_functions"
local Terrain = require "maps.biter_hatchery.terrain"
local Gui = require "maps.biter_hatchery.gui"
require "maps.biter_hatchery.share_chat"
@ -14,7 +13,20 @@ local Map = require "modules.map_info"
local math_random = math.random
local Public = {}
local m = 4
local map_gen_settings = {
["seed"] = 1,
["water"] = 1,
["starting_area"] = 1,
["cliff_settings"] = {cliff_elevation_interval = 0, cliff_elevation_0 = 0},
["default_enable_all_autoplace_controls"] = false,
["autoplace_settings"] = {
["entity"] = {treat_missing_as_default = false},
["tile"] = {treat_missing_as_default = false},
["decorative"] = {treat_missing_as_default = false},
},
}
local m = 3
local health_boost_food_values = {
["automation-science-pack"] = 0.000001 * m,
["logistic-science-pack"] = 0.0000025 * m,
@ -42,37 +54,8 @@ for x = worm_turret_spawn_radius * -1, 0, 1 do
end
end
local function draw_spawn_ores(surface)
local x = global.map_forces.west.hatchery.position.x - 64
map_functions.draw_smoothed_out_ore_circle({x = x, y = 32}, "iron-ore", surface, 15, 2500)
map_functions.draw_smoothed_out_ore_circle({x = x, y = -32}, "copper-ore", surface, 15, 2500)
map_functions.draw_smoothed_out_ore_circle({x = x, y = 0}, "coal", surface, 15, 1500)
map_functions.draw_smoothed_out_ore_circle({x = x, y = 64}, "stone", surface, 15, 1500)
local x = global.map_forces.east.hatchery.position.x + 64
map_functions.draw_smoothed_out_ore_circle({x = x, y = 32}, "copper-ore", surface, 15, 2500)
map_functions.draw_smoothed_out_ore_circle({x = x, y = -32}, "iron-ore", surface, 15, 2500)
map_functions.draw_smoothed_out_ore_circle({x = x, y = 0}, "coal", surface, 15, 1500)
map_functions.draw_smoothed_out_ore_circle({x = x, y = -64}, "stone", surface, 15, 1500)
end
function Public.reset_map()
local map_gen_settings = {}
map_gen_settings.seed = math_random(1, 10000000)
map_gen_settings.water = 0.2
map_gen_settings.starting_area = 1
map_gen_settings.terrain_segmentation = 10
map_gen_settings.cliff_settings = {cliff_elevation_interval = math_random(16, 48), cliff_elevation_0 = math_random(16, 48)}
map_gen_settings.autoplace_controls = {
["coal"] = {frequency = 100, size = 0.5, richness = 0.5,},
["stone"] = {frequency = 100, size = 0.5, richness = 0.5,},
["copper-ore"] = {frequency = 200, size = 0.6, richness = 0.5,},
["iron-ore"] = {frequency = 200, size = 0.6, richness = 0.5,},
["uranium-ore"] = {frequency = 50, size = 0.5, richness = 0.5,},
["crude-oil"] = {frequency = 50, size = 0.5, richness = 0.5,},
["trees"] = {frequency = math_random(5, 10) * 0.1, size = math_random(5, 10) * 0.1, richness = math_random(3, 10) * 0.1},
["enemy-base"] = {frequency = 0, size = 0, richness = 0}
}
Terrain.create_mirror_surface()
if not global.active_surface_index then
global.active_surface_index = game.create_surface("biter_hatchery", map_gen_settings).index
@ -81,32 +64,12 @@ function Public.reset_map()
end
local surface = game.surfaces[global.active_surface_index]
surface.request_to_generate_chunks({0,0}, 10)
surface.force_generate_chunk_requests()
game.forces.west.set_spawn_position({-160, 0}, surface)
game.forces.east.set_spawn_position({160, 0}, surface)
local e = surface.create_entity({name = "biter-spawner", position = {-160, 0}, force = "west"})
surface.create_entity({name = "small-worm-turret", position = {-155, 0}, force = "west"})
e.active = false
global.map_forces.west.hatchery = e
global.map_forces.east.target = e
local e = surface.create_entity({name = "biter-spawner", position = {160, 0}, force = "east"})
surface.create_entity({name = "small-worm-turret", position = {155, 0}, force = "east"})
e.active = false
global.map_forces.east.hatchery = e
global.map_forces.west.target = e
global.map_forces.east.unit_health_boost = 1
global.map_forces.west.unit_health_boost = 1
global.map_forces.east.unit_count = 0
global.map_forces.west.unit_count = 0
global.map_forces.east.max_unit_count = 1024
global.map_forces.west.max_unit_count = 1024
draw_spawn_ores(surface)
game.forces.spectator.set_spawn_position({0, 128}, surface)
game.forces.west.set_spawn_position({-200, 0}, surface)
game.forces.east.set_spawn_position({200, 0}, surface)
RPG.rpg_reset_all_players()
@ -114,7 +77,6 @@ function Public.reset_map()
Team.assign_random_force_to_active_players()
for _, player in pairs(game.connected_players) do
if player.gui.left.biter_hatchery_game_won then player.gui.left.biter_hatchery_game_won.destroy() end
Team.teleport_player_to_active_surface(player)
end
@ -199,6 +161,7 @@ end
local function nom()
local surface = game.surfaces[global.active_surface_index]
for key, force in pairs(global.map_forces) do
if not force.hatchery then return end
force.hatchery.health = force.hatchery.health + 1
local belts = get_belts(force.hatchery)
for _, belt in pairs(belts) do
@ -283,8 +246,10 @@ local function on_entity_died(event)
player.play_sound{path="utility/game_lost", volume_modifier=0.85}
end
for _, player in pairs(game.forces.west.connected_players) do
player.play_sound{path="utility/game_won", volume_modifier=0.85}
Map_score.set_score(player, Map_score.get_score(player) + 1)
player.play_sound{path="utility/game_won", volume_modifier=0.85}
--if #entity.force.players > 0 then
Map_score.set_score(player, Map_score.get_score(player) + 1)
--end
end
else
game.print("West lost their Hatchery.", {100, 100, 100})
@ -294,7 +259,9 @@ local function on_entity_died(event)
end
for _, player in pairs(game.forces.east.connected_players) do
player.play_sound{path="utility/game_won", volume_modifier=0.85}
Map_score.set_score(player, Map_score.get_score(player) + 1)
--if #entity.force.players > 0 then
Map_score.set_score(player, Map_score.get_score(player) + 1)
--end
end
end
@ -304,7 +271,9 @@ local function on_entity_died(event)
for _, player in pairs(game.forces.spectator.connected_players) do
player.play_sound{path="utility/game_won", volume_modifier=0.85}
end
global.game_reset_tick = game.tick + 1800
game.delete_surface("mirror_terrain")
for _, player in pairs(game.connected_players) do
for _, child in pairs(player.gui.left.children) do child.destroy() end
@ -321,8 +290,6 @@ local function on_player_joined_game(event)
Gui.unit_health_buttons(player)
Gui.update_health_boost_buttons(player)
if player.gui.left.biter_hatchery_game_won then player.gui.left.biter_hatchery_game_won.destroy() end
if player.surface.index ~= global.active_surface_index then
if player.force.name == "spectator" then
Team.set_player_to_spectator(player)
@ -338,16 +305,16 @@ end
local function tick()
local game_tick = game.tick
if game_tick % 240 == 0 then
local area = {{-256, -97}, {255, 96}}
local area = {{-320, -161}, {319, 160}}
game.forces.west.chart(game.surfaces[global.active_surface_index], area)
game.forces.east.chart(game.surfaces[global.active_surface_index], area)
game.forces.east.chart(game.surfaces[global.active_surface_index], area)
end
if game_tick % 1200 == 0 then send_unit_groups() end
if global.game_reset_tick then
if global.game_reset_tick < game_tick then
global.game_reset_tick = nil
Public.reset_map()
end
end
return
end
nom()
@ -380,7 +347,9 @@ local function on_entity_damaged(event)
local cause = event.cause
if cause then
if cause.valid then
if cause.type == "unit" then return end
if cause.type == "unit" then
if math_random(1,5) == 1 then return end
end
end
end
entity.health = entity.health + event.final_damage_amount

View File

@ -20,6 +20,13 @@ function Public.set_force_attributes()
game.forces.east.technologies["artillery"].enabled = false
game.forces.east.technologies["artillery-shell-range-1"].enabled = false
game.forces.east.technologies["artillery-shell-speed-1"].enabled = false
global.map_forces.east.unit_health_boost = 1
global.map_forces.west.unit_health_boost = 1
global.map_forces.east.unit_count = 0
global.map_forces.west.unit_count = 0
global.map_forces.east.max_unit_count = 1024
global.map_forces.west.max_unit_count = 1024
end
function Public.create_forces()

View File

@ -1,4 +1,9 @@
local math_abs = math.abs
local math_random = math.random
local Map_functions = require "tools.map_functions"
local Public = {}
local hatchery_position = {x = 192, y = 0}
local function get_replacement_tile(surface, position)
for i = 1, 128, 1 do
@ -12,6 +17,98 @@ local function get_replacement_tile(surface, position)
return "grass-1"
end
local function create_nests(surface)
local x = hatchery_position.x
local e = surface.create_entity({name = "biter-spawner", position = {x * -1, 0}, force = "west"})
surface.create_entity({name = "small-worm-turret", position = {x * -1 + 6, 0}, force = "west"})
e.active = false
global.map_forces.west.hatchery = e
global.map_forces.east.target = e
local e = surface.create_entity({name = "biter-spawner", position = {x, 0}, force = "east"})
surface.create_entity({name = "small-worm-turret", position = {x - 6, 0}, force = "east"})
e.active = false
global.map_forces.east.hatchery = e
global.map_forces.west.target = e
end
function Public.create_mirror_surface()
if game.surfaces["mirror_terrain"] then return end
local map_gen_settings = {}
map_gen_settings.seed = math_random(1, 99999999)
map_gen_settings.water = 0.2
map_gen_settings.starting_area = 1
map_gen_settings.terrain_segmentation = 8
map_gen_settings.cliff_settings = {cliff_elevation_interval = 0, cliff_elevation_0 = 0}
map_gen_settings.autoplace_controls = {
["coal"] = {frequency = 5, size = 0.7, richness = 0.5,},
["stone"] = {frequency = 5, size = 0.7, richness = 0.5,},
["copper-ore"] = {frequency = 10, size = 0.7, richness = 0.75,},
["iron-ore"] = {frequency = 10, size = 0.7, richness = 1,},
["uranium-ore"] = {frequency = 5, size = 0.5, richness = 0.5,},
["crude-oil"] = {frequency = 10, size = 1, richness = 1,},
["trees"] = {frequency = math_random(5, 12) * 0.1, size = math_random(5, 12) * 0.1, richness = math_random(1, 10) * 0.1},
["enemy-base"] = {frequency = 0, size = 0, richness = 0}
}
local surface = game.create_surface("mirror_terrain", map_gen_settings)
local x = hatchery_position.x - 16
local offset = 38
surface.request_to_generate_chunks({x, 0}, 5)
surface.force_generate_chunk_requests()
local positions = {{x = x, y = offset}, {x = x, y = offset * -1}, {x = x, y = offset * -2}, {x = x, y = offset * 2}}
table.shuffle_table(positions)
for key, ore in pairs({"copper-ore", "iron-ore", "coal", "stone"}) do
Map_functions.draw_smoothed_out_ore_circle(surface.find_non_colliding_position("coal", positions[key], 128, 1), ore, surface, 15, 2500)
end
local r = 32
for x = r * -1, r, 1 do
for y = r * -1, r, 1 do
local p = {x = hatchery_position.x + x, y = hatchery_position.y + y}
if math.sqrt(x ^ 2 + y ^ 2) < r then
local tile = surface.get_tile(p)
if tile.name == "water" or tile.name == "deepwater" then
surface.set_tiles({{name = "landfill", position = p}}, true)
end
end
end
end
end
local function mirror_chunk(event, source_surface, x_modifier)
local surface = event.surface
local left_top = event.area.left_top
local offset = 0
if x_modifier == -1 then offset = 32 end
local mirror_left_top = {x = left_top.x * x_modifier - offset, y = left_top.y}
source_surface.request_to_generate_chunks(mirror_left_top, 1)
source_surface.force_generate_chunk_requests()
local mirror_area = {{mirror_left_top.x, mirror_left_top.y}, {mirror_left_top.x + 32, mirror_left_top.y + 32}}
for _, tile in pairs(source_surface.find_tiles_filtered({area = mirror_area})) do
surface.set_tiles({{name = tile.name, position = {x = tile.position.x * x_modifier, y = tile.position.y}}}, true)
end
for _, entity in pairs(source_surface.find_entities_filtered({area = mirror_area})) do
if surface.can_place_entity({name = entity.name, position = {x = entity.position.x * x_modifier, y = entity.position.y}}) then
entity.clone({position = {x = entity.position.x * x_modifier, y = entity.position.y}, surface = surface, force = "neutral"})
end
end
for _, decorative in pairs(source_surface.find_decoratives_filtered{area = mirror_area}) do
surface.create_decoratives{
check_collision=false,
decoratives={{name = decorative.decorative.name, position = {x = decorative.position.x * x_modifier, y = decorative.position.y}, amount = decorative.amount}}
}
end
end
local function combat_area(event)
local surface = event.surface
local left_top = event.area.left_top
@ -19,17 +116,23 @@ local function combat_area(event)
if left_top.y >= 96 then return end
if left_top.y < -96 then return end
local replacement_tile = "landfill"
local tile = surface.get_tile({8,0})
if tile then replacement_tile = tile.name end
for _, tile in pairs(surface.find_tiles_filtered({area = event.area})) do
if tile.name == "water" or tile.name == "deepwater" then
surface.set_tiles({{name = get_replacement_tile(surface, tile.position), position = tile.position}}, true)
end
if tile.position.x >= -4 and tile.position.x <= 4 then
--if tile.name == "water" or tile.name == "deepwater" then
--surface.set_tiles({{name = replacement_tile, position = tile.position}}, true)
--end
if tile.position.x >= -4 and tile.position.x < 4 then
surface.set_tiles({{name = "water-shallow", position = tile.position}}, true)
end
end
--[[
for _, entity in pairs(surface.find_entities_filtered({type = {"resource", "cliff"}, area = event.area})) do
entity.destroy()
end
end
]]
end
local function is_out_of_map(p)
@ -42,29 +145,46 @@ end
local function out_of_map_area(event)
local surface = event.surface
local left_top = event.area.left_top
for x = 0, 31, 1 do
for y = 0, 31, 1 do
for x = -1, 32, 1 do
for y = -1, 32, 1 do
local p = {x = left_top.x + x, y = left_top.y + y}
if is_out_of_map(p) then surface.set_tiles({{name = "out-of-map", position = p}}, true) end
if is_out_of_map(p) then
surface.set_tiles({{name = "out-of-map", position = p}}, true)
end
end
end
end
local function on_chunk_generated(event)
local source_surface = game.surfaces["mirror_terrain"]
if not source_surface then return end
if not source_surface.valid then return end
if event.surface.index == source_surface.index then return end
local left_top = event.area.left_top
if left_top.x >= 0 then
mirror_chunk(event, source_surface, 1)
else
mirror_chunk(event, source_surface, -1)
end
out_of_map_area(event)
if left_top.x >= -192 and left_top.x < 192 then combat_area(event) end
if left_top.x > 512 then return end
if left_top.x < -512 then return end
if left_top.y > 512 then return end
if left_top.y < -512 then return end
if left_top.x == 256 and left_top.y == 256 then create_nests(event.surface) end
if left_top.x > 320 then return end
if left_top.x < -320 then return end
if left_top.y > 320 then return end
if left_top.y < -320 then return end
game.forces.west.chart(event.surface, {{left_top.x, left_top.y},{left_top.x + 31, left_top.y + 31}})
game.forces.east.chart(event.surface, {{left_top.x, left_top.y},{left_top.x + 31, left_top.y + 31}})
end
local event = require 'utils.event'
event.add(defines.events.on_chunk_generated, on_chunk_generated)
event.add(defines.events.on_chunk_generated, on_chunk_generated)
return Public

View File

@ -34,8 +34,8 @@ local score_list = (function (player, frame)
local scroll_pane = frame.add { type = "scroll-pane", name = "scroll_pane", direction = "vertical", horizontal_scroll_policy = "never", vertical_scroll_policy = "auto"}
scroll_pane.style.minimal_width = 780
scroll_pane.style.maximal_height = 320
scroll_pane.style.minimal_height = 320
scroll_pane.style.maximal_height = 360
scroll_pane.style.minimal_height = 360
local t = scroll_pane.add {type = "table", column_count = 3}