Update all code styles
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user