mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-01-10 00:43:27 +02:00
233914ec5b
Integration of loot boxes. Improved map creation. Added raw materials next to the base. Player death message improved. Created a new laser POI.
1681 lines
61 KiB
Lua
1681 lines
61 KiB
Lua
|
|
-- factorio scenario -- tank conquest -- xalpha made this --
|
|
|
|
local blueprint_poi_base_json = require 'maps.tank_conquest.blueprint_poi_base_json'
|
|
|
|
local blueprint_poi_spot_one_json = require 'maps.tank_conquest.blueprint_poi_spot_one_json'
|
|
|
|
local blueprint_poi_spot_two_json = require 'maps.tank_conquest.blueprint_poi_spot_two_json'
|
|
|
|
local blueprint_poi_spot_three_json = require 'maps.tank_conquest.blueprint_poi_spot_three_json'
|
|
|
|
local blueprint_poi_fire_json = require 'maps.tank_conquest.blueprint_poi_fire_json'
|
|
|
|
local blueprint_poi_laser_json = require 'maps.tank_conquest.blueprint_poi_laser_json'
|
|
|
|
global.table_of_properties = {}
|
|
|
|
global.table_of_properties.required_number_of_players = 2
|
|
|
|
global.table_of_properties.countdown_in_seconds = 28800
|
|
|
|
global.table_of_properties.wait_in_seconds = 2
|
|
|
|
global.table_of_properties.size_of_the_battlefield = 2000
|
|
|
|
global.table_of_properties.amount_of_tickets = 800
|
|
|
|
global.table_of_properties.conquest_speed = 5
|
|
|
|
global.table_of_properties.acceleration_value = 0.05
|
|
|
|
global.table_of_properties.game_stage = 'lobby'
|
|
|
|
global.table_of_tanks = {}
|
|
|
|
global.table_of_scores = {}
|
|
|
|
global.table_of_spots = {}
|
|
|
|
global.table_of_squads = {}
|
|
|
|
global.table_of_circles = {}
|
|
|
|
local table_of_colors = { squad = { r = 75, g = 155, b = 45 }, team = { r = 65, g = 120, b = 200 }, enemy = { r = 190, g = 55, b = 50 }, neutral = { r = 77, g = 77, b = 77 }, damage = { r = 255, g = 0, b = 255 }, white = { r = 255, g = 255, b = 255 } }
|
|
|
|
local table_of_loots = { { name = 'piercing-rounds-magazine', count = 50 }, { name = 'uranium-rounds-magazine', count = 50 }, { name = 'combat-shotgun', count = 1 }, { name = 'shotgun-shell', count = 20 }, { name = 'piercing-shotgun-shell', count = 20 }, { name = 'flamethrower', count = 1 }, { name = 'flamethrower-ammo', count = 50 }, { name = 'rocket-launcher', count = 1 }, { name = 'rocket', count = 10 }, { name = 'explosive-rocket', count = 20 }, { name = 'grenade', count = 40 }, { name = 'cluster-grenade', count = 20 }, { name = 'cannon-shell', count = 8 }, { name = 'explosive-cannon-shell', count = 8 }, { name = 'uranium-cannon-shell', count = 8 }, { name = 'explosive-uranium-cannon-shell', count = 8 }, { name = 'modular-armor', count = 1 }, { name = 'power-armor', count = 1 }, { name = 'power-armor-mk2', count = 1 }, { name = 'exoskeleton-equipment', count = 1 }, { name = 'battery-mk2-equipment', count = 1 }, { name = 'energy-shield-equipment', count = 1 }, { name = 'fusion-reactor-equipment', count = 1 }, { name = 'solid-fuel', count = 50 }, { name = 'rocket-fuel', count = 10 }, { name = 'nuclear-fuel', count = 1 }, { name = 'gate', count = 20 }, { name = 'stone-wall', count = 40 } }
|
|
|
|
local table_of_ores = { 'iron-ore', 'copper-ore', 'stone', 'coal' }
|
|
|
|
local map_functions = require 'tools.map_functions'
|
|
|
|
local event = require 'utils.event'
|
|
|
|
local map_intro = [[
|
|
- - - T A N K C O N Q U E S T - - -
|
|
|
|
Your objective is to defend your team's tickets and withdraw the tickets from the
|
|
other team as quickly as possible.
|
|
|
|
PvP battles and the conquest of the spots are the deciding factor to win the round.
|
|
|
|
Each force has a number of tickets. Per conquered spot, 0.05 tickets are deducted
|
|
per second. If a player loses his life, 1 ticket is deducted from his own force.
|
|
|
|
The battlefield is created when at least two players are online.
|
|
|
|
There is no biter evolution from pollution, time or destruction.
|
|
]]
|
|
|
|
local function draw_gui_map_intro_button( player )
|
|
|
|
if player.gui.top[ 'map_intro_button' ] then return end
|
|
|
|
local element_button = player.gui.top.add( { type = 'sprite-button', caption = '?', name = 'map_intro_button', tooltip = 'Map Intro' } )
|
|
|
|
element_button.style.font_color = { r = 0.5, g = 0.3, b = 0.99 }
|
|
|
|
element_button.style.font = 'heading-1'
|
|
|
|
element_button.style.minimal_height = 38
|
|
|
|
element_button.style.minimal_width = 38
|
|
|
|
element_button.style.top_padding = 1
|
|
|
|
element_button.style.left_padding = 1
|
|
|
|
element_button.style.right_padding = 1
|
|
|
|
element_button.style.bottom_padding = 1
|
|
|
|
end
|
|
|
|
local function draw_gui_map_intro( player )
|
|
|
|
if player.gui.center[ 'map_intro_frame' ] then player.gui.center[ 'map_intro_frame' ].destroy() end
|
|
|
|
local element_frame = player.gui.center.add { type = 'frame', name = 'map_intro_frame', direction = 'vertical' }
|
|
|
|
local element_frame = element_frame.add { type = 'frame' }
|
|
|
|
local element_label = element_frame.add { type = 'label', caption = map_intro, name = 'map_intro_text' }
|
|
|
|
element_label.style.top_padding = 10
|
|
|
|
element_label.style.single_line = false
|
|
|
|
element_label.style.font = 'heading-2'
|
|
|
|
element_label.style.font_color = { r = 0.7, g = 0.6, b = 0.99 }
|
|
|
|
end
|
|
|
|
local function initialize_forces()
|
|
|
|
game.create_force( 'force_player_one' )
|
|
|
|
game.create_force( 'force_player_two' )
|
|
|
|
game.create_force( 'force_biter_one' )
|
|
|
|
game.create_force( 'force_biter_two' )
|
|
|
|
game.create_force( 'force_spectator' )
|
|
|
|
local force = game.forces[ 'force_player_one' ]
|
|
|
|
if global.table_of_properties[ force.name ] == nil then global.table_of_properties[ force.name ] = { name = force.name, enemy = 'force_player_two', icon = '☠', available_tickets = global.table_of_properties.amount_of_tickets } end
|
|
|
|
force.set_friend( 'force_biter_two', true )
|
|
|
|
force.set_friend( 'force_spectator', true )
|
|
|
|
force.set_cease_fire( 'player', true )
|
|
|
|
force.friendly_fire = false
|
|
|
|
force.share_chart = true
|
|
|
|
local force = game.forces[ 'force_player_two' ]
|
|
|
|
if global.table_of_properties[ force.name ] == nil then global.table_of_properties[ force.name ] = { name = force.name, enemy = 'force_player_one', icon = '☣', available_tickets = global.table_of_properties.amount_of_tickets } end
|
|
|
|
force.set_friend( 'force_biter_one', true )
|
|
|
|
force.set_friend( 'force_spectator', true )
|
|
|
|
force.set_cease_fire( 'player', true )
|
|
|
|
force.friendly_fire = false
|
|
|
|
force.share_chart = true
|
|
|
|
local force = game.forces[ 'force_biter_one' ]
|
|
|
|
force.set_friend( 'force_player_two', true )
|
|
|
|
force.set_friend( 'force_biter_two', true )
|
|
|
|
force.set_friend( 'force_spectator', true )
|
|
|
|
force.set_friend( 'player', true )
|
|
|
|
force.share_chart = false
|
|
|
|
local force = game.forces[ 'force_biter_two' ]
|
|
|
|
force.set_friend( 'force_player_one', true )
|
|
|
|
force.set_friend( 'force_biter_one', true )
|
|
|
|
force.set_friend( 'force_spectator', true )
|
|
|
|
force.set_friend( 'player', true )
|
|
|
|
force.share_chart = false
|
|
|
|
local force = game.forces[ 'force_spectator' ]
|
|
|
|
force.set_spawn_position( { 0, 0 }, game.surfaces[ 'nauvis' ] )
|
|
|
|
force.technologies[ 'toolbelt' ].researched = true
|
|
|
|
force.set_friend( 'force_player_one', true )
|
|
|
|
force.set_friend( 'force_player_two', true )
|
|
|
|
force.set_cease_fire( 'force_biter_one', true )
|
|
|
|
force.set_cease_fire( 'force_biter_two', true )
|
|
|
|
force.set_cease_fire( 'player', true )
|
|
|
|
force.set_cease_fire( 'enemy', true )
|
|
|
|
force.share_chart = true
|
|
|
|
local force = game.forces[ 'player' ]
|
|
|
|
force.set_cease_fire( 'force_player_one', true )
|
|
|
|
force.set_cease_fire( 'force_player_two', true )
|
|
|
|
force.set_cease_fire( 'force_biter_one', true )
|
|
|
|
force.set_cease_fire( 'force_biter_two', true )
|
|
|
|
force.set_cease_fire( 'force_spectator', true )
|
|
|
|
force.share_chart = false
|
|
|
|
local spectator = game.permissions.create_group( 'permission_spectator' )
|
|
|
|
for action_name, _ in pairs( defines.input_action ) do spectator.set_allows_action( defines.input_action[ action_name ], false ) end
|
|
|
|
local table_of_definitions = { defines.input_action.write_to_console, defines.input_action.gui_click, defines.input_action.gui_selection_state_changed, defines.input_action.gui_checked_state_changed, defines.input_action.gui_elem_changed, defines.input_action.gui_text_changed, defines.input_action.gui_value_changed, defines.input_action.start_walking, defines.input_action.open_kills_gui, defines.input_action.toggle_show_entity_info }
|
|
|
|
for _, define in pairs( table_of_definitions ) do spectator.set_allows_action( define, true ) end
|
|
|
|
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_turret_attack_modifier( 'flamethrower-turret', 4 )
|
|
|
|
game.forces[ force.name ].set_turret_attack_modifier( 'laser-turret', 2 )
|
|
|
|
game.forces[ force.name ].set_turret_attack_modifier( 'gun-turret', 4 )
|
|
|
|
-- game.forces[ force.name ].set_ammo_damage_modifier( 'cannon-shell', - 0.2 )
|
|
|
|
game.forces[ force.name ].research_queue_enabled = true
|
|
|
|
end
|
|
|
|
game.permissions.get_group( 'Default' ).set_allows_action( defines.input_action.grab_blueprint_record, false )
|
|
|
|
game.permissions.get_group( 'Default' ).set_allows_action( defines.input_action.import_blueprint_string, false )
|
|
|
|
game.permissions.get_group( 'Default' ).set_allows_action( defines.input_action.import_blueprint, false )
|
|
|
|
game.forces[ 'enemy' ].evolution_factor = 0.4
|
|
|
|
end
|
|
|
|
function initialize_surface()
|
|
|
|
game.map_settings.enemy_evolution.time_factor = 0
|
|
|
|
game.map_settings.enemy_evolution.destroy_factor = 0
|
|
|
|
game.map_settings.enemy_evolution.pollution_factor = 0
|
|
|
|
game.map_settings.pollution.enabled = false
|
|
|
|
game.map_settings.enemy_expansion.enabled = true
|
|
|
|
game.map_settings.enemy_expansion.settler_group_min_size = 8
|
|
|
|
game.map_settings.enemy_expansion.settler_group_max_size = 16
|
|
|
|
game.map_settings.enemy_expansion.min_expansion_cooldown = 54000
|
|
|
|
game.map_settings.enemy_expansion.max_expansion_cooldown = 108000
|
|
|
|
local map_gen_settings = {}
|
|
|
|
map_gen_settings.width = global.table_of_properties.size_of_the_battlefield
|
|
|
|
map_gen_settings.height = global.table_of_properties.size_of_the_battlefield
|
|
|
|
map_gen_settings.seed = math.random( 1, 2097152 )
|
|
|
|
map_gen_settings.water = 'none'
|
|
|
|
map_gen_settings.starting_area = 'none'
|
|
|
|
map_gen_settings.cliff_settings = { name = 'cliff', cliff_elevation_0 = 0, cliff_elevation_interval = 0 }
|
|
|
|
map_gen_settings.autoplace_controls = { [ 'trees' ] = { frequency = 'normal', size = 'normal', richness = 'normal' }, [ 'coal' ] = { frequency = 'very-high', size = 'very-low', richness = 'normal' }, [ 'stone' ] = { frequency = 'very-high', size = 'very-low', richness = 'normal' }, [ 'copper-ore' ] = { frequency = 'very-high', size = 'very-low', richness = 'normal' }, [ 'uranium-ore' ] = { frequency = 'very-high', size = 'very-low', richness = 'normal' }, [ 'iron-ore' ] = { frequency = 'very-high', size = 'very-low', richness = 'normal' }, [ 'crude-oil' ] = { frequency = 'very-high', size = 'very-low', richness = 'normal' }, [ 'enemy-base' ] = { frequency = 'normal', size = 'normal', richness = 'normal' } }
|
|
|
|
-- map_gen_settings.autoplace_settings = { entity = { treat_missing_as_default = false, settings = { frequency = 'none', size = 'none', richness = 'none' } }, decorative = { treat_missing_as_default = true, settings = { frequency = 'none', size = 'none', richness = 'none' } } }
|
|
|
|
-- map_gen_settings.default_enable_all_autoplace_controls = false
|
|
|
|
if game.surfaces[ 'tank_conquest' ] == nil then
|
|
|
|
game.create_surface( 'tank_conquest', map_gen_settings )
|
|
|
|
else
|
|
|
|
rendering.clear()
|
|
|
|
game.surfaces[ 'tank_conquest' ].clear()
|
|
|
|
game.surfaces[ 'tank_conquest' ].map_gen_settings = map_gen_settings
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function draw_gui_button( player )
|
|
|
|
if player.gui.top[ 'draw_gui_button' ] then player.gui.top[ 'draw_gui_button' ].destroy() end
|
|
|
|
player.gui.top.add{ type = 'sprite-button', name = 'draw_gui_button', sprite = 'item/tank', tooltip = 'MENU' }
|
|
|
|
-- player.gui.top.add{ type = 'sprite-button', name = 'draw_gui_button', sprite = 'item/heavy-armor', tooltip = 'SCORE' }
|
|
|
|
-- player.gui.top.add{ type = 'sprite-button', name = 'draw_gui_button', sprite = 'item/personal-roboport-equipment', tooltip = 'SQUAD' }
|
|
|
|
end
|
|
|
|
function draw_gui_status( player )
|
|
|
|
if player.gui.top[ 'draw_gui_status' ] then player.gui.top[ 'draw_gui_status' ].destroy() end
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
if player.force.name == 'force_spectator' then return end
|
|
|
|
if #global.table_of_spots == 0 then return end
|
|
|
|
local element_frame = player.gui.top.add{ type = 'frame', name = 'draw_gui_status', direction = 'horizontal' }
|
|
|
|
element_frame.style.minimal_height = 38
|
|
|
|
element_frame.style.margin = 0
|
|
|
|
element_frame.style.padding = 0
|
|
|
|
element_frame.style.left_padding = 20
|
|
|
|
element_frame.style.right_padding = 20
|
|
|
|
element_frame.style.vertical_align = 'center'
|
|
|
|
local element_progressbar = element_frame.add{ type = 'progressbar', value = 100 }
|
|
|
|
element_progressbar.style.width = 125
|
|
|
|
element_progressbar.style.right_padding = 20
|
|
|
|
element_progressbar.style.top_padding = 10
|
|
|
|
element_progressbar.style.color = table_of_colors.team
|
|
|
|
local element_label = element_frame.add{ type = 'label', caption = math.floor( global.table_of_properties[ player.force.name ].available_tickets ) }
|
|
|
|
element_label.style.right_padding = 20
|
|
|
|
element_label.style.font_color = table_of_colors.white
|
|
|
|
local element_label = element_frame.add{ type = 'label', caption = global.table_of_properties[ player.force.name ].icon }
|
|
|
|
element_label.style.font_color = table_of_colors.white
|
|
|
|
local element_label = element_frame.add{ type = 'label', caption = seconds_to_clock( global.table_of_properties.countdown_in_seconds ) }
|
|
|
|
element_label.style.left_padding = 20
|
|
|
|
element_label.style.right_padding = 20
|
|
|
|
element_label.style.font_color = table_of_colors.white
|
|
|
|
local element_label = element_frame.add{ type = 'label', caption = global.table_of_properties[ global.table_of_properties[ player.force.name ].enemy ].icon }
|
|
|
|
element_label.style.font_color = table_of_colors.white
|
|
|
|
local element_label = element_frame.add{ type = 'label', caption = math.floor( global.table_of_properties[ global.table_of_properties[ player.force.name ].enemy ].available_tickets ) }
|
|
|
|
element_label.style.left_padding = 20
|
|
|
|
element_label.style.font_color = table_of_colors.white
|
|
|
|
local element_progressbar = element_frame.add{ type = 'progressbar', value = 100 }
|
|
|
|
element_progressbar.style.width = 125
|
|
|
|
element_progressbar.style.left_padding = 20
|
|
|
|
element_progressbar.style.top_padding = 10
|
|
|
|
element_progressbar.style.color = table_of_colors.enemy
|
|
|
|
for _, element_item in pairs( element_frame.children ) do element_item.style.font = 'heading-1' end
|
|
|
|
end
|
|
|
|
function draw_gui_spots( player )
|
|
|
|
if player.gui.top[ 'draw_gui_spots' ] then player.gui.top[ 'draw_gui_spots' ].destroy() end
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
if player.force.name == 'force_spectator' then return end
|
|
|
|
if #global.table_of_spots == 0 then return end
|
|
|
|
local element_frame = player.gui.top.add{ type = 'frame', name = 'draw_gui_spots', direction = 'horizontal' }
|
|
|
|
element_frame.style.minimal_width = 38
|
|
|
|
element_frame.style.height = 38
|
|
|
|
element_frame.style.margin = 0
|
|
|
|
element_frame.style.padding = 0
|
|
|
|
element_frame.style.vertical_align = 'top'
|
|
|
|
element_frame.style.horizontal_align = 'center'
|
|
|
|
for _, spot in pairs( global.table_of_spots ) do
|
|
|
|
local element_label = element_frame.add{ type = 'label', caption = spot.properties.name }
|
|
|
|
element_label.style.width = 38
|
|
|
|
element_label.style.height = 38
|
|
|
|
element_label.style.margin = 0
|
|
|
|
element_label.style.padding = 0
|
|
|
|
element_label.style.vertical_align = 'top'
|
|
|
|
element_label.style.horizontal_align = 'center'
|
|
|
|
element_label.style.font = 'heading-1'
|
|
|
|
local color = table_of_colors.white
|
|
|
|
if player.force.name ~= 'force_spectator' then
|
|
|
|
color = table_of_colors.neutral
|
|
|
|
if spot.properties.force.name == global.table_of_properties[ player.force.name ].name and spot.properties.value == 100 then color = table_of_colors.team end
|
|
|
|
if spot.properties.force.name == global.table_of_properties[ player.force.name ].enemy and spot.properties.value == 100 then color = table_of_colors.enemy end
|
|
|
|
end
|
|
|
|
element_label.style.font_color = color
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function draw_gui_menu( player )
|
|
|
|
if player.gui.center[ 'draw_gui_menu' ] then player.gui.center[ 'draw_gui_menu' ].destroy() end
|
|
|
|
local element_frame = player.gui.center.add{ type = 'frame', name = 'draw_gui_menu', direction = 'vertical' }
|
|
|
|
element_frame.style.padding = 0
|
|
|
|
element_frame.style.margin = 0
|
|
|
|
if player.force.name ~= 'force_spectator' then element_frame.add{ type = 'sprite-button', name = 'event_on_click_lobby', caption = 'LOBBY' } end
|
|
|
|
if player.force.name == 'force_spectator' then element_frame.add{ type = 'sprite-button', name = 'event_on_click_join', caption = 'JOIN' } end
|
|
|
|
for _, element_item in pairs( element_frame.children ) do
|
|
|
|
element_item.style.padding = 0
|
|
|
|
element_item.style.margin = 0
|
|
|
|
element_item.style.minimal_width = 170
|
|
|
|
element_item.style.minimal_height = 170
|
|
|
|
element_item.style.font = 'heading-1'
|
|
|
|
element_item.style.font_color = table_of_colors.white
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function draw_gui_score( player )
|
|
|
|
if player.gui.center[ 'draw_gui_score' ] then player.gui.center[ 'draw_gui_score' ].destroy() end
|
|
|
|
local element_frame = player.gui.center.add{ type = 'frame', name = 'draw_gui_score', direction = 'vertical' }
|
|
|
|
element_frame.style.padding = 0
|
|
|
|
element_frame.style.margin = 0
|
|
|
|
element_frame.style.vertical_align = 'center'
|
|
|
|
element_frame.style.horizontal_align = 'center'
|
|
|
|
local element_table = element_frame.add{ type = 'table', column_count = 14, draw_horizontal_lines = true }
|
|
|
|
element_table.style.padding = 0
|
|
|
|
element_table.style.top_padding = 5
|
|
|
|
element_table.style.left_padding = 10
|
|
|
|
element_table.style.bottom_padding = 5
|
|
|
|
element_table.style.margin = 0
|
|
|
|
element_table.style.vertical_align = 'center'
|
|
|
|
element_table.style.horizontal_align = 'center'
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = global.table_of_properties[ player.force.name ].icon }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = '#' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'NAME' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'CLASS' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'K' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'D' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'POINTS' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = global.table_of_properties[ global.table_of_properties[ player.force.name ].enemy ].icon }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = '#' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'NAME' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'CLASS' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'K' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'D' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'POINTS' }
|
|
|
|
for index = 1, 28 do local element_label = element_table.add{ type = 'label', caption = '•' } end
|
|
|
|
for _, element_item in pairs( element_table.children ) do
|
|
|
|
element_item.style.padding = 0
|
|
|
|
element_item.style.right_padding = 10
|
|
|
|
element_item.style.margin = 0
|
|
|
|
element_item.style.vertical_align = 'center'
|
|
|
|
element_item.style.font = 'heading-2'
|
|
|
|
element_item.style.font_color = table_of_colors.white
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function draw_gui_squad( player )
|
|
|
|
if player.gui.left[ 'draw_gui_squad' ] then player.gui.left[ 'draw_gui_squad' ].destroy() end
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
local element_frame = player.gui.left.add{ type = 'frame', name = 'draw_gui_squad', direction = 'vertical' }
|
|
|
|
element_frame.style.minimal_width = 50
|
|
|
|
element_frame.style.padding = 0
|
|
|
|
element_frame.style.margin = 0
|
|
|
|
element_frame.style.top_margin = 5
|
|
|
|
element_frame.style.left_margin = 5
|
|
|
|
local element_table = element_frame.add{ type = 'table', column_count = 4 }
|
|
|
|
element_table.style.padding = 0
|
|
|
|
element_table.style.margin = 0
|
|
|
|
for index = 1, 8 do
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = 'SQUAD ' .. index }
|
|
|
|
local element_label = element_table.add{ type = 'label' }
|
|
|
|
local element_label = element_table.add{ type = 'label' }
|
|
|
|
local element_button = element_table.add{ type = 'sprite-button', name = 'aaa_' .. index, caption = 'JOIN' }
|
|
|
|
element_button.style.width = 50
|
|
|
|
element_button.style.height = 25
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = '•' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = '•' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = '•' }
|
|
|
|
local element_label = element_table.add{ type = 'label', caption = '•' }
|
|
|
|
end
|
|
|
|
for _, element_item in pairs( element_table.children ) do
|
|
|
|
element_item.style.minimal_width = 50
|
|
|
|
element_item.style.padding = 0
|
|
|
|
element_item.style.margin = 0
|
|
|
|
element_item.style.vertical_align = 'center'
|
|
|
|
element_item.style.horizontal_align = 'center'
|
|
|
|
element_item.style.font = 'heading-2'
|
|
|
|
element_item.style.font_color = table_of_colors.white
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function create_a_tank( player )
|
|
|
|
player.insert( { name = 'light-armor', count = 1 } )
|
|
|
|
player.insert( { name = 'submachine-gun', count = 1 } )
|
|
|
|
player.insert( { name = 'firearm-magazine', count = 50 } )
|
|
|
|
player.insert( { name = 'raw-fish', count = 3 } )
|
|
|
|
local table_of_entities = player.surface.find_entities_filtered( { name = 'tank', force = player.force.name } )
|
|
|
|
if #table_of_entities < #player.force.connected_players then
|
|
|
|
local position = player.surface.find_non_colliding_position( 'tank', player.position, 64, 4 )
|
|
|
|
if not position then position = { 0, 0 } end
|
|
|
|
local entity = player.surface.create_entity( { name = 'tank', position = position, force = player.force.name } )
|
|
|
|
if not entity then return end
|
|
|
|
entity.minable = false
|
|
|
|
entity.last_user = player.name
|
|
|
|
entity.insert( { name = 'wood', count = 50 } )
|
|
|
|
entity.insert( { name = 'cannon-shell', count = 50 } )
|
|
|
|
entity.set_driver( player )
|
|
|
|
global.table_of_tanks[ player.index ] = entity
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function create_a_base( force_name, base_position )
|
|
|
|
local surface = game.surfaces[ 'tank_conquest' ]
|
|
|
|
local table_of_items = game.json_to_table( blueprint_poi_base_json )
|
|
|
|
for _, tile in pairs( table_of_items.blueprint.tiles ) do tile.position = { x = tile.position.x + base_position.x, y = tile.position.y + base_position.y + 10 } end
|
|
|
|
surface.set_tiles( table_of_items.blueprint.tiles, true )
|
|
|
|
for _, object in pairs( table_of_items.blueprint.entities ) do
|
|
|
|
object.force = game.forces[ force_name ]
|
|
|
|
object.position = { x = object.position.x + base_position.x, y = object.position.y + base_position.y + 10 }
|
|
|
|
local entity = surface.create_entity( object )
|
|
|
|
if not entity then return end
|
|
|
|
if object.name == 'infinity-chest' or object.name == 'substation' or object.name == 'big-electric-pole' or object.name == 'medium-electric-pole' or object.name == 'inserter' or object.name == 'accumulator' or object.name == 'solar-panel' or object.name == 'gun-turret' then
|
|
|
|
entity.destructible = false
|
|
|
|
entity.minable = false
|
|
|
|
entity.rotatable = false
|
|
|
|
entity.operable = false
|
|
|
|
end
|
|
|
|
if object.name == 'wooden-chest' then
|
|
|
|
entity.destructible = false
|
|
|
|
entity.minable = false
|
|
|
|
entity.rotatable = false
|
|
|
|
end
|
|
|
|
if object.name == 'stone-wall' or object.name == 'gate' or object.name == 'land-mine' then
|
|
|
|
entity.destructible = false
|
|
|
|
entity.minable = false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function create_a_spot( spot_name, spot_position, spot_blueprint )
|
|
|
|
local surface = game.surfaces[ 'tank_conquest' ]
|
|
|
|
local spot = { name = spot_name, position = spot_position, force = { name = 'neutral' }, value = 0, color = table_of_colors.white }
|
|
|
|
local table_of_positions = {}
|
|
|
|
for x = 1, 18 do for y = 1, 18 do table.insert( table_of_positions, { x = math.floor( spot.position.x + x - 9 ), y = math.floor( spot.position.y + y - 9 ) } ) end end
|
|
|
|
local table_of_players = {}
|
|
|
|
local draw_spot_border = rendering.draw_rectangle{ surface = surface, target = spot.position, color = spot.color, left_top = { spot.position.x - 9, spot.position.y - 9 }, right_bottom = { spot.position.x + 9, spot.position.y + 9 }, width = 5, filled = false, draw_on_ground = true }
|
|
|
|
local draw_spot_force = rendering.draw_text{ text = spot.force.name, surface = surface, target = { spot.position.x, spot.position.y + 0.5 }, color = spot.color, scale = 5, alignment = 'center' }
|
|
|
|
local draw_spot_value = rendering.draw_text{ text = spot.value, surface = surface, target = { spot.position.x, spot.position.y - 4 }, color = spot.color, scale = 5, alignment = 'center' }
|
|
|
|
local draw_spot_name = rendering.draw_text{ text = spot.name, surface = surface, target = { spot.position.x, spot.position.y - 2 }, color = spot.color, scale = 5, alignment = 'center' }
|
|
|
|
local table_of_drawings = { name = draw_spot_name, value = draw_spot_value, force = draw_spot_force, border = draw_spot_border }
|
|
|
|
local table_of_properties = { name = spot.name, position = spot.position, value = spot.value, force = spot.force, color = spot.color }
|
|
|
|
local table_of_entities = {}
|
|
|
|
local table_of_items = game.json_to_table( spot_blueprint )
|
|
|
|
for _, tile in pairs( table_of_items.blueprint.tiles ) do tile.position = { x = tile.position.x + spot.position.x - 1, y = tile.position.y + spot.position.y - 1 } end
|
|
|
|
surface.set_tiles( table_of_items.blueprint.tiles, true )
|
|
|
|
for _, object in pairs( table_of_items.blueprint.entities ) do
|
|
|
|
object.force = 'enemy'
|
|
|
|
object.position = { x = object.position.x + spot.position.x - 1, y = object.position.y + spot.position.y - 1 }
|
|
|
|
local entity = surface.create_entity( object )
|
|
|
|
if not entity then return end
|
|
|
|
if object.name == 'infinity-chest' or object.name == 'substation' or object.name == 'inserter' or object.name == 'accumulator' or object.name == 'solar-panel' then
|
|
|
|
entity.destructible = false
|
|
|
|
entity.minable = false
|
|
|
|
entity.rotatable = false
|
|
|
|
entity.operable = false
|
|
|
|
end
|
|
|
|
if object.name == 'wooden-chest' then
|
|
|
|
entity.force = 'neutral'
|
|
|
|
entity.destructible = false
|
|
|
|
entity.minable = false
|
|
|
|
entity.rotatable = false
|
|
|
|
end
|
|
|
|
if object.name == 'stone-wall' or object.name == 'gate' or object.name == 'land-mine' then entity.minable = false end
|
|
|
|
table.insert( table_of_entities, entity )
|
|
|
|
end
|
|
|
|
table.insert( global.table_of_spots, { properties = table_of_properties, drawings = table_of_drawings, players = table_of_players, positions = table_of_positions, entities = table_of_entities } )
|
|
|
|
end
|
|
|
|
function create_a_point_of_interest( poi_blueprint, poi_position )
|
|
|
|
local surface = game.surfaces[ 'tank_conquest' ]
|
|
|
|
local table_of_items = game.json_to_table( poi_blueprint )
|
|
|
|
for _, tile in pairs( table_of_items.blueprint.tiles ) do tile.position = { x = tile.position.x + poi_position.x, y = tile.position.y + poi_position.y } end
|
|
|
|
surface.set_tiles( table_of_items.blueprint.tiles, true )
|
|
|
|
for _, object in pairs( table_of_items.blueprint.entities ) do
|
|
|
|
object.force = 'enemy'
|
|
|
|
object.position = { x = object.position.x + poi_position.x, y = object.position.y + poi_position.y }
|
|
|
|
local entity = surface.create_entity( object )
|
|
|
|
if not entity then return end
|
|
|
|
if object.name == 'infinity-chest' or object.name == 'substation' or object.name == 'inserter' or object.name == 'accumulator' or object.name == 'solar-panel' then
|
|
|
|
entity.destructible = false
|
|
|
|
entity.minable = false
|
|
|
|
entity.rotatable = false
|
|
|
|
entity.operable = false
|
|
|
|
end
|
|
|
|
if object.name == 'wooden-chest' then
|
|
|
|
entity.force = 'neutral'
|
|
|
|
entity.destructible = false
|
|
|
|
entity.minable = false
|
|
|
|
entity.rotatable = false
|
|
|
|
end
|
|
|
|
if object.name == 'stone-wall' or object.name == 'gate' or object.name == 'land-mine' then entity.minable = false end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function seconds_to_clock( seconds )
|
|
|
|
local seconds = tonumber( seconds )
|
|
|
|
if seconds <= 0 then
|
|
|
|
return '00:00:00'
|
|
|
|
else
|
|
|
|
local hours = string.format( '%02.f', math.floor( seconds / 3600 ) )
|
|
|
|
local minutes = string.format( '%02.f', math.floor( seconds / 60 - ( hours * 60 ) ) )
|
|
|
|
seconds = string.format( '%02.f', math.floor( seconds - hours * 3600 - minutes * 60 ) )
|
|
|
|
return hours .. ':' .. minutes .. ':' .. seconds
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function draw_a_polygon( position, radius, angle, sides )
|
|
|
|
if not type( position ) == 'table' then return end
|
|
|
|
if not type( radius ) == 'number' then return end
|
|
|
|
if not type( angle ) == 'number' then return end
|
|
|
|
if not type( sides ) == 'number' then return end
|
|
|
|
local table_of_positions = {}
|
|
|
|
table.insert( table_of_positions, { x = position.x, y = position.y } )
|
|
|
|
for index = 1, sides + 1 do
|
|
|
|
local x = table_of_positions[ 1 ].x + ( radius * math.cos( angle + ( index + index - 1 ) * math.pi / sides ) )
|
|
|
|
local y = table_of_positions[ 1 ].y + ( radius * math.sin( angle + ( index + index - 1 ) * math.pi / sides ) )
|
|
|
|
table.insert( table_of_positions, { x = x, y = y } )
|
|
|
|
end
|
|
|
|
return table_of_positions
|
|
|
|
end
|
|
|
|
function draw_circle_lobby( surface, spawn_diameter, spawn_position )
|
|
|
|
for x = - spawn_diameter, spawn_diameter do for y = - spawn_diameter, spawn_diameter do
|
|
|
|
local tile_position = { x = spawn_position.x + x, y = spawn_position.y + y }
|
|
|
|
local distance_to_center = math.sqrt( tile_position.x ^ 2 + tile_position.y ^ 2 )
|
|
|
|
local tile_name = false
|
|
|
|
if distance_to_center < spawn_diameter then
|
|
|
|
tile_name = 'deepwater'
|
|
|
|
if math.random( 1, 48 ) == 1 then surface.create_entity( { name = 'fish', position = tile_position } ) end
|
|
|
|
end
|
|
|
|
if distance_to_center < 9.5 then tile_name = 'refined-concrete' end
|
|
|
|
if distance_to_center < 7 then tile_name = 'sand-1' end
|
|
|
|
if tile_name then surface.set_tiles( { { name = tile_name, position = tile_position } }, true ) end
|
|
|
|
end end
|
|
|
|
end
|
|
|
|
function event_on_click_join( player )
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
local surface = game.surfaces[ 'tank_conquest' ]
|
|
|
|
if not surface then return end
|
|
|
|
if not player.character then return end
|
|
|
|
if #game.forces.force_player_one.connected_players == #game.forces.force_player_two.connected_players then
|
|
|
|
local table_of_forces = { 'force_player_one', 'force_player_two' }
|
|
|
|
player.force = game.forces[ table_of_forces[ math.random( 1, #table_of_forces ) ] ]
|
|
|
|
elseif #game.forces.force_player_one.connected_players < #game.forces.force_player_two.connected_players then
|
|
|
|
player.force = game.forces.force_player_one
|
|
|
|
else
|
|
|
|
player.force = game.forces.force_player_two
|
|
|
|
end
|
|
|
|
local position = player.force.get_spawn_position( surface )
|
|
|
|
if surface.is_chunk_generated( position ) then player.teleport( surface.find_non_colliding_position( 'character', position, 3, 0.5 ), surface ) else player.teleport( position, surface ) end
|
|
|
|
game.permissions.get_group( 'Default' ).add_player( player.name )
|
|
|
|
game.print( player.name .. ' joined ' .. global.table_of_properties[ player.force.name ].icon )
|
|
|
|
rendering.draw_text{ text = global.table_of_properties[ player.force.name ].icon, target = player.character, target_offset = { 0, - 3.7 }, surface = player.surface, color = table_of_colors.white, scale = 2, alignment = 'center' }
|
|
|
|
create_a_tank( player )
|
|
|
|
for _, spot in pairs( global.table_of_spots ) do player.force.chart( game.surfaces[ 'tank_conquest' ], { { x = spot.properties.position.x - 10, y = spot.properties.position.y - 10 }, { x = spot.properties.position.x + 10, y = spot.properties.position.y + 10 } } ) end
|
|
|
|
player.character.destructible = true
|
|
|
|
end
|
|
|
|
function event_on_click_lobby( player )
|
|
|
|
local surface = game.surfaces[ 'nauvis' ]
|
|
|
|
if not player.character then return end
|
|
|
|
player.force = game.forces.force_spectator
|
|
|
|
local position = player.force.get_spawn_position( surface )
|
|
|
|
if surface.is_chunk_generated( position ) then player.teleport( surface.find_non_colliding_position( 'character', position, 3, 0.5 ), surface ) else player.teleport( position, surface ) end
|
|
|
|
game.permissions.get_group( 'permission_spectator' ).add_player( player.name )
|
|
|
|
player.character.destructible = false
|
|
|
|
player.character.clear_items_inside()
|
|
|
|
if global.table_of_tanks[ player.index ] ~= nil and global.table_of_tanks[ player.index ].valid then
|
|
|
|
global.table_of_tanks[ player.index ].clear_items_inside()
|
|
|
|
global.table_of_tanks[ player.index ].destroy()
|
|
|
|
end
|
|
|
|
global.table_of_tanks[ player.index ] = nil
|
|
|
|
end
|
|
|
|
function shuffle( table_of_items )
|
|
|
|
local length_of_items = #table_of_items
|
|
|
|
for index = length_of_items, 1, - 1 do
|
|
|
|
local random = math.random( length_of_items )
|
|
|
|
table_of_items[ index ], table_of_items[ random ] = table_of_items[ random ], table_of_items[ index ]
|
|
|
|
end
|
|
|
|
return table_of_items
|
|
|
|
end
|
|
|
|
local function on_init( surface )
|
|
|
|
game.surfaces[ 'nauvis' ].clear()
|
|
|
|
game.surfaces[ 'nauvis' ].map_gen_settings = { width = 1, height = 1 }
|
|
|
|
game.create_surface( 'tank_conquest', { width = 1, height = 1 } )
|
|
|
|
initialize_forces()
|
|
|
|
-- global.table_of_properties.game_stage = 'do_nothing'
|
|
|
|
end
|
|
|
|
event.on_init( on_init )
|
|
|
|
local function on_tick( event )
|
|
|
|
if game.tick % 30 == 0 and global.table_of_damages ~= nil then
|
|
|
|
for _, item in pairs( global.table_of_damages ) do item.surface.create_entity( { name = 'flying-text', position = item.position, text = math.ceil( item.damage ), color = table_of_colors.damage } ) end
|
|
|
|
global.table_of_damages = nil
|
|
|
|
end
|
|
|
|
if game.tick % 60 == 0 then
|
|
|
|
if global.table_of_properties.game_stage == 'ongoing_game' then
|
|
|
|
for _, spot in pairs( global.table_of_spots ) do
|
|
|
|
if spot.properties.value == 100 then
|
|
|
|
local enemy = global.table_of_properties[ spot.properties.force.name ].enemy
|
|
|
|
if global.table_of_properties[ enemy ].available_tickets >= 0 then global.table_of_properties[ enemy ].available_tickets = global.table_of_properties[ enemy ].available_tickets - global.table_of_properties.acceleration_value end
|
|
|
|
end
|
|
|
|
for _, player in pairs( game.connected_players ) do if player.force.name == spot.properties.force.name and spot.properties.value == 100 then player.force.chart( game.surfaces[ 'tank_conquest' ], { { x = spot.properties.position.x - 10, y = spot.properties.position.y - 10 }, { x = spot.properties.position.x + 10, y = spot.properties.position.y + 10 } } ) end end
|
|
|
|
for _, player in pairs( spot.players ) do
|
|
|
|
if spot.properties.force.name == 'neutral' and spot.properties.value == 0 then
|
|
|
|
spot.properties.force.name = player.force.name
|
|
|
|
for _, entity in pairs( spot.entities ) do
|
|
|
|
if entity.valid then
|
|
|
|
entity.force = player.force.name
|
|
|
|
if entity.name == 'stone-wall' or entity.name == 'gate' or entity.name == 'land-mine' then entity.minable = true end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if spot.properties.force.name == 'neutral' or spot.properties.force.name == player.force.name and spot.properties.value < 100 then spot.properties.value = spot.properties.value + 1 * global.table_of_properties.conquest_speed end
|
|
|
|
if spot.properties.force.name ~= player.force.name and spot.properties.value > 0 then spot.properties.value = spot.properties.value - 1 * global.table_of_properties.conquest_speed end
|
|
|
|
if spot.properties.value == 0 then spot.properties.force.name = 'neutral' end
|
|
|
|
local force_label = spot.properties.force.name
|
|
|
|
if force_label ~= 'neutral' then force_label = global.table_of_properties[ force_label ].icon end
|
|
|
|
rendering.set_text( spot.drawings.force, force_label )
|
|
|
|
rendering.set_text( spot.drawings.value, spot.properties.value )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if global.table_of_properties.countdown_in_seconds == 60 then game.print( 'The round is in the hot phase, there are still 60 seconds left.' ) end
|
|
|
|
if global.table_of_properties.countdown_in_seconds >= 0 then global.table_of_properties.countdown_in_seconds = global.table_of_properties.countdown_in_seconds - 1 end
|
|
|
|
if global.table_of_properties.countdown_in_seconds < 0 or global.table_of_properties[ 'force_player_one' ].available_tickets < 0 or global.table_of_properties[ 'force_player_two' ].available_tickets < 0 then
|
|
|
|
if global.table_of_properties[ 'force_player_one' ].available_tickets == global.table_of_properties[ 'force_player_two' ].available_tickets then
|
|
|
|
game.print( 'The battle is over. The round ended in a draw.' )
|
|
|
|
elseif global.table_of_properties[ 'force_player_one' ].available_tickets > global.table_of_properties[ 'force_player_two' ].available_tickets then
|
|
|
|
game.print( 'The battle is over. Force ' .. global.table_of_properties[ 'force_player_one' ].icon .. ' has won the round.' )
|
|
|
|
else
|
|
|
|
game.print( 'The battle is over. Force ' .. global.table_of_properties[ 'force_player_two' ].icon .. ' has won the round.' )
|
|
|
|
end
|
|
|
|
global.table_of_spots = {}
|
|
|
|
global.table_of_properties[ 'force_player_one' ].available_tickets = global.table_of_properties.amount_of_tickets
|
|
|
|
global.table_of_properties[ 'force_player_two' ].available_tickets = global.table_of_properties.amount_of_tickets
|
|
|
|
global.table_of_properties.countdown_in_seconds = 28800
|
|
|
|
global.table_of_properties.wait_in_seconds = 30
|
|
|
|
global.table_of_properties.game_stage = 'lobby'
|
|
|
|
game.print( 'You are now in the lobby, please make yourself comfortable, it continues immediately.' )
|
|
|
|
for _, player in pairs( game.connected_players ) do
|
|
|
|
if player.gui.top[ 'draw_gui_button' ] then player.gui.top[ 'draw_gui_button' ].destroy() end
|
|
|
|
if player.gui.top[ 'draw_gui_status' ] then player.gui.top[ 'draw_gui_status' ].destroy() end
|
|
|
|
if player.gui.top[ 'draw_gui_spots' ] then player.gui.top[ 'draw_gui_spots' ].destroy() end
|
|
|
|
-- if player.gui.left[ 'draw_gui_squad' ] then player.gui.left[ 'draw_gui_squad' ].destroy() end
|
|
|
|
-- if player.gui.center[ 'draw_gui_menu' ] then player.gui.center[ 'draw_gui_menu' ].destroy() end
|
|
|
|
-- draw_gui_score( player )
|
|
|
|
event_on_click_lobby( player )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
for _, player in pairs( game.connected_players ) do
|
|
|
|
draw_gui_status( player )
|
|
|
|
draw_gui_spots( player )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if global.table_of_properties.game_stage == 'regenerate_facilities' then
|
|
|
|
table_of_ores = shuffle( table_of_ores )
|
|
|
|
local position = game.forces[ 'force_player_one' ].get_spawn_position( game.surfaces[ 'tank_conquest' ] )
|
|
|
|
map_functions.draw_noise_tile_circle( { x = position.x - 50, y = 60 }, 'water', game.surfaces[ 'tank_conquest' ], math.random( 8, 10 ) )
|
|
|
|
local radius, angle, sides = 10, 1, #table_of_ores
|
|
|
|
local table_of_positions = draw_a_polygon( { x = position.x - 50, y = 60 }, radius, angle, sides )
|
|
|
|
for index = 1, #table_of_positions do map_functions.draw_smoothed_out_ore_circle( table_of_positions[ index + 1 ], table_of_ores[ index ], game.surfaces[ 'tank_conquest' ], 15, 3000 ) end
|
|
|
|
create_a_base( 'force_player_one', position )
|
|
|
|
local position = game.forces[ 'force_player_two' ].get_spawn_position( game.surfaces[ 'tank_conquest' ] )
|
|
|
|
map_functions.draw_noise_tile_circle( { x = position.x + 50, y = 60 }, 'water', game.surfaces[ 'tank_conquest' ], math.random( 8, 10 ) )
|
|
|
|
local radius, angle, sides = 10, 1, #table_of_ores
|
|
|
|
local table_of_positions = draw_a_polygon( { x = position.x + 50, y = 60 }, radius, angle, sides )
|
|
|
|
for index = 1, #table_of_positions do map_functions.draw_smoothed_out_ore_circle( table_of_positions[ index + 1 ], table_of_ores[ index ], game.surfaces[ 'tank_conquest' ], 15, 3000 ) end
|
|
|
|
create_a_base( 'force_player_two', position )
|
|
|
|
local position = { x = 0, y = - 350 }
|
|
|
|
create_a_point_of_interest( blueprint_poi_laser_json, position )
|
|
|
|
local position = { x = 0, y = 450 }
|
|
|
|
create_a_point_of_interest( blueprint_poi_fire_json, position )
|
|
|
|
local table_of_blueprints = { blueprint_poi_spot_one_json, blueprint_poi_spot_two_json, blueprint_poi_spot_three_json }
|
|
|
|
local table_of_names = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' }
|
|
|
|
local length_of_names = math.random( 3, #table_of_names )
|
|
|
|
local position, radius, angle, sides = { x = 0, y = 50 }, math.random( 150, 250 ), math.random( 0.1, 6.3 ), length_of_names
|
|
|
|
local table_of_positions = draw_a_polygon( position, radius, angle, sides )
|
|
|
|
for index = 1, length_of_names do create_a_spot( table_of_names[ index ], table_of_positions[ index + 1 ], table_of_blueprints[ math.random( 1, #table_of_blueprints ) ] ) end
|
|
|
|
|
|
|
|
game.print( 'A new battlefield was created. Make yourself comfortable, but be vigilant.' )
|
|
|
|
global.table_of_properties.game_stage = 'ongoing_game'
|
|
|
|
for _, player in pairs( game.connected_players ) do
|
|
|
|
-- if player.gui.left[ 'draw_gui_squad' ] then player.gui.left[ 'draw_gui_squad' ].destroy() end
|
|
|
|
-- if player.gui.center[ 'draw_gui_score' ] then player.gui.center[ 'draw_gui_score' ].destroy() end
|
|
|
|
if player.gui.center[ 'draw_gui_menu' ] then player.gui.center[ 'draw_gui_menu' ].destroy() end
|
|
|
|
draw_gui_button( player )
|
|
|
|
event_on_click_join( player )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if global.table_of_properties.game_stage == 'preparing_spawn_positions' then
|
|
|
|
local position = { x = - 500, y = 50 }
|
|
|
|
game.forces[ 'force_player_one' ].set_spawn_position( position, game.surfaces[ 'tank_conquest' ] )
|
|
|
|
local position = { x = 500, y = 50 }
|
|
|
|
game.forces[ 'force_player_two' ].set_spawn_position( position, game.surfaces[ 'tank_conquest' ] )
|
|
|
|
global.table_of_scores = {}
|
|
|
|
for _, player in pairs( game.connected_players ) do
|
|
|
|
if player.character then
|
|
|
|
player.character.destroy()
|
|
|
|
player.character = nil
|
|
|
|
end
|
|
|
|
player.create_character()
|
|
|
|
end
|
|
|
|
global.table_of_properties.game_stage = 'regenerate_facilities'
|
|
|
|
end
|
|
|
|
if global.table_of_properties.game_stage == 'check_the_process_of_creating_the_map' then
|
|
|
|
if game.surfaces[ 'tank_conquest' ].is_chunk_generated( { x = 0, y = 0 } ) then
|
|
|
|
global.table_of_properties.game_stage = 'preparing_spawn_positions'
|
|
|
|
else
|
|
|
|
game.surfaces[ 'tank_conquest' ].request_to_generate_chunks( { x = 0, y = 0 }, 1 )
|
|
|
|
game.surfaces[ 'tank_conquest' ].request_to_generate_chunks( { - 500, 50 }, 1 )
|
|
|
|
game.surfaces[ 'tank_conquest' ].request_to_generate_chunks( { 500, 50 }, 1 )
|
|
|
|
game.surfaces[ 'tank_conquest' ].request_to_generate_chunks( { 0, - 350 }, 1 )
|
|
|
|
game.surfaces[ 'tank_conquest' ].request_to_generate_chunks( { 0, 450 }, 1 )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if global.table_of_properties.game_stage == 'regenerate_battlefield' and global.table_of_properties.wait_in_seconds == 0 then
|
|
|
|
initialize_surface()
|
|
|
|
game.surfaces[ 'tank_conquest' ].force_generate_chunk_requests()
|
|
|
|
global.table_of_properties.game_stage = 'check_the_process_of_creating_the_map'
|
|
|
|
end
|
|
|
|
if global.table_of_properties.game_stage == 'lobby' then
|
|
|
|
if #game.connected_players >= global.table_of_properties.required_number_of_players and global.table_of_properties.wait_in_seconds > 0 then
|
|
|
|
if global.table_of_properties.wait_in_seconds % 10 == 0 then game.print( 'The round starts in ' .. global.table_of_properties.wait_in_seconds .. ' seconds.' ) end
|
|
|
|
global.table_of_properties.wait_in_seconds = global.table_of_properties.wait_in_seconds - 1
|
|
|
|
end
|
|
|
|
if global.table_of_properties.wait_in_seconds == 0 then global.table_of_properties.game_stage = 'regenerate_battlefield' end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if game.tick % 1800 == 0 then
|
|
|
|
if game.surfaces[ 'tank_conquest' ] ~= nil and #game.connected_players and #global.table_of_spots then
|
|
|
|
for _, player in pairs( game.connected_players ) do
|
|
|
|
for _, spot in pairs( global.table_of_spots ) do
|
|
|
|
if player.force.is_chunk_charted( game.surfaces[ 'tank_conquest' ], { x = math.floor( spot.properties.position.x / 32 ), y = math.floor( spot.properties.position.y / 32 ) } ) then
|
|
|
|
local chart_tags = player.force.find_chart_tags( game.surfaces[ 'tank_conquest' ], { { spot.properties.position.x - 1, spot.properties.position.y - 1 }, { spot.properties.position.x + 1, spot.properties.position.y + 1 } } )
|
|
|
|
if #chart_tags == 0 then player.force.add_chart_tag( game.surfaces[ 'tank_conquest' ], { icon = { type = 'virtual', name = 'signal-' .. spot.properties.name }, position = spot.properties.position } ) end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if game.tick == 60 then
|
|
|
|
draw_circle_lobby( game.surfaces[ 'nauvis' ], 28, { x = 0, y = 0 } )
|
|
|
|
for _, player in pairs( game.connected_players ) do if player.character == nil then player.create_character() end end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_tick, on_tick )
|
|
|
|
local function on_gui_click( event )
|
|
|
|
local player = game.players[ event.player_index ]
|
|
|
|
if event.element.valid and event.element.name == 'close_map_intro_frame' then player.gui.center[ 'map_intro_frame' ].destroy() return end
|
|
|
|
if event.element.valid and event.element.name == 'map_intro_text' then player.gui.center[ 'map_intro_frame' ].destroy() return end
|
|
|
|
if event.element.valid and event.element.name == 'map_intro_button' then
|
|
|
|
if player.gui.center[ 'map_intro_frame' ] then player.gui.center[ 'map_intro_frame' ].destroy() else draw_gui_map_intro( player ) end
|
|
|
|
end
|
|
|
|
if event.element.valid and event.element.name == 'draw_gui_button' then
|
|
|
|
if player.gui.center[ 'draw_gui_menu' ] then player.gui.center[ 'draw_gui_menu' ].destroy() else draw_gui_menu( player ) end
|
|
|
|
end
|
|
|
|
if event.element.valid and event.element.name == 'event_on_click_score' then
|
|
|
|
if player.gui.center[ 'draw_gui_score' ] then player.gui.center[ 'draw_gui_score' ].destroy() else draw_gui_score( player ) end
|
|
|
|
end
|
|
|
|
if event.element.valid and event.element.name == 'event_on_click_squad' then
|
|
|
|
if player.gui.left[ 'draw_gui_squad' ] then player.gui.left[ 'draw_gui_squad' ].destroy() else draw_gui_squad( player ) end
|
|
|
|
end
|
|
|
|
if event.element.valid and event.element.name == 'event_on_click_lobby' then
|
|
|
|
event_on_click_lobby( player )
|
|
|
|
if player.gui.center[ 'draw_gui_menu' ] then player.gui.center[ 'draw_gui_menu' ].destroy() end
|
|
|
|
end
|
|
|
|
if event.element.valid and event.element.name == 'event_on_click_join' then
|
|
|
|
event_on_click_join( player )
|
|
|
|
if player.gui.center[ 'draw_gui_menu' ] then player.gui.center[ 'draw_gui_menu' ].destroy() end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_gui_click, on_gui_click )
|
|
|
|
local function on_console_chat( event )
|
|
|
|
if not event.message then return end
|
|
|
|
if not event.player_index then return end
|
|
|
|
local player = game.players[ event.player_index ]
|
|
|
|
local color = { r = player.color.r * 0.6 + 0.35, g = player.color.g * 0.6 + 0.35, b = player.color.b * 0.6 + 0.35, a = 1 }
|
|
|
|
if player.force.name == 'force_player_one' then
|
|
|
|
game.forces.force_player_two.print( global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ': '.. event.message, color )
|
|
|
|
game.forces.force_spectator.print( global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ': '.. event.message, color )
|
|
|
|
end
|
|
|
|
if player.force.name == 'force_player_two' then
|
|
|
|
game.forces.force_player_one.print( global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ': '.. event.message, color )
|
|
|
|
game.forces.force_spectator.print( global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ': '.. event.message, color )
|
|
|
|
end
|
|
|
|
if player.force.name == 'force_spectator' then
|
|
|
|
game.forces.force_player_one.print( '(Spectator) ' .. player.name .. ': '.. event.message, color )
|
|
|
|
game.forces.force_player_two.print( '(Spectator) ' .. player.name .. ': '.. event.message, color )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_console_chat, on_console_chat )
|
|
|
|
local function on_chunk_generated( event )
|
|
|
|
local chunk_position = { x = event.area.left_top.x, y = event.area.left_top.y }
|
|
|
|
for x = 0, 31 do for y = 0, 31 do
|
|
|
|
local tile_position = { x = chunk_position.x + x, y = chunk_position.y + y }
|
|
|
|
if math.random( 1, 3000 ) == 1 and event.surface.can_place_entity( { name = 'wooden-chest', force = 'enemy', position = tile_position } ) then event.surface.create_entity( { name = 'wooden-chest', force = 'enemy', position = tile_position } ) end
|
|
|
|
end end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_chunk_generated, on_chunk_generated )
|
|
|
|
local function on_entity_damaged( event )
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
if event.entity.name == 'wooden-chest' then return end
|
|
|
|
if not event.entity.unit_number then return end
|
|
|
|
if event.final_damage_amount < 1 then return end
|
|
|
|
if global.table_of_damages == nil then global.table_of_damages = {} end
|
|
|
|
if global.table_of_damages[ event.entity.unit_number ] == nil then global.table_of_damages[ event.entity.unit_number ] = { surface = event.entity.surface, position = event.entity.position, damage = 0 } end
|
|
|
|
global.table_of_damages[ event.entity.unit_number ].damage = global.table_of_damages[ event.entity.unit_number ].damage + event.final_damage_amount
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_entity_damaged, on_entity_damaged )
|
|
|
|
local function on_entity_died( event )
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
if event.entity.name == 'wooden-chest' and event.entity.force.name == 'enemy' then
|
|
|
|
local loot = table_of_loots[ math.random( 1, #table_of_loots ) ]
|
|
|
|
event.entity.surface.spill_item_stack( event.entity.position, loot, true )
|
|
|
|
event.entity.surface.create_entity( { name = 'flying-text', position = event.entity.position, text = '+' .. loot.count .. ' ' .. loot.name, color = table_of_colors.white } )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_entity_died, on_entity_died )
|
|
|
|
local function on_player_changed_position( event )
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
local player = game.players[ event.player_index ]
|
|
|
|
for spot_index, spot_item in pairs( global.table_of_spots ) do
|
|
|
|
if global.table_of_spots[ spot_index ].players[ event.player_index ] ~= nil then global.table_of_spots[ spot_index ].players[ event.player_index ] = nil end
|
|
|
|
for _, position in pairs( spot_item.positions ) do
|
|
|
|
if math.floor( player.position.x ) == position.x and math.floor( player.position.y ) == position.y or math.ceil( player.position.x ) == position.x and math.ceil( player.position.y ) == position.y then
|
|
|
|
if global.table_of_spots[ spot_index ].players[ event.player_index ] == nil then
|
|
|
|
global.table_of_spots[ spot_index ].players[ event.player_index ] = player
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if global.table_of_spots[ spot_index ].players[ event.player_index ] ~= nil then break end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_player_changed_position, on_player_changed_position )
|
|
|
|
local function on_player_respawned( event )
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
local player = game.players[ event.player_index ]
|
|
|
|
rendering.draw_text{ text = global.table_of_properties[ player.force.name ].icon, target = player.character, target_offset = { 0, - 3.7 }, surface = player.surface, color = table_of_colors.white, scale = 2, alignment = 'center' }
|
|
|
|
create_a_tank( player )
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_player_respawned, on_player_respawned )
|
|
|
|
local function on_player_died( event )
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
local player = game.players[ event.player_index ]
|
|
|
|
local table_of_entities = player.surface.find_entities_filtered( { name = 'character-corpse' } )
|
|
|
|
for _, entity in pairs( table_of_entities ) do
|
|
|
|
entity.clear_items_inside()
|
|
|
|
entity.destroy()
|
|
|
|
end
|
|
|
|
if global.table_of_tanks[ player.index ] ~= nil and global.table_of_tanks[ player.index ].valid then
|
|
|
|
global.table_of_tanks[ player.index ].clear_items_inside()
|
|
|
|
global.table_of_tanks[ player.index ].destroy()
|
|
|
|
end
|
|
|
|
global.table_of_tanks[ player.index ] = nil
|
|
|
|
local force = global.table_of_properties[ player.force.name ]
|
|
|
|
if force ~= nil and force.available_tickets > 0 then force.available_tickets = force.available_tickets - 1 end
|
|
|
|
for _, spot in pairs( global.table_of_spots ) do if spot.players[ event.player_index ] ~= nil then spot.players[ event.player_index ] = nil end end
|
|
|
|
local player_death_message = global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ' was killed.'
|
|
|
|
if event.cause and event.cause.valid then
|
|
|
|
if event.cause.name == 'character' then
|
|
|
|
player_death_message = global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ' was killed by ' .. global.table_of_properties[ event.cause.player.force.name ].icon .. ' ' .. event.cause.player.name .. '.'
|
|
|
|
elseif event.cause.name == 'car' or event.cause.name == 'tank' or event.cause.name == 'train' then
|
|
|
|
local driver = event.cause.get_driver()
|
|
|
|
if driver.player then
|
|
|
|
player_death_message = global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ' was killed with a vehicle by ' .. global.table_of_properties[ driver.player.force.name ].icon .. ' ' .. driver.player.name .. '.'
|
|
|
|
else
|
|
|
|
player_death_message = global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ' was killed by run over.'
|
|
|
|
end
|
|
|
|
elseif event.cause.name then
|
|
|
|
player_death_message = global.table_of_properties[ player.force.name ].icon .. ' ' .. player.name .. ' was killed by ' .. event.cause.name .. '.'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
for _, p in pairs( game.connected_players ) do
|
|
|
|
if p.force.name ~= player.force.name and p.name ~= event.cause.player.name and p.name ~= driver.player.name then
|
|
|
|
p.print( player_death_message, table_of_colors.damage )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_player_died, on_player_died )
|
|
|
|
local function on_player_left_game( event )
|
|
|
|
if global.table_of_properties.game_stage ~= 'ongoing_game' then return end
|
|
|
|
local player = game.players[ event.player_index ]
|
|
|
|
player.character.clear_items_inside()
|
|
|
|
if global.table_of_tanks[ player.index ] ~= nil and global.table_of_tanks[ player.index ].valid then
|
|
|
|
global.table_of_tanks[ player.index ].clear_items_inside()
|
|
|
|
global.table_of_tanks[ player.index ].destroy()
|
|
|
|
end
|
|
|
|
global.table_of_tanks[ player.index ] = nil
|
|
|
|
for _, spot in pairs( global.table_of_spots ) do if spot.players[ event.player_index ] ~= nil then spot.players[ event.player_index ] = nil end end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_player_left_game, on_player_left_game )
|
|
|
|
local function on_player_joined_game( event )
|
|
|
|
local surface = game.surfaces[ 'nauvis' ]
|
|
|
|
local player = game.players[ event.player_index ]
|
|
|
|
player.force = game.forces.force_spectator
|
|
|
|
draw_gui_map_intro_button( player )
|
|
|
|
if player.online_time == 0 then
|
|
|
|
draw_gui_map_intro( player )
|
|
|
|
local position = player.force.get_spawn_position( surface )
|
|
|
|
if surface.is_chunk_generated( position ) then player.teleport( surface.find_non_colliding_position( 'character', position, 3, 0.5 ), surface ) else player.teleport( position, surface ) end
|
|
|
|
player.character.destructible = false
|
|
|
|
game.permissions.get_group( 'permission_spectator' ).add_player( player.name )
|
|
|
|
elseif player.surface.name == 'tank_conquest' then
|
|
|
|
draw_gui_button( player )
|
|
|
|
event_on_click_join( player )
|
|
|
|
end
|
|
|
|
if player.online_time == 0 and global.table_of_properties.game_stage == 'ongoing_game' then
|
|
|
|
draw_gui_button( player )
|
|
|
|
draw_gui_menu( player )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
event.add( defines.events.on_player_joined_game, on_player_joined_game )
|