mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-01-10 00:43:27 +02:00
f826660619
Changes: - Fixed crash that could happen if player clicked on crew window button with middle mouse button while in lobby - Removed "Pro..." text from Progress window button - Moved class related info from crew window to new class window - Added scroll pane for crew window
251 lines
7.8 KiB
Lua
251 lines
7.8 KiB
Lua
-- This file is part of thesixthroc's Pirate Ship softmod, licensed under GPLv3 and stored at https://github.com/danielmartin0/ComfyFactorio-Pirates.
|
|
|
|
|
|
local Memory = require 'maps.pirates.memory'
|
|
local Common = require 'maps.pirates.common'
|
|
local Classes = require 'maps.pirates.roles.classes'
|
|
local GuiCommon = require 'maps.pirates.gui.common'
|
|
local Public = {}
|
|
|
|
|
|
local window_name = 'classes'
|
|
|
|
local widths = {}
|
|
widths['available_classes'] = 150
|
|
widths['taken_by'] = 150
|
|
widths['action_buttons'] = 100
|
|
|
|
-- used to track whether new class entries should be added during "full_update"
|
|
local entry_count = 0
|
|
|
|
local function add_class_entry(player, class, taken_by_player_index, index)
|
|
if not player.gui.screen[window_name .. '_piratewindow'] then return end
|
|
local flow
|
|
flow = player.gui.screen[window_name .. '_piratewindow']
|
|
|
|
local class_list_panel_table = flow.scroll_pane.class_list_panel_table
|
|
|
|
|
|
-- Class label
|
|
local explanation = Classes.explanation_advanced(class, false)
|
|
local full_explanation
|
|
|
|
if Classes.class_purchase_requirement[class] then
|
|
full_explanation = {'pirates.class_explanation_upgraded_class', Classes.display_form(class), Classes.display_form(Classes.class_purchase_requirement[class]), explanation}
|
|
else
|
|
full_explanation = {'pirates.class_explanation', Classes.display_form(class), explanation}
|
|
end
|
|
|
|
local available_class_label = class_list_panel_table.add({
|
|
type = 'label',
|
|
caption = Classes.display_form(class),
|
|
tooltip = full_explanation,
|
|
})
|
|
available_class_label.style.minimal_width = widths['available_classes']
|
|
available_class_label.style.maximal_width = widths['available_classes']
|
|
|
|
|
|
-- Player label
|
|
local taken_by_player_name = taken_by_player_index and game.players[taken_by_player_index].name or ''
|
|
local taken_by_label = class_list_panel_table.add({
|
|
name = 'player_label' .. index,
|
|
type = 'label',
|
|
caption = taken_by_player_name,
|
|
})
|
|
taken_by_label.style.minimal_width = widths['taken_by']
|
|
taken_by_label.style.maximal_width = widths['taken_by']
|
|
|
|
-- Button
|
|
local button
|
|
|
|
if not taken_by_player_index then
|
|
button = class_list_panel_table.add({
|
|
name = 'button' .. index,
|
|
type = 'button',
|
|
caption = {'pirates.gui_classes_take'},
|
|
tooltip = {'pirates.gui_classes_take_enabled_tooltip'},
|
|
})
|
|
elseif taken_by_player_index == player.index then
|
|
button = class_list_panel_table.add({
|
|
name = 'button' .. index,
|
|
type = 'button',
|
|
caption = {'pirates.gui_classes_drop'},
|
|
tooltip = {'pirates.gui_classes_drop_tooltip'},
|
|
})
|
|
button.style.font_color = {r=1, g=0, b=0}
|
|
button.style.hovered_font_color = {r=1, g=0, b=0}
|
|
button.style.clicked_font_color = {r=1, g=0, b=0}
|
|
else
|
|
button = class_list_panel_table.add({
|
|
name = 'button' .. index,
|
|
type = 'button',
|
|
enabled = false, -- wanted to make "visble = false" instead, but table doesn't like that
|
|
caption = {'pirates.gui_classes_take'},
|
|
tooltip = {'pirates.gui_classes_take_disabled_tooltip'},
|
|
})
|
|
end
|
|
button.tags = {type = 'pirates_' .. window_name, index = index}
|
|
|
|
button.style.minimal_width = widths['action_buttons']
|
|
button.style.maximal_width = widths['action_buttons']
|
|
end
|
|
|
|
function Public.toggle_window(player)
|
|
local memory = Memory.get_crew_memory()
|
|
local flow, flow2, flow3, flow4
|
|
|
|
--*** OVERALL FLOW ***--
|
|
if player.gui.screen[window_name .. '_piratewindow'] then player.gui.screen[window_name .. '_piratewindow'].destroy() return end
|
|
|
|
if not Common.is_id_valid(memory.id) then return end
|
|
|
|
flow = GuiCommon.new_window(player, window_name)
|
|
flow.caption = {'pirates.gui_classes'}
|
|
flow.auto_center = true
|
|
flow.style.maximal_width = 500
|
|
|
|
flow2 = flow.add({
|
|
name = 'headers',
|
|
type = 'flow',
|
|
direction = 'horizontal',
|
|
})
|
|
|
|
flow3 = flow2.add({
|
|
name = 'available_classes',
|
|
type = 'label',
|
|
caption = {'pirates.gui_classes_available_classes'},
|
|
})
|
|
flow3.style.minimal_width = widths['available_classes']
|
|
flow3.style.maximal_width = widths['available_classes']
|
|
flow3.style.font = 'heading-2'
|
|
flow3.style.font_color = GuiCommon.section_header_font_color
|
|
|
|
flow3 = flow2.add({
|
|
name = 'taken_by',
|
|
type = 'label',
|
|
caption = {'pirates.gui_classes_taken_by'},
|
|
})
|
|
flow3.style.minimal_width = widths['taken_by']
|
|
flow3.style.maximal_width = widths['taken_by']
|
|
flow3.style.font = 'heading-2'
|
|
flow3.style.font_color = GuiCommon.section_header_font_color
|
|
|
|
flow3 = flow2.add({
|
|
name = 'action_buttons',
|
|
type = 'label',
|
|
caption = {'pirates.gui_classes_actions'},
|
|
})
|
|
flow3.style.minimal_width = widths['action_buttons']
|
|
flow3.style.maximal_width = widths['action_buttons']
|
|
flow3.style.font = 'heading-2'
|
|
flow3.style.font_color = GuiCommon.section_header_font_color
|
|
|
|
-- List management
|
|
local scroll_pane = flow.add {
|
|
type = 'scroll-pane',
|
|
name = 'scroll_pane',
|
|
direction = 'vertical',
|
|
horizontal_scroll_policy = 'never',
|
|
vertical_scroll_policy = 'auto'
|
|
}
|
|
scroll_pane.style.maximal_height = 500
|
|
scroll_pane.style.bottom_padding = 20
|
|
|
|
scroll_pane.add{
|
|
type = 'table',
|
|
name = 'class_list_panel_table',
|
|
column_count = 3
|
|
}
|
|
|
|
for i, class_entry in ipairs(memory.unlocked_classes) do
|
|
add_class_entry(player, class_entry.class, class_entry.taken_by, i)
|
|
end
|
|
|
|
entry_count = #memory.unlocked_classes
|
|
|
|
GuiCommon.flow_add_close_button(flow, window_name .. '_piratebutton')
|
|
end
|
|
|
|
|
|
|
|
function Public.full_update(player)
|
|
if not player.gui.screen[window_name .. '_piratewindow'] then return end
|
|
local flow = player.gui.screen[window_name .. '_piratewindow']
|
|
|
|
local memory = Memory.get_crew_memory()
|
|
|
|
--*** Overwrite contents ***--
|
|
|
|
local class_list_panel_table = flow.scroll_pane.class_list_panel_table
|
|
|
|
-- Currently assuming class list size never decreases
|
|
|
|
-- Update current content table
|
|
for i = 1, entry_count do
|
|
local label = class_list_panel_table['player_label' .. i]
|
|
local class_entry = memory.unlocked_classes[i]
|
|
label.caption = class_entry.taken_by and game.players[class_entry.taken_by].name or ''
|
|
|
|
local black = {r=0, g=0, b=0}
|
|
local red = {r=1, g=0, b=0}
|
|
|
|
local button = class_list_panel_table['button' .. i]
|
|
if not class_entry.taken_by then
|
|
button.caption = {'pirates.gui_classes_take'}
|
|
button.tooltip = {'pirates.gui_classes_take_enabled_tooltip'}
|
|
button.style.font_color = black
|
|
button.style.hovered_font_color = black
|
|
button.style.clicked_font_color = black
|
|
elseif class_entry.taken_by == player.index then
|
|
button.caption = {'pirates.gui_classes_drop'}
|
|
button.tooltip = {'pirates.gui_classes_drop_tooltip'}
|
|
button.style.font_color = red
|
|
button.style.hovered_font_color = red
|
|
button.style.clicked_font_color = red
|
|
else
|
|
button.caption = {'pirates.gui_classes_take'}
|
|
button.tooltip = {'pirates.gui_classes_take_disabled_tooltip'}
|
|
button.style.font_color = black
|
|
button.style.hovered_font_color = black
|
|
button.style.clicked_font_color = black
|
|
end
|
|
end
|
|
|
|
|
|
-- If new entries were added since last update, add them to GUI
|
|
if entry_count ~= #memory.unlocked_classes then
|
|
for i = entry_count + 1, #memory.unlocked_classes do
|
|
local class_entry = memory.unlocked_classes[i]
|
|
add_class_entry(player, class_entry.class, class_entry.taken_by, i)
|
|
end
|
|
|
|
entry_count = #memory.unlocked_classes
|
|
end
|
|
end
|
|
|
|
|
|
function Public.click(event)
|
|
local player = game.players[event.element.player_index]
|
|
if not player.gui.screen[window_name .. '_piratewindow'] then return end
|
|
|
|
local tags = event.element.tags
|
|
if not tags then return end
|
|
if tags.type ~= 'pirates_' .. window_name then return end
|
|
|
|
local memory = Memory.get_crew_memory()
|
|
|
|
if tags.index then
|
|
local button_is_take_class = (not memory.unlocked_classes[tags.index].taken_by) and true or false
|
|
|
|
if button_is_take_class then
|
|
local class_to_assign = memory.unlocked_classes[tags.index].class
|
|
Classes.assign_class(player.index, class_to_assign, tags.index)
|
|
return
|
|
else -- button is drop class
|
|
Classes.assign_class(player.index, nil, tags.index)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
return Public |