From 7cc7ba2d60c07994d4601c3fb9b41c593326157e Mon Sep 17 00:00:00 2001 From: MewMew <=> Date: Fri, 15 Mar 2019 01:39:49 +0100 Subject: [PATCH] biter_battles > rainbow ore --- maps/biter_battles/biter_battles.lua | 8 +- maps/biter_battles_v2/biter_battles_v2.lua | 26 +++++-- maps/biter_battles_v2/game_won.lua | 8 +- maps/biter_battles_v2/gui.lua | 85 +++++++++++++++------- maps/biter_battles_v2/terrain.lua | 24 +++++- 5 files changed, 112 insertions(+), 39 deletions(-) diff --git a/maps/biter_battles/biter_battles.lua b/maps/biter_battles/biter_battles.lua index 98a20567..c6292eb1 100644 --- a/maps/biter_battles/biter_battles.lua +++ b/maps/biter_battles/biter_battles.lua @@ -495,9 +495,9 @@ local function on_player_joined_game(event) } game.create_surface("surface", map_gen_settings) - game.map_settings.enemy_evolution.time_factor = 0.000005 - game.map_settings.enemy_evolution.destroy_factor = 0.004 - game.map_settings.enemy_evolution.pollution_factor = 0.000025 + game.map_settings.enemy_evolution.time_factor = 0.000004 + game.map_settings.enemy_evolution.destroy_factor = 0.0035 + game.map_settings.enemy_evolution.pollution_factor = 0.000005 game.map_settings.enemy_expansion.enabled = true game.map_settings.enemy_expansion.min_expansion_cooldown = 18000 game.map_settings.enemy_expansion.max_expansion_cooldown = 72000 @@ -538,6 +538,8 @@ local function on_player_joined_game(event) game.forces[name].set_turret_attack_modifier("flamethrower-turret", -0.5) --game.forces[name].set_ammo_damage_modifier("artillery-shell", -0.95) game.forces[name].set_ammo_damage_modifier("shotgun-shell", 0.5) + + game.forces[name].research_queue_enabled = true end game.forces["spectator"].technologies["toolbelt"].researched=true diff --git a/maps/biter_battles_v2/biter_battles_v2.lua b/maps/biter_battles_v2/biter_battles_v2.lua index 8b6dd8a7..e5ba09af 100644 --- a/maps/biter_battles_v2/biter_battles_v2.lua +++ b/maps/biter_battles_v2/biter_battles_v2.lua @@ -11,10 +11,10 @@ local function init_surface() map_gen_settings.starting_area = "5" map_gen_settings.cliff_settings = {cliff_elevation_interval = 12, cliff_elevation_0 = 32} map_gen_settings.autoplace_controls = { - ["coal"] = {frequency = "4", size = "1", richness = "1"}, - ["stone"] = {frequency = "4", size = "1", richness = "1"}, - ["copper-ore"] = {frequency = "4", size = "1", richness = "1"}, - ["iron-ore"] = {frequency = "4", size = "1", richness = "1"}, + ["coal"] = {frequency = "3", size = "1", richness = "1"}, + ["stone"] = {frequency = "3", size = "1", richness = "1"}, + ["copper-ore"] = {frequency = "3", size = "1", richness = "1"}, + ["iron-ore"] = {frequency = "3", size = "1", richness = "1"}, ["uranium-ore"] = {frequency = "2", size = "1", richness = "1"}, ["crude-oil"] = {frequency = "3", size = "1", richness = "1"}, ["trees"] = {frequency = "2", size = "1", richness = "1"}, @@ -72,12 +72,27 @@ local function init_forces(surface) local f = game.forces["player"] f.set_spawn_position({0,0},surface) + local p = game.permissions.create_group("spectator") + for action_name, _ in pairs(defines.input_action) do + p.set_allows_action(defines.input_action[action_name], false) + end + p.set_allows_action(defines.input_action.write_to_console, true) + p.set_allows_action(defines.input_action.gui_click, true) + p.set_allows_action(defines.input_action.gui_selection_state_changed, true) + p.set_allows_action(defines.input_action.start_walking, true) + p.set_allows_action(defines.input_action.open_kills_gui, true) + p.set_allows_action(defines.input_action.open_character_gui, true) + p.set_allows_action(defines.input_action.edit_permission_group, true) + p.set_allows_action(defines.input_action.toggle_show_entity_info, true) + global.spectator_rejoin_delay = {} + for _, force in pairs(game.forces) do game.forces[force.name].technologies["artillery"].enabled = false game.forces[force.name].technologies["artillery-shell-range-1"].enabled = false game.forces[force.name].technologies["artillery-shell-speed-1"].enabled = false game.forces[force.name].technologies["atomic-bomb"].enabled = false game.forces[force.name].set_ammo_damage_modifier("shotgun-shell", 1) + game.forces[force.name].research_queue_enabled = true end global.game_lobby_active = true @@ -99,9 +114,10 @@ local function on_player_joined_game(event) player.teleport({0,0}, surface) end player.character.destructible = false + game.permissions.get_group("spectator").add_player(player.name) end - --player.character.destroy() + player.character.destroy() end event.add(defines.events.on_player_joined_game, on_player_joined_game) diff --git a/maps/biter_battles_v2/game_won.lua b/maps/biter_battles_v2/game_won.lua index ffc97c89..4d3b723a 100644 --- a/maps/biter_battles_v2/game_won.lua +++ b/maps/biter_battles_v2/game_won.lua @@ -1,4 +1,5 @@ local event = require 'utils.event' +local math_random = math.random local particles = {"coal-particle", "copper-ore-particle", "iron-ore-particle", "stone-particle"} local function create_fireworks_rocket(surface, position) @@ -178,9 +179,10 @@ local function on_entity_died(event) if event.entity == global.rocket_silo.south or event.entity == global.rocket_silo.north then for _, player in pairs(game.connected_players) do player.play_sound{path="utility/game_won", volume_modifier=1} - end - show_mvps(player) - fireworks(surface) + if player.gui.left["bb_main_gui"] then player.gui.left["bb_main_gui"].destroy() end + show_mvps(player) + end + fireworks(event.entity.surface) end end diff --git a/maps/biter_battles_v2/gui.lua b/maps/biter_battles_v2/gui.lua index 85658096..f0b4f873 100644 --- a/maps/biter_battles_v2/gui.lua +++ b/maps/biter_battles_v2/gui.lua @@ -224,44 +224,61 @@ local function refresh_gui() end local function join_team(player, force_name) - if not global.chosen_team then global.chosen_team = {} end local surface = player.surface - if global.chosen_team[player.name] then - local p = surface.find_non_colliding_position("player", game.forces[global.chosen_team[player.name]].get_spawn_position(surface), 3, 1) + local enemy_team = "south" + if force_name == "south" then enemy_team = "north" end + + if #game.forces[force_name].connected_players > #game.forces[enemy_team].connected_players then + player.print("Team " .. force_name .. " has too many players currently.", {r=0.98, g=0.66, b=0.22}) + return + end + + if global.chosen_team[player.name] then + if game.tick - global.spectator_rejoin_delay[player.name] < 1800 then + player.print( + "Not ready to return to your team yet. Please wait " .. 30-(math.ceil((game.tick - global.spectator_rejoin_delay[player.name])/60)) .. " seconds.", + {r=0.98, g=0.66, b=0.22} + ) + return + end + local p = surface.find_non_colliding_position("player", game.forces[force_name].get_spawn_position(surface), 8, 0.5) player.teleport(p, surface) player.force = game.forces[force_name] - local p = game.permissions.get_group("Default") + local p = game.permissions.get_group("Default") p.add_player(player.name) game.print("Team " .. player.force.name .. " player " .. player.name .. " is no longer spectating.", {r=0.98, g=0.66, b=0.22}) return end - - local enemy_team = "south" - if force_name == "south" then enemy_team = "north" end - - if #game.forces[force_name].connected_players > #game.forces[enemy_team].connected_players then - player.print("Team " .. force_name .. " has too many players currently.", {r=0.98, g=0.66, b=0.22}) - else - player.teleport(surface.find_non_colliding_position("player", game.forces[force_name].get_spawn_position(surface), 3, 1)) - player.force = game.forces[force_name] - game.print(player.name .. " has joined team " .. player.force.name .. "!", {r=0.98, g=0.66, b=0.22}) - local i = player.get_inventory(defines.inventory.player_main) - player.insert {name = 'pistol', count = 1} - player.insert {name = 'raw-fish', count = 3} - player.insert {name = 'firearm-magazine', count = 16} - player.insert {name = 'iron-gear-wheel', count = 4} - player.insert {name = 'iron-plate', count = 8} - global.chosen_team[player.name] = force_name - end + + player.teleport(surface.find_non_colliding_position("player", game.forces[force_name].get_spawn_position(surface), 3, 1)) + player.force = game.forces[force_name] + game.print(player.name .. " has joined team " .. player.force.name .. "!", {r=0.98, g=0.66, b=0.22}) + local i = player.get_inventory(defines.inventory.player_main) + i.clear() + player.insert {name = 'pistol', count = 1} + player.insert {name = 'raw-fish', count = 3} + player.insert {name = 'firearm-magazine', count = 16} + player.insert {name = 'iron-gear-wheel', count = 4} + player.insert {name = 'iron-plate', count = 8} + global.chosen_team[player.name] = force_name +end + +local function spectate(player) + player.teleport(player.surface.find_non_colliding_position("player", {0,0}, 2, 1)) + player.force = game.forces.spectator + game.print(player.name .. " is spectating.", { r=0.98, g=0.66, b=0.22}) + local permission_group = game.permissions.get_group("spectator") + permission_group.add_player(player.name) + global.spectator_rejoin_delay[player.name] = game.tick + create_main_gui(player) end local function join_gui_click(name, player) local team = { ["join_north_button"] = "north", ["join_south_button"] = "south" - } - + } if global.game_lobby_active then if player.admin then join_team(player, team[name]) @@ -293,19 +310,33 @@ local function on_gui_click(event) --if food_names[name] then feed_the_biters(player, name) return end + if name == "bb_leave_spectate" then join_team(player, global.chosen_team[player.name]) end + if name == "bb_spectate" then - if player.position.y < 100 and player.position.y > -100 and player.position.x < 100 and player.position.x > -100 then - --join_team(player, "spectator") + if player.position.y ^ 2 + player.position.x ^ 2 < 12000 then + spectate(player) else player.print("You are too far away from spawn to spectate.",{ r=0.98, g=0.66, b=0.22}) end - end + return + end + + if name == "bb_hide_players" then + global.bb_view_players[player.name] = false + create_main_gui(player) + end + if name == "bb_view_players" then + global.bb_view_players[player.name] = true + create_main_gui(player) + end end local function on_player_joined_game(event) local player = game.players[event.player_index] if not global.bb_view_players then global.bb_view_players = {} end + if not global.chosen_team then global.chosen_team = {} end + global.bb_view_players[player.name] = false create_sprite_button(player) diff --git a/maps/biter_battles_v2/terrain.lua b/maps/biter_battles_v2/terrain.lua index 2817ce5d..da40e262 100644 --- a/maps/biter_battles_v2/terrain.lua +++ b/maps/biter_battles_v2/terrain.lua @@ -4,6 +4,7 @@ local math_random = math.random local simplex_noise = require 'utils.simplex_noise'.d2 local create_tile_chain = require "functions.create_tile_chain" local spawn_circle_size = 28 +local ores = {"copper-ore", "iron-ore", "stone", "coal"} local function get_noise(name, pos) local seed = game.surfaces[1].map_gen_settings.seed @@ -81,6 +82,26 @@ local function generate_river(event) end end +local function generate_rainbow_ore(event) + local surface = event.surface + local left_top_x = event.area.left_top.x + local left_top_y = event.area.left_top.y + for x = 0, 31, 1 do + for y = 0, 31, 1 do + local pos = {x = left_top_x + x, y = left_top_y + y} + if surface.can_place_entity({name = "iron-ore", position = pos}) then + local noise = get_noise(1, pos) + if noise > 0.83 then + local amount = math_random(1500, 2000) + math.sqrt(pos.x ^ 2 + pos.y ^ 2) * noise * 4 + local i = math.ceil(math.abs(noise * 25)) % 4 + if i == 0 then i = 4 end + surface.create_entity({name = ores[i], position = pos, amount = amount}) + end + end + end + end +end + local function on_chunk_generated(event) if event.area.left_top.y >= 0 then return end local surface = event.surface @@ -94,9 +115,10 @@ local function on_chunk_generated(event) generate_river(event) generate_circle_spawn(event) generate_silos(event) + generate_rainbow_ore(event) if event.area.left_top.y == -160 and event.area.left_top.x == -160 then - for _, e in pairs(surface.find_entities_filtered({area = {{-8,-8},{8,8}}})) do + for _, e in pairs(surface.find_entities_filtered({area = {{-10,-10},{10,10}}})) do if e.name ~= "player" then e.destroy() end end end