Update all code styles

This commit is contained in:
Cooldude2606
2024-09-28 01:56:54 +01:00
parent 5e2a62ab27
commit 292c1a1b68
194 changed files with 9817 additions and 9703 deletions

View File

@@ -23,279 +23,277 @@ end)
local autofill_container
local function rich_img(type, value)
return '[img='..type..'/'..value..']'
return "[img=" .. type .. "/" .. value .. "]"
end
--- Toggle entity section visibility
-- @element toggle_item_button
local toggle_section =
Gui.element{
type = 'sprite-button',
sprite = 'utility/expand',
tooltip = {'autofill.toggle-section-tooltip'},
style = "frame_action_button",
name = Gui.unique_static_name
}
:style(Gui.sprite_style(20))
:on_click(function(_, element, _)
local header_flow = element.parent
local flow_name = header_flow.caption
local flow = header_flow.parent.parent[flow_name]
if Gui.toggle_visible_state(flow) then
element.sprite = 'utility/collapse'
element.tooltip = {'autofill.toggle-section-collapse-tooltip'}
else
element.sprite = 'utility/expand'
element.tooltip = {'autofill.toggle-section-tooltip'}
end
end)
Gui.element{
type = "sprite-button",
sprite = "utility/expand",
tooltip = { "autofill.toggle-section-tooltip" },
style = "frame_action_button",
name = Gui.unique_static_name,
}
:style(Gui.sprite_style(20))
:on_click(function(_, element, _)
local header_flow = element.parent
local flow_name = header_flow.caption
local flow = header_flow.parent.parent[flow_name]
if Gui.toggle_visible_state(flow) then
element.sprite = "utility/collapse"
element.tooltip = { "autofill.toggle-section-collapse-tooltip" }
else
element.sprite = "utility/expand"
element.tooltip = { "autofill.toggle-section-tooltip" }
end
end)
--- Toggle enitity button, used for toggling autofill for the specific entity
-- All entity autofill settings will be ignored if its disabled
-- @element entity_toggle
local entity_toggle =
Gui.element(function(_, parent, entity_name)
return parent.add{
type = 'sprite-button',
sprite = 'utility/confirm_slot',
tooltip = {'autofill.toggle-entity-tooltip', rich_img('item', entity_name)},
style = 'shortcut_bar_button_green'
}
end)
:style(Gui.sprite_style(22))
:on_click(function(player, element, _)
local entity_name = string.match(element.parent.parent.name,'(.*)%-header')
if not autofill_player_settings[player.name] then return end
local setting = autofill_player_settings[player.name][entity_name]
if not setting then return end
if setting.enabled then
setting.enabled = false
element.sprite = 'utility/close_black'
element.style = 'shortcut_bar_button_red'
else
setting.enabled = true
element.sprite = 'utility/confirm_slot'
element.style = 'shortcut_bar_button_green'
end
-- Correct the button size
local style = element.style
style.padding = -2
style.height = 22
style.width = 22
end)
Gui.element(function(_, parent, entity_name)
return parent.add{
type = "sprite-button",
sprite = "utility/confirm_slot",
tooltip = { "autofill.toggle-entity-tooltip", rich_img("item", entity_name) },
style = "shortcut_bar_button_green",
}
end)
:style(Gui.sprite_style(22))
:on_click(function(player, element, _)
local entity_name = string.match(element.parent.parent.name, "(.*)%-header")
if not autofill_player_settings[player.name] then return end
local setting = autofill_player_settings[player.name][entity_name]
if not setting then return end
if setting.enabled then
setting.enabled = false
element.sprite = "utility/close_black"
element.style = "shortcut_bar_button_red"
else
setting.enabled = true
element.sprite = "utility/confirm_slot"
element.style = "shortcut_bar_button_green"
end
-- Correct the button size
local style = element.style
style.padding = -2
style.height = 22
style.width = 22
end)
--- Draw a section header and main scroll
-- @element autofill_section_container
local section =
Gui.element(function(definition, parent, section_name, table_size)
-- Draw the header for the section
local header = Gui.header(
parent,
{'autofill.toggle-section-caption', rich_img('item', section_name), {'entity-name.'..section_name}},
{'autofill.toggle-section-tooltip'},
true,
section_name..'-header'
)
Gui.element(function(definition, parent, section_name, table_size)
-- Draw the header for the section
local header = Gui.header(
parent,
{ "autofill.toggle-section-caption", rich_img("item", section_name), { "entity-name." .. section_name } },
{ "autofill.toggle-section-tooltip" },
true,
section_name .. "-header"
)
definition:triggers_events(header.parent.header_label)
definition:triggers_events(header.parent.header_label)
-- Right aligned button to toggle the section
header.caption = section_name
entity_toggle(header, section_name)
toggle_section(header)
-- Right aligned button to toggle the section
header.caption = section_name
entity_toggle(header, section_name)
toggle_section(header)
local section_table = parent.add{
type = 'table',
name = section_name,
column_count = table_size
}
local section_table = parent.add{
type = "table",
name = section_name,
column_count = table_size,
}
section_table.visible = false
section_table.visible = false
return definition:no_events(section_table)
end)
:on_click(function(_, element, event)
event.element = element.parent.alignment[toggle_section.name]
toggle_section:raise_event(event)
end)
return definition:no_events(section_table)
end)
:on_click(function(_, element, event)
event.element = element.parent.alignment[toggle_section.name]
toggle_section:raise_event(event)
end)
--- Toggle item button, used for toggling autofill for the specific item
-- @element toggle_item_button
local toggle_item_button =
Gui.element(function(_, parent, item)
return parent.add{
type = 'sprite-button',
sprite = 'item/'..item.name,
tooltip = {'autofill.toggle-tooltip', rich_img('item', item.name), item.category},
style = 'shortcut_bar_button_red'
}
end)
:style(Gui.sprite_style(32, nil, { right_margin = -3 }))
:on_click(function(player, element)
local item_name = element.parent.tooltip
local entity_name = element.parent.parent.parent.name
if not autofill_player_settings[player.name] then return end
local setting = autofill_player_settings[player.name][entity_name]
if not setting then return end
local item = setting.items[item_name]
if not item then return end
if item.enabled then
item.enabled = false
element.style = 'shortcut_bar_button_red'
else
item.enabled = true
element.style = 'shortcut_bar_button_green'
end
-- Correct the button size
local style = element.style
style.right_margin = -3
style.padding = -2
style.height = 32
style.width = 32
end)
Gui.element(function(_, parent, item)
return parent.add{
type = "sprite-button",
sprite = "item/" .. item.name,
tooltip = { "autofill.toggle-tooltip", rich_img("item", item.name), item.category },
style = "shortcut_bar_button_red",
}
end)
:style(Gui.sprite_style(32, nil, { right_margin = -3 }))
:on_click(function(player, element)
local item_name = element.parent.tooltip
local entity_name = element.parent.parent.parent.name
if not autofill_player_settings[player.name] then return end
local setting = autofill_player_settings[player.name][entity_name]
if not setting then return end
local item = setting.items[item_name]
if not item then return end
if item.enabled then
item.enabled = false
element.style = "shortcut_bar_button_red"
else
item.enabled = true
element.style = "shortcut_bar_button_green"
end
-- Correct the button size
local style = element.style
style.right_margin = -3
style.padding = -2
style.height = 32
style.width = 32
end)
--- Amount text field for a autofill item
-- @element amount_textfield
local amount_textfield =
Gui.element(function(_, parent, item)
return parent.add{
type = 'textfield',
text = item.amount,
tooltip = {'autofill.amount-tooltip', item.category },
clear_and_focus_on_right_click = true,
numeric = true,
allow_decimal = false,
allow_negative = false
Gui.element(function(_, parent, item)
return parent.add{
type = "textfield",
text = item.amount,
tooltip = { "autofill.amount-tooltip", item.category },
clear_and_focus_on_right_click = true,
numeric = true,
allow_decimal = false,
allow_negative = false,
}
end)
:style{
maximal_width = 40,
height = 31,
padding = -2,
}
end)
:style{
maximal_width = 40,
height = 31,
padding = -2
}
:on_text_changed(function(player, element, _)
local value = tonumber(element.text)
if not value then value = 0 end
local clamped = math.clamp(value, 0, 1000)
local item_name = element.parent.tooltip
local entity_name = element.parent.parent.parent.name
if not autofill_player_settings[player.name] then return end
local setting = autofill_player_settings[player.name][entity_name]
if not setting then return end
local item = setting.items[item_name]
if not item then return end
item.amount = clamped
if clamped ~= value then
element.text = clamped
player.print{'autofill.invalid', item.amount, rich_img('item', item.name), rich_img('entity', entity_name) }
return
end
end)
:on_text_changed(function(player, element, _)
local value = tonumber(element.text)
if not value then value = 0 end
local clamped = math.clamp(value, 0, 1000)
local item_name = element.parent.tooltip
local entity_name = element.parent.parent.parent.name
if not autofill_player_settings[player.name] then return end
local setting = autofill_player_settings[player.name][entity_name]
if not setting then return end
local item = setting.items[item_name]
if not item then return end
item.amount = clamped
if clamped ~= value then
element.text = clamped
player.print{ "autofill.invalid", item.amount, rich_img("item", item.name), rich_img("entity", entity_name) }
return
end
end)
--- Autofill setting, contains a button and a textbox
-- @element add_autofill_setting
local add_autofill_setting =
Gui.element(function(_, parent, item)
local toggle_flow = parent.add{ type = 'flow', name = 'toggle-setting-'..item.name, tooltip = item.name }
local amount_flow = parent.add{ type = 'flow', name = 'amount-setting-'..item.name, tooltip = item.name }
toggle_flow.style.padding = 0
amount_flow.style.padding = 0
toggle_item_button(toggle_flow, item)
amount_textfield(amount_flow, item)
end)
Gui.element(function(_, parent, item)
local toggle_flow = parent.add{ type = "flow", name = "toggle-setting-" .. item.name, tooltip = item.name }
local amount_flow = parent.add{ type = "flow", name = "amount-setting-" .. item.name, tooltip = item.name }
toggle_flow.style.padding = 0
amount_flow.style.padding = 0
toggle_item_button(toggle_flow, item)
amount_textfield(amount_flow, item)
end)
--- Autofill setting empty, contains filler button and textfield gui elements
-- @element add_empty_autofill_setting
local add_empty_autofill_setting =
Gui.element(function(_, parent)
local toggle_element = parent.add{
type = 'sprite-button'
}
toggle_element.style.right_margin = -3
toggle_element.style.width = 32
toggle_element.style.height = 32
toggle_element.enabled = false
local amount_element = parent.add{
type = 'textfield'
}
amount_element.style.maximal_width = 40
amount_element.style.height = 31
amount_element.style.padding = -2
amount_element.enabled = false
end)
Gui.element(function(_, parent)
local toggle_element = parent.add{
type = "sprite-button",
}
toggle_element.style.right_margin = -3
toggle_element.style.width = 32
toggle_element.style.height = 32
toggle_element.enabled = false
local amount_element = parent.add{
type = "textfield",
}
amount_element.style.maximal_width = 40
amount_element.style.height = 31
amount_element.style.padding = -2
amount_element.enabled = false
end)
--- Main gui container for the left flow
-- @element autofill_container
autofill_container =
Gui.element(function(definition, parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name)
-- Draw the scroll container
local scroll_table = Gui.scroll_table(container, 400, 1, 'autofill-scroll-table')
-- Set the scroll panel to always show the scrollbar (not doing this will result in a changing gui size)
scroll_table.parent.vertical_scroll_policy = 'always'
-- Scroll panel has by default padding
scroll_table.parent.style.padding = 0
-- Remove the default gap that is added in a table between elements
scroll_table.style.vertical_spacing = 0
-- Center the first collumn in the table
scroll_table.style.column_alignments[1] = 'center'
-- Loop over each default entity config
for _, setting in pairs(config.default_entities) do
local table_sizes = {}
local tables = {}
-- Draw a section for the element
local entity_table = section(scroll_table, setting.entity, 3)
-- Add some padding around the table
entity_table.style.padding = 3
-- Make sure each collumn is alignment top center
entity_table.style.column_alignments[1] = 'top-center'
entity_table.style.column_alignments[2] = 'top-center'
entity_table.style.column_alignments[3] = 'top-center'
-- Loop over each item category
for _, category in pairs(config.categories) do
if not table_sizes[category] then table_sizes[category] = 0 end
-- Draw table
local category_table = entity_table.add{
type = 'table',
name = category..'-category',
column_count = 2
}
-- Add padding between each item
category_table.style.vertical_spacing = 1
tables[category] = category_table
-- Add item autofill setting gui elements to the table
for _, item in pairs(setting.items) do
if item.category == category then
add_autofill_setting(category_table, item)
table_sizes[category] = table_sizes[category] + 1
Gui.element(function(definition, parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name)
-- Draw the scroll container
local scroll_table = Gui.scroll_table(container, 400, 1, "autofill-scroll-table")
-- Set the scroll panel to always show the scrollbar (not doing this will result in a changing gui size)
scroll_table.parent.vertical_scroll_policy = "always"
-- Scroll panel has by default padding
scroll_table.parent.style.padding = 0
-- Remove the default gap that is added in a table between elements
scroll_table.style.vertical_spacing = 0
-- Center the first collumn in the table
scroll_table.style.column_alignments[1] = "center"
-- Loop over each default entity config
for _, setting in pairs(config.default_entities) do
local table_sizes = {}
local tables = {}
-- Draw a section for the element
local entity_table = section(scroll_table, setting.entity, 3)
-- Add some padding around the table
entity_table.style.padding = 3
-- Make sure each collumn is alignment top center
entity_table.style.column_alignments[1] = "top-center"
entity_table.style.column_alignments[2] = "top-center"
entity_table.style.column_alignments[3] = "top-center"
-- Loop over each item category
for _, category in pairs(config.categories) do
if not table_sizes[category] then table_sizes[category] = 0 end
-- Draw table
local category_table = entity_table.add{
type = "table",
name = category .. "-category",
column_count = 2,
}
-- Add padding between each item
category_table.style.vertical_spacing = 1
tables[category] = category_table
-- Add item autofill setting gui elements to the table
for _, item in pairs(setting.items) do
if item.category == category then
add_autofill_setting(category_table, item)
table_sizes[category] = table_sizes[category] + 1
end
end
end
-- Add empty gui elements for the categories with less items than the other categories
local t = table.get_values(table_sizes)
table.sort(t)
local biggest = t[#t]
for category, size in pairs(table_sizes) do
for i = biggest - size, 1, -1 do
add_empty_autofill_setting(tables[category])
end
end
end
-- Add empty gui elements for the categories with less items than the other categories
local t = table.get_values(table_sizes)
table.sort(t)
local biggest = t[#t]
for category, size in pairs(table_sizes) do
for i=biggest-size,1,-1 do
add_empty_autofill_setting(tables[category])
end
end
end
-- Return the external container
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
-- Return the external container
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
--- Button on the top flow used to toggle autofill container
-- @element autofill_toggle
Gui.left_toolbar_button(config.icon, {'autofill.main-tooltip'}, autofill_container, function(player)
return Roles.player_allowed(player, 'gui/autofill')
Gui.left_toolbar_button(config.icon, { "autofill.main-tooltip" }, autofill_container, function(player)
return Roles.player_allowed(player, "gui/autofill")
end)
--- When a player is created make sure they have the default autofill settings
@@ -341,19 +339,19 @@ local function entity_build(event)
if item_amount ~= 0 then
local inserted
text_position.y = text_position.y - 0.5
local color = { r = 0, g = 255, b = 0, a = 1}
local color = { r = 0, g = 255, b = 0, a = 1 }
if item_amount >= preferd_amount then
-- Can item be inserted? no, goto next item!
if not entity_inventory.can_insert{name=item.name, count=preferd_amount} then
if not entity_inventory.can_insert{ name = item.name, count = preferd_amount } then
goto end_item
end
inserted = entity_inventory.insert{name=item.name, count=preferd_amount}
inserted = entity_inventory.insert{ name = item.name, count = preferd_amount }
else
inserted = entity_inventory.insert{name=item.name, count=item_amount}
color = { r = 255, g = 165, b = 0, a = 1}
inserted = entity_inventory.insert{ name = item.name, count = item_amount }
color = { r = 255, g = 165, b = 0, a = 1 }
end
player_inventory.remove{name=item.name, count=inserted}
print_text(entity.surface, text_position, {'autofill.inserted', inserted, rich_img('item', item.name), rich_img('entity', entity.name) }, color)
player_inventory.remove{ name = item.name, count = inserted }
print_text(entity.surface, text_position, { "autofill.inserted", inserted, rich_img("item", item.name), rich_img("entity", entity.name) }, color)
end
::end_item::
end

View File

@@ -13,25 +13,26 @@ local bonus_container
local function bonus_gui_pts_needed(player)
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container['bonus_st_2'].disp.table
local disp = frame.container["bonus_st_2"].disp.table
local total = 0
for k, v in pairs(config.conversion) do
total = total + (disp['bonus_display_' .. k .. '_slider'].slider_value / config.player_bonus[v].cost_scale * config.player_bonus[v].cost)
total = total + (disp["bonus_display_" .. k .. "_slider"].slider_value / config.player_bonus[v].cost_scale * config.player_bonus[v].cost)
end
total = total + (disp['bonus_display_personal_battery_recharge_slider'].slider_value / config.player_special_bonus['personal_battery_recharge'].cost_scale * config.player_special_bonus['personal_battery_recharge'].cost)
total = total +
(disp["bonus_display_personal_battery_recharge_slider"].slider_value / config.player_special_bonus["personal_battery_recharge"].cost_scale * config.player_special_bonus["personal_battery_recharge"].cost)
return total
end
local function apply_bonus(player)
if not Roles.player_allowed(player, 'gui/bonus') then
if not Roles.player_allowed(player, "gui/bonus") then
for k, v in pairs(config.player_bonus) do
player[k] = 0
if v.combined_bonus then
for i=1, #v.combined_bonus do
for i = 1, #v.combined_bonus do
player[v.combined_bonus[i]] = 0
end
end
@@ -45,21 +46,21 @@ local function apply_bonus(player)
end
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container['bonus_st_2'].disp.table
local disp = frame.container["bonus_st_2"].disp.table
for k, v in pairs(config.conversion) do
player[v] = disp['bonus_display_' .. k .. '_slider'].slider_value
player[v] = disp["bonus_display_" .. k .. "_slider"].slider_value
if config.player_bonus[v].combined_bonus then
for i=1, #config.player_bonus[v].combined_bonus do
player[config.player_bonus[v].combined_bonus[i]] = disp['bonus_display_' .. k .. '_slider'].slider_value
for i = 1, #config.player_bonus[v].combined_bonus do
player[config.player_bonus[v].combined_bonus[i]] = disp["bonus_display_" .. k .. "_slider"].slider_value
end
end
end
end
local function apply_periodic_bonus(player)
if not Roles.player_allowed(player, 'gui/bonus') then
if not Roles.player_allowed(player, "gui/bonus") then
return
end
@@ -68,19 +69,19 @@ local function apply_periodic_bonus(player)
end
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container['bonus_st_2'].disp.table
local disp = frame.container["bonus_st_2"].disp.table
if vlayer.get_statistics()['energy_sustained'] > 0 then
if vlayer.get_statistics()["energy_sustained"] > 0 then
local armor = player.get_inventory(defines.inventory.character_armor)[1].grid
if armor then
local slider = disp['bonus_display_personal_battery_recharge_slider'].slider_value * 100000 * config.player_special_bonus_rate / 6
local slider = disp["bonus_display_personal_battery_recharge_slider"].slider_value * 100000 * config.player_special_bonus_rate / 6
for i=1, #armor.equipment do
for i = 1, #armor.equipment do
if armor.equipment[i].energy < armor.equipment[i].max_energy then
local energy_required = math.min(math.floor(armor.equipment[i].max_energy - armor.equipment[i].energy), vlayer.get_statistics()['energy_storage'], slider)
local energy_required = math.min(math.floor(armor.equipment[i].max_energy - armor.equipment[i].energy), vlayer.get_statistics()["energy_storage"], slider)
armor.equipment[i].energy = armor.equipment[i].energy + energy_required
vlayer.energy_changed(- energy_required)
vlayer.energy_changed(-energy_required)
slider = slider - energy_required
end
@@ -92,250 +93,248 @@ end
--- Control label for the bonus points available
-- @element bonus_gui_control_pts_a
local bonus_gui_control_pts_a =
Gui.element{
type = 'label',
name = 'bonus_control_pts_a',
caption = {'bonus.control-pts-a'},
style = 'heading_2_label'
}:style{
width = config.gui_display_width['half']
}
Gui.element{
type = "label",
name = "bonus_control_pts_a",
caption = { "bonus.control-pts-a" },
style = "heading_2_label",
}:style{
width = config.gui_display_width["half"],
}
local bonus_gui_control_pts_a_count =
Gui.element{
type = 'label',
name = 'bonus_control_pts_a_count',
caption = config.pts.base,
style = 'heading_2_label'
}:style{
width = config.gui_display_width['half']
}
Gui.element{
type = "label",
name = "bonus_control_pts_a_count",
caption = config.pts.base,
style = "heading_2_label",
}:style{
width = config.gui_display_width["half"],
}
--- Control label for the bonus points needed
-- @element bonus_gui_control_pts_n
local bonus_gui_control_pts_n =
Gui.element{
type = 'label',
name = 'bonus_control_pts_n',
caption = {'bonus.control-pts-n'},
style = 'heading_2_label'
}:style{
width = config.gui_display_width['half']
}
Gui.element{
type = "label",
name = "bonus_control_pts_n",
caption = { "bonus.control-pts-n" },
style = "heading_2_label",
}:style{
width = config.gui_display_width["half"],
}
local bonus_gui_control_pts_n_count =
Gui.element{
type = 'label',
name = 'bonus_control_pts_n_count',
caption = '0',
style = 'heading_2_label'
}:style{
width =config.gui_display_width['half']
}
Gui.element{
type = "label",
name = "bonus_control_pts_n_count",
caption = "0",
style = "heading_2_label",
}:style{
width = config.gui_display_width["half"],
}
--- Control label for the bonus points remaining
-- @element bonus_gui_control_pts_r
local bonus_gui_control_pts_r =
Gui.element{
type = 'label',
name = 'bonus_control_pts_r',
caption = {'bonus.control-pts-r'},
style = 'heading_2_label'
}:style{
width = config.gui_display_width['half']
}
Gui.element{
type = "label",
name = "bonus_control_pts_r",
caption = { "bonus.control-pts-r" },
style = "heading_2_label",
}:style{
width = config.gui_display_width["half"],
}
local bonus_gui_control_pts_r_count =
Gui.element{
type = 'label',
name = 'bonus_control_pts_r_count',
caption = '0',
style = 'heading_2_label'
}:style{
width = config.gui_display_width['half']
}
Gui.element{
type = "label",
name = "bonus_control_pts_r_count",
caption = "0",
style = "heading_2_label",
}:style{
width = config.gui_display_width["half"],
}
--- A button used for pts calculations
-- @element bonus_gui_control_refresh
local bonus_gui_control_reset =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = {'bonus.control-reset'}
}:style{
width = config.gui_display_width['half']
}:on_click(function(player, element, _)
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container['bonus_st_2'].disp.table
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "bonus.control-reset" },
}:style{
width = config.gui_display_width["half"],
}:on_click(function(player, element, _)
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container["bonus_st_2"].disp.table
for k, v in pairs(config.conversion) do
local s = 'bonus_display_' .. k .. '_slider'
disp[s].slider_value = config.player_bonus[v].value
for k, v in pairs(config.conversion) do
local s = "bonus_display_" .. k .. "_slider"
disp[s].slider_value = config.player_bonus[v].value
if config.player_bonus[v].is_percentage then
disp[disp[s].tags.counter].caption = format_number(disp[s].slider_value * 100) .. ' %'
else
disp[disp[s].tags.counter].caption = format_number(disp[s].slider_value)
if config.player_bonus[v].is_percentage then
disp[disp[s].tags.counter].caption = format_number(disp[s].slider_value * 100) .. " %"
else
disp[disp[s].tags.counter].caption = format_number(disp[s].slider_value)
end
end
end
local slider = disp['bonus_display_personal_battery_recharge_slider']
slider.slider_value = config.player_special_bonus['personal_battery_recharge'].value
disp[slider.tags.counter].caption = format_number(slider.slider_value)
local slider = disp["bonus_display_personal_battery_recharge_slider"]
slider.slider_value = config.player_special_bonus["personal_battery_recharge"].value
disp[slider.tags.counter].caption = format_number(slider.slider_value)
local r = bonus_gui_pts_needed(player)
element.parent[bonus_gui_control_pts_n_count.name].caption = r
element.parent[bonus_gui_control_pts_r_count.name].caption = tonumber(element.parent[bonus_gui_control_pts_a_count.name].caption) - r
end)
local r = bonus_gui_pts_needed(player)
element.parent[bonus_gui_control_pts_n_count.name].caption = r
element.parent[bonus_gui_control_pts_r_count.name].caption = tonumber(element.parent[bonus_gui_control_pts_a_count.name].caption) - r
end)
--- A button used for pts apply
-- @element bonus_gui_control_apply
local bonus_gui_control_apply =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = {'bonus.control-apply'}
}:style{
width = config.gui_display_width['half']
}:on_click(function(player, element, _)
local n = bonus_gui_pts_needed(player)
element.parent[bonus_gui_control_pts_n_count.name].caption = n
local r = tonumber(element.parent[bonus_gui_control_pts_a_count.name].caption) - n
element.parent[bonus_gui_control_pts_r_count.name].caption = r
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "bonus.control-apply" },
}:style{
width = config.gui_display_width["half"],
}:on_click(function(player, element, _)
local n = bonus_gui_pts_needed(player)
element.parent[bonus_gui_control_pts_n_count.name].caption = n
local r = tonumber(element.parent[bonus_gui_control_pts_a_count.name].caption) - n
element.parent[bonus_gui_control_pts_r_count.name].caption = r
if r >= 0 then
apply_bonus(player)
end
end)
if r >= 0 then
apply_bonus(player)
end
end)
--- A vertical flow containing all the bonus control
-- @element bonus_control_set
local bonus_control_set =
Gui.element(function(_, parent, name)
local bonus_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(bonus_set, config.gui_display_width['half'] * 2, 2, 'disp')
Gui.element(function(_, parent, name)
local bonus_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(bonus_set, config.gui_display_width["half"] * 2, 2, "disp")
bonus_gui_control_pts_a(disp)
bonus_gui_control_pts_a_count(disp)
bonus_gui_control_pts_a(disp)
bonus_gui_control_pts_a_count(disp)
bonus_gui_control_pts_n(disp)
bonus_gui_control_pts_n_count(disp)
bonus_gui_control_pts_n(disp)
bonus_gui_control_pts_n_count(disp)
bonus_gui_control_pts_r(disp)
bonus_gui_control_pts_r_count(disp)
bonus_gui_control_pts_r(disp)
bonus_gui_control_pts_r_count(disp)
bonus_gui_control_reset(disp)
bonus_gui_control_apply(disp)
bonus_gui_control_reset(disp)
bonus_gui_control_apply(disp)
return bonus_set
end)
return bonus_set
end)
--- Display group
-- @element bonus_gui_slider
local bonus_gui_slider =
Gui.element(function(_definition, parent, name, caption, tooltip, bonus)
local label = parent.add{
type = 'label',
caption = caption,
tooltip = tooltip,
style = 'heading_2_label'
}
label.style.width = config.gui_display_width['label']
local value = bonus.value
if bonus.is_percentage then
value = format_number(value * 100) .. ' %'
else
value = format_number(value)
end
local slider = parent.add{
type = 'slider',
name = name .. '_slider',
value = bonus.value,
maximum_value = bonus.max,
value_step = bonus.scale,
discrete_values = true,
style = 'notched_slider',
tags = {
counter = name .. '_count',
is_percentage = bonus.is_percentage
Gui.element(function(_definition, parent, name, caption, tooltip, bonus)
local label = parent.add{
type = "label",
caption = caption,
tooltip = tooltip,
style = "heading_2_label",
}
}
slider.style.width = config.gui_display_width['slider']
slider.style.horizontally_stretchable = true
label.style.width = config.gui_display_width["label"]
local count = parent.add{
type = 'label',
name = name .. '_count',
caption = value,
style = 'heading_2_label',
}
count.style.width = config.gui_display_width['count']
local value = bonus.value
return slider
end)
:on_value_changed(function(player, element, _event)
if element.tags.is_percentage then
element.parent[element.tags.counter].caption = format_number(element.slider_value * 100) .. ' %'
if bonus.is_percentage then
value = format_number(value * 100) .. " %"
else
value = format_number(value)
end
else
element.parent[element.tags.counter].caption = format_number(element.slider_value)
end
local slider = parent.add{
type = "slider",
name = name .. "_slider",
value = bonus.value,
maximum_value = bonus.max,
value_step = bonus.scale,
discrete_values = true,
style = "notched_slider",
tags = {
counter = name .. "_count",
is_percentage = bonus.is_percentage,
},
}
slider.style.width = config.gui_display_width["slider"]
slider.style.horizontally_stretchable = true
local r = bonus_gui_pts_needed(player)
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container['bonus_st_1'].disp.table
disp[bonus_gui_control_pts_n_count.name].caption = r
disp[bonus_gui_control_pts_r_count.name].caption = tonumber(disp[bonus_gui_control_pts_a_count.name].caption) - r
end)
local count = parent.add{
type = "label",
name = name .. "_count",
caption = value,
style = "heading_2_label",
}
count.style.width = config.gui_display_width["count"]
return slider
end)
:on_value_changed(function(player, element, _event)
if element.tags.is_percentage then
element.parent[element.tags.counter].caption = format_number(element.slider_value * 100) .. " %"
else
element.parent[element.tags.counter].caption = format_number(element.slider_value)
end
local r = bonus_gui_pts_needed(player)
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container["bonus_st_1"].disp.table
disp[bonus_gui_control_pts_n_count.name].caption = r
disp[bonus_gui_control_pts_r_count.name].caption = tonumber(disp[bonus_gui_control_pts_a_count.name].caption) - r
end)
--- A vertical flow containing all the bonus data
-- @element bonus_data_set
local bonus_data_set =
Gui.element(function(_, parent, name)
local bonus_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(bonus_set, config.gui_display_width['half'] * 2, 3, 'disp')
Gui.element(function(_, parent, name)
local bonus_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(bonus_set, config.gui_display_width["half"] * 2, 3, "disp")
for k, v in pairs(config.conversion) do
bonus_gui_slider(disp, 'bonus_display_' .. k, {'bonus.display-' .. k}, {'bonus.display-' .. k .. '-tooltip'}, config.player_bonus[v])
end
for k, v in pairs(config.conversion) do
bonus_gui_slider(disp, "bonus_display_" .. k, { "bonus.display-" .. k }, { "bonus.display-" .. k .. "-tooltip" }, config.player_bonus[v])
end
bonus_gui_slider(disp, 'bonus_display_personal_battery_recharge', {'bonus.display-personal-battery-recharge'}, {'bonus.display-personal-battery-recharge-tooltip'}, config.player_special_bonus['personal_battery_recharge'])
bonus_gui_slider(disp, "bonus_display_personal_battery_recharge", { "bonus.display-personal-battery-recharge" }, { "bonus.display-personal-battery-recharge-tooltip" },
config.player_special_bonus["personal_battery_recharge"])
return bonus_set
end)
return bonus_set
end)
--- The main container for the bonus gui
-- @element bonus_container
bonus_container =
Gui.element(function(definition, parent)
local player = Gui.get_player_from_element(parent)
local container = Gui.container(parent, definition.name, config.gui_display_width['half'] * 2)
Gui.element(function(definition, parent)
local player = Gui.get_player_from_element(parent)
local container = Gui.container(parent, definition.name, config.gui_display_width["half"] * 2)
bonus_control_set(container, 'bonus_st_1')
bonus_data_set(container, 'bonus_st_2')
bonus_control_set(container, "bonus_st_1")
bonus_data_set(container, "bonus_st_2")
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container['bonus_st_1'].disp.table
local n = bonus_gui_pts_needed(player)
disp[bonus_gui_control_pts_n_count.name].caption = n
local r = tonumber(disp[bonus_gui_control_pts_a_count.name].caption) - n
disp[bonus_gui_control_pts_r_count.name].caption = r
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container["bonus_st_1"].disp.table
local n = bonus_gui_pts_needed(player)
disp[bonus_gui_control_pts_n_count.name].caption = n
local r = tonumber(disp[bonus_gui_control_pts_a_count.name].caption) - n
disp[bonus_gui_control_pts_r_count.name].caption = r
apply_bonus(player)
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
apply_bonus(player)
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
--- Button on the top flow used to toggle the bonus container
-- @element toggle_left_element
Gui.left_toolbar_button('item/exoskeleton-equipment', {'bonus.main-tooltip'}, bonus_container, function(player)
return Roles.player_allowed(player, 'gui/bonus')
Gui.left_toolbar_button("item/exoskeleton-equipment", { "bonus.main-tooltip" }, bonus_container, function(player)
return Roles.player_allowed(player, "gui/bonus")
end)
Event.add(defines.events.on_player_created, function(event)
@@ -364,7 +363,7 @@ end)
Event.add(defines.events.on_player_respawned, function(event)
local player = game.players[event.player_index]
local frame = Gui.get_left_element(player, bonus_container)
local disp = frame.container['bonus_st_1'].disp.table
local disp = frame.container["bonus_st_1"].disp.table
local n = bonus_gui_pts_needed(player)
disp[bonus_gui_control_pts_n_count.name].caption = n
local r = tonumber(disp[bonus_gui_control_pts_a_count.name].caption) - n
@@ -379,7 +378,7 @@ end)
Event.add(defines.events.on_player_died, function(event)
local player = game.players[event.player_index]
if Roles.player_has_flag(player, 'instant-respawn') then
if Roles.player_has_flag(player, "instant-respawn") then
player.ticks_to_respawn = 120
end
end)

View File

@@ -30,7 +30,7 @@ local ignore = {
type = true,
xpcall = true,
_VERSION = true,
['module'] = true,
["module"] = true,
require = true,
package = true,
unpack = true,
@@ -51,31 +51,31 @@ local ignore = {
util = true,
mod_gui = true,
game = true,
rendering = true
rendering = true,
}
local header_name = Gui.uid_name()
local left_panel_name = Gui.uid_name()
local right_panel_name = Gui.uid_name()
Public.name = '_G'
Public.name = "_G"
function Public.show(container)
local main_flow = container.add {type = 'flow', direction = 'horizontal'}
local main_flow = container.add{ type = "flow", direction = "horizontal" }
local left_panel = main_flow.add {type = 'scroll-pane', name = left_panel_name}
local left_panel = main_flow.add{ type = "scroll-pane", name = left_panel_name }
local left_panel_style = left_panel.style
left_panel_style.width = 300
for key, value in pairs(_G) do
if not ignore[key] then
local header =
left_panel.add({type = 'flow'}).add {type = 'label', name = header_name, caption = tostring(key)}
left_panel.add{ type = "flow" }.add{ type = "label", name = header_name, caption = tostring(key) }
Gui.set_data(header, value)
end
end
local right_panel = main_flow.add {type = 'text-box', name = right_panel_name}
local right_panel = main_flow.add{ type = "text-box", name = right_panel_name }
right_panel.read_only = true
right_panel.selectable = true
@@ -85,7 +85,7 @@ function Public.show(container)
right_panel_style.maximal_width = 1000
right_panel_style.maximal_height = 1000
Gui.set_data(left_panel, {right_panel = right_panel, selected_header = nil})
Gui.set_data(left_panel, { right_panel = right_panel, selected_header = nil })
end
Gui.on_click(

View File

@@ -13,7 +13,7 @@ local events_to_keep = 10
-- Local vars
local Public = {
name = 'Events'
name = "Events",
}
local name_lookup = {}
@@ -28,7 +28,7 @@ local last_events = {}
storage.debug_event_view = {
enabled = enabled,
last_events = last_events,
filter = ''
filter = "",
}
function Public.on_open_debug()
@@ -42,7 +42,7 @@ function Public.on_open_debug()
storage.debug_event_view = {
enabled = enabled,
last_events = last_events
last_events = last_events,
}
end
@@ -65,7 +65,7 @@ local function event_callback(event)
last_events[name][events_to_keep + 1] = nil
event.name = nil
local str = format('%s (id = %s): %s', name, id, Model.dump(event))
local str = format("%s (id = %s): %s", name, id, Model.dump(event))
game.print(str)
log(str)
end
@@ -95,13 +95,13 @@ table.sort(grid_builder)
local function redraw_event_table(gui_table, filter)
for _, event_name in pairs(grid_builder) do
if filter == '' or event_name:find(filter) then
if filter == "" or event_name:find(filter) then
local index = events[event_name]
gui_table.add({type = 'flow'}).add {
gui_table.add{ type = "flow" }.add{
name = checkbox_name,
type = 'checkbox',
type = "checkbox",
state = enabled[index] or false,
caption = event_name
caption = event_name,
}
end
end
@@ -110,18 +110,18 @@ end
function Public.show(container)
local filter = storage.debug_event_view.filter
local main_frame_flow = container.add({type = 'flow', direction = 'vertical'})
local main_frame_flow = container.add{ type = "flow", direction = "vertical" }
local filter_flow = main_frame_flow.add({type = 'flow', direction = 'horizontal'})
filter_flow.add({type = 'label', caption = 'filter'})
local filter_textfield = filter_flow.add({type = 'textfield', name = filter_name, text = filter})
local clear_button = filter_flow.add({type = 'button', name = clear_filter_name, caption = 'clear'})
local filter_flow = main_frame_flow.add{ type = "flow", direction = "horizontal" }
filter_flow.add{ type = "label", caption = "filter" }
local filter_textfield = filter_flow.add{ type = "textfield", name = filter_name, text = filter }
local clear_button = filter_flow.add{ type = "button", name = clear_filter_name, caption = "clear" }
local scroll_pane = main_frame_flow.add({type = 'scroll-pane'})
local gui_table = scroll_pane.add({type = 'table', column_count = 3, draw_horizontal_lines = true})
local scroll_pane = main_frame_flow.add{ type = "scroll-pane" }
local gui_table = scroll_pane.add{ type = "table", column_count = 3, draw_horizontal_lines = true }
Gui.set_data(filter_textfield, gui_table)
Gui.set_data(clear_button, {gui_table = gui_table, filter_textfield = filter_textfield})
Gui.set_data(clear_button, { gui_table = gui_table, filter_textfield = filter_textfield })
redraw_event_table(gui_table, filter)
end
@@ -134,7 +134,7 @@ Gui.on_text_changed(
local element = event.element
local gui_table = Gui.get_data(element)
local filter = element.text:gsub(' ', '_')
local filter = element.text:gsub(" ", "_")
storage.debug_event_view.filter = filter
element.text = filter
@@ -152,11 +152,11 @@ Gui.on_click(
local filter_textfield = data.filter_textfield
local gui_table = data.gui_table
filter_textfield.text = ''
storage.debug_event_view.filter = ''
filter_textfield.text = ""
storage.debug_event_view.filter = ""
gui_table.clear()
redraw_event_table(gui_table, '')
redraw_event_table(gui_table, "")
end
)

View File

@@ -14,37 +14,37 @@ local right_panel_name = Gui.uid_name()
local input_text_box_name = Gui.uid_name()
local refresh_name = Gui.uid_name()
Public.name = 'Datastore'
Public.name = "Datastore"
function Public.show(container)
local main_flow = container.add {type = 'flow', direction = 'horizontal'}
local main_flow = container.add{ type = "flow", direction = "horizontal" }
local left_panel = main_flow.add {type = 'scroll-pane', name = left_panel_name}
local left_panel = main_flow.add{ type = "scroll-pane", name = left_panel_name }
local left_panel_style = left_panel.style
left_panel_style.width = 300
for name in pairs(table.keysort(Datastore.debug())) do
local header = left_panel.add({type = 'flow'}).add {type = 'label', name = header_name, caption = name}
local header = left_panel.add{ type = "flow" }.add{ type = "label", name = header_name, caption = name }
Gui.set_data(header, name)
end
local right_flow = main_flow.add {type = 'flow', direction = 'vertical'}
local right_flow = main_flow.add{ type = "flow", direction = "vertical" }
local right_top_flow = right_flow.add {type = 'flow', direction = 'horizontal'}
local right_top_flow = right_flow.add{ type = "flow", direction = "horizontal" }
local input_text_box = right_top_flow.add {type = 'text-box', name = input_text_box_name}
local input_text_box = right_top_flow.add{ type = "text-box", name = input_text_box_name }
local input_text_box_style = input_text_box.style
input_text_box_style.horizontally_stretchable = true
input_text_box_style.height = 32
input_text_box_style.maximal_width = 1000
local refresh_button =
right_top_flow.add {type = 'sprite-button', name = refresh_name, sprite = 'utility/reset', tooltip = 'refresh'}
right_top_flow.add{ type = "sprite-button", name = refresh_name, sprite = "utility/reset", tooltip = "refresh" }
local refresh_button_style = refresh_button.style
refresh_button_style.width = 32
refresh_button_style.height = 32
local right_panel = right_flow.add {type = 'text-box', name = right_panel_name}
local right_panel = right_flow.add{ type = "text-box", name = right_panel_name }
right_panel.read_only = true
right_panel.selectable = true
@@ -57,7 +57,7 @@ function Public.show(container)
local data = {
right_panel = right_panel,
input_text_box = input_text_box,
selected_header = nil
selected_header = nil,
}
Gui.set_data(input_text_box, data)
@@ -90,9 +90,10 @@ Gui.on_click(
local content = Datastore.debug(tableName)
local content_string = {}
for key, value in pairs(content) do
content_string[#content_string+1] = key:gsub('^%l', string.upper)..' = '..dump(value)
content_string[#content_string + 1] = key:gsub("^%l", string.upper) .. " = " .. dump(value)
end
right_panel.text = concat(content_string, '\n')
right_panel.text = concat(content_string, "\n")
end
)
@@ -100,9 +101,10 @@ local function update_dump(text_input, data)
local content = Datastore.debug(text_input.text)
local content_string = {}
for key, value in pairs(content) do
content_string[#content_string+1] = key:gsub('^%l', string.upper)..' = '..dump(value)
content_string[#content_string + 1] = key:gsub("^%l", string.upper) .. " = " .. dump(value)
end
data.right_panel.text = concat(content_string, '\n')
data.right_panel.text = concat(content_string, "\n")
end
Gui.on_text_changed(

View File

@@ -15,37 +15,37 @@ local right_panel_name = Gui.uid_name()
local input_text_box_name = Gui.uid_name()
local refresh_name = Gui.uid_name()
Public.name = 'Elements'
Public.name = "Elements"
function Public.show(container)
local main_flow = container.add {type = 'flow', direction = 'horizontal'}
local main_flow = container.add{ type = "flow", direction = "horizontal" }
local left_panel = main_flow.add {type = 'scroll-pane', name = left_panel_name}
local left_panel = main_flow.add{ type = "scroll-pane", name = left_panel_name }
local left_panel_style = left_panel.style
left_panel_style.width = 300
for element_id, file_path in pairs(ExpGui.file_paths) do
local header = left_panel.add({type = 'flow'}).add {type = 'label', name = header_name, caption = element_id..' - '..file_path}
local header = left_panel.add{ type = "flow" }.add{ type = "label", name = header_name, caption = element_id .. " - " .. file_path }
Gui.set_data(header, element_id)
end
local right_flow = main_flow.add {type = 'flow', direction = 'vertical'}
local right_flow = main_flow.add{ type = "flow", direction = "vertical" }
local right_top_flow = right_flow.add {type = 'flow', direction = 'horizontal'}
local right_top_flow = right_flow.add{ type = "flow", direction = "horizontal" }
local input_text_box = right_top_flow.add {type = 'text-box', name = input_text_box_name}
local input_text_box = right_top_flow.add{ type = "text-box", name = input_text_box_name }
local input_text_box_style = input_text_box.style
input_text_box_style.horizontally_stretchable = true
input_text_box_style.height = 32
input_text_box_style.maximal_width = 1000
local refresh_button =
right_top_flow.add {type = 'sprite-button', name = refresh_name, sprite = 'utility/reset', tooltip = 'refresh'}
right_top_flow.add{ type = "sprite-button", name = refresh_name, sprite = "utility/reset", tooltip = "refresh" }
local refresh_button_style = refresh_button.style
refresh_button_style.width = 32
refresh_button_style.height = 32
local right_panel = right_flow.add {type = 'text-box', name = right_panel_name}
local right_panel = right_flow.add{ type = "text-box", name = right_panel_name }
right_panel.read_only = true
right_panel.selectable = true
@@ -58,7 +58,7 @@ function Public.show(container)
local data = {
right_panel = right_panel,
input_text_box = input_text_box,
selected_header = nil
selected_header = nil,
}
Gui.set_data(input_text_box, data)
@@ -85,10 +85,10 @@ Gui.on_click(
element.style.font_color = Color.orange
data.selected_header = element
input_text_box.text = concat {'Gui.defines[', element_id, ']'}
input_text_box.text = concat{ "Gui.defines[", element_id, "]" }
input_text_box.style.font_color = Color.black
local content = dump(ExpGui.debug_info[element_id]) or 'nil'
local content = dump(ExpGui.debug_info[element_id]) or "nil"
right_panel.text = content
end
)

View File

@@ -8,7 +8,7 @@ local concat = table.concat
local Public = {}
local ignore = {tokens = true, data_store = true, datastores = true}
local ignore = { tokens = true, data_store = true, datastores = true }
local header_name = Gui.uid_name()
local left_panel_name = Gui.uid_name()
@@ -16,40 +16,40 @@ local right_panel_name = Gui.uid_name()
local input_text_box_name = Gui.uid_name()
local refresh_name = Gui.uid_name()
Public.name = 'storage'
Public.name = "storage"
function Public.show(container)
local main_flow = container.add {type = 'flow', direction = 'horizontal'}
local main_flow = container.add{ type = "flow", direction = "horizontal" }
local left_panel = main_flow.add {type = 'scroll-pane', name = left_panel_name}
local left_panel = main_flow.add{ type = "scroll-pane", name = left_panel_name }
local left_panel_style = left_panel.style
left_panel_style.width = 300
for key, _ in pairs(storage) do
if not ignore[key] then
local header =
left_panel.add({type = 'flow'}).add {type = 'label', name = header_name, caption = tostring(key)}
left_panel.add{ type = "flow" }.add{ type = "label", name = header_name, caption = tostring(key) }
Gui.set_data(header, key)
end
end
local right_flow = main_flow.add {type = 'flow', direction = 'vertical'}
local right_flow = main_flow.add{ type = "flow", direction = "vertical" }
local right_top_flow = right_flow.add {type = 'flow', direction = 'horizontal'}
local right_top_flow = right_flow.add{ type = "flow", direction = "horizontal" }
local input_text_box = right_top_flow.add {type = 'text-box', name = input_text_box_name}
local input_text_box = right_top_flow.add{ type = "text-box", name = input_text_box_name }
local input_text_box_style = input_text_box.style
input_text_box_style.horizontally_stretchable = true
input_text_box_style.height = 32
input_text_box_style.maximal_width = 1000
local refresh_button =
right_top_flow.add {type = 'sprite-button', name = refresh_name, sprite = 'utility/reset', tooltip = 'refresh'}
right_top_flow.add{ type = "sprite-button", name = refresh_name, sprite = "utility/reset", tooltip = "refresh" }
local refresh_button_style = refresh_button.style
refresh_button_style.width = 32
refresh_button_style.height = 32
local right_panel = right_flow.add {type = 'text-box', name = right_panel_name}
local right_panel = right_flow.add{ type = "text-box", name = right_panel_name }
right_panel.read_only = true
right_panel.selectable = true
@@ -63,7 +63,7 @@ function Public.show(container)
right_panel = right_panel,
input_text_box = input_text_box,
selected_header = nil,
selected_token_id = nil
selected_token_id = nil,
}
Gui.set_data(input_text_box, data)
@@ -90,10 +90,10 @@ Gui.on_click(
element.style.font_color = Color.orange
data.selected_header = element
input_text_box.text = concat {"storage['", key, "']"}
input_text_box.text = concat{ "storage['", key, "']" }
input_text_box.style.font_color = Color.black
local content = dump(storage[key]) or 'nil'
local content = dump(storage[key]) or "nil"
right_panel.text = content
end
)

View File

@@ -10,7 +10,7 @@ local pages = {
require("modules.exp_legacy.modules.gui.debug.global_view"),
require("modules.exp_legacy.modules.gui.debug.package_view"),
require("modules.exp_legacy.modules.gui.debug._g_view"),
require("modules.exp_legacy.modules.gui.debug.event_view")
require("modules.exp_legacy.modules.gui.debug.event_view"),
}
local main_frame_name = Gui.uid_name()
@@ -40,23 +40,23 @@ function Public.open_dubug(player)
frame.auto_center = true
]]
frame = center.add {type = 'frame', name = main_frame_name, caption = 'Debuggertron 3002', direction = 'vertical'}
frame = center.add{ type = "frame", name = main_frame_name, caption = "Debuggertron 3002", direction = "vertical" }
local frame_style = frame.style
frame_style.height = 600
frame_style.width = 900
local tab_flow = frame.add {type = 'flow', direction = 'horizontal'}
local container = frame.add {type = 'flow'}
local tab_flow = frame.add{ type = "flow", direction = "horizontal" }
local container = frame.add{ type = "flow" }
container.style.vertically_stretchable = true
local data = {}
for i = 1, #pages do
local page = pages[i]
local tab_button = tab_flow.add({type = 'flow'}).add {type = 'button', name = tab_name, caption = page.name}
local tab_button = tab_flow.add{ type = "flow" }.add{ type = "button", name = tab_name, caption = page.name }
local tab_button_style = tab_button.style
Gui.set_data(tab_button, {index = i, frame_data = data})
Gui.set_data(tab_button, { index = i, frame_data = data })
if i == 1 then
tab_button_style.font_color = Color.orange
@@ -70,7 +70,7 @@ function Public.open_dubug(player)
end
end
frame.add {type = 'button', name = close_name, caption = 'Close'}
frame.add{ type = "button", name = close_name, caption = "Close" }
end
Gui.on_click(

View File

@@ -6,72 +6,72 @@ local type = type
local concat = table.concat
local inspect = table.inspect
local pcall = pcall
local loadstring = loadstring ---@diagnostic disable-line
local loadstring = loadstring --- @diagnostic disable-line
local rawset = rawset
local Public = {}
local luaObject = {'{', nil, ", name = '", nil, "'}"}
local luaPlayer = {"{LuaPlayer, name = '", nil, "', index = ", nil, '}'}
local luaEntity = {"{LuaEntity, name = '", nil, "', unit_number = ", nil, '}'}
local luaGuiElement = {"{LuaGuiElement, name = '", nil, "'}"}
local luaObject = { "{", nil, ", name = '", nil, "'}" }
local luaPlayer = { "{LuaPlayer, name = '", nil, "', index = ", nil, "}" }
local luaEntity = { "{LuaEntity, name = '", nil, "', unit_number = ", nil, "}" }
local luaGuiElement = { "{LuaGuiElement, name = '", nil, "'}" }
local function get(obj, prop)
return obj[prop]
end
local function get_name_safe(obj)
local s, r = pcall(get, obj, 'name')
local s, r = pcall(get, obj, "name")
if not s then
return 'nil'
return "nil"
else
return r or 'nil'
return r or "nil"
end
end
local function get_lua_object_type_safe(obj)
local s, r = pcall(get, obj, 'help')
local s, r = pcall(get, obj, "help")
if not s then
return
end
return r():match('Lua%a+')
return r():match("Lua%a+")
end
local function inspect_process(item)
if type(item) ~= 'table' or type(item.__self) ~= 'userdata' then
if type(item) ~= "table" or type(item.__self) ~= "userdata" then
return item
end
local suc, valid = pcall(get, item, 'valid')
local suc, valid = pcall(get, item, "valid")
if not suc then
-- no 'valid' property
return get_lua_object_type_safe(item) or '{NoHelp LuaObject}'
return get_lua_object_type_safe(item) or "{NoHelp LuaObject}"
end
if not valid then
return '{Invalid LuaObject}'
return "{Invalid LuaObject}"
end
local obj_type = get_lua_object_type_safe(item)
if not obj_type then
return '{NoHelp LuaObject}'
return "{NoHelp LuaObject}"
end
if obj_type == 'LuaPlayer' then
luaPlayer[2] = item.name or 'nil'
luaPlayer[4] = item.index or 'nil'
if obj_type == "LuaPlayer" then
luaPlayer[2] = item.name or "nil"
luaPlayer[4] = item.index or "nil"
return concat(luaPlayer)
elseif obj_type == 'LuaEntity' then
luaEntity[2] = item.name or 'nil'
luaEntity[4] = item.unit_number or 'nil'
elseif obj_type == "LuaEntity" then
luaEntity[2] = item.name or "nil"
luaEntity[4] = item.unit_number or "nil"
return concat(luaEntity)
elseif obj_type == 'LuaGuiElement' then
elseif obj_type == "LuaGuiElement" then
local name = item.name
luaGuiElement[2] = gui_names and gui_names[name] or name or 'nil'
luaGuiElement[2] = gui_names and gui_names[name] or name or "nil"
return concat(luaGuiElement)
else
@@ -82,10 +82,11 @@ local function inspect_process(item)
end
end
local inspect_options = {process = inspect_process}
local inspect_options = { process = inspect_process }
function Public.dump(data)
return inspect(data, inspect_options)
end
local dump = Public.dump
function Public.dump_ignore_builder(ignore)
@@ -97,14 +98,14 @@ function Public.dump_ignore_builder(ignore)
return inspect_process(item)
end
local options = {process = process}
local options = { process = process }
return function(data)
return inspect(data, options)
end
end
function Public.dump_function(func)
local res = {'upvalues:\n'}
local res = { "upvalues:\n" }
local i = 1
while true do
@@ -112,11 +113,11 @@ function Public.dump_function(func)
if n == nil then
break
elseif n ~= '_ENV' then
elseif n ~= "_ENV" then
res[#res + 1] = n
res[#res + 1] = ' = '
res[#res + 1] = " = "
res[#res + 1] = dump(v)
res[#res + 1] = '\n'
res[#res + 1] = "\n"
end
i = i + 1
@@ -126,16 +127,16 @@ function Public.dump_function(func)
end
function Public.dump_text(text, player)
local func = loadstring('return ' .. text)
local func = loadstring("return " .. text)
if not func then
return false
end
rawset(game, 'player', player)
rawset(game, "player", player)
local suc, var = pcall(func)
rawset(game, 'player', nil)
rawset(game, "player", nil)
if not suc then
return false

View File

@@ -17,9 +17,9 @@ local ignore = {
math = true,
debug = true,
serpent = true,
['overrides.math'] = true,
["overrides.math"] = true,
util = true,
['mod-gui'] = true
["mod-gui"] = true,
}
local file_label_name = Gui.uid_name()
@@ -29,34 +29,34 @@ local top_panel_name = Gui.uid_name()
local variable_label_name = Gui.uid_name()
local text_box_name = Gui.uid_name()
Public.name = 'package'
Public.name = "package"
function Public.show(container)
local main_flow = container.add {type = 'flow', direction = 'horizontal'}
local main_flow = container.add{ type = "flow", direction = "horizontal" }
local left_panel = main_flow.add {type = 'scroll-pane', name = left_panel_name}
local left_panel = main_flow.add{ type = "scroll-pane", name = left_panel_name }
local left_panel_style = left_panel.style
left_panel_style.width = 300
for name, file in pairs(loaded) do
if not ignore[name] then
local file_label =
left_panel.add({type = 'flow'}).add {type = 'label', name = file_label_name, caption = name}
left_panel.add{ type = "flow" }.add{ type = "label", name = file_label_name, caption = name }
Gui.set_data(file_label, file)
end
end
local right_flow = main_flow.add {type = 'flow', direction = 'vertical'}
local right_flow = main_flow.add{ type = "flow", direction = "vertical" }
local breadcrumbs = right_flow.add {type = 'label', name = breadcrumbs_name}
local breadcrumbs = right_flow.add{ type = "label", name = breadcrumbs_name }
local top_panel = right_flow.add {type = 'scroll-pane', name = top_panel_name}
local top_panel = right_flow.add{ type = "scroll-pane", name = top_panel_name }
local top_panel_style = top_panel.style
top_panel_style.height = 200
top_panel_style.maximal_width = 1000
top_panel_style.horizontally_stretchable = true
local text_box = right_flow.add {type = 'text-box', name = text_box_name}
local text_box = right_flow.add{ type = "text-box", name = text_box_name }
text_box.read_only = true
text_box.selectable = true
@@ -72,7 +72,7 @@ function Public.show(container)
top_panel = top_panel,
text_box = text_box,
selected_file_label = nil,
selected_variable_label = nil
selected_variable_label = nil,
}
Gui.set_data(left_panel, data)
@@ -104,13 +104,13 @@ Gui.on_click(
local file_type = type(file)
if file_type == 'table' then
if file_type == "table" then
for k, v in pairs(file) do
local label =
top_panel.add({type = 'flow'}).add {type = 'label', name = variable_label_name, caption = k}
top_panel.add{ type = "flow" }.add{ type = "label", name = variable_label_name, caption = k }
Gui.set_data(label, v)
end
elseif file_type == 'function' then
elseif file_type == "function" then
text_box.text = dump_function(file)
else
text_box.text = tostring(file)
@@ -130,13 +130,14 @@ Gui.on_click(
local variable_type = type(variable)
if variable_type == 'table' then
if variable_type == "table" then
Gui.clear(top_panel)
for k, v in pairs(variable) do
local label =
top_panel.add({type = 'flow'}).add {type = 'label', name = variable_label_name, caption = k}
top_panel.add{ type = "flow" }.add{ type = "label", name = variable_label_name, caption = k }
Gui.set_data(label, v)
end
return
end
@@ -149,7 +150,7 @@ Gui.on_click(
element.style.font_color = Color.orange
data.selected_variable_label = element
if variable_type == 'function' then
if variable_type == "function" then
text_box.text = dump_function(variable)
else
text_box.text = tostring(variable)

View File

@@ -15,37 +15,37 @@ local right_panel_name = Gui.uid_name()
local input_text_box_name = Gui.uid_name()
local refresh_name = Gui.uid_name()
Public.name = 'Storage'
Public.name = "Storage"
function Public.show(container)
local main_flow = container.add {type = 'flow', direction = 'horizontal'}
local main_flow = container.add{ type = "flow", direction = "horizontal" }
local left_panel = main_flow.add {type = 'scroll-pane', name = left_panel_name}
local left_panel = main_flow.add{ type = "scroll-pane", name = left_panel_name }
local left_panel_style = left_panel.style
left_panel_style.width = 300
for token_id in pairs(Storage.registered) do
local header = left_panel.add({type = 'flow'}).add {type = 'label', name = header_name, caption = token_id}
local header = left_panel.add{ type = "flow" }.add{ type = "label", name = header_name, caption = token_id }
Gui.set_data(header, token_id)
end
local right_flow = main_flow.add {type = 'flow', direction = 'vertical'}
local right_flow = main_flow.add{ type = "flow", direction = "vertical" }
local right_top_flow = right_flow.add {type = 'flow', direction = 'horizontal'}
local right_top_flow = right_flow.add{ type = "flow", direction = "horizontal" }
local input_text_box = right_top_flow.add {type = 'text-box', name = input_text_box_name}
local input_text_box = right_top_flow.add{ type = "text-box", name = input_text_box_name }
local input_text_box_style = input_text_box.style
input_text_box_style.horizontally_stretchable = true
input_text_box_style.height = 32
input_text_box_style.maximal_width = 1000
local refresh_button =
right_top_flow.add {type = 'sprite-button', name = refresh_name, sprite = 'utility/reset', tooltip = 'refresh'}
right_top_flow.add{ type = "sprite-button", name = refresh_name, sprite = "utility/reset", tooltip = "refresh" }
local refresh_button_style = refresh_button.style
refresh_button_style.width = 32
refresh_button_style.height = 32
local right_panel = right_flow.add {type = 'text-box', name = right_panel_name}
local right_panel = right_flow.add{ type = "text-box", name = right_panel_name }
right_panel.read_only = true
right_panel.selectable = true
@@ -58,7 +58,7 @@ function Public.show(container)
local data = {
right_panel = right_panel,
input_text_box = input_text_box,
selected_header = nil
selected_header = nil,
}
Gui.set_data(input_text_box, data)
@@ -85,10 +85,10 @@ Gui.on_click(
element.style.font_color = Color.orange
data.selected_header = element
input_text_box.text = concat {'storage.exp_storage[', token_id, ']'}
input_text_box.text = concat{ "storage.exp_storage[", token_id, "]" }
input_text_box.style.font_color = Color.black
local content = dump(storage.exp_storage[token_id]) or 'nil'
local content = dump(storage.exp_storage[token_id]) or "nil"
right_panel.text = content
end
)

View File

@@ -11,7 +11,7 @@ local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local rolling_stocks = {}
local function landfill_init()
for name, _ in pairs(prototypes.get_entity_filtered{{filter = 'rolling-stock'}}) do
for name, _ in pairs(prototypes.get_entity_filtered{ { filter = "rolling-stock" } }) do
rolling_stocks[name] = true
end
end
@@ -20,50 +20,50 @@ local function rotate_bounding_box(box)
return {
left_top = {
x = -box.right_bottom.y,
y = box.left_top.x
y = box.left_top.x,
},
right_bottom = {
x = -box.left_top.y,
y = box.right_bottom.x
}
y = box.right_bottom.x,
},
}
end
local function curve_flip_lr(oc)
local nc = table.deepcopy(oc)
local nc = table.deepcopy(oc)
for r=1, 8 do
for c=1, 8 do
nc[r][c] = oc[r][9 - c]
end
end
for r = 1, 8 do
for c = 1, 8 do
nc[r][c] = oc[r][9 - c]
end
end
return nc
return nc
end
local function curve_flip_d(oc)
local nc = table.deepcopy(oc)
local nc = table.deepcopy(oc)
for r=1, 8 do
for c=1, 8 do
nc[r][c] = oc[c][r]
end
end
for r = 1, 8 do
for c = 1, 8 do
nc[r][c] = oc[c][r]
end
end
return nc
return nc
end
local curves = {}
curves[1] = {
{0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0},
{0, 0, 0, 1, 1, 1, 1, 0},
{0, 0, 0, 1, 1, 1, 0, 0},
{0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 0, 0, 0, 0}
{ 0, 0, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 1, 0 },
{ 0, 0, 0, 1, 1, 1, 1, 0 },
{ 0, 0, 0, 1, 1, 1, 0, 0 },
{ 0, 0, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 1, 1, 0, 0, 0, 0 },
}
curves[6] = curve_flip_d(curves[1])
curves[3] = curve_flip_lr(curves[6])
@@ -79,12 +79,12 @@ for i, map in ipairs(curves) do
curve_n[i] = {}
local index = 1
for r=1, 8 do
for c=1, 8 do
for r = 1, 8 do
for c = 1, 8 do
if map[r][c] == 1 then
curve_n[i][index] = {
['x'] = c - 5,
['y'] = r - 5
["x"] = c - 5,
["y"] = r - 5,
}
index = index + 1
@@ -100,13 +100,13 @@ local function landfill_gui_add_landfill(blueprint)
for _, ent in pairs(entities) do
-- vehicle
if not (rolling_stocks[ent.name] or ent.name == 'offshore-pump') then
if not (rolling_stocks[ent.name] or ent.name == "offshore-pump") then
-- curved rail, special
if ent.name ~= 'curved-rail' then
if ent.name ~= "curved-rail" then
local proto = prototypes.entity[ent.name]
local box = proto.collision_box or proto.selection_box
if proto.collision_mask['ground-tile'] == nil then
if proto.collision_mask["ground-tile"] == nil then
if ent.direction then
if ent.direction ~= defines.direction.north then
box = rotate_bounding_box(box)
@@ -125,21 +125,21 @@ local function landfill_gui_add_landfill(blueprint)
for x = math.floor(ent.position.x + box.left_top.x), math.floor(ent.position.x + box.right_bottom.x), 1 do
tile_index = tile_index + 1
new_tiles[tile_index] = {
name = 'landfill',
position = {x, y}
name = "landfill",
position = { x, y },
}
end
end
end
-- curved rail
-- curved rail
else
local curve_mask = curve_n[ent.direction or 8]
for m=1, #curve_mask do
for m = 1, #curve_mask do
new_tiles[tile_index + 1] = {
name = 'landfill',
position = {curve_mask[m].x + ent.position.x, curve_mask[m].y + ent.position.y}
name = "landfill",
position = { curve_mask[m].x + ent.position.x, curve_mask[m].y + ent.position.y },
}
tile_index = tile_index + 1
@@ -153,34 +153,33 @@ local function landfill_gui_add_landfill(blueprint)
if old_tiles then
for _, old_tile in pairs(old_tiles) do
new_tiles[tile_index + 1] = {
name = 'landfill',
position = {old_tile.position.x, old_tile.position.y}
name = "landfill",
position = { old_tile.position.x, old_tile.position.y },
}
tile_index = tile_index + 1
end
end
return {tiles = new_tiles}
return { tiles = new_tiles }
end
-- @element toolbar_button
Gui.toolbar_button('item/landfill', {'landfill.main-tooltip'}, function(player)
return Roles.player_allowed(player, 'gui/landfill')
Gui.toolbar_button("item/landfill", { "landfill.main-tooltip" }, function(player)
return Roles.player_allowed(player, "gui/landfill")
end)
:on_click(function(player, _, _)
if player.cursor_stack and player.cursor_stack.valid_for_read then
if player.cursor_stack.type == 'blueprint' and player.cursor_stack.is_blueprint_setup() then
local modified = landfill_gui_add_landfill(player.cursor_stack)
:on_click(function(player, _, _)
if player.cursor_stack and player.cursor_stack.valid_for_read then
if player.cursor_stack.type == "blueprint" and player.cursor_stack.is_blueprint_setup() then
local modified = landfill_gui_add_landfill(player.cursor_stack)
if modified and next(modified.tiles) then
player.cursor_stack.set_blueprint_tiles(modified.tiles)
if modified and next(modified.tiles) then
player.cursor_stack.set_blueprint_tiles(modified.tiles)
end
end
else
player.print{ "landfill.cursor-none" }
end
else
player.print{'landfill.cursor-none'}
end
end)
end)
Event.add(defines.events.on_player_joined_game, landfill_init)

View File

@@ -6,19 +6,19 @@ local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local config = require("modules.exp_legacy.config.module") --- @dep config.module
local Selection = require("modules.exp_legacy.modules.control.selection") --- @dep modules.control.selection
local SelectionModuleArea = 'ModuleArea'
local SelectionModuleArea = "ModuleArea"
--- align an aabb to the grid by expanding it
local function aabb_align_expand(aabb)
return {
left_top = {
x = math.floor(aabb.left_top.x),
y = math.floor(aabb.left_top.y)
y = math.floor(aabb.left_top.y),
},
right_bottom = {
x = math.ceil(aabb.right_bottom.x),
y = math.ceil(aabb.right_bottom.y)
}
y = math.ceil(aabb.right_bottom.y),
},
}
end
@@ -40,30 +40,30 @@ local function get_module_name()
end
local elem_filter = {
name = {{
filter = 'name',
name = machine_name
}},
normal = {{
filter = 'type',
type = 'module'
name = { {
filter = "name",
name = machine_name,
} },
normal = { {
filter = "type",
type = "module",
}, {
filter = 'name',
filter = "name",
name = prod_module_names,
mode = 'and',
invert = true
}},
prod = {{
filter = 'type',
type = 'module'
}}
mode = "and",
invert = true,
} },
prod = { {
filter = "type",
type = "module",
} },
}
local function clear_module(player, area, machine)
for _, entity in pairs(player.surface.find_entities_filtered{area=area, name=machine, force=player.force}) do
for _, r in pairs(player.surface.find_entities_filtered{position=entity.position, name='item-request-proxy', force=player.force}) do
for _, entity in pairs(player.surface.find_entities_filtered{ area = area, name = machine, force = player.force }) do
for _, r in pairs(player.surface.find_entities_filtered{ position = entity.position, name = "item-request-proxy", force = player.force }) do
if r then
r.destroy{raise_destroy=true}
r.destroy{ raise_destroy = true }
end
end
@@ -74,7 +74,7 @@ local function clear_module(player, area, machine)
if m_current_module_content then
for k, m in pairs(m_current_module_content) do
player.surface.spill_item_stack(entity.bounding_box.left_top, {name=k, count=m}, true, player.force, false)
player.surface.spill_item_stack(entity.bounding_box.left_top, { name = k, count = m }, true, player.force, false)
end
end
@@ -84,25 +84,23 @@ local function clear_module(player, area, machine)
end
local function apply_module(player, area, machine, modules)
for _, entity in pairs(player.surface.find_entities_filtered{area=area, name=machine, force=player.force}) do
for _, entity in pairs(player.surface.find_entities_filtered{ area = area, name = machine, force = player.force }) do
local m_current_recipe
if entity.prototype.crafting_speed then
m_current_recipe= entity.get_recipe()
m_current_recipe = entity.get_recipe()
end
if m_current_recipe then
if config.module_allowed[m_current_recipe.name] then
entity.surface.create_entity{name='item-request-proxy', target=entity, position=entity.position, force=entity.force, modules=modules['n']}
entity.surface.create_entity{ name = "item-request-proxy", target = entity, position = entity.position, force = entity.force, modules = modules["n"] }
entity.last_user = player
else
entity.surface.create_entity{name='item-request-proxy', target=entity, position=entity.position, force=entity.force, modules=modules['p']}
entity.surface.create_entity{ name = "item-request-proxy", target = entity, position = entity.position, force = entity.force, modules = modules["p"] }
entity.last_user = player
end
else
entity.surface.create_entity{name='item-request-proxy', target=entity, position=entity.position, force=entity.force, modules=modules['n']}
entity.surface.create_entity{ name = "item-request-proxy", target = entity, position = entity.position, force = entity.force, modules = modules["n"] }
entity.last_user = player
end
end
@@ -115,35 +113,34 @@ Selection.on_selection(SelectionModuleArea, function(event)
local frame = Gui.get_left_element(player, module_container)
local scroll_table = frame.container.scroll.table
for i=1, config.default_module_row_count do
local mma = scroll_table['module_mm_' .. i .. '_0'].elem_value
for i = 1, config.default_module_row_count do
local mma = scroll_table["module_mm_" .. i .. "_0"].elem_value
if mma then
local mm = {
['n'] = {},
['p'] = {}
["n"] = {},
["p"] = {},
}
for j=1, prototypes.entity[mma].module_inventory_size, 1 do
local mmo = scroll_table['module_mm_' .. i .. '_' .. j].elem_value
for j = 1, prototypes.entity[mma].module_inventory_size, 1 do
local mmo = scroll_table["module_mm_" .. i .. "_" .. j].elem_value
if mmo then
if mm['n'][mmo] then
mm['n'][mmo] = mm['n'][mmo] + 1
mm['p'][mmo] = mm['p'][mmo] + 1
if mm["n"][mmo] then
mm["n"][mmo] = mm["n"][mmo] + 1
mm["p"][mmo] = mm["p"][mmo] + 1
else
mm['n'][mmo] = 1
mm['p'][mmo] = 1
mm["n"][mmo] = 1
mm["p"][mmo] = 1
end
end
end
for k, v in pairs(mm['p']) do
if k:find('productivity') then
local module_name = k:gsub('productivity', 'effectivity')
mm['p'][module_name] = (mm['p'][module_name] or 0) + v
mm['p'][k] = nil
for k, v in pairs(mm["p"]) do
if k:find("productivity") then
local module_name = k:gsub("productivity", "effectivity")
mm["p"][module_name] = (mm["p"][module_name] or 0) + v
mm["p"][k] = nil
end
end
@@ -159,29 +156,26 @@ local function row_set(player, element)
local frame = Gui.get_left_element(player, module_container)
local scroll_table = frame.container.scroll.table
if scroll_table[element .. '0'].elem_value then
for i=1, config.module_slot_max do
if i <= prototypes.entity[scroll_table[element .. '0'].elem_value].module_inventory_size then
if config.machine[scroll_table[element .. '0'].elem_value].prod then
if scroll_table[element .. "0"].elem_value then
for i = 1, config.module_slot_max do
if i <= prototypes.entity[scroll_table[element .. "0"].elem_value].module_inventory_size then
if config.machine[scroll_table[element .. "0"].elem_value].prod then
scroll_table[element .. i].elem_filters = elem_filter.prod
else
scroll_table[element .. i].elem_filters = elem_filter.normal
end
scroll_table[element .. i].enabled = true
scroll_table[element .. i].elem_value = config.machine[scroll_table[element .. '0'].elem_value].module
scroll_table[element .. i].elem_value = config.machine[scroll_table[element .. "0"].elem_value].module
else
scroll_table[element .. i].enabled = false
scroll_table[element .. i].elem_value = nil
end
end
else
local mf = elem_filter.normal
for i=1, config.module_slot_max do
for i = 1, config.module_slot_max do
scroll_table[element .. i].enabled = false
scroll_table[element .. i].elem_filters = mf
scroll_table[element .. i].elem_value = nil
@@ -190,61 +184,61 @@ local function row_set(player, element)
end
local button_apply =
Gui.element{
type = 'button',
caption = 'Apply',
style = 'button'
}:on_click(function(player)
if Selection.is_selecting(player, SelectionModuleArea) then
Selection.stop(player)
else
Selection.start(player, SelectionModuleArea)
end
end)
Gui.element{
type = "button",
caption = "Apply",
style = "button",
}:on_click(function(player)
if Selection.is_selecting(player, SelectionModuleArea) then
Selection.stop(player)
else
Selection.start(player, SelectionModuleArea)
end
end)
module_container =
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, (config.module_slot_max + 2) * 36)
Gui.header(container, 'Module Inserter', '', true)
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, (config.module_slot_max + 2) * 36)
Gui.header(container, "Module Inserter", "", true)
local scroll_table = Gui.scroll_table(container, (config.module_slot_max + 2) * 36, config.module_slot_max + 1)
local scroll_table = Gui.scroll_table(container, (config.module_slot_max + 2) * 36, config.module_slot_max + 1)
for i=1, config.default_module_row_count do
scroll_table.add{
name = 'module_mm_' .. i .. '_0',
type = 'choose-elem-button',
elem_type = 'entity',
elem_filters = elem_filter.name,
style = 'slot_button'
}
for j=1, config.module_slot_max do
for i = 1, config.default_module_row_count do
scroll_table.add{
name = 'module_mm_' .. i .. '_' .. j,
type = 'choose-elem-button',
elem_type = 'item',
elem_filters = elem_filter.normal,
style = 'slot_button',
enabled = false
name = "module_mm_" .. i .. "_0",
type = "choose-elem-button",
elem_type = "entity",
elem_filters = elem_filter.name,
style = "slot_button",
}
for j = 1, config.module_slot_max do
scroll_table.add{
name = "module_mm_" .. i .. "_" .. j,
type = "choose-elem-button",
elem_type = "item",
elem_filters = elem_filter.normal,
style = "slot_button",
enabled = false,
}
end
end
end
button_apply(container)
button_apply(container)
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
Gui.left_toolbar_button('item/productivity-module-3', {'module.main-tooltip'}, module_container, function(player)
return Roles.player_allowed(player, 'gui/module')
Gui.left_toolbar_button("item/productivity-module-3", { "module.main-tooltip" }, module_container, function(player)
return Roles.player_allowed(player, "gui/module")
end)
Event.add(defines.events.on_gui_elem_changed, function(event)
if event.element.name:sub(1, 10) == 'module_mm_' then
if event.element.name:sub(-1) == '0' then
row_set(game.players[event.player_index], 'module_mm_' .. event.element.name:sub(-3):sub(1, 1) .. '_')
if event.element.name:sub(1, 10) == "module_mm_" then
if event.element.name:sub(-1) == "0" then
row_set(game.players[event.player_index], "module_mm_" .. event.element.name:sub(-3):sub(1, 1) .. "_")
end
end
end)
@@ -271,7 +265,7 @@ Event.add(defines.events.on_entity_settings_pasted, function(event)
-- rotate machine also
if config.copy_paste_rotation then
if (source.name == destination.name or source.prototype.fast_replaceable_group == destination.prototype.fast_replaceable_group) then
if source.supports_direction and destination.supports_direction and source.type ~= 'transport-belt' then
if source.supports_direction and destination.supports_direction and source.type ~= "transport-belt" then
local destination_box = destination.bounding_box
local ltx = destination_box.left_top.x
@@ -309,7 +303,7 @@ Event.add(defines.events.on_entity_settings_pasted, function(event)
clear_module(player, destination.bounding_box, destination.name)
if next(source_inventory_content) ~= nil then
apply_module(player, destination.bounding_box, destination.name, {['n']=source_inventory_content, ['p']=source_inventory_content})
apply_module(player, destination.bounding_box, destination.name, { ["n"] = source_inventory_content, ["p"] = source_inventory_content })
end
end
end)

View File

@@ -14,10 +14,10 @@ local Colors = require("modules/exp_util/include/color")
local format_time = _C.format_time --- @dep expcore.common
--- Stores all data for the warp gui
local PlayerListData = Datastore.connect('PlayerListData')
local PlayerListData = Datastore.connect("PlayerListData")
PlayerListData:set_serializer(Datastore.name_serializer)
local SelectedPlayer = PlayerListData:combine('SelectedPlayer')
local SelectedAction = PlayerListData:combine('SelectedAction')
local SelectedPlayer = PlayerListData:combine("SelectedPlayer")
local SelectedAction = PlayerListData:combine("SelectedAction")
-- Set the config to use these stores
config.set_datastores(SelectedPlayer, SelectedAction)
@@ -25,118 +25,118 @@ config.set_datastores(SelectedPlayer, SelectedAction)
--- Button used to open the action bar
-- @element open_action_bar
local open_action_bar =
Gui.element{
type = 'sprite-button',
sprite = 'utility/expand_dots',
tooltip = {'player-list.open-action-bar'},
style = 'frame_button',
name = Gui.unique_static_name
}
:style{
padding = -2,
width = 8,
height = 14
}
:on_click(function(player, element, _)
local selected_player_name = element.parent.name
local old_selected_player_name = SelectedPlayer:get(player)
if selected_player_name == old_selected_player_name then
SelectedPlayer:remove(player)
else
SelectedPlayer:set(player, selected_player_name)
end
end)
Gui.element{
type = "sprite-button",
sprite = "utility/expand_dots",
tooltip = { "player-list.open-action-bar" },
style = "frame_button",
name = Gui.unique_static_name,
}
:style{
padding = -2,
width = 8,
height = 14,
}
:on_click(function(player, element, _)
local selected_player_name = element.parent.name
local old_selected_player_name = SelectedPlayer:get(player)
if selected_player_name == old_selected_player_name then
SelectedPlayer:remove(player)
else
SelectedPlayer:set(player, selected_player_name)
end
end)
--- Button used to close the action bar
-- @element close_action_bar
local close_action_bar =
Gui.element{
type = 'sprite-button',
sprite = 'utility/close_black',
tooltip = {'player-list.close-action-bar'},
style = 'slot_sized_button_red'
}
:style(Gui.sprite_style(30, -1, { top_margin = -1, right_margin = -1 }))
:on_click(function(player, _)
SelectedPlayer:remove(player)
SelectedAction:remove(player)
end)
Gui.element{
type = "sprite-button",
sprite = "utility/close_black",
tooltip = { "player-list.close-action-bar" },
style = "slot_sized_button_red",
}
:style(Gui.sprite_style(30, -1, { top_margin = -1, right_margin = -1 }))
:on_click(function(player, _)
SelectedPlayer:remove(player)
SelectedAction:remove(player)
end)
--- Button used to confirm a reason
-- @element reason_confirm
local reason_confirm =
Gui.element{
type = 'sprite-button',
sprite = 'utility/confirm_slot',
tooltip = {'player-list.reason-confirm'},
style = 'slot_sized_button_green'
}
:style(Gui.sprite_style(30, -1, { left_margin = -2, right_margin = -1 }))
:on_click(function(player, element)
local reason = element.parent.entry.text
local action_name = SelectedAction:get(player)
local reason_callback = config.buttons[action_name].reason_callback
if reason == nil or not reason:find("%S") then reason = 'no reason given' end
reason_callback(player, reason)
SelectedPlayer:remove(player)
SelectedAction:remove(player)
element.parent.entry.text = ''
end)
Gui.element{
type = "sprite-button",
sprite = "utility/confirm_slot",
tooltip = { "player-list.reason-confirm" },
style = "slot_sized_button_green",
}
:style(Gui.sprite_style(30, -1, { left_margin = -2, right_margin = -1 }))
:on_click(function(player, element)
local reason = element.parent.entry.text
local action_name = SelectedAction:get(player)
local reason_callback = config.buttons[action_name].reason_callback
if reason == nil or not reason:find("%S") then reason = "no reason given" end
reason_callback(player, reason)
SelectedPlayer:remove(player)
SelectedAction:remove(player)
element.parent.entry.text = ""
end)
--- Set of elements that are used to make up a row of the player table
-- @element add_player_base
local add_player_base =
Gui.element(function(_, parent, player_data)
-- Add the button to open the action bar
local toggle_action_bar_flow = parent.add{ type = 'flow', name = player_data.name }
open_action_bar(toggle_action_bar_flow)
Gui.element(function(_, parent, player_data)
-- Add the button to open the action bar
local toggle_action_bar_flow = parent.add{ type = "flow", name = player_data.name }
open_action_bar(toggle_action_bar_flow)
-- Add the player name
local player_name = parent.add{
type = 'label',
name = 'player-name-'..player_data.index,
caption = player_data.name,
tooltip = {'player-list.open-map', player_data.name, player_data.tag, player_data.role_name}
}
player_name.style.padding = {0, 2,0, 0}
player_name.style.font_color = player_data.chat_color
-- Add the player name
local player_name = parent.add{
type = "label",
name = "player-name-" .. player_data.index,
caption = player_data.name,
tooltip = { "player-list.open-map", player_data.name, player_data.tag, player_data.role_name },
}
player_name.style.padding = { 0, 2, 0, 0 }
player_name.style.font_color = player_data.chat_color
-- Add the time played label
local alignment = Gui.alignment(parent, 'player-time-'..player_data.index)
local time_label = alignment.add{
name = 'label',
type = 'label',
caption = player_data.caption,
tooltip = player_data.tooltip
}
time_label.style.padding = 0
-- Add the time played label
local alignment = Gui.alignment(parent, "player-time-" .. player_data.index)
local time_label = alignment.add{
name = "label",
type = "label",
caption = player_data.caption,
tooltip = player_data.tooltip,
}
time_label.style.padding = 0
return player_name
end)
:on_click(function(player, element, event)
local selected_player_name = element.caption
local selected_player = game.players[selected_player_name]
if event.button == defines.mouse_button_type.left then
-- LMB will open the map to the selected player
local position = selected_player.position
event.player.zoom_to_world(position, 1.75)
else
-- RMB will toggle the settings
local old_selected_player_name = SelectedPlayer:get(player)
if selected_player_name == old_selected_player_name then
SelectedPlayer:remove(player)
SelectedAction:remove(player)
return player_name
end)
:on_click(function(player, element, event)
local selected_player_name = element.caption
local selected_player = game.players[selected_player_name]
if event.button == defines.mouse_button_type.left then
-- LMB will open the map to the selected player
local position = selected_player.position
event.player.zoom_to_world(position, 1.75)
else
SelectedPlayer:set(player, selected_player_name)
-- RMB will toggle the settings
local old_selected_player_name = SelectedPlayer:get(player)
if selected_player_name == old_selected_player_name then
SelectedPlayer:remove(player)
SelectedAction:remove(player)
else
SelectedPlayer:set(player, selected_player_name)
end
end
end
end)
end)
-- Removes the three elements that are added as part of the base
local function remove_player_base(parent, player)
Gui.destroy_if_valid(parent[player.name])
Gui.destroy_if_valid(parent['player-name-'..player.index])
Gui.destroy_if_valid(parent['player-time-'..player.index])
Gui.destroy_if_valid(parent["player-name-" .. player.index])
Gui.destroy_if_valid(parent["player-time-" .. player.index])
end
-- Update the time label for a player using there player time data
@@ -151,21 +151,21 @@ end
--- Adds all the buttons and flows that make up the action bar
-- @element add_action_bar
local add_action_bar_buttons =
Gui.element(function(_, parent)
close_action_bar(parent)
-- Loop over all the buttons in the config
for action_name, button_data in pairs(config.buttons) do
-- Added the permission flow
local permission_flow = parent.add{ type = 'flow', name = action_name }
permission_flow.visible = false
-- Add the buttons under that permission
for _, button in ipairs(button_data) do
button(permission_flow)
Gui.element(function(_, parent)
close_action_bar(parent)
-- Loop over all the buttons in the config
for action_name, button_data in pairs(config.buttons) do
-- Added the permission flow
local permission_flow = parent.add{ type = "flow", name = action_name }
permission_flow.visible = false
-- Add the buttons under that permission
for _, button in ipairs(button_data) do
button(permission_flow)
end
end
end
return parent
end)
return parent
end)
--- Updates the visible state of the action bar buttons
local function update_action_bar(element)
@@ -175,7 +175,6 @@ local function update_action_bar(element)
if not selected_player_name then
-- Hide the action bar when no player is selected
element.visible = false
else
local selected_player = game.players[selected_player_name]
if not selected_player.connected then
@@ -183,7 +182,6 @@ local function update_action_bar(element)
element.visible = false
SelectedPlayer:remove(player)
SelectedAction:remove(player)
else
-- Otherwise check what actions the player is allowed to use
element.visible = true
@@ -194,7 +192,6 @@ local function update_action_bar(element)
element[action_name].visible = true
end
end
end
end
end
@@ -202,74 +199,74 @@ end
--- Main player list container for the left flow
-- @element player_list_container
local player_list_container =
Gui.element(function(definition, parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name, 200)
Gui.element(function(definition, parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name, 200)
-- Draw the scroll table for the players
local scroll_table = Gui.scroll_table(container, 184, 3)
-- Draw the scroll table for the players
local scroll_table = Gui.scroll_table(container, 184, 3)
-- Change the style of the scroll table
local scroll_table_style = scroll_table.style
scroll_table_style.padding = {1, 0,1, 2}
-- Change the style of the scroll table
local scroll_table_style = scroll_table.style
scroll_table_style.padding = { 1, 0, 1, 2 }
-- Add the action bar
local action_bar = Gui.footer(container, nil, nil, false, 'action_bar')
-- Add the action bar
local action_bar = Gui.footer(container, nil, nil, false, "action_bar")
-- Change the style of the action bar
local action_bar_style = action_bar.style
action_bar_style.height = 35
action_bar_style.padding = {1, 3}
action_bar.visible = false
-- Change the style of the action bar
local action_bar_style = action_bar.style
action_bar_style.height = 35
action_bar_style.padding = { 1, 3 }
action_bar.visible = false
-- Add the buttons to the action bar
add_action_bar_buttons(action_bar)
-- Add the buttons to the action bar
add_action_bar_buttons(action_bar)
-- Add the reason bar
local reason_bar = Gui.footer(container, nil, nil, false, 'reason_bar')
-- Add the reason bar
local reason_bar = Gui.footer(container, nil, nil, false, "reason_bar")
-- Change the style of the reason bar
local reason_bar_style = reason_bar.style
reason_bar_style.height = 35
reason_bar_style.padding = {-1, 3}
reason_bar.visible = false
-- Change the style of the reason bar
local reason_bar_style = reason_bar.style
reason_bar_style.height = 35
reason_bar_style.padding = { -1, 3 }
reason_bar.visible = false
-- Add the text entry for the reason bar
local reason_field =
reason_bar.add{
name = 'entry',
type = 'textfield',
style = 'stretchable_textfield',
tooltip = {'player-list.reason-entry'}
}
-- Add the text entry for the reason bar
local reason_field =
reason_bar.add{
name = "entry",
type = "textfield",
style = "stretchable_textfield",
tooltip = { "player-list.reason-entry" },
}
-- Change the style of the text entry
local reason_entry_style = reason_field.style
reason_entry_style.padding = 0
reason_entry_style.height = 28
reason_entry_style.minimal_width = 160
-- Change the style of the text entry
local reason_entry_style = reason_field.style
reason_entry_style.padding = 0
reason_entry_style.height = 28
reason_entry_style.minimal_width = 160
-- Add the confirm reason button
reason_confirm(reason_bar)
-- Add the confirm reason button
reason_confirm(reason_bar)
-- Return the exteral container
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow(true)
-- Return the exteral container
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow(true)
--- Button on the top flow used to toggle the player list container
-- @element toggle_player_list
Gui.left_toolbar_button('entity/character', {'player-list.main-tooltip'}, player_list_container, function(player)
return Roles.player_allowed(player, 'gui/player-list')
Gui.left_toolbar_button("entity/character", { "player-list.main-tooltip" }, player_list_container, function(player)
return Roles.player_allowed(player, "gui/player-list")
end)
-- Get caption and tooltip format for a player
local function get_time_formats(online_time, afk_time)
local tick = game.tick > 0 and game.tick or 1
local percent = math.round(online_time/tick, 3)*100
local percent = math.round(online_time / tick, 3) * 100
local caption = format_time(online_time)
local tooltip = {'player-list.afk-time', percent, format_time(afk_time, {minutes=true, long=true})}
local tooltip = { "player-list.afk-time", percent, format_time(afk_time, { minutes = true, long = true }) }
return caption, tooltip
end
@@ -282,9 +279,9 @@ local function get_player_times()
-- Add the player time details to the array
local caption, tooltip = get_time_formats(player.online_time, player.afk_time)
player_times[ctn] = {
element_name = 'player-time-'..player.index,
element_name = "player-time-" .. player.index,
caption = caption,
tooltip = tooltip
tooltip = tooltip,
}
end
@@ -319,7 +316,7 @@ local function get_player_list_order()
role_name = role_name,
chat_color = player.chat_color,
caption = caption,
tooltip = tooltip
tooltip = tooltip,
}
end
end
@@ -398,9 +395,9 @@ SelectedPlayer:on_update(function(player_name, selected_player)
update_action_bar(frame.container.action_bar)
for _, next_player in pairs(game.connected_players) do
local element = scroll_table[next_player.name][open_action_bar.name]
local style = 'frame_button'
local style = "frame_button"
if next_player.name == selected_player then
style = 'tool_button'
style = "tool_button"
end
element.style = style
local element_style = element.style
@@ -426,9 +423,7 @@ SelectedAction:on_update(function(player_name, selected_action)
SelectedPlayer:remove(player)
SelectedAction:remove(player)
end
else
element.visible = false
end
end)
end)

View File

@@ -11,21 +11,21 @@ local format_number = require("util").format_number --- @dep util
local pd_container
local label_width = {
['name'] = 135,
['count'] = 105,
['total'] = 480
["name"] = 135,
["count"] = 105,
["total"] = 480,
}
local function format_time_short(value)
return format_time(value*3600, {
hours=true,
minutes=true,
seconds=false
return format_time(value * 3600, {
hours = true,
minutes = true,
seconds = false,
})
end
local function format_number_n(n)
return format_number(math.floor(n)) .. string.format('%.2f', n % 1):sub(2)
return format_number(math.floor(n)) .. string.format("%.2f", n % 1):sub(2)
end
local playerStats = PlayerData.Statistics
@@ -33,87 +33,87 @@ local computed_stats = {
DamageDeathRatio = {
default = format_number_n(0),
calculate = function(player_name)
return format_number_n(playerStats['DamageDealt']:get(player_name, 0) / playerStats['Deaths']:get(player_name, 1))
end
return format_number_n(playerStats["DamageDealt"]:get(player_name, 0) / playerStats["Deaths"]:get(player_name, 1))
end,
},
KillDeathRatio = {
default = format_number_n(0),
calculate = function(player_name)
return format_number_n(playerStats['Kills']:get(player_name, 0) / playerStats['Deaths']:get(player_name, 1))
end
return format_number_n(playerStats["Kills"]:get(player_name, 0) / playerStats["Deaths"]:get(player_name, 1))
end,
},
SessionTime = {
default = format_time_short(0),
calculate = function(player_name)
return format_time_short((playerStats['Playtime']:get(player_name, 0) - playerStats['AfkTime']:get(player_name, 0)) / playerStats['JoinCount']:get(player_name, 1))
end
return format_time_short((playerStats["Playtime"]:get(player_name, 0) - playerStats["AfkTime"]:get(player_name, 0)) / playerStats["JoinCount"]:get(player_name, 1))
end,
},
BuildRatio = {
default = format_number_n(0),
calculate = function(player_name)
return format_number_n(playerStats['MachinesBuilt']:get(player_name, 0) / playerStats['MachinesRemoved']:get(player_name, 1))
end
return format_number_n(playerStats["MachinesBuilt"]:get(player_name, 0) / playerStats["MachinesRemoved"]:get(player_name, 1))
end,
},
RocketPerHour = {
default = format_number_n(0),
calculate = function(player_name)
return format_number_n(playerStats['RocketsLaunched']:get(player_name, 0) * 60 / playerStats['Playtime']:get(player_name, 1))
end
return format_number_n(playerStats["RocketsLaunched"]:get(player_name, 0) * 60 / playerStats["Playtime"]:get(player_name, 1))
end,
},
TreeKillPerMinute = {
default = format_number_n(0),
calculate = function(player_name)
return format_number_n(playerStats['TreesDestroyed']:get(player_name, 0) / playerStats['Playtime']:get(player_name, 1))
end
return format_number_n(playerStats["TreesDestroyed"]:get(player_name, 0) / playerStats["Playtime"]:get(player_name, 1))
end,
},
NetPlayTime = {
default = format_time_short(0),
calculate = function(player_name)
return format_time_short((playerStats['Playtime']:get(player_name, 0) - playerStats['AfkTime']:get(player_name, 0)))
end
return format_time_short((playerStats["Playtime"]:get(player_name, 0) - playerStats["AfkTime"]:get(player_name, 0)))
end,
},
AFKTimeRatio = {
default = format_number_n(0),
calculate = function(player_name)
return format_number_n(playerStats['AfkTime']:get(player_name, 0) * 100 / playerStats['Playtime']:get(player_name, 1))
end
return format_number_n(playerStats["AfkTime"]:get(player_name, 0) * 100 / playerStats["Playtime"]:get(player_name, 1))
end,
},
}
local label =
Gui.element(function(_, parent, width, caption, tooltip, name)
local new_label = parent.add{
type = 'label',
caption = caption,
tooltip = tooltip,
name = name,
style = 'heading_2_label'
}
Gui.element(function(_, parent, width, caption, tooltip, name)
local new_label = parent.add{
type = "label",
caption = caption,
tooltip = tooltip,
name = name,
style = "heading_2_label",
}
new_label.style.width = width
return new_label
end)
new_label.style.width = width
return new_label
end)
local pd_data_set =
Gui.element(function(_, parent, name)
local pd_data_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(pd_data_set, label_width['total'], 4, 'disp')
Gui.element(function(_, parent, name)
local pd_data_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(pd_data_set, label_width["total"], 4, "disp")
for _, stat_name in pairs(PlayerData.Statistics.metadata.display_order) do
local child = PlayerData.Statistics[stat_name]
local metadata = child.metadata
local value = metadata.stringify_short and metadata.stringify_short(0) or metadata.stringify and metadata.stringify(0) or format_number(0)
label(disp, label_width['name'], metadata.name or {'exp-statistics.'..stat_name}, metadata.tooltip or {'exp-statistics.'..stat_name..'-tooltip'})
label(disp, label_width['count'], {'readme.data-format', value, metadata.unit or ''}, metadata.value_tooltip or {'exp-statistics.'..stat_name..'-tooltip'}, stat_name)
end
for _, stat_name in pairs(PlayerData.Statistics.metadata.display_order) do
local child = PlayerData.Statistics[stat_name]
local metadata = child.metadata
local value = metadata.stringify_short and metadata.stringify_short(0) or metadata.stringify and metadata.stringify(0) or format_number(0)
label(disp, label_width["name"], metadata.name or { "exp-statistics." .. stat_name }, metadata.tooltip or { "exp-statistics." .. stat_name .. "-tooltip" })
label(disp, label_width["count"], { "readme.data-format", value, metadata.unit or "" }, metadata.value_tooltip or { "exp-statistics." .. stat_name .. "-tooltip" }, stat_name)
end
for stat_name, data in pairs(computed_stats) do
label(disp, label_width['name'], {'exp-statistics.'..stat_name}, {'exp-statistics.'..stat_name..'-tooltip'})
label(disp, label_width['count'], {'readme.data-format', data.default, ''}, {'exp-statistics.'..stat_name..'-tooltip'}, stat_name)
end
for stat_name, data in pairs(computed_stats) do
label(disp, label_width["name"], { "exp-statistics." .. stat_name }, { "exp-statistics." .. stat_name .. "-tooltip" })
label(disp, label_width["count"], { "readme.data-format", data.default, "" }, { "exp-statistics." .. stat_name .. "-tooltip" }, stat_name)
end
return pd_data_set
end)
return pd_data_set
end)
local function pd_update(table, player_name)
for _, stat_name in pairs(PlayerData.Statistics.metadata.display_order) do
@@ -127,79 +127,79 @@ local function pd_update(table, player_name)
else
value = format_number(value or 0)
end
table[stat_name].caption = {'readme.data-format', value, metadata.unit or ''}
table[stat_name].caption = { "readme.data-format", value, metadata.unit or "" }
end
for stat_name, data in pairs(computed_stats) do
table[stat_name].caption = {'readme.data-format', data.calculate(player_name), ''}
table[stat_name].caption = { "readme.data-format", data.calculate(player_name), "" }
end
end
local pd_username_player =
Gui.element(function(definition, parent, player_list)
return parent.add{
name = definition.name,
type = 'drop-down',
items = player_list,
selected_index = #player_list > 0 and 1
}
end)
:style{
horizontally_stretchable = true
}:on_selection_changed(function(_, element, _)
local player_name = game.connected_players[element.selected_index]
local table = element.parent.parent.parent.parent['pd_st_2'].disp.table
pd_update(table, player_name)
end)
:static_name(Gui.unique_static_name)
Gui.element(function(definition, parent, player_list)
return parent.add{
name = definition.name,
type = "drop-down",
items = player_list,
selected_index = #player_list > 0 and 1,
}
end)
:style{
horizontally_stretchable = true,
}:on_selection_changed(function(_, element, _)
local player_name = game.connected_players[element.selected_index]
local table = element.parent.parent.parent.parent["pd_st_2"].disp.table
pd_update(table, player_name)
end)
:static_name(Gui.unique_static_name)
local pd_username_update =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = 'update'
}:style{
width = 128
}:on_click(function(_, element, _)
local player_index = element.parent[pd_username_player.name].selected_index
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = "update",
}:style{
width = 128,
}:on_click(function(_, element, _)
local player_index = element.parent[pd_username_player.name].selected_index
if player_index > 0 then
local player_name = game.connected_players[player_index]
local table = element.parent.parent.parent.parent['pd_st_2'].disp.table
pd_update(table, player_name)
end
end)
if player_index > 0 then
local player_name = game.connected_players[player_index]
local table = element.parent.parent.parent.parent["pd_st_2"].disp.table
pd_update(table, player_name)
end
end)
local pd_username_set =
Gui.element(function(_, parent, name, player_list)
local pd_username_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(pd_username_set, label_width['total'], 2, 'disp')
Gui.element(function(_, parent, name, player_list)
local pd_username_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(pd_username_set, label_width["total"], 2, "disp")
pd_username_player(disp, player_list)
pd_username_update(disp)
pd_username_player(disp, player_list)
pd_username_update(disp)
return pd_username_set
end)
return pd_username_set
end)
pd_container =
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, label_width['total'])
local player_list = {}
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, label_width["total"])
local player_list = {}
for _, player in pairs(game.connected_players) do
table.insert(player_list, player.name)
end
for _, player in pairs(game.connected_players) do
table.insert(player_list, player.name)
end
pd_username_set(container, 'pd_st_1', player_list)
pd_data_set(container, 'pd_st_2')
pd_username_set(container, "pd_st_1", player_list)
pd_data_set(container, "pd_st_2")
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
Gui.left_toolbar_button('item/power-armor-mk2', 'Player Data GUI', pd_container, function(player)
return Roles.player_allowed(player, 'gui/playerdata')
Gui.left_toolbar_button("item/power-armor-mk2", "Player Data GUI", pd_container, function(player)
return Roles.player_allowed(player, "gui/playerdata")
end)
local function gui_player_list_update()
@@ -211,7 +211,7 @@ local function gui_player_list_update()
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, pd_container)
frame.container['pd_st_1'].disp.table[pd_username_player.name].items = player_list
frame.container["pd_st_1"].disp.table[pd_username_player.name].items = player_list
end
end

View File

@@ -12,153 +12,150 @@ local precision = {
[2] = defines.flow_precision_index.one_minute,
[3] = defines.flow_precision_index.ten_minutes,
[4] = defines.flow_precision_index.one_hour,
[5] = defines.flow_precision_index.ten_hours
[5] = defines.flow_precision_index.ten_hours,
}
local font_color = {
-- positive
[1] = {r = 0.3, g = 1, b = 0.3},
[1] = { r = 0.3, g = 1, b = 0.3 },
-- negative
[2] = {r = 1, g = 0.3, b = 0.3}
[2] = { r = 1, g = 0.3, b = 0.3 },
}
local function format_n(n)
local _i, _j, m, i, f = string.format('%.1f', n):find('([-]?)(%d+)([.]?%d*)')
i = i:reverse():gsub('(%d%d%d)', '%1,')
local _i, _j, m, i, f = tostring(n):find("([-]?)(%d+)([.]?%d*)")
i = i:reverse():gsub("(%d%d%d)", "%1,")
if f ~= '' then
return m .. i:reverse():gsub('^,', '') .. f
if f ~= "" then
return m .. i:reverse():gsub("^,", "") .. f
else
return m .. i:reverse():gsub('^,', '') .. '.0'
return m .. i:reverse():gsub("^,", "") .. ".0"
end
end
--- Display group
-- @element production_data_group
local production_data_group =
Gui.element(function(_definition, parent, i)
local item
Gui.element(function(_definition, parent, i)
local item
if i == 0 then
item = parent.add{
type = 'drop-down',
name = 'production_0_e',
items = {'5s', '1m', '10m', '1h', '10h'},
selected_index = 3
if i == 0 then
item = parent.add{
type = "drop-down",
name = "production_0_e",
items = { "5s", "1m", "10m", "1h", "10h" },
selected_index = 3,
}
item.style.width = 80
else
item = parent.add{
type = "choose-elem-button",
name = "production_" .. i .. "_e",
elem_type = "item",
style = "slot_button",
}
item.style.height = 32
item.style.width = 32
end
local data_1 = parent.add{
type = "label",
name = "production_" .. i .. "_1",
caption = "0.0",
style = "heading_2_label",
}
item.style.width = 80
data_1.style.width = 90
data_1.style.horizontal_align = "right"
data_1.style.font_color = font_color[1]
else
item = parent.add{
type = 'choose-elem-button',
name = 'production_' .. i .. '_e',
elem_type = 'item',
style = 'slot_button'
local data_2 = parent.add{
type = "label",
name = "production_" .. i .. "_2",
caption = "0.0",
style = "heading_2_label",
}
item.style.height = 32
item.style.width = 32
end
data_2.style.width = 90
data_2.style.horizontal_align = "right"
data_2.style.font_color = font_color[2]
local data_1 = parent.add{
type = 'label',
name = 'production_' .. i .. '_1',
caption = '0.0',
style = 'heading_2_label'
}
data_1.style.width = 90
data_1.style.horizontal_align = 'right'
data_1.style.font_color = font_color[1]
local data_3 = parent.add{
type = "label",
name = "production_" .. i .. "_3",
caption = "0.0",
style = "heading_2_label",
}
data_3.style.width = 90
data_3.style.horizontal_align = "right"
data_3.style.font_color = font_color[1]
local data_2 = parent.add{
type = 'label',
name = 'production_' .. i .. '_2',
caption = '0.0',
style = 'heading_2_label'
}
data_2.style.width = 90
data_2.style.horizontal_align = 'right'
data_2.style.font_color = font_color[2]
local data_3 = parent.add{
type = 'label',
name = 'production_' .. i .. '_3',
caption = '0.0',
style = 'heading_2_label'
}
data_3.style.width = 90
data_3.style.horizontal_align = 'right'
data_3.style.font_color = font_color[1]
return item
end)
return item
end)
--- A vertical flow containing all the production data
-- @element production_data_set
local production_data_set =
Gui.element(function(_, parent, name)
local production_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(production_set, 350, 4, 'disp')
Gui.element(function(_, parent, name)
local production_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(production_set, 350, 4, "disp")
production_data_group(disp, 0)
production_data_group(disp, 0)
disp['production_0_1'].caption = {'production.label-prod'}
disp['production_0_2'].caption = {'production.label-con'}
disp['production_0_3'].caption = {'production.label-bal'}
disp["production_0_1"].caption = { "production.label-prod" }
disp["production_0_2"].caption = { "production.label-con" }
disp["production_0_3"].caption = { "production.label-bal" }
for i=1, 8 do
production_data_group(disp, i)
end
for i = 1, 8 do
production_data_group(disp, i)
end
return production_set
end)
return production_set
end)
production_container =
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, 350)
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, 350)
production_data_set(container, 'production_st')
production_data_set(container, "production_st")
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
Gui.left_toolbar_button('entity/assembling-machine-3', {'production.main-tooltip'}, production_container, function(player)
return Roles.player_allowed(player, 'gui/production')
Gui.left_toolbar_button("entity/assembling-machine-3", { "production.main-tooltip" }, production_container, function(player)
return Roles.player_allowed(player, "gui/production")
end)
Event.on_nth_tick(60, function()
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, production_container)
local stat = player.force.get_item_production_statistics(player.surface)
local precision_value = precision[frame.container['production_st'].disp.table['production_0_e'].selected_index]
local table = frame.container['production_st'].disp.table
local precision_value = precision[frame.container["production_st"].disp.table["production_0_e"].selected_index]
local table = frame.container["production_st"].disp.table
for i=1, 8 do
local production_prefix = 'production_' .. i
local item = table[production_prefix .. '_e'].elem_value
for i = 1, 8 do
local production_prefix = "production_" .. i
local item = table[production_prefix .. "_e"].elem_value
if item then
local add = math.floor(stat.get_flow_count{name=item, category="input", precision_index=precision_value, count=false} / 6) / 10
local minus = math.floor(stat.get_flow_count{name=item, category="output", precision_index=precision_value, count=false} / 6) / 10
local add = math.floor(stat.get_flow_count{ name = item, category = "input", precision_index = precision_value, count = false } / 6) / 10
local minus = math.floor(stat.get_flow_count{ name = item, category = "output", precision_index = precision_value, count = false } / 6) / 10
local sum = add - minus
table[production_prefix .. '_1'].caption = format_n(add)
table[production_prefix .. '_2'].caption = format_n(minus)
table[production_prefix .. '_3'].caption = format_n(sum)
table[production_prefix .. "_1"].caption = format_n(add)
table[production_prefix .. "_2"].caption = format_n(minus)
table[production_prefix .. "_3"].caption = format_n(sum)
if sum < 0 then
table[production_prefix .. '_3'].style.font_color = font_color[2]
table[production_prefix .. "_3"].style.font_color = font_color[2]
else
table[production_prefix .. '_3'].style.font_color = font_color[1]
table[production_prefix .. "_3"].style.font_color = font_color[1]
end
else
table[production_prefix .. '_1'].caption = '0.0'
table[production_prefix .. '_2'].caption = '0.0'
table[production_prefix .. '_3'].caption = '0.0'
table[production_prefix .. '_3'].style.font_color = font_color[1]
table[production_prefix .. "_1"].caption = "0.0"
table[production_prefix .. "_2"].caption = "0.0"
table[production_prefix .. "_3"].caption = "0.0"
table[production_prefix .. "_3"].style.font_color = font_color[1]
end
end
end

View File

@@ -15,7 +15,7 @@ local format_number = require("util").format_number --- @dep util
local tabs = {}
local function Tab(caption, tooltip, element_define)
tabs[#tabs+1] = {caption, tooltip, element_define}
tabs[#tabs + 1] = { caption, tooltip, element_define }
end
local frame_width = 595 -- controls width of top descriptions
@@ -25,441 +25,445 @@ local scroll_height = 275 -- controls the height of the scrolls
--- Sub content area used within the content areas
-- @element sub_content
local sub_content =
Gui.element{
type = 'frame',
direction = 'vertical',
style = 'inside_deep_frame'
}
:style{
horizontally_stretchable = true,
horizontal_align = 'center',
padding = {2, 2},
top_margin = 2
}
Gui.element{
type = "frame",
direction = "vertical",
style = "inside_deep_frame",
}
:style{
horizontally_stretchable = true,
horizontal_align = "center",
padding = { 2, 2 },
top_margin = 2,
}
--- Table which has a title above it above it
-- @element title_table
local title_table =
Gui.element(function(_, parent, bar_size, caption, column_count)
Gui.title_label(parent, bar_size, caption)
Gui.element(function(_, parent, bar_size, caption, column_count)
Gui.title_label(parent, bar_size, caption)
return parent.add{
type = 'table',
column_count = column_count,
style = 'bordered_table'
return parent.add{
type = "table",
column_count = column_count,
style = "bordered_table",
}
end)
:style{
padding = 0,
cell_padding = 0,
vertical_align = "center",
horizontally_stretchable = true,
}
end)
:style{
padding = 0,
cell_padding = 0,
vertical_align = 'center',
horizontally_stretchable = true
}
--- Scroll to be used with Gui.title_label tables
-- @element title_table_scroll
local title_table_scroll =
Gui.element{
type = 'scroll-pane',
direction = 'vertical',
horizontal_scroll_policy = 'never',
vertical_scroll_policy = 'auto',
style = 'scroll_pane_under_subheader'
}
:style{
padding = {1, 3},
maximal_height = scroll_height,
horizontally_stretchable = true,
}
Gui.element{
type = "scroll-pane",
direction = "vertical",
horizontal_scroll_policy = "never",
vertical_scroll_policy = "auto",
style = "scroll_pane_under_subheader",
}
:style{
padding = { 1, 3 },
maximal_height = scroll_height,
horizontally_stretchable = true,
}
--- Used to connect to servers in server list
-- @element join_server
local join_server =
Gui.element(function(_, parent, server_id, wrong_version)
local status = External.get_server_status(server_id) or 'Offline'
if wrong_version then status = 'Version' end
local flow = parent.add{ name = server_id, type = 'flow' }
local button = flow.add{
type = 'sprite-button',
sprite = 'utility/circuit_network_panel',
hovered_sprite = 'utility/circuit_network_panel',
tooltip = {'readme.servers-connect-'..status, wrong_version},
style = "frame_action_button"
}
Gui.element(function(_, parent, server_id, wrong_version)
local status = External.get_server_status(server_id) or "Offline"
if wrong_version then status = "Version" end
local flow = parent.add{ name = server_id, type = "flow" }
local button = flow.add{
type = "sprite-button",
sprite = "utility/circuit_network_panel",
hovered_sprite = "utility/circuit_network_panel",
tooltip = { "readme.servers-connect-" .. status, wrong_version },
style = "frame_action_button",
}
if status == 'Offline' or status == 'Current' then
button.enabled = false
button.sprite = 'utility/circuit_network_panel'
elseif status == 'Version' then
button.enabled = false
button.sprite = 'utility/shuffle'
elseif status == 'Password' then
button.sprite = 'utility/warning_white'
button.hovered_sprite = 'utility/warning'
elseif status == 'Modded' then
button.sprite = 'utility/downloading_white'
button.hovered_sprite = 'utility/downloading'
end
if status == "Offline" or status == "Current" then
button.enabled = false
button.sprite = "utility/circuit_network_panel"
elseif status == "Version" then
button.enabled = false
button.sprite = "utility/shuffle"
elseif status == "Password" then
button.sprite = "utility/warning_white"
button.hovered_sprite = "utility/warning"
elseif status == "Modded" then
button.sprite = "utility/downloading_white"
button.hovered_sprite = "utility/downloading"
end
return button
end)
:style(Gui.sprite_style(20, -1))
:on_click(function(player, element, _)
local server_id = element.parent.name
External.request_connection(player, server_id, true)
end)
return button
end)
:style(Gui.sprite_style(20, -1))
:on_click(function(player, element, _)
local server_id = element.parent.name
External.request_connection(player, server_id, true)
end)
--- Content area for the welcome tab
-- @element welcome_content
Tab({'readme.welcome-tab'}, {'readme.welcome-tooltip'},
Gui.element(function(_, parent)
local server_details = { name='ExpGaming S0 - Local', welcome='Failed to load description: disconnected from external api.', reset_time='Non Set', branch='Unknown'}
if External.valid() then server_details = External.get_current_server() end
local container = parent.add{ type='flow', direction='vertical' }
local player = Gui.get_player_from_element(parent)
Tab({ "readme.welcome-tab" }, { "readme.welcome-tooltip" },
Gui.element(function(_, parent)
local server_details = { name = "ExpGaming S0 - Local", welcome = "Failed to load description: disconnected from external api.", reset_time = "Non Set", branch = "Unknown" }
if External.valid() then server_details = External.get_current_server() end
local container = parent.add{ type = "flow", direction = "vertical" }
local player = Gui.get_player_from_element(parent)
-- Set up the top flow with logos
local top_flow = container.add{ type='flow' }
top_flow.add{ type='sprite', sprite='file/modules/exp_legacy/modules/gui/logo.png' }
local top_vertical_flow = top_flow.add{ type='flow', direction='vertical' }
top_flow.add{ type='sprite', sprite='file/modules/exp_legacy/modules/gui/logo.png' }
top_vertical_flow.style.horizontal_align = 'center'
-- Set up the top flow with logos
local top_flow = container.add{ type = "flow" }
top_flow.add{ type = "sprite", sprite = "file/modules/exp_legacy/modules/gui/logo.png" }
local top_vertical_flow = top_flow.add{ type = "flow", direction = "vertical" }
top_flow.add{ type = "sprite", sprite = "file/modules/exp_legacy/modules/gui/logo.png" }
top_vertical_flow.style.horizontal_align = "center"
-- Add the title and description to the top flow
Gui.title_label(top_vertical_flow, 62, 'Welcome to '..server_details.name)
Gui.centered_label(top_vertical_flow, 380, server_details.welcome)
Gui.bar(container)
-- Add the title and description to the top flow
Gui.title_label(top_vertical_flow, 62, "Welcome to " .. server_details.name)
Gui.centered_label(top_vertical_flow, 380, server_details.welcome)
Gui.bar(container)
-- Get the names of the roles the player has
local player_roles = Roles.get_player_roles(player)
local role_names = {}
for i, role in ipairs(player_roles) do
role_names[i] = role.name
end
-- Get the names of the roles the player has
local player_roles = Roles.get_player_roles(player)
local role_names = {}
for i, role in ipairs(player_roles) do
role_names[i] = role.name
end
-- Add the other information to the gui
container.add{ type='flow' }.style.height = 4
local online_time = format_time(game.tick, {days=true, hours=true, minutes=true, long=true})
Gui.centered_label(sub_content(container), frame_width, {'readme.welcome-general', server_details.reset_time, online_time})
Gui.centered_label(sub_content(container), frame_width, {'readme.welcome-roles', table.concat(role_names, ', ')})
Gui.centered_label(sub_content(container), frame_width, {'readme.welcome-chat'})
-- Add the other information to the gui
container.add{ type = "flow" }.style.height = 4
local online_time = format_time(game.tick, { days = true, hours = true, minutes = true, long = true })
Gui.centered_label(sub_content(container), frame_width, { "readme.welcome-general", server_details.reset_time, online_time })
Gui.centered_label(sub_content(container), frame_width, { "readme.welcome-roles", table.concat(role_names, ", ") })
Gui.centered_label(sub_content(container), frame_width, { "readme.welcome-chat" })
return container
end))
return container
end))
--- Content area for the rules tab
-- @element rules_content
Tab({'readme.rules-tab'}, {'readme.rules-tooltip'},
Gui.element(function(_, parent)
local container = parent.add{ type='flow', direction='vertical' }
Tab({ "readme.rules-tab" }, { "readme.rules-tooltip" },
Gui.element(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
-- Add the title and description to the content
Gui.title_label(container, title_width-3, {'readme.rules-tab'})
Gui.centered_label(container, frame_width, {'readme.rules-general'})
Gui.bar(container)
container.add{ type='flow' }
-- Add the title and description to the content
Gui.title_label(container, title_width - 3, { "readme.rules-tab" })
Gui.centered_label(container, frame_width, { "readme.rules-general" })
Gui.bar(container)
container.add{ type = "flow" }
-- Add a table for the rules
local rules = Gui.scroll_table(container, scroll_height, 1)
rules.style = 'bordered_table'
rules.style.cell_padding = 4
-- Add a table for the rules
local rules = Gui.scroll_table(container, scroll_height, 1)
rules.style = "bordered_table"
rules.style.cell_padding = 4
-- Add the rules to the table
for i = 1, 15 do
Gui.centered_label(rules, 565, {'readme.rules-'..i})
end
-- Add the rules to the table
for i = 1, 15 do
Gui.centered_label(rules, 565, { "readme.rules-" .. i })
end
return container
end))
return container
end))
--- Content area for the commands tab
-- @element commands_content
Tab({'readme.commands-tab'}, {'readme.commands-tooltip'},
Gui.element(function(_, parent)
local container = parent.add{ type='flow', direction='vertical' }
local player = Gui.get_player_from_element(parent)
Tab({ "readme.commands-tab" }, { "readme.commands-tooltip" },
Gui.element(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
local player = Gui.get_player_from_element(parent)
-- Add the title and description to the content
Gui.title_label(container, title_width-20, {'readme.commands-tab'})
Gui.centered_label(container, frame_width, {'readme.commands-general'})
Gui.bar(container)
container.add{ type='flow' }
-- Add the title and description to the content
Gui.title_label(container, title_width - 20, { "readme.commands-tab" })
Gui.centered_label(container, frame_width, { "readme.commands-general" })
Gui.bar(container)
container.add{ type = "flow" }
-- Add a table for the commands
local commands = Gui.scroll_table(container, scroll_height, 2)
commands.style = 'bordered_table'
commands.style.cell_padding = 0
-- Add a table for the commands
local commands = Gui.scroll_table(container, scroll_height, 2)
commands.style = "bordered_table"
commands.style.cell_padding = 0
-- Add the rules to the table
for name, command in pairs(Commands.get(player)) do
Gui.centered_label(commands, 120, name)
Gui.centered_label(commands, 450, command.help)
end
-- Add the rules to the table
for name, command in pairs(Commands.get(player)) do
Gui.centered_label(commands, 120, name)
Gui.centered_label(commands, 450, command.help)
end
return container
end))
return container
end))
--- Content area for the servers tab
-- @element servers_content
Tab({'readme.servers-tab'}, {'readme.servers-tooltip'},
Gui.element(function(_, parent)
local container = parent.add{ type='flow', direction='vertical' }
Tab({ "readme.servers-tab" }, { "readme.servers-tooltip" },
Gui.element(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
-- Add the title and description to the content
Gui.title_label(container, title_width-10, {'readme.servers-tab'})
Gui.centered_label(container, frame_width, {'readme.servers-general'})
Gui.bar(container)
container.add{ type='flow' }
-- Add the title and description to the content
Gui.title_label(container, title_width - 10, { "readme.servers-tab" })
Gui.centered_label(container, frame_width, { "readme.servers-general" })
Gui.bar(container)
container.add{ type = "flow" }
-- Draw the scroll
local scroll_pane = title_table_scroll(container)
scroll_pane.style.maximal_height = scroll_height + 20 -- the text is a bit shorter
-- Draw the scroll
local scroll_pane = title_table_scroll(container)
scroll_pane.style.maximal_height = scroll_height + 20 -- the text is a bit shorter
-- Add the factorio servers
if External.valid() then
local factorio_servers = title_table(scroll_pane, 225, {'readme.servers-factorio'}, 3)
local current_version = External.get_current_server().version
for server_id, server in pairs(External.get_servers()) do
Gui.centered_label(factorio_servers, 110, server.short_name)
Gui.centered_label(factorio_servers, 436, server.description)
join_server(factorio_servers, server_id, current_version ~= server.version and server.version)
-- Add the factorio servers
if External.valid() then
local factorio_servers = title_table(scroll_pane, 225, { "readme.servers-factorio" }, 3)
local current_version = External.get_current_server().version
for server_id, server in pairs(External.get_servers()) do
Gui.centered_label(factorio_servers, 110, server.short_name)
Gui.centered_label(factorio_servers, 436, server.description)
join_server(factorio_servers, server_id, current_version ~= server.version and server.version)
end
else
local factorio_servers = title_table(scroll_pane, 225, { "readme.servers-factorio" }, 2)
for i = 1, 8 do
Gui.centered_label(factorio_servers, 110, { "readme.servers-" .. i })
Gui.centered_label(factorio_servers, 460, { "readme.servers-d" .. i })
end
end
else
local factorio_servers = title_table(scroll_pane, 225, {'readme.servers-factorio'}, 2)
for i = 1, 8 do
Gui.centered_label(factorio_servers, 110, {'readme.servers-'..i})
Gui.centered_label(factorio_servers, 460, {'readme.servers-d'..i})
-- Add the external links
local external_links = title_table(scroll_pane, 235, { "readme.servers-external" }, 2)
for _, key in ipairs{ "discord", "website", "patreon", "status", "github" } do
local upper_key = key:gsub("^%l", string.upper)
Gui.centered_label(external_links, 110, upper_key)
Gui.centered_label(external_links, 460, { "links." .. key }, { "readme.servers-open-in-browser" })
end
end
-- Add the external links
local external_links = title_table(scroll_pane, 235, {'readme.servers-external'}, 2)
for _, key in ipairs{'discord', 'website', 'patreon', 'status', 'github'} do
local upper_key = key:gsub("^%l", string.upper)
Gui.centered_label(external_links, 110, upper_key)
Gui.centered_label(external_links, 460, {'links.'..key}, {'readme.servers-open-in-browser'})
end
return container
end))
return container
end))
--- Content area for the servers tab
-- @element backers_content
Tab({'readme.backers-tab'}, {'readme.backers-tooltip'},
Gui.element(function(_, parent)
local container = parent.add{ type='flow', direction='vertical' }
Tab({ "readme.backers-tab" }, { "readme.backers-tooltip" },
Gui.element(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
-- Add the title and description to the content
Gui.title_label(container, title_width-10, {'readme.backers-tab'})
Gui.centered_label(container, frame_width, {'readme.backers-general'})
Gui.bar(container)
container.add{ type='flow' }
-- Add the title and description to the content
Gui.title_label(container, title_width - 10, { "readme.backers-tab" })
Gui.centered_label(container, frame_width, { "readme.backers-general" })
Gui.bar(container)
container.add{ type = "flow" }
-- Find which players will go where
local done = {}
local groups = {
{ _roles={'Senior Administrator', 'Administrator'}, _title={'readme.backers-management'}, _width=230 },
{ _roles={'Board Member', 'Senior Backer'}, _title={'readme.backers-board'}, _width=145 }, -- change role to board
{ _roles={'Sponsor', 'Supporter'}, _title={'readme.backers-backers'}, _width=196 }, -- change to backer
{ _roles={'Moderator', 'Trainee'}, _title={'readme.backers-staff'}, _width=235 },
{ _roles={}, _time=3*3600*60, _title={'readme.backers-active'}, _width=235 },
}
-- Find which players will go where
local done = {}
local groups = {
{ _roles = { "Senior Administrator", "Administrator" }, _title = { "readme.backers-management" }, _width = 230 },
{ _roles = { "Board Member", "Senior Backer" }, _title = { "readme.backers-board" }, _width = 145 }, -- change role to board
{ _roles = { "Sponsor", "Supporter" }, _title = { "readme.backers-backers" }, _width = 196 }, -- change to backer
{ _roles = { "Moderator", "Trainee" }, _title = { "readme.backers-staff" }, _width = 235 },
{ _roles = {}, _time = 3 * 3600 * 60, _title = { "readme.backers-active" }, _width = 235 },
}
-- Fill by player roles
for player_name, player_roles in pairs(Roles.config.players) do
for _, players in ipairs(groups) do
for _, role_name in pairs(players._roles) do
if table.contains(player_roles, role_name) then
done[player_name] = true
table.insert(players, player_name)
break
end
end
end
end
-- Fill by active times
for _, player in pairs(game.players) do
if not done[player.name] then
-- Fill by player roles
for player_name, player_roles in pairs(Roles.config.players) do
for _, players in ipairs(groups) do
if players._time and player.online_time > players._time then
table.insert(players, player.name)
for _, role_name in pairs(players._roles) do
if table.contains(player_roles, role_name) then
done[player_name] = true
table.insert(players, player_name)
break
end
end
end
end
end
-- Add the different tables
local scroll_pane = title_table_scroll(container)
for _, players in ipairs(groups) do
local table = title_table(scroll_pane, players._width, players._title, 4)
for _, player_name in ipairs(players) do
Gui.centered_label(table, 140, player_name)
end
if #players < 4 then
for i = 1, 4-#players do
Gui.centered_label(table, 140)
-- Fill by active times
for _, player in pairs(game.players) do
if not done[player.name] then
for _, players in ipairs(groups) do
if players._time and player.online_time > players._time then
table.insert(players, player.name)
end
end
end
end
end
return container
end))
-- Add the different tables
local scroll_pane = title_table_scroll(container)
for _, players in ipairs(groups) do
local table = title_table(scroll_pane, players._width, players._title, 4)
for _, player_name in ipairs(players) do
Gui.centered_label(table, 140, player_name)
end
if #players < 4 then
for i = 1, 4 - #players do
Gui.centered_label(table, 140)
end
end
end
return container
end))
--- Content area for the player data tab
-- @element commands_content
Tab({'readme.data-tab'}, {'readme.data-tooltip'},
Gui.element(function(_, parent)
local container = parent.add{ type='flow', direction='vertical' }
local player = Gui.get_player_from_element(parent)
local player_name = player.name
Tab({ "readme.data-tab" }, { "readme.data-tooltip" },
Gui.element(function(_, parent)
local container = parent.add{ type = "flow", direction = "vertical" }
local player = Gui.get_player_from_element(parent)
local player_name = player.name
local enum = PlayerData.PreferenceEnum
local preference = PlayerData.DataSavingPreference:get(player_name)
local preference_meta = PlayerData.DataSavingPreference.metadata
preference = enum[preference]
local enum = PlayerData.PreferenceEnum
local preference = PlayerData.DataSavingPreference:get(player_name)
local preference_meta = PlayerData.DataSavingPreference.metadata
preference = enum[preference]
-- Add the title and description to the content
Gui.title_label(container, title_width, {'readme.data-tab'})
Gui.centered_label(container, frame_width, {'readme.data-general'})
Gui.bar(container)
container.add{ type='flow' }
local scroll_pane = title_table_scroll(container)
-- Add the title and description to the content
Gui.title_label(container, title_width, { "readme.data-tab" })
Gui.centered_label(container, frame_width, { "readme.data-general" })
Gui.bar(container)
container.add{ type = "flow" }
local scroll_pane = title_table_scroll(container)
-- Add the required area
local required = title_table(scroll_pane, 250, {'readme.data-required'}, 2)
Gui.centered_label(required, 150, preference_meta.name, preference_meta.tooltip)
Gui.centered_label(required, 420, {'expcore-data.preference-'..enum[preference]}, preference_meta.value_tooltip)
-- Add the required area
local required = title_table(scroll_pane, 250, { "readme.data-required" }, 2)
Gui.centered_label(required, 150, preference_meta.name, preference_meta.tooltip)
Gui.centered_label(required, 420, { "expcore-data.preference-" .. enum[preference] }, preference_meta.value_tooltip)
for name, child in pairs(PlayerData.Required.children) do
local metadata = child.metadata
local value = child:get(player_name)
if value ~= nil or metadata.show_always then
if metadata.stringify then value = metadata.stringify(value) end
Gui.centered_label(required, 150, metadata.name or {'exp-required.'..name}, metadata.tooltip or {'exp-required.'..name..'-tooltip'})
Gui.centered_label(required, 420, tostring(value), metadata.value_tooltip or {'exp-required.'..name..'-value-tooltip'})
end
end
-- Add the settings area
if preference <= enum.Settings then
local settings = title_table(scroll_pane, 255, {'readme.data-settings'}, 2)
for name, child in pairs(PlayerData.Settings.children) do
local metadata = child.metadata
local value = child:get(player_name)
if not metadata.permission or Roles.player_allowed(player, metadata.permission) then
if metadata.stringify then value = metadata.stringify(value) end
if value == nil then value = 'None set' end
Gui.centered_label(settings, 150, metadata.name or {'exp-settings.'..name}, metadata.tooltip or {'exp-settings.'..name..'-tooltip'})
Gui.centered_label(settings, 420, tostring(value), metadata.value_tooltip or {'exp-settings.'..name..'-value-tooltip'})
end
end
end
-- Add the statistics area
if preference <= enum.Statistics then
local count = 4
local statistics = title_table(scroll_pane, 250, {'readme.data-statistics'}, 4)
for _, name in pairs(PlayerData.Statistics.metadata.display_order) do
local child = PlayerData.Statistics[name]
for name, child in pairs(PlayerData.Required.children) do
local metadata = child.metadata
local value = child:get(player_name)
if value ~= nil or metadata.show_always then
count = count - 2
if metadata.stringify then value = metadata.stringify(value)
else value = format_number(value or 0) end
Gui.centered_label(statistics, 150, metadata.name or {'exp-statistics.'..name}, metadata.tooltip or {'exp-statistics.'..name..'-tooltip'})
Gui.centered_label(statistics, 130, {'readme.data-format', value, metadata.unit or ''}, metadata.value_tooltip or {'exp-statistics.'..name..'-tooltip'})
if metadata.stringify then value = metadata.stringify(value) end
Gui.centered_label(required, 150, metadata.name or { "exp-required." .. name }, metadata.tooltip or { "exp-required." .. name .. "-tooltip" })
Gui.centered_label(required, 420, tostring(value), metadata.value_tooltip or { "exp-required." .. name .. "-value-tooltip" })
end
end
if count > 0 then for i = 1, count do Gui.centered_label(statistics, 140) end end
end
-- Add the misc area
local skip = {DataSavingPreference=true, Settings=true, Statistics=true, Required=true}
local count = 0; for _ in pairs(PlayerData.All.children) do count = count + 1 end
if preference <= enum.All and count > 4 then
local misc = title_table(scroll_pane, 232, {'readme.data-misc'}, 2)
for name, child in pairs(PlayerData.All.children) do
if not skip[name] then
-- Add the settings area
if preference <= enum.Settings then
local settings = title_table(scroll_pane, 255, { "readme.data-settings" }, 2)
for name, child in pairs(PlayerData.Settings.children) do
local metadata = child.metadata
local value = child:get(player_name)
if value ~= nil or metadata.show_always then
if not metadata.permission or Roles.player_allowed(player, metadata.permission) then
if metadata.stringify then value = metadata.stringify(value) end
Gui.centered_label(misc, 150, metadata.name or name, metadata.tooltip)
Gui.centered_label(misc, 420, tostring(value), metadata.value_tooltip)
if value == nil then value = "None set" end
Gui.centered_label(settings, 150, metadata.name or { "exp-settings." .. name }, metadata.tooltip or { "exp-settings." .. name .. "-tooltip" })
Gui.centered_label(settings, 420, tostring(value), metadata.value_tooltip or { "exp-settings." .. name .. "-value-tooltip" })
end
end
end
end
return container
end))
-- Add the statistics area
if preference <= enum.Statistics then
local count = 4
local statistics = title_table(scroll_pane, 250, { "readme.data-statistics" }, 4)
for _, name in pairs(PlayerData.Statistics.metadata.display_order) do
local child = PlayerData.Statistics[name]
local metadata = child.metadata
local value = child:get(player_name)
if value ~= nil or metadata.show_always then
count = count - 2
if metadata.stringify then
value = metadata.stringify(value)
else
value = format_number(value or 0)
end
Gui.centered_label(statistics, 150, metadata.name or { "exp-statistics." .. name }, metadata.tooltip or { "exp-statistics." .. name .. "-tooltip" })
Gui.centered_label(statistics, 130, { "readme.data-format", value, metadata.unit or "" }, metadata.value_tooltip or { "exp-statistics." .. name .. "-tooltip" })
end
end
if count > 0 then for i = 1, count do Gui.centered_label(statistics, 140) end end
end
-- Add the misc area
local skip = { DataSavingPreference = true, Settings = true, Statistics = true, Required = true }
local count = 0; for _ in pairs(PlayerData.All.children) do count = count + 1 end
if preference <= enum.All and count > 4 then
local misc = title_table(scroll_pane, 232, { "readme.data-misc" }, 2)
for name, child in pairs(PlayerData.All.children) do
if not skip[name] then
local metadata = child.metadata
local value = child:get(player_name)
if value ~= nil or metadata.show_always then
if metadata.stringify then value = metadata.stringify(value) end
Gui.centered_label(misc, 150, metadata.name or name, metadata.tooltip)
Gui.centered_label(misc, 420, tostring(value), metadata.value_tooltip)
end
end
end
end
return container
end))
--- Main readme container for the center flow
-- @element readme
local readme_toggle
local readme =
Gui.element(function(definition, parent)
local container = parent.add{
name = definition.name,
type = 'frame',
style = 'invisible_frame'
}
Gui.element(function(definition, parent)
local container = parent.add{
name = definition.name,
type = "frame",
style = "invisible_frame",
}
-- Add the left hand side of the frame back, removed because of frame_tabbed_pane style
local left_alignment = Gui.alignment(container, nil, nil, 'bottom')
left_alignment.style.padding = {32, 0,0, 0}
-- Add the left hand side of the frame back, removed because of frame_tabbed_pane style
local left_alignment = Gui.alignment(container, nil, nil, "bottom")
left_alignment.style.padding = { 32, 0, 0, 0 }
local left_side =
left_alignment.add{
type = 'frame',
style = 'character_gui_left_side'
}
left_side.style.vertically_stretchable = true
left_side.style.padding = 0
left_side.style.width = 5
local left_side =
left_alignment.add{
type = "frame",
style = "character_gui_left_side",
}
left_side.style.vertically_stretchable = true
left_side.style.padding = 0
left_side.style.width = 5
-- Add the tab pane
local tab_pane = container.add{
name = 'pane',
type = 'tabbed-pane',
style = 'frame_tabbed_pane'
}
-- Add the tab pane
local tab_pane = container.add{
name = "pane",
type = "tabbed-pane",
style = "frame_tabbed_pane",
}
-- Add the different content areas
for _, tab_details in ipairs(tabs) do
local tab = tab_pane.add{ type = 'tab', style = 'frame_tab', caption = tab_details[1], tooltip = tab_details[2] }
tab_pane.add_tab(tab, tab_details[3](tab_pane))
end
-- Add the different content areas
for _, tab_details in ipairs(tabs) do
local tab = tab_pane.add{ type = "tab", style = "frame_tab", caption = tab_details[1], tooltip = tab_details[2] }
tab_pane.add_tab(tab, tab_details[3](tab_pane))
end
return container
end)
:static_name(Gui.unique_static_name)
:on_open(function(player)
Gui.toggle_toolbar_button(player, readme_toggle, true)
end)
:on_close(function(player, element)
Gui.toggle_toolbar_button(player, readme_toggle, false)
Gui.destroy_if_valid(element)
end)
return container
end)
:static_name(Gui.unique_static_name)
:on_open(function(player)
Gui.toggle_toolbar_button(player, readme_toggle, true)
end)
:on_close(function(player, element)
Gui.toggle_toolbar_button(player, readme_toggle, false)
Gui.destroy_if_valid(element)
end)
--- Toggle button for the readme gui
-- @element readme_toggle
readme_toggle =
Gui.toolbar_button('virtual-signal/signal-info', {'readme.main-tooltip'}, function(player)
return Roles.player_allowed(player, 'gui/readme')
end)
:on_click(function(player, _)
local center = player.gui.center
if center[readme.name] then
player.opened = nil
else
player.opened = readme(center)
end
end)
Gui.toolbar_button("virtual-signal/signal-info", { "readme.main-tooltip" }, function(player)
return Roles.player_allowed(player, "gui/readme")
end)
:on_click(function(player, _)
local center = player.gui.center
if center[readme.name] then
player.opened = nil
else
player.opened = readme(center)
end
end)
--- When a player joins the game for the first time show this gui
Event.add(defines.events.on_player_created, function(event)
@@ -483,4 +487,4 @@ Event.add(defines.events.on_player_respawned, function(event)
if not player.opened then
player.gui.center.clear()
end
end)
end)

View File

@@ -17,312 +17,307 @@ research.time = {}
research.res_queue_enable = false
local research_time_format = {
hours=true,
minutes=true,
seconds=true,
time=true,
string=true
hours = true,
minutes = true,
seconds = true,
time = true,
string = true,
}
local empty_time = format_time(0, {
hours=true,
minutes=true,
seconds=true,
time=true,
string=true,
null=true
hours = true,
minutes = true,
seconds = true,
time = true,
string = true,
null = true,
})
local font_color = {
-- positive
[1] = {r = 0.3, g = 1, b = 0.3},
-- negative
[2] = {r = 1, g = 0.3, b = 0.3}
-- positive
[1] = { r = 0.3, g = 1, b = 0.3 },
-- negative
[2] = { r = 1, g = 0.3, b = 0.3 },
}
local res = {
['lookup_name'] = {},
['disp'] = {}
["lookup_name"] = {},
["disp"] = {},
}
do
local res_total = 0
local i = 1
local res_total = 0
local i = 1
for k, v in pairs(config.milestone) do
research.time[i] = 0
res['lookup_name'][k] = i
res_total = res_total + v * 60
for k, v in pairs(config.milestone) do
research.time[i] = 0
res["lookup_name"][k] = i
res_total = res_total + v * 60
res['disp'][i] = {
raw_name = k,
target = res_total,
target_disp = format_time(res_total, research_time_format),
}
res["disp"][i] = {
raw_name = k,
target = res_total,
target_disp = format_time(res_total, research_time_format),
}
i = i + 1
end
i = i + 1
end
end
local function research_add_log()
local result_data = {}
local result_data = {}
for i=1, #research.time, 1 do
result_data[res['disp'][i]['raw_name']] = research.time[i]
end
for i = 1, #research.time, 1 do
result_data[res["disp"][i]["raw_name"]] = research.time[i]
end
game.write_file(config.file_name, game.table_to_json(result_data) .. '\n', true, 0)
game.write_file(config.file_name, game.table_to_json(result_data) .. "\n", true, 0)
end
local function research_res_n(res_)
local res_n = 1
local res_n = 1
for k, _ in pairs(res_) do
if research.time[k] == 0 then
res_n = k - 1
break
end
end
for k, _ in pairs(res_) do
if research.time[k] == 0 then
res_n = k - 1
break
end
end
if research.time[#res_] and research.time[#res_] > 0 then
if res_n == 1 then
res_n = #res_
end
end
if research.time[#res_] and research.time[#res_] > 0 then
if res_n == 1 then
res_n = #res_
end
end
if res_n < 3 then
res_n = 3
if res_n < 3 then
res_n = 3
elseif res_n > (#research.time - 5) then
res_n = #research.time - 5
end
elseif res_n > (#research.time - 5) then
res_n = #research.time - 5
end
return res_n
return res_n
end
local function research_notification(event)
if config.inf_res[event.research.name] then
if event.research.name == 'mining-productivity-4' then
if event.research.level == 5 then
-- Add run result to log
research_add_log()
end
if event.research.name == "mining-productivity-4" then
if event.research.level == 5 then
-- Add run result to log
research_add_log()
end
if config.bonus_inventory.enabled then
if (event.research.level - 1) <= math.ceil(config.bonus_inventory.limit / config.bonus_inventory.rate) then
event.research.force[config.bonus_inventory.name] = math.max((event.research.level - 1) * config.bonus_inventory.rate, config.bonus_inventory.limit)
end
end
if config.bonus_inventory.enabled then
if (event.research.level - 1) <= math.ceil(config.bonus_inventory.limit / config.bonus_inventory.rate) then
event.research.force[config.bonus_inventory.name] = math.max((event.research.level - 1) * config.bonus_inventory.rate, config.bonus_inventory.limit)
end
end
if config.pollution_ageing_by_research then
game.map_settings.pollution.ageing = math.min(10, event.research.level / 5)
end
else
if not (event.by_script) then
game.print{'expcom-res.inf', format_time(game.tick, research_time_format), event.research.name, event.research.level - 1}
end
end
else
if config.pollution_ageing_by_research then
game.map_settings.pollution.ageing = math.min(10, event.research.level / 5)
end
else
if not (event.by_script) then
game.print{ "expcom-res.inf", format_time(game.tick, research_time_format), event.research.name, event.research.level - 1 }
end
end
else
if not (event.by_script) then
game.print{'expcom-res.msg', format_time(game.tick, research_time_format), event.research.name}
game.print{ "expcom-res.msg", format_time(game.tick, research_time_format), event.research.name }
end
if config.bonus_inventory.enabled then
if event.research.name == 'mining-productivity-1' or event.research.name == 'mining-productivity-2' or event.research.name == 'mining-productivity-3' then
event.research.force[config.bonus_inventory.name] = event.research.level * config.bonus_inventory.rate
end
end
if config.bonus_inventory.enabled then
if event.research.name == "mining-productivity-1" or event.research.name == "mining-productivity-2" or event.research.name == "mining-productivity-3" then
event.research.force[config.bonus_inventory.name] = event.research.level * config.bonus_inventory.rate
end
end
end
end
local function research_gui_update()
local res_disp = {}
local res_n = research_res_n(res['disp'])
local res_disp = {}
local res_n = research_res_n(res["disp"])
for i=1, 8, 1 do
res_disp[i] = {
['name'] = '',
['target'] = '',
['attempt'] = '',
['difference'] = '',
['difference_color'] = font_color[1]
}
for i = 1, 8, 1 do
res_disp[i] = {
["name"] = "",
["target"] = "",
["attempt"] = "",
["difference"] = "",
["difference_color"] = font_color[1],
}
local res_i = res_n + i - 3
local res_i = res_n + i - 3
if res['disp'][res_i] then
res_disp[i]['name'] = {'expcom-res.res-name', res['disp'][res_i]['raw_name'], prototypes.technology[res['disp'][res_i]['raw_name']].localised_name}
if res["disp"][res_i] then
res_disp[i]["name"] = { "expcom-res.res-name", res["disp"][res_i]["raw_name"], prototypes.technology[res["disp"][res_i]["raw_name"]].localised_name }
if research.time[res_i] == 0 then
res_disp[i]['target'] = res['disp'][res_i].target_disp
res_disp[i]['attempt'] = empty_time
res_disp[i]['difference'] = empty_time
res_disp[i]['difference_color'] = font_color[1]
if research.time[res_i] == 0 then
res_disp[i]["target"] = res["disp"][res_i].target_disp
res_disp[i]["attempt"] = empty_time
res_disp[i]["difference"] = empty_time
res_disp[i]["difference_color"] = font_color[1]
else
res_disp[i]["target"] = res["disp"][res_i].target_disp
res_disp[i]["attempt"] = format_time(research.time[res_i], research_time_format)
else
res_disp[i]['target'] = res['disp'][res_i].target_disp
res_disp[i]['attempt'] = format_time(research.time[res_i], research_time_format)
if research.time[res_i] < res["disp"][res_i].target then
res_disp[i]["difference"] = "-" .. format_time(res["disp"][res_i].target - research.time[res_i], research_time_format)
res_disp[i]["difference_color"] = font_color[1]
else
res_disp[i]["difference"] = format_time(research.time[res_i] - res["disp"][res_i].target, research_time_format)
res_disp[i]["difference_color"] = font_color[2]
end
end
end
end
if research.time[res_i] < res['disp'][res_i].target then
res_disp[i]['difference'] = '-' .. format_time(res['disp'][res_i].target - research.time[res_i], research_time_format)
res_disp[i]['difference_color'] = font_color[1]
else
res_disp[i]['difference'] = format_time(research.time[res_i] - res['disp'][res_i].target, research_time_format)
res_disp[i]['difference_color'] = font_color[2]
end
end
end
end
return res_disp
return res_disp
end
--- Display label for the clock display
-- @element research_gui_clock_display
local research_gui_clock =
Gui.element{
type = 'label',
name = Gui.unique_static_name,
caption = empty_time,
style = 'heading_2_label'
}
Gui.element{
type = "label",
name = Gui.unique_static_name,
caption = empty_time,
style = "heading_2_label",
}
--- A vertical flow containing the clock
-- @element research_clock_set
local research_clock_set =
Gui.element(function(_, parent, name)
local research_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(research_set, 390, 1, 'disp')
Gui.element(function(_, parent, name)
local research_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(research_set, 390, 1, "disp")
research_gui_clock(disp)
research_gui_clock(disp)
return research_set
end)
return research_set
end)
--- Display group
-- @element research_data_group
local research_data_group =
Gui.element(function(_definition, parent, i)
local name = parent.add{
type = 'label',
name = 'research_' .. i .. '_name',
caption = '',
style = 'heading_2_label'
}
name.style.width = 180
name.style.horizontal_align = 'left'
Gui.element(function(_definition, parent, i)
local name = parent.add{
type = "label",
name = "research_" .. i .. "_name",
caption = "",
style = "heading_2_label",
}
name.style.width = 180
name.style.horizontal_align = "left"
local target = parent.add{
type = 'label',
name = 'research_' .. i .. '_target',
caption = '',
style = 'heading_2_label'
}
target.style.width = 70
target.style.horizontal_align = 'right'
local target = parent.add{
type = "label",
name = "research_" .. i .. "_target",
caption = "",
style = "heading_2_label",
}
target.style.width = 70
target.style.horizontal_align = "right"
local attempt = parent.add{
type = 'label',
name = 'research_' .. i .. '_attempt',
caption = '',
style = 'heading_2_label'
}
attempt.style.width = 70
attempt.style.horizontal_align = 'right'
local attempt = parent.add{
type = "label",
name = "research_" .. i .. "_attempt",
caption = "",
style = "heading_2_label",
}
attempt.style.width = 70
attempt.style.horizontal_align = "right"
local difference = parent.add{
type = 'label',
name = 'research_' .. i .. '_difference',
caption = '',
style = 'heading_2_label'
}
difference.style.width = 70
difference.style.horizontal_align = 'right'
difference.style.font_color = font_color[1]
end)
local difference = parent.add{
type = "label",
name = "research_" .. i .. "_difference",
caption = "",
style = "heading_2_label",
}
difference.style.width = 70
difference.style.horizontal_align = "right"
difference.style.font_color = font_color[1]
end)
--- A vertical flow containing the data
-- @element research_data_set
local research_data_set =
Gui.element(function(_, parent, name)
local research_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(research_set, 390, 4, 'disp')
local res_disp = research_gui_update()
Gui.element(function(_, parent, name)
local research_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(research_set, 390, 4, "disp")
local res_disp = research_gui_update()
research_data_group(disp, 0)
disp['research_0_name'].caption = {'expcom-res.name'}
disp['research_0_target'].caption = {'expcom-res.target'}
disp['research_0_attempt'].caption = {'expcom-res.attempt'}
disp['research_0_difference'].caption = {'expcom-res.difference'}
research_data_group(disp, 0)
disp["research_0_name"].caption = { "expcom-res.name" }
disp["research_0_target"].caption = { "expcom-res.target" }
disp["research_0_attempt"].caption = { "expcom-res.attempt" }
disp["research_0_difference"].caption = { "expcom-res.difference" }
for i=1, 8, 1 do
research_data_group(disp, i)
for i = 1, 8, 1 do
research_data_group(disp, i)
local research_name_i = 'research_' .. i
local research_name_i = "research_" .. i
disp[research_name_i .. '_name'].caption = res_disp[i]['name']
disp[research_name_i .. '_target'].caption = res_disp[i]['target']
disp[research_name_i .. '_attempt'].caption = res_disp[i]['attempt']
disp[research_name_i .. '_difference'].caption = res_disp[i]['difference']
disp[research_name_i .. '_difference'].style.font_color = res_disp[i]['difference_color']
end
disp[research_name_i .. "_name"].caption = res_disp[i]["name"]
disp[research_name_i .. "_target"].caption = res_disp[i]["target"]
disp[research_name_i .. "_attempt"].caption = res_disp[i]["attempt"]
disp[research_name_i .. "_difference"].caption = res_disp[i]["difference"]
disp[research_name_i .. "_difference"].style.font_color = res_disp[i]["difference_color"]
end
return research_set
end)
return research_set
end)
local research_container =
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, 390)
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, 390)
research_clock_set(container, 'research_st_1')
research_data_set(container, 'research_st_2')
research_clock_set(container, "research_st_1")
research_data_set(container, "research_st_2")
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
Gui.left_toolbar_button('item/space-science-pack', {'expcom-res.main-tooltip'}, research_container, function(player)
return Roles.player_allowed(player, 'gui/research')
Gui.left_toolbar_button("item/space-science-pack", { "expcom-res.main-tooltip" }, research_container, function(player)
return Roles.player_allowed(player, "gui/research")
end)
Event.add(defines.events.on_research_finished, function(event)
research_notification(event)
research_notification(event)
if res['lookup_name'][event.research.name] == nil then
return
end
if res["lookup_name"][event.research.name] == nil then
return
end
local n_i = res['lookup_name'][event.research.name]
research.time[n_i] = game.tick
local n_i = res["lookup_name"][event.research.name]
research.time[n_i] = game.tick
local res_disp = research_gui_update()
local res_disp = research_gui_update()
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, research_container)
local disp = frame.container['research_st_2'].disp.table
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, research_container)
local disp = frame.container["research_st_2"].disp.table
for i=1, 8, 1 do
local research_name_i = 'research_' .. i
for i = 1, 8, 1 do
local research_name_i = "research_" .. i
disp[research_name_i .. '_name'].caption = res_disp[i]['name']
disp[research_name_i .. '_target'].caption = res_disp[i]['target']
disp[research_name_i .. '_attempt'].caption = res_disp[i]['attempt']
disp[research_name_i .. '_difference'].caption = res_disp[i]['difference']
disp[research_name_i .. '_difference'].style.font_color = res_disp[i]['difference_color']
end
end
disp[research_name_i .. "_name"].caption = res_disp[i]["name"]
disp[research_name_i .. "_target"].caption = res_disp[i]["target"]
disp[research_name_i .. "_attempt"].caption = res_disp[i]["attempt"]
disp[research_name_i .. "_difference"].caption = res_disp[i]["difference"]
disp[research_name_i .. "_difference"].style.font_color = res_disp[i]["difference_color"]
end
end
end)
Event.on_nth_tick(60, function()
local current_time = format_time(game.tick, research_time_format)
local current_time = format_time(game.tick, research_time_format)
for _, player in pairs(game.connected_players) do
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, research_container)
local disp = frame.container['research_st_1'].disp.table
disp[research_gui_clock.name].caption = current_time
local disp = frame.container["research_st_1"].disp.table
disp[research_gui_clock.name].caption = current_time
end
end)

File diff suppressed because it is too large Load Diff

View File

@@ -11,49 +11,49 @@ local config = require("modules.exp_legacy.config.gui.science") --- @dep config.
local Production = require("modules.exp_legacy.modules.control.production") --- @dep modules.control.production
local format_time = _C.format_time --- @dep expcore.common
local null_time_short = {'science-info.eta-time', format_time(0, {hours=true, minutes=true, seconds=true, time=true, null=true})}
local null_time_long = format_time(0, {hours=true, minutes=true, seconds=true, long=true, null=true})
local null_time_short = { "science-info.eta-time", format_time(0, { hours = true, minutes = true, seconds = true, time = true, null = true }) }
local null_time_long = format_time(0, { hours = true, minutes = true, seconds = true, long = true, null = true })
--- Data label that contains the value and the surfix
-- @element production_label
local production_label =
Gui.element(function(_, parent, production_label_data)
local name = production_label_data.name
local tooltip = production_label_data.tooltip
local color = production_label_data.color
Gui.element(function(_, parent, production_label_data)
local name = production_label_data.name
local tooltip = production_label_data.tooltip
local color = production_label_data.color
-- Add an alignment for the number
local alignment = Gui.alignment(parent, name)
-- Add an alignment for the number
local alignment = Gui.alignment(parent, name)
-- Add the main value label
local element =
alignment.add{
name = 'label',
type = 'label',
caption = production_label_data.caption,
tooltip = tooltip
}
-- Add the main value label
local element =
alignment.add{
name = "label",
type = "label",
caption = production_label_data.caption,
tooltip = tooltip,
}
-- Change the style
element.style.font_color = color
-- Change the style
element.style.font_color = color
-- Add the surfix label
local surfix_element =
parent.add{
name = 'surfix-'..name,
type = 'label',
caption = {'science-info.unit', production_label_data.surfix},
tooltip = tooltip
}
-- Add the surfix label
local surfix_element =
parent.add{
name = "surfix-" .. name,
type = "label",
caption = { "science-info.unit", production_label_data.surfix },
tooltip = tooltip,
}
-- Change the style
local surfix_element_style = surfix_element.style
surfix_element_style.font_color = color
surfix_element_style.right_margin = 1
-- Change the style
local surfix_element_style = surfix_element.style
surfix_element_style.font_color = color
surfix_element_style.right_margin = 1
-- Return the value label
return element
end)
-- Return the value label
return element
end)
-- Get the data that is used with the production label
local function get_production_label_data(name, tooltip, value, cutout, secondary)
@@ -65,7 +65,7 @@ local function get_production_label_data(name, tooltip, value, cutout, secondary
caption = caption,
surfix = surfix,
tooltip = tooltip,
color = data_colour
color = data_colour,
}
end
@@ -82,65 +82,64 @@ local function update_production_label(parent, production_label_data)
production_label_element.style.font_color = color
-- Update the surfix label
local surfix_element = parent['surfix-'..name]
surfix_element.caption = {'science-info.unit', production_label_data.surfix}
local surfix_element = parent["surfix-" .. name]
surfix_element.caption = { "science-info.unit", production_label_data.surfix }
surfix_element.tooltip = tooltip
surfix_element.style.font_color = color
end
--- Adds 4 elements that show the data for a science pack
-- @element science_pack_base
local science_pack_base =
Gui.element(function(_, parent, science_pack_data)
local science_pack = science_pack_data.science_pack
Gui.element(function(_, parent, science_pack_data)
local science_pack = science_pack_data.science_pack
-- Draw the icon for the science pack
local icon_style = science_pack_data.icon_style
local pack_icon =
parent.add{
name = 'icon-'..science_pack,
type = 'sprite-button',
sprite = 'item/'..science_pack,
tooltip = {'item-name.'..science_pack},
style = icon_style
}
-- Draw the icon for the science pack
local icon_style = science_pack_data.icon_style
local pack_icon =
parent.add{
name = "icon-" .. science_pack,
type = "sprite-button",
sprite = "item/" .. science_pack,
tooltip = { "item-name." .. science_pack },
style = icon_style,
}
-- Change the style of the icon
local pack_icon_style = pack_icon.style
pack_icon.ignored_by_interaction = true
pack_icon_style.height = 55
if icon_style == 'slot_button' then
pack_icon_style.padding = {0, -2}
pack_icon_style.width = 36
end
-- Change the style of the icon
local pack_icon_style = pack_icon.style
pack_icon.ignored_by_interaction = true
pack_icon_style.height = 55
if icon_style == "slot_button" then
pack_icon_style.padding = { 0, -2 }
pack_icon_style.width = 36
end
-- Draw the delta flow
local delta_flow =
parent.add{
name = 'delta-'..science_pack,
type = 'frame',
style = 'bordered_frame'
}
delta_flow.style.padding = {0, 3}
-- Draw the delta flow
local delta_flow =
parent.add{
name = "delta-" .. science_pack,
type = "frame",
style = "bordered_frame",
}
delta_flow.style.padding = { 0, 3 }
-- Draw the delta flow table
local delta_table =
delta_flow.add{
name = 'table',
type = 'table',
column_count = 2
}
delta_table.style.padding = 0
-- Draw the delta flow table
local delta_table =
delta_flow.add{
name = "table",
type = "table",
column_count = 2,
}
delta_table.style.padding = 0
-- Draw the production labels
update_production_label(delta_table, science_pack_data.positive)
update_production_label(delta_table, science_pack_data.negative)
update_production_label(parent, science_pack_data.net)
-- Draw the production labels
update_production_label(delta_table, science_pack_data.positive)
update_production_label(delta_table, science_pack_data.negative)
update_production_label(parent, science_pack_data.net)
-- Return the pack icon
return pack_icon
end)
-- Return the pack icon
return pack_icon
end)
local function get_science_pack_data(player, science_pack)
local force = player.force
@@ -152,14 +151,14 @@ local function get_science_pack_data(player, science_pack)
local hour = Production.get_production(force, science_pack, defines.flow_precision_index.one_hour)
-- Get the icon style
local icon_style = 'slot_button'
local icon_style = "slot_button"
local flux = Production.get_fluctuations(force, science_pack, defines.flow_precision_index.one_minute)
if minute.net > 0 and flux.net > -config.color_flux/2 then
icon_style = 'slot_sized_button_green'
if minute.net > 0 and flux.net > -config.color_flux / 2 then
icon_style = "slot_sized_button_green"
elseif flux.net < -config.color_flux then
icon_style = 'slot_sized_button_red'
icon_style = "slot_sized_button_red"
elseif minute.made > 0 then
icon_style = 'yellow_slot_button'
icon_style = "yellow_slot_button"
end
-- Return the pack data
@@ -167,23 +166,22 @@ local function get_science_pack_data(player, science_pack)
science_pack = science_pack,
icon_style = icon_style,
positive = get_production_label_data(
'pos-'..science_pack,
{'science-info.pos-tooltip', total.made},
"pos-" .. science_pack,
{ "science-info.pos-tooltip", total.made },
minute.made, hour.made
),
negative = get_production_label_data(
'neg-'..science_pack,
{'science-info.neg-tooltip', total.used},
"neg-" .. science_pack,
{ "science-info.neg-tooltip", total.used },
-minute.used, hour.used
),
net = get_production_label_data(
'net-'..science_pack,
{'science-info.net-tooltip', total.net},
"net-" .. science_pack,
{ "science-info.net-tooltip", total.net },
minute.net, minute.net > 0 and hour.net or 0,
minute.made+minute.used
)
minute.made + minute.used
),
}
end
local function update_science_pack(pack_table, science_pack_data)
@@ -192,23 +190,22 @@ local function update_science_pack(pack_table, science_pack_data)
pack_table.parent.non_made.visible = false
-- Update the icon
local pack_icon = pack_table['icon-'..science_pack] or science_pack_base(pack_table, science_pack_data)
local pack_icon = pack_table["icon-" .. science_pack] or science_pack_base(pack_table, science_pack_data)
local icon_style = science_pack_data.icon_style
pack_icon.style = icon_style
local pack_icon_style = pack_icon.style
pack_icon_style.height = 55
if icon_style == 'slot_button' then
pack_icon_style.padding = {0, -2}
if icon_style == "slot_button" then
pack_icon_style.padding = { 0, -2 }
pack_icon_style.width = 36
end
-- Update the production labels
local delta_table = pack_table['delta-'..science_pack].table
local delta_table = pack_table["delta-" .. science_pack].table
update_production_label(delta_table, science_pack_data.positive)
update_production_label(delta_table, science_pack_data.negative)
update_production_label(pack_table, science_pack_data.net)
end
--- Gets the data that is used with the eta label
@@ -223,7 +220,7 @@ local function get_eta_label_data(player)
local limit
local progress = force.research_progress
local remaining = research.research_unit_count*(1-progress)
local remaining = research.research_unit_count * (1 - progress)
-- Check for the limiting science pack
for _, ingredient in pairs(research.research_unit_ingredients) do
@@ -238,10 +235,9 @@ local function get_eta_label_data(player)
-- Return the caption and tooltip
return limit and limit > 0 and {
research = true,
caption = format_time(limit, {hours=true, minutes=true, seconds=true, time=true}),
tooltip = format_time(limit, {hours=true, minutes=true, seconds=true, long=true})
caption = format_time(limit, { hours = true, minutes = true, seconds = true, time = true }),
tooltip = format_time(limit, { hours = true, minutes = true, seconds = true, long = true }),
} or { research = false }
end
-- Updates the eta label
@@ -254,74 +250,73 @@ local function update_eta_label(element, eta_label_data)
end
-- Update the element
element.caption = {'science-info.eta-time', eta_label_data.caption}
element.caption = { "science-info.eta-time", eta_label_data.caption }
element.tooltip = eta_label_data.tooltip
end
--- Main task list container for the left flow
-- @element task_list_container
local science_info_container =
Gui.element(function(definition, parent)
local player = Gui.get_player_from_element(parent)
Gui.element(function(definition, parent)
local player = Gui.get_player_from_element(parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name, 200)
-- Draw the internal container
local container = Gui.container(parent, definition.name, 200)
-- Draw the header
Gui.header(container, {'science-info.main-caption'}, {'science-info.main-tooltip'})
-- Draw the header
Gui.header(container, { "science-info.main-caption" }, { "science-info.main-tooltip" })
-- Draw the scroll table for the tasks
local scroll_table = Gui.scroll_table(container, 178, 4)
-- Draw the scroll table for the tasks
local scroll_table = Gui.scroll_table(container, 178, 4)
-- Draw the no packs label
local no_packs_label =
scroll_table.parent.add{
name = 'non_made',
type = 'label',
caption = {'science-info.no-packs'}
}
-- Draw the no packs label
local no_packs_label =
scroll_table.parent.add{
name = "non_made",
type = "label",
caption = { "science-info.no-packs" },
}
-- Change the style of the no packs label
local no_packs_style = no_packs_label.style
no_packs_style.padding = {2, 4}
no_packs_style.single_line = false
no_packs_style.width = 200
-- Change the style of the no packs label
local no_packs_style = no_packs_label.style
no_packs_style.padding = { 2, 4 }
no_packs_style.single_line = false
no_packs_style.width = 200
-- Add the footer and eta
if config.show_eta then
-- Draw the footer
local footer = Gui.footer(container, {'science-info.eta-caption'}, {'science-info.eta-tooltip'}, true)
-- Add the footer and eta
if config.show_eta then
-- Draw the footer
local footer = Gui.footer(container, { "science-info.eta-caption" }, { "science-info.eta-tooltip" }, true)
-- Draw the eta label
local eta_label =
footer.add{
name = 'label',
type = 'label',
caption = null_time_short,
tooltip = null_time_long,
style = 'frame_title'
}
-- Draw the eta label
local eta_label =
footer.add{
name = "label",
type = "label",
caption = null_time_short,
tooltip = null_time_long,
style = "frame_title",
}
-- Update the eta
update_eta_label(eta_label, get_eta_label_data(player))
-- Update the eta
update_eta_label(eta_label, get_eta_label_data(player))
end
end
-- Add packs which have been made
for _, science_pack in ipairs(config) do
update_science_pack(scroll_table, get_science_pack_data(player, science_pack))
end
-- Add packs which have been made
for _, science_pack in ipairs(config) do
update_science_pack(scroll_table, get_science_pack_data(player, science_pack))
end
-- Return the exteral container
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
-- Return the exteral container
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
--- Button on the top flow used to toggle the task list container
-- @element toggle_science_info
Gui.left_toolbar_button('entity/lab', {'science-info.main-tooltip'}, science_info_container, function(player)
return Roles.player_allowed(player, 'gui/science-info')
Gui.left_toolbar_button("entity/lab", { "science-info.main-tooltip" }, science_info_container, function(player)
return Roles.player_allowed(player, "gui/science-info")
end)
--- Updates the gui every 1 second
@@ -345,13 +340,11 @@ Event.on_nth_tick(60, function()
pack_data[science_pack] = next_data
update_science_pack(scroll_table, next_data)
end
else
-- Data found in cache is no need to generate it
for _, next_data in pairs(pack_data) do
update_science_pack(scroll_table, next_data)
end
end
-- Update the eta times
@@ -363,12 +356,9 @@ Event.on_nth_tick(60, function()
eta_data = get_eta_label_data(player)
force_eta_data[force_name] = eta_data
update_eta_label(eta_label, eta_data)
else
-- Data found in chache is no need to generate it
update_eta_label(eta_label, eta_data)
end
end
end)
end)

View File

@@ -11,24 +11,24 @@ local External = require("modules.exp_legacy.expcore.external") --- @dep expcore
--- Stores the visible state of server ups
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
local UsesServerUps = PlayerData.Settings:combine('UsesServerUps')
local UsesServerUps = PlayerData.Settings:combine("UsesServerUps")
UsesServerUps:set_default(false)
UsesServerUps:set_metadata{
permission = 'command/server-ups',
stringify = function(value) return value and 'Visible' or 'Hidden' end
permission = "command/server-ups",
stringify = function(value) return value and "Visible" or "Hidden" end,
}
--- Label to show the server ups
-- @element server_ups
local server_ups =
Gui.element{
type = 'label',
caption = 'SUPS = 60.0',
name = Gui.unique_static_name
}
:style{
font = 'default-game'
}
Gui.element{
type = "label",
caption = "SUPS = 60.0",
name = Gui.unique_static_name,
}
:style{
font = "default-game",
}
--- Change the visible state when your data loads
UsesServerUps:on_load(function(player_name, visible)
@@ -40,17 +40,17 @@ end)
--- Toggles if the server ups is visbile
-- @command server-ups
Commands.new_command('server-ups', 'Toggle the server UPS display')
:add_alias('sups', 'ups')
:register(function(player)
local label = player.gui.screen[server_ups.name]
if not External.valid() then
label.visible = false
return Commands.error{'expcom-server-ups.no-ext'}
end
label.visible = not label.visible
UsesServerUps:set(player, label.visible)
end)
Commands.new_command("server-ups", "Toggle the server UPS display")
:add_alias("sups", "ups")
:register(function(player)
local label = player.gui.screen[server_ups.name]
if not External.valid() then
label.visible = false
return Commands.error{ "expcom-server-ups.no-ext" }
end
label.visible = not label.visible
UsesServerUps:set(player, label.visible)
end)
-- Set the location of the label
-- 1920x1080: x=1455, y=30 (ui scale 100%)
@@ -61,7 +61,7 @@ local function set_location(event)
local uis = player.display_scale
-- below ups and clock
-- label.location = {x=res.width-423*uis, y=50*uis}
label.location = {x=res.width-363*uis, y=31*uis}
label.location = { x = res.width - 363 * uis, y = 31 * uis }
end
-- Draw the label when the player joins
@@ -76,7 +76,7 @@ end)
-- percentage of game speed
Event.on_nth_tick(60, function()
if External.valid() then
local caption = External.get_server_ups() .. ' (' .. string.format('%.1f', External.get_server_ups() * 5 / 3) .. '%)'
local caption = External.get_server_ups() .. " (" .. string.format("%.1f", External.get_server_ups() * 5 / 3) .. "%)"
for _, player in pairs(game.connected_players) do
player.gui.screen[server_ups.name].caption = caption
end
@@ -85,4 +85,4 @@ end)
-- Update when res or ui scale changes
Event.add(defines.events.on_player_display_resolution_changed, set_location)
Event.add(defines.events.on_player_display_scale_changed, set_location)
Event.add(defines.events.on_player_display_scale_changed, set_location)

View File

@@ -6,130 +6,130 @@ local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
local cctv_player =
Gui.element(function(definition, parent, player_list)
return parent.add{
name = definition.name,
type = 'drop-down',
items = player_list,
selected_index = #player_list > 0 and 1
Gui.element(function(definition, parent, player_list)
return parent.add{
name = definition.name,
type = "drop-down",
items = player_list,
selected_index = #player_list > 0 and 1,
}
end)
:style{
horizontally_stretchable = true,
}
end)
:style{
horizontally_stretchable = true
}
:static_name(Gui.unique_static_name)
:static_name(Gui.unique_static_name)
local cctv_status =
Gui.element{
type = 'drop-down',
items = {{'surveillance.status-enable'}, {'surveillance.status-disable'}},
selected_index = 2
}:style{
width = 96
}:on_selection_changed(function(_, element, _)
if element.selected_index == 1 then
element.parent.parent.parent.cctv_display.visible = true
else
element.parent.parent.parent.cctv_display.visible = false
end
end)
Gui.element{
type = "drop-down",
items = { { "surveillance.status-enable" }, { "surveillance.status-disable" } },
selected_index = 2,
}:style{
width = 96,
}:on_selection_changed(function(_, element, _)
if element.selected_index == 1 then
element.parent.parent.parent.cctv_display.visible = true
else
element.parent.parent.parent.cctv_display.visible = false
end
end)
local cctv_type =
Gui.element{
type = 'drop-down',
name = Gui.unique_static_name,
items = {{'surveillance.type-player'}, {'surveillance.type-static'}, {'surveillance.type-player-loop'}},
selected_index = 1
}:style{
width = 96
}
local cctv_location =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = {'surveillance.func-set'}
}:style{
width = 48
}:on_click(function(player, element, _)
element.parent.parent.parent.cctv_display.position = player.position
end)
local zoom_in =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = '+'
}:style{
width = 32
}:on_click(function(_, element, _)
local display = element.parent.parent.parent.cctv_display
if display.zoom < 2.0 then
display.zoom = display.zoom + 0.05
end
end)
local zoom_out =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = '-'
}:style{
width = 32
}:on_click(function(_, element, _)
local display = element.parent.parent.parent.cctv_display
if display.zoom > 0.2 then
display.zoom = display.zoom - 0.05
end
end)
local camera_set =
Gui.element(function(_, parent, name, player_list)
local camera_set = parent.add{type='flow', direction='vertical', name=name}
local buttons = Gui.scroll_table(camera_set, 480, 6, 'buttons')
cctv_player(buttons, player_list)
cctv_status(buttons)
cctv_type(buttons)
cctv_location(buttons)
zoom_out(buttons)
zoom_in(buttons)
local camera = camera_set.add{
type = 'camera',
name = 'cctv_display',
position = {x=0, y=0},
surface_index = game.surfaces['nauvis'].index,
zoom = 0.75,
Gui.element{
type = "drop-down",
name = Gui.unique_static_name,
items = { { "surveillance.type-player" }, { "surveillance.type-static" }, { "surveillance.type-player-loop" } },
selected_index = 1,
}:style{
width = 96,
}
camera.visible = false
camera.style.minimal_width = 480
camera.style.minimal_height = 290
return camera_set
end)
local cctv_location =
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "surveillance.func-set" },
}:style{
width = 48,
}:on_click(function(player, element, _)
element.parent.parent.parent.cctv_display.position = player.position
end)
local zoom_in =
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = "+",
}:style{
width = 32,
}:on_click(function(_, element, _)
local display = element.parent.parent.parent.cctv_display
if display.zoom < 2.0 then
display.zoom = display.zoom + 0.05
end
end)
local zoom_out =
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = "-",
}:style{
width = 32,
}:on_click(function(_, element, _)
local display = element.parent.parent.parent.cctv_display
if display.zoom > 0.2 then
display.zoom = display.zoom - 0.05
end
end)
local camera_set =
Gui.element(function(_, parent, name, player_list)
local camera_set = parent.add{ type = "flow", direction = "vertical", name = name }
local buttons = Gui.scroll_table(camera_set, 480, 6, "buttons")
cctv_player(buttons, player_list)
cctv_status(buttons)
cctv_type(buttons)
cctv_location(buttons)
zoom_out(buttons)
zoom_in(buttons)
local camera = camera_set.add{
type = "camera",
name = "cctv_display",
position = { x = 0, y = 0 },
surface_index = game.surfaces["nauvis"].index,
zoom = 0.75,
}
camera.visible = false
camera.style.minimal_width = 480
camera.style.minimal_height = 290
return camera_set
end)
local cctv_container =
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, 480)
local scroll = container.add{name='scroll', type='scroll-pane', direction='vertical'}
scroll.style.maximal_height = 704
local player_list = {}
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, 480)
local scroll = container.add{ name = "scroll", type = "scroll-pane", direction = "vertical" }
scroll.style.maximal_height = 704
local player_list = {}
for _, player in pairs(game.connected_players) do
table.insert(player_list, player.name)
end
for _, player in pairs(game.connected_players) do
table.insert(player_list, player.name)
end
camera_set(scroll, 'cctv_st_1', player_list)
camera_set(scroll, 'cctv_st_2', player_list)
camera_set(scroll, "cctv_st_1", player_list)
camera_set(scroll, "cctv_st_2", player_list)
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
Gui.left_toolbar_button('entity/radar', {'surveillance.main-tooltip'}, cctv_container, function(player)
return Roles.player_allowed(player, 'gui/surveillance')
Gui.left_toolbar_button("entity/radar", { "surveillance.main-tooltip" }, cctv_container, function(player)
return Roles.player_allowed(player, "gui/surveillance")
end)
local function gui_update()
@@ -141,8 +141,8 @@ local function gui_update()
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, cctv_container)
frame.container.scroll['cctv_st_1'].buttons.table[cctv_player.name].items = player_list
frame.container.scroll['cctv_st_2'].buttons.table[cctv_player.name].items = player_list
frame.container.scroll["cctv_st_1"].buttons.table[cctv_player.name].items = player_list
frame.container.scroll["cctv_st_2"].buttons.table[cctv_player.name].items = player_list
end
end
@@ -153,8 +153,8 @@ Event.add(defines.events.on_tick, function(_)
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, cctv_container)
for i=1, 2 do
local scroll_table_name = 'cctv_st_' .. i
for i = 1, 2 do
local scroll_table_name = "cctv_st_" .. i
local current_camera_set = frame.container.scroll[scroll_table_name]
local switch_index = current_camera_set.buttons.table[cctv_type.name].selected_index
@@ -163,12 +163,11 @@ Event.add(defines.events.on_tick, function(_)
if selected_index ~= 0 then
selected_index = current_camera_set.buttons.table[cctv_player.name].items[selected_index]
current_camera_set['cctv_display'].position = game.players[selected_index].position
current_camera_set['cctv_display'].surface_index = game.players[selected_index].surface_index
current_camera_set["cctv_display"].position = game.players[selected_index].position
current_camera_set["cctv_display"].surface_index = game.players[selected_index].surface_index
else
current_camera_set['cctv_display'].position = {x=0, y=0}
current_camera_set['cctv_display'].surface_index = game.surfaces['nauvis'].index
current_camera_set["cctv_display"].position = { x = 0, y = 0 }
current_camera_set["cctv_display"].surface_index = game.surfaces["nauvis"].index
end
end
end
@@ -179,8 +178,8 @@ Event.on_nth_tick(600, function(_)
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, cctv_container)
for i=1, 2 do
local current_camera_set = frame.container.scroll['cctv_st_' .. i]
for i = 1, 2 do
local current_camera_set = frame.container.scroll["cctv_st_" .. i]
if current_camera_set.buttons.table[cctv_type.name].selected_index == 3 then
local item_n = #current_camera_set.buttons.table[cctv_player.name].items
@@ -188,7 +187,6 @@ Event.on_nth_tick(600, function(_)
if item_n ~= 0 then
if current_camera_set.buttons.table[cctv_player.name].selected_index < item_n then
current_camera_set.buttons.table[cctv_player.name].selected_index = current_camera_set.buttons.table[cctv_player.name].selected_index + 1
else
current_camera_set.buttons.table[cctv_player.name].selected_index = 1
end

View File

@@ -26,14 +26,14 @@ local Styles = {
sprite22 = {
height = 22,
width = 22,
padding = -2
padding = -2,
},
footer_button = {
height = 29,
maximal_width = 268,
horizontally_stretchable = true,
padding = -2
}
padding = -2,
},
}
--- If a player is allowed to use the edit buttons
@@ -81,242 +81,242 @@ end
--- Button displayed in the header bar, used to add a new task
-- @element add_new_task
local add_new_task =
Gui.element {
type = "sprite-button",
sprite = "utility/add",
tooltip = {"task-list.add-tooltip"},
style = "tool_button",
name = Gui.unique_static_name
}:style(Styles.sprite22):on_click(
function(player, _, _)
-- Disable editing
PlayerIsEditing:set(player, false)
-- Clear selected
PlayerSelected:set(player, nil)
-- Open task create footer
PlayerIsCreating:set(player, true)
end
)
Gui.element{
type = "sprite-button",
sprite = "utility/add",
tooltip = { "task-list.add-tooltip" },
style = "tool_button",
name = Gui.unique_static_name,
}:style(Styles.sprite22):on_click(
function(player, _, _)
-- Disable editing
PlayerIsEditing:set(player, false)
-- Clear selected
PlayerSelected:set(player, nil)
-- Open task create footer
PlayerIsCreating:set(player, true)
end
)
--- Header displayed when no tasks are in the task list
-- @element no_tasks_found
local no_tasks_found =
Gui.element(
function(_, parent)
local header =
parent.add {
name = "no_tasks_found_element",
type = "frame",
style = "negative_subheader_frame"
}
header.style.horizontally_stretchable = true
-- Flow used for centering the content in the subheader
local center =
header.add {
type = "flow",
}
center.style.vertical_align = "center"
center.style.horizontal_align = "center"
center.style.horizontally_stretchable = true
center.add {
name = "header_label",
type = "label",
style = "bold_label",
caption = {"", "[img=utility/warning_white] ", {"task-list.no-tasks"}},
tooltip = {"task-list.no-tasks-tooltip"}
}
return header
end
)
function(_, parent)
local header =
parent.add{
name = "no_tasks_found_element",
type = "frame",
style = "negative_subheader_frame",
}
header.style.horizontally_stretchable = true
-- Flow used for centering the content in the subheader
local center =
header.add{
type = "flow",
}
center.style.vertical_align = "center"
center.style.horizontal_align = "center"
center.style.horizontally_stretchable = true
center.add{
name = "header_label",
type = "label",
style = "bold_label",
caption = { "", "[img=utility/warning_white] ", { "task-list.no-tasks" } },
tooltip = { "task-list.no-tasks-tooltip" },
}
return header
end
)
--- Frame element with the right styling
-- @element subfooter_frame
local subfooter_frame =
Gui.element(
function(_, parent, name)
return parent.add {
type = "frame",
name = name,
direction = "vertical",
style = "subfooter_frame"
function(_, parent, name)
return parent.add{
type = "frame",
name = name,
direction = "vertical",
style = "subfooter_frame",
}
end
):style
{
padding = 5,
use_header_filler = false,
horizontally_stretchable = true,
}
end
):style(
{
padding = 5,
use_header_filler = false,
horizontally_stretchable = true
}
)
--- Label element preset
-- @element subfooter_label
local subfooter_label =
Gui.element(
function(_, parent, caption)
return parent.add {
name = "footer_label",
type = "label",
style = "frame_title",
caption = caption
}
end
)
function(_, parent, caption)
return parent.add{
name = "footer_label",
type = "label",
style = "frame_title",
caption = caption,
}
end
)
--- Action flow that contains action buttons
-- @element subfooter_actions
local subfooter_actions =
Gui.element {
type = "flow",
name = "actions"
}
Gui.element{
type = "flow",
name = "actions",
}
--- Button element with a flow around it to fix duplicate name inside of the scroll flow
-- @element task_list_item
local task_list_item =
Gui.element(
function(definition, parent, task)
local flow = parent.add {
type = "flow",
name = "task-" .. task.task_id,
caption = task.task_id
}
function(definition, parent, task)
local flow = parent.add{
type = "flow",
name = "task-" .. task.task_id,
caption = task.task_id,
}
flow.style.horizontally_stretchable = true
flow.style.horizontally_stretchable = true
local button = flow.add {
name = definition.name,
type = "button",
style = "list_box_item",
caption = task.title,
tooltip = { "task-list.last-edit", task.last_edit_name, format_time(task.last_edit_time) }
}
local button = flow.add{
name = definition.name,
type = "button",
style = "list_box_item",
caption = task.title,
tooltip = { "task-list.last-edit", task.last_edit_name, format_time(task.last_edit_time) },
}
button.style.horizontally_stretchable = true
button.style.horizontally_squashable = true
button.style.horizontally_stretchable = true
button.style.horizontally_squashable = true
return button
end
):on_click(
function(player, element, _)
local task_id = element.parent.caption
PlayerSelected:set(player, task_id)
end
):static_name(Gui.unique_static_name)
return button
end
):on_click(
function(player, element, _)
local task_id = element.parent.caption
PlayerSelected:set(player, task_id)
end
):static_name(Gui.unique_static_name)
--- Scrollable list of all tasks
-- @element task_list
local task_list =
Gui.element(
function(_, parent)
local scroll_pane =
parent.add {
name = "scroll",
type = "scroll-pane",
direction = "vertical",
horizontal_scroll_policy = "never",
vertical_scroll_policy = "auto",
style = "scroll_pane_under_subheader"
}
scroll_pane.style.horizontally_stretchable = true
scroll_pane.style.padding = 0
scroll_pane.style.maximal_height = 224
function(_, parent)
local scroll_pane =
parent.add{
name = "scroll",
type = "scroll-pane",
direction = "vertical",
horizontal_scroll_policy = "never",
vertical_scroll_policy = "auto",
style = "scroll_pane_under_subheader",
}
scroll_pane.style.horizontally_stretchable = true
scroll_pane.style.padding = 0
scroll_pane.style.maximal_height = 224
local flow =
scroll_pane.add {
name = "task_list",
type = "flow",
direction = "vertical"
}
flow.style.vertical_spacing = 0
flow.style.horizontally_stretchable = true
local flow =
scroll_pane.add{
name = "task_list",
type = "flow",
direction = "vertical",
}
flow.style.vertical_spacing = 0
flow.style.horizontally_stretchable = true
return flow
end
)
return flow
end
)
--- Button element inside the task view footer to start editing a task
-- @element task_view_edit_button
local task_view_edit_button =
Gui.element {
type = "button",
name = Gui.unique_static_name,
caption = {"", "[img=utility/rename_icon] ", {"task-list.edit"}},
tooltip = {"task-list.edit-tooltip"},
style = "shortcut_bar_button"
}:style(Styles.footer_button):on_click(
function(player, _, _)
local selected = PlayerSelected:get(player)
PlayerIsEditing:set(player, true)
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "", "[img=utility/rename_icon] ", { "task-list.edit" } },
tooltip = { "task-list.edit-tooltip" },
style = "shortcut_bar_button",
}:style(Styles.footer_button):on_click(
function(player, _, _)
local selected = PlayerSelected:get(player)
PlayerIsEditing:set(player, true)
Tasks.set_editing(selected, player.name, true)
end
)
Tasks.set_editing(selected, player.name, true)
end
)
--- Button to close the task view footer
-- @element task_view_close_button
local task_view_close_button =
Gui.element{
type = "sprite-button",
sprite = "utility/collapse",
style = "frame_action_button",
tooltip = {"task-list.close-tooltip"}
}
:style(Styles.sprite22):on_click(
function(player, _, _)
PlayerSelected:set(player, nil)
end
)
Gui.element{
type = "sprite-button",
sprite = "utility/collapse",
style = "frame_action_button",
tooltip = { "task-list.close-tooltip" },
}
:style(Styles.sprite22):on_click(
function(player, _, _)
PlayerSelected:set(player, nil)
end
)
--- Button to delete the task inside the task view footer
-- @element task_view_delete_button
local task_view_delete_button =
Gui.element {
type = "button",
name = Gui.unique_static_name,
caption = {"", "[img=utility/trash] ", {"task-list.delete"}},
tooltip = {"task-list.delete-tooltip"},
style = "shortcut_bar_button_red"
}:style(Styles.footer_button):on_click(
function(player, _, _)
local selected = PlayerSelected:get(player)
PlayerSelected:set(player, nil)
Tasks.remove_task(selected)
end
)
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "", "[img=utility/trash] ", { "task-list.delete" } },
tooltip = { "task-list.delete-tooltip" },
style = "shortcut_bar_button_red",
}:style(Styles.footer_button):on_click(
function(player, _, _)
local selected = PlayerSelected:get(player)
PlayerSelected:set(player, nil)
Tasks.remove_task(selected)
end
)
--- Subfooter inside the tasklist container that holds all the elements for viewing a task
-- @element task_view_footer
local task_view_footer =
Gui.element(
function(_, parent)
local footer = subfooter_frame(parent, "view")
local flow = footer.add{ type = "flow" }
subfooter_label(flow, {"task-list.view-footer-header"})
local alignment = Gui.alignment(flow)
task_view_close_button(alignment)
local title_label =
footer.add {
type = "label",
name = "title"
}
title_label.style.padding = 4
title_label.style.font = "default-bold"
title_label.style.single_line = false
local body_label =
footer.add {
type = "label",
name = "body"
}
body_label.style.padding = 4
body_label.style.single_line = false
function(_, parent)
local footer = subfooter_frame(parent, "view")
local flow = footer.add{ type = "flow" }
subfooter_label(flow, { "task-list.view-footer-header" })
local alignment = Gui.alignment(flow)
task_view_close_button(alignment)
local title_label =
footer.add{
type = "label",
name = "title",
}
title_label.style.padding = 4
title_label.style.font = "default-bold"
title_label.style.single_line = false
local body_label =
footer.add{
type = "label",
name = "body",
}
body_label.style.padding = 4
body_label.style.single_line = false
local action_flow = subfooter_actions(footer)
task_view_delete_button(action_flow)
task_view_edit_button(action_flow)
return footer
end
)
local action_flow = subfooter_actions(footer)
task_view_delete_button(action_flow)
task_view_edit_button(action_flow)
return footer
end
)
local message_pattern = "(.-)\n(.*)"
@@ -344,138 +344,138 @@ local task_create_confirm_button
--- Textfield element used in both the task create and edit footers
-- @element task_message_textfield
local task_message_textfield =
Gui.element {
name = Gui.unique_static_name,
type = "text-box",
text = ""
}:style(
{
maximal_width = 268,
minimal_height = 100,
horizontally_stretchable = true
}
):on_text_changed(
function(player, element, _)
local isEditing = PlayerIsEditing:get(player)
local isCreating = PlayerIsCreating:get(player)
Gui.element{
name = Gui.unique_static_name,
type = "text-box",
text = "",
}:style
{
maximal_width = 268,
minimal_height = 100,
horizontally_stretchable = true,
}
:on_text_changed(
function(player, element, _)
local isEditing = PlayerIsEditing:get(player)
local isCreating = PlayerIsCreating:get(player)
local valid = string.len(element.text) > 5
local valid = string.len(element.text) > 5
if isCreating then
element.parent.actions[task_create_confirm_button.name].enabled = valid
elseif isEditing then
element.parent.actions[task_edit_confirm_button.name].enabled = valid
if isCreating then
element.parent.actions[task_create_confirm_button.name].enabled = valid
elseif isEditing then
element.parent.actions[task_edit_confirm_button.name].enabled = valid
end
end
end
)
)
--- Button to confirm the changes inside the task edit footer
-- @element task_edit_confirm_button
task_edit_confirm_button =
Gui.element {
type = "button",
name = Gui.unique_static_name,
caption = {"", "[img=utility/check_mark] ", {"task-list.confirm"}},
tooltip = {"task-list.confirm-tooltip"},
style = "shortcut_bar_button_green"
}:style(Styles.footer_button):on_click(
function(player, element, _)
local selected = PlayerSelected:get(player)
PlayerIsEditing:set(player, false)
local new_message = element.parent.parent[task_message_textfield.name].text
local parsed = parse_message(new_message)
Tasks.update_task(selected, player.name, parsed.title, parsed.body)
Tasks.set_editing(selected, player.name, nil)
end
)
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "", "[img=utility/check_mark] ", { "task-list.confirm" } },
tooltip = { "task-list.confirm-tooltip" },
style = "shortcut_bar_button_green",
}:style(Styles.footer_button):on_click(
function(player, element, _)
local selected = PlayerSelected:get(player)
PlayerIsEditing:set(player, false)
local new_message = element.parent.parent[task_message_textfield.name].text
local parsed = parse_message(new_message)
Tasks.update_task(selected, player.name, parsed.title, parsed.body)
Tasks.set_editing(selected, player.name, nil)
end
)
--- Button to discard the changes inside the task edit footer
-- @element edit_task_discard_button
local edit_task_discard_button =
Gui.element {
type = "button",
caption = {"", "[img=utility/close_black] ", {"task-list.discard"}},
tooltip = {"task-list.discard-tooltip"},
style = "shortcut_bar_button_red"
}:style(Styles.footer_button):on_click(
function(player, _, _)
local selected = PlayerSelected:get(player)
Tasks.set_editing(selected, player.name, nil)
PlayerIsEditing:set(player, false)
end
)
Gui.element{
type = "button",
caption = { "", "[img=utility/close_black] ", { "task-list.discard" } },
tooltip = { "task-list.discard-tooltip" },
style = "shortcut_bar_button_red",
}:style(Styles.footer_button):on_click(
function(player, _, _)
local selected = PlayerSelected:get(player)
Tasks.set_editing(selected, player.name, nil)
PlayerIsEditing:set(player, false)
end
)
--- Subfooter inside the tasklist container that holds all the elements for editing a task
-- @element task_edit_footer
local task_edit_footer =
Gui.element(
function(_, parent)
local footer = subfooter_frame(parent, "edit")
subfooter_label(footer, {"task-list.edit-footer-header"})
function(_, parent)
local footer = subfooter_frame(parent, "edit")
subfooter_label(footer, { "task-list.edit-footer-header" })
task_message_textfield(footer)
task_message_textfield(footer)
local action_flow = subfooter_actions(footer)
local action_flow = subfooter_actions(footer)
edit_task_discard_button(action_flow)
task_edit_confirm_button(action_flow)
edit_task_discard_button(action_flow)
task_edit_confirm_button(action_flow)
return footer
end
)
return footer
end
)
--- Button to confirm the changes inside the task create footer
-- @element task_create_confirm_button
task_create_confirm_button =
Gui.element {
type = "button",
name = Gui.unique_static_name,
caption = {"", "[img=utility/check_mark] ", {"task-list.confirm"}},
tooltip = {"task-list.confirm-tooltip"},
style = "shortcut_bar_button_green",
enabled = false
}:style(Styles.footer_button):on_click(
function(player, element, _)
local message = element.parent.parent[task_message_textfield.name].text
PlayerIsCreating:set(player, false)
local parsed = parse_message(message)
local task_id = Tasks.add_task(player.force.name, player.name, parsed.title, parsed.body)
PlayerSelected:set(player, task_id)
end
)
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "", "[img=utility/check_mark] ", { "task-list.confirm" } },
tooltip = { "task-list.confirm-tooltip" },
style = "shortcut_bar_button_green",
enabled = false,
}:style(Styles.footer_button):on_click(
function(player, element, _)
local message = element.parent.parent[task_message_textfield.name].text
PlayerIsCreating:set(player, false)
local parsed = parse_message(message)
local task_id = Tasks.add_task(player.force.name, player.name, parsed.title, parsed.body)
PlayerSelected:set(player, task_id)
end
)
--- Button to discard the changes inside the task create footer
-- @element task_create_discard_button
local task_create_discard_button =
Gui.element {
type = "button",
caption = {"", "[img=utility/close_black] ", {"task-list.discard"}},
tooltip = {"task-list.discard-tooltip"},
style = "shortcut_bar_button_red"
}:style(Styles.footer_button):on_click(
function(player, _, _)
PlayerIsCreating:set(player, false)
end
)
Gui.element{
type = "button",
caption = { "", "[img=utility/close_black] ", { "task-list.discard" } },
tooltip = { "task-list.discard-tooltip" },
style = "shortcut_bar_button_red",
}:style(Styles.footer_button):on_click(
function(player, _, _)
PlayerIsCreating:set(player, false)
end
)
--- Subfooter inside the tasklist container that holds all the elements to create a new task
-- @element task_create_footer
local task_create_footer =
Gui.element(
function(_, parent)
local footer = subfooter_frame(parent, "create")
subfooter_label(footer, {"task-list.create-footer-header"})
function(_, parent)
local footer = subfooter_frame(parent, "create")
subfooter_label(footer, { "task-list.create-footer-header" })
task_message_textfield(footer)
task_message_textfield(footer)
local action_flow = subfooter_actions(footer)
local action_flow = subfooter_actions(footer)
task_create_discard_button(action_flow)
task_create_confirm_button(action_flow)
task_create_discard_button(action_flow)
task_create_confirm_button(action_flow)
return footer
end
)
return footer
end
)
--- Clear and repopulate the task list with all current tasks
local repopulate_task_list = function(task_list_element)
@@ -498,48 +498,48 @@ end
-- @element task_list_container
local task_list_container =
Gui.element(
function(definition, parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name, 268)
container.style.maximal_width = 268
container.style.minimal_width = 268
function(definition, parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name, 268)
container.style.maximal_width = 268
container.style.minimal_width = 268
-- Draw the header
local header = Gui.header(container, {"task-list.main-caption"}, {"task-list.sub-tooltip"}, true)
-- Draw the header
local header = Gui.header(container, { "task-list.main-caption" }, { "task-list.sub-tooltip" }, true)
-- Draw the new task button
local player = Gui.get_player_from_element(parent)
local add_new_task_element = add_new_task(header)
add_new_task_element.visible = check_player_permissions(player)
-- Draw the new task button
local player = Gui.get_player_from_element(parent)
local add_new_task_element = add_new_task(header)
add_new_task_element.visible = check_player_permissions(player)
-- Draw no task found element
no_tasks_found(container)
-- Draw no task found element
no_tasks_found(container)
-- Draw task list element
local task_list_element = task_list(container)
repopulate_task_list(task_list_element)
-- Draw task list element
local task_list_element = task_list(container)
repopulate_task_list(task_list_element)
local task_view_footer_element = task_view_footer(container)
local task_edit_footer_element = task_edit_footer(container)
local task_create_footer_element = task_create_footer(container)
task_view_footer_element.visible = false
task_edit_footer_element.visible = false
task_create_footer_element.visible = false
-- Return the external container
return container.parent
end
):static_name(Gui.unique_static_name):add_to_left_flow(
function(player)
local task_ids = Tasks.get_force_task_ids(player.force.name)
return #task_ids > 0
end
)
local task_view_footer_element = task_view_footer(container)
local task_edit_footer_element = task_edit_footer(container)
local task_create_footer_element = task_create_footer(container)
task_view_footer_element.visible = false
task_edit_footer_element.visible = false
task_create_footer_element.visible = false
-- Return the external container
return container.parent
end
):static_name(Gui.unique_static_name):add_to_left_flow(
function(player)
local task_ids = Tasks.get_force_task_ids(player.force.name)
return #task_ids > 0
end
)
--- Button on the top flow used to toggle the task list container
-- @element toggle_left_element
Gui.left_toolbar_button(
"utility/not_enough_repair_packs_icon",
{"task-list.main-tooltip"},
{ "task-list.main-tooltip" },
task_list_container,
function(player)
return Roles.player_allowed(player, "gui/task-list")
@@ -567,7 +567,7 @@ local update_task = function(player, task_list_element, task_id)
-- If the task exists update the caption and tooltip
local button = flow[task_list_item.name]
button.caption = task.title
button.tooltip = {"task-list.last-edit", task.last_edit_name, format_time(task.last_edit_time)}
button.tooltip = { "task-list.last-edit", task.last_edit_name, format_time(task.last_edit_time) }
end
end
@@ -602,9 +602,9 @@ local update_task_view_footer = function(player, task_id)
local players_editing = table.get_keys(task.currently_editing)
if #players_editing > 0 then
edit_button_element.tooltip = {"task-list.edit-tooltip", table.concat(players_editing, ", ")}
edit_button_element.tooltip = { "task-list.edit-tooltip", table.concat(players_editing, ", ") }
else
edit_button_element.tooltip = {"task-list.edit-tooltip-none"}
edit_button_element.tooltip = { "task-list.edit-tooltip-none" }
end
end
@@ -780,4 +780,4 @@ local function reset_task_list(event)
end
Event.add(defines.events.on_player_joined_game, reset_task_list)
Event.add(defines.events.on_player_changed_force, reset_task_list)
Event.add(defines.events.on_player_changed_force, reset_task_list)

View File

@@ -2,7 +2,7 @@ local Gui = require("modules.exp_legacy.expcore.gui") --- @dep expcore.gui
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
-- Used to store the state of the toolbar when a player leaves
local ToolbarState = PlayerData.Settings:combine('ToolbarState')
local ToolbarState = PlayerData.Settings:combine("ToolbarState")
ToolbarState:set_metadata{
stringify = function(value)
local buttons, favourites = 0, 0
@@ -12,15 +12,16 @@ ToolbarState:set_metadata{
favourites = favourites + 1
end
end
return string.format("Buttons: %d, Favourites: %d", buttons, favourites)
end
end,
}
-- Styles used for sprite buttons
local button_size = 20
local Styles = {
header = Gui.sprite_style(22),
item = Gui.sprite_style(button_size)
item = Gui.sprite_style(button_size),
}
--- Set the style of the fake toolbar element
@@ -46,7 +47,7 @@ local function move_toolbar_button(player, item, offset)
-- Swap the position in the top flow, offset by 1 because of settings button
local top_flow = Gui.get_top_flow(player)
top_flow.swap_children(old_index+1, new_index+1)
top_flow.swap_children(old_index + 1, new_index + 1)
-- Check if the element has a left element to move
local element_define = Gui.defines[item.tags.top_element_uid]
@@ -100,7 +101,7 @@ local function reorder_toolbar_menu(player)
-- Check if the player is allowed to see the button
local allowed = element_define.authenticator
if type(allowed) == 'function' then allowed = allowed(player) end
if type(allowed) == "function" then allowed = allowed(player) end
-- Update the checkbox state and item visibility
local toolbar_button = Gui.get_top_element(player, element_define)
@@ -121,210 +122,210 @@ end
--- Resets the toolbar to its default state when pressed
-- @element reset_toolbar
local reset_toolbar =
Gui.element {
type = "sprite-button",
sprite = "utility/reset",
style = "shortcut_bar_button_red",
tooltip = {"toolbar.reset"},
name = Gui.unique_static_name
}
:style(Gui.sprite_style(Styles.header.width, -1))
:on_click(function(player)
ToolbarState:set(player, nil)
Gui.toggle_top_flow(player, true)
reorder_toolbar_menu(player)
end)
Gui.element{
type = "sprite-button",
sprite = "utility/reset",
style = "shortcut_bar_button_red",
tooltip = { "toolbar.reset" },
name = Gui.unique_static_name,
}
:style(Gui.sprite_style(Styles.header.width, -1))
:on_click(function(player)
ToolbarState:set(player, nil)
Gui.toggle_top_flow(player, true)
reorder_toolbar_menu(player)
end)
--- Replaces the default method for opening and closing the toolbar
-- @element toggle_toolbar
toggle_toolbar =
Gui.element {
type = "sprite-button",
sprite = "utility/bookmark",
tooltip = {"toolbar.toggle"},
style = "tool_button",
auto_toggle = true,
name = Gui.unique_static_name
}
:style(Styles.header)
:on_click(function(player, element)
Gui.toggle_top_flow(player, element.toggled)
end)
Gui.element{
type = "sprite-button",
sprite = "utility/bookmark",
tooltip = { "toolbar.toggle" },
style = "tool_button",
auto_toggle = true,
name = Gui.unique_static_name,
}
:style(Styles.header)
:on_click(function(player, element)
Gui.toggle_top_flow(player, element.toggled)
end)
--- Move an element up the list
-- @element move_up
move_up =
Gui.element {
type = "sprite-button",
sprite = "utility/speed_up",
tooltip = {"toolbar.move-up"},
name = Gui.unique_static_name
}
:style(Styles.item)
:on_click(function(player, element)
local item = element.parent.parent
move_toolbar_button(player, item, -1)
end)
Gui.element{
type = "sprite-button",
sprite = "utility/speed_up",
tooltip = { "toolbar.move-up" },
name = Gui.unique_static_name,
}
:style(Styles.item)
:on_click(function(player, element)
local item = element.parent.parent
move_toolbar_button(player, item, -1)
end)
--- Move an element down the list
-- @element move_down
move_down =
Gui.element {
type = "sprite-button",
sprite = "utility/speed_down",
tooltip = {"toolbar.move-down"},
name = Gui.unique_static_name
}
:style(Styles.item)
:on_click(function(player, element)
local item = element.parent.parent
move_toolbar_button(player, item, 1)
end)
Gui.element{
type = "sprite-button",
sprite = "utility/speed_down",
tooltip = { "toolbar.move-down" },
name = Gui.unique_static_name,
}
:style(Styles.item)
:on_click(function(player, element)
local item = element.parent.parent
move_toolbar_button(player, item, 1)
end)
--- A flow which represents one item in the toolbar list
-- @element toolbar_list_item
local toolbar_list_item =
Gui.element(function(definition, parent, element_define)
local flow = parent.add {
type = "frame",
style = "shortcut_selection_row",
name = element_define.name,
tags = {
top_element_uid = element_define.uid
Gui.element(function(definition, parent, element_define)
local flow = parent.add{
type = "frame",
style = "shortcut_selection_row",
name = element_define.name,
tags = {
top_element_uid = element_define.uid,
},
}
}
flow.style.horizontally_stretchable = true
flow.style.vertical_align = "center"
flow.style.horizontally_stretchable = true
flow.style.vertical_align = "center"
-- Add the button and the icon edit button
local element = element_define(flow)
local player = Gui.get_player_from_element(parent)
local top_element = Gui.get_top_element(player, element_define)
copy_style(top_element, element)
-- Add the button and the icon edit button
local element = element_define(flow)
local player = Gui.get_player_from_element(parent)
local top_element = Gui.get_top_element(player, element_define)
copy_style(top_element, element)
-- Add the checkbox that can toggle the visibility
local checkbox = flow.add{
type = "checkbox",
name = "checkbox",
caption = element_define.tooltip or element_define.caption or "None",
state = top_element.visible or false,
tags = {
top_element_name = element_define.name
-- Add the checkbox that can toggle the visibility
local checkbox = flow.add{
type = "checkbox",
name = "checkbox",
caption = element_define.tooltip or element_define.caption or "None",
state = top_element.visible or false,
tags = {
top_element_name = element_define.name,
},
}
}
definition:triggers_events(checkbox)
checkbox.style.width = 180
definition:triggers_events(checkbox)
checkbox.style.width = 180
-- Add the buttons used to move the flow up and down
local move_flow = flow.add{ type = "flow", name = "move" }
move_flow.style.horizontal_spacing = 0
move_up(move_flow)
move_down(move_flow)
-- Add the buttons used to move the flow up and down
local move_flow = flow.add{ type = "flow", name = "move" }
move_flow.style.horizontal_spacing = 0
move_up(move_flow)
move_down(move_flow)
return definition:no_events(flow)
end)
:on_checked_changed(function(player, element)
local top_flow = Gui.get_top_flow(player)
local top_element = top_flow[element.tags.top_element_name]
local had_visible = Gui.top_flow_has_visible_elements(player)
top_element.visible = element.state
-- Check if we are on the edge case between 0 and 1 visible elements
if element.state and not had_visible then
Gui.toggle_top_flow(player, true)
local container = element.parent.parent.parent.parent
local button = container.header.alignment[toggle_toolbar.name]
button.toggled = true
button.enabled = true
elseif not element.state and not Gui.top_flow_has_visible_elements(player) then
Gui.toggle_top_flow(player, false)
local container = element.parent.parent.parent.parent
local button = container.header.alignment[toggle_toolbar.name]
button.toggled = false
button.enabled = false
end
-- Update the datastore state
ToolbarState:update(player, function(_, order)
local index = element.parent.get_index_in_parent()
order[index].favourite = element.state
return definition:no_events(flow)
end)
:on_checked_changed(function(player, element)
local top_flow = Gui.get_top_flow(player)
local top_element = top_flow[element.tags.top_element_name]
local had_visible = Gui.top_flow_has_visible_elements(player)
top_element.visible = element.state
-- Check if we are on the edge case between 0 and 1 visible elements
if element.state and not had_visible then
Gui.toggle_top_flow(player, true)
local container = element.parent.parent.parent.parent
local button = container.header.alignment[toggle_toolbar.name]
button.toggled = true
button.enabled = true
elseif not element.state and not Gui.top_flow_has_visible_elements(player) then
Gui.toggle_top_flow(player, false)
local container = element.parent.parent.parent.parent
local button = container.header.alignment[toggle_toolbar.name]
button.toggled = false
button.enabled = false
end
-- Update the datastore state
ToolbarState:update(player, function(_, order)
local index = element.parent.get_index_in_parent()
order[index].favourite = element.state
end)
end)
end)
--- Scrollable list of all toolbar buttons
-- @element toolbar_list
local toolbar_list =
Gui.element(function(_, parent)
-- This is a scroll pane for the list
local scroll_pane = parent.add {
name = "scroll",
type = "scroll-pane",
direction = "vertical",
horizontal_scroll_policy = "never",
vertical_scroll_policy = "auto",
style = "scroll_pane_under_subheader"
}
scroll_pane.style.horizontally_stretchable = true
scroll_pane.style.padding = 0
scroll_pane.style.maximal_height = 224
Gui.element(function(_, parent)
-- This is a scroll pane for the list
local scroll_pane = parent.add{
name = "scroll",
type = "scroll-pane",
direction = "vertical",
horizontal_scroll_policy = "never",
vertical_scroll_policy = "auto",
style = "scroll_pane_under_subheader",
}
scroll_pane.style.horizontally_stretchable = true
scroll_pane.style.padding = 0
scroll_pane.style.maximal_height = 224
-- This flow is the list, we need a linear list because of get_index_in_parent
local flow = scroll_pane.add {
name = "list",
type = "flow",
direction = "vertical"
}
flow.style.vertical_spacing = 0
flow.style.horizontally_stretchable = true
-- This flow is the list, we need a linear list because of get_index_in_parent
local flow = scroll_pane.add{
name = "list",
type = "flow",
direction = "vertical",
}
flow.style.vertical_spacing = 0
flow.style.horizontally_stretchable = true
return flow
end)
return flow
end)
--- Main toolbar container for the left flow
-- @element toolbar_container
toolbar_container =
Gui.element(function(definition, parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name, 268)
container.style.maximal_width = 268
container.style.minimal_width = 268
Gui.element(function(definition, parent)
-- Draw the internal container
local container = Gui.container(parent, definition.name, 268)
container.style.maximal_width = 268
container.style.minimal_width = 268
-- Draw the header
local player = Gui.get_player_from_element(parent)
local header = Gui.header(container, {"toolbar.main-caption"}, {"toolbar.main-tooltip"}, true)
-- Draw the header
local player = Gui.get_player_from_element(parent)
local header = Gui.header(container, { "toolbar.main-caption" }, { "toolbar.main-tooltip" }, true)
-- Draw the toolbar control buttons
local toggle_element = toggle_toolbar(header)
toggle_element.toggled = Gui.get_top_flow(player).visible
reset_toolbar(header)
-- Draw the toolbar control buttons
local toggle_element = toggle_toolbar(header)
toggle_element.toggled = Gui.get_top_flow(player).visible
reset_toolbar(header)
-- Draw toolbar list element
local list_element = toolbar_list(container)
local flow_order = Gui.get_top_flow_order(player)
-- Draw toolbar list element
local list_element = toolbar_list(container)
local flow_order = Gui.get_top_flow_order(player)
for _, element_define in ipairs(flow_order) do
-- Ensure the element exists
local element = list_element[element_define.name]
if not element then
element = toolbar_list_item(list_element, element_define)
for _, element_define in ipairs(flow_order) do
-- Ensure the element exists
local element = list_element[element_define.name]
if not element then
element = toolbar_list_item(list_element, element_define)
end
-- Set the visible state
local allowed = element_define.authenticator
if type(allowed) == "function" then allowed = allowed(player) end
element.visible = allowed or false
end
-- Set the visible state
local allowed = element_define.authenticator
if type(allowed) == 'function' then allowed = allowed(player) end
element.visible = allowed or false
end
-- Set the state of the move buttons for the first and last element
local children = list_element.children
children[1].move[move_up.name].enabled = false
children[#children].move[move_down.name].enabled = false
-- Set the state of the move buttons for the first and last element
local children = list_element.children
children[1].move[move_up.name].enabled = false
children[#children].move[move_down.name].enabled = false
-- Return the external container
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow(false)
-- Return the external container
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow(false)
--- Set the default value for the datastore
local datastore_id_map = {}
@@ -353,7 +354,10 @@ for index, element_define in ipairs(Gui.top_elements) do
if prev_handler then prev_handler(player, element, event) end -- Kind of hacky but works
local frame = Gui.get_left_element(player, toolbar_container)
if not frame then return end -- Gui might not be loaded yet
if not frame.container then log(frame.name) log(frame.parent.name) end
if not frame.container then
log(frame.name)
log(frame.parent.name)
end
local button = frame.container.scroll.list[element_define.name][element_define.name]
local toolbar_button = Gui.get_top_element(player, element_define)
copy_style(toolbar_button, button)
@@ -521,4 +525,4 @@ ToolbarState:on_save(function(player_name, value)
end
return { order, favourites, left_flows, top_flow_open }
end)
end)

View File

@@ -11,13 +11,13 @@ local format_number = require("util").format_number --- @dep util
local config = require("modules.exp_legacy.config.vlayer") --- @dep config.vlayer
local vlayer = require("modules.exp_legacy.modules.control.vlayer")
local Selection = require("modules.exp_legacy.modules.control.selection") --- @dep modules.control.selection
local SelectionConvertArea = 'VlayerConvertChest'
local SelectionConvertArea = "VlayerConvertChest"
--- Align an aabb to the grid by expanding it
local function aabb_align_expand(aabb)
return {
left_top = {x = math.floor(aabb.left_top.x), y = math.floor(aabb.left_top.y)},
right_bottom = {x = math.ceil(aabb.right_bottom.x), y = math.ceil(aabb.right_bottom.y)}
left_top = { x = math.floor(aabb.left_top.x), y = math.floor(aabb.left_top.y) },
right_bottom = { x = math.ceil(aabb.right_bottom.x), y = math.ceil(aabb.right_bottom.y) },
}
end
@@ -26,32 +26,32 @@ local vlayer_gui_control_type
local vlayer_gui_control_list
local vlayer_control_type_list = {
[1] = 'energy',
[2] = 'circuit',
[3] = 'storage_input',
[4] = 'storage_output'
[1] = "energy",
[2] = "circuit",
[3] = "storage_input",
[4] = "storage_output",
}
local function pos_to_gps_string(pos)
return '[gps=' .. string.format('%.1f', pos.x) .. ',' .. string.format('%.1f', pos.y) .. ']'
return "[gps=" .. string.format("%.1f", pos.x) .. "," .. string.format("%.1f", pos.y) .. "]"
end
local function format_energy(amount, unit)
if amount < 1 then
return '0 ' .. unit
return "0 " .. unit
end
local suffix = ''
local suffix = ""
local suffix_list = {
['T'] = 1000000000000,
['G'] = 1000000000,
['M'] = 1000000,
['k'] = 1000
["T"] = 1000000000000,
["G"] = 1000000000,
["M"] = 1000000,
["k"] = 1000,
}
for letter, limit in pairs (suffix_list) do
for letter, limit in pairs(suffix_list) do
if math.abs(amount) >= limit then
amount = string.format('%.1f', amount / limit)
amount = string.format("%.1f", amount / limit)
suffix = letter
break
end
@@ -61,14 +61,14 @@ local function format_energy(amount, unit)
local formatted = amount
while true do
formatted, k = string.gsub(formatted, '^(-?%d+)(%d%d%d)', '%1,%2')
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", "%1,%2")
if (k == 0) then
break
end
end
return formatted .. ' ' .. suffix .. unit
return formatted .. " " .. suffix .. unit
end
--- When an area is selected to add protection to the area
@@ -80,17 +80,16 @@ Selection.on_selection(SelectionConvertArea, function(event)
return nil
end
local entities = player.surface.find_entities_filtered{area=area, name='steel-chest', force=player.force}
local entities = player.surface.find_entities_filtered{ area = area, name = "steel-chest", force = player.force }
local frame = Gui.get_left_element(player, vlayer_container)
local disp = frame.container['vlayer_st_2'].disp.table
local disp = frame.container["vlayer_st_2"].disp.table
local target = vlayer_control_type_list[disp[vlayer_gui_control_type.name].selected_index]
if #entities == 0 then
player.print{'vlayer.steel-chest-detect'}
player.print{ "vlayer.steel-chest-detect" }
return nil
elseif #entities > 1 then
player.print{'vlayer.result-unable', {'vlayer.control-type-' .. target:gsub('_', '-')}, {'vlayer.result-multiple'}}
player.print{ "vlayer.result-unable", { "vlayer.control-type-" .. target:gsub("_", "-") }, { "vlayer.result-multiple" } }
return nil
end
@@ -99,222 +98,219 @@ Selection.on_selection(SelectionConvertArea, function(event)
end
local e = entities[1]
local e_pos = {x=string.format('%.1f', e.position.x), y=string.format('%.1f', e.position.y)}
local e_pos = { x = string.format("%.1f", e.position.x), y = string.format("%.1f", e.position.y) }
local e_circ = e.circuit_connected_entities
if not e.get_inventory(defines.inventory.chest).is_empty() then
player.print{'vlayer.steel-chest-empty'}
player.print{ "vlayer.steel-chest-empty" }
return nil
end
if (vlayer.get_interface_counts()[target] >= config.interface_limit[target]) then
player.print{'vlayer.result-unable', {'vlayer.control-type-' .. target:gsub('_', '-')}, {'vlayer.result-limit'}}
player.print{ "vlayer.result-unable", { "vlayer.control-type-" .. target:gsub("_", "-") }, { "vlayer.result-limit" } }
return nil
end
e.destroy()
if target == 'energy' then
if target == "energy" then
if not vlayer.create_energy_interface(player.surface, e_pos, player) then
player.print{'vlayer.result-unable', {'vlayer.control-type-energy'}, {'vlayer.result-space'}}
player.print{ "vlayer.result-unable", { "vlayer.control-type-energy" }, { "vlayer.result-space" } }
return nil
end
elseif target == 'circuit' then
elseif target == "circuit" then
vlayer.create_circuit_interface(player.surface, e_pos, e_circ, player)
elseif target == 'storage_input' then
elseif target == "storage_input" then
vlayer.create_input_interface(player.surface, e_pos, e_circ, player)
elseif target == 'storage_output' then
elseif target == "storage_output" then
vlayer.create_output_interface(player.surface, e_pos, e_circ, player)
end
game.print{'vlayer.interface-result', player.name, pos_to_gps_string(e_pos), {'vlayer.result-build'}, {'vlayer.control-type-' .. target:gsub('_', '-')}}
game.print{ "vlayer.interface-result", player.name, pos_to_gps_string(e_pos), { "vlayer.result-build" }, { "vlayer.control-type-" .. target:gsub("_", "-") } }
end)
--- Display label for the number of solar panels
-- @element vlayer_gui_display_item_solar_name
local vlayer_gui_display_item_solar_name =
Gui.element{
type = 'label',
name = 'vlayer_display_item_solar_name',
caption = {'vlayer.display-item-solar'},
style = 'heading_2_label'
}:style{
width = 200
}
Gui.element{
type = "label",
name = "vlayer_display_item_solar_name",
caption = { "vlayer.display-item-solar" },
style = "heading_2_label",
}:style{
width = 200,
}
local vlayer_gui_display_item_solar_count =
Gui.element{
type = 'progressbar',
name = 'vlayer_display_item_solar_count',
caption = '',
value = 0,
style = 'electric_satisfaction_statistics_progressbar'
}:style{
width = 200,
font = 'heading-2'
}
Gui.element{
type = "progressbar",
name = "vlayer_display_item_solar_count",
caption = "",
value = 0,
style = "electric_satisfaction_statistics_progressbar",
}:style{
width = 200,
font = "heading-2",
}
--- Display label for the number of accumulators
-- @element vlayer_gui_display_item_accumulator_name
local vlayer_gui_display_item_accumulator_name =
Gui.element{
type = 'label',
name = 'vlayer_display_item_accumulator_name',
caption = {'vlayer.display-item-accumulator'},
style = 'heading_2_label'
}:style{
width = 200
}
Gui.element{
type = "label",
name = "vlayer_display_item_accumulator_name",
caption = { "vlayer.display-item-accumulator" },
style = "heading_2_label",
}:style{
width = 200,
}
local vlayer_gui_display_item_accumulator_count =
Gui.element{
type = 'progressbar',
name = 'vlayer_display_item_accumulator_count',
caption = '',
value = 0,
style = 'electric_satisfaction_statistics_progressbar'
}:style{
width = 200,
font = 'heading-2'
}
Gui.element{
type = "progressbar",
name = "vlayer_display_item_accumulator_count",
caption = "",
value = 0,
style = "electric_satisfaction_statistics_progressbar",
}:style{
width = 200,
font = "heading-2",
}
--- Display label for the remaining surface area
-- @element vlayer_gui_display_signal_remaining_surface_area_name
local vlayer_gui_display_signal_remaining_surface_area_name =
Gui.element{
type = 'label',
name = 'vlayer_display_signal_remaining_surface_area_name',
caption = {'vlayer.display-remaining-surface-area'},
tooltip = {'vlayer.display-remaining-surface-area-tooltip'},
style = 'heading_2_label'
}:style{
width = 200
}
Gui.element{
type = "label",
name = "vlayer_display_signal_remaining_surface_area_name",
caption = { "vlayer.display-remaining-surface-area" },
tooltip = { "vlayer.display-remaining-surface-area-tooltip" },
style = "heading_2_label",
}:style{
width = 200,
}
local vlayer_gui_display_signal_remaining_surface_area_count =
Gui.element{
type = 'label',
name = 'vlayer_display_signal_remaining_surface_area_count',
caption = '0',
style = 'heading_2_label'
}:style{
width = 200,
height = 28,
horizontal_align = 'right'
}
Gui.element{
type = "label",
name = "vlayer_display_signal_remaining_surface_area_count",
caption = "0",
style = "heading_2_label",
}:style{
width = 200,
height = 28,
horizontal_align = "right",
}
--- Display label for the sustained energy production
-- @element vlayer_gui_display_signal_sustained_name
local vlayer_gui_display_signal_sustained_name =
Gui.element{
type = 'label',
name = 'vlayer_display_signal_sustained_name',
caption = {'vlayer.display-sustained-production'},
tooltip = {'vlayer.display-sustained-production-tooltip'},
style = 'heading_2_label'
}:style{
width = 200
}
Gui.element{
type = "label",
name = "vlayer_display_signal_sustained_name",
caption = { "vlayer.display-sustained-production" },
tooltip = { "vlayer.display-sustained-production-tooltip" },
style = "heading_2_label",
}:style{
width = 200,
}
local vlayer_gui_display_signal_sustained_count =
Gui.element{
type = 'label',
name = 'vlayer_display_signal_sustained_count',
caption = '0',
style = 'heading_2_label'
}:style{
width = 200,
height = 28,
horizontal_align = 'right'
}
Gui.element{
type = "label",
name = "vlayer_display_signal_sustained_count",
caption = "0",
style = "heading_2_label",
}:style{
width = 200,
height = 28,
horizontal_align = "right",
}
--- Display label for the current energy production
-- @element vlayer_gui_display_signal_production_name
local vlayer_gui_display_signal_production_name =
Gui.element{
type = 'label',
name = 'vlayer_display_signal_production_name',
caption = {'vlayer.display-current-production'},
tooltip = {'vlayer.display-current-production-tooltip'},
style = 'heading_2_label'
}:style{
width = 200
}
Gui.element{
type = "label",
name = "vlayer_display_signal_production_name",
caption = { "vlayer.display-current-production" },
tooltip = { "vlayer.display-current-production-tooltip" },
style = "heading_2_label",
}:style{
width = 200,
}
local vlayer_gui_display_signal_production_count =
Gui.element{
type = 'progressbar',
name = 'vlayer_display_signal_production_count',
caption = '',
value = 0,
style = 'electric_satisfaction_statistics_progressbar'
}:style{
width = 200,
font = 'heading-2'
}
Gui.element{
type = "progressbar",
name = "vlayer_display_signal_production_count",
caption = "",
value = 0,
style = "electric_satisfaction_statistics_progressbar",
}:style{
width = 200,
font = "heading-2",
}
--- Display label for the sustained energy capacity
-- @element vlayer_gui_display_signal_capacity_name
local vlayer_gui_display_signal_capacity_name =
Gui.element{
type = 'label',
name = 'vlayer_display_signal_capacity_name',
caption = {'vlayer.display-current-capacity'},
tooltip = {'vlayer.display-current-capacity-tooltip'},
style = 'heading_2_label'
}:style{
width = 200
}
Gui.element{
type = "label",
name = "vlayer_display_signal_capacity_name",
caption = { "vlayer.display-current-capacity" },
tooltip = { "vlayer.display-current-capacity-tooltip" },
style = "heading_2_label",
}:style{
width = 200,
}
local vlayer_gui_display_signal_capacity_count =
Gui.element{
type = 'progressbar',
name = 'vlayer_display_signal_capacity_count',
caption = '',
value = 0,
style = 'electric_satisfaction_statistics_progressbar'
}:style{
width = 200,
font = 'heading-2'
}
Gui.element{
type = "progressbar",
name = "vlayer_display_signal_capacity_count",
caption = "",
value = 0,
style = "electric_satisfaction_statistics_progressbar",
}:style{
width = 200,
font = "heading-2",
}
--- A vertical flow containing all the displays labels and their counts
-- @element vlayer_display_set
local vlayer_display_set =
Gui.element(function(_, parent, name)
local vlayer_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(vlayer_set, 400, 2, 'disp')
Gui.element(function(_, parent, name)
local vlayer_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(vlayer_set, 400, 2, "disp")
vlayer_gui_display_item_solar_name(disp)
vlayer_gui_display_item_solar_count(disp)
vlayer_gui_display_item_accumulator_name(disp)
vlayer_gui_display_item_accumulator_count(disp)
vlayer_gui_display_signal_remaining_surface_area_name(disp)
vlayer_gui_display_signal_remaining_surface_area_count(disp)
vlayer_gui_display_signal_sustained_name(disp)
vlayer_gui_display_signal_sustained_count(disp)
vlayer_gui_display_signal_production_name(disp)
vlayer_gui_display_signal_production_count(disp)
vlayer_gui_display_signal_capacity_name(disp)
vlayer_gui_display_signal_capacity_count(disp)
vlayer_gui_display_item_solar_name(disp)
vlayer_gui_display_item_solar_count(disp)
vlayer_gui_display_item_accumulator_name(disp)
vlayer_gui_display_item_accumulator_count(disp)
vlayer_gui_display_signal_remaining_surface_area_name(disp)
vlayer_gui_display_signal_remaining_surface_area_count(disp)
vlayer_gui_display_signal_sustained_name(disp)
vlayer_gui_display_signal_sustained_count(disp)
vlayer_gui_display_signal_production_name(disp)
vlayer_gui_display_signal_production_count(disp)
vlayer_gui_display_signal_capacity_name(disp)
vlayer_gui_display_signal_capacity_count(disp)
return vlayer_set
end)
return vlayer_set
end)
local function vlayer_gui_list_refresh(player)
local frame = Gui.get_left_element(player, vlayer_container)
local disp = frame.container['vlayer_st_2'].disp.table
local disp = frame.container["vlayer_st_2"].disp.table
local target = disp[vlayer_gui_control_type.name].selected_index
local full_list = {}
if target then
local interface = vlayer.get_interfaces()[vlayer_control_type_list[target]]
for i=1, vlayer.get_interface_counts()[vlayer_control_type_list[target]], 1 do
table.insert(full_list, i .. ' X ' .. interface[i].position.x .. ' Y '.. interface[i].position.y)
for i = 1, vlayer.get_interface_counts()[vlayer_control_type_list[target]], 1 do
table.insert(full_list, i .. " X " .. interface[i].position.x .. " Y " .. interface[i].position.y)
end
disp[vlayer_gui_control_list.name].items = full_list
@@ -324,160 +320,160 @@ end
--- A drop down list filter by this type
-- @element vlayer_gui_control_type
vlayer_gui_control_type =
Gui.element{
type = 'drop-down',
name = Gui.unique_static_name,
items = {{'vlayer.control-type-energy'}, {'vlayer.control-type-circuit'}, {'vlayer.control-type-storage-input'}, {'vlayer.control-type-storage-output'}},
selected_index = 1
}:style{
width = 200
}:on_selection_changed(function(player, _, _)
vlayer_gui_list_refresh(player)
end)
Gui.element{
type = "drop-down",
name = Gui.unique_static_name,
items = { { "vlayer.control-type-energy" }, { "vlayer.control-type-circuit" }, { "vlayer.control-type-storage-input" }, { "vlayer.control-type-storage-output" } },
selected_index = 1,
}:style{
width = 200,
}:on_selection_changed(function(player, _, _)
vlayer_gui_list_refresh(player)
end)
--- A drop down list to see the exact item to remove
-- @element vlayer_gui_control_list
vlayer_gui_control_list =
Gui.element{
type = 'drop-down',
name = Gui.unique_static_name
}:style{
width = 200
}
Gui.element{
type = "drop-down",
name = Gui.unique_static_name,
}:style{
width = 200,
}
--- A button to refresh the remove list
-- @element vlayer_gui_control_refresh
local vlayer_gui_control_refresh =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = {'vlayer.control-refresh'}
}:style{
width = 200
}:on_click(function(player, _, _)
vlayer_gui_list_refresh(player)
end)
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "vlayer.control-refresh" },
}:style{
width = 200,
}:on_click(function(player, _, _)
vlayer_gui_list_refresh(player)
end)
--- A button to check if the item is the one wanted to remove
-- @element vlayer_gui_control_see
local vlayer_gui_control_see =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = {'vlayer.control-see'}
}:style{
width = 200
}:on_click(function(player, element, _)
local target = element.parent[vlayer_gui_control_type.name].selected_index
local n = element.parent[vlayer_gui_control_list.name].selected_index
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "vlayer.control-see" },
}:style{
width = 200,
}:on_click(function(player, element, _)
local target = element.parent[vlayer_gui_control_type.name].selected_index
local n = element.parent[vlayer_gui_control_list.name].selected_index
if target and vlayer_control_type_list[target] and n > 0 then
local i = vlayer.get_interfaces()
if target and vlayer_control_type_list[target] and n > 0 then
local i = vlayer.get_interfaces()
if i and i[vlayer_control_type_list[target]] and i[vlayer_control_type_list[target]][n] then
local pos = i[vlayer_control_type_list[target]][n].position
if i and i[vlayer_control_type_list[target]] and i[vlayer_control_type_list[target]][n] then
local pos = i[vlayer_control_type_list[target]][n].position
if pos then
player.zoom_to_world(pos, 2)
player.print{'vlayer.result-interface-location', {'vlayer.control-type-' .. vlayer_control_type_list[target]:gsub('_', '-')}, pos_to_gps_string(pos)}
if pos then
player.zoom_to_world(pos, 2)
player.print{ "vlayer.result-interface-location", { "vlayer.control-type-" .. vlayer_control_type_list[target]:gsub("_", "-") }, pos_to_gps_string(pos) }
end
end
end
end
end)
end)
--- A button used to build the vlayer interface
-- @element vlayer_gui_control_build
local vlayer_gui_control_build =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = {'vlayer.control-build'}
}:style{
width = 200
}:on_click(function(player, _, _)
if Selection.is_selecting(player, SelectionConvertArea) then
Selection.stop(player)
else
Selection.start(player, SelectionConvertArea)
player.print{'expcom-waterfill.entered-area-selection'}
end
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "vlayer.control-build" },
}:style{
width = 200,
}:on_click(function(player, _, _)
if Selection.is_selecting(player, SelectionConvertArea) then
Selection.stop(player)
else
Selection.start(player, SelectionConvertArea)
player.print{ "expcom-waterfill.entered-area-selection" }
end
vlayer_gui_list_refresh(player)
end)
vlayer_gui_list_refresh(player)
end)
--- A button used to remove the vlayer interface
-- @element vlayer_gui_control_remove
local vlayer_gui_control_remove =
Gui.element{
type = 'button',
name = Gui.unique_static_name,
caption = {'vlayer.control-remove'}
}:style{
width = 200
}:on_click(function(player, element, _)
local target = element.parent[vlayer_gui_control_type.name].selected_index
local n = element.parent[vlayer_gui_control_list.name].selected_index
Gui.element{
type = "button",
name = Gui.unique_static_name,
caption = { "vlayer.control-remove" },
}:style{
width = 200,
}:on_click(function(player, element, _)
local target = element.parent[vlayer_gui_control_type.name].selected_index
local n = element.parent[vlayer_gui_control_list.name].selected_index
if target and vlayer_control_type_list[target] and n > 0 then
local i = vlayer.get_interfaces()
if target and vlayer_control_type_list[target] and n > 0 then
local i = vlayer.get_interfaces()
if i and i[vlayer_control_type_list[target]] then
local interface_type, interface_position = vlayer.remove_interface(i[vlayer_control_type_list[target]][n].surface, i[vlayer_control_type_list[target]][n].position)
if i and i[vlayer_control_type_list[target]] then
local interface_type, interface_position = vlayer.remove_interface(i[vlayer_control_type_list[target]][n].surface, i[vlayer_control_type_list[target]][n].position)
if interface_type then
game.print{'vlayer.interface-result', player.name, pos_to_gps_string(interface_position), {'vlayer.result-remove'}, {'vlayer.control-type-' .. interface_type}}
if interface_type then
game.print{ "vlayer.interface-result", player.name, pos_to_gps_string(interface_position), { "vlayer.result-remove" }, { "vlayer.control-type-" .. interface_type } }
end
end
end
end
vlayer_gui_list_refresh(player)
end)
vlayer_gui_list_refresh(player)
end)
--- A vertical flow containing all the control buttons
-- @element vlayer_control_set
local vlayer_control_set =
Gui.element(function(_, parent, name)
local vlayer_set = parent.add{type='flow', direction='vertical', name=name}
local disp = Gui.scroll_table(vlayer_set, 400, 2, 'disp')
Gui.element(function(_, parent, name)
local vlayer_set = parent.add{ type = "flow", direction = "vertical", name = name }
local disp = Gui.scroll_table(vlayer_set, 400, 2, "disp")
vlayer_gui_control_type(disp)
vlayer_gui_control_list(disp)
vlayer_gui_control_refresh(disp)
vlayer_gui_control_see(disp)
vlayer_gui_control_build(disp)
vlayer_gui_control_remove(disp)
vlayer_gui_control_type(disp)
vlayer_gui_control_list(disp)
vlayer_gui_control_refresh(disp)
vlayer_gui_control_see(disp)
vlayer_gui_control_build(disp)
vlayer_gui_control_remove(disp)
return vlayer_set
end)
return vlayer_set
end)
--- The main container for the vlayer gui
-- @element vlayer_container
vlayer_container =
Gui.element(function(definition, parent)
local player = Gui.get_player_from_element(parent)
local container = Gui.container(parent, definition.name, 400)
Gui.element(function(definition, parent)
local player = Gui.get_player_from_element(parent)
local container = Gui.container(parent, definition.name, 400)
vlayer_display_set(container, 'vlayer_st_1')
local control_set = vlayer_control_set(container, 'vlayer_st_2')
control_set.visible = Roles.player_allowed(player, 'gui/vlayer-edit')
vlayer_display_set(container, "vlayer_st_1")
local control_set = vlayer_control_set(container, "vlayer_st_2")
control_set.visible = Roles.player_allowed(player, "gui/vlayer-edit")
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
return container.parent
end)
:static_name(Gui.unique_static_name)
:add_to_left_flow()
--- Button on the top flow used to toggle the task list container
-- @element toggle_left_element
Gui.left_toolbar_button('entity/solar-panel', {'vlayer.main-tooltip'}, vlayer_container, function(player)
return Roles.player_allowed(player, 'gui/vlayer')
Gui.left_toolbar_button("entity/solar-panel", { "vlayer.main-tooltip" }, vlayer_container, function(player)
return Roles.player_allowed(player, "gui/vlayer")
end)
--- Update the visibly of the buttons based on a players roles
local function role_update_event(event)
local player = game.players[event.player_index]
local visible = Roles.player_allowed(player, 'gui/vlayer-edit')
local visible = Roles.player_allowed(player, "gui/vlayer-edit")
local frame = Gui.get_left_element(player, vlayer_container)
frame.container['vlayer_st_2'].visible = visible
frame.container["vlayer_st_2"].visible = visible
end
Event.add(Roles.events.on_role_assigned, role_update_event)
@@ -490,32 +486,32 @@ Event.on_nth_tick(config.update_tick_gui, function(_)
local vlayer_display = {
[vlayer_gui_display_item_solar_count.name] = {
val = (items_alloc['solar-panel'] / math.max(items['solar-panel'], 1)),
cap = format_number(items_alloc['solar-panel']) .. ' / ' .. format_number(items['solar-panel'])
val = (items_alloc["solar-panel"] / math.max(items["solar-panel"], 1)),
cap = format_number(items_alloc["solar-panel"]) .. " / " .. format_number(items["solar-panel"]),
},
[vlayer_gui_display_item_accumulator_count.name] = {
val = (items_alloc['accumulator'] / math.max(items['accumulator'], 1)),
cap = format_number(items_alloc['accumulator']) .. ' / ' .. format_number(items['accumulator'])
val = (items_alloc["accumulator"] / math.max(items["accumulator"], 1)),
cap = format_number(items_alloc["accumulator"]) .. " / " .. format_number(items["accumulator"]),
},
[vlayer_gui_display_signal_remaining_surface_area_count.name] = {
cap = format_number(stats.remaining_surface_area)
cap = format_number(stats.remaining_surface_area),
},
[vlayer_gui_display_signal_sustained_count.name] = {
cap = format_energy(stats.energy_sustained, 'W')
cap = format_energy(stats.energy_sustained, "W"),
},
[vlayer_gui_display_signal_production_count.name] = {
val = (stats.energy_production / math.max(stats.energy_max, 1)),
cap = format_energy(stats.energy_production, 'W') .. ' / ' .. format_energy(stats.energy_max, 'W')
cap = format_energy(stats.energy_production, "W") .. " / " .. format_energy(stats.energy_max, "W"),
},
[vlayer_gui_display_signal_capacity_count.name] = {
val = (stats.energy_storage / math.max(stats.energy_capacity, 1)),
cap = format_energy(stats.energy_storage, 'J') .. ' / ' .. format_energy(stats.energy_capacity, 'J')
}
cap = format_energy(stats.energy_storage, "J") .. " / " .. format_energy(stats.energy_capacity, "J"),
},
}
for _, player in pairs(game.connected_players) do
local frame = Gui.get_left_element(player, vlayer_container)
local disp = frame.container['vlayer_st_1'].disp.table
local disp = frame.container["vlayer_st_1"].disp.table
for k, v in pairs(vlayer_display) do
disp[k].caption = v.cap

File diff suppressed because it is too large Load Diff