2020-06-03 20:09:00 +02:00
|
|
|
require 'maps.mountain_fortress_v3.generate'
|
|
|
|
require 'maps.mountain_fortress_v3.commands'
|
|
|
|
require 'maps.mountain_fortress_v3.breached_wall'
|
|
|
|
|
|
|
|
require 'modules.dynamic_landfill'
|
|
|
|
require 'modules.shotgun_buff'
|
|
|
|
require 'modules.rocks_heal_over_time'
|
|
|
|
require 'modules.no_deconstruction_of_neutral_entities'
|
|
|
|
require 'modules.rocks_yield_ore_veins'
|
|
|
|
require 'modules.spawners_contain_biters'
|
|
|
|
require 'modules.biters_yield_coins'
|
|
|
|
require 'modules.wave_defense.main'
|
|
|
|
require 'modules.mineable_wreckage_yields_scrap'
|
|
|
|
|
2020-05-20 09:09:39 +02:00
|
|
|
local CS = require 'maps.mountain_fortress_v3.surface'
|
2020-05-17 12:23:55 +02:00
|
|
|
local Server = require 'utils.server'
|
|
|
|
local Explosives = require 'modules.explosives'
|
2020-06-03 20:09:00 +02:00
|
|
|
local Balance = require 'maps.mountain_fortress_v3.balance'
|
2020-05-17 12:23:55 +02:00
|
|
|
local Entities = require 'maps.mountain_fortress_v3.entities'
|
2020-05-23 21:18:18 +02:00
|
|
|
local Gui_mf = require 'maps.mountain_fortress_v3.gui'
|
2020-05-17 12:23:55 +02:00
|
|
|
local ICW = require 'maps.mountain_fortress_v3.icw.main'
|
|
|
|
local WD = require 'modules.wave_defense.table'
|
|
|
|
local Map = require 'modules.map_info'
|
|
|
|
local RPG = require 'maps.mountain_fortress_v3.rpg'
|
|
|
|
local Terrain = require 'maps.mountain_fortress_v3.terrain'
|
|
|
|
local Event = require 'utils.event'
|
|
|
|
local WPT = require 'maps.mountain_fortress_v3.table'
|
|
|
|
local Locomotive = require 'maps.mountain_fortress_v3.locomotive'.locomotive_spawn
|
|
|
|
local render_train_hp = require 'maps.mountain_fortress_v3.locomotive'.render_train_hp
|
|
|
|
local Score = require 'comfy_panel.score'
|
|
|
|
local Poll = require 'comfy_panel.poll'
|
|
|
|
local Collapse = require 'modules.collapse'
|
|
|
|
local Difficulty = require 'modules.difficulty_vote'
|
2020-05-20 09:09:39 +02:00
|
|
|
local Task = require 'utils.task'
|
2020-06-03 20:09:00 +02:00
|
|
|
--local HD = require 'modules.hidden_dimension.main'
|
2020-05-23 21:18:18 +02:00
|
|
|
|
2020-05-17 12:23:55 +02:00
|
|
|
local Public = {}
|
2020-06-03 20:09:00 +02:00
|
|
|
-- local raise_event = script.raise_event
|
2020-05-17 12:23:55 +02:00
|
|
|
|
2020-05-20 09:09:39 +02:00
|
|
|
local starting_items = {['pistol'] = 1, ['firearm-magazine'] = 16, ['rail'] = 16, ['wood'] = 16, ['explosives'] = 32}
|
2020-05-17 12:23:55 +02:00
|
|
|
|
2020-06-03 20:09:00 +02:00
|
|
|
local function disable_recipes()
|
|
|
|
local force = game.forces.player
|
|
|
|
force.recipes['cargo-wagon'].enabled = false
|
|
|
|
force.recipes['fluid-wagon'].enabled = false
|
|
|
|
force.recipes['artillery-wagon'].enabled = false
|
|
|
|
force.recipes['locomotive'].enabled = false
|
|
|
|
force.recipes['pistol'].enabled = false
|
|
|
|
end
|
|
|
|
|
|
|
|
local collapse_kill = {
|
|
|
|
entities = {
|
|
|
|
['laser-turret'] = true,
|
|
|
|
['flamethrower-turret'] = true,
|
|
|
|
['gun-turret'] = true,
|
|
|
|
['artillery-turret'] = true,
|
|
|
|
['landmine'] = true,
|
|
|
|
['locomotive'] = true,
|
|
|
|
['cargo-wagon'] = true
|
|
|
|
},
|
|
|
|
enabled = true
|
|
|
|
}
|
|
|
|
|
2020-05-17 12:23:55 +02:00
|
|
|
local function disable_tech()
|
|
|
|
game.forces.player.technologies['landfill'].enabled = false
|
|
|
|
game.forces.player.technologies['optics'].researched = true
|
2020-05-20 09:09:39 +02:00
|
|
|
game.forces.player.technologies['railway'].researched = true
|
2020-05-17 12:23:55 +02:00
|
|
|
game.forces.player.technologies['land-mine'].enabled = false
|
2020-06-03 20:09:00 +02:00
|
|
|
disable_recipes()
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local function set_difficulty()
|
|
|
|
local Diff = Difficulty.get()
|
|
|
|
local wave_defense_table = WD.get_table()
|
|
|
|
local player_count = #game.connected_players
|
|
|
|
if not Diff.difficulty_vote_value then
|
|
|
|
Diff.difficulty_vote_value = 0.1
|
|
|
|
end
|
|
|
|
|
|
|
|
wave_defense_table.max_active_biters = 768 + player_count * (90 * Diff.difficulty_vote_value)
|
|
|
|
|
|
|
|
-- threat gain / wave
|
|
|
|
wave_defense_table.threat_gain_multiplier = 1.2 + player_count * Diff.difficulty_vote_value * 0.1
|
|
|
|
|
|
|
|
local amount = player_count * 0.25 + 2
|
|
|
|
amount = math.floor(amount)
|
|
|
|
if amount > 6 then
|
|
|
|
amount = 6
|
|
|
|
end
|
|
|
|
Collapse.set_amount(amount)
|
|
|
|
|
|
|
|
wave_defense_table.wave_interval = 3600 - player_count * 60
|
|
|
|
if wave_defense_table.wave_interval < 1800 then
|
|
|
|
wave_defense_table.wave_interval = 1800
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function render_direction(surface)
|
2020-05-20 09:09:39 +02:00
|
|
|
local counter = WPT.get('soft_reset_counter')
|
|
|
|
if counter then
|
|
|
|
rendering.draw_text {
|
|
|
|
text = 'Welcome to Mountain Fortress v3!\nRun: ' .. counter,
|
|
|
|
surface = surface,
|
|
|
|
target = {-0, 10},
|
|
|
|
color = {r = 0.98, g = 0.66, b = 0.22},
|
|
|
|
scale = 3,
|
|
|
|
font = 'heading-1',
|
|
|
|
alignment = 'center',
|
|
|
|
scale_with_zoom = false
|
|
|
|
}
|
|
|
|
else
|
|
|
|
rendering.draw_text {
|
|
|
|
text = 'Welcome to Mountain Fortress v3!',
|
|
|
|
surface = surface,
|
|
|
|
target = {-0, 10},
|
|
|
|
color = {r = 0.98, g = 0.66, b = 0.22},
|
|
|
|
scale = 3,
|
|
|
|
font = 'heading-1',
|
|
|
|
alignment = 'center',
|
|
|
|
scale_with_zoom = false
|
|
|
|
}
|
|
|
|
end
|
2020-05-17 12:23:55 +02:00
|
|
|
|
|
|
|
rendering.draw_text {
|
|
|
|
text = '▼',
|
|
|
|
surface = surface,
|
|
|
|
target = {-0, 20},
|
|
|
|
color = {r = 0.98, g = 0.66, b = 0.22},
|
|
|
|
scale = 3,
|
|
|
|
font = 'heading-1',
|
|
|
|
alignment = 'center',
|
|
|
|
scale_with_zoom = false
|
|
|
|
}
|
|
|
|
|
|
|
|
rendering.draw_text {
|
|
|
|
text = '▼',
|
|
|
|
surface = surface,
|
|
|
|
target = {-0, 30},
|
|
|
|
color = {r = 0.98, g = 0.66, b = 0.22},
|
|
|
|
scale = 3,
|
|
|
|
font = 'heading-1',
|
|
|
|
alignment = 'center',
|
|
|
|
scale_with_zoom = false
|
|
|
|
}
|
|
|
|
rendering.draw_text {
|
|
|
|
text = '▼',
|
|
|
|
surface = surface,
|
|
|
|
target = {-0, 40},
|
|
|
|
color = {r = 0.98, g = 0.66, b = 0.22},
|
|
|
|
scale = 3,
|
|
|
|
font = 'heading-1',
|
|
|
|
alignment = 'center',
|
|
|
|
scale_with_zoom = false
|
|
|
|
}
|
|
|
|
rendering.draw_text {
|
|
|
|
text = '▼',
|
|
|
|
surface = surface,
|
|
|
|
target = {-0, 50},
|
|
|
|
color = {r = 0.98, g = 0.66, b = 0.22},
|
|
|
|
scale = 3,
|
|
|
|
font = 'heading-1',
|
|
|
|
alignment = 'center',
|
|
|
|
scale_with_zoom = false
|
|
|
|
}
|
|
|
|
rendering.draw_text {
|
|
|
|
text = '▼',
|
|
|
|
surface = surface,
|
|
|
|
target = {-0, 60},
|
|
|
|
color = {r = 0.98, g = 0.66, b = 0.22},
|
|
|
|
scale = 3,
|
|
|
|
font = 'heading-1',
|
|
|
|
alignment = 'center',
|
|
|
|
scale_with_zoom = false
|
|
|
|
}
|
|
|
|
rendering.draw_text {
|
|
|
|
text = 'Biters will attack this area.',
|
|
|
|
surface = surface,
|
|
|
|
target = {-0, 70},
|
|
|
|
color = {r = 0.98, g = 0.66, b = 0.22},
|
|
|
|
scale = 3,
|
|
|
|
font = 'heading-1',
|
|
|
|
alignment = 'center',
|
|
|
|
scale_with_zoom = false
|
|
|
|
}
|
|
|
|
|
2020-05-20 09:09:39 +02:00
|
|
|
local x_min = -Terrain.level_width / 2
|
|
|
|
local x_max = Terrain.level_width / 2
|
|
|
|
|
|
|
|
surface.create_entity({name = 'electric-beam', position = {x_min, 74}, source = {x_min, 74}, target = {x_max, 74}})
|
|
|
|
surface.create_entity({name = 'electric-beam', position = {x_min, 74}, source = {x_min, 74}, target = {x_max, 74}})
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
function Public.reset_map()
|
2020-05-20 09:09:39 +02:00
|
|
|
local Settings = CS.get()
|
2020-05-17 12:23:55 +02:00
|
|
|
local Diff = Difficulty.get()
|
2020-05-20 09:09:39 +02:00
|
|
|
local this = WPT.get()
|
2020-05-17 12:23:55 +02:00
|
|
|
local wave_defense_table = WD.get_table()
|
|
|
|
local get_score = Score.get_table()
|
|
|
|
|
2020-05-19 23:00:52 +02:00
|
|
|
for _, player in pairs(game.players) do
|
|
|
|
if player.controller_type == defines.controllers.editor then
|
|
|
|
player.toggle_map_editor()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-05-17 12:23:55 +02:00
|
|
|
if not this.active_surface_index then
|
2020-05-20 09:09:39 +02:00
|
|
|
this.active_surface_index = Settings.active_surface_index
|
2020-05-17 12:23:55 +02:00
|
|
|
else
|
2020-05-20 09:09:39 +02:00
|
|
|
this.active_surface_index = CS.create_surface()
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
Poll.reset()
|
|
|
|
ICW.reset()
|
|
|
|
game.reset_time_played()
|
|
|
|
WPT.reset_table()
|
|
|
|
|
|
|
|
disable_tech()
|
|
|
|
|
|
|
|
local surface = game.surfaces[this.active_surface_index]
|
|
|
|
|
2020-05-19 23:00:52 +02:00
|
|
|
Explosives.set_surface_whitelist({[surface.name] = true})
|
|
|
|
|
|
|
|
game.forces.player.set_spawn_position({-27, 25}, surface)
|
2020-05-23 21:18:18 +02:00
|
|
|
|
2020-06-03 20:09:00 +02:00
|
|
|
Balance.init_enemy_weapon_damage()
|
2020-05-17 12:23:55 +02:00
|
|
|
|
|
|
|
global.bad_fire_history = {}
|
|
|
|
global.friendly_fire_history = {}
|
|
|
|
global.landfill_history = {}
|
|
|
|
global.mining_history = {}
|
|
|
|
get_score.score_table = {}
|
|
|
|
Diff.difficulty_poll_closing_timeout = game.tick + 90000
|
|
|
|
Diff.difficulty_player_votes = {}
|
2020-05-23 21:18:18 +02:00
|
|
|
Diff.gui_width = 20
|
2020-05-17 12:23:55 +02:00
|
|
|
|
|
|
|
Collapse.set_kill_entities(false)
|
2020-06-03 20:09:00 +02:00
|
|
|
Collapse.set_kill_specific_entities(collapse_kill)
|
2020-05-17 12:23:55 +02:00
|
|
|
Collapse.set_speed(8)
|
|
|
|
Collapse.set_amount(1)
|
2020-05-19 23:00:52 +02:00
|
|
|
Collapse.set_max_line_size(Terrain.level_width)
|
2020-05-17 12:23:55 +02:00
|
|
|
Collapse.set_surface(surface)
|
2020-05-23 21:18:18 +02:00
|
|
|
Collapse.set_position({0, 130})
|
2020-05-17 12:23:55 +02:00
|
|
|
Collapse.set_direction('north')
|
|
|
|
Collapse.start_now(false)
|
|
|
|
|
|
|
|
this.locomotive_health = 10000
|
|
|
|
this.locomotive_max_health = 10000
|
|
|
|
this.cargo_health = 10000
|
|
|
|
this.cargo_max_health = 10000
|
|
|
|
|
|
|
|
Locomotive(surface, {x = -18, y = 25})
|
|
|
|
render_train_hp()
|
|
|
|
render_direction(surface)
|
2020-06-03 20:09:00 +02:00
|
|
|
-- LM.place_market()
|
2020-05-17 12:23:55 +02:00
|
|
|
RPG.rpg_reset_all_players()
|
|
|
|
|
|
|
|
WD.reset_wave_defense()
|
|
|
|
wave_defense_table.surface_index = this.active_surface_index
|
2020-06-03 20:09:00 +02:00
|
|
|
wave_defense_table.target = this.locomotive
|
2020-05-17 12:23:55 +02:00
|
|
|
wave_defense_table.nest_building_density = 32
|
|
|
|
wave_defense_table.game_lost = false
|
|
|
|
wave_defense_table.spawn_position = {x = 0, y = 100}
|
|
|
|
|
|
|
|
set_difficulty()
|
|
|
|
|
2020-05-23 21:18:18 +02:00
|
|
|
if not surface.is_chunk_generated({-20, 22}) then
|
|
|
|
surface.request_to_generate_chunks({-20, 22}, 0.1)
|
|
|
|
surface.force_generate_chunk_requests()
|
|
|
|
surface.set_chunk_generated_status({-20, 22}, defines.chunk_generated_status.custom_tiles)
|
|
|
|
end
|
|
|
|
|
|
|
|
game.forces.player.set_spawn_position({-27, 25}, surface)
|
|
|
|
|
2020-05-17 12:23:55 +02:00
|
|
|
Task.start_queue()
|
2020-05-23 21:18:18 +02:00
|
|
|
Task.set_queue_speed(4)
|
2020-05-17 12:23:55 +02:00
|
|
|
|
2020-05-23 21:18:18 +02:00
|
|
|
this.chunk_load_tick = game.tick + 800
|
2020-06-03 20:09:00 +02:00
|
|
|
|
|
|
|
--HD.enable_auto_init = false
|
|
|
|
|
|
|
|
--local pos = {x = this.icw_area.x, y = this.icw_area.y}
|
|
|
|
|
|
|
|
--HD.init({position = pos, hd_surface = tostring(this.icw_locomotive.surface.name)})
|
|
|
|
|
|
|
|
--raise_event(HD.events.reset_game, {})
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local function on_player_changed_position(event)
|
2020-05-20 09:09:39 +02:00
|
|
|
local this = WPT.get()
|
2020-05-17 12:23:55 +02:00
|
|
|
local player = game.players[event.player_index]
|
|
|
|
local map_name = 'mountain_fortress_v3'
|
|
|
|
|
|
|
|
if string.sub(player.surface.name, 0, #map_name) ~= map_name then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
local position = player.position
|
|
|
|
local surface = game.surfaces[this.active_surface_index]
|
|
|
|
|
|
|
|
if position.y >= 74 then
|
|
|
|
player.teleport({position.x, position.y - 1}, surface)
|
|
|
|
player.print('Forcefield does not approve.', {r = 0.98, g = 0.66, b = 0.22})
|
|
|
|
if player.character then
|
|
|
|
player.character.health = player.character.health - 5
|
|
|
|
player.character.surface.create_entity({name = 'water-splash', position = position})
|
|
|
|
if player.character.health <= 0 then
|
|
|
|
player.character.die('enemy')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function on_player_joined_game(event)
|
2020-06-03 20:09:00 +02:00
|
|
|
local players = WPT.get('players')
|
|
|
|
local active_surface_index = WPT.get('active_surface_index')
|
2020-05-17 12:23:55 +02:00
|
|
|
local player = game.players[event.player_index]
|
2020-06-03 20:09:00 +02:00
|
|
|
local surface = game.surfaces[active_surface_index]
|
2020-05-17 12:23:55 +02:00
|
|
|
|
2020-06-03 20:09:00 +02:00
|
|
|
set_difficulty()
|
2020-05-17 12:23:55 +02:00
|
|
|
|
2020-06-03 20:09:00 +02:00
|
|
|
if not players[player.index] then
|
|
|
|
players[player.index] = {
|
2020-05-17 12:23:55 +02:00
|
|
|
data = {}
|
|
|
|
}
|
2020-05-23 21:18:18 +02:00
|
|
|
player.print('Greetings, ' .. player.name .. '!', {r = 0.98, g = 0.66, b = 0.22})
|
|
|
|
player.print('Please read the map info.', {r = 0.98, g = 0.66, b = 0.22})
|
|
|
|
for item, amount in pairs(starting_items) do
|
|
|
|
player.insert({name = item, count = amount})
|
|
|
|
end
|
2020-06-03 20:09:00 +02:00
|
|
|
--RPG.gain_xp(player, 515)
|
2020-05-23 21:18:18 +02:00
|
|
|
end
|
2020-05-21 23:08:23 +02:00
|
|
|
|
2020-06-03 20:09:00 +02:00
|
|
|
if player.surface.index ~= active_surface_index then
|
2020-05-23 21:18:18 +02:00
|
|
|
player.teleport(
|
|
|
|
surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(surface), 3, 0, 5),
|
|
|
|
surface
|
|
|
|
)
|
|
|
|
else
|
|
|
|
local p = {x = player.position.x, y = player.position.y}
|
|
|
|
local oom = surface.get_tile(p).name == 'out-of-map'
|
|
|
|
if oom then
|
2020-05-21 23:08:23 +02:00
|
|
|
player.teleport(
|
2020-05-23 21:18:18 +02:00
|
|
|
surface.find_non_colliding_position(
|
2020-05-21 23:08:23 +02:00
|
|
|
'character',
|
2020-05-23 21:18:18 +02:00
|
|
|
game.forces.player.get_spawn_position(surface),
|
2020-05-21 23:08:23 +02:00
|
|
|
3,
|
|
|
|
0,
|
|
|
|
5
|
|
|
|
),
|
2020-05-23 21:18:18 +02:00
|
|
|
surface
|
2020-05-21 23:08:23 +02:00
|
|
|
)
|
|
|
|
end
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function on_player_left_game()
|
|
|
|
set_difficulty()
|
|
|
|
end
|
|
|
|
|
|
|
|
local function on_pre_player_left_game(event)
|
2020-05-20 09:09:39 +02:00
|
|
|
local this = WPT.get()
|
2020-05-17 12:23:55 +02:00
|
|
|
local player = game.players[event.player_index]
|
2020-05-23 21:18:18 +02:00
|
|
|
local tick
|
2020-05-17 12:23:55 +02:00
|
|
|
if player.character then
|
2020-06-03 20:09:00 +02:00
|
|
|
if not this.offline_players_enabled then
|
2020-05-23 21:18:18 +02:00
|
|
|
tick = game.tick + 432000
|
|
|
|
else
|
|
|
|
tick = game.tick
|
|
|
|
end
|
2020-05-19 23:00:52 +02:00
|
|
|
this.offline_players[#this.offline_players + 1] = {
|
|
|
|
index = event.player_index,
|
|
|
|
name = player.name,
|
2020-05-23 21:18:18 +02:00
|
|
|
tick = tick
|
2020-05-19 23:00:52 +02:00
|
|
|
}
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-05-19 23:00:52 +02:00
|
|
|
local function remove_offline_players()
|
2020-05-20 09:09:39 +02:00
|
|
|
local this = WPT.get()
|
2020-05-23 21:18:18 +02:00
|
|
|
if not this.offline_players_enabled then
|
|
|
|
if game.tick < 500 then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if game.tick % 432000 == 0 then
|
|
|
|
this.offline_players_enabled = true
|
|
|
|
end
|
|
|
|
return
|
|
|
|
end
|
2020-05-19 23:00:52 +02:00
|
|
|
local offline_players = WPT.get('offline_players')
|
|
|
|
local active_surface_index = WPT.get('active_surface_index')
|
|
|
|
local surface = game.surfaces[active_surface_index]
|
|
|
|
local keeper = '[color=blue]Cleaner:[/color]'
|
|
|
|
local player_inv = {}
|
|
|
|
local items = {}
|
|
|
|
if #offline_players > 0 then
|
2020-05-17 12:23:55 +02:00
|
|
|
local later = {}
|
2020-05-19 23:00:52 +02:00
|
|
|
for i = 1, #offline_players, 1 do
|
|
|
|
if
|
|
|
|
offline_players[i] and game.players[offline_players[i].index] and
|
|
|
|
game.players[offline_players[i].index].connected
|
|
|
|
then
|
|
|
|
this.offline_players[i] = nil
|
2020-05-17 12:23:55 +02:00
|
|
|
else
|
2020-05-19 23:00:52 +02:00
|
|
|
if offline_players[i] and offline_players[i].tick < game.tick - 54000 then
|
|
|
|
local name = offline_players[i].name
|
|
|
|
player_inv[1] =
|
|
|
|
game.players[offline_players[i].index].get_inventory(defines.inventory.character_main)
|
|
|
|
player_inv[2] =
|
|
|
|
game.players[offline_players[i].index].get_inventory(defines.inventory.character_armor)
|
|
|
|
player_inv[3] =
|
|
|
|
game.players[offline_players[i].index].get_inventory(defines.inventory.character_guns)
|
|
|
|
player_inv[4] =
|
|
|
|
game.players[offline_players[i].index].get_inventory(defines.inventory.character_ammo)
|
|
|
|
player_inv[5] =
|
|
|
|
game.players[offline_players[i].index].get_inventory(defines.inventory.character_trash)
|
|
|
|
local pos = game.forces.player.get_spawn_position(surface)
|
2020-05-17 12:23:55 +02:00
|
|
|
local e =
|
|
|
|
surface.create_entity(
|
|
|
|
{
|
|
|
|
name = 'character',
|
2020-05-19 23:00:52 +02:00
|
|
|
position = pos,
|
2020-05-17 12:23:55 +02:00
|
|
|
force = 'neutral'
|
|
|
|
}
|
|
|
|
)
|
|
|
|
local inv = e.get_inventory(defines.inventory.character_main)
|
|
|
|
for ii = 1, 5, 1 do
|
|
|
|
if player_inv[ii].valid then
|
|
|
|
for iii = 1, #player_inv[ii], 1 do
|
|
|
|
if player_inv[ii][iii].valid then
|
|
|
|
items[#items + 1] = player_inv[ii][iii]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if #items > 0 then
|
|
|
|
for item = 1, #items, 1 do
|
|
|
|
if items[item].valid then
|
|
|
|
inv.insert(items[item])
|
|
|
|
end
|
|
|
|
end
|
2020-05-19 23:00:52 +02:00
|
|
|
game.print(
|
|
|
|
keeper .. ' ' .. name .. ' has left his goodies! [gps=' .. pos.x .. ',' .. pos.y .. ']',
|
|
|
|
{r = 0.98, g = 0.66, b = 0.22}
|
|
|
|
)
|
|
|
|
|
2020-05-17 12:23:55 +02:00
|
|
|
e.die('neutral')
|
|
|
|
else
|
|
|
|
e.destroy()
|
|
|
|
end
|
|
|
|
|
|
|
|
for ii = 1, 5, 1 do
|
|
|
|
if player_inv[ii].valid then
|
|
|
|
player_inv[ii].clear()
|
|
|
|
end
|
|
|
|
end
|
2020-05-19 23:00:52 +02:00
|
|
|
this.offline_players[i] = nil
|
2020-05-17 12:23:55 +02:00
|
|
|
else
|
2020-05-19 23:00:52 +02:00
|
|
|
later[#later + 1] = offline_players[i]
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-05-19 23:00:52 +02:00
|
|
|
this.offline_players = {}
|
2020-05-17 12:23:55 +02:00
|
|
|
if #later > 0 then
|
|
|
|
for i = 1, #later, 1 do
|
2020-05-19 23:00:52 +02:00
|
|
|
this.offline_players[#offline_players + 1] = later[i]
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function on_research_finished(event)
|
|
|
|
disable_recipes()
|
2020-05-23 21:18:18 +02:00
|
|
|
local research = event.research
|
|
|
|
local this = WPT.get()
|
|
|
|
|
|
|
|
research.force.character_inventory_slots_bonus = game.forces.player.mining_drill_productivity_bonus * 50 -- +5 Slots / level
|
2020-05-17 12:23:55 +02:00
|
|
|
local mining_speed_bonus = game.forces.player.mining_drill_productivity_bonus * 5 -- +50% speed / level
|
2020-05-23 21:18:18 +02:00
|
|
|
if research.force.technologies['steel-axe'].researched then
|
2020-05-17 12:23:55 +02:00
|
|
|
mining_speed_bonus = mining_speed_bonus + 0.5
|
|
|
|
end -- +50% speed for steel-axe research
|
2020-05-23 21:18:18 +02:00
|
|
|
research.force.manual_mining_speed_modifier = mining_speed_bonus
|
|
|
|
|
|
|
|
local force_name = research.force.name
|
|
|
|
if not force_name then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
this.flamethrower_damage[force_name] = -0.65
|
|
|
|
if research.name == 'military' then
|
|
|
|
game.forces[force_name].set_turret_attack_modifier('flamethrower-turret', this.flamethrower_damage[force_name])
|
|
|
|
game.forces[force_name].set_ammo_damage_modifier('flamethrower', this.flamethrower_damage[force_name])
|
|
|
|
end
|
|
|
|
|
|
|
|
if string.sub(research.name, 0, 18) == 'refined-flammables' then
|
|
|
|
this.flamethrower_damage[force_name] = this.flamethrower_damage[force_name] + 0.10
|
|
|
|
game.forces[force_name].set_turret_attack_modifier('flamethrower-turret', this.flamethrower_damage[force_name])
|
|
|
|
game.forces[force_name].set_ammo_damage_modifier('flamethrower', this.flamethrower_damage[force_name])
|
|
|
|
end
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local function is_locomotive_valid()
|
2020-05-23 21:18:18 +02:00
|
|
|
local locomotive = WPT.get('locomotive')
|
|
|
|
if not locomotive.valid then
|
2020-05-17 12:23:55 +02:00
|
|
|
Entities.loco_died()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function has_the_game_ended()
|
2020-05-20 09:09:39 +02:00
|
|
|
local this = WPT.get()
|
2020-05-17 12:23:55 +02:00
|
|
|
if this.game_reset_tick then
|
|
|
|
if this.game_reset_tick < game.tick then
|
|
|
|
if not this.disable_reset then
|
|
|
|
this.game_reset_tick = nil
|
|
|
|
Public.reset_map()
|
|
|
|
else
|
2020-06-03 20:09:00 +02:00
|
|
|
if not this.game_will_not_reset then
|
|
|
|
game.print('Auto reset is disabled. Server is shutting down!', {r = 0.22, g = 0.88, b = 0.22})
|
|
|
|
local message = 'Auto reset is disabled. Server is shutting down!'
|
|
|
|
Server.to_discord_bold(table.concat {'*** ', message, ' ***'})
|
|
|
|
Server.stop_scenario()
|
|
|
|
this.game_will_not_reset = true
|
|
|
|
end
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
return
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function chunk_load()
|
2020-05-23 21:18:18 +02:00
|
|
|
local chunk_load_tick = WPT.get('chunk_load_tick')
|
|
|
|
if chunk_load_tick then
|
|
|
|
if chunk_load_tick < game.tick then
|
|
|
|
WPT.get().chunk_load_tick = nil
|
|
|
|
Task.set_queue_speed(0.5)
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local on_tick = function()
|
2020-05-20 09:09:39 +02:00
|
|
|
local active_surface_index = WPT.get('active_surface_index')
|
|
|
|
local surface = game.surfaces[active_surface_index]
|
2020-05-17 12:23:55 +02:00
|
|
|
local wave_defense_table = WD.get_table()
|
2020-05-23 21:18:18 +02:00
|
|
|
local update_gui = Gui_mf.update_gui
|
2020-05-17 12:23:55 +02:00
|
|
|
|
|
|
|
if game.tick % 30 == 0 then
|
|
|
|
for _, player in pairs(game.connected_players) do
|
|
|
|
update_gui(player)
|
|
|
|
end
|
|
|
|
|
2020-05-23 21:18:18 +02:00
|
|
|
is_locomotive_valid()
|
|
|
|
has_the_game_ended()
|
|
|
|
chunk_load()
|
|
|
|
|
2020-05-17 12:23:55 +02:00
|
|
|
if game.tick % 1800 == 0 then
|
2020-05-23 21:18:18 +02:00
|
|
|
remove_offline_players()
|
|
|
|
Entities.set_scores()
|
2020-05-19 23:00:52 +02:00
|
|
|
local collapse_pos = Collapse.get_position()
|
|
|
|
local position = surface.find_non_colliding_position('stone-furnace', collapse_pos, 128, 1)
|
2020-05-17 12:23:55 +02:00
|
|
|
if position then
|
|
|
|
wave_defense_table.spawn_position = position
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local on_init = function()
|
2020-05-20 09:09:39 +02:00
|
|
|
local this = WPT.get()
|
2020-05-17 12:23:55 +02:00
|
|
|
Public.reset_map()
|
|
|
|
|
|
|
|
global.custom_highscore.description = 'Wagon distance reached:'
|
|
|
|
|
2020-05-23 21:18:18 +02:00
|
|
|
local difficulties = {
|
|
|
|
[1] = {
|
|
|
|
name = 'Easy',
|
|
|
|
value = 0.75,
|
|
|
|
color = {r = 0.00, g = 0.25, b = 0.00},
|
|
|
|
print_color = {r = 0.00, g = 0.4, b = 0.00}
|
|
|
|
},
|
|
|
|
[2] = {
|
|
|
|
name = 'Normal',
|
|
|
|
value = 1,
|
|
|
|
color = {r = 0.00, g = 0.00, b = 0.25},
|
|
|
|
print_color = {r = 0.0, g = 0.0, b = 0.5}
|
|
|
|
},
|
|
|
|
[3] = {
|
|
|
|
name = 'Hard',
|
|
|
|
value = 1.5,
|
|
|
|
color = {r = 0.25, g = 0.00, b = 0.00},
|
|
|
|
print_color = {r = 0.4, g = 0.0, b = 0.00}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
local tooltip = {
|
|
|
|
[1] = 'Makes the game really easy.\nDo note that wave_defense is still based on amount of players.\nAnd what difficulty you pick.',
|
|
|
|
[2] = 'Normal Mountain Fortress game-play.\nDo note that wave_defense is still based on amount of players.\nAnd what difficulty you pick.',
|
|
|
|
[3] = "Are you sure? It won't be easy.\nDo note that wave_defense is still based on amount of players.\nAnd what difficulty you pick."
|
|
|
|
}
|
|
|
|
|
|
|
|
Difficulty.set_difficulties(difficulties)
|
|
|
|
Difficulty.set_tooltip(tooltip)
|
|
|
|
|
2020-05-17 12:23:55 +02:00
|
|
|
this.rocks_yield_ore_maximum_amount = 500
|
|
|
|
this.type_modifier = 1
|
|
|
|
this.rocks_yield_ore_base_amount = 50
|
|
|
|
this.rocks_yield_ore_distance_modifier = 0.025
|
|
|
|
|
|
|
|
local T = Map.Pop_info()
|
|
|
|
T.localised_category = 'mountain_fortress'
|
|
|
|
T.main_caption_color = {r = 150, g = 150, b = 0}
|
|
|
|
T.sub_caption_color = {r = 0, g = 150, b = 0}
|
|
|
|
|
|
|
|
Explosives.set_destructible_tile('out-of-map', 1500)
|
|
|
|
Explosives.set_destructible_tile('water', 1000)
|
|
|
|
Explosives.set_destructible_tile('water-green', 1000)
|
|
|
|
Explosives.set_destructible_tile('deepwater-green', 1000)
|
|
|
|
Explosives.set_destructible_tile('deepwater', 1000)
|
|
|
|
Explosives.set_destructible_tile('water-shallow', 1000)
|
2020-05-23 21:18:18 +02:00
|
|
|
Explosives.set_destructible_tile('water-mud', 1000)
|
2020-05-17 12:23:55 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
Event.on_nth_tick(10, on_tick)
|
|
|
|
Event.on_init(on_init)
|
|
|
|
Event.add(defines.events.on_player_joined_game, on_player_joined_game)
|
|
|
|
Event.add(defines.events.on_player_left_game, on_player_left_game)
|
|
|
|
Event.add(defines.events.on_player_changed_position, on_player_changed_position)
|
|
|
|
Event.add(defines.events.on_research_finished, on_research_finished)
|
|
|
|
Event.add(defines.events.on_pre_player_left_game, on_pre_player_left_game)
|
|
|
|
|
|
|
|
return Public
|