1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-10 00:43:27 +02:00
ComfyFactorio/maps/pirates/gui/gui.lua
danielmartin0 81db6a80bc v1.1.1.2
2022-03-14 21:38:44 +00:00

1201 lines
41 KiB
Lua

local Memory = require 'maps.pirates.memory'
local Math = require 'maps.pirates.math'
local Common = require 'maps.pirates.common'
local CoreData = require 'maps.pirates.coredata'
local Utils = require 'maps.pirates.utils_local'
local GuiEvo = require 'maps.pirates.gui.evo'
local GuiProgress = require 'maps.pirates.gui.progress'
local GuiRuns = require 'maps.pirates.gui.runs'
local GuiCrew = require 'maps.pirates.gui.crew'
local GuiFuel = require 'maps.pirates.gui.fuel'
local GuiMinimap = require 'maps.pirates.gui.minimap'
local GuiInfo = require 'maps.pirates.gui.info'
local Quest = require 'maps.pirates.quest'
local Balance = require 'maps.pirates.balance'
local inspect = require 'utils.inspect'.inspect
local GuiCommon = require 'maps.pirates.gui.common'
local Boats = require 'maps.pirates.structures.boats.boats'
local Hold = require 'maps.pirates.surfaces.hold'
local Cabin = require 'maps.pirates.surfaces.cabin'
local Crowsnest = require 'maps.pirates.surfaces.crowsnest'
local Progression = require 'maps.pirates.progression'
local Surfaces = require 'maps.pirates.surfaces.surfaces'
local Roles = require 'maps.pirates.roles.roles'
local Event = require 'utils.event'
local CustomEvents = require 'maps.pirates.custom_events'
local ComfyPanel = require 'comfy_panel.main'
local Public = {}
local enum = {
PROGRESS = 'progress',
RUNS = 'runs',
CREW = 'crew',
FUEL = 'fuel',
MINIMAP = 'minimap',
INFO = 'info',
COLOR = 'color',
}
Public.enum = enum
Public.progress = require 'maps.pirates.gui.progress'
Public.runs = require 'maps.pirates.gui.runs'
Public.crew = require 'maps.pirates.gui.crew'
Public.fuel = require 'maps.pirates.gui.fuel'
Public.minimap = require 'maps.pirates.gui.minimap'
Public.info = require 'maps.pirates.gui.info'
Public.color = require 'maps.pirates.gui.color'
function Public.update_crew_gui(which_gui)
local players = Common.crew_get_crew_members_and_spectators()
for _, player in pairs(players) do
Public[which_gui].full_update(player)
end
end
function Public.update_crew_progress_gui()
return Public.update_crew_gui('progress')
end
Event.add(CustomEvents.enum['update_crew_progress_gui'], Public.update_crew_progress_gui)
-- script.raise_event(CustomEvents.enum['update_crew_progress_gui'], {})
function Public.update_crew_fuel_gui()
return Public.update_crew_gui('fuel')
end
Event.add(CustomEvents.enum['update_crew_fuel_gui'], Public.update_crew_fuel_gui)
local function create_gui(player)
local flowleft, flow1, flow2, flow3, flow4, tooltip
flow1 = player.gui.top
flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'info_piratebutton')
flow2.caption = '?'
flow2.style.font = 'debug'
flow2.tooltip = 'Notes and updates on Pirate Ship'
flow2.style.font_color = {r=1, g=1, b=1}
flow2.style.hovered_font_color = {r=1, g=1, b=1}
flow2.style.clicked_font_color = {r=1, g=1, b=1}
flow2.parent.style.left_padding = -6
flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'runs_piratebutton', 70)
flow2.caption = 'Crews'
flow2.tooltip = 'View the ongoing runs, and make proposals for new ones.'
flow2.style.font = 'debug'
flow2.style.font_color = {r=1, g=1, b=1}
flow2.style.hovered_font_color = {r=1, g=1, b=1}
flow2.style.clicked_font_color = {r=1, g=1, b=1}
flow2.parent.style.width = 67
flow2.parent.style.left_padding = -6
-- optional use of left gui:
-- flowleft = player.gui.left
-- flow2 = GuiCommon.flow_add_floating_sprite_button(flowleft, 'crew_piratebutton')
-- flow2.sprite = 'utility/spawn_flag'
flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'crew_piratebutton')
flow2.sprite = 'utility/spawn_flag'
-- flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'lives_piratebutton')
-- flow2.tooltip = 'Lives\n\nWhen a silo is destroyed before its rocket is launched, you lose a life.\n\nLosing all your lives is one way to lose the game.'
-- flow2.mouse_button_filter = {'middle'}
-- flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'distance_travelled_piratebutton')
-- flow2.tooltip = 'Leagues travelled in the overworld\n\nCrews progress through the game by travelling in the overworld. Travel ' .. CoreData.victory_x/40 .. ' leagues = victory.'
-- flow2.sprite = 'item/rail'
-- flow2.mouse_button_filter = {'middle'}
-- flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'destination_piratebutton')
-- flow2.tooltip = 'Location window\n\nWhere am I?'
-- flow2.sprite = 'item/landfill'
flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'progress_piratebutton')
flow2.sprite = 'item/rail'
flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'evo_piratebutton')
flow2.sprite = 'entity/small-biter'
flow2.mouse_button_filter = {'middle'} --hack to avoid press visual
flow2.show_percent_for_small_numbers = true
flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'minimap_piratebutton')
flow2.tooltip = 'View the outside world.'
flow2.sprite = 'utility/map'
-- flow2 = GuiCommon.flow_add_floating_sprite_button(flow1, 'shop_piratebutton')
-- flow2.tooltip = "Coal/Officer's Shop\n\nThe captain and their officers are authorised to spend coal in the shop."
-- flow2.sprite = 'item/coal'
flow2 = GuiCommon.flow_add_floating_button(flow1, 'fuel_piratebutton')
-- flow2.style.right_padding = -100
flow3 = flow2.add({
name = 'fuel_label_0',
type = 'label',
caption = ''
})
flow3.style.font = 'default-large-semibold'
flow3.style.font_color = GuiCommon.bold_font_color
flow3.caption = 'Fuel:'
flow3 = flow2.add({
name = 'fuel_label_1',
type = 'label',
caption = ''
})
flow3.style.font = 'default-large'
flow3.style.font_color = GuiCommon.default_font_color
-- flow3.style.font_color = GuiCommon.bold_font_color
-- flow4.style.top_margin = -36
-- flow4.style.left_margin = -100
-- flow3.style.horizontal_align = 'center'
-- flow4.style.left_padding = -5
flow3.style.left_margin = -2
flow3 = flow2.add({
name = 'fuel_label_2',
type = 'label',
caption = ''
})
flow3.style.font = 'default-large'
flow3.style.left_margin = 3
flow2 = GuiCommon.flow_add_floating_button(flow1, 'etaframe_piratebutton')
-- flow2.style.right_padding = -100
-- flow2.enabled = false
flow3 = flow2.add({
name = 'etaframe_label_1',
type = 'label',
})
flow3.style.font = 'default-large-semibold'
flow3.style.font_color = GuiCommon.bold_font_color
flow3 = flow2.add({
name = 'etaframe_label_2',
type = 'label',
})
flow3.style.left_margin = 1
flow3.style.font = 'default-large'
flow3.style.font_color = GuiCommon.default_font_color
flow3 = flow2.add({
name = 'etaframe_label_3',
type = 'label',
})
flow3.style.left_margin = 3
flow3.style.font = 'default-large-semibold'
flow3.style.font_color = GuiCommon.bold_font_color
flow3 = flow2.add({type = 'table', name = 'cost_table', column_count = #CoreData.cost_items})
for i = 1, #CoreData.cost_items do
flow4 = flow3.add({type = 'sprite-button', name = 'cost_' .. i, number = 0})
-- flow4.mouse_button_filter = {'middle'}
flow4.sprite = CoreData.cost_items[i].sprite_name
flow4.enabled = false
flow4.style.top_margin = -6
flow4.style.right_margin = -6
flow4.style.maximal_height = 38
flow4.visible = false
end
-- and
flow4 = flow3.add({type = 'sprite-button', name = 'cost_launch_rocket'})
-- flow4.mouse_button_filter = {'middle'}
flow4.sprite = 'item/rocket-silo'
flow4.enabled = false
flow4.style.top_margin = -6
flow4.style.right_margin = -6
flow4.style.maximal_height = 38
flow4.visible = false
flow3.style.left_margin = -1
flow3.style.right_margin = -2 --to get to the end of the button frame
-- flow2 = flow1.add({
-- name = 'time_remaining_frame',
-- type = 'frame',
-- })
-- flow2.style.minimal_width = 100
-- flow2.style.natural_width = 100
-- flow2.style.minimal_height = 40
-- flow2.style.maximal_height = 40
-- flow2.style.left_padding = 4
-- flow2.style.right_padding = 4
-- flow2.style.top_padding = 3
-- flow2.tooltip = tooltip
-- flow3 = flow2.add({
-- name = 'time_remaining_label_1',
-- type = 'label',
-- caption = 'Max Time:'
-- })
-- flow3.style.font = 'default-large-semibold'
-- flow3.style.font_color = GuiCommon.bold_font_color
-- flow3.tooltip = tooltip
-- flow3 = flow2.add({
-- name = 'time_remaining_label_2',
-- type = 'label',
-- })
-- flow3.style.left_margin = 2
-- flow3.style.font = 'default-large'
-- flow3.style.font_color = GuiCommon.default_font_color
-- flow3.tooltip = tooltip
-- flow3 = flow2.add({
-- name = 'rage_table',
-- type = 'table',
-- column_count = 5,
-- })
-- flow3.style.top_margin = 6
-- flow3.style.left_margin = 4
-- for i = 1, 6 do
-- flow4 = flow3.add({type = 'progressbar', name = 'bar_' .. i, value = 0.5})
-- flow4.style.width = 18
-- flow4.style.height = 5
-- end
-- flow2 = flow1.add({
-- name = 'cost_frame',
-- type = 'frame',
-- })
-- flow2.style.minimal_width = 100
-- flow2.style.natural_width = 100
-- flow2.style.minimal_height = 40
-- flow2.style.maximal_height = 40
-- flow2.style.left_padding = 4
-- flow2.style.right_padding = 4
-- flow2.style.top_padding = 3
-- -- flow3 = flow2.add({
-- -- name = 'cost_label_1',
-- -- type = 'label',
-- -- })
-- -- flow3.style.font = 'default-large-semibold'
-- -- flow3.style.font_color = GuiCommon.bold_font_color
-- -- flow3 = flow2.add({
-- -- name = 'cost_label_2',
-- -- type = 'label',
-- -- })
-- -- flow3.style.font = 'default-large'
-- -- flow3.style.font_color = GuiCommon.default_font_color
-- flow3 = flow2.add({type = 'table', name = 'cost_table', column_count = 5})
-- for i = 1, 5 do
-- flow4 = flow3.add({type = 'sprite-button', name = 'cost_' .. i, number = 0})
-- -- flow4.mouse_button_filter = {'middle'}
-- flow4.enabled = false
-- flow4.style.top_margin = -6
-- flow4.style.right_margin = -6
-- flow4.style.maximal_height = 38
-- flow4.visible = false
-- end
-- flow3.style.right_margin = -3
flow2 = flow1.add({
name = 'silo_frame',
type = 'frame',
})
flow2.style.minimal_width = 80
flow2.style.natural_width = 80
flow2.style.minimal_height = 40
flow2.style.maximal_height = 40
flow2.style.left_padding = 4
flow2.style.right_padding = 4
flow2.style.top_padding = 3
flow3 = flow2.add({
name = 'silo_label_1',
type = 'label',
})
flow3.style.font = 'default-large-semibold'
flow3.style.font_color = GuiCommon.bold_font_color
flow3.style.right_margin = 2
flow3 = flow2.add({
type = 'progressbar',
name = 'silo_progressbar',
value = 0,
})
flow3.style.top_margin = 9
flow3.style.right_margin = 2
flow3.style.width = 72
flow3.style.height = 11
flow3 = flow2.add({
name = 'silo_label_2',
type = 'label',
})
flow3.style.font = 'default-large-semibold'
flow3.style.right_margin = 2
flow3 = flow2.add({
name = 'silo_label_3',
type = 'label',
})
flow3.style.font = 'default-large'
flow3.style.font_color = GuiCommon.default_font_color
flow3.style.right_margin = 2
-- flow3 = flow2.add({
-- type = 'sprite',
-- name = 'silo_charging_indicator',
-- })
-- flow3.tooltip = tooltip
-- old font color: {r=0.33, g=0.66, b=0.9}
flow2 = flow1.add({
name = 'quest_frame',
type = 'frame',
})
flow2.style.minimal_width = 80
flow2.style.natural_width = 80
flow2.style.minimal_height = 40
flow2.style.maximal_height = 40
flow2.style.left_padding = 4
flow2.style.right_padding = 4
flow2.style.top_padding = 3
flow3 = flow2.add({
name = 'quest_label_1',
type = 'label',
})
flow3.style.font = 'default-large-semibold'
flow3.style.right_margin = 2
flow3 = flow2.add({
name = 'quest_label_2',
type = 'label',
})
flow3.style.font = 'default-large'
flow3.style.font_color = Common.default_font_color
flow3 = flow2.add({
name = 'quest_label_3',
type = 'label',
})
-- flow3.style.font = 'default-large'
flow3.style.font = 'default-large-semibold'
flow3.style.left_margin = -4
flow3.style.right_margin = -4
flow3.style.font_color = Common.default_font_color
flow3 = flow2.add({
name = 'quest_label_4',
type = 'label',
})
flow3.style.font = 'default-large'
flow3.style.font_color = Common.default_font_color
flow2 = flow1.add({
name = 'covering_line_frame',
type = 'frame',
})
flow2.style.minimal_width = 40
flow2.style.natural_width = 40
flow2.style.minimal_height = 40
flow2.style.maximal_height = 40
flow2.style.left_padding = 3
flow2.style.right_padding = 3
flow3 = flow2.add({
name = 'covering_line',
type = 'line',
direction = 'horizontal',
})
flow3.style.top_margin = 9
flow3.style.minimal_width = 320
flow3.style.maximal_width = 320
--== SCREEN STUFF
-- spontaneous inside view of the hold:
flow1 =
player.gui.screen.add(
{
type = 'camera',
name = 'pirates_spontaneous_camera',
position = {x=0,y=0},
}
)
flow1.visible = false
flow1.style.margin = 8
-- flow2.style.minimal_height = 64
-- flow2.style.minimal_width = 64
-- flow2.style.maximal_height = 640
-- flow2.style.maximal_width = 640
-- flow2 = player.gui.screen.add({
-- name = 'pirates_undock_shortcut_button',
-- type = 'sprite-button',
-- enabled = false,
-- })
-- flow2.style.minimal_width = 80
-- flow2.style.natural_width = 80
-- flow2.style.maximal_width = 150
-- flow2.style.minimal_height = 40
-- flow2.style.maximal_height = 40
-- flow2.style.left_margin = 1
-- flow2.style.top_margin = 1
-- flow2.style.left_padding = 4
-- flow2.style.right_padding = 4
-- flow2.style.top_padding = 3
-- flow2.style.font = 'default-large-semibold'
-- flow2.style.font_color = GuiCommon.default_font_color
end
function Public.update_gui(player)
local memory = Memory.get_crew_memory()
local destination = Common.current_destination()
local dynamic_data = destination.dynamic_data --assumes this always exists
local flow1, flow1b, flow2, flow3
local pirates_flow = player.gui.top
if not pirates_flow.info_piratebutton_frame then create_gui(player) end
flow1 = pirates_flow.crew_piratebutton_frame.crew_piratebutton
if memory.id and memory.id ~= 0 then
flow1.tooltip = 'Your Crew\n\nPerform crew actions, such as selecting a class if any are available.'
flow1.mouse_button_filter = {'left','right'}
else
flow1.tooltip = 'Your Crew\n\nYou\'re a free agent, so there\'s nothing to do here.'
flow1.mouse_button_filter = {'middle'} --hack to avoid press visual
if player.gui.screen['crew_piratewindow'] then
player.gui.screen['crew_piratewindow'].destroy()
end
end
GuiEvo.full_update(player)
GuiProgress.regular_update(player) --moved to event
GuiRuns.full_update(player)
GuiCrew.full_update(player)
GuiFuel.regular_update(player)
GuiMinimap.full_update(player)
GuiInfo.full_update(player)
-- local lives = memory.lives or 1
-- local button = pirates_flow.lives_piratebutton_frame.lives_piratebutton
-- if lives == 1 then
-- button.sprite = 'item/effectivity-module'
-- button.number = 1
-- elseif lives == 2 then
-- button.sprite = 'item/effectivity-module-2'
-- button.number = 2
-- elseif lives == 3 then
-- button.sprite = 'item/effectivity-module-3'
-- button.number = 3
-- end
flow1 = pirates_flow.fuel_piratebutton_flow_1
flow1.fuel_piratebutton.tooltip = {'pirates.fuel_tooltip', Math.floor(memory.stored_fuel or 0)}
flow2 = flow1.fuel_piratebutton_flow_2
flow2.fuel_label_1.caption = Utils.bignumber_abbrevform(memory.stored_fuel or 0) .. '[item=coal]'
flow2.fuel_label_2.caption = Utils.negative_rate_abbrevform(memory.fuel_depletion_rate_memoized or 0)
local color_scale = Math.max(Math.min((- (memory.fuel_depletion_rate_memoized or 0))/50, 1),0)
flow2.fuel_label_2.style.font_color = {
r = GuiCommon.fuel_color_1.r * (1-color_scale) + GuiCommon.fuel_color_2.r * color_scale,
g = GuiCommon.fuel_color_1.g * (1-color_scale) + GuiCommon.fuel_color_2.g * color_scale,
b = GuiCommon.fuel_color_1.b * (1-color_scale) + GuiCommon.fuel_color_2.b * color_scale,
}
flow1 = pirates_flow.progress_piratebutton_frame.progress_piratebutton
flow1.number = (memory.overworldx or 0)
flow1.caption = string.format('Progress: %d leagues.\n\nTravel %d leagues to win the game.', memory.overworldx or 0, CoreData.victory_x)
-- pirates_flow.destination_piratebutton_frame.destination_piratebutton.number = memory.destinationsvisited_indices and #memory.destinationsvisited_indices or 0
--== State-checking bools ==--
local in_crowsnest_bool, in_hold_bool, in_cabin_bool, onmap_bool, eta_bool, retreating_bool, approaching_bool, atsea_sailing_bool, landed_bool, quest_bool, silo_bool, charged_bool, launched_bool, captain_bool, atsea_loading_bool, character_on_deck_bool, on_deck_standing_near_loco_bool, on_deck_standing_near_cabin_bool, on_deck_standing_near_crowsnest_bool, cost_bool, cost_includes_rocket_launch, approaching_dock_bool, leaving_dock_bool, leave_anytime_bool
captain_bool = Common.is_captain(player)
in_crowsnest_bool = string.sub(player.surface.name, 9, 17) == 'Crowsnest'
in_hold_bool = string.sub(player.surface.name, 9, 12) == 'Hold'
in_cabin_bool = string.sub(player.surface.name, 9, 13) == 'Cabin'
onmap_bool = destination.surface_name and (player.surface.name == destination.surface_name or (
memory.boat and memory.boat.surface_name == destination.surface_name and (in_crowsnest_bool or in_hold_bool or in_cabin_bool)
))
if destination then
eta_bool = dynamic_data.time_remaining and dynamic_data.time_remaining > 0 and onmap_bool
retreating_bool = memory.boat and memory.boat.state == Boats.enum_state.RETREATING and onmap_bool
approaching_bool = memory.boat and memory.boat.state == Boats.enum_state.APPROACHING
atsea_sailing_bool = memory.boat and memory.boat.state == Boats.enum_state.ATSEA_SAILING
landed_bool = memory.boat and memory.boat.state == Boats.enum_state.LANDED
quest_bool = (dynamic_data.quest_type ~= nil) and onmap_bool
silo_bool = dynamic_data.rocketsilos and dynamic_data.rocketsilos[1] and dynamic_data.rocketsilos[1].valid and onmap_bool
charged_bool = dynamic_data.silocharged
launched_bool = dynamic_data.rocketlaunched
cost_bool = destination.static_params.base_cost_to_undock and (not atsea_sailing_bool) and (not retreating_bool)
cost_includes_rocket_launch = cost_bool and destination.static_params.base_cost_to_undock['launch_rocket']
leave_anytime_bool = (landed_bool and not (eta_bool or cost_bool))
end
if memory.boat then
atsea_loading_bool = memory.boat.state == Boats.enum_state.ATSEA_LOADING_MAP and memory.loadingticks
character_on_deck_bool = player.character and player.character.position and player.surface.name and player.surface.name == memory.boat.surface_name
if character_on_deck_bool then
local BoatData = Boats.get_scope(memory.boat).Data
on_deck_standing_near_loco_bool = Math.distance(player.character.position, Math.vector_sum(memory.boat.position, BoatData.loco_pos)) < 3
on_deck_standing_near_cabin_bool = Math.distance(player.character.position, Math.vector_sum(memory.boat.position, BoatData.cabin_car)) < 2.5
on_deck_standing_near_crowsnest_bool = Math.distance(player.character.position, Math.vector_sum(memory.boat.position, BoatData.crowsnest_center)) < 2.7
end
approaching_dock_bool = destination.type == Surfaces.enum.DOCK and memory.boat.state == Boats.enum_state.APPROACHING
leaving_dock_bool = destination.type == Surfaces.enum.DOCK and memory.boat.state == Boats.enum_state.LEAVING_DOCK
end
--== Update Gui ==--
flow1 = pirates_flow.fuel_piratebutton_flow_1
if memory.crewstatus == nil then
flow1.visible = false
else
flow1.visible = true
end
flow1 = pirates_flow.etaframe_piratebutton_flow_1
if flow1 then
if cost_bool or atsea_loading_bool or eta_bool or retreating_bool or leave_anytime_bool then
flow1.visible = true
local tooltip = ''
flow2 = flow1.etaframe_piratebutton_flow_2
flow2.etaframe_label_1.visible = false --start off
flow2.etaframe_label_2.visible = false --start off
flow2.etaframe_label_3.visible = false --start off
flow2.cost_table.visible = false --start off
if retreating_bool then
flow2.etaframe_label_1.visible = true
flow2.etaframe_label_2.visible = false
tooltip = 'Probably time to board...'
flow2.etaframe_label_1.caption = 'RETURN TO SHIP'
elseif eta_bool then
flow2.etaframe_label_1.visible = true
flow2.etaframe_label_2.visible = true
tooltip = {'pirates.auto_undock_tooltip'}
local passive_eta = dynamic_data.time_remaining
flow2.etaframe_label_1.caption = 'Auto-undock:'
flow2.etaframe_label_2.caption = Utils.standard_string_form_of_time_in_seconds(passive_eta)
elseif atsea_loading_bool then
flow2.etaframe_label_1.visible = true
flow2.etaframe_label_2.visible = true
tooltip = {'pirates.atsea_loading_tooltip'}
local total = Common.map_loading_ticks_atsea
if destination.type == Surfaces.enum.DOCK then
total = Common.map_loading_ticks_atsea_dock
elseif destination.type == Surfaces.enum.ISLAND and destination.subtype == Surfaces.Island.enum.MAZE then
total = Common.map_loading_ticks_atsea_maze
end
local eta_ticks = total + (memory.extra_time_at_sea or 0) - memory.loadingticks
flow2.etaframe_label_1.caption = 'Arriving in'
flow2.etaframe_label_2.caption = Utils.standard_string_form_of_time_in_seconds(eta_ticks / 60)
elseif leave_anytime_bool then
flow2.etaframe_label_1.visible = true
flow2.etaframe_label_2.visible = true
tooltip = {'pirates.leave_anytime_tooltip'}
flow2.etaframe_label_1.caption = 'Undock:'
flow2.etaframe_label_2.caption = 'Anytime'
end
if cost_bool then
local costs = destination.static_params.base_cost_to_undock
local adjusted_costs = Common.time_adjusted_departure_cost(costs)
local cost_table = flow2.cost_table
flow2.etaframe_label_3.visible = true
cost_table.visible = true
if flow2.etaframe_label_2.visible then
flow2.etaframe_label_2.caption = flow2.etaframe_label_2.caption .. '.'
end
local caption
if atsea_loading_bool then
flow2.etaframe_label_3.caption = 'Next escape cost:'
if cost_includes_rocket_launch then
tooltip = {'pirates.resources_needed_tooltip_1_rocketvariant'}
else
tooltip = {'pirates.resources_needed_tooltip_1'}
end
elseif (not eta_bool) then
flow2.etaframe_label_3.visible = false
flow2.etaframe_label_1.visible = true
flow2.etaframe_label_1.caption = 'To escape, store'
if cost_includes_rocket_launch then
tooltip = {'pirates.resources_needed_tooltip_3_rocketvariant'}
else
tooltip = {'pirates.resources_needed_tooltip_3'}
end
else
flow2.etaframe_label_3.caption = 'Or store'
local adjusted_costs_resources_strings = Common.time_adjusted_departure_cost_resources_strings(memory)
if cost_includes_rocket_launch then
tooltip = {'pirates.resources_needed_tooltip_2_rocketvariant', adjusted_costs_resources_strings[1], adjusted_costs_resources_strings[2]}
else
--@Future reference: localisation handling
tooltip = {'pirates.resources_needed_tooltip_2', adjusted_costs_resources_strings[1], adjusted_costs_resources_strings[2]}
end
end
for i = 1, #CoreData.cost_items do
local item_name = CoreData.cost_items[i].name
if adjusted_costs[item_name] and cost_table['cost_' .. i] then
local stored = (memory.boat.stored_resources and memory.boat.stored_resources[item_name]) or 0
if atsea_loading_bool then
cost_table['cost_' .. i].number = adjusted_costs[item_name]
else --subtract off the amount we've stored
cost_table['cost_' .. i].number = Math.max(adjusted_costs[item_name] - stored, 0)
end
cost_table['cost_' .. i].tooltip = CoreData.cost_items[i].display_name
cost_table['cost_' .. i].visible = true
else
cost_table['cost_' .. i].visible = false
end
end
if adjusted_costs['launch_rocket'] and cost_table['cost_launch_rocket'] then
if atsea_loading_bool or (not dynamic_data.rocketlaunched) then
cost_table['cost_launch_rocket'].number = 1
else
cost_table['cost_launch_rocket'].number = 0
end
cost_table['cost_launch_rocket'].tooltip = 'Launch a rocket'
cost_table['cost_launch_rocket'].visible = true
else
cost_table['cost_launch_rocket'].visible = false
end
end
flow1.etaframe_piratebutton.tooltip = tooltip
flow2.tooltip = tooltip
if captain_bool and (not retreating_bool) and (leave_anytime_bool or eta_bool or (cost_bool and (not atsea_loading_bool))) then
flow1.etaframe_piratebutton.mouse_button_filter = {'left'}
if memory.undock_shortcut_are_you_sure_data and memory.undock_shortcut_are_you_sure_data[player.index] and memory.undock_shortcut_are_you_sure_data[player.index] > game.tick - 60 * 4 then
flow2.etaframe_label_1.visible = true
flow2.etaframe_label_1.caption = 'Undock — Are you sure?'
flow2.etaframe_label_2.visible = false
flow2.etaframe_label_3.visible = false
end
else
flow1.etaframe_piratebutton.mouse_button_filter = {'middle'} --hack to avoid press visual
end
else
flow1.visible = false
end
end
-- flow1 = pirates_flow.cost_frame
-- if flow1 then
-- if cost_bool then
-- flow1.visible = true
-- -- local costs = destination.static_params.base_cost_to_undock
-- -- for i = 1, #CoreData.cost_items do
-- -- local item_name = CoreData.cost_items[i].name
-- -- if costs[item_name] then
-- -- local stored = (memory.boat.stored_resources and memory.boat.stored_resources[item_name]) or 0
-- -- flow1.cost_table['cost_' .. i].sprite = CoreData.cost_items[i].sprite_name
-- -- flow1.cost_table['cost_' .. i].number = Math.max(costs[item_name] - stored, 0)
-- -- flow1.cost_table['cost_' .. i].tooltip = CoreData.cost_items[i].display_name
-- -- flow1.cost_table['cost_' .. i].visible = true
-- -- else
-- -- flow1.cost_table['cost_' .. i].visible = false
-- -- end
-- -- end
-- -- local total_rage = time_rage + silo_rage
-- -- flow1.rage_label_2.caption = total_rage .. '/10'
-- -- if total_rage <= 4 then
-- -- flow1.rage_label_2.style.font_color = GuiCommon.rage_font_color_1
-- -- flow1.rage_label_2.style.font = 'default-large'
-- -- elseif total_rage <= 7 then
-- -- flow1.rage_label_2.style.font_color = GuiCommon.rage_font_color_2
-- -- flow1.rage_label_2.style.font = 'default-large-semibold'
-- -- else
-- -- flow1.rage_label_2.style.font_color = GuiCommon.rage_font_color_3
-- -- flow1.rage_label_2.style.font = 'default-dialog-button'
-- -- end
-- -- -- flow1.rage_table.bar_1.value = time_rage >= 1 and 1 or 0
-- -- -- flow1.rage_table.bar_2.value = time_rage >= 2 and 1 or 0
-- -- -- flow1.rage_table.bar_3.value = time_rage >= 3 and 1 or 0
-- -- -- flow1.rage_table.bar_4.value = time_rage >= 4 and 1 or 0
-- -- -- flow1.rage_table.bar_5.value = silo_rage >= 1 and 1 or 0
-- -- -- flow1.rage_table.bar_6.value = silo_rage >= 2 and 1 or 0
-- else
-- flow1.visible = false
-- end
-- end
-- flow1 = player.gui.screen.pirates_undock_shortcut_button
-- if flow1 then
-- flow1.location = GuiCommon.default_window_positions.undock_shortcut_button
-- if captain_bool and landed_bool and (not memory.captain_acceptance_timer) then
-- flow1.visible = true
-- local enabled = Common.query_can_pay_cost_to_leave()
-- flow1.enabled = enabled
-- if enabled then
-- flow1.tooltip = ''
-- else
-- flow1.tooltip = 'Store more resources in the captain\'s cabin before leaving.'
-- end
-- elseif captain_bool and destination and destination.type and destination.type == Surfaces.enum.DOCK and (not (memory.boat.state and memory.boat.state == Boats.enum_state.LEAVING_DOCK)) then
-- flow1.visible = true
-- flow1.enabled = memory.boat and memory.boat.state and memory.boat.state == Boats.enum_state.DOCKED
-- flow1.tooltip = ''
-- else
-- flow1.visible = false
-- end
-- if flow1.visible then
-- if (not memory.undock_shortcut_are_you_sure_data) then memory.undock_shortcut_are_you_sure_data = {} end
-- if memory.undock_shortcut_are_you_sure_data[player.index] and memory.undock_shortcut_are_you_sure_data[player.index] > game.tick - 60 * 4 then
-- flow1.caption = 'Are you sure?'
-- else
-- flow1.caption = 'Undock'
-- end
-- end
-- end
flow1 = pirates_flow.silo_frame
local active_eta
if flow1 then
if silo_bool then
flow1.visible = true
if charged_bool then
if launched_bool then
flow1.silo_progressbar.visible = false
flow1.silo_label_2.visible = false
flow1.silo_label_3.visible = true
-- flow1.silo_label_1.caption = string.format('[achievement=there-is-no-spoon]: +%.0f[item=sulfur]', dynamic_data.rocketcoalreward)
flow1.silo_label_1.caption = string.format('Launched:')
-- flow1.silo_label_1.caption = string.format('Launched for %.0f[item=coal] , ' .. Balance.rocket_launch_coin_reward .. '[item=coin]', dynamic_data.rocketcoalreward)
flow1.silo_label_1.style.font_color = GuiCommon.achieved_font_color
flow1.silo_label_3.caption = Math.floor(dynamic_data.rocketcoalreward/100)/10 .. 'k[item=coal], ' .. Math.floor(Balance.rocket_launch_coin_reward/100)/10 .. 'k[item=coin]'
local tooltip = 'The rocket has launched, and this is the reward.'
flow1.tooltip = tooltip
flow1.silo_label_1.tooltip = tooltip
flow1.silo_label_3.tooltip = tooltip
else
local tooltip = 'The rocket is launching...'
flow1.tooltip = tooltip
flow1.silo_label_1.tooltip = tooltip
flow1.silo_progressbar.tooltip = tooltip
flow1.silo_label_1.caption = 'Charge:'
flow1.silo_label_1.style.font_color = GuiCommon.bold_font_color
flow1.silo_label_2.visible = false
flow1.silo_label_3.visible = false
flow1.silo_progressbar.visible = true
flow1.silo_progressbar.value = 1
end
else
flow1.silo_label_1.caption = 'Charge:'
flow1.silo_label_1.style.font_color = GuiCommon.bold_font_color
flow1.silo_label_2.visible = true
flow1.silo_progressbar.visible = true
flow1.silo_label_3.visible = false
local consumed = dynamic_data.rocketsiloenergyconsumed
local needed = dynamic_data.rocketsiloenergyneeded
local recent = (dynamic_data.rocketsiloenergyconsumedwithinlasthalfsecond * 2)
flow1.silo_progressbar.value = consumed/needed
local tooltip = string.format('Rocket silo charge\n\nCharge the silo to launch a rocket, gaining both doubloons and fuel.\n\nCurrent charge: %.1f/%.1f GJ', Math.floor(consumed / 100000000)/10, Math.floor(needed / 100000000)/10)
flow1.tooltip = tooltip
flow1.silo_label_1.tooltip = tooltip
flow1.silo_label_2.tooltip = tooltip
flow1.silo_progressbar.tooltip = tooltip
if recent ~= 0 then
active_eta = (needed - consumed) / recent
flow1.silo_label_2.caption = Utils.standard_string_form_of_time_in_seconds(active_eta)
if active_eta < dynamic_data.time_remaining or (not eta_bool) then
flow1.silo_label_2.style.font_color = GuiCommon.sufficient_font_color
else
flow1.silo_label_2.style.font_color = GuiCommon.insufficient_font_color
end
else
flow1.silo_label_2.caption = ''
flow1.silo_label_2.style.font_color = GuiCommon.insufficient_font_color
end
end
else
flow1.visible = false
end
end
flow1 = pirates_flow.quest_frame
if flow1 then
if quest_bool then
flow1.visible = true
local quest_type = dynamic_data.quest_type or nil
local quest_params = dynamic_data.quest_params or {}
local quest_reward = dynamic_data.quest_reward or nil
local quest_progress = dynamic_data.quest_progress or 0
local quest_progressneeded = dynamic_data.quest_progressneeded or 0
local quest_complete = dynamic_data.quest_complete or false
if quest_type then
local tooltip = ''
if quest_complete then
tooltip = 'The quest is complete, and this is the reward.'
flow1.quest_label_1.caption = 'Quest:'
flow1.quest_label_1.style.font_color = GuiCommon.achieved_font_color
flow1.quest_label_2.visible = true
flow1.quest_label_3.visible = false
flow1.quest_label_4.visible = false
flow1.quest_label_2.caption = quest_reward.display_amount .. ' ' .. quest_reward.display_sprite
else
if quest_progress < quest_progressneeded then
flow1.quest_label_1.caption = 'Quest:'
flow1.quest_label_1.style.font_color = GuiCommon.bold_font_color
flow1.quest_label_2.visible = true
flow1.quest_label_3.visible = true
flow1.quest_label_4.visible = true
-- defaults, to be overwritten:
flow1.quest_label_2.caption = string.format('%s ', Quest.quest_icons[quest_type])
flow1.quest_label_3.caption = string.format('%.0f/%.0f', quest_progress, quest_progressneeded)
flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
flow1.quest_label_4.caption = string.format(' for %s', quest_reward.display_sprite)
flow1.quest_label_4.style.font_color = Common.default_font_color
end
if quest_type == Quest.enum.TIME then
if tooltip == '' then tooltip = 'Quest: Time\n\nLaunch a rocket before the countdown completes for a bonus.' end
if quest_progress >= 0 then
flow1.quest_label_3.caption = string.format('%.0fm%.0fs', Math.floor(quest_progress / 60), quest_progress % 60)
if active_eta then
if active_eta < quest_progress - 35 then --35 is roughly the number of seconds between charge and launch
flow1.quest_label_3.style.font_color = GuiCommon.sufficient_font_color
else
flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
end
else
if charged_bool and quest_progress > 35 then
flow1.quest_label_3.style.font_color = GuiCommon.sufficient_font_color
else
flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
end
end
else
flow1.quest_label_3.caption = string.format('Fail')
flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
end
elseif quest_type == Quest.enum.WORMS then
if tooltip == '' then tooltip = 'Quest: Worms\n\nKill enough worms for a bonus.' end
elseif quest_type == Quest.enum.FIND then
if tooltip == '' then tooltip = 'Quest: Ghosts\n\nFind the ghosts for a bonus.' end
elseif quest_type == Quest.enum.RESOURCEFLOW then
if tooltip == '' then tooltip = 'Quest: Resource Flow\n\nAchieve a production rate of a particular item for a bonus.' end
-- out of date:
if quest_progressneeded/60 % 1 == 0 then
flow1.quest_label_2.caption = string.format('%s %.1f/%.0f /s', '[item=' .. quest_params.item .. ']', quest_progress/60, quest_progressneeded/60)
flow1.quest_label_3.caption = string.format(' for %s', quest_reward.display_sprite)
else
flow1.quest_label_2.caption = string.format('%s %.1f/%.1f /s', '[item=' .. quest_params.item .. ']', quest_progress/60, quest_progressneeded/60)
flow1.quest_label_3.caption = string.format(' for %s', quest_reward.display_sprite)
end
elseif quest_type == Quest.enum.RESOURCECOUNT then
if tooltip == '' then tooltip = 'Quest: Item Production\n\nProduce a particular number of items for a bonus.' end
flow1.quest_label_2.caption = string.format('%s ', '[item=' .. quest_params.item .. ']')
elseif quest_type == Quest.enum.NODAMAGE then
if tooltip == '' then tooltip = 'Quest: No Damage\n\nLaunch a rocket without the silo taking damage.' end
if (memory.boat and memory.boat.state == Boats.enum_state.APPROACHING) or (dynamic_data.rocketsilos and dynamic_data.rocketsilos[1] and dynamic_data.rocketsilos[1].valid and dynamic_data.rocketsilohp == dynamic_data.rocketsilomaxhp) then
flow1.quest_label_3.caption = string.format('OK')
flow1.quest_label_3.style.font_color = GuiCommon.sufficient_font_color
else
flow1.quest_label_3.caption = string.format('Fail')
flow1.quest_label_3.style.font_color = GuiCommon.insufficient_font_color
end
end
end
flow1.tooltip = tooltip
flow1.quest_label_1.tooltip = tooltip
flow1.quest_label_2.tooltip = tooltip
flow1.quest_label_3.tooltip = tooltip
flow1.quest_label_4.tooltip = tooltip
end
else
flow1.visible = false
end
end
flow1 = pirates_flow.covering_line_frame
if flow1 then
-- if not eta_bool and not retreating_bool and not quest_bool and not silo_bool and not atsea_loading_bool and not leave_anytime_bool and not cost_bool and not approaching_dock_bool and not leaving_dock_bool then
if not eta_bool and not retreating_bool and not quest_bool and not silo_bool and not atsea_loading_bool and not leave_anytime_bool and not cost_bool and not approaching_dock_bool and not leaving_dock_bool and not atsea_sailing_bool then
flow1.visible = true
else
flow1.visible = false
end
end
flow1 = pirates_flow.minimap_piratebutton_frame
if flow1 then
if in_hold_bool then
flow1.visible = true
else
flow1.visible = false
end
end
flow1 = player.gui.screen.pirates_spontaneous_camera
if not flow1 then --comfy panel might possibly destroy this, so this puts it back
flow1 =
player.gui.screen.add(
{
type = 'camera',
name = 'pirates_spontaneous_camera',
position = {x=0,y=0},
}
)
flow1.visible = false
flow1.style.margin = 8
end
if flow1 then
flow1.visible = false
flow1.location = {x = 8, y = 48}
if on_deck_standing_near_loco_bool then
flow1.visible = true
flow1.surface_index = Hold.get_hold_surface(1).index
flow1.zoom = 0.18
flow1.style.minimal_height = 268
flow1.style.minimal_width = 532
flow1.position = {x=0,y=0}
elseif on_deck_standing_near_cabin_bool then
flow1.visible = true
flow1.surface_index = Cabin.get_cabin_surface().index
flow1.zoom = 0.468
flow1.style.minimal_height = 416
flow1.style.minimal_width = 260
flow1.position = {x=0,y=-1.3}
elseif on_deck_standing_near_crowsnest_bool then
flow1.visible = true
flow1.surface_index = Crowsnest.get_crowsnest_surface().index
flow1.zoom = 0.21
flow1.style.minimal_height = 384
flow1.style.minimal_width = 384
flow1.position = {x=memory.overworldx,y=memory.overworldy}
elseif in_cabin_bool or in_crowsnest_bool then
flow1.visible = true
flow1.surface_index = game.surfaces[memory.boat.surface_name].index
flow1.zoom = 0.09
flow1.style.minimal_height = 312
flow1.style.minimal_width = 312
local position = memory.boat.position
if (destination and destination.type and destination.type == Surfaces.enum.ISLAND and memory.boat.surface_name and memory.boat.surface_name == destination.surface_name and destination.static_params and destination.static_params.boat_starting_xposition) then
-- nicer viewing position:
position = {x = destination.static_params.boat_starting_xposition + 50, y = destination.static_params.boat_starting_yposition or 0}
end
flow1.position = position
end
end
end
local function on_gui_click(event)
if not event then return end
if not event.element then return end
if not event.element.valid then return end
local player = game.players[event.element.player_index]
local crew_id = tonumber(string.sub(player.force.name, -3, -1)) or nil
Memory.set_working_id(crew_id)
local memory = Memory.get_crew_memory()
if event.element.name and event.element.name == 'etaframe_piratebutton' and (memory.boat.state == Boats.enum_state.DOCKED or memory.boat.state == Boats.enum_state.LANDED) then
if Roles.player_privilege_level(player) >= Roles.privilege_levels.CAPTAIN then
if (not memory.undock_shortcut_are_you_sure_data) then memory.undock_shortcut_are_you_sure_data = {} end
if memory.undock_shortcut_are_you_sure_data[player.index] and memory.undock_shortcut_are_you_sure_data[player.index] > game.tick - 60 * 4 then
if memory.boat.state == Boats.enum_state.DOCKED then
Progression.undock_from_dock(true)
elseif memory.boat.state == Boats.enum_state.LANDED then
Progression.try_retreat_from_island(player, true)
end
else
memory.undock_shortcut_are_you_sure_data[player.index] = game.tick
end
end
elseif string.sub(event.element.name, -13, -1) and string.sub(event.element.name, -13, -1) == '_piratebutton' then
local name = string.sub(event.element.name, 1, -14)
if Public[name] then
Public[name].toggle_window(player)
Public[name].full_update(player)
end
-- elseif event.element.name == 'fuel_label_1' or event.element.name == 'fuel_label_2' then
-- Public.fuel.toggle_window(player)
-- Public.fuel.full_update(player)
else
GuiRuns.click(event)
GuiCrew.click(event)
GuiFuel.click(event)
GuiMinimap.click(event)
GuiInfo.click(event)
end
end
local function on_gui_location_changed(event)
if (not event and event.element and event.element.valid) then return end
if string.sub(event.element.name, -13, -1) and string.sub(event.element.name, -13, -1) == '_piratewindow' then
local name = string.sub(event.element.name, 1, -14)
local player = game.players[event.element.player_index]
GuiCommon.update_gui_memory(player, name, 'position', event.element.location)
end
end
local event = require 'utils.event'
event.add(defines.events.on_gui_click, on_gui_click)
event.add(defines.events.on_gui_location_changed, on_gui_location_changed)
return Public