Files
factorio-scenario-ExpCluster/exp_legacy/module/modules/gui/production.lua
2024-11-19 22:16:34 +00:00

166 lines
5.2 KiB
Lua

---- Production Data
-- @gui Production
local Gui = require("modules.exp_legacy.expcore.gui") --- @dep expcore.gui
local Event = require("modules/exp_legacy/utils/event") --- @dep utils.event
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
local production_container
local precision = {
[1] = defines.flow_precision_index.five_seconds,
[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
}
local font_color = {
-- positive
[1] = {r = 0.3, g = 1, b = 0.3},
-- negative
[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,')
if f ~= '' then
return m .. i:reverse():gsub('^,', '') .. f
else
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
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'
}
data_1.style.width = 90
data_1.style.horizontal_align = 'right'
data_1.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)
--- 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')
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'}
for i=1, 8 do
production_data_group(disp, i)
end
return production_set
end)
production_container =
Gui.element(function(definition, parent)
local container = Gui.container(parent, definition.name, 350)
production_data_set(container, 'production_st')
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')
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
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 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)
if sum < 0 then
table[production_prefix .. '_3'].style.font_color = font_color[2]
else
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]
end
end
end
end)