1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-30 23:17:53 +02:00
ComfyFactorio/maps/mountain_fortress_v3/breached_wall.lua

286 lines
9.1 KiB
Lua
Raw Normal View History

2020-05-23 21:18:18 +02:00
local Collapse = require 'modules.collapse'
local Terrain = require 'maps.mountain_fortress_v3.terrain'
local Balance = require 'maps.mountain_fortress_v3.balance'
2020-07-25 17:22:04 +02:00
local RPG_Settings = require 'modules.rpg.table'
2020-07-28 11:24:16 +02:00
local Functions = require 'modules.rpg.functions'
2020-06-03 20:09:00 +02:00
local WPT = require 'maps.mountain_fortress_v3.table'
2020-06-07 13:33:24 +02:00
local Alert = require 'utils.alert'
2020-05-23 21:18:18 +02:00
local Event = require 'utils.event'
2020-06-05 23:53:58 +02:00
local Task = require 'utils.task'
local Token = require 'utils.token'
2020-09-17 09:14:07 +02:00
local BM = require 'maps.mountain_fortress_v3.blood_moon'
2020-05-23 21:18:18 +02:00
local raise_event = script.raise_event
local floor = math.floor
2020-08-14 17:16:04 +02:00
local random = math.random
2020-05-23 21:18:18 +02:00
local sqrt = math.sqrt
2020-11-23 23:10:45 +02:00
local level_depth = WPT.level_depth
2020-05-23 21:18:18 +02:00
2020-11-17 13:45:27 +02:00
local z = {
[3] = true,
[6] = true,
[12] = true,
[15] = true,
[16] = true,
[18] = true,
[22] = true
}
2020-06-05 23:53:58 +02:00
local collapse_message =
Token.register(
function(data)
local pos = data.position
2020-09-04 22:04:28 +02:00
local message = ({'breached_wall.collapse_start'})
2020-06-05 23:53:58 +02:00
local collapse_position = {
position = pos
}
Alert.alert_all_players_location(collapse_position, message)
end
)
2020-08-14 17:16:04 +02:00
local spidertron_unlocked =
Token.register(
function()
2020-09-04 22:04:28 +02:00
local message = ({'breached_wall.spidertron_unlocked'})
2020-08-14 17:16:04 +02:00
Alert.alert_all_players(30, message, nil, 'achievement/tech-maniac', 0.1)
end
)
2020-11-17 13:45:27 +02:00
--[[
2020-10-24 14:46:14 +02:00
local calculate_hp = function(zone)
return 2 + 0.2 * zone - 1 * floor(zone / 20)
2020-11-17 13:45:27 +02:00
end ]]
2020-06-05 23:53:58 +02:00
local first_player_to_zone =
Token.register(
function(data)
local player = data.player
2020-09-17 09:14:07 +02:00
if not player or not player.valid then
return
end
2020-06-05 23:53:58 +02:00
local breached_wall = data.breached_wall
2020-10-30 23:05:05 +02:00
local message = ({'breached_wall.first_to_reach', player.name, breached_wall})
2020-06-05 23:53:58 +02:00
Alert.alert_all_players(10, message)
end
)
local artillery_warning =
Token.register(
function()
2020-09-04 22:04:28 +02:00
local message = ({'breached_wall.artillery_warning'})
2020-06-05 23:53:58 +02:00
Alert.alert_all_players(10, message)
end
)
2020-06-03 20:09:00 +02:00
2020-11-17 16:03:05 +02:00
local spidertron_too_far =
Token.register(
function(data)
local player = data.player
local message = ({'breached_wall.cheating_through', player.name})
Alert.alert_all_players(30, message)
end
)
2020-11-23 23:10:45 +02:00
local compare_player_pos = function(player)
local p = player.position
local index = player.index
if p.y <= -level_depth * 5 and p.y >= -level_depth * 6 then
RPG_Settings.set_value_to_player(index, 'scrap_zone', true)
elseif p.y <= -level_depth * 15 and p.y >= -level_depth * 16 then
RPG_Settings.set_value_to_player(index, 'scrap_zone', true)
elseif not (p.y <= -level_depth * 5 and p.y >= -level_depth * 6) then
local has_scrap = RPG_Settings.get_value_from_player(index, 'scrap_zone')
if has_scrap then
RPG_Settings.set_value_to_player(index, 'scrap_zone', false)
end
elseif not (p.y <= -level_depth * 15 and p.y >= -level_depth * 16) then
local has_scrap = RPG_Settings.get_value_from_player(index, 'scrap_zone')
if has_scrap then
RPG_Settings.set_value_to_player(index, 'scrap_zone', false)
end
end
end
2020-11-17 16:03:05 +02:00
local compare_player_and_train = function(player, entity)
2020-12-04 02:09:52 +02:00
if not player.driving then
return
end
if not (entity and entity.valid) then
return
end
2020-11-17 16:03:05 +02:00
local position = player.position
local locomotive = WPT.get('locomotive')
if not locomotive or not locomotive.valid then
return
end
local gap_between_zones = WPT.get('gap_between_zones')
2020-11-18 16:24:22 +02:00
gap_between_zones.highest_pos = locomotive.position
gap_between_zones = WPT.get('gap_between_zones')
local c_y = position.y
local t_y = gap_between_zones.highest_pos.y
2020-11-17 16:03:05 +02:00
if c_y - t_y <= gap_between_zones.neg_gap then
if entity.health then
entity.health = entity.health - 500
if entity.health <= 0 then
entity.die('enemy')
Task.set_timeout_in_ticks(30, spidertron_too_far, {player = player})
return
end
end
end
end
2020-05-23 21:18:18 +02:00
local function distance(player)
2020-11-17 13:45:27 +02:00
local index = player.index
local bonus = RPG_Settings.get_value_from_player(index, 'bonus')
2020-07-25 17:22:04 +02:00
local rpg_extra = RPG_Settings.get('rpg_extra')
2020-05-23 21:18:18 +02:00
local breached_wall = WPT.get('breached_wall')
2020-07-06 15:45:09 +02:00
local bonus_xp_on_join = WPT.get('bonus_xp_on_join')
2020-07-28 11:24:16 +02:00
local enable_arties = WPT.get('enable_arties')
2020-06-03 20:09:00 +02:00
2020-11-23 23:10:45 +02:00
local p = player.position
2020-11-17 16:03:05 +02:00
local s = WPT.get('validate_spider')
if s[index] then
local e = s[index]
if not (e and e.valid) then
s[index] = nil
end
compare_player_and_train(player, s[index])
end
2020-11-23 23:10:45 +02:00
compare_player_pos(player)
local distance_to_center = floor(sqrt(p.x ^ 2 + p.y ^ 2))
2020-05-23 21:18:18 +02:00
local location = distance_to_center
2020-06-03 20:09:00 +02:00
if location < Terrain.level_depth * bonus - 10 then
2020-05-23 21:18:18 +02:00
return
end
2020-06-03 20:09:00 +02:00
local max = Terrain.level_depth * bonus
local breach_max = Terrain.level_depth * breached_wall
local breach_max_times = location >= breach_max
local max_times = location >= max
if max_times then
if breach_max_times then
2020-05-23 21:18:18 +02:00
rpg_extra.breached_walls = rpg_extra.breached_walls + 1
2020-07-06 15:45:09 +02:00
rpg_extra.reward_new_players = bonus_xp_on_join * rpg_extra.breached_walls
2020-07-14 21:50:56 +02:00
WPT.set().breached_wall = breached_wall + 1
WPT.set().placed_trains_in_zone.placed = 0
2020-09-02 17:36:04 +02:00
WPT.set().biters.amount = 0
2020-11-17 16:03:05 +02:00
WPT.set('blood_moon', false)
2020-07-22 18:58:42 +02:00
WPT.set().placed_trains_in_zone.randomized = false
2020-07-14 21:50:56 +02:00
WPT.set().placed_trains_in_zone.positions = {}
2020-05-23 21:18:18 +02:00
raise_event(Balance.events.breached_wall, {})
2020-10-24 14:46:14 +02:00
--[[ global.biter_health_boost = calculate_hp(breached_wall) ]]
2020-08-14 17:16:04 +02:00
if WPT.get('breached_wall') == WPT.get('spidertron_unlocked_at_wave') then
local main_market_items = WPT.get('main_market_items')
if not main_market_items['spidertron'] then
local rng = random(70000, 120000)
main_market_items['spidertron'] = {
stack = 1,
value = 'coin',
price = rng,
tooltip = 'Chonk Spidertron',
upgrade = false,
static = true
}
Task.set_timeout_in_ticks(150, spidertron_unlocked)
end
end
2020-11-17 16:03:05 +02:00
if breached_wall % 2 == 0 then
local blood_moon = WPT.get('blood_moon')
2020-09-17 09:14:07 +02:00
local t = game.tick
2020-12-04 02:09:52 +02:00
local surface = player.surface
2020-11-17 16:03:05 +02:00
if not blood_moon then
2020-12-04 02:09:52 +02:00
BM.set_daytime(surface, t, true)
2020-11-17 16:03:05 +02:00
WPT.set('blood_moon', true)
2020-09-17 09:14:07 +02:00
end
2020-11-17 16:03:05 +02:00
else
2020-12-04 02:09:52 +02:00
local surface = player.surface
surface.brightness_visual_weights = {
2020-11-17 16:03:05 +02:00
a = 1,
b = 0,
g = 0,
r = 0
}
2020-12-04 02:09:52 +02:00
surface.daytime = 0.7
surface.freeze_daytime = false
2020-09-17 09:14:07 +02:00
end
2020-06-05 23:53:58 +02:00
local data = {
player = player,
breached_wall = breached_wall
}
Task.set_timeout_in_ticks(360, first_player_to_zone, data)
2020-06-03 20:09:00 +02:00
if breached_wall == 5 then
2020-07-28 11:24:16 +02:00
if enable_arties == 6 then
Task.set_timeout_in_ticks(360, artillery_warning)
end
2020-06-03 20:09:00 +02:00
end
end
2020-11-17 16:03:05 +02:00
2020-06-03 20:09:00 +02:00
if not Collapse.start_now() then
Collapse.start_now(true)
2020-06-05 23:53:58 +02:00
local data = {
position = Collapse.get_position()
}
Task.set_timeout_in_ticks(550, collapse_message, data)
2020-05-23 21:18:18 +02:00
end
2020-11-17 16:03:05 +02:00
2020-11-17 13:45:27 +02:00
RPG_Settings.set_value_to_player(index, 'bonus', bonus + 1)
local b = RPG_Settings.get_value_from_player(index, 'bonus')
if z[b] then
RPG_Settings.set_value_to_player(index, 'forest_zone', true)
elseif not z[b] then
RPG_Settings.set_value_to_player(index, 'forest_zone', false)
end
2020-07-28 11:24:16 +02:00
Functions.gain_xp(player, bonus_xp_on_join * bonus)
2020-09-17 09:14:07 +02:00
local message = ({'breached_wall.wall_breached', bonus})
Alert.alert_player_warning(player, 10, message)
2020-05-23 21:18:18 +02:00
return
end
end
local function on_player_changed_position(event)
2020-09-17 09:14:07 +02:00
local player = game.get_player(event.player_index)
2020-05-23 21:18:18 +02:00
local map_name = 'mountain_fortress_v3'
if string.sub(player.surface.name, 0, #map_name) ~= map_name then
return
end
distance(player)
end
2020-11-17 16:03:05 +02:00
local function on_player_driving_changed_state(event)
local player = game.players[event.player_index]
if not (player and player.valid) then
return
end
local entity = event.entity
if not (entity and entity.valid) then
return
end
local s = WPT.get('validate_spider')
if entity.name == 'spidertron' then
if not s[player.index] then
s[player.index] = entity
end
else
if s[player.index] then
s[player.index] = nil
end
end
end
2020-05-23 21:18:18 +02:00
Event.add(defines.events.on_player_changed_position, on_player_changed_position)
2020-11-17 16:03:05 +02:00
Event.add(defines.events.on_player_driving_changed_state, on_player_driving_changed_state)