---@diagnostic disable -- This file contains functionality to rig the interface for various setups -- that make for good screenshots. It provides a remote interface that its -- companion scenario calls to actually take the screenshots. -- This code is terrible and uses some functions completely inappropriately, -- but it needs to do that to manipulate the interface because GUI events -- can't be raised manually anymore. local mod_gui = require("mod-gui") local handler_requires = {"ui.base.compact_dialog", "ui.base.modal_dialog", "ui.main.title_bar", "ui.dialogs.picker_dialog", "ui.dialogs.porter_dialog"} local handlers = {} -- Need to require these here since it can't be done inside an event for _, path in pairs(handler_requires) do handlers[path] = require(path) end local function return_dimensions(scene, frame) local dimensions = {actual_size=frame.actual_size, location=frame.location} -- We do this on teardown so the frame has time to adjust all its sizes remote.call("screenshotter_output", "return_dimensions", scene, dimensions) end local function open_modal(player, dialog, modal_data) main_dialog.toggle(player) util.globals.main_elements(player).main_frame.location = player.display_resolution -- hack city util.raise.open_dialog(player, {dialog=dialog, modal_data=modal_data, skip_dimmer=true}) end local function modal_teardown(player, scene) return_dimensions(scene, util.globals.modal_elements(player).modal_frame) util.raise.close_dialog(player, "cancel") end local function get_handler(path, index, event, name) local gui_handlers = handlers[path][index].gui[event] for _, handler_table in pairs(gui_handlers) do if handler_table.name == name then return handler_table.handler end end end local function set_machine_default(player, proto_name, category_name) local proto = prototyper.util.find_prototype("machines", proto_name, category_name) prototyper.defaults.set(player, "machines", proto.id, proto.category_id) end local actions = { player_setup = function(player) local player_table = util.globals.player_table(player) -- Mod settings settings.get_player_settings(player)["fp_display_gui_button"] = {value = false} settings.get_player_settings(player)["fp_products_per_row"] = {value = 5} settings.get_player_settings(player)["fp_subfactory_list_rows"] = {value = 18} -- Preferences player_table.preferences.recipe_filters = {disabled = true, hidden = false} player_table.preferences.ignore_barreling_recipes = true player_table.preferences.ignore_recycling_recipes = true player_table.preferences.done_column = true player_table.preferences.mb_defaults = { -- naughty use of the prototyper function machine = prototyper.util.find_prototype("modules", "productivity-module-3", "productivity"), machine_secondary = nil, beacon = prototyper.util.find_prototype("modules", "speed-module-3", "speed"), beacon_count = 8 } prototyper.defaults.set(player, "belts", PROTOTYPE_MAPS.belts["fast-transport-belt"].id) set_machine_default(player, "electric-mining-drill", "basic-solid") set_machine_default(player, "steel-furnace", "smelting") set_machine_default(player, "assembling-machine-2", "crafting") set_machine_default(player, "assembling-machine-3", "advanced-crafting") set_machine_default(player, "assembling-machine-2", "crafting-with-fluid") -- Subfactories local export_string = "eNrtWmlTGk0Q/iup/WrAmdk5dqzKBy9CMBqOiMGURe0uA67uxR4CWv73t4dDycELmIQchR8smenu6e55+hp5MIKo075TSepFobFn4CIucma8NtQwjpKsDbupyoy9B8OxUzUlsBAQdH3Pgc+oiEmR68+2m0XJKPbtMFTJs6jH10aaO5NdT6XG3ucHI7QDLeuzF/TeeJkKdr0wVUmmkqtX9SjKUhCXeYFKXdsHOo5eG2GUaV4Ddhw/V3HihUC29wDSq0nUyd2xjpFzo9zZuuvbqWY5jHwfVrV9sJpFcbvrR1Gi6d97oVqRz1d3yjf28PN+aSxljqExM3MEq09GNgLlg2Wjf8mm54uLJ4qCwELqeip0VSG23durV8dDO4jB0lWt/mwgddZv3kh00rvfP61nlo+HzaDcFajptlo8eVdHpXr/ZFiN89Fu89BUoi8Pq4KNbt+a9aPB6W1d3e87528lOwirTuukZWaoerJ7FF2/Ld2822kcVvYDUS4djM6Sd42oV/Uq5fsD1izv1O5rOzHF6CD1OlV1MBpUZat8LUpHlZ3+Rxm3hmrwqey0LPDrIPU/XKDz89HlWcm9rJ8PT6yb3olrssagVcnNPOf3fdmMeD5Cl4qjo9LOvtsXF6XBG7AW7Ivxze2xtq9WV7sjPCz135ea936zciyc2ik/bjQuDvuN/F4NA8L52zsxYHfm5en5IHnfov7gw30PtfrlXInBbqW+M0rywfta7ejopn5U60asMtxJz6ulVtit3bxr9Afmh9uzc8t29m/D3qBaa5YvysllBZXdXkgjfNBKjuWnZlgJT68vKubZSdTyW0ooJ7xonX/68Gm3l3thtWPfJQ2eVT/azZvd/YPgGF1+NK6+D1AIbIBDFunFKVAWwAO8kXoAD6/rqY6xlyW5ApyMYs2iYaURaAdRHsIB2ALQJKqfe4nqtGerD0ZHdeFGOm1nBEzT5a+4HIi89lSlru2nahorU9xPjp0hfWbR49XLwgysn7GN9yZpbw3yRLlePCb6ES+6dqZ6Olz3DDexu5kX9rTuzyLaUz9PVvTBMz3qEwW074HyTs1EdiKt+9iBIEglrgozuwdLGIGTA9u9nhr3td4gVgWODyoUplQFcx2luxGc1fa9wMuezoeClPuqPS1Kk0/pqjC887JRYcKzXJN5pnlA0mePnY5F/Q9kptq6T5wqiLNRO/V1kdtDX0tqgFVzyfd06tpHDWXb1QX6W9umO0uM6cbtKeGcJdYL3ZnGSnVW9uOYev5Y8mIHkjUdePBk8obz1VyWmeJ21TSjq+zKiSGxPf9vzALk12eBxV3Pl5BCX0GKrB6TK2Jq4SUtAhCxWFFgSixEKDItaRFmUUsKS1KKCRESE4mIZRJkYsI2BjYv0VGReZsuPJO/t4hbHXFLbmoB7jglRYsB8BAmCEuqYUYoAI8Kgjg2JeOUYYo5woxvEHdKsyWeW+jmSWiPgbNNeH8y/Fa6sAUgnGGQcEG5kJwJRpngnOlUxyWzLAoZUDDCLcYot8TmcPidJnILxRe1jOQPbhnXh/uquPgzEH+15DGIfPMYtFaQ2J07G7rmTsH1Ejf3su2Mup1RtzPqT51RVwqxhcnGKn6RbEwC0wVGGHMuucmEIAIxJCy88QYvCqFj+C1ZYztgvKzDW3pjC0BoEV5kJuIwVGBpUsEtJDiCYkctRAljkhNTYKDC8HuDDZ4bxQCCgms7m+7stghcF4FL72oB9kyBaBFZMMSaFpWSYkakhHlWYxCZmJuYcikI3+iEm2ZK+YXYh6taWqj0fxN/Z7+07jQ+r/Cf2Sv9ltli2yttpFdaFlmLnmCRwEXolXRegMYIEgST1OSwYkLVohAjkCEYIpLIjT5BpBmEbcFJVniD/bmJYv0CNfH8T0oS3Vx79juHRL7XKYx3l9W+axV4ru3P3zIr6kd2aIcJklxfMSGMmJxgCiO3ZSFMqcDQqEhMoVvhFI1rwtN0rE99/JVV8+c/VSzDz6pTgyUhMBiBMBACXCSJfjSWQjBTok0WTjAgApuSwtiwZRhw7BTq1hgzvysqnqpn4IW6d+sknu+vqfe/9yaHfw3Q18r40AwWpf4xOTYFRD9kA667Q0ZgOKFMSAmjCcwlSJq/+AnuR76PlcZeRyV6Nrt69S9948z++425evwPtGH0aA==" util.porter.add_by_string(player, export_string) local trash = Factory.get_by_gui_position(player_table.factory, "Subfactory", 5) Factory.remove(player_table.factory, trash) Factory.add(player_table.archive, trash) local hotness = Factory.get_by_gui_position(player_table.factory, "Subfactory", 3) util.context.set_subfactory(player, hotness) solver.update(player, hotness) util.raise.refresh(player, "all", nil) -- Research player.force.technologies["oil-processing"].researched=true player.force.technologies["coal-liquefaction"].researched=true -- Player inventory player.insert{name="assembling-machine-3", count=9} player.insert{name="assembling-machine-2", count=1} player.insert{name="electric-mining-drill", count=29} player.insert{name="speed-module-3", count=14} player.insert{name="speed-module-2", count=1} player.insert{name="chemical-plant", count=6} end, setup_01_main_interface = function(player) local translation_progress = mod_gui.get_frame_flow(player)["flib_translation_progress"] if translation_progress then translation_progress.visible = false end main_dialog.toggle(player) end, teardown_01_main_interface = function(player) local main_frame = util.globals.main_elements(player).main_frame return_dimensions("01_main_interface", main_frame) end, setup_02_compact_interface = function(player) util.globals.main_elements(player).main_frame.location = player.display_resolution -- hack city view_state.select(player, 2) local toggle_handler = get_handler("ui.main.title_bar", 1, "on_gui_click", "switch_to_compact_view") toggle_handler(player, nil, nil) end, teardown_02_compact_interface = function(player) local compact_frame = util.globals.ui_state(player).compact_elements.compact_frame return_dimensions("02_compact_interface", compact_frame) local toggle_handler = get_handler("ui.base.compact_dialog", 2, "on_gui_click", "switch_to_main_view") toggle_handler(player, nil, nil) end, setup_03_item_picker = function(player) local modal_data = {item_id=nil, item_category="product"} open_modal(player, "picker", modal_data) local modal_elements = util.globals.modal_elements(player) modal_elements.search_textfield.text = "f" local search_handler = get_handler("ui.base.modal_dialog", 1, "on_gui_text_changed", "modal_searchfield") search_handler(player, nil, {text="f"}) local group_handler = get_handler("ui.dialogs.picker_dialog", 1, "on_gui_click", "select_picker_item_group") group_handler(player, {group_id=3}, nil) modal_elements.item_choice_button.sprite = "item/raw-fish" modal_elements.belt_amount_textfield.text = "0.5" modal_elements.belt_choice_button.elem_value = "fast-transport-belt" local belt_handler = get_handler("ui.dialogs.picker_dialog", 1, "on_gui_elem_changed", "picker_choose_belt") belt_handler(player, nil, {element=modal_elements.belt_choice_button, elem_value="fast-transport-belt"}) modal_elements.search_textfield.focus() end, teardown_03_item_picker = (function(player) modal_teardown(player, "03_item_picker") end), setup_04_recipe_picker = function(player) local product_proto = prototyper.util.find_prototype("items", "petroleum-gas", "fluid") ---@cast product_proto -nil open_modal(player, "recipe", {category_id=product_proto.category_id, product_id=product_proto.id, production_type="produce"}) end, teardown_04_recipe_picker = (function(player) modal_teardown(player, "04_recipe_picker") end), setup_05_machine = function(player) local floor = util.globals.context(player).floor local line = Collection.get_by_gui_position(floor.Line, 2) ---@cast line -nil local modal_data = {floor_id=floor.id, line_id=line.id, recipe_name=line.recipe.proto.localised_name} open_modal(player, "machine", modal_data) end, teardown_05_machine = (function(player) modal_teardown(player, "05_machine") end), setup_06_import = function(player) open_modal(player, "import", nil) local export_string = "eNrtWt+P4jYQ/lfcPG+2hG2ra6Q+tJUqVepJp+Ohqu5Q5DiT3Wn9I7UdVIT43ztOzIK4RRDKHnBF4gHb4/HM941n7CSLRJmqmIF1aHSSJ9l9dv/tKLlL4J/GWF/QqAOf5Iuk5A5WAt+TQC2xpPboPqNfaHPhjZ03kmsNdq1qeZe4tuxHEVySf1gkmqug6wOqxx/Qg/oatQPrwU7Ze2O8I3UeFTjBJcl9N7pLtPFhbkIj76ypWtHZZMo/QZB4vqBV+kYhJHdB8lfSS9Kr5s9GShoOXpKsN01RS2Ns0PIbatinrZPZpU3CDGSSZ+vxXzrdy3XHZAXBnHqfAZgokOT1/P/i75rwpneKFKZOIGgBacPFX1P2B/AnNum7vtqNS8reUaAx03rmaCKwqIWtFX/UKfvx7xYtMM5qdE/MG1a2KCs2abCieLO90O8oZZhX8lLOmQaomDI0C2mccVrAKNJrUPsdbFBE03RvQmf0dId/pMChaiTWCFWSe9sCuThvwpSAS4CQK9PSUnn2hvy10HlQFaveRVJBTeRURTmnSbF7a1ZJYVVEk2ouHcQQiMT1y66oWnm0nJ4ypgiTrVgKWWCAuAWBTSf0X7AV3MNjiMI8EZbXHvVjsH2toojo9z2bMf++NyAwQpIzWKmsTLC9g5UUgRWgPX+krmxE0CsunqJz23aTWlClJBPSKJU+DDG6NrRWIVGhf16f8nMroYg5um+5Q4Nzhn6e9nP2W7I5aTNMv1kj9rZT9VIgxZFdoRS9EM8aQTV+XjgZakE+2l5hQt5u5Jq3EfJlCHwuQh371Oc4ssfJuimi4IaHb46E2TWUSg7Gt5PeXHZ8cmDHA4H9KUIRMvjBu9NylNe4FcevvxVfqLOD+Btt8Tc+dGMMIjCUvdR5vM6MeqMxYgNhfYsirVurecfDjcxrJfOFin3j86g6PL7COryOmelRF7XxJxe1QcHHqxmnQ3aVCrSiRX87aN8O2reD9tkP2n2BN5pK/Fk2Zv//VuFPU+GFaQjKVPDyc5f2a+Hx9Bs/O/nGz7ZiJXuVWHEeQKaNJNf2+hyeMJ+zFg+9hmwa/CXvd+cJ0bS0B1yzbxxe6pMS1Rji0aYdmftQKbkjCJ2RWJ2fSYU6pO/KopQDDb+Ue9kL2fvusCP4+Ngj+OlPig9HXwUHPT4gQU8cltzurdNPoND57r3dWQ4XnQGCd/VN+0HmXkaueXgVCvtNaJBwsUaAcyG/7gFnS/pMhAYrbPfOsnvRPdDiy7yLP1xOIrjku/j4mu/i08/+UYR7/ixhyr7sT0Kmy38BcOORig==" local modal_elements = util.globals.modal_elements(player) modal_elements.import_textfield.text = export_string local textfield_handler = get_handler("ui.dialogs.porter_dialog", 1, "on_gui_text_changed", "import_string") textfield_handler(player, nil, {element=modal_elements.import_textfield, text=export_string}) local import_handler = get_handler("ui.dialogs.porter_dialog", 1, "on_gui_click", "import_subfactories") import_handler(player, nil, nil) modal_elements.subfactory_checkboxes["tmp_1"].state = false modal_elements.subfactory_checkboxes["tmp_3"].state = false modal_elements.master_checkbox.state = false end, teardown_06_import = (function(player) modal_teardown(player, "06_import") end), setup_07_utility = function(player) open_modal(player, "utility", nil) end, teardown_07_utility = (function(player) modal_teardown(player, "07_utility") end), setup_08_preferences = function(player) open_modal(player, "preferences", nil) end, teardown_08_preferences = (function(player) modal_teardown(player, "08_preferences") end) } local function initial_setup() DEV_ACTIVE = false -- desync city, but it's fiiine. Avoids any accidental artifacts. return {"09_settings"} end local function execute_action(player_index, action_name) local player = game.get_player(player_index) actions[action_name](player) end remote.add_interface("screenshotter_input", { initial_setup = initial_setup, execute_action = execute_action })