1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-04 00:15:45 +02:00

New private runs

Changes:
- Players now can create private runs protected by a password. This run becomes public if the crew is empty or inactive for 24 horus (Limit is currently 1 private run at a time).
This commit is contained in:
Piratux 2022-10-10 20:21:14 +03:00
parent 93636fd1c3
commit f72a577b7d
14 changed files with 218 additions and 10 deletions

View File

@ -105,6 +105,8 @@ victory_continue_reminder=If you wish to continue the game, click up top.
crew_disband_tick_message=The crew will disband in 20 seconds.
private_run_lock_expired=Private lock of __1__ run has expired. Anyone can join this crew now.
plank=__1__ planked __2__!
plank_error_invalid_player=Command error: Player is not a crewmember.
plank_error_self=Command error: Can't plank yourself.
@ -354,6 +356,7 @@ crew_leave=__1__ left the crew.
crew_launch=[__1__] Launched.
crew_disband=[__1__] Disbanded after __2__.
proposal_propose=__1__ proposed the run __2__ [Capacity __3__].
proposal_propose_private=__1__ proposed the private run __2__ [Capacity __3__].
proposal_retracted=Proposal __1__ retracted.
proposal_abandoned=Proposal __1__ abandoned.
@ -510,6 +513,17 @@ gui_runs_proposal_maker_capacity=Capacity
gui_runs_proposal_maker_capacity_disabled=This capacity setting isn't available at the moment.
gui_runs_proposal_maker_propose=Propose
gui_runs_proposal_maker_no_limit=No limit
gui_runs_proposal_maker_private=Private
gui_runs_proposal_maker_private_tooltip=Sets your run to private, which protects the run by password.\nOnce the run has launched, only people who know password will be able to join the crew.\nPrivate run becomes public if the crew is empty or inactive for __1__ hours.
gui_runs_proposal_maker_password=Password
gui_runs_proposal_maker_confirm_password=Confirm Password
gui_runs_proposal_maker_error_private_run_limit=All private run slots are occupied. Wait until private run slots free up to create your own.
gui_runs_proposal_maker_error_private_run_password_no_match=Passwords do not match.
gui_runs_proposal_maker_error_private_run_password_empty=Passwords can't be empty.
gui_join_private_run_info=This run is private and protected.\nPlease enter a password to join the crew.\nThis run will become public in __1__:__2__:__3__
gui_join_private_run_error_wrong_password=The password you've entered is incorrect.
gui_runs_launch=Launch run
gui_runs_launch_error_1=Gather endorsements from more pirates.

View File

@ -1384,7 +1384,7 @@ local function event_on_player_joined_game(event)
local ages = {}
for _, memory in pairs(global_memory.crew_memories) do
if Common.is_id_valid(memory.id)
and memory.crewstatus
and (not memory.run_is_private)
and memory.crewstatus == Crew.enum.ADVENTURING
and memory.capacity
and memory.crewplayerindices

View File

@ -1623,4 +1623,22 @@ function Public.revealed_buried_treasure_distance_check()
end
end
function Public.update_private_run_lock_timer(tickinterval)
local memory = Memory.get_crew_memory()
if memory.run_is_private then
if Common.activecrewcount() <= 0 then
if memory.private_run_lock_timer > 0 then
memory.private_run_lock_timer = memory.private_run_lock_timer - tickinterval
if memory.private_run_lock_timer <= 0 then
Common.notify_game({'pirates.private_run_lock_expired', memory.name})
memory.run_is_private = false
end
end
else
memory.private_run_lock_timer = 60 * 60 * 60 * CoreData.private_run_lock_amount_hr
end
end
end
return Public

View File

@ -19,6 +19,7 @@ local Public = {}
-- Public.active_crews_cap = 1
Public.activeCrewsCap = 2
Public.private_run_cap = 1
Public.minimumCapacitySliderValue = 1
Public.minimum_run_capacity_to_enforce_space_for = 22
-- auto-disbanding when there are no players left in the crew:

View File

@ -20,6 +20,8 @@ Public.total_max_biters = 2000
Public.lobby_surface_name = '000-000-Lobby'
Public.private_run_lock_amount_hr = 24 -- how many hours need to pass, when crew is empty or inactive, until private run becomes public
Public.colors = {
coal = {r=0.5, g=0.5, b=0.5},
wood = {r=204, g=158, b=67},

View File

@ -720,6 +720,9 @@ function Public.initialise_crew(accepted_proposal)
memory.difficulty = CoreData.difficulty_options[accepted_proposal.difficulty_option].value
memory.capacity = CoreData.capacity_options[accepted_proposal.capacity_option].value
-- memory.mode = CoreData.mode_options[accepted_proposal.mode_option].value
memory.run_is_private = accepted_proposal.run_is_private
memory.private_run_password = accepted_proposal.private_run_password
memory.private_run_lock_timer = 60 * 60 * 60 * CoreData.private_run_lock_amount_hr
memory.destinationsvisited_indices = {}
memory.stored_fuel = Balance.starting_fuel

View File

@ -235,6 +235,9 @@ end
function Public.click(event)
if not event.element then return end
if not event.element.valid then return end
local player = game.players[event.element.player_index]
if not player.gui.screen[window_name .. '_piratewindow'] then return end

View File

@ -403,6 +403,9 @@ end
function Public.click(event)
-- This is only needed since we call click on every single GUI element and if element gets destroyed, it's no good (these checks wouldn't be needed (I think) if GUI was purely event driven)
if not event.element then return end
if not event.element.valid then return end
local player = game.players[event.element.player_index]

View File

@ -175,6 +175,8 @@ end
function Public.click(event)
if not event.element then return end
if not event.element.valid then return end
local player = game.players[event.element.player_index]

View File

@ -186,6 +186,8 @@ end
function Public.click(event)
if not event.element then return end
if not event.element.valid then return end
local player = game.players[event.element.player_index]
-- local name = 'info'

View File

@ -149,6 +149,8 @@ end
function Public.click(event)
if not event.element then return end
if not event.element.valid then return end
local player = game.players[event.element.player_index]

View File

@ -191,6 +191,25 @@ function Public.toggle_window(player)
flow3.style.margin = 2
flow3.style.horizontally_stretchable = true
flow3 = flow2.add({
name = 'join_crew_info',
type = 'label',
caption = {'pirates.gui_join_private_run_info', 0, 0, 0},
visible = false,
})
flow3.style.single_line = false
flow3 = flow2.add({
name = 'password_namefield',
type = 'textfield',
text = '',
visible = false,
})
flow3.style.width = 150
flow3.style.height = 24
flow3.style.top_margin = -3
flow3.style.bottom_margin = 3
flow3 = flow2.add({
name = 'flow_buttons',
type = 'flow',
@ -314,6 +333,52 @@ function Public.toggle_window(player)
flow5.style.top_margin = -3
flow5.style.bottom_margin = 3
-- PRIVATE RUN ELEMENTS --
flow5 = flow4.add({
name = 'private_checkbox',
type = 'checkbox',
caption = {'pirates.gui_runs_proposal_maker_private'},
state = false,
tooltip = {'pirates.gui_runs_proposal_maker_private_tooltip', CoreData.private_run_lock_amount_hr}
})
flow5 = flow4.add({
name = 'password_label',
type = 'label',
caption = {'pirates.gui_runs_proposal_maker_password'},
})
flow5.style.font = 'heading-3'
flow5 = flow4.add({
name = 'password_namefield',
type = 'textfield',
text = '',
})
flow5.style.width = 150
flow5.style.height = 24
flow5.style.top_margin = -3
flow5.style.bottom_margin = 3
flow5 = flow4.add({
name = 'confirm_password_label',
type = 'label',
caption = {'pirates.gui_runs_proposal_maker_confirm_password'},
})
flow5.style.font = 'heading-3'
flow5 = flow4.add({
name = 'confirm_password_namefield',
type = 'textfield',
text = '',
})
flow5.style.width = 150
flow5.style.height = 24
flow5.style.top_margin = -3
flow5.style.bottom_margin = 3
-- CREW SIZE LIMIT SLIDER --
flow5 = flow4.add({
name = 'options',
type = 'table',
@ -448,6 +513,12 @@ function Public.full_update(player)
if not selected_joinable_bool then flow.ongoing_runs.body.ongoing_runs_listbox.selected_index = 0 end
flow.ongoing_runs.body.leaving_prompt.visible = playercrew_status.leaving
local show_password_info = crewid and global_memory.crew_memories[crewid].run_is_private
flow.ongoing_runs.body.join_crew_info.visible = show_password_info
flow.ongoing_runs.body.password_namefield.visible = show_password_info
end
flow.proposals.visible = (memory.crewstatus == nil and not playercrew_status.leaving)
@ -485,6 +556,11 @@ function Public.full_update(player)
flow.proposals.body.flow_proposal_launch.launch_crew.visible = playercrew_status.proposal_can_launch
local checkbox_state = flow.proposals.body.proposal_maker.body.private_checkbox.state
flow.proposals.body.proposal_maker.body.password_label.visible = checkbox_state
flow.proposals.body.proposal_maker.body.password_namefield.visible = checkbox_state
flow.proposals.body.proposal_maker.body.confirm_password_label.visible = checkbox_state
flow.proposals.body.proposal_maker.body.confirm_password_namefield.visible = checkbox_state
end
@ -504,6 +580,21 @@ function Public.full_update(player)
-- wrappedmemories[#wrappedmemories + 1] = {'pirates.run_displayform', mem.id, mem.name, Utils.spritepath_to_richtext(CoreData.difficulty_options[mem.difficulty_option].icon), count, CoreData.capacity_options[mem.capacity_option].text2, ' [item=rail] ', mem.overworldx or 0}
end
GuiCommon.update_listbox(flow.ongoing_runs.body.ongoing_runs_listbox, wrappedmemories)
local crewid = nil
local bool1 = (not playercrew_status.leaving) and (not playercrew_status.adventuring) and (not playercrew_status.spectating) and (flow.ongoing_runs.body.ongoing_runs_listbox.selected_index ~= 0)
if bool1 then
crewid = tonumber((flow.ongoing_runs.body.ongoing_runs_listbox.get_item(flow.ongoing_runs.body.ongoing_runs_listbox.selected_index))[2])
end
-- Update timer when run will become public
if crewid and flow.ongoing_runs.body.join_crew_info.visible then
local lock_timer = global_memory.crew_memories[crewid].private_run_lock_timer
local sec = Math.floor((lock_timer / (60)) % 60)
local min = Math.floor((lock_timer / (60 * 60)) % 60)
local hrs = Math.floor((lock_timer / (60 * 60 * 60)) % 60)
flow.ongoing_runs.body.join_crew_info.caption = {'pirates.gui_join_private_run_info', hrs, min, sec}
end
end
if flow.proposals.visible then
@ -542,11 +633,12 @@ function Public.full_update(player)
-- end
-- end
end
end
function Public.click(event)
if not event.element then return end
if not event.element.valid then return end
local player = game.players[event.element.player_index]
@ -573,12 +665,56 @@ function Public.click(event)
if eventname == 'join_crew' then
local listbox = flow.ongoing_runs.body.ongoing_runs_listbox
local crewid = tonumber(listbox.get_item(listbox.selected_index)[2])
-- If run is private
if global_memory.crew_memories[crewid].run_is_private then
if global_memory.crew_memories[crewid].private_run_password == flow.ongoing_runs.body.password_namefield.text then
Crew.join_crew(player, crewid)
flow.ongoing_runs.body.join_crew_info.visible = false
flow.ongoing_runs.body.password_namefield.visible = false
else
Common.notify_player_error(player, {'pirates.gui_join_private_run_error_wrong_password'})
end
else
Crew.join_crew(player, crewid)
end
Crew.join_crew(player, tonumber(listbox.get_item(listbox.selected_index)[2]))
return
end
if eventname == 'propose_crew' then
-- If proposal was set as private
local run_is_private = flow.proposals.body.proposal_maker.body.private_checkbox.state
if run_is_private then
-- Count private runs
local private_run_count = 0
for _, id in pairs(global_memory.crew_active_ids) do
if global_memory.crew_memories[id].run_is_private then
private_run_count = private_run_count + 1
end
end
-- Make sure private run can be created
if private_run_count >= global_memory.private_run_cap then
Common.notify_player_error(player, {'pirates.gui_runs_proposal_maker_error_private_run_limit'})
return
end
-- Check if passwords match
if flow.proposals.body.proposal_maker.body.password_namefield.text ~= flow.proposals.body.proposal_maker.body.confirm_password_namefield.text then
Common.notify_player_error(player, {'pirates.gui_runs_proposal_maker_error_private_run_password_no_match'})
return
end
-- Check if passwords aren't empty
if flow.proposals.body.proposal_maker.body.password_namefield.text == '' then
Common.notify_player_error(player, {'pirates.gui_runs_proposal_maker_error_private_run_password_empty'})
return
end
end
local private_run_password = flow.proposals.body.proposal_maker.body.password_namefield.text
local proposal_name = flow.proposals.body.proposal_maker.body.namefield.text
-- local proposal_name = string.sub(flow.proposals.body.proposal_maker.body.namefield.text, 1, 30)
@ -626,14 +762,19 @@ function Public.click(event)
capacity_option = capacity_option,
-- mode_option = mode_option,
endorserindices = {player.index},
run_is_private = run_is_private,
private_run_password = private_run_password,
}
global_memory.crewproposals[#global_memory.crewproposals + 1] = proposal
local message = {'pirates.proposal_propose', player.name, proposal_name, CoreData.capacity_options[capacity_option].text3}
if run_is_private then
Common.notify_lobby({'pirates.proposal_propose_private', player.name, proposal_name, CoreData.capacity_options[capacity_option].text3})
else
Common.notify_lobby({'pirates.proposal_propose', player.name, proposal_name, CoreData.capacity_options[capacity_option].text3})
end
-- local message = player.name .. ' proposed the run ' .. proposal_name .. ' (difficulty ' .. CoreData.difficulty_options[difficulty_option].text .. ', capacity ' .. CoreData.capacity_options[capacity_option].text3 .. ').'
Common.notify_lobby(message)
return
end
@ -669,6 +810,22 @@ function Public.click(event)
if GuiCommon.crew_overall_state_bools(player.index).proposal_can_launch then --double check
for k, proposal in pairs(global_memory.crewproposals) do
if #proposal.endorserindices > 0 and proposal.endorserindices[1] == player.index then
-- Make sure private run can be created
if proposal.run_is_private then
-- NOTE: I didn't want to add this check in "proposal_can_launch", because different error message would get displayed (I think?).
local private_run_count = 0
for _, id in pairs(global_memory.crew_active_ids) do
if global_memory.crew_memories[id].run_is_private then
private_run_count = private_run_count + 1
end
end
if private_run_count >= global_memory.private_run_cap then
Common.notify_player_error(player, {'pirates.gui_runs_proposal_maker_error_private_run_limit'})
return
end
end
Crew.initialise_crew(proposal)
global_memory.crewproposals[k] = nil
Progression.set_off_from_starting_dock()

View File

@ -528,12 +528,10 @@ end
local score_gui_token = Token.register(score_gui)
local function on_gui_click(event)
local element = event.element
if not element or not element.valid then
return
end
if not event.element then return end
if not event.element.valid then return end
local player = game.get_player(element.player_index)
local player = game.get_player(event.element.player_index)
local frame = Gui.get_player_active_frame(player)
if not frame then

View File

@ -110,6 +110,8 @@ local function on_init()
Common.init_game_settings(Balance.technology_price_multiplier)
global_memory.active_crews_cap = Common.activeCrewsCap
global_memory.private_run_cap = Common.private_run_cap
global_memory.minimumCapacitySliderValue = Common.minimumCapacitySliderValue
Surfaces.Lobby.create_starting_dock_surface()
@ -184,6 +186,7 @@ local function crew_tick()
PiratesApiOnTick.check_for_cliff_explosives_in_hold_wooden_chests()
PiratesApiOnTick.equalise_fluid_storages() -- Made the update less often for small performance gain, but frequency can be increased if players complain
PiratesApiOnTick.revealed_buried_treasure_distance_check()
PiratesApiOnTick.update_private_run_lock_timer(60)
PiratesApiOnTick.victory_continue_reminder()
Kraken.overall_kraken_tick()