1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-10 00:43:27 +02:00
ComfyFactorio/maps/pirates/gui/classes.lua
Piratux f826660619 New class GUI window
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
2022-07-07 23:01:45 +03:00

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