1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-26 22:56:43 +02:00

Mtn: rework map generation logic

This commit is contained in:
Gerkiz 2024-10-27 00:01:15 +02:00
parent 42b9762812
commit fa2a607bc5
23 changed files with 640 additions and 334 deletions

View File

@ -1861,6 +1861,8 @@ stds.factorio_defines = {
'cancel_craft',
'change_picking_state',
'set_inventory_bar',
'gui_leave',
'gui_hover',
'gui_selected_tab_changed',
'open_logistic_gui',
'cursor_split',

View File

@ -692,7 +692,7 @@ local function biter_attack_wave()
evolution = 1
end
game.forces.enemy.set_evolution_factor(evolution, surface)
game.forces.enemy.set_evolution_factor(evolution, surface.name)
local y_raffle = get_y_coord_raffle_table()

View File

@ -82,6 +82,11 @@ local function on_entity_died(event)
return
end
local current_task = Public.get('current_task')
if not current_task.done then
return
end
local cause = event.cause

View File

@ -446,6 +446,11 @@ local function on_player_changed_position(event)
return
end
local current_task = Public.get('current_task')
if not current_task.done then
return
end
local player = game.get_player(event.player_index)
if not player or not player.valid then
return
@ -487,6 +492,11 @@ local function on_player_driving_changed_state(event)
return
end
local current_task = Public.get('current_task')
if not current_task.done then
return
end
local player = game.get_player(event.player_index)
if not (player and player.valid) then
return

View File

@ -84,7 +84,7 @@ Commands.new('scenario', 'Usable only for admins - controls the scenario!')
game.print(mapkeeper .. ' server, has reset the game!', { r = 0.98, g = 0.66, b = 0.22 })
Discord.send_notification_raw(Public.discord_name, 'Server has reset the game!')
end
Public.reset_map()
Public.set_task('move_players', 'Init')
player.print('Game has been reset!')
end
end
@ -124,7 +124,7 @@ Commands.new('mtn_reverse_map', 'Usable only for admins - reverses the map!')
local reversed = Public.get_stateful_settings('reversed')
Public.set_stateful_settings('reversed', not reversed)
Discord.send_notification_raw(Public.discord_name, player.name .. ' reversed the map.')
Public.reset_map()
Public.set_task('move_players', 'Init')
game.print(mapkeeper .. player.name .. ', has reverse the map and reset the game!',
{ r = 0.98, g = 0.66, b = 0.22 })
player.print('Map reversed.')

View File

@ -89,7 +89,7 @@ local reset_game =
if this.soft_reset then
Public.set_scores()
this.game_reset_tick = nil
Public.reset_map()
Public.set_task('move_players', 'Init')
return
end
if this.restart then
@ -743,6 +743,11 @@ local function on_player_mined_entity(event)
if not entity.valid then
return
end
local current_task = Public.get('current_task')
if not current_task.done then
return
end
local rpg_char = RPG.get_value_from_player(player.index)
if not rpg_char then return end
@ -797,6 +802,11 @@ local function on_robot_mined_entity(event)
return
end
local current_task = Public.get('current_task')
if not current_task.done then
return
end
if string.sub(entity.surface.name, 0, #scenario_name) ~= scenario_name then
return
end
@ -1342,6 +1352,8 @@ function Public.loco_died(invalid_locomotive)
return
end
if not Public.is_task_done() then return end
local announced_message = Public.get('announced_message')
if announced_message then
return
@ -1482,7 +1494,12 @@ end
local function on_built_entity(event)
local entity = event.entity
if not entity.valid then
if not entity or not entity.valid then
return
end
if string.sub(entity.surface.name, 0, #scenario_name) == Public.init_name then
entity.destroy()
return
end

View File

@ -1235,18 +1235,19 @@ function Public.render_direction(surface, reversed)
Task.set_timeout_in_ticks(50, do_season_fix_token, {})
if counter then
rendering.draw_text {
text = text .. '\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
}
Public.set('counter',
rendering.draw_text {
text = text .. '\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 {
Public.set('counter', rendering.draw_text {
text = text,
surface = surface,
target = { -0, 10 },
@ -1255,7 +1256,7 @@ function Public.render_direction(surface, reversed)
font = 'heading-1',
alignment = 'center',
scale_with_zoom = false
}
})
end
local x_min = -zone_settings.zone_width / 2
@ -1263,20 +1264,21 @@ function Public.render_direction(surface, reversed)
if reversed then
local inc = 0
for _ = 1, 5 do
rendering.draw_text {
text = '',
surface = surface,
target = { -0, -20 - inc },
color = { r = 0.98, g = 0.66, b = 0.22 },
scale = 3,
font = 'heading-1',
alignment = 'center',
scale_with_zoom = false
}
for i = 1, 5 do
Public.set('direction_' .. i,
rendering.draw_text {
text = '',
surface = surface,
target = { -0, -20 - inc },
color = { r = 0.98, g = 0.66, b = 0.22 },
scale = 3,
font = 'heading-1',
alignment = 'center',
scale_with_zoom = false
})
inc = inc + 10
end
rendering.draw_text {
Public.set('direction_attack', rendering.draw_text {
text = 'Biters will attack this area.',
surface = surface,
target = { -0, -70 },
@ -1285,13 +1287,13 @@ function Public.render_direction(surface, reversed)
font = 'heading-1',
alignment = 'center',
scale_with_zoom = false
}
})
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 } })
else
local inc = 0
for _ = 1, 5 do
rendering.draw_text {
for i = 1, 5 do
Public.set('direction_' .. i, rendering.draw_text {
text = '',
surface = surface,
target = { -0, 20 + inc },
@ -1300,10 +1302,10 @@ function Public.render_direction(surface, reversed)
font = 'heading-1',
alignment = 'center',
scale_with_zoom = false
}
})
inc = inc + 10
end
rendering.draw_text {
Public.set('direction_attack', rendering.draw_text {
text = 'Biters will attack this area.',
surface = surface,
target = { -0, 70 },
@ -1312,7 +1314,7 @@ function Public.render_direction(surface, reversed)
font = 'heading-1',
alignment = 'center',
scale_with_zoom = false
}
})
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 } })
end
@ -1475,20 +1477,21 @@ function Public.set_spawn_position()
end
function Public.on_player_joined_game(event)
local active_surface_index = Public.get('active_surface_index')
if not active_surface_index then
return
end
local players = Public.get('players')
local player = game.players[event.player_index]
local surface = game.surfaces[active_surface_index]
Public.set_difficulty()
ICW_Func.is_minimap_valid(player, surface)
Modifiers.update_player_modifiers(player)
local active_surface_index = Public.get('active_surface_index')
local surface = game.surfaces[active_surface_index or 'nauvis']
local current_task = Public.get('current_task')
if not current_task.done then
local init_surface = game.get_surface('Init')
if init_surface and init_surface.valid then
surface = init_surface
end
end
if player.online_time < 1 then
if not players[player.index] then
@ -1506,6 +1509,8 @@ function Public.on_player_joined_game(event)
end
end
ICW_Func.is_minimap_valid(player, surface)
if player.online_time < 1 then
local pos = surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(surface), 3, 0)
if pos then

View File

@ -489,6 +489,7 @@ local map_gen_action_token = Task.register(map_gen_action)
-- @param event <table> the event table from on_chunk_generated
local function schedule_chunk(event)
local surface = event.surface
if surface.name == 'Init' then return end
local shape = generate_map
if event.tick < 1 then
@ -534,6 +535,7 @@ end
-- @param event <table> the event table from on_chunk_generated
local function force_do_chunk(event)
local surface = event.surface
if surface.name == 'Init' then return end
local shape = generate_map
if not surface.valid then
@ -584,6 +586,10 @@ local function on_chunk(event)
if final_battle then
return
end
-- local current_task = Public.get('current_task')
-- if not current_task or not current_task.done then
-- return
-- end
local force_chunk = Public.get('force_chunk')
local stop_chunk = Public.get('stop_chunk')

View File

@ -122,6 +122,10 @@ local reconstruct_all_trains =
end
)
-- local ICW = require 'maps.mountain_fortress_v3.icw.functions'
-- local icw_table = require 'maps.mountain_fortress_v3.icw.table'.get()
-- ICW.reconstruct_all_trains(icw_table)
local remove_non_migrated_doors_token =
Task.register(
function (data)

View File

@ -551,6 +551,8 @@ local function on_player_changed_surface(event)
return
end
if not Public.is_task_done() then return end
local active_surface = Public.get('active_surface_index')
local surface = game.surfaces[active_surface]
if not surface or not surface.valid then

View File

@ -1519,6 +1519,10 @@ local function gui_closed(event)
return
end
if not Public.is_task_done() then
return
end
local type = event.gui_type
if type == defines.gui_type.custom then

View File

@ -8,6 +8,7 @@ local required_playtime = 5184000 -- 24 hours
local valid_groups = {
['default'] = true,
['limited'] = true,
['init_island'] = true,
['main_surface'] = true,
['near_locomotive'] = true,
['not_trusted'] = true
@ -18,15 +19,18 @@ function Public.add_player_to_permission_group(player, group, forced)
local session = Session.get_session_table()
local AG = Antigrief.get()
if not AG then
log('Antigrief not found.')
return
end
local default_group = game.permissions.get_group('Default')
if not default_group then
log('Default group not found.')
return
end
if not valid_groups[string.lower(player.permission_group.name)] then
log('Invalid group.')
return
end
@ -57,6 +61,29 @@ function Public.add_player_to_permission_group(player, group, forced)
end
end
if not game.permissions.get_group('init_island') then
local init_island = game.permissions.create_group('init_island')
if not init_island then
return
end
init_island.set_allows_action(defines.input_action.cancel_craft, false)
init_island.set_allows_action(defines.input_action.drop_item, false)
init_island.set_allows_action(defines.input_action.gui_click, false)
init_island.set_allows_action(defines.input_action.deconstruct, false)
init_island.set_allows_action(defines.input_action.gui_checked_state_changed, false)
init_island.set_allows_action(defines.input_action.gui_click, false)
init_island.set_allows_action(defines.input_action.gui_confirmed, false)
init_island.set_allows_action(defines.input_action.gui_elem_changed, false)
init_island.set_allows_action(defines.input_action.gui_hover, false)
init_island.set_allows_action(defines.input_action.gui_leave, false)
init_island.set_allows_action(defines.input_action.gui_location_changed, false)
init_island.set_allows_action(defines.input_action.gui_selected_tab_changed, false)
init_island.set_allows_action(defines.input_action.gui_selection_state_changed, false)
init_island.set_allows_action(defines.input_action.gui_switch_state_changed, false)
init_island.set_allows_action(defines.input_action.gui_text_changed, false)
init_island.set_allows_action(defines.input_action.gui_value_changed, false)
end
if not game.permissions.get_group('near_locomotive') then
local near_locomotive_group = game.permissions.create_group('near_locomotive')
if not near_locomotive_group then
@ -115,11 +142,7 @@ function Public.add_player_to_permission_group(player, group, forced)
if not AG.enabled then
default_group.add_player(player)
return
end
if forced then
default_group.add_player(player)
log('Antigrief is not enabled. Default group added to player.')
return
end
@ -177,9 +200,10 @@ function Public.add_player_to_permission_group(player, group, forced)
end
end
if playtime < required_playtime then
if playtime < required_playtime and not forced then
local not_trusted = game.permissions.get_group('not_trusted')
if not not_trusted then
log('Not trusted group not found.')
return
end
@ -200,6 +224,13 @@ function Public.add_player_to_permission_group(player, group, forced)
end
main_surface_group_inner.add_player(player)
elseif group == 'init_island' then
local init_island = game.permissions.get_group('init_island')
if not init_island then
return
end
init_island.add_player(player)
elseif group == 'near_locomotive' then
local near_locomotive_group_inner = game.permissions.get_group('near_locomotive')
if not near_locomotive_group_inner then

View File

@ -44,31 +44,19 @@ local OfflinePlayers = require 'modules.clear_vacant_players'
local Beam = require 'modules.render_beam'
local Commands = require 'utils.commands'
-- Use these settings for live
local send_ping_to_channel = Discord.channel_names.mtn_channel
local role_to_mention = Discord.role_mentions.mtn_fortress
-- Use these settings for testing
-- bot-lounge
-- local send_ping_to_channel = Discord.channel_names.bot_quarters
-- local role_to_mention = Discord.role_mentions.test_role
local mapkeeper = '[color=blue]Mapkeeper:[/color]'
local floor = math.floor
local remove = table.remove
local abs = math.abs
local partial_reset
RPG.disable_cooldowns_on_spells()
Gui.mod_gui_button_enabled = true
Gui.button_style = 'mod_gui_button'
Gui.set_toggle_button(true)
Gui.set_mod_gui_top_frame(true)
local partial_reset_token =
Task.register(
function ()
partial_reset()
end
)
local collapse_kill = {
entities = {
['laser-turret'] = true,
@ -114,126 +102,27 @@ local is_position_near_tbl = function (position, tbl)
return status
end
local announce_new_map =
Task.register(
function ()
local server_name = Server.check_server_name(Public.discord_name)
if server_name then
Server.to_discord_named_raw(send_ping_to_channel, role_to_mention .. ' ** Mtn Fortress was just reset! **')
end
local function preinit_task()
local this = Public.get()
game.speed = 1
if this.health_text and this.health_text.valid then this.health_text.destroy() end
if this.caption and this.caption.valid then this.caption.destroy() end
if this.circle and this.circle.valid then this.circle.destroy() end
if this.current_season and this.current_season.valid then this.current_season.destroy() end
if this.counter and this.counter.valid then this.counter.destroy() end
if this.direction_attack and this.direction_attack.valid then this.direction_attack.destroy() end
if this.zone1_text1 and this.zone1_text1.valid then this.zone1_text1.destroy() end
if this.zone1_text2 and this.zone1_text2.valid then this.zone1_text2.destroy() end
if this.zone1_text3 and this.zone1_text3.valid then this.zone1_text3.destroy() end
for i = 1, 5 do
if this['direction_' .. i] and this['direction_' .. i].valid then
this['direction_' .. i].destroy()
end
)
partial_reset = function ()
local this = Public.get()
local surface = game.surfaces[this.active_surface_index]
if this.adjusted_zones.reversed then
Explosives.check_growth_below_void(false)
this.spawn_near_collapse.compare = abs(this.spawn_near_collapse.compare)
Collapse.set_position({ 0, -130 })
Collapse.set_direction('south')
Public.locomotive_spawn(surface, { x = -18, y = -25 }, this.adjusted_zones.reversed)
else
Explosives.check_growth_below_void(true)
this.spawn_near_collapse.compare = abs(this.spawn_near_collapse.compare) * -1
Collapse.set_position({ 0, 130 })
Collapse.set_direction('north')
Public.locomotive_spawn(surface, { x = -18, y = 25 }, this.adjusted_zones.reversed)
end
init_bonus_drill_force()
Public.init_enemy_weapon_damage()
game.forces.player.manual_mining_speed_modifier = 0
game.forces.player.set_ammo_damage_modifier('artillery-shell', -0.95)
game.forces.player.worker_robots_battery_modifier = 4
game.forces.player.worker_robots_storage_bonus = 15
Public.render_train_hp()
Public.render_direction(surface, this.adjusted_zones.reversed)
end
function Public.reset_map()
rendering.clear()
local this = Public.get()
this.active_surface_index = Public.create_surface()
game.forces.player.reset()
Public.reset_main_table()
Difficulty.show_gui(false)
local wave_defense_table = WD.get_table()
Misc.reset()
Misc.bottom_button(true)
LinkedChests.reset()
Public.stateful.clear_all_frames()
Autostash.insert_into_furnace(true)
Autostash.insert_into_wagon(true)
Autostash.bottom_button(true)
BottomFrame.reset()
BottomFrame.activate_custom_buttons(true)
Public.reset_buried_biters()
Poll.reset()
ICW.reset()
IC.reset()
IC.allowed_surface(game.surfaces[this.active_surface_index].name)
Public.reset_func_table()
game.reset_time_played()
OfflinePlayers.init(this.active_surface_index)
OfflinePlayers.set_enabled(true)
-- OfflinePlayers.set_offline_players_surface_removal(true)
Group.reset_groups()
Group.alphanumeric_only(false)
Public.disable_tech()
local surface = game.surfaces[this.active_surface_index]
if this.winter_mode then
surface.daytime = 0.45
end
-- surface.brightness_visual_weights = {0.7, 0.7, 0.7}
JailData.set_valid_surface(tostring(surface.name))
JailData.reset_vote_table()
Explosives.set_surface_whitelist({ [surface.name] = true })
Explosives.disable(false)
Explosives.slow_explode(true)
Beam.reset_valid_targets()
BiterHealthBooster.set_active_surface(tostring(surface.name))
BiterHealthBooster.acid_nova(true)
BiterHealthBooster.check_on_entity_died(true)
BiterHealthBooster.boss_spawns_projectiles(true)
BiterHealthBooster.enable_boss_loot(false)
BiterHealthBooster.enable_randomize_stun_and_slowdown_sticker(true)
-- AntiGrief.whitelist_types('tree', true)
AntiGrief.enable_capsule_warning(false)
AntiGrief.enable_capsule_cursor_warning(false)
AntiGrief.enable_jail(true)
AntiGrief.damage_entity_threshold(20)
AntiGrief.decon_surface_blacklist(surface.name)
AntiGrief.filtered_types_on_decon({ 'tree', 'simple-entity', 'fish' })
AntiGrief.set_limit_per_table(2000)
PL.show_roles_in_list(true)
PL.rpg_enabled(true)
Score.reset_tbl()
WD.set('game_lost', true)
local players = game.connected_players
for i = 1, #players do
@ -245,132 +134,19 @@ function Public.reset_map()
if player.gui.left['mvps'] then
player.gui.left['mvps'].destroy()
end
WD.destroy_wave_gui(player)
ICMinimap.kill_minimap(player)
Event.raise(Public.events.reset_map, { player_index = player.index })
end
Difficulty.reset_difficulty_poll({ closing_timeout = game.tick + 36000 })
Difficulty.set_gui_width(20)
Collapse.set_kill_entities(false)
Collapse.set_kill_specific_entities(collapse_kill)
Collapse.set_speed(8)
Collapse.set_amount(1)
-- Collapse.set_max_line_size(zone_settings.zone_width)
Collapse.set_max_line_size(540, true)
Collapse.set_surface_index(surface.index)
Collapse.start_now(false)
RPG.reset_table()
Public.stateful.enable(true)
Public.stateful.reset_stateful(true, true)
Public.stateful.increase_enemy_damage_and_health()
Public.stateful.apply_startup_settings()
this.locomotive_health = 10000
this.locomotive_max_health = 10000
WD.reset_wave_defense()
wave_defense_table.surface_index = this.active_surface_index
wave_defense_table.target = this.locomotive
wave_defense_table.nest_building_density = 32
wave_defense_table.game_lost = false
wave_defense_table.spawn_position = { x = 0, y = 84 }
WD.alert_boss_wave(true)
WD.enable_side_target(false)
WD.remove_entities(true)
WD.enable_threat_log(false) -- creates waaaay to many entries in the global table
WD.check_collapse_position(true)
WD.set_disable_threat_below_zero(true)
WD.increase_boss_health_per_wave(true)
WD.increase_damage_per_wave(true)
WD.increase_health_per_wave(true)
WD.increase_average_unit_group_size(true)
WD.increase_max_active_unit_groups(true)
WD.enable_random_spawn_positions(true)
WD.set_track_bosses_only(true)
WD.set_pause_waves_custom_callback(Public.pause_waves_custom_callback_token)
WD.set_threat_event_custom_callback(Public.check_if_spawning_near_train_custom_callback)
-- WD.set_es_unit_limit(400) -- moved to stateful
Event.raise(WD.events.on_game_reset, {})
Public.set_difficulty()
Public.disable_creative()
Public.boost_difficulty()
Commands.restore_states()
if this.adjusted_zones.reversed then
if not surface.is_chunk_generated({ x = -20, y = -22 }) then
surface.request_to_generate_chunks({ x = -20, y = -22 }, 1)
surface.force_generate_chunk_requests()
end
game.forces.player.set_spawn_position({ x = -27, y = -25 }, surface)
WD.set_spawn_position({ x = -16, y = -80 })
WD.enable_inverted(true)
else
if not surface.is_chunk_generated({ x = -20, y = 22 }) then
surface.request_to_generate_chunks({ x = -20, y = 22 }, 1)
surface.force_generate_chunk_requests()
end
game.forces.player.set_spawn_position({ x = -27, y = 25 }, surface)
WD.set_spawn_position({ x = -16, y = 80 })
WD.enable_inverted(false)
Public.add_player_to_permission_group(player, 'init_island', true)
player.print(mapkeeper .. ' Map is resetting, please wait a moment. All GUI buttons are disabled at the moment.')
end
Public.sr_reset_forces()
Public.sr_teleport_players()
game.speed = 1
if this.space_age then
surface.destroy_decoratives({ name = "brown-cup", invert = true })
surface.destroy_decoratives({ name = "small-sand-rock", invert = true })
end
Task.set_queue_speed(16)
Public.get_scores()
this.chunk_load_tick = game.tick + 400
this.force_chunk = true
this.market_announce = game.tick + 1200
this.game_lost = false
RPG.rpg_reset_all_players()
RPG.set_surface_name({ game.surfaces[this.active_surface_index].name })
RPG.enable_health_and_mana_bars(true)
RPG.enable_wave_defense(true)
RPG.enable_mana(true)
RPG.personal_tax_rate(0.4)
RPG.enable_stone_path(true)
RPG.enable_aoe_punch(true)
RPG.enable_aoe_punch_globally(false)
RPG.enable_range_buffs(true)
RPG.enable_auto_allocate(true)
RPG.enable_explosive_bullets_globally(true)
RPG.enable_explosive_bullets(false)
RPG_Progression.toggle_module(false)
RPG_Progression.set_dataset('mtn_v3_rpg_prestige')
if Public.get('prestige_system_enabled') then
RPG_Progression.restore_xp_on_reset()
end
if _DEBUG then
Collapse.start_now(false)
WD.disable_spawning_biters(true)
end
if not this.disable_startup_notification then
Task.set_timeout_in_ticks(25, announce_new_map)
end
Public.equip_players(nil, false)
Task.set_timeout_in_ticks(100, partial_reset_token, {})
WD.set('wave_interval', 4500)
end
local is_locomotive_valid = function ()
local locomotive = Public.get('locomotive')
if game.ticks_played < 1000 then return end
@ -418,7 +194,7 @@ local has_the_game_ended = function ()
if this.soft_reset and this.game_reset_tick == 0 then
this.game_reset_tick = nil
Public.set_scores()
Public.reset_map()
Public.set_task('move_players', 'Init')
return
end
@ -587,6 +363,29 @@ local handle_changes = function ()
print('Received new changes from backend.')
end
local scenario_manager = function ()
local current_task = Public.get('current_task')
if not current_task then return end
if current_task.delay then
if game.tick < current_task.delay then
return
end
end
if Public[current_task.state] then
local old_task = current_task.state
current_task.state = 'idle'
current_task.step = current_task.step + 1
Public[old_task](current_task)
if current_task.message and current_task.show_messages then
game.print(mapkeeper .. ' ' .. current_task.message)
else
game.print(mapkeeper .. ' Generating map... Current task: ' .. current_task.step)
end
end
end
local nth_40_tick = function ()
if game.tick < 30 then return end
local update_gui = Public.update_gui
@ -616,15 +415,351 @@ local nth_1000_tick = function ()
Public.is_creativity_mode_on()
end
function Public.create_locomotive(current_task)
if Public.get('disable_startup_notification') then return end
local adjusted_zones = Public.get('adjusted_zones')
local spawn_near_collapse = Public.get('spawn_near_collapse')
local surface_index = Public.get('active_surface_index')
local surface = game.surfaces[surface_index]
if not surface or not surface.valid then return end
if adjusted_zones.reversed then
Explosives.check_growth_below_void(false)
spawn_near_collapse.compare = abs(spawn_near_collapse.compare)
Collapse.set_position({ 0, -130 })
Collapse.set_direction('south')
Public.locomotive_spawn(surface, { x = -18, y = -25 }, adjusted_zones.reversed)
else
Explosives.check_growth_below_void(true)
spawn_near_collapse.compare = abs(spawn_near_collapse.compare) * -1
Collapse.set_position({ 0, 130 })
Collapse.set_direction('north')
Public.locomotive_spawn(surface, { x = -18, y = 25 }, adjusted_zones.reversed)
end
Public.render_train_hp()
Public.render_direction(surface, adjusted_zones.reversed)
current_task.message = 'Created locomotive!'
current_task.delay = game.tick + 60
current_task.state = 'announce_new_map'
end
function Public.announce_new_map(current_task)
if Public.get('disable_startup_notification') then return end
local server_name = Server.check_server_name(Public.discord_name)
if server_name then
Server.to_discord_named_raw(send_ping_to_channel, role_to_mention .. ' ** Mtn Fortress was just reset! **')
end
current_task.message = 'Announced new map!'
current_task.state = 'move_players_to_nauvis'
current_task.surface_name = 'nauvis'
current_task.delay = game.tick + 200
current_task.done = true
end
function Public.move_players(current_task)
local surface = game.get_surface(current_task.surface_name)
if not surface or not surface.valid then
return
end
current_task.done = nil
current_task.step = 1
preinit_task()
for _, player in pairs(game.players) do
local pos = surface.find_non_colliding_position("character", { x = 0, y = 0 }, 3, 0)
if pos then
player.teleport(pos, surface)
else
player.teleport({ x = 0, y = 0 }, surface)
end
end
current_task.message = 'Moved players to initial surface!'
current_task.delay = game.tick + 200
current_task.state = 'init_stateful'
end
function Public.move_players_to_nauvis(current_task)
local surface = game.get_surface(current_task.surface_name)
if not surface or not surface.valid then
return
end
local adjusted_zones = Public.get('adjusted_zones')
local position
WD.set('game_lost', false)
if adjusted_zones.reversed then
game.forces.player.set_spawn_position({ -27, -25 }, surface)
position = game.forces.player.get_spawn_position(surface)
if not position then
game.forces.player.set_spawn_position({ -27, -25 }, surface)
position = game.forces.player.get_spawn_position(surface)
end
else
game.forces.player.set_spawn_position({ -27, 25 }, surface)
position = game.forces.player.get_spawn_position(surface)
if not position then
game.forces.player.set_spawn_position({ -27, 25 }, surface)
position = game.forces.player.get_spawn_position(surface)
end
end
for _, player in pairs(game.connected_players) do
Public.add_player_to_permission_group(player, 'near_locomotive', true)
local pos = surface.find_non_colliding_position('character', position, 3, 0)
if pos then
player.teleport({ x = pos.x, y = pos.y }, surface)
else
player.teleport({ x = position.x, y = position.y }, surface)
end
end
current_task.message = 'Moved players back to nauvis!'
if current_task.done then
return
end
current_task.state = 'clear_nauvis'
end
function Public.init_stateful(current_task)
Public.reset_main_table()
Public.stateful.enable(true)
Public.stateful.reset_stateful(false, true)
Public.stateful.increase_enemy_damage_and_health()
Public.stateful.apply_startup_settings()
current_task.message = 'Initialized stateful!'
current_task.state = 'clear_nauvis'
end
function Public.create_custom_nauvis_surface(current_task)
local nauvis = game.surfaces['nauvis']
if nauvis then
nauvis.clear()
end
Public.set('active_surface_index', Public.create_surface())
current_task.message = 'Created custom nauvis surface!'
current_task.delay = game.tick + 300
current_task.state = 'reset_map'
end
function Public.clear_nauvis(current_task)
local surface = game.surfaces['nauvis']
surface.clear()
surface.request_to_generate_chunks({ x = -20, y = -22 }, 1)
surface.force_generate_chunk_requests()
current_task.state = 'create_custom_nauvis_surface'
current_task.delay = game.tick + 50
current_task.message = 'Cleared nauvis!'
end
function Public.reset_map(current_task)
local this = Public.get()
Difficulty.show_gui(false)
local wave_defense_table = WD.get_table()
Misc.reset()
LinkedChests.reset()
Public.stateful.clear_all_frames()
BottomFrame.reset()
Public.reset_buried_biters()
Poll.reset()
ICW.reset()
IC.reset()
IC.allowed_surface(game.surfaces[this.active_surface_index].name)
Public.reset_func_table()
game.reset_time_played()
OfflinePlayers.init(this.active_surface_index)
OfflinePlayers.set_enabled(true)
-- OfflinePlayers.set_offline_players_surface_removal(true)
Group.reset_groups()
Group.alphanumeric_only(false)
Public.disable_tech()
local surface = game.surfaces[this.active_surface_index]
if this.winter_mode then
surface.daytime = 0.45
end
-- surface.brightness_visual_weights = {0.7, 0.7, 0.7}
JailData.set_valid_surface(tostring(surface.name))
JailData.reset_vote_table()
Explosives.set_surface_whitelist({ [surface.name] = true })
Beam.reset_valid_targets()
BiterHealthBooster.set_active_surface(tostring(surface.name))
-- AntiGrief.whitelist_types('tree', true)
AntiGrief.decon_surface_blacklist(surface.name)
Score.reset_tbl()
Difficulty.reset_difficulty_poll({ closing_timeout = game.tick + 36000 })
Collapse.set_max_line_size(540, true)
Collapse.set_speed(8)
Collapse.set_amount(1)
Collapse.set_surface_index(surface.index)
Collapse.start_now(false)
RPG.reset_table()
init_bonus_drill_force()
Public.init_enemy_weapon_damage()
game.forces.player.manual_mining_speed_modifier = 0
game.forces.player.set_ammo_damage_modifier('artillery-shell', -0.95)
game.forces.player.worker_robots_battery_modifier = 4
game.forces.player.worker_robots_storage_bonus = 15
WD.reset_wave_defense()
wave_defense_table.surface_index = this.active_surface_index
wave_defense_table.target = this.locomotive
wave_defense_table.nest_building_density = 32
wave_defense_table.game_lost = false
wave_defense_table.spawn_position = { x = 0, y = 84 }
-- WD.set_es_unit_limit(400) -- moved to stateful
Event.raise(WD.events.on_game_reset, {})
Public.set_difficulty()
Public.disable_creative()
Public.boost_difficulty()
Commands.restore_states()
if this.adjusted_zones.reversed then
if not surface.is_chunk_generated({ x = -20, y = -22 }) then
surface.request_to_generate_chunks({ x = -20, y = -22 }, 1)
surface.force_generate_chunk_requests()
end
game.forces.player.set_spawn_position({ x = -27, y = -25 }, surface)
WD.set_spawn_position({ x = -16, y = -80 })
WD.enable_inverted(true)
else
if not surface.is_chunk_generated({ x = -20, y = 22 }) then
surface.request_to_generate_chunks({ x = -20, y = 22 }, 1)
surface.force_generate_chunk_requests()
end
game.forces.player.set_spawn_position({ x = -27, y = 25 }, surface)
WD.set_spawn_position({ x = -16, y = 80 })
WD.enable_inverted(false)
end
if this.space_age then
surface.destroy_decoratives({ name = "brown-cup", invert = true })
surface.destroy_decoratives({ name = "small-sand-rock", invert = true })
end
Task.set_queue_speed(16)
Public.get_scores()
this.chunk_load_tick = game.tick + 400
this.force_chunk = true
this.market_announce = game.tick + 1200
this.game_lost = false
RPG.enable_health_and_mana_bars(true)
RPG.enable_wave_defense(true)
RPG.enable_mana(true)
RPG.personal_tax_rate(0.4)
RPG.enable_stone_path(true)
RPG.enable_aoe_punch(true)
RPG.enable_aoe_punch_globally(false)
RPG.enable_range_buffs(true)
RPG.enable_auto_allocate(true)
RPG.enable_explosive_bullets_globally(true)
RPG.enable_explosive_bullets(false)
RPG.rpg_reset_all_players()
RPG.set_surface_name({ game.surfaces[this.active_surface_index].name })
if _DEBUG then
Collapse.start_now(false)
WD.disable_spawning_biters(true)
end
Public.equip_players(nil, false)
current_task.message = 'Reset map done!'
current_task.delay = game.tick + 60
current_task.state = 'create_locomotive'
end
function Public.init_mtn()
Public.reset_map()
Misc.bottom_button(true)
BottomFrame.activate_custom_buttons(true)
Autostash.bottom_button(true)
Autostash.insert_into_furnace(true)
Autostash.insert_into_wagon(true)
Difficulty.set_gui_width(20)
RPG_Progression.toggle_module(false)
RPG_Progression.set_dataset('mtn_v3_rpg_prestige')
if Public.get('prestige_system_enabled') then
RPG_Progression.restore_xp_on_reset()
end
WD.alert_boss_wave(true)
WD.enable_side_target(false)
WD.remove_entities(true)
WD.enable_threat_log(false) -- creates waaaay to many entries in the global table
WD.check_collapse_position(true)
WD.set_disable_threat_below_zero(true)
WD.increase_boss_health_per_wave(true)
WD.increase_damage_per_wave(true)
WD.increase_health_per_wave(true)
WD.increase_average_unit_group_size(true)
WD.increase_max_active_unit_groups(true)
WD.enable_random_spawn_positions(true)
WD.set_track_bosses_only(true)
WD.set_pause_waves_custom_callback(Public.pause_waves_custom_callback_token)
WD.set_threat_event_custom_callback(Public.check_if_spawning_near_train_custom_callback)
Explosives.disable(false)
Explosives.slow_explode(true)
BiterHealthBooster.acid_nova(true)
BiterHealthBooster.check_on_entity_died(true)
BiterHealthBooster.boss_spawns_projectiles(true)
BiterHealthBooster.enable_boss_loot(false)
BiterHealthBooster.enable_randomize_stun_and_slowdown_sticker(true)
AntiGrief.enable_capsule_warning(false)
AntiGrief.enable_capsule_cursor_warning(false)
AntiGrief.enable_jail(true)
AntiGrief.damage_entity_threshold(20)
AntiGrief.filtered_types_on_decon({ 'tree', 'simple-entity', 'fish' })
AntiGrief.set_limit_per_table(2000)
PL.show_roles_in_list(true)
PL.rpg_enabled(true)
Collapse.set_kill_entities(false)
Collapse.set_kill_specific_entities(collapse_kill)
Public.create_landing_surface()
local tooltip = {
[1] = ({ 'main.diff_tooltip', '500', '50%', '15%', '15%', '1', '12', '50', '10000', '100%', '15', '10' }),
[2] = ({ 'main.diff_tooltip', '300', '25%', '10%', '10%', '2', '10', '50', '7000', '75%', '8', '8' }),
[3] = ({ 'main.diff_tooltip', '50', '0%', '0%', '0%', '4', '3', '10', '5000', '50%', '5', '6' })
}
Difficulty.set_tooltip(tooltip)
local T = Map.Pop_info()
@ -658,26 +793,10 @@ Server.on_scenario_changed(
end
)
Event.add(defines.events.on_tick, scenario_manager)
Event.on_nth_tick(40, nth_40_tick)
Event.on_nth_tick(250, nth_250_tick)
Event.on_nth_tick(1000, nth_1000_tick)
Event.add(
defines.events.on_player_created,
function (event)
if event.player_index == 1 then
if not game.is_multiplayer() then
Public.init_mtn()
end
end
end
)
Event.on_init(function ()
local nauvis = game.surfaces.nauvis
nauvis.clear(true)
nauvis.request_to_generate_chunks({ 0, 0 }, 3)
nauvis.force_generate_chunk_requests()
end)
Event.on_init(Public.init_mtn)
return Public

View File

@ -818,6 +818,8 @@ main_frame = function (player)
end
local function update_data()
if not Public.is_task_done() then return end
local players = game.connected_players
local stateful = Public.get_stateful()
local breached_wall = Public.get('breached_wall')
@ -1000,6 +1002,8 @@ local function update_raw()
return
end
if not Public.is_task_done() then return end
local stateful = Public.get_stateful()
if not stateful or not stateful.objectives then
return

View File

@ -1361,7 +1361,6 @@ local apply_settings_token =
this.objectives = {}
Public.reset_stateful()
Public.increase_enemy_damage_and_health()
Public.init_mtn()
end
@ -1679,9 +1678,6 @@ function Public.reset_stateful(refresh_gui, clear_buffs)
end
this.objectives = t
Public.reset_main_table()
clear_all_stats()
apply_buffs()

View File

@ -68,6 +68,72 @@ function Public.create_surface()
return this.active_surface_index
end
function Public.create_landing_surface()
local map_gen_settings = {
autoplace_controls = {
['coal'] = { frequency = 25, size = 3, richness = 3 },
['stone'] = { frequency = 25, size = 3, richness = 3 },
['copper-ore'] = { frequency = 25, size = 3, richness = 3 },
['iron-ore'] = { frequency = 35, size = 3, richness = 3 },
['uranium-ore'] = { frequency = 25, size = 3, richness = 3 },
['crude-oil'] = { frequency = 80, size = 3, richness = 1 },
['trees'] = { frequency = 0.75, size = 3, richness = 0.1 },
['enemy-base'] = { frequency = 15, size = 0, richness = 1 }
},
cliff_settings = { cliff_elevation_0 = 1024, cliff_elevation_interval = 10, name = 'cliff' },
height = 64,
width = 256,
peaceful_mode = false,
seed = 1337,
starting_area = 'very-low',
starting_points = { { x = 0, y = 0 } },
terrain_segmentation = 'normal',
water = 'normal'
}
local surface
if not this.landing_surface_index then
surface = game.create_surface('Init', map_gen_settings)
end
this.landing_surface_index = surface.index
surface.always_day = true
surface.request_to_generate_chunks({ 0, 0 }, 1)
surface.force_generate_chunk_requests()
local walls = {}
local tiles = {}
local area = { left_top = { x = -128, y = -32 }, right_bottom = { x = 128, y = 32 } }
for x = area.left_top.x, area.right_bottom.x, 1 do
for y = area.left_top.y, area.right_bottom.y, 1 do
tiles[#tiles + 1] = { name = 'black-refined-concrete', position = { x = x, y = y } }
if x == area.left_top.x or x == area.right_bottom.x or y == area.left_top.y or y == area.right_bottom.y then
walls[#walls + 1] = { name = 'stone-wall', force = 'neutral', position = { x = x, y = y } }
end
end
end
surface.set_tiles(tiles)
for _, entity in pairs(walls) do
local e = surface.create_entity(entity)
e.destructible = false
e.minable = false
end
rendering.draw_text {
text = '♦ Landing zone ♦',
surface = surface,
target = { 0, -50 },
color = { r = 0.98, g = 0.66, b = 0.22 },
scale = 10,
font = 'heading-1',
alignment = 'center',
scale_with_zoom = false
}
return this.landing_surface_index
end
--- Returns the surface index.
function Public.get_active_surface()
return this.active_surface

View File

@ -17,6 +17,14 @@ local this = {
operation = nil,
next_operation = nil
},
-- new initializer for scenario management because the old one sucked hard
current_task = {
state = 'move_players',
surface_name = 'Init',
default_task = 'move_players',
show_messages = true,
step = 1
},
adjusted_zones = {
scrap = {},
forest = {},
@ -42,6 +50,8 @@ Public.events = {
on_locomotive_cargo_missing = Event.generate_event_name('on_locomotive_cargo_missing'),
}
local init_name = 'Init'
Public.init_name = init_name
local scenario_name = 'nauvis'
Public.scenario_name = scenario_name
local discord_name = 'Mtn Fortress'
@ -136,7 +146,7 @@ Public.pickaxe_upgrades = {
function Public.reset_main_table()
-- @start
this.space_age = has_space_age()
this.space_age = script.active_mods['space-age'] or false
-- these 3 are in case of stop/start/reloading the instance.
this.soft_reset = true
this.restart = false
@ -401,6 +411,19 @@ function Public.set_stateful_settings(key, value)
Public.save_stateful_settings()
end
function Public.set_task(task, surface_name)
this.current_task.state = task
this.current_task.surface_name = surface_name or 'Init'
end
function Public.is_task_done()
return this.current_task and this.current_task.done or false
end
function Public.set_show_messages(state)
this.current_task.show_messages = state or false
end
function Public.remove(key, sub_key)
if key and sub_key then
if this[key] and this[key][sub_key] then

View File

@ -641,7 +641,7 @@ local function auto_stash(player, event)
end
end
local furnaceList = {
local furnace_list = {
['coal'] = 0,
['iron-ore'] = 0,
['copper-ore'] = 0,
@ -659,7 +659,7 @@ local function auto_stash(player, event)
if ctrl and this.insert_into_furnace then
if button == defines.mouse_button_type.right then
if is_resource then
furnaceList[name] = (furnaceList[name] or 0) + inventory[i].count
furnace_list[name] = (furnace_list[name] or 0) + inventory[i].count
end
end
elseif shift and this.insert_into_wagon then -- insert into wagon
@ -684,7 +684,7 @@ local function auto_stash(player, event)
end
::continue::
end
for furnaceName, furnaceCount in pairs(furnaceList) do
for furnaceName, furnaceCount in pairs(furnace_list) do
insert_to_furnace(inventory, chests, furnaceName, furnaceCount, floaty_text_list)
end

View File

@ -87,12 +87,16 @@ local function get_threat_gain()
return gain
end
function Public.destroy_wave_gui(player)
if get_top_frame_custom(player, 'wave_defense') and get_top_frame_custom(player, 'wave_defense').valid then
get_top_frame_custom(player, 'wave_defense').destroy()
end
end
function Public.update_gui(player)
local final_battle = Public.get('final_battle')
if final_battle then
if get_top_frame_custom(player, 'wave_defense') and get_top_frame_custom(player, 'wave_defense').valid then
get_top_frame_custom(player, 'wave_defense').destroy()
end
Public.destroy_wave_gui(player)
return
end

View File

@ -574,14 +574,20 @@ end
Public.new('get', 'Hover over an object to get its name.')
:require_admin()
:add_parameter('die', true, 'string')
:add_alias('entity')
:callback(
function (player)
function (player, action)
local entity = player.selected
if not entity or not entity.valid then
return false
end
if action and action == 'die' then
entity.die()
return true
end
player.print('[color=orange]Name:[/color] ' .. entity.name)
player.print('[color=orange]Type:[/color] ' .. entity.type)
player.print('[color=orange]Force:[/color] ' .. entity.force.name)

View File

@ -502,6 +502,7 @@ function Public.reset()
end
function Public.bottom_button(value)
print('Setting bottom button.')
this.bottom_button = value or false
end
@ -512,6 +513,8 @@ Event.add(
return
end
print('Player joined game.')
local player = game.players[event.player_index]
on_player_joined_game(player)
create_clear_corpse_frame(player)

View File

@ -305,7 +305,7 @@ local function create_gulag_surface()
surface = game.create_surface('Gulag', { width = 40, height = 40 })
end
surface.always_day = true
surface.request_to_generate_chunks({ 0, 0 }, 9)
surface.request_to_generate_chunks({ 0, 0 }, 1)
surface.force_generate_chunk_requests()
local area = { left_top = { x = -128, y = -32 }, right_bottom = { x = 128, y = 32 } }
for x = area.left_top.x, area.right_bottom.x, 1 do

View File

@ -89,5 +89,4 @@ function has_space_age()
return false
end
return ServerCommands