--luacheck: ignore -- science logs tab -- local Tabs = require 'comfy_panel.main' local tables = require 'maps.biter_battles_v2.tables' local event = require 'utils.event' local bb_config = require 'maps.biter_battles_v2.config' local food_values = tables.food_values local food_long_and_short = tables.food_long_and_short local food_long_to_short = tables.food_long_to_short local forces_list = tables.forces_list local science_list = tables.science_list local evofilter_list = tables.evofilter_list local food_value_table_version = tables.food_value_table_version local Token = require 'utils.token' local module_name = 'MutagenLog' local function initialize_dropdown_users_choice() global.dropdown_users_choice_force = {} global.dropdown_users_choice_science = {} global.dropdown_users_choice_evo_filter = {} end local function get_science_text(food_name, food_short_name) return table.concat({'[img=item/', food_name, '][color=', food_values[food_name].color, ']', food_short_name, '[/color]'}) end local function add_science_logs(player, element) local science_scrollpanel = element.add {type = 'scroll-pane', name = 'scroll_pane', direction = 'vertical', horizontal_scroll_policy = 'never', vertical_scroll_policy = 'auto'} science_scrollpanel.style.maximal_height = 530 if global.science_logs_category_potion == nil then global.science_logs_category_potion = {} for i = 1, 7 do table.insert(global.science_logs_category_potion, get_science_text(food_long_and_short[i].long_name, food_long_and_short[i].short_name)) end end if global.science_logs_total_north == nil then global.science_logs_total_north = {0} global.science_logs_total_south = {0} for i = 1, 7 do table.insert(global.science_logs_total_north, 0) table.insert(global.science_logs_total_south, 0) end end local t_summary = science_scrollpanel.add {type = 'table', name = 'science_logs_summary_header_table', column_count = 8} local width_summary_columns = tonumber(94) local width_summary_first_column = tonumber(110) local column_widths = { width_summary_first_column, width_summary_columns, width_summary_columns, width_summary_columns, width_summary_columns, width_summary_columns, width_summary_columns, width_summary_columns } local headersSummary = { [1] = '', [2] = global.science_logs_category_potion[1], [3] = global.science_logs_category_potion[2], [4] = global.science_logs_category_potion[3], [5] = global.science_logs_category_potion[4], [6] = global.science_logs_category_potion[5], [7] = global.science_logs_category_potion[6], [8] = global.science_logs_category_potion[7] } for _, w in ipairs(column_widths) do local label = t_summary.add {type = 'label', caption = headersSummary[_]} label.style.minimal_width = w label.style.maximal_width = w end summary_panel_table = science_scrollpanel.add {type = 'table', column_count = 8} local label = summary_panel_table.add {type = 'label', name = 'science_logs_total_north_header', caption = 'Total sent by north'} label.style.minimal_width = width_summary_first_column label.style.maximal_width = width_summary_first_column for i = 1, 7 do local label = summary_panel_table.add {type = 'label', name = 'science_logs_total_north_' .. i, caption = global.science_logs_total_north[i]} label.style.minimal_width = width_summary_columns label.style.maximal_width = width_summary_columns end science_scrollpanel.add({type = 'line'}) summary_panel_table2 = science_scrollpanel.add {type = 'table', column_count = 8} local label = summary_panel_table2.add {type = 'label', name = 'science_logs_total_south_header', caption = 'Total sent by south'} label.style.minimal_width = width_summary_first_column label.style.maximal_width = width_summary_first_column for i = 1, 7 do local label = summary_panel_table2.add {type = 'label', name = 'science_logs_total_south' .. i, caption = global.science_logs_total_south[i]} label.style.minimal_width = width_summary_columns label.style.maximal_width = width_summary_columns end science_scrollpanel.add({type = 'line'}) summary_panel_table3 = science_scrollpanel.add {type = 'table', column_count = 8} local label = summary_panel_table3.add {type = 'label', name = 'science_logs_total_passive_feed_header', caption = 'Total passive feed'} label.style.minimal_width = width_summary_first_column label.style.maximal_width = width_summary_first_column for i = 1, 7 do local text_passive_feed = '0' if global.total_passive_feed_redpotion ~= nil then text_passive_feed = math.round(global.total_passive_feed_redpotion * food_value_table_version[1] / food_value_table_version[i], 1) end local label = summary_panel_table3.add {type = 'label', name = 'science_logs_passive_feed' .. i, caption = text_passive_feed} label.style.minimal_width = width_summary_columns label.style.maximal_width = width_summary_columns end science_scrollpanel.add({type = 'line'}) if global.dropdown_users_choice_force == nil then initialize_dropdown_users_choice() end if global.dropdown_users_choice_force[player.name] == nil then global.dropdown_users_choice_force[player.name] = 1 end if global.dropdown_users_choice_science[player.name] == nil then global.dropdown_users_choice_science[player.name] = 1 end if global.dropdown_users_choice_evo_filter[player.name] == nil then global.dropdown_users_choice_evo_filter[player.name] = 1 end local t_filter = science_scrollpanel.add {type = 'table', name = 'science_logs_filter_table', column_count = 3} local dropdown_force = t_filter.add {name = 'dropdown-force', type = 'drop-down', items = forces_list, selected_index = global.dropdown_users_choice_force[player.name]} local dropdown_science = t_filter.add {name = 'dropdown-science', type = 'drop-down', items = science_list, selected_index = global.dropdown_users_choice_science[player.name]} local dropdown_evofilter = t_filter.add {name = 'dropdown-evofilter', type = 'drop-down', items = evofilter_list, selected_index = global.dropdown_users_choice_evo_filter[player.name]} local t = science_scrollpanel.add {type = 'table', name = 'science_logs_header_table', column_count = 4} local column_widths = {tonumber(75), tonumber(310), tonumber(165), tonumber(230)} local headers = { [1] = 'Time', [2] = 'Details', [3] = 'Evo jump', [4] = 'Threat jump' } for _, w in ipairs(column_widths) do local label = t.add {type = 'label', caption = headers[_]} label.style.minimal_width = w label.style.maximal_width = w label.style.font = 'default-bold' label.style.font_color = {r = 0.98, g = 0.66, b = 0.22} if _ == 1 then label.style.horizontal_align = 'center' end end local n = bb_config.north_side_team_name local s = bb_config.south_side_team_name if global.tm_custom_name['north'] then n = global.tm_custom_name['north'] end if global.tm_custom_name['south'] then s = global.tm_custom_name['south'] end local team_strings = { ['north'] = table.concat({'[color=120, 120, 255]', n, '[/color]'}), ['south'] = table.concat({'[color=255, 65, 65]', s, '[/color]'}) } if global.science_logs_date then for i = 1, #global.science_logs_date, 1 do local real_force_name = global.science_logs_fed_team[i] local custom_force_name = team_strings[real_force_name] local easy_food_name = food_long_to_short[global.science_logs_food_name[i]].short_name if dropdown_force.selected_index == 1 or real_force_name:match(dropdown_force.get_item(dropdown_force.selected_index)) then if dropdown_science.selected_index == 1 or (dropdown_science.selected_index == 2 and (easy_food_name:match('space') or easy_food_name:match('utility') or easy_food_name:match('production'))) or (dropdown_science.selected_index == 3 and (easy_food_name:match('space') or easy_food_name:match('utility') or easy_food_name:match('production') or easy_food_name:match('chemical'))) or (dropdown_science.selected_index == 4 and (easy_food_name:match('space') or easy_food_name:match('utility') or easy_food_name:match('production') or easy_food_name:match('chemical') or easy_food_name:match('military'))) or easy_food_name:match(dropdown_science.get_item(dropdown_science.selected_index)) then if dropdown_evofilter.selected_index == 1 or (dropdown_evofilter.selected_index == 2 and (global.science_logs_evo_jump_difference[i] > 0)) or (dropdown_evofilter.selected_index == 3 and (global.science_logs_evo_jump_difference[i] >= 10)) or (dropdown_evofilter.selected_index == 4 and (global.science_logs_evo_jump_difference[i] >= 5)) or (dropdown_evofilter.selected_index == 5 and (global.science_logs_evo_jump_difference[i] >= 4)) or (dropdown_evofilter.selected_index == 6 and (global.science_logs_evo_jump_difference[i] >= 3)) or (dropdown_evofilter.selected_index == 7 and (global.science_logs_evo_jump_difference[i] >= 2)) or (dropdown_evofilter.selected_index == 8 and (global.science_logs_evo_jump_difference[i] >= 1)) then science_panel_table = science_scrollpanel.add {type = 'table', column_count = 4} local label = science_panel_table.add {type = 'label', name = 'science_logs_date' .. i, caption = global.science_logs_date[i]} label.style.minimal_width = column_widths[1] label.style.maximal_width = column_widths[1] label.style.horizontal_align = 'center' local label = science_panel_table.add {type = 'label', name = 'science_logs_text' .. i, caption = global.science_logs_text[i] .. custom_force_name} label.style.minimal_width = column_widths[2] label.style.maximal_width = column_widths[2] local label = science_panel_table.add { type = 'label', name = 'science_logs_evo_jump' .. i, caption = global.science_logs_evo_jump[i] .. ' [color=200,200,200](+' .. global.science_logs_evo_jump_difference[i] .. ')[/color]' } label.style.minimal_width = column_widths[3] label.style.maximal_width = column_widths[3] local label = science_panel_table.add { type = 'label', name = 'science_logs_threat' .. i, caption = global.science_logs_threat[i] .. ' [color=200,200,200](+' .. global.science_logs_threat_jump_difference[i] .. ')[/color]' } label.style.minimal_width = column_widths[4] label.style.maximal_width = column_widths[4] science_scrollpanel.add({type = 'line'}) end end end end end end local function comfy_panel_get_active_frame(player) if not player.gui.left.comfy_panel then return false end if not player.gui.left.comfy_panel.tabbed_pane.selected_tab_index then return player.gui.left.comfy_panel.tabbed_pane.tabs[1].content end return player.gui.left.comfy_panel.tabbed_pane.tabs[player.gui.left.comfy_panel.tabbed_pane.selected_tab_index].content end local function build_config_gui(data) local player = data.player local frame_sciencelogs = comfy_panel_get_active_frame(player) if not frame_sciencelogs then return end frame_sciencelogs.clear() add_science_logs(player, frame_sciencelogs) end local build_config_gui_token = Token.register(build_config_gui) local function on_gui_selection_state_changed(event) local player = game.players[event.player_index] if not event.element.valid then return end local name = event.element.name if global.dropdown_users_choice_force == nil then initialize_dropdown_users_choice() end if name == 'dropdown-force' then global.dropdown_users_choice_force[player.name] = event.element.selected_index build_config_gui({player = player}) end if name == 'dropdown-science' then global.dropdown_users_choice_science[player.name] = event.element.selected_index build_config_gui({player = player}) end if name == 'dropdown-evofilter' then global.dropdown_users_choice_evo_filter[player.name] = event.element.selected_index build_config_gui({player = player}) end end event.add(defines.events.on_gui_selection_state_changed, on_gui_selection_state_changed) Tabs.add_tab_to_gui({name = module_name, id = build_config_gui_token, admin = false})