├── .github └── ISSUE_TEMPLATE │ └── bug-report.yml ├── .gitignore ├── .mailmap ├── LICENSE ├── README.md ├── changelog.txt ├── control.lua ├── crowdin.yml ├── data-final-fixes.lua ├── data.lua ├── graphics ├── entity │ ├── aggregate-chest │ │ ├── aggregate-chest-shadow.png │ │ └── aggregate-chest.png │ ├── infinity-cargo-wagon-minimap-selected.png │ ├── infinity-cargo-wagon-minimap.png │ ├── infinity-chest │ │ ├── infinity-chest-shadow.png │ │ └── infinity-chest.png │ ├── infinity-fluid-wagon-minimap-selected.png │ ├── infinity-fluid-wagon-minimap.png │ └── linked-chest │ │ ├── linked-chest-shadow.png │ │ └── linked-chest.png ├── gui │ ├── crafting-group.png │ ├── frame-action-icons.png │ └── inventory-filters.png ├── item │ ├── aggregate-chest.png │ ├── infinity-chest.png │ ├── linked-chest.png │ ├── module-1.png │ └── module-3.png └── shortcut-bar │ ├── map-editor-x24.png │ └── map-editor-x56.png ├── info.json ├── locale ├── af │ └── EditorExtensions.cfg ├── ar │ └── EditorExtensions.cfg ├── ca │ └── EditorExtensions.cfg ├── cs │ └── EditorExtensions.cfg ├── da │ └── EditorExtensions.cfg ├── de │ └── EditorExtensions.cfg ├── el │ └── EditorExtensions.cfg ├── en │ └── EditorExtensions.cfg ├── es-ES │ └── EditorExtensions.cfg ├── et │ └── EditorExtensions.cfg ├── fi │ └── EditorExtensions.cfg ├── fr │ └── EditorExtensions.cfg ├── he │ └── EditorExtensions.cfg ├── hu │ └── EditorExtensions.cfg ├── it │ └── EditorExtensions.cfg ├── ja │ └── EditorExtensions.cfg ├── ko │ └── EditorExtensions.cfg ├── nl │ └── EditorExtensions.cfg ├── no │ └── EditorExtensions.cfg ├── pl │ └── EditorExtensions.cfg ├── pt-BZ │ └── EditorExtensions.cfg ├── pt-PT │ └── EditorExtensions.cfg ├── ro │ └── EditorExtensions.cfg ├── ru │ └── EditorExtensions.cfg ├── sr │ └── EditorExtensions.cfg ├── sv-SE │ └── EditorExtensions.cfg ├── tr │ └── EditorExtensions.cfg ├── uk │ └── EditorExtensions.cfg ├── vi │ └── EditorExtensions.cfg ├── zh-CN │ └── EditorExtensions.cfg └── zh-TW │ └── EditorExtensions.cfg ├── migrations └── 02.00.00.json ├── pesticide.json ├── prototypes ├── constants.lua ├── custom-input.lua ├── editor-controller.lua ├── entity.lua ├── equipment.lua ├── fluid.lua ├── item-group.lua ├── item.lua ├── module.lua ├── recipe-category.lua ├── recipe.lua ├── shortcut.lua ├── sprite.lua ├── style.lua ├── tile.lua └── util.lua ├── scenarios └── testing │ ├── blueprint.zip │ ├── description.json │ ├── image.png │ └── locale │ ├── af │ └── testing.cfg │ ├── ar │ └── testing.cfg │ ├── ca │ └── testing.cfg │ ├── cs │ └── testing.cfg │ ├── da │ └── testing.cfg │ ├── de │ └── testing.cfg │ ├── el │ └── testing.cfg │ ├── en │ └── testing.cfg │ ├── es-ES │ └── testing.cfg │ ├── et │ └── testing.cfg │ ├── fi │ └── testing.cfg │ ├── fr │ └── testing.cfg │ ├── he │ └── testing.cfg │ ├── hu │ └── testing.cfg │ ├── it │ └── testing.cfg │ ├── ja │ └── testing.cfg │ ├── ko │ └── testing.cfg │ ├── nl │ └── testing.cfg │ ├── no │ └── testing.cfg │ ├── pl │ └── testing.cfg │ ├── pt-BZ │ └── testing.cfg │ ├── pt-PT │ └── testing.cfg │ ├── ro │ └── testing.cfg │ ├── ru │ └── testing.cfg │ ├── sr │ └── testing.cfg │ ├── sv-SE │ └── testing.cfg │ ├── tr │ └── testing.cfg │ ├── uk │ └── testing.cfg │ ├── vi │ └── testing.cfg │ ├── zh-CN │ └── testing.cfg │ └── zh-TW │ └── testing.cfg ├── screenshots ├── editor-shortcut.png ├── testing-lab.png └── testing-tools.png ├── scripts ├── aggregate-chest.lua ├── cheat-mode.lua ├── debug-world.lua ├── editor.lua ├── infinity-accumulator.lua ├── infinity-loader.lua ├── infinity-pipe.lua ├── infinity-wagon.lua ├── inventory-filters.lua ├── inventory-sync.lua ├── linked-belt.lua ├── migrations.lua ├── scenarios │ └── testing.lua ├── super-pump.lua ├── testing-lab.lua ├── update-notification.lua └── util.lua ├── settings.lua ├── stylua.toml ├── thumbnail.png └── types.lua /.github/ISSUE_TEMPLATE/bug-report.yml: -------------------------------------------------------------------------------- 1 | name: Bug report 2 | description: File a bug report 3 | body: 4 | - type: textarea 5 | attributes: 6 | label: Description 7 | description: A brief description of the issue. Attach `factorio-current.log` by dragging the file into the area below. 8 | placeholder: | 9 | The mod EditorExtensions (2.0.0) caused an unrecoverable error... 10 | validations: 11 | required: true 12 | - type: textarea 13 | attributes: 14 | label: Reproduction 15 | description: Exact steps to reproduce the issue. Attach the save file used to reproduce the issue, or use a file sharing service. Alternatively, reproduce the issue on a fresh save file. 16 | placeholder: | 17 | 1. Load save file 18 | 2. Click on "..." 19 | 3. See error 20 | - type: markdown 21 | attributes: 22 | value: | 23 | **ISSUES MUST BE REPRODUCED ON THE LATEST VERSIONS OF FACTORIO AND ALL MODS.** 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .kakrc 3 | .pesticide 4 | .luarc.json 5 | -------------------------------------------------------------------------------- /.mailmap: -------------------------------------------------------------------------------- 1 | Caleb Heuer raiguard 2 | Caleb Heuer raiguard <3515394+raiguard@users.noreply.github.com> 3 | Caleb Heuer raiguard 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019-2023 Caleb Heuer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | ----- 24 | 25 | Icons from Font Awesome 5 Free are used under the Creative Commons BY 4.0 26 | license. 27 | https://fontawesome.com 28 | https://creativecommons.org/licenses/by/4.0/ 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This project has migrated to [Codeberg](https://codeberg.org/raiguard/EditorExtensions) 2 | 3 | [![shield](https://img.shields.io/badge/Ko--fi-Donate%20-hotpink?logo=kofi&logoColor=white)](https://ko-fi.com/raiguard) 4 | [![shield](https://img.shields.io/badge/Crowdin-Translate-brightgreen)](https://crowdin.com/project/raiguards-factorio-mods) 5 | [![shield](https://img.shields.io/badge/dynamic/json?color=orange&label=Factorio&query=downloads_count&suffix=%20downloads&url=https%3A%2F%2Fmods.factorio.com%2Fapi%2Fmods%2FEditorExtensions)](https://mods.factorio.com/mod/EditorExtensions) 6 | 7 | # Editor Extensions 8 | 9 | Extends the Factorio map editor with new features, testing tools, and quality 10 | of life changes. Also adds a separate editor lab that can be used to design 11 | blueprints separately from your main factory. 12 | 13 | ## Installation 14 | 15 | [Download on the Mod Portal.](https://mods.factorio.com/mod/EditorExtensions) 16 | 17 | ## Features 18 | 19 | ### Map editor conveniences 20 | 21 | Enter the map editor by pressing the shortcut button, or by using `Control + 22 | Alt + E`: 23 | 24 | ![](screenshots/editor-shortcut.png) 25 | 26 | The mod will rearrange the top-left mod GUIs so that they remain visible while 27 | inside the editor. If you have cheat mode enabled, your inventory and cursor 28 | will be synced between the map editor and regular play. 29 | 30 | ### Personal or shared testing lab 31 | 32 | ![](screenshots/testing-lab.png) 33 | 34 | Enable the testing lab in the per-player mod settings to teleport to an 35 | isolated testing space when entering the map editor. This testing lab will run 36 | alongside your actual factory, and you can freely design and test within the 37 | lab without cheating in your actual game. 38 | 39 | ### Testing tools 40 | 41 | ![](screenshots/testing-tools.png) 42 | 43 | The mod adds a variety of supercharged entities, items, and equipment for 44 | testing your factories. Spawn or void items with the infinity chest, spawn or 45 | void fluids with the infinity pipe, saturate or void your transport belts with 46 | the infinity loader, and more. 47 | 48 | The tools are only available when inside the map editor or when cheat mode is 49 | enabled. 50 | 51 | ### Cheat mode 52 | 53 | You can use the testing tools outside of the map editor by entering cheat mode 54 | with the `/cheat` command. `/cheat all` will provide you with basic testing 55 | items in your inventory, and give you a power armor kitted out with 56 | supercharged equipment. You are essentially invincible, you run super fast, and 57 | you have a personal roboport that can instantly construct or deconstruct. 58 | 59 | ### Testing scenario and debug world 60 | 61 | ![](scenarios/testing/image.png) 62 | 63 | The mod adds a new scenario specialized for testing. This scenario generates a 64 | blank world filled with lab tiles, researches all technologies, enables cheat 65 | mode, provides you with testing items and equipment, and sets up a super 66 | roboport with super robots that can build or destroy anything you want. The 67 | scenario also massively increases the speed at which construction orders are 68 | dispatched. 69 | 70 | aforementioned improvements, except for a pre-built roboport and radar. 71 | game" buttons on the main menu) is optionally enhanced with all of the 72 | The debug world (accessed by control + clicking the "single player" or "new 73 | -------------------------------------------------------------------------------- /control.lua: -------------------------------------------------------------------------------- 1 | local handler = require("__core__.lualib.event_handler") 2 | 3 | handler.add_libraries({ 4 | require("__flib__.gui"), 5 | 6 | require("scripts.migrations"), 7 | 8 | require("scripts.aggregate-chest"), 9 | require("scripts.cheat-mode"), 10 | require("scripts.debug-world"), 11 | require("scripts.editor"), 12 | require("scripts.infinity-accumulator"), 13 | require("scripts.infinity-loader"), 14 | require("scripts.infinity-pipe"), 15 | require("scripts.infinity-wagon"), 16 | require("scripts.inventory-filters"), 17 | require("scripts.inventory-sync"), 18 | require("scripts.linked-belt"), 19 | require("scripts.super-pump"), 20 | require("scripts.testing-lab"), 21 | }) 22 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | api_token_env: CROWDIN_TOKEN 2 | project_id_env: CROWDIN_FACTORIO_MODS_ID 3 | preserve_hierarchy: true 4 | 5 | files: 6 | - source: /locale/en/EditorExtensions.cfg 7 | dest: EditorExtensions/EditorExtensions.ini 8 | translation: /locale/%two_letters_code%/%original_file_name% 9 | type: ini 10 | update_option: update_as_unapproved 11 | 12 | - source: /scenarios/testing/locale/en/testing.cfg 13 | dest: EditorExtensions/scenarios/testing.ini 14 | translation: /scenarios/testing/locale/%two_letters_code%/%original_file_name% 15 | type: ini 16 | update_option: update_as_unapproved 17 | -------------------------------------------------------------------------------- /data-final-fixes.lua: -------------------------------------------------------------------------------- 1 | -- Start with four extra slots to account for inserter interactions 2 | local slot_count = 4 3 | for category in pairs(defines.prototypes.item) do 4 | slot_count = slot_count + table_size(data.raw[category] or {}) 5 | end 6 | for _, container in pairs(data.raw["infinity-container"]) do 7 | if string.find(container.name, "aggregate") then 8 | container.inventory_size = slot_count 9 | end 10 | end 11 | 12 | -- Allow all science packs to be placed in the super lab 13 | local packs_build = {} 14 | for _, lab in pairs(data.raw["lab"]) do 15 | for _, input in pairs(lab.inputs) do 16 | packs_build[input] = true 17 | end 18 | end 19 | local packs = {} 20 | for pack in pairs(packs_build) do 21 | table.insert(packs, pack) 22 | end 23 | data.raw["lab"]["ee-super-lab"].inputs = packs 24 | 25 | -- Allow equipment to be placed in all existing grid categories 26 | local categories = {} 27 | for _, category in pairs(data.raw["equipment-category"]) do 28 | table.insert(categories, category.name) 29 | end 30 | data.raw["generator-equipment"]["ee-infinity-fission-reactor-equipment"].categories = categories 31 | data.raw["roboport-equipment"]["ee-super-personal-roboport-equipment"].categories = categories 32 | data.raw["movement-bonus-equipment"]["ee-super-exoskeleton-equipment"].categories = categories 33 | data.raw["energy-shield-equipment"]["ee-super-energy-shield-equipment"].categories = categories 34 | data.raw["night-vision-equipment"]["ee-super-night-vision-equipment"].categories = categories 35 | 36 | -- Allow all character prototypes to craft testing tools 37 | for _, character in pairs(data.raw["character"]) do 38 | character.crafting_categories = character.crafting_categories or {} 39 | character.crafting_categories[#character.crafting_categories + 1] = "ee-testing-tool" 40 | end 41 | 42 | -- Set infinity loader and linked belt speed to max 43 | local fastest_speed = 0 44 | for _, prototype in pairs(data.raw["underground-belt"]) do 45 | if prototype.speed > fastest_speed then 46 | fastest_speed = prototype.speed 47 | end 48 | end 49 | data.raw["linked-belt"]["ee-linked-belt"].speed = fastest_speed 50 | data.raw["loader-1x1"]["ee-infinity-loader"].speed = fastest_speed 51 | -------------------------------------------------------------------------------- /data.lua: -------------------------------------------------------------------------------- 1 | require("prototypes.custom-input") 2 | require("prototypes.editor-controller") 3 | require("prototypes.entity") 4 | require("prototypes.equipment") 5 | require("prototypes.fluid") 6 | require("prototypes.item") 7 | require("prototypes.item-group") 8 | require("prototypes.module") 9 | require("prototypes.recipe") 10 | require("prototypes.recipe-category") 11 | require("prototypes.shortcut") 12 | require("prototypes.sprite") 13 | require("prototypes.style") 14 | require("prototypes.tile") 15 | -------------------------------------------------------------------------------- /graphics/entity/aggregate-chest/aggregate-chest-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/aggregate-chest/aggregate-chest-shadow.png -------------------------------------------------------------------------------- /graphics/entity/aggregate-chest/aggregate-chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/aggregate-chest/aggregate-chest.png -------------------------------------------------------------------------------- /graphics/entity/infinity-cargo-wagon-minimap-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/infinity-cargo-wagon-minimap-selected.png -------------------------------------------------------------------------------- /graphics/entity/infinity-cargo-wagon-minimap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/infinity-cargo-wagon-minimap.png -------------------------------------------------------------------------------- /graphics/entity/infinity-chest/infinity-chest-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/infinity-chest/infinity-chest-shadow.png -------------------------------------------------------------------------------- /graphics/entity/infinity-chest/infinity-chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/infinity-chest/infinity-chest.png -------------------------------------------------------------------------------- /graphics/entity/infinity-fluid-wagon-minimap-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/infinity-fluid-wagon-minimap-selected.png -------------------------------------------------------------------------------- /graphics/entity/infinity-fluid-wagon-minimap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/infinity-fluid-wagon-minimap.png -------------------------------------------------------------------------------- /graphics/entity/linked-chest/linked-chest-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/linked-chest/linked-chest-shadow.png -------------------------------------------------------------------------------- /graphics/entity/linked-chest/linked-chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/entity/linked-chest/linked-chest.png -------------------------------------------------------------------------------- /graphics/gui/crafting-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/gui/crafting-group.png -------------------------------------------------------------------------------- /graphics/gui/frame-action-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/gui/frame-action-icons.png -------------------------------------------------------------------------------- /graphics/gui/inventory-filters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/gui/inventory-filters.png -------------------------------------------------------------------------------- /graphics/item/aggregate-chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/item/aggregate-chest.png -------------------------------------------------------------------------------- /graphics/item/infinity-chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/item/infinity-chest.png -------------------------------------------------------------------------------- /graphics/item/linked-chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/item/linked-chest.png -------------------------------------------------------------------------------- /graphics/item/module-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/item/module-1.png -------------------------------------------------------------------------------- /graphics/item/module-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/item/module-3.png -------------------------------------------------------------------------------- /graphics/shortcut-bar/map-editor-x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/shortcut-bar/map-editor-x24.png -------------------------------------------------------------------------------- /graphics/shortcut-bar/map-editor-x56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/graphics/shortcut-bar/map-editor-x56.png -------------------------------------------------------------------------------- /info.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "EditorExtensions", 3 | "version": "2.5.1", 4 | "title": "Editor Extensions", 5 | "description": "Extends the Factorio map editor with new features, testing tools, and quality of life changes. Also adds a separate editor lab that can be used to design blueprints separately from your main factory. Inspired by Creative Mode.", 6 | "author": "raiguard", 7 | "contact": "https://github.com/raiguard/EditorExtensions", 8 | "homepage": "https://github.com/raiguard/EditorExtensions", 9 | "factorio_version": "2.0", 10 | "dependencies": [ 11 | "base >= 2.0.42", 12 | "flib >= 0.16.2", 13 | "? space-age", 14 | "? CursorEnhancements", 15 | "(?) RecipeBook", 16 | "(?) aai-industry", 17 | "(?) Krastorio2", 18 | "(?) omnimatter_compression", 19 | "(?) space-exploration", 20 | "(?) Transport_Drones", 21 | "(?) PickerDollies", 22 | "(?) DeadlockStackingForAngels" 23 | ], 24 | "package": { 25 | "git_publish_branch": "master", 26 | "ignore": [ "imgui.ini", "screenshots", "stylua.toml" ], 27 | "scripts": { 28 | "prepublish": "factorio-crowdin-sync" 29 | }, 30 | "sync_portal_details": true 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /locale/af/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/ar/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | ee-input=ادخال 19 | ee-power=الطاقة 20 | 21 | [item-description] 22 | 23 | [item-group-name] 24 | 25 | [item-name] 26 | 27 | [message] 28 | 29 | [mod-description] 30 | 31 | [mod-name] 32 | 33 | [mod-setting-description] 34 | 35 | [mod-setting-name] 36 | 37 | [shortcut-name] 38 | 39 | [string-mod-setting] 40 | ee-testing-lab-personal=شخصي 41 | ee-lab-tile-graphics-default=الافتراضي 42 | 43 | -------------------------------------------------------------------------------- /locale/ca/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/cs/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/da/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/el/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/en/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | cheat=\n (no parameter) - Researches all technologies, enables cheat mode, and unlocks testing recipes.\n all - All previous, and provides you with testing items and equipment. 3 | 4 | [controls] 5 | ee-toggle-map-editor=Toggle map editor 6 | 7 | [entity-description] 8 | ee-aggregate-chest=Contains every item in the game. 9 | ee-infinity-accumulator=Produces, drains, or stores a configurable amount of electric energy. 10 | ee-infinity-cargo-wagon=Creates or destroys items using customizable item filters (identical to infinity chest). 11 | ee-infinity-chest=Creates or destroys items using customizable item filters. 12 | ee-infinity-combinator=Monitors circuit network signals in a highly customisable display. 13 | ee-infinity-fluid-wagon=Creates or destroys fluids using a customizable fluid filter (identical to infinity pipe). 14 | ee-infinity-heat-pipe=Creates or destroys a configurable amount of heat. 15 | ee-infinity-loader=Creates or destroys items on a belt using customizable filters. 16 | ee-infinity-loader-dummy-combinator=This represents where a legacy infinity loader was located. The signals represent the belt filters that were on that infinity loader. 17 | ee-infinity-pipe=Creates or destroys fluids using a customizable fluid filter. 18 | ee-linked-belt=Instantly transports items to another linked belt.\n__CONTROL__open-gui__: Start a new link / establish link.\n__CONTROL__paste-entity-settings__: Change destination link / force establish link.\n__CONTROL__copy-entity-settings__: Sever link. 19 | ee-linked-chest=Shares its inventory with other linked chests on the same channel. 20 | ee-performance-warning=Will cause performance issues if abused, use sparingly! 21 | ee-super-beacon=Energy-free beacon with a massive effect area. Accepts all modules, including productivity. 22 | ee-super-construction-robot=Insanely fast and energy-free construction robot. 23 | ee-super-electric-pole=Electric pole with massive wire reach. 24 | ee-super-inserter=Energy-free hyperfast stack filter inserter. 25 | ee-super-lab=Insanely fast and energy-free lab. 26 | ee-super-locomotive=Insanely fast locomotive. Does not require fuel to run! 27 | ee-super-logistic-robot=Insanely fast and energy-free logistic robot. 28 | ee-super-pump=Energy-free pump with an adjustable pumping speed. 29 | ee-super-radar=Energy-free radar with a massive reveal area. 30 | ee-super-roboport=Energy-free roboport with instant charging and a very large coverage area. 31 | ee-super-substation=Substation with massive supply area and wire reach. 32 | 33 | [entity-name] 34 | ee-aggregate-chest=Aggregate chest 35 | ee-aggregate-chest-passive-provider=Aggregate passive provider chest 36 | ee-infinity-accumulator=Infinity accumulator 37 | ee-infinity-cargo-wagon=Infinity cargo wagon 38 | ee-infinity-chest-active-provider=Infinity active provider chest 39 | ee-infinity-chest-buffer=Infinity buffer chest 40 | ee-infinity-chest=Infinity chest 41 | ee-infinity-chest-passive-provider=Infinity passive provider chest 42 | ee-infinity-chest-requester=Infinity requester chest 43 | ee-infinity-chest-storage=Infinity storage chest 44 | ee-infinity-combinator=Infinity combinator 45 | ee-infinity-fluid-wagon=Infinity fluid wagon 46 | ee-infinity-heat-pipe=Infinity heat pipe 47 | ee-infinity-loader-chest=Infinity loader 48 | ee-infinity-loader-dummy-combinator=Infinity loader dummy (WILL NOT FUNCTION) 49 | ee-infinity-loader=Infinity loader 50 | ee-infinity-pipe=Infinity pipe 51 | ee-infinity-wagon-chest=Infinity cargo wagon 52 | ee-infinity-wagon-pipe=Infinity fluid wagon 53 | ee-linked-belt=Linked belt 54 | ee-linked-chest=Linked chest 55 | ee-super-beacon=Super beacon 56 | ee-super-construction-robot=Super construction robot 57 | ee-super-electric-pole=Super electric pole 58 | ee-super-inserter=Super inserter 59 | ee-super-lab=Super lab 60 | ee-super-locomotive=Super locomotive 61 | ee-super-logistic-robot=Super logistic robot 62 | ee-super-pump=Super pump 63 | ee-super-radar=Super radar 64 | ee-super-roboport=Super roboport 65 | ee-super-substation=Super substation 66 | 67 | [equipment-name] 68 | ee-infinity-fission-reactor-equipment=Infinity fission reactor 69 | ee-super-battery-equipment=Super personal battery 70 | ee-super-energy-shield-equipment=Super energy shield 71 | ee-super-exoskeleton-equipment=Super exoskeleton 72 | ee-super-night-vision-equipment=Super night vision 73 | ee-super-personal-roboport-equipment=Super personal roboport 74 | 75 | [fluid-description] 76 | ee-super-pump-speed-fluid=If you're seeing this, turn back now! This is used by Editor Extensions to control the speed of the super pump, and has no usefulness elsewhere. 77 | 78 | [fluid-name] 79 | ee-super-pump-speed-fluid=Speedfluid 80 | 81 | [gui-infinity-pipe] 82 | ee-units=u 83 | 84 | [gui] 85 | ee-buffer=Buffer 86 | ee-export-infinity-filters=Export infinity filters 87 | ee-filters=Filters 88 | ee-ia-priority-description=Higher priority means the network will utilize this accumulator sooner. 89 | ee-il-filters-description=Buttons correspond to sides of the belt when the loader is facing north. 90 | ee-import-infinity-filters=Import infinity filters 91 | ee-input=Input 92 | ee-mode=Mode 93 | ee-open-default-gui=Open default GUI 94 | ee-output=Output 95 | ee-per-second=/ s 96 | ee-power=Power 97 | ee-primary=Primary 98 | ee-priority=Priority 99 | ee-secondary=Secondary 100 | ee-speed-tooltip=The pump supports any speed between 0 and 600,000 fluid / second. 101 | ee-speed=Speed [img=info] 102 | ee-state=State 103 | ee-tertiary=Tertiary 104 | 105 | [item-description] 106 | ee-infinity-fission-reactor-equipment=Generates virtually unlimited power for your equipment. 107 | ee-linked-belt=Instantly transports items to another linked belt. 108 | ee-super-battery-equipment=Ridiculously massive battery. 109 | ee-super-clean-module=Massively decreases machine pollution. Minimum pollution is 20%. 110 | ee-super-dirty-module=Massively increases machine pollution. 111 | ee-super-efficiency-module=Massively decreases machine energy consumption. Minimum energy consumption is 20%. 112 | ee-super-energy-shield-equipment=Ridiculously overpowered energy shield, makes you practically immortal. 113 | ee-super-exoskeleton-equipment=Very small and very quick exoskeleton. 114 | ee-super-fuel=Nuclear fuel that lasts pretty much forever. 115 | ee-super-inefficiency-module=Massively increases machine energy consumption. 116 | ee-super-night-vision-equipment=Perfect night vision, you can see as if it's daytime. 117 | ee-super-personal-roboport-equipment=Personal robport with massive construction area and robot capacity. 118 | ee-super-productivity-module=Massively increases machine productivity. 119 | ee-super-slow-module=Massively decreases machine speed. Minimum speed is 20%. 120 | ee-super-speed-module=Massively increases machine speed. 121 | 122 | [item-group-name] 123 | ee-tools=Testing Tools 124 | 125 | [item-name] 126 | ee-infinity-accumulator=Infinity accumulator 127 | ee-super-clean-module=Super clean module 128 | ee-super-dirty-module=Super dirty module 129 | ee-super-efficiency-module=Super efficiency module 130 | ee-super-fuel=Super fuel 131 | ee-super-inefficiency-module=Super inefficiency module 132 | ee-super-productivity-module=Super productivity module 133 | ee-super-slow-module=Super slow module 134 | ee-super-speed-module=Super speed module 135 | 136 | [message] 137 | ee-cannot-use-map-editor=You do not have permission to use the map editor. 138 | ee-cannot-use-testing-lab-spaceship=Cannot enter the testing lab while on a spaceship. 139 | ee-connection-blocked=Connection blocked 140 | ee-imported-infinity-filters=Imported infinity filters. 141 | ee-invalid-infinity-filters-string=Invalid infinity filters string. 142 | ee-testing-tools-enabled=__1__ has enabled the testing tools for this force. 143 | ee-time-passes-in-lab=[color=red]Please keep in mind that time still passes while in the lab. Periodically switch back to your main base to make sure that it still exists.[/color] 144 | ee-welcome=Use the __CONTROL_STYLE_BEGIN__/cheat__CONTROL_STYLE_END__ command or enter the map editor with __CONTROL__ee-toggle-map-editor__ to use Editor Extensions. 145 | 146 | [mod-description] 147 | EditorExtensions=Extends the Factorio map editor with new features, testing tools, and quality of life changes. Also adds a separate editor lab that can be used to design blueprints separately from your main factory. Inspired by Creative Mode. 148 | 149 | [mod-name] 150 | EditorExtensions=Editor Extensions 151 | 152 | [mod-setting-description] 153 | ee-allow-changing-aggregate-chest-filters=By default, aggregate chest filters are unchangeable, because the mod will overwrite any changes whenever mod configuration changes. If you wish to be able to edit the filters despite this, check this option. 154 | ee-controller-inventory_size=This option cannot be changed at runtime.\nAll of the below options are defaults, and can be changed at runtime via the map editor GUI. 155 | ee-default-infinity-filters=Infinity filters that will be applied to your inventory when you enter the editor for the first time.\n[color=255,57,48]Change this from the main menu, otherwise it will not affect new games![/color] 156 | ee-inventory-sync=When in cheat mode, your inventory and cursor stack will be synced between the editor and normal play. 157 | ee-override-debug-world=Treat the debug world like the testing scenario: fill with lab tiles, enable cheat mode, and give testing items. The debug world can be accessed by control + clicking the "single player" or "new game" buttons. 158 | ee-prevent-initial-pause=Prevent the game pausing the simulation when you enter the editor for the first time. The paused state can be changed from the time editor menu. 159 | ee-start-in-editor=Automatically enter the map editor when starting the debug world or testing scenario. 160 | ee-testing-lab=Automatically teleport to a testing lab when entering the map editor, then back out when you leave the editor. This allows you to easily test setups in an isolated space, while keeping your actual factory pristine. Choose between your own personal lab, and a lab shared among all players in a force. 161 | ee-testing-lab-match-research=If enabled, the testing lab will match the research status of the parent force. If unchecked, all technologies will be researched. 162 | 163 | [mod-setting-name] 164 | ee-aggregate-include-hidden=Include hidden items in aggregate chests 165 | ee-allow-changing-aggregate-chest-filters=Allow changing aggregate chest filters 166 | ee-auto-alt-mode=Automatically enable alt-mode 167 | ee-controller-enable_flash_light=Editor cursor light 168 | ee-controller-fill_built_entity_energy_buffers=Editor fill built entity energy buffers 169 | ee-controller-instant_blueprint_building=Editor instant blueprint building 170 | ee-controller-instant_deconstruction=Editor instant deconstruction 171 | ee-controller-instant_rail_planner=Editor instant rail planner 172 | ee-controller-instant_upgrading=Editor instant upgrading 173 | ee-controller-inventory_size=Editor inventory size 174 | ee-controller-render_as_day=Editor render as day 175 | ee-controller-show_additional_entity_info_gui=Editor additional entity info GUI 176 | ee-controller-show_character_tab_in_controller_gui=Show character tab in editor GUI 177 | ee-controller-show_infinity_filters_in_controller_gui=Show infinity filters in editor GUI 178 | ee-default-infinity-filters=Default infinity filters 179 | ee-inventory-sync=Sync inventory and cursor between play modes 180 | ee-lab-tile-graphics=Lab tile graphics 181 | ee-override-debug-world=Override debug world 182 | ee-prevent-initial-pause=Prevent initial pause 183 | ee-start-in-editor=Start in map editor 184 | ee-testing-lab-match-research=Match research in testing lab 185 | ee-testing-lab=Testing lab 186 | 187 | [shortcut-name] 188 | ee-toggle-map-editor=Toggle map editor 189 | 190 | [string-mod-setting] 191 | ee-testing-lab-off=Off 192 | ee-testing-lab-personal=Personal 193 | ee-testing-lab-shared=Force 194 | ee-lab-tile-graphics-default=Default 195 | ee-lab-tile-graphics-all-light=All light 196 | ee-lab-tile-graphics-all-dark=All dark 197 | ee-lab-tile-graphics-tutorial-grid=Tutorial grid 198 | ee-lab-tile-graphics-refined-concrete=Refined concrete 199 | -------------------------------------------------------------------------------- /locale/et/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/fi/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/he/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/hu/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/it/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/ja/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | ee-infinity-accumulator=無限蓄電池 9 | ee-infinity-cargo-wagon=無限貨車 10 | ee-infinity-chest-active-provider=無限アクティブ供給チェスト 11 | ee-infinity-chest-buffer=無限バッファーチェスト 12 | ee-infinity-chest=無限チェスト 13 | ee-infinity-chest-passive-provider=無限パッシブ供給チェスト 14 | ee-infinity-chest-requester=無限要求チェスト 15 | ee-infinity-chest-storage=無限貯蔵チェスト 16 | ee-infinity-combinator=無限回路 17 | ee-infinity-fluid-wagon=無限タンク貨車 18 | ee-infinity-heat-pipe=無限ヒートパイプ 19 | ee-infinity-loader-chest=無限ローダー 20 | ee-infinity-loader=無限ローダー 21 | ee-infinity-pipe=無限パイプ 22 | ee-infinity-wagon-chest=無限貨車 23 | ee-infinity-wagon-pipe=無限タンク貨車 24 | ee-super-beacon=スーパービーコン 25 | ee-super-construction-robot=スーパー建設ロボット 26 | ee-super-electric-pole=スーパー電柱 27 | ee-super-inserter=スーパーインサータ 28 | ee-super-lab=スーパー研究所 29 | ee-super-locomotive=スーパー機関車 30 | ee-super-logistic-robot=スーパー物流ロボット 31 | ee-super-pump=スーパーポンプ 32 | ee-super-radar=スーパーレーダー 33 | ee-super-roboport=スーパーロボットステーション 34 | ee-super-substation=スーパー広域電柱 35 | 36 | [equipment-name] 37 | ee-super-battery-equipment=スーパー個人用バッテリー 38 | 39 | [fluid-description] 40 | 41 | [fluid-name] 42 | 43 | [gui-infinity-pipe] 44 | 45 | [gui] 46 | 47 | [item-description] 48 | 49 | [item-group-name] 50 | 51 | [item-name] 52 | 53 | [message] 54 | ee-cannot-use-testing-lab-spaceship=宇宙船内でテストラボに入ることは出来ません。 55 | 56 | [mod-description] 57 | 58 | [mod-name] 59 | 60 | [mod-setting-description] 61 | 62 | [mod-setting-name] 63 | 64 | [shortcut-name] 65 | 66 | [string-mod-setting] 67 | 68 | -------------------------------------------------------------------------------- /locale/ko/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/nl/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | cheat=\n (geen parameter) - Ontgrendelt alle technologieën, zet valsspeel modus aan en ontgrendelt testrecepten.\n allemaal - Alle voorgaande, en geeft je testitems en uitrusting. 3 | 4 | [controls] 5 | ee-toggle-map-editor=Kaartbewerker in-/uitschakelen 6 | 7 | [entity-description] 8 | ee-aggregate-chest=Bevat alle voorwerpen van het spel. 9 | ee-infinity-accumulator=Produceert, afvoert af of slaat een configureerbare hoeveelheid elektriciteit op. 10 | ee-infinity-cargo-wagon=Maakt of verwijderd items door middel van aanpasbare itemfilters (identiek aan de oneindige kist). 11 | ee-infinity-chest=Maakt of verwijderd items door middel van aanpasbare itemfilters. 12 | ee-infinity-combinator=Monitor schakelnetwerksignalen met een zeer aanpasbaar scherm. 13 | ee-infinity-fluid-wagon=Maakt of verwijderd vloeistoffen door middel van aanpasbare vloeistoffilters (identiek aan de oneindige buis). 14 | ee-infinity-heat-pipe=Maakt of verwijderd een aanpasbare hoeveelheid hitte. 15 | ee-infinity-loader=Maakt of verwijderd items op een transportband door middel van aanpasbare filters. 16 | ee-infinity-loader-dummy-combinator=Dit vertegenwoordigt waar een legacy oneindige lader zich bevond. De signalen vertegenwoordigen de transportbandfilters die op die oneindige lader waren. 17 | ee-infinity-pipe=Maakt of verwijderd vloeistoffen door middel van aanpasbare vloeistoffilters. 18 | 19 | [entity-name] 20 | 21 | [equipment-name] 22 | 23 | [fluid-description] 24 | 25 | [fluid-name] 26 | 27 | [gui-infinity-pipe] 28 | 29 | [gui] 30 | 31 | [item-description] 32 | 33 | [item-group-name] 34 | 35 | [item-name] 36 | 37 | [message] 38 | 39 | [mod-description] 40 | 41 | [mod-name] 42 | 43 | [mod-setting-description] 44 | 45 | [mod-setting-name] 46 | 47 | [shortcut-name] 48 | 49 | [string-mod-setting] 50 | 51 | -------------------------------------------------------------------------------- /locale/no/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/pl/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | cheat=\n (bez parametru) - Bada wszystkie technologie, włącza tryb oszustwa i odblokowuje testowe receptury.\n all - Wszystko wcześniejsze, oraz zapewnia przedmioty i wyposażenie testowe. 3 | 4 | [controls] 5 | ee-toggle-map-editor=Przełącz edytor mapy 6 | 7 | [entity-description] 8 | ee-aggregate-chest=Zawiera każdy przedmiot w grze. 9 | ee-infinity-accumulator=Produkuje, pobiera lub przechowuje konfigurowalną ilość energii elektrycznej. 10 | ee-infinity-cargo-wagon=Tworzy lub niszczy przedmioty za pomocą konfigurowalnych filtrów przedmiotów (identycznie jak niewyczerpywalna skrzynia). 11 | ee-infinity-chest=Tworzy lub niszczy przedmioty za pomocą konfigurowalnych filtrów przedmiotów. 12 | ee-infinity-combinator=Monitoruje sygnały sieci sterowniczej w wysoce konfigurowalnym wyświetlaczu. 13 | ee-infinity-fluid-wagon=Tworzy lub niszczy płyny za pomocą konfigurowalnego filtra płynów (identycznie jak niewyczerpywalna rura). 14 | ee-infinity-heat-pipe=Tworzy lub niszczy konfigurowalną ilość ciepła. 15 | ee-infinity-loader=Tworzy lub niszczy przedmioty na taśmociągu, używając konfigurowalnych filtrów. 16 | ee-infinity-loader-dummy-combinator=Tutaj pokazano miejsce, w którym znajdowała się stara niewyczerpywalna ładowarka. Sygnały reprezentują filtry taśmociągu, które były w tej ładowarce 17 | ee-infinity-pipe=Tworzy lub niszczy płyny za pomocą konfigurowalnego filtra płynów. 18 | ee-linked-belt=Natychmiast przenosi elementy do innego połączonego pasa.\n__CONTROL__open-gui__: Rozpocznij nowe łącze / Utwórz łącze.\n__CONTROL__paste-entity-settings__: Zmień łącze docelowe / Wymuś połączenie.\n__CONTROL__copy-entity-settings__: Zerwij łącze. 19 | ee-linked-chest=Udostępnia swój ekwipunek z innymi powiązanymi skrzyniami na tym samym kanale. 20 | ee-performance-warning=Powoduje problemy z wydajnością w przypadku nadużyć, używaj oszczędnie! 21 | ee-super-beacon=Nadajnik niepobierający energii z ogromnym obszarem działania. Akceptuje wszystkie moduły w tym moduły produktywności 22 | ee-super-construction-robot=Niedorzecznie szybki i bezenergetyczny robot budowlany. 23 | ee-super-electric-pole=Elektryczny słup z dużym zasięgiem drutu. 24 | ee-super-inserter=Bezenergetyczny superszybki filtrujący podajnik masowy 25 | ee-super-lab=Niedorzecznie szybkie i bezenergetyczne laboratorium 26 | ee-super-locomotive=Niedorzecznie szybka lokomotywa. Nie wymaga paliwa! 27 | ee-super-logistic-robot=Niedorzecznie szybki i bezenergetyczny robot logistyczny. 28 | ee-super-pump=Pompa bezenergetyczna z regulowaną prędkością pompowania. 29 | ee-super-radar=Bezenergetyczny radar z ogromnym obszarem odkrycia. 30 | ee-super-roboport=Bezenergetyczny roboport z natychmiastowym ładowaniem i bardzo dużym zasięgiem. 31 | ee-super-substation=Podstacja o ogromnym polu zasilania i zasięgu przewodu elektrycznego. 32 | 33 | [entity-name] 34 | ee-aggregate-chest=Skrzynia kompletna 35 | ee-aggregate-chest-passive-provider=Kompletna pasywna skrzynia zaopatrzeniowa 36 | ee-infinity-accumulator=Niewyczerpywalny akumulator 37 | ee-infinity-cargo-wagon=Niewyczerpywalny wagon towarowy 38 | ee-infinity-chest-active-provider=Niewyczerpywalna aktywna skrzynia zaopatrzeniowa 39 | ee-infinity-chest-buffer=Niewyczerpywalna skrzynia buforowa 40 | ee-infinity-chest=Niewyczerpywalna skrzynia 41 | ee-infinity-chest-passive-provider=Niewyczerpywalna pasywna skrzynia zaopatrzeniowa 42 | ee-infinity-chest-requester=Niewyczerpywalna skrzynia żądająca 43 | ee-infinity-chest-storage=Niewyczerpywalna skrzynia magazynująca 44 | ee-infinity-combinator=Niewyczerpywalny kombinator 45 | ee-infinity-fluid-wagon=Niewyczerpywalna cysterna kolejowa 46 | ee-infinity-heat-pipe=Niewyczerpywalny ciepłowód 47 | ee-infinity-loader-chest=Niewyczerpywalna ładowarka 48 | ee-infinity-loader-dummy-combinator=Atrapa Niewyczerpywalnej ładowarki (NIE DZIAŁA) 49 | ee-infinity-loader=Niewyczerpywalna ładowarka 50 | ee-infinity-pipe=Niewyczerpywalna rura 51 | ee-infinity-wagon-chest=Niewyczerpywalny wagon towarowy 52 | ee-infinity-wagon-pipe=Niewyczerpywalna cysterna kolejowa 53 | ee-linked-belt=Połączony taśmociąg 54 | ee-linked-chest=Połączona skrzynia 55 | ee-super-beacon=Super nadajnik 56 | ee-super-construction-robot=Super robot konstrukcyjny 57 | ee-super-electric-pole=Super słup elektryczny 58 | ee-super-inserter=Super podajnik 59 | ee-super-lab=Super laboratorium 60 | ee-super-locomotive=Super lokomotywa 61 | ee-super-logistic-robot=Super robot logistyczny 62 | ee-super-pump=Super pompa 63 | ee-super-radar=Super radar 64 | ee-super-roboport=Super roboport 65 | ee-super-substation=Super podstacja 66 | 67 | [equipment-name] 68 | ee-super-battery-equipment=Super bateria osobista 69 | ee-super-energy-shield-equipment=Super tarcza energetyczna 70 | ee-super-exoskeleton-equipment=Super egzoszkielet 71 | ee-super-night-vision-equipment=Super noktowizor 72 | ee-super-personal-roboport-equipment=Super podręczny roboport 73 | 74 | [fluid-description] 75 | ee-super-pump-speed-fluid=Jeśli to widzisz, zawróć teraz! To jest używane przez rozszerzenia edytora do kontrolowania prędkości super pompy i nie ma żadnego innego zastosowania. 76 | 77 | [fluid-name] 78 | ee-super-pump-speed-fluid=Prędkość płynu 79 | 80 | [gui-infinity-pipe] 81 | ee-units=u 82 | 83 | [gui] 84 | ee-buffer=Bufor 85 | ee-export-infinity-filters=Eksportuj filtry nieskończoności 86 | ee-filters=Filtry 87 | ee-ia-priority-description=Wyższy priorytet oznacza, że sieć będzie korzystać z tego akumulatora wcześniej. 88 | ee-il-filters-description=Przyciski odpowiadają stronom taśmociągu, gdy ładowarka jest zwrócona na północ 89 | ee-import-infinity-filters=Importuj filtry nieskończoności 90 | ee-input=Wejście 91 | ee-mode=Tryb 92 | ee-open-default-gui=Otwórz domyślne GUI 93 | ee-output=Wyjście 94 | ee-per-second=/s 95 | ee-power=Zasilanie 96 | ee-primary=Główny 97 | ee-priority=Priorytet 98 | ee-secondary=Drugorzędny 99 | ee-speed-tooltip=Pompa obsługuje dowolną prędkość od 0 do 600 000 płynów / sekundę. 100 | ee-speed=Prędkość [img=info] 101 | ee-state=Stan 102 | ee-tertiary=Trzeciorzędny 103 | 104 | [item-description] 105 | ee-linked-belt=Natychmiast przenosi przedmioty do innego połączonego taśmociągu. 106 | ee-super-battery-equipment=Absurdalnie pojemna bateria 107 | ee-super-clean-module=Znacznie redukuje zanieczyszczenie spowodowane przez maszynę. Minimalne zanieczyszczenie wynosi 20% 108 | ee-super-dirty-module=Znacznie zwiększa zanieczyszczenie spowodowane przez maszynę. 109 | ee-super-energy-shield-equipment=Absurdalnie potężna tarcza energetyczna, sprawia, że jesteś praktycznie nieśmiertelny. 110 | ee-super-exoskeleton-equipment=Bardzo mały i bardzo szybki egzoszkielet. 111 | ee-super-fuel=Paliwo jądrowe o niemal wiecznym okresie działania. 112 | ee-super-night-vision-equipment=Idealny noktowizor , możesz widzieć jak za dnia. 113 | ee-super-personal-roboport-equipment=Podręczny roboport o ogromnej powierzchni konstrukcyjnej i pojemności robotów. 114 | ee-super-productivity-module=Znacznie zwiększa produktywność maszyny. Może być użyty na wszystkich przepisach. 115 | ee-super-slow-module=Znacznie zmniejsza prędkość maszyny. Minimalna prędkość wynosi 20%. 116 | ee-super-speed-module=Znacznie zwiększa prędkość maszyny. 117 | 118 | [item-group-name] 119 | ee-tools=Narzędzia do testowania 120 | 121 | [item-name] 122 | ee-infinity-accumulator=Niewyczerpywalny akumulator 123 | ee-super-clean-module=Super moduł czystości 124 | ee-super-dirty-module=Super moduł zanieczyszczeń 125 | ee-super-fuel=Super paliwo 126 | ee-super-productivity-module=Super moduł produktywności 127 | ee-super-slow-module=Super moduł spowalniający 128 | ee-super-speed-module=Super moduł prędkości 129 | 130 | [message] 131 | ee-cannot-use-map-editor=Nie masz uprawnień do używania edytora map. 132 | ee-cannot-use-testing-lab-spaceship=Na statku kosmicznym nie można wejść do laboratorium testowego. 133 | ee-connection-blocked=Połączenie zablokowane 134 | ee-imported-infinity-filters=Zaimportowane nieskończone filtry. 135 | ee-invalid-infinity-filters-string=Nieprawidłowy ciąg filtrów nieskończoności. 136 | ee-testing-tools-enabled=__1__ włączył narzędzia testowe dla tej komendy 137 | ee-time-passes-in-lab=[color=red]Proszę pamiętać, że czas nadal upływa podczas przebywania w laboratorium. Okresowo wracaj do głównej bazy, aby upewnić się, że nadal istnieje.[/color] 138 | ee-welcome=Użyj polecenia __CONTROL_STYLE_BEGIN__/cheat__CONTROL_STYLE_END__ lub wprowadź edytor map za pomocą __CONTROL__ee-toggle-map-editor__ aby używać rozszerzeń edytora. 139 | 140 | [mod-description] 141 | EditorExtensions=Rozszerza edytor mapy w grze Factorio o nowe funkcje, narzędzia do testowania oraz zmiany usprawniające rozgrywkę. Dodatkowo dodaje oddzielne laboratorium edytora, które można używać do projektowania schematów niezależnie od głównej fabryki. Inspirowane "Creative Mode" 142 | 143 | [mod-name] 144 | EditorExtensions=Editor Extensions 145 | 146 | [mod-setting-description] 147 | ee-allow-changing-aggregate-chest-filters=Domyślnie filtry kompletnej skrzyni są niezmienne, ponieważ mod nadpisuje wszelkie zmiany przy każdej zmianie konfiguracji modu. Jeśli chcesz mieć możliwość edycji filtrów pomimo tego, zaznacz tę opcję. 148 | ee-controller-inventory_size=Ta opcja nie może być zmieniana w trakcie działania programu.\nWszystkie poniższe opcje są domyślne i mogą być zmieniane w trakcie działania za pomocą interfejsu edytora mapy. 149 | ee-default-infinity-filters=Nieskończone filtry, które zostaną zastosowane do twojego ekwipunku podczas pierwszego wejścia do edytora 150 | \n[color=55,57,48]Zmień to w głównym menu, w przeciwnym razie nie będzie to miało wpływu na nowe gry![/color] 151 | ee-inventory-sync=W trybie oszustwa, ekwipunek oraz stos przedmiotów na kursorze będą synchronizowane między edytorem a normalną rozgrywką. 152 | ee-override-debug-world=Przerób świat debugowania na scenariusz testowy: wypełnij podłogę laboratoryjnymi płytkami, włącz tryb oszustwa i dostarcz przedmioty do testowania. Do świata debugowania można uzyskać dostęp, naciskając Ctrl + przycisk „jeden gracz” lub „nowa gra” 153 | ee-prevent-initial-pause=Zapobiegnij zatrzymywaniu symulacji gry podczas pierwszego wejścia do edytora. Stan zatrzymania można zmienić z menu edytora czasu. 154 | ee-start-in-editor=Automatycznie wejdź do edytora mapy podczas uruchamiania świata debugowania lub scenariusza testowego. 155 | ee-testing-lab=Automatycznie teleportuj się do laboratorium testowego podczas wchodzenia do edytora mapy, a następnie wróć po opuszczeniu edytora. Pozwala to łatwo testować konfiguracje w izolowanej przestrzeni, zachowując jednocześnie swoją rzeczywistą fabrykę. Wybieraj pomiędzy własną pracownią a pracownią współdzieloną pomiędzy wszystkich graczy. 156 | ee-testing-lab-match-research=Jeśli opcja jest włączona, laboratorium testowe będzie odpowiadać stanowi badań w macierzystym zespole. Jeśli jest odznaczone, wszystkie technologie zostaną zbadane. 157 | 158 | [mod-setting-name] 159 | ee-aggregate-include-hidden=Dołącz ukryte przedmioty w kompletnych skrzyniach 160 | ee-allow-changing-aggregate-chest-filters=Pozwól na zmianę filtrów skrzyni kompletnej 161 | ee-auto-alt-mode=Automatycznie włącz tryb alt 162 | ee-controller-enable_flash_light=Edytor oświetlenia kursora 163 | ee-controller-fill_built_entity_energy_buffers=Edytor wypełnia bufory energetyczne budowanych obiektów 164 | ee-controller-instant_blueprint_building=Natychmiastowe budowanie schematu w edytorze 165 | ee-controller-instant_deconstruction=Natychmiastowy demontaż w edytorze 166 | ee-controller-instant_rail_planner=Natychmiastowe planowanie torów w edytorze 167 | ee-controller-instant_upgrading=Natychmiastowe ulepszenie w edytorze 168 | ee-controller-inventory_size=Edytuj wielkość ekwipunku 169 | ee-controller-render_as_day=Renderuj jako dzień w edytorze 170 | ee-controller-show_additional_entity_info_gui=Dodatkowe GUI z informacjami o jednostkach w edytorze 171 | ee-controller-show_character_tab_in_controller_gui=Pokaż zakładkę postaci w interfejsie edytora 172 | ee-controller-show_infinity_filters_in_controller_gui=Pokaż filtry nieskończoności w interfejsie edytora 173 | ee-default-infinity-filters=Domyślne filtry nieskończoności 174 | ee-inventory-sync=Synchronizuj ekwipunek i kursor pomiędzy trybami gry 175 | ee-lab-tile-graphics=Grafika płytki laboratorium 176 | ee-override-debug-world=Nadpisz świat debugowania 177 | ee-prevent-initial-pause=Zapobiegaj pierwszej pauzie 178 | ee-start-in-editor=Rozpocznij w edytorze map 179 | ee-testing-lab-match-research=Dopasuj badania w laboratorium testowym 180 | ee-testing-lab=Laboratorium testowe 181 | 182 | [shortcut-name] 183 | ee-toggle-map-editor=Przełącz edytor mapy 184 | 185 | [string-mod-setting] 186 | ee-testing-lab-off=Wył. 187 | ee-testing-lab-personal=Osobiste 188 | ee-testing-lab-shared=Wymuś 189 | ee-lab-tile-graphics-default=Domyślne 190 | ee-lab-tile-graphics-all-light=Wszystkie są jasne 191 | ee-lab-tile-graphics-all-dark=Wszystkie są ciemne 192 | ee-lab-tile-graphics-tutorial-grid=Siatka instruktażowa 193 | ee-lab-tile-graphics-refined-concrete=Żelazobeton 194 | 195 | -------------------------------------------------------------------------------- /locale/pt-BZ/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | ee-toggle-map-editor=Ative/Desative o editor de mapa 5 | 6 | [entity-description] 7 | ee-aggregate-chest=Contém cada item do jogo. 8 | ee-infinity-accumulator=Produz, drena ou armazena uma quantidade configurável de energia elétrica. 9 | ee-infinity-cargo-wagon=Cria ou destrói itens usando filtros de itens customizáveis (idêntico ao baú infinito). 10 | ee-infinity-chest=Cria ou destrói itens usando filtros de itens customizáveis. 11 | ee-infinity-combinator=Monitora os sinais da rede de circuitos em uma tela altamente customizável. 12 | ee-infinity-fluid-wagon=Cria ou destrói fluidos usando filtros de fluidos customizáveis (idêntico ao cano infinito). 13 | ee-infinity-heat-pipe=Cria ou destrói uma quantidade configurável de calor. 14 | ee-infinity-loader=Cria ou destrói itens em uma esteira usando filtros customizáveis. 15 | ee-infinity-loader-dummy-combinator=Isso representa onde um carregador infinito de legado foi localizado. Os sinais representam os filtros de esteira que estavam naquele carregador infinito. 16 | ee-infinity-pipe=Cria ou destrói fluidos usando um filtro de fluidos customizável. 17 | ee-linked-belt=Transporte instantaneamente os itens para outra esteira vinculada.\n__CONTROL__open-gui__: Inicie um novo link / estabeleça um link.\n__CONTROL__paste-entity-settings__: Muda o link de destino/força estabelecimento do link.\n__CONTROL__copy-entity-settings__: Quebrar link. 18 | ee-linked-chest=Compartilha seu inventário com outros baús vinculados no mesmo canal. 19 | ee-performance-warning=Causará problemas de desempenho se abusado, use com moderação! 20 | ee-super-beacon=Transmissor sem custo de energia com uma área de efeito massiva. Aceita todos os módulos, incluindo de produtividade. 21 | ee-super-construction-robot=Robô construtor extremamente rápido e sem custo de energia. 22 | ee-super-electric-pole=Poste elétrico com alcance de fio massivo. 23 | ee-super-inserter=Insersor de filtro de pilha hiperveloz sem custo de energia. 24 | ee-super-lab=Laboratório extremamente rápido e sem custo de energia. 25 | ee-super-locomotive=Locomotiva extremamente rápida. Não requer combustível para funcionar! 26 | ee-super-logistic-robot=Robô logístico extremamente rápido e sem custo de energia. 27 | ee-super-pump=Bomba sem custo de energia com uma velocidade de bombeamento ajustável. 28 | ee-super-radar=Radar sem custo de energia com uma enorme área reveladora. 29 | ee-super-roboport=Roboport sem custo de energia com recarga imediata e uma área de cobertura muito grande. 30 | ee-super-substation=Subestação com enorme área de abastecimento e alcance de fio. 31 | 32 | [entity-name] 33 | 34 | [equipment-name] 35 | 36 | [fluid-description] 37 | 38 | [fluid-name] 39 | 40 | [gui-infinity-pipe] 41 | 42 | [gui] 43 | 44 | [item-description] 45 | 46 | [item-group-name] 47 | 48 | [item-name] 49 | 50 | [message] 51 | 52 | [mod-description] 53 | 54 | [mod-name] 55 | 56 | [mod-setting-description] 57 | 58 | [mod-setting-name] 59 | 60 | [shortcut-name] 61 | 62 | [string-mod-setting] 63 | 64 | -------------------------------------------------------------------------------- /locale/pt-PT/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | ee-aggregate-chest=Baú agregado 9 | ee-infinity-chest=Baú Infinito 10 | ee-infinity-combinator=Combinador infinito 11 | ee-infinity-loader-chest=Carregador Infinito 12 | ee-infinity-loader=Carregador Infinito 13 | ee-infinity-pipe=Cano infinito 14 | ee-super-beacon=Super beacon 15 | ee-super-electric-pole=Super poste elétrico 16 | ee-super-inserter=Superinsersor 17 | ee-super-lab=Superlaboratório 18 | ee-super-roboport=Super roboporto 19 | 20 | [equipment-name] 21 | ee-super-energy-shield-equipment=Super escudo de energia 22 | 23 | [fluid-description] 24 | 25 | [fluid-name] 26 | 27 | [gui-infinity-pipe] 28 | 29 | [gui] 30 | ee-buffer=Buffer 31 | ee-filters=Filtros 32 | ee-input=Entrada 33 | ee-mode=Modo 34 | ee-output=Saída 35 | ee-per-second=/ s 36 | ee-power=Potência 37 | ee-primary=Primário 38 | ee-priority=Prioridade 39 | ee-secondary=Secundário 40 | ee-state=Estado 41 | ee-tertiary=Terciário 42 | 43 | [item-description] 44 | 45 | [item-group-name] 46 | ee-tools=Ferramentas de teste 47 | 48 | [item-name] 49 | 50 | [message] 51 | 52 | [mod-description] 53 | 54 | [mod-name] 55 | 56 | [mod-setting-description] 57 | 58 | [mod-setting-name] 59 | ee-controller-enable_flash_light=Editor da luz do cursor 60 | ee-start-in-editor=Iniciar no editor de mapas 61 | 62 | [shortcut-name] 63 | 64 | [string-mod-setting] 65 | ee-testing-lab-off=Off 66 | ee-testing-lab-personal=Pessoal 67 | ee-testing-lab-shared=Força 68 | ee-lab-tile-graphics-default=Padrão 69 | ee-lab-tile-graphics-tutorial-grid=Grade de tutorial 70 | 71 | -------------------------------------------------------------------------------- /locale/ro/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | cheat=\n (fără parametru) - Cercetează toate tehnologiile, activează cheat mode, și deblochează rețetele de testare.\n toate - Toate anterioare, și vă oferă elemente și echipament de testare. 3 | 4 | [controls] 5 | ee-toggle-map-editor=Comută editorul de hartă 6 | 7 | [entity-description] 8 | ee-aggregate-chest=Conține fiecare element din joc. 9 | ee-infinity-heat-pipe=Creează sau distruge o cantitate configurabilă de căldură. 10 | ee-infinity-loader=Creează sau distruge obiecte pe o bandă folosind filtre personalizabile. 11 | 12 | [entity-name] 13 | ee-infinity-chest=Cufăr infinit 14 | ee-infinity-combinator=Combinator infinit 15 | ee-infinity-pipe=Țeavă infinită 16 | ee-linked-belt=Bandă legată 17 | ee-linked-chest=Cufăr legat 18 | ee-super-beacon=Far super 19 | ee-super-construction-robot=Robot de construcție super 20 | ee-super-electric-pole=Stâlp electric super 21 | ee-super-pump=Super pompă 22 | 23 | [equipment-name] 24 | 25 | [fluid-description] 26 | 27 | [fluid-name] 28 | 29 | [gui-infinity-pipe] 30 | ee-units=u 31 | 32 | [gui] 33 | ee-buffer=Tampon 34 | ee-export-infinity-filters=Exportă filtre de infinitate 35 | ee-filters=Filtre 36 | ee-input=Intrare 37 | ee-mode=Mod 38 | ee-open-default-gui=Deschide GUI-ul implicit 39 | ee-output=Ieșire 40 | ee-per-second=/ s 41 | ee-power=Putere 42 | ee-primary=Primar 43 | ee-priority=Prioritar 44 | ee-secondary=Secundar 45 | ee-speed-tooltip=Pompa suportă orice viteză între 0 și 600,000 de lichide / secundă. 46 | ee-speed=Viteză [img=info] 47 | ee-state=Stare 48 | ee-tertiary=Terțiar 49 | 50 | [item-description] 51 | 52 | [item-group-name] 53 | 54 | [item-name] 55 | 56 | [message] 57 | 58 | [mod-description] 59 | 60 | [mod-name] 61 | 62 | [mod-setting-description] 63 | 64 | [mod-setting-name] 65 | 66 | [shortcut-name] 67 | 68 | [string-mod-setting] 69 | 70 | -------------------------------------------------------------------------------- /locale/sr/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/sv-SE/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/tr/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | cheat=\n (parametre yok) - Tüm teknolojileri araştırır, hile modunu etkinleştirir ve test tariflerinin kilidini açar.\n all - Öncekilerin tümü ve size test öğeleri ve ekipmanı sağlar. 3 | 4 | [controls] 5 | ee-toggle-map-editor=Harita editörünü aç/kapat 6 | 7 | [entity-description] 8 | ee-aggregate-chest=Oyundaki her öğeyi içerir. 9 | ee-infinity-accumulator=Yapılandırılabilir miktarda elektrik enerjisi üretir, boşaltır veya depolar. 10 | ee-infinity-cargo-wagon=Özelleştirilebilir öğe filtreleri (sonsuzluk sandığı ile aynı) kullanarak öğeler oluşturur veya yok eder. 11 | ee-infinity-chest=Özelleştirilebilir öğe filtrelerini kullanarak öğeler oluşturur veya yok eder. 12 | ee-infinity-combinator=Devre ağı sinyallerini son derece özelleştirilebilir bir ekranda izler. 13 | ee-infinity-fluid-wagon=Özelleştirilebilir bir sıvı filtresi (sonsuzluk borusuyla aynı) kullanarak sıvıları oluşturur veya yok eder. 14 | ee-infinity-heat-pipe=Yapılandırılabilir miktarda ısı oluşturur veya yok eder. 15 | ee-infinity-loader=Özelleştirilebilir filtreler kullanarak taşıma bandı üzerinde öğeler oluşturur veya yok eder. 16 | ee-infinity-loader-dummy-combinator=Bu, eski bir sonsuz yükleyicinin bulunduğu yeri temsil eder. Sinyaller, o sonsuz yükleyicideki taşıma bandı filtrelerini temsil ediyor. 17 | ee-infinity-pipe=Özelleştirilebilir bir sıvı filtresi kullanarak sıvıları oluşturur veya yok eder. 18 | ee-linked-belt=Öğeleri anında başka bir bağlı taşıma bandına aktarır.\n__CONTROL__open-gui__: Yeni bir bağlantı başlatın / bağlantı kurun.\n__CONTROL__paste-entity-settings__: Hedef bağlantıyı değiştirin / bağlantı kurmaya zorlayın.\n__CONTROL__copy-entity-settings__: Bağlantıyı ayırın. 19 | ee-linked-chest=Envanterini aynı kanaldaki diğer bağlantılı sandıklarla paylaşır. 20 | ee-performance-warning=Kötüye kullanılması durumunda performans sorunlarına neden olur, dikkatli kullanın! 21 | ee-super-beacon=Muazzam bir etki alanına sahip, enerjisiz işaret kulesi. Üretkenlik dahil tüm modülleri kabul eder. 22 | ee-super-construction-robot=İnanılmaz derecede hızlı ve enerji gerektirmeyen inşaat robotu. 23 | ee-super-electric-pole=Çok uzun kablo erişim mesafesine sahip elektrik direği. 24 | ee-super-inserter=Enerji gerektirmeyen, aşırı hızlı yığın filtre yerleştirici. 25 | ee-super-lab=İnanılmaz derecede hızlı ve enerji gerektirmeyen laboratuvar. 26 | ee-super-locomotive=İnanılmaz derecede hızlı bir lokomotif. Çalıştırmak için yakıt gerektirmez! 27 | ee-super-logistic-robot=İnanılmaz derecede hızlı ve enerji gerektirmeyen lojistik robot. 28 | ee-super-pump=Ayarlanabilir pompalama hızına sahip enerjisiz pompa. 29 | ee-super-radar=Devasa bir tespit alanına sahip enerjisiz radar. 30 | ee-super-roboport=Anında şarj ve çok geniş kapsama alanına sahip, enerjisiz roboport. 31 | ee-super-substation=Muazzam besleme alanına ve kablo erişim uzaklığına sahip trafo. 32 | 33 | [entity-name] 34 | ee-aggregate-chest=Birleşik sandık 35 | ee-aggregate-chest-passive-provider=Birleşik pasif sağlayıcı sandık 36 | ee-infinity-accumulator=Sonsuz akümülatör 37 | ee-infinity-cargo-wagon=Sonsuz kargo vagonu 38 | ee-infinity-chest-active-provider=Sonsuz aktif sağlayıcı sandık 39 | ee-infinity-chest-buffer=Sonsuz tampon sandık 40 | ee-infinity-chest=Sonsuz sandık 41 | ee-infinity-chest-passive-provider=Sonsuz pasif sağlayıcı sandık 42 | ee-infinity-chest-requester=Sonsuz isteyici sandık 43 | ee-infinity-chest-storage=Sonsuz depolayıcı sandık 44 | ee-infinity-combinator=Sonsuz birleştirici 45 | ee-infinity-fluid-wagon=Sonsuz sıvı vagonu 46 | ee-infinity-heat-pipe=Sonsuz ısı borusu 47 | ee-infinity-loader-chest=Sonsuz yükleyici 48 | ee-infinity-loader-dummy-combinator=Sonsuz yükleyici kuklası (ÇALIŞMAZ) 49 | ee-infinity-loader=Sonsuz yükleyici 50 | ee-infinity-pipe=Sonsuz boru 51 | ee-infinity-wagon-chest=Sonsuz kargo vagonu 52 | ee-infinity-wagon-pipe=Sonsuz sıvı vagonu 53 | ee-linked-belt=Bağlantılı bant 54 | ee-linked-chest=Bağlantılı sandık 55 | ee-super-beacon=Süper işaret kulesi 56 | ee-super-construction-robot=Süper inşaat robotu 57 | ee-super-electric-pole=Süper elektrik direği 58 | ee-super-inserter=Süper yerleştirici 59 | ee-super-lab=Süper laboratuvar 60 | ee-super-locomotive=Süper lokomotif 61 | ee-super-logistic-robot=Süper lojistik robot 62 | ee-super-pump=Süper pompa 63 | ee-super-radar=Süper radar 64 | ee-super-roboport=Süper robotport 65 | ee-super-substation=Süper trafo 66 | 67 | [equipment-name] 68 | ee-super-battery-equipment=Süper kişisel pil 69 | ee-super-energy-shield-equipment=Süper enerji kalkanı 70 | ee-super-exoskeleton-equipment=Süper dış iskelet 71 | ee-super-night-vision-equipment=Süper gece görüşü 72 | ee-super-personal-roboport-equipment=Süper kişisel roboport 73 | 74 | [fluid-description] 75 | ee-super-pump-speed-fluid=Bunu görüyorsanız hemen geri dönün! Bu, Editor Extensions tarafından süper pompanın hızını kontrol etmek için kullanılır ve başka yerde hiçbir faydası yoktur. 76 | 77 | [fluid-name] 78 | ee-super-pump-speed-fluid=Hız sıvısı 79 | 80 | [gui-infinity-pipe] 81 | ee-units=u 82 | 83 | [gui] 84 | ee-buffer=Tampon 85 | ee-export-infinity-filters=Sonsuzluk filtrelerini dışa aktar 86 | ee-filters=Filtreler 87 | ee-ia-priority-description=Daha yüksek öncelik, ağın öncelikle bu akümülatörü kullanacağı anlamına gelir. 88 | ee-il-filters-description=Yükleyici kuzeye baktığında düğmeler bandın yanlarına karşılık gelir. 89 | ee-import-infinity-filters=Sonsuzluk filtrelerini içe aktar 90 | ee-input=Girdi 91 | ee-mode=Mod 92 | ee-open-default-gui=Varsayılan arayüzü aç 93 | ee-output=Çıktı 94 | ee-per-second=/ s 95 | ee-power=Enerji 96 | ee-primary=Birincil 97 | ee-priority=Öncelik 98 | ee-secondary=İkincil 99 | ee-speed-tooltip=Pompa, 0 ila 600.000 sıvı/saniye arasındaki herhangi bir hızı destekler. 100 | ee-speed=Hız [img=info] 101 | ee-state=Durum 102 | ee-tertiary=Üçüncül 103 | 104 | [item-description] 105 | ee-linked-belt=Öğeleri anında başka bir bağlantılı banda taşır. 106 | ee-super-battery-equipment=Gülünç derecede büyük pil. 107 | ee-super-clean-module=Makine kirliliğini büyük ölçüde azaltır. Minimum kirlilik %20'dir. 108 | ee-super-dirty-module=Makine kirliliğini büyük ölçüde artırır. 109 | ee-super-energy-shield-equipment=Gülünç derecede aşırı güçlü enerji kalkanı sizi neredeyse ölümsüz kılar. 110 | ee-super-exoskeleton-equipment=Çok küçük ve çok hızlı bir dış iskelet. 111 | ee-super-fuel=Neredeyse sonsuza kadar dayanan nükleer yakıt. 112 | ee-super-night-vision-equipment=Mükemmel gece görüşü, sanki gündüzmüş gibi görebilirsiniz. 113 | ee-super-personal-roboport-equipment=Devasa inşaat alanına ve robot kapasitesine sahip kişisel roboport. 114 | ee-super-productivity-module=Makine üretkenliğini büyük ölçüde artırır. Tüm tariflerde kullanılabilir. 115 | ee-super-slow-module=Makine hızını büyük ölçüde azaltır. Minimum hız %20'dir. 116 | ee-super-speed-module=Makine hızını büyük ölçüde artırır. 117 | 118 | [item-group-name] 119 | ee-tools=Test Araçları 120 | 121 | [item-name] 122 | ee-infinity-accumulator=Sonsuz akümülatör 123 | ee-super-clean-module=Süper temiz modül 124 | ee-super-dirty-module=Süper kirli modül 125 | ee-super-fuel=Süper yakıt 126 | ee-super-productivity-module=Süper üretkenlik modülü 127 | ee-super-slow-module=Süper yavaşlık modülü 128 | ee-super-speed-module=Süper hız modülü 129 | 130 | [message] 131 | ee-cannot-use-map-editor=Harita editörünü kullanma izniniz yok. 132 | ee-cannot-use-testing-lab-spaceship=Uzay gemisindeyken test laboratuvarına girilemez. 133 | ee-connection-blocked=Bağlantı engellendi 134 | ee-imported-infinity-filters=Sonsuzluk filtreleri içeri aktarıldı. 135 | ee-invalid-infinity-filters-string=Geçersiz sonsuzluk filtreleri dizesi. 136 | ee-testing-tools-enabled=__1__ bu kuvvet için test araçlarını etkinleştirdi. 137 | ee-time-passes-in-lab=[color=red]Laboratuvarda zamanın hâlâ geçtiğini lütfen unutmayın. Hala sağlam olduğundan emin olmak için periyodik olarak ana üssünüze geri dönün.[/color] 138 | ee-welcome=Editör Uzantılarını kullanmak için __CONTROL_STYLE_BEGIN__/cheat__CONTROL_STYLE_END__ komutunu kullanın veya __CONTROL__ee-toggle-map-editor__ ile harita editörüne girin. 139 | 140 | [mod-description] 141 | EditorExtensions=Factorio harita editörünü yeni özellikler, test araçları ve yaşam kalitesi değişiklikleriyle genişletir. Ayrıca planları ana fabrikanızdan ayrı olarak tasarlamak için kullanılabilecek ayrı bir editör laboratuvarı da ekler. Yaratıcı Mod'dan ilham alındı. 142 | 143 | [mod-name] 144 | EditorExtensions=Editör Uzantıları 145 | 146 | [mod-setting-description] 147 | ee-allow-changing-aggregate-chest-filters=Varsayılan olarak, birleşik sandık filtreleri değiştirilemez, çünkü mod yapılandırması değiştiğinde mod, tüm değişikliklerin üzerine yazacaktır. Buna rağmen filtreleri düzenleyebilmek istiyorsanız bu seçeneği işaretleyin. 148 | ee-controller-inventory_size=Bu seçenek çalışma zamanında değiştirilemez.\nAşağıdaki seçeneklerin tümü varsayılanlardır ve çalışma zamanında harita editör arayüzü aracılığıyla değiştirilebilir. 149 | ee-default-infinity-filters=Editöre ilk kez girdiğinizde envanterinize uygulanacak sonsuzluk filtreleri.\n[color=255,57,48]Bunu ana menüden değiştirin, aksi takdirde yeni oyunları etkilemez![/color] 150 | ee-inventory-sync=Hile modundayken envanteriniz ve imleç yığınınız editör ile normal oyun arasında senkronize edilecektir. 151 | ee-override-debug-world=Hata ayıklama dünyasına test senaryosu gibi davranın: laboratuvar kutucuklarını doldurun, hile modunu etkinleştirin ve test öğelerini verin. Hata ayıklama dünyasına control + "tek oyuncu" veya "yeni oyun" düğmelerine tıklayarak erişilebilir. 152 | ee-prevent-initial-pause=Editöre ilk kez girdiğinizde oyunun simülasyonu duraklatmasını önleyin. Duraklatılmış durum, zaman editör menüsünden değiştirilebilir. 153 | ee-start-in-editor=Hata ayıklama dünyasını veya test senaryosunu başlatırken otomatik olarak harita editörüne girin. 154 | ee-testing-lab=Harita editörüne girerken otomatik olarak bir test laboratuvarına ışınlanın, editörden ayrıldığınızda geri dönün. Bu, gerçek fabrikanızı bozulmamış halde tutarken kurulumları izole bir alanda kolayca test etmenize olanak tanır. Kendi kişisel laboratuvarınız ile bir kuvvetteki tüm oyuncular arasında paylaşılan bir laboratuvar arasında seçim yapın. 155 | ee-testing-lab-match-research=Etkinleştirilirse test laboratuvarı ana gücün araştırma durumuyla eşleşecektir. İşaretlenmezse tüm teknolojiler araştırılmış olacaktır. 156 | 157 | [mod-setting-name] 158 | ee-aggregate-include-hidden=Gizli öğeleri birleşik sandıklara dahil et 159 | ee-allow-changing-aggregate-chest-filters=Birleşik sandık filtrelerinin değiştirilmesine izin ver 160 | ee-auto-alt-mode=Alternatif modu otomatik olarak etkinleştir 161 | ee-controller-enable_flash_light=Editör imleç ışığı 162 | ee-controller-fill_built_entity_energy_buffers=Editör yerleşik öğelerin tampon enerjilerini doldur 163 | ee-controller-instant_blueprint_building=Editör anlık plan inşaatı 164 | ee-controller-instant_deconstruction=Editör anında yıkım 165 | ee-controller-instant_rail_planner=Editör anlık demiryolu planlayıcı 166 | ee-controller-instant_upgrading=Editör anında yükseltme 167 | ee-controller-inventory_size=Editör envanter boyutu 168 | ee-controller-render_as_day=Editör gün zamanı 169 | ee-controller-show_additional_entity_info_gui=Editör ilave öğe bilgi ekranı 170 | ee-controller-show_character_tab_in_controller_gui=Editör ekranında karakter sekmesini göster 171 | ee-controller-show_infinity_filters_in_controller_gui=Editör arayüzünde sonsuzluk filtrelerini göster 172 | ee-default-infinity-filters=Varsayılan sonsuzluk filtreleri 173 | ee-inventory-sync=Envanteri ve imleci oyun modları arasında senkronize et 174 | ee-lab-tile-graphics=Laboratuvar zemini 175 | ee-override-debug-world=Hata ayıklama dünyasını geçersiz kıl 176 | ee-prevent-initial-pause=İlk duraklamayı önle 177 | ee-start-in-editor=Harita editöründe başla 178 | ee-testing-lab-match-research=Test laboratuarında araştırmayı eşleştir 179 | ee-testing-lab=Test laboratuvarı 180 | 181 | [shortcut-name] 182 | ee-toggle-map-editor=Harita editörünü aç/kapat 183 | 184 | [string-mod-setting] 185 | ee-testing-lab-off=Kapalı 186 | ee-testing-lab-personal=Kişisel 187 | ee-testing-lab-shared=Kuvvet 188 | ee-lab-tile-graphics-default=Varsayılan 189 | ee-lab-tile-graphics-all-light=Hep aydınlık 190 | ee-lab-tile-graphics-all-dark=Hep karanlık 191 | ee-lab-tile-graphics-tutorial-grid=Öğretici kılavuz 192 | ee-lab-tile-graphics-refined-concrete=Rafine beton 193 | 194 | -------------------------------------------------------------------------------- /locale/vi/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | 9 | [equipment-name] 10 | 11 | [fluid-description] 12 | 13 | [fluid-name] 14 | 15 | [gui-infinity-pipe] 16 | 17 | [gui] 18 | 19 | [item-description] 20 | 21 | [item-group-name] 22 | 23 | [item-name] 24 | 25 | [message] 26 | 27 | [mod-description] 28 | 29 | [mod-name] 30 | 31 | [mod-setting-description] 32 | 33 | [mod-setting-name] 34 | 35 | [shortcut-name] 36 | 37 | [string-mod-setting] 38 | 39 | -------------------------------------------------------------------------------- /locale/zh-CN/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | cheat=\n (无参数) - 解锁全部科技,启用作弊模式并解锁测试配方。\n all - 包含全部无参数内容,并为您提供测试物品和装备。 3 | 4 | [controls] 5 | ee-toggle-map-editor=打开/关闭地图编辑器 6 | 7 | [entity-description] 8 | ee-aggregate-chest=包含游戏中的所有物品。 9 | ee-infinity-accumulator=自定义生产、消耗或者存储电能。 10 | ee-infinity-cargo-wagon=使用筛选器创建或销毁物品(与永续箱相同)。 11 | ee-infinity-chest=使用筛选器创建或销毁物品。 12 | ee-infinity-combinator=高可定制的信号网络监控器。 13 | ee-infinity-fluid-wagon=使用筛选器创建或销毁液体(与永续管相同)。 14 | ee-infinity-heat-pipe=自定义生产或者消耗热量。 15 | ee-infinity-loader=使用筛选器在传送带上创建或者销毁物品。 16 | ee-infinity-loader-dummy-combinator=这表示旧式永续装卸机的位置。信号表示该永续装卸机上的带式筛选器。 17 | ee-infinity-pipe=使用筛选器创建或销毁液体。 18 | ee-linked-belt=将物品瞬间传送到已关联的传送带上。\n__CONTROL__open-gui__: 开始新链接 / 建立关联。\n__CONTROL__paste-entity-settings__: 修改关联目标 / 强制建立关联。\n__CONTROL__copy-entity-settings__: 断开关联。 19 | ee-linked-chest=在同频道里共享其他关联箱库存。 20 | ee-performance-warning=如果滥用会导致性能问题,请谨慎使用! 21 | ee-super-beacon=不耗能且拥有超大范围的插件效果分享塔。可放置包括产能插件在内的任意插件。 22 | ee-super-construction-robot=超快且不耗能的建设机器人。 23 | ee-super-electric-pole=拥有超远接线半径的电线杆。 24 | ee-super-inserter=无耗能超快集装筛选机械臂。 25 | ee-super-lab=无耗能超高速研究中心。 26 | ee-super-locomotive=超高速内燃机车。不需要燃料也能运行。 27 | ee-super-logistic-robot=超快且不耗能的物流机器人。 28 | ee-super-pump=无耗能可调速管道泵。 29 | ee-super-radar=拥有巨大可探测范围的无耗能雷达。 30 | ee-super-roboport=无耗能、即时充电且覆盖范围非常广的机器人指令平台。 31 | ee-super-substation=拥有超大供电范围和接线半径的广域配电站。 32 | 33 | [entity-name] 34 | ee-aggregate-chest=聚合箱 35 | ee-aggregate-chest-passive-provider=聚合被动供货箱 (红箱) 36 | ee-infinity-accumulator=永续蓄电器 37 | ee-infinity-cargo-wagon=永续货运车厢 38 | ee-infinity-chest-active-provider=永续主动供货箱 (紫箱) 39 | ee-infinity-chest-buffer=永续主动存货箱 (绿箱) 40 | ee-infinity-chest=永续箱 41 | ee-infinity-chest-passive-provider=永续被动供货箱 (红箱) 42 | ee-infinity-chest-requester=永续优先集货箱 (蓝箱) 43 | ee-infinity-chest-storage=永续被动存货箱 (黄箱) 44 | ee-infinity-combinator=无限运算器 45 | ee-infinity-fluid-wagon=永续液罐车厢 46 | ee-infinity-heat-pipe=永续热管 47 | ee-infinity-loader-chest=永续装卸机 48 | ee-infinity-loader-dummy-combinator=永续装卸机假人(无法运行) 49 | ee-infinity-loader=永续装卸机 50 | ee-infinity-pipe=永续管 51 | ee-infinity-wagon-chest=永续货运车厢 52 | ee-infinity-wagon-pipe=永续液罐车厢 53 | ee-linked-belt=关联带 54 | ee-linked-chest=关联箱 55 | ee-super-beacon=超级插件效果分享塔 56 | ee-super-construction-robot=超级建设机器人 57 | ee-super-electric-pole=超级电线杆 58 | ee-super-inserter=超级机械臂 59 | ee-super-lab=超级研究中心 60 | ee-super-locomotive=超级内燃机车 61 | ee-super-logistic-robot=超级物流机器人 62 | ee-super-pump=超级管道泵 63 | ee-super-radar=超级雷达 64 | ee-super-roboport=超级机器人指令平台 65 | ee-super-substation=超级广域配电站 66 | 67 | [equipment-name] 68 | ee-infinity-fission-reactor-equipment=永续裂变堆模块 69 | ee-super-battery-equipment=超级电池组模块 70 | ee-super-energy-shield-equipment=超级能量盾模块 71 | ee-super-exoskeleton-equipment=超级外骨骼模块 72 | ee-super-night-vision-equipment=超级夜视模块 73 | ee-super-personal-roboport-equipment=超级机器人指令模块 74 | 75 | [fluid-description] 76 | ee-super-pump-speed-fluid=如果你看到了这个,马上返回!这是扩展编辑器用来控制超级管道泵速度的,在其他地方没有用处。 77 | 78 | [fluid-name] 79 | ee-super-pump-speed-fluid=速度液 80 | 81 | [gui-infinity-pipe] 82 | ee-units=单位 83 | 84 | [gui] 85 | ee-buffer=缓冲 86 | ee-export-infinity-filters=导出永续筛选器 87 | ee-filters=筛选器 88 | ee-ia-priority-description=优先级越高意味着网络将越快地利用该蓄电器。 89 | ee-il-filters-description=当装卸机面向北时,按钮与传送带的两侧相对应。 90 | ee-import-infinity-filters=导入永续筛选器 91 | ee-input=输入 92 | ee-mode=模式 93 | ee-open-default-gui=打开默认 GUI 94 | ee-output=输出 95 | ee-per-second=/秒 96 | ee-power=功率 97 | ee-primary=主要 98 | ee-priority=优先级 99 | ee-secondary=次要 100 | ee-speed-tooltip=该泵支持 0 至 600,000 流体/秒之间的任意速度。 101 | ee-speed=速度 [img=info] 102 | ee-state=状态 103 | ee-tertiary=第三 104 | 105 | [item-description] 106 | ee-infinity-fission-reactor-equipment=为你的装备模块提供近乎无限的能量。 107 | ee-linked-belt=立即将物品传送至另一条连接的传送带。 108 | ee-super-battery-equipment=容量大到不可思议的电池组。 109 | ee-super-clean-module=大幅减少机器污染。最低污染为 20%。 110 | ee-super-dirty-module=大大增加机器污染。 111 | ee-super-efficiency-module=大幅降低机器能耗。最低能耗为 20%。 112 | ee-super-energy-shield-equipment=极其强大的能量盾,让你几乎永生不朽。 113 | ee-super-exoskeleton-equipment=非常小而且非常快的外骨骼。 114 | ee-super-fuel=可以永久使用的核燃料。 115 | ee-super-inefficiency-module=大幅增加机器能耗。 116 | ee-super-night-vision-equipment=完美的夜视效果,让你仿佛在白天一样看清一切。 117 | ee-super-personal-roboport-equipment=拥有巨大建设面积和机器人容量的机器人指令模块。 118 | ee-super-productivity-module=大幅提高机器产能。可用于所有配方。 119 | ee-super-slow-module=大幅降低机器生产速度。最低速度为 20%。 120 | ee-super-speed-module=大幅提高机器生产速度。 121 | 122 | [item-group-name] 123 | ee-tools=测试工具 124 | 125 | [item-name] 126 | ee-infinity-accumulator=永续蓄电器 127 | ee-super-clean-module=超级清洁插件 128 | ee-super-dirty-module=超级污染插件 129 | ee-super-efficiency-module=超级节能插件 130 | ee-super-fuel=超级燃料 131 | ee-super-inefficiency-module=超级耗能插件 132 | ee-super-productivity-module=超级产能插件 133 | ee-super-slow-module=超级减速插件 134 | ee-super-speed-module=超级速度插件 135 | 136 | [message] 137 | ee-cannot-use-map-editor=您没有权限使用地图编辑器。 138 | ee-cannot-use-testing-lab-spaceship=在飞船上时不能进入测试实验室。 139 | ee-connection-blocked=连接被阻止 140 | ee-imported-infinity-filters=导入的永续筛选器 141 | ee-invalid-infinity-filters-string=无效的永续筛选器。 142 | ee-testing-tools-enabled=__1__ 启用了这支队伍的测试工具。 143 | ee-time-passes-in-lab=[color=red]请注意,在实验室中时间仍在流逝。定期切换回主基地以确保它仍然存在。[/color] 144 | ee-welcome=使用 __CONTROL_STYLE_BEGIN__/cheat__CONTROL_STYLE_END__ 命令或使用 __CONTROL__ee-toggle-map-editor__ 进入地图编辑器以使用编辑器扩展。 145 | 146 | [mod-description] 147 | EditorExtensions=扩展了《异星工厂》地图编辑器,增加了新功能、测试工具和生活质量变化。还添加了一个单独的编辑器实验室,可用于独立于主工厂设计蓝图。灵感来自创意模式。 148 | 149 | [mod-name] 150 | EditorExtensions=编辑器扩展 151 | 152 | [mod-setting-description] 153 | ee-allow-changing-aggregate-chest-filters=默认情况下,聚合箱筛选器不可更改,因为每当模组配置更改时,模组都会覆盖任何更改。如果你希望能够编辑筛选器,请选中此选项。 154 | ee-controller-inventory_size=此选项无法在运行时更改。\n以下所有选项均为默认选项,可在运行时通过地图编辑器 GUI 进行更改。 155 | ee-default-infinity-filters=当你第一次进入编辑器时,永续筛选器将应用于你的库存。\n[color=255,57,48]从主菜单更改此项,否则它不会影响新游戏![/color] 156 | ee-inventory-sync=处于作弊模式时,你的库存和光标堆栈将在编辑器和正常游戏之间同步。 157 | ee-override-debug-world=将调试世界视为测试场景:填充实验室地块、启用作弊模式并提供测试物品。可以通过按住 Ctrl 键 + 单击“单人游戏”或“新游戏”按钮来访问调试世界。 158 | ee-prevent-initial-pause=防止游戏在你第一次进入编辑器时暂停模拟。可以从时间编辑器菜单更改暂停状态。 159 | ee-start-in-editor=启动调试世界或测试场景时自动进入地图编辑器。 160 | ee-testing-lab=进入地图编辑器时自动传送到测试实验室,离开编辑器时返回。这样,你便可以在隔离空间中轻松测试设置,同时保持实际工厂完好无损。你可以选择自己的个人实验室或部队中所有玩家共享的实验室。 161 | ee-testing-lab-match-research=开启后,测试实验室将与母军的研究状态一致。若未勾选,则所有科技都将被研究。 162 | 163 | [mod-setting-name] 164 | ee-aggregate-include-hidden=包括聚合箱中的隐藏物品 165 | ee-allow-changing-aggregate-chest-filters=允许更改聚合箱筛选器 166 | ee-auto-alt-mode=自动启用alt模式 167 | ee-controller-enable_flash_light=编辑器光标灯 168 | ee-controller-fill_built_entity_energy_buffers=编辑器填充内置实体能量缓冲 169 | ee-controller-instant_blueprint_building=编辑器即时蓝图构建 170 | ee-controller-instant_deconstruction=编辑器即时拆除 171 | ee-controller-instant_rail_planner=编辑器即时铁路规划 172 | ee-controller-instant_upgrading=编辑器即时升级 173 | ee-controller-inventory_size=编辑器库存大小 174 | ee-controller-render_as_day=编辑器渲染为白天 175 | ee-controller-show_additional_entity_info_gui=编辑器附加实体信息 GUI 176 | ee-controller-show_character_tab_in_controller_gui=在编辑器 GUI 中显示角色选项卡 177 | ee-controller-show_infinity_filters_in_controller_gui=在编辑器 GUI 中显示永续筛选器 178 | ee-default-infinity-filters=默认永续筛选器 179 | ee-inventory-sync=在游戏模式之间同步库存和光标 180 | ee-lab-tile-graphics=实验室地格图形 181 | ee-override-debug-world=覆盖调试世界 182 | ee-prevent-initial-pause=防止初始暂停 183 | ee-start-in-editor=在地图编辑器中启动 184 | ee-testing-lab-match-research=测试实验室中的匹配研究 185 | ee-testing-lab=测试实验室 186 | 187 | [shortcut-name] 188 | ee-toggle-map-editor=切换地图编辑器 189 | 190 | [string-mod-setting] 191 | ee-testing-lab-off=关 192 | ee-testing-lab-personal=个人 193 | ee-testing-lab-shared=强制 194 | ee-lab-tile-graphics-default=默认 195 | ee-lab-tile-graphics-all-light=全部亮色 196 | ee-lab-tile-graphics-all-dark=全部深色 197 | ee-lab-tile-graphics-tutorial-grid=教程网格 198 | ee-lab-tile-graphics-refined-concrete=精制砼 199 | 200 | -------------------------------------------------------------------------------- /locale/zh-TW/EditorExtensions.cfg: -------------------------------------------------------------------------------- 1 | [command-help] 2 | 3 | [controls] 4 | 5 | [entity-description] 6 | 7 | [entity-name] 8 | ee-infinity-chest=無限物品箱 9 | ee-linked-belt=連結輸送帶 10 | ee-linked-chest=連結箱 11 | 12 | [equipment-name] 13 | 14 | [fluid-description] 15 | 16 | [fluid-name] 17 | 18 | [gui-infinity-pipe] 19 | 20 | [gui] 21 | 22 | [item-description] 23 | 24 | [item-group-name] 25 | 26 | [item-name] 27 | 28 | [message] 29 | 30 | [mod-description] 31 | 32 | [mod-name] 33 | 34 | [mod-setting-description] 35 | 36 | [mod-setting-name] 37 | 38 | [shortcut-name] 39 | 40 | [string-mod-setting] 41 | 42 | -------------------------------------------------------------------------------- /migrations/02.00.00.json: -------------------------------------------------------------------------------- 1 | { 2 | "entity": [ 3 | ["ee-infinity-loader-logic-combinator", "ee-infinity-loader-dummy-combinator"], 4 | ["ee-infinity-pipe-100", "ee-infinity-pipe"] 5 | ], 6 | "mod-setting": [ 7 | ["ee-start-in-editor", "ee-debug-world-start-in-editor"] 8 | ] 9 | } 10 | 11 | -------------------------------------------------------------------------------- /pesticide.json: -------------------------------------------------------------------------------- 1 | { 2 | "adapters": { 3 | "all": { 4 | "cmd": "fmtk debug --workspace /home/rai/dev/factorio-mods/EditorExtensions -- /home/rai/games/factorio/bin/x64/factorio", 5 | "args": { 6 | "hookControl": ["EditorExtensions"], 7 | "hookData": true, 8 | "modsPath": "/home/rai/games/factorio/mods" 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /prototypes/constants.lua: -------------------------------------------------------------------------------- 1 | local constants = {} 2 | 3 | constants.aggregate_chest_data = { 4 | { t = { 255, 255, 225 }, o = "ba" }, 5 | { lm = "passive-provider", t = { 255, 141, 114 }, o = "bb" }, 6 | } 7 | 8 | constants.aggregate_chest_icon = { 9 | icon = "__EditorExtensions__/graphics/item/aggregate-chest.png", 10 | icon_size = 64, 11 | } 12 | 13 | constants.empty_circuit_wire_connection_points = { 14 | { wire = {}, shadow = {} }, 15 | { wire = {}, shadow = {} }, 16 | { wire = {}, shadow = {} }, 17 | { wire = {}, shadow = {} }, 18 | } 19 | 20 | constants.equipment_background_color = { r = 0.5, g = 0.25, b = 0.5, a = 1 } 21 | constants.equipment_background_color_hovered = { r = 0.6, g = 0.35, b = 0.6, a = 1 } 22 | 23 | constants.infinity_accumulator_data = { 24 | { 25 | name = "primary-input", 26 | priority = "primary-input", 27 | render_no_power_icon = false, 28 | }, 29 | { 30 | name = "primary-output", 31 | priority = "primary-output", 32 | render_no_power_icon = false, 33 | }, 34 | { 35 | name = "secondary-input", 36 | priority = "secondary-input", 37 | render_no_power_icon = false, 38 | }, 39 | { 40 | name = "secondary-output", 41 | priority = "secondary-output", 42 | render_no_power_icon = false, 43 | }, 44 | { 45 | name = "tertiary-buffer", 46 | priority = "tertiary", 47 | render_no_power_icon = true, 48 | }, 49 | { 50 | name = "tertiary-input", 51 | priority = "tertiary", 52 | render_no_power_icon = false, 53 | }, 54 | { 55 | name = "tertiary-output", 56 | priority = "tertiary", 57 | render_no_power_icon = false, 58 | }, 59 | } 60 | 61 | constants.infinity_chest_data = { 62 | { t = { 255, 255, 225 }, o = "aa" }, 63 | { lm = "active-provider", t = { 218, 115, 255 }, o = "ab" }, 64 | { lm = "passive-provider", t = { 255, 141, 114 }, o = "ac" }, 65 | { lm = "storage", s = 1, t = { 255, 220, 113 }, o = "ad" }, 66 | { lm = "buffer", t = { 114, 255, 135 }, o = "ae" }, 67 | { lm = "requester", t = { 114, 236, 255 }, o = "af" }, 68 | } 69 | 70 | constants.infinity_chest_icon = { 71 | icon = "__EditorExtensions__/graphics/item/infinity-chest.png", 72 | icon_size = 64, 73 | } 74 | 75 | constants.infinity_tint = { r = 1, g = 0.5, b = 1, a = 1 } 76 | 77 | constants.linked_belt_tint = { r = 0.6, g = 1, b = 1, a = 1 } 78 | 79 | constants.module_data = { 80 | { 81 | name = "ee-super-speed-module", 82 | icon_ref = "module-3", 83 | order = "ba", 84 | category = "speed", 85 | tier = 50, 86 | effect = { speed = 2.5 }, 87 | tint = { r = 0.4, g = 0.6, b = 1 }, 88 | }, 89 | { 90 | name = "ee-super-efficiency-module", 91 | icon_ref = "module-3", 92 | order = "bb", 93 | category = "efficiency", 94 | tier = 50, 95 | effect = { consumption = -2.5 }, 96 | tint = { r = 0.4, g = 1, b = 0.4 }, 97 | }, 98 | { 99 | name = "ee-super-productivity-module", 100 | icon_ref = "module-3", 101 | order = "bc", 102 | category = "productivity", 103 | tier = 50, 104 | effect = { productivity = 2.5 }, 105 | tint = { r = 1, g = 0.4, b = 0.4 }, 106 | }, 107 | { 108 | name = "ee-super-clean-module", 109 | icon_ref = "module-3", 110 | order = "bd", 111 | category = "efficiency", 112 | tier = 50, 113 | effect = { pollution = -2.5 }, 114 | tint = { r = 0.4, g = 1, b = 1 }, 115 | }, 116 | { 117 | name = "ee-super-slow-module", 118 | icon_ref = "module-1", 119 | order = "ca", 120 | category = "speed", 121 | tier = 50, 122 | effect = { speed = -2.5 }, 123 | tint = { r = 0.4, g = 0.6, b = 1 }, 124 | }, 125 | { 126 | name = "ee-super-inefficiency-module", 127 | icon_ref = "module-1", 128 | order = "cb", 129 | category = "efficiency", 130 | tier = 50, 131 | effect = { consumption = 2.5 }, 132 | tint = { r = 0.4, g = 1, b = 0.4 }, 133 | }, 134 | { 135 | name = "ee-super-dirty-module", 136 | icon_ref = "module-1", 137 | order = "cc", 138 | category = "efficiency", 139 | tier = 50, 140 | effect = { pollution = 2.5 }, 141 | tint = { r = 0.4, g = 1, b = 1 }, 142 | }, 143 | } 144 | 145 | return constants 146 | -------------------------------------------------------------------------------- /prototypes/custom-input.lua: -------------------------------------------------------------------------------- 1 | data:extend({ 2 | { 3 | type = "custom-input", 4 | name = "ee-linked-open-gui", 5 | key_sequence = "", 6 | linked_game_control = "open-gui", 7 | }, 8 | { 9 | type = "custom-input", 10 | name = "ee-linked-paste-entity-settings", 11 | key_sequence = "", 12 | linked_game_control = "paste-entity-settings", 13 | }, 14 | { 15 | type = "custom-input", 16 | name = "ee-linked-copy-entity-settings", 17 | key_sequence = "", 18 | linked_game_control = "copy-entity-settings", 19 | }, 20 | { 21 | type = "custom-input", 22 | name = "ee-linked-clear-cursor", 23 | key_sequence = "", 24 | linked_game_control = "clear-cursor", 25 | }, 26 | { 27 | type = "custom-input", 28 | name = "ee-toggle-map-editor", 29 | key_sequence = "CONTROL + ALT + E", 30 | action = "lua", 31 | }, 32 | }) 33 | -------------------------------------------------------------------------------- /prototypes/editor-controller.lua: -------------------------------------------------------------------------------- 1 | local editor_controller = data.raw["editor-controller"].default 2 | for name, setting in pairs(settings.startup) do 3 | if string.match(name, "ee%-controller") then 4 | editor_controller[string.gsub(name, "ee%-controller%-", "")] = setting.value 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /prototypes/equipment.lua: -------------------------------------------------------------------------------- 1 | local constants = require("prototypes.constants") 2 | local util = require("prototypes.util") 3 | 4 | local personal_battery = table.deepcopy(data.raw["battery-equipment"]["battery-equipment"]) 5 | personal_battery.name = "ee-super-battery-equipment" 6 | personal_battery.background_color = constants.equipment_background_color 7 | personal_battery.grabbed_background_color = constants.equipment_background_color_hovered 8 | personal_battery.shape = { width = 1, height = 1, type = "full" } 9 | personal_battery.take_result = "ee-super-battery-equipment" 10 | personal_battery.energy_source.buffer_capacity = "1000YJ" 11 | util.recursive_tint(personal_battery) 12 | data:extend({ personal_battery }) 13 | 14 | data:extend({ 15 | -- super exoskeleton 16 | { 17 | type = "movement-bonus-equipment", 18 | name = "ee-super-exoskeleton-equipment", 19 | sprite = { 20 | filename = "__base__/graphics/equipment/exoskeleton-equipment.png", 21 | width = 64, 22 | height = 128, 23 | priority = "medium", 24 | tint = constants.infinity_tint, 25 | }, 26 | background_color = constants.equipment_background_color, 27 | grabbed_background_color = constants.equipment_background_color_hovered, 28 | shape = { width = 1, height = 1, type = "full" }, 29 | energy_source = { type = "electric", usage_priority = "secondary-input" }, 30 | energy_consumption = "1kW", 31 | movement_bonus = 2, 32 | categories = { "armor" }, 33 | }, 34 | -- infinity personal fusion reactor 35 | { 36 | type = "generator-equipment", 37 | name = "ee-infinity-fission-reactor-equipment", 38 | sprite = { 39 | filename = "__base__/graphics/equipment/fission-reactor-equipment.png", 40 | width = 128, 41 | height = 128, 42 | priority = "medium", 43 | tint = constants.infinity_tint, 44 | }, 45 | background_color = constants.equipment_background_color, 46 | grabbed_background_color = constants.equipment_background_color_hovered, 47 | shape = { width = 1, height = 1, type = "full" }, 48 | energy_source = { type = "electric", usage_priority = "primary-output" }, 49 | power = "1000YW", 50 | categories = { "armor" }, 51 | }, 52 | }) 53 | 54 | local energy_shield = table.deepcopy(data.raw["energy-shield-equipment"]["energy-shield-equipment"]) 55 | energy_shield.name = "ee-super-energy-shield-equipment" 56 | energy_shield.background_color = constants.equipment_background_color 57 | energy_shield.grabbed_background_color = constants.equipment_background_color_hovered 58 | energy_shield.shape = { width = 1, height = 1, type = "full" } 59 | energy_shield.max_shield_value = 1000000 60 | energy_shield.energy_source = { 61 | type = "electric", 62 | usage_priority = "primary-input", 63 | input_flow_limit = "100YW", 64 | buffer_capacity = "100YJ", 65 | } 66 | energy_shield.take_result = "ee-super-energy-shield-equipment" 67 | util.recursive_tint(energy_shield) 68 | data:extend({ energy_shield }) 69 | 70 | local night_vision = table.deepcopy(data.raw["night-vision-equipment"]["night-vision-equipment"]) 71 | night_vision.name = "ee-super-night-vision-equipment" 72 | night_vision.background_color = constants.equipment_background_color 73 | night_vision.grabbed_background_color = constants.equipment_background_color_hovered 74 | night_vision.shape = { width = 1, height = 1, type = "full" } 75 | night_vision.darkness_to_turn_on = 0 76 | night_vision.color_lookup = { { 0.5, "__core__/graphics/color_luts/identity-lut.png" } } 77 | night_vision.take_result = "ee-super-night-vision-equipment" 78 | util.recursive_tint(night_vision) 79 | data:extend({ night_vision }) 80 | 81 | local personal_roboport = table.deepcopy(data.raw["roboport-equipment"]["personal-roboport-mk2-equipment"]) 82 | personal_roboport.name = "ee-super-personal-roboport-equipment" 83 | personal_roboport.background_color = constants.equipment_background_color 84 | personal_roboport.grabbed_background_color = constants.equipment_background_color_hovered 85 | personal_roboport.shape = { width = 1, height = 1, type = "full" } 86 | personal_roboport.charging_energy = "1000GJ" 87 | personal_roboport.charging_station_count = 1000 88 | personal_roboport.robot_limit = 1000 89 | personal_roboport.construction_radius = 100 90 | personal_roboport.energy_source = { 91 | type = "electric", 92 | usage_priority = "secondary-input", 93 | buffer_capacity = "100YJ", 94 | input_flow_limit = "100YW", 95 | } 96 | personal_roboport.take_result = "ee-super-personal-roboport-equipment" 97 | util.recursive_tint(personal_roboport) 98 | data:extend({ personal_roboport }) 99 | -------------------------------------------------------------------------------- /prototypes/fluid.lua: -------------------------------------------------------------------------------- 1 | data:extend({ 2 | { 3 | type = "fluid", 4 | name = "ee-super-pump-speed-fluid", 5 | icons = { 6 | { icon = "__core__/graphics/cancel.png", icon_size = 64 }, 7 | }, 8 | heat_capacity = "1J", 9 | base_color = { 1, 1, 1 }, 10 | flow_color = { 1, 1, 1 }, 11 | hidden = true, 12 | max_temperature = 600001, 13 | default_temperature = 0, -- follow up on default pump speed 14 | auto_barrel = false, 15 | }, 16 | }) 17 | -------------------------------------------------------------------------------- /prototypes/item-group.lua: -------------------------------------------------------------------------------- 1 | local constants = require("prototypes.constants") 2 | 3 | local function add_group(name, order) 4 | data:extend({ 5 | { 6 | type = "item-subgroup", 7 | group = "ee-tools", 8 | name = name, 9 | order = order, 10 | }, 11 | }) 12 | end 13 | 14 | add_group("ee-inventories", "a") 15 | add_group("ee-misc", "b") 16 | add_group("ee-electricity", "c") 17 | add_group("ee-trains", "d") 18 | add_group("ee-robots", "e") 19 | add_group("ee-modules", "f") 20 | add_group("ee-equipment", "g") 21 | 22 | data:extend({ 23 | { 24 | type = "item-group", 25 | name = "ee-tools", 26 | order = "zzzzz", 27 | icons = { 28 | { 29 | icon = "__EditorExtensions__/graphics/gui/crafting-group.png", 30 | icon_size = 128, 31 | tint = constants.infinity_tint, 32 | }, 33 | }, 34 | }, 35 | }) 36 | -------------------------------------------------------------------------------- /prototypes/module.lua: -------------------------------------------------------------------------------- 1 | local table = require("__flib__.table") 2 | 3 | local constants = require("prototypes.constants") 4 | 5 | local module_template = { 6 | type = "module", 7 | subgroup = "ee-modules", 8 | stack_size = 50, 9 | art_style = "vanilla", 10 | } 11 | 12 | for _, module_data in pairs(constants.module_data) do 13 | local module = table.deep_copy(module_template) 14 | module.name = module_data.name 15 | module.hidden_in_factoriopedia = true 16 | module.order = module_data.order 17 | module.category = module_data.category 18 | module.tier = module_data.tier 19 | module.effect = module_data.effect 20 | module.icons = { 21 | { 22 | icon = "__EditorExtensions__/graphics/item/" .. module_data.icon_ref .. ".png", 23 | icon_size = 64, 24 | tint = module_data.tint, 25 | }, 26 | } 27 | module.beacon_tint = { 28 | primary = module_data.tint, 29 | secondary = module_data.tint, 30 | tertiary = module_data.tint, 31 | quaternary = module_data.tint, 32 | } 33 | data:extend({ module }) 34 | end 35 | -------------------------------------------------------------------------------- /prototypes/recipe-category.lua: -------------------------------------------------------------------------------- 1 | data:extend({ 2 | { 3 | type = "recipe-category", 4 | name = "ee-testing-tool", 5 | }, 6 | }) 7 | -------------------------------------------------------------------------------- /prototypes/recipe.lua: -------------------------------------------------------------------------------- 1 | local constants = require("prototypes.constants") 2 | 3 | local recipe_names = { 4 | "ee-infinity-accumulator", 5 | "ee-infinity-cargo-wagon", 6 | "ee-infinity-fluid-wagon", 7 | "ee-infinity-fission-reactor-equipment", 8 | "ee-infinity-heat-pipe", 9 | "ee-infinity-loader", 10 | "ee-infinity-pipe", 11 | "ee-linked-belt", 12 | "ee-linked-chest", 13 | "ee-super-battery-equipment", 14 | "ee-super-beacon", 15 | "ee-super-construction-robot", 16 | "ee-super-electric-pole", 17 | "ee-super-energy-shield-equipment", 18 | "ee-super-exoskeleton-equipment", 19 | "ee-super-fuel", 20 | "ee-super-inserter", 21 | "ee-super-lab", 22 | "ee-super-locomotive", 23 | "ee-super-logistic-robot", 24 | "ee-super-night-vision-equipment", 25 | "ee-super-personal-roboport-equipment", 26 | "ee-super-pump", 27 | "ee-super-radar", 28 | "ee-super-roboport", 29 | "ee-super-substation", 30 | } 31 | local function register_recipes(t) 32 | for _, k in ipairs(t) do 33 | data:extend({ 34 | { 35 | type = "recipe", 36 | name = k, 37 | hidden_in_factoriopedia = true, 38 | ingredients = {}, 39 | category = "ee-testing-tool", 40 | results = { { type = "item", name = k, amount = 1 } }, 41 | enabled = false, 42 | }, 43 | }) 44 | end 45 | end 46 | 47 | register_recipes(recipe_names) 48 | for _, t in pairs(constants.infinity_chest_data) do 49 | register_recipes({ "ee-infinity-chest" .. (t.lm and "-" .. t.lm or "") }) 50 | end 51 | for _, t in pairs(constants.aggregate_chest_data) do 52 | register_recipes({ "ee-aggregate-chest" .. (t.lm and "-" .. t.lm or "") }) 53 | end 54 | for _, t in ipairs(constants.module_data) do 55 | register_recipes({ t.name }) 56 | end 57 | -------------------------------------------------------------------------------- /prototypes/shortcut.lua: -------------------------------------------------------------------------------- 1 | data:extend({ 2 | { 3 | type = "shortcut", 4 | name = "ee-toggle-map-editor", 5 | order = "c[toggles]-m[map-editor]", 6 | icon = "__EditorExtensions__/graphics/shortcut-bar/map-editor-x56.png", 7 | icon_size = 56, 8 | small_icon = "__EditorExtensions__/graphics/shortcut-bar/map-editor-x24.png", 9 | small_icon_size = 24, 10 | action = "lua", 11 | associated_control_input = "ee-toggle-map-editor", 12 | toggleable = true, 13 | }, 14 | }) 15 | -------------------------------------------------------------------------------- /prototypes/sprite.lua: -------------------------------------------------------------------------------- 1 | data:extend({ 2 | { 3 | type = "sprite", 4 | name = "ee_logo", 5 | filename = "__EditorExtensions__/graphics/gui/crafting-group.png", 6 | size = 128, 7 | mipmap_count = 2, 8 | flags = { "gui-icon" }, 9 | }, 10 | { 11 | type = "sprite", 12 | name = "ee_import_inventory_filters", 13 | filename = "__EditorExtensions__/graphics/gui/inventory-filters.png", 14 | y = 0, 15 | size = 32, 16 | mipmap_count = 2, 17 | flags = { "gui-icon" }, 18 | }, 19 | { 20 | type = "sprite", 21 | name = "ee_export_inventory_filters", 22 | filename = "__EditorExtensions__/graphics/gui/inventory-filters.png", 23 | y = 32, 24 | size = 32, 25 | mipmap_count = 2, 26 | flags = { "gui-icon" }, 27 | }, 28 | { 29 | type = "sprite", 30 | name = "ee_open_default_gui_black", 31 | filename = "__EditorExtensions__/graphics/gui/frame-action-icons.png", 32 | size = 32, 33 | flags = { "gui-icon" }, 34 | }, 35 | { 36 | type = "sprite", 37 | name = "ee_open_default_gui_white", 38 | filename = "__EditorExtensions__/graphics/gui/frame-action-icons.png", 39 | x = 32, 40 | size = 32, 41 | flags = { "gui-icon" }, 42 | }, 43 | }) 44 | -------------------------------------------------------------------------------- /prototypes/style.lua: -------------------------------------------------------------------------------- 1 | local styles = data.raw["gui-style"].default 2 | 3 | -- BUTTON STYLES 4 | 5 | styles.ee_disabled_dropdown_button = { 6 | type = "button_style", 7 | parent = "dropdown_button", 8 | disabled_font_color = styles.button.disabled_font_color, 9 | disabled_graphical_set = styles.button.disabled_graphical_set, 10 | left_padding = 8, 11 | width = 122, 12 | } 13 | 14 | styles.ee_il_filter_button = { 15 | type = "button_style", 16 | parent = "slot_button", 17 | size = 38, 18 | } 19 | 20 | -- DROPDOWN STYLES 21 | 22 | styles.ee_ia_dropdown = { 23 | type = "dropdown_style", 24 | width = 122, 25 | } 26 | 27 | -- FRAME STYLES 28 | 29 | styles.ee_inside_shallow_frame_for_entity = { 30 | type = "frame_style", 31 | parent = "inside_shallow_frame_with_padding", 32 | horizontal_flow_style = { 33 | type = "horizontal_flow_style", 34 | horizontal_spacing = 8, 35 | }, 36 | } 37 | 38 | -- LABEL STYLES 39 | 40 | styles.ee_super_pump_per_second_label = { 41 | type = "label_style", 42 | parent = "bold_label", 43 | font = "default-semibold", 44 | left_margin = 4, 45 | } 46 | 47 | -- PROGRESSBAR STYLES 48 | 49 | styles.ee_infinity_pipe_progressbar = { 50 | type = "progressbar_style", 51 | parent = "production_progressbar", 52 | bottom_margin = 2, 53 | horizontally_stretchable = "on", 54 | } 55 | 56 | styles.ee_infinity_pipe_progressbar_light_text = { 57 | type = "progressbar_style", 58 | parent = "ee_infinity_pipe_progressbar", 59 | filled_font_color = default_font_color, --- @diagnostic disable-line: undefined-global 60 | } 61 | 62 | -- TEXTFIELD STYLES 63 | 64 | styles.ee_slider_textfield = { 65 | type = "textbox_style", 66 | width = 75, 67 | horizontal_align = "center", 68 | left_margin = 8, 69 | } 70 | 71 | styles.ee_invalid_slider_textfield = { 72 | type = "textbox_style", 73 | parent = "invalid_value_textfield", 74 | width = 75, 75 | horizontal_align = "center", 76 | left_margin = 8, 77 | } 78 | 79 | styles.ee_invalid_slider_value_textfield = { 80 | type = "textbox_style", 81 | parent = "slider_value_textfield", 82 | default_background = styles.invalid_value_textfield.default_background, 83 | active_background = styles.invalid_value_textfield.active_background, 84 | } 85 | -------------------------------------------------------------------------------- /prototypes/tile.lua: -------------------------------------------------------------------------------- 1 | --- @param source_name string 2 | --- @param destination_name string 3 | local function disguise_tile(source_name, destination_name) 4 | local tile = table.deepcopy(data.raw["tile"][source_name]) 5 | tile.name = destination_name 6 | tile.variants = { 7 | main = tile.variants.main, 8 | material_background = tile.variants.material_background, 9 | empty_transitions = true, 10 | } 11 | tile.transitions = nil 12 | -- Don't use lab dark 2 map color because it's almost pure black 13 | if destination_name == "lab-dark-1" then 14 | tile.map_color = data.raw["tile"]["lab-dark-1"].map_color 15 | data.raw["tile"]["lab-dark-2"].map_color = tile.map_color 16 | end 17 | return tile 18 | end 19 | 20 | local graphics_setting = settings.startup["ee-lab-tile-graphics"].value 21 | 22 | if graphics_setting == "all-light" then 23 | data:extend({ disguise_tile("lab-dark-2", "lab-dark-1") }) 24 | elseif graphics_setting == "all-dark" then 25 | data:extend({ disguise_tile("lab-dark-1", "lab-dark-2") }) 26 | elseif graphics_setting == "tutorial-grid" then 27 | data:extend({ disguise_tile("tutorial-grid", "lab-dark-1"), disguise_tile("tutorial-grid", "lab-dark-2") }) 28 | elseif graphics_setting == "refined-concrete" then 29 | data:extend({ disguise_tile("refined-concrete", "lab-dark-1"), disguise_tile("refined-concrete", "lab-dark-2") }) 30 | end 31 | -------------------------------------------------------------------------------- /prototypes/util.lua: -------------------------------------------------------------------------------- 1 | local constants = require("prototypes.constants") 2 | local util = {} 3 | 4 | local core_util = require("__core__.lualib.util") 5 | 6 | util.by_pixel = core_util.by_pixel 7 | util.empty_sprite = core_util.empty_sprite 8 | 9 | local function is_sprite_def(array) 10 | return array.icon or array.width and array.height and (array.filename or array.stripes or array.filenames) 11 | end 12 | --- Recursively tint all sprite definitions in the given table. 13 | --- @generic T 14 | --- @param array T 15 | --- @param tint Color|boolean? Set to `false` to remove tints. 16 | --- @return T 17 | function util.recursive_tint(array, tint) 18 | if tint ~= false then 19 | tint = tint or constants.infinity_tint 20 | end 21 | for _, v in pairs(array) do 22 | if type(v) == "table" then 23 | if is_sprite_def(v) then 24 | if tint == false then 25 | v.tint = nil 26 | else 27 | v.tint = tint 28 | end 29 | end 30 | v = util.recursive_tint(v, tint) 31 | end 32 | end 33 | return array 34 | end 35 | 36 | -- consolidate icon information into a table to use in "icons" 37 | function util.extract_icon_info(obj, skip_cleanup) 38 | local icons = obj.icons or { { icon = obj.icon, icon_size = obj.icon_size } } 39 | icons[1].icon_size = icons[1].icon_size or obj.icon_size 40 | if not skip_cleanup then 41 | obj.icon = nil 42 | obj.icon_size = nil 43 | end 44 | return icons 45 | end 46 | 47 | -- generate the localised description of a chest 48 | function util.chest_description(suffix, is_aggregate) 49 | if is_aggregate then 50 | return { 51 | "", 52 | { "entity-description.ee-aggregate-chest" }, 53 | suffix ~= "" and { "", "\n", { "entity-description." .. suffix .. "-chest" } } or "", 54 | "\n[color=255,57,48]", 55 | { "entity-description.ee-performance-warning" }, 56 | "[/color]", 57 | } 58 | else 59 | return { 60 | "", 61 | { "entity-description.ee-infinity-chest" }, 62 | suffix ~= "" and { "", "\n", { "entity-description." .. suffix .. "-chest" } } or "", 63 | } 64 | end 65 | end 66 | 67 | --- Copy and optionally tint a prototype. 68 | --- @generic T 69 | --- @param base T 70 | --- @param mods table 71 | --- @param tint Color|boolean? Infinity tint by default, set to `false` to perform no tinting. 72 | --- @return T 73 | function util.copy_prototype(base, mods, tint) 74 | local base = table.deepcopy(base) 75 | for key, value in pairs(mods) do 76 | if key == "icons" and value == "CONVERT" then 77 | base.icons = { { icon = base.icon, icon_size = base.icon_size, icon_mipmaps = base.icon_mipmaps } } 78 | base.icon = nil 79 | base.icon_size = nil 80 | elseif value == "NIL" then 81 | base[key] = nil 82 | else 83 | base[key] = value 84 | end 85 | end 86 | if tint ~= false then 87 | util.recursive_tint(base, tint) 88 | end 89 | return base 90 | end 91 | 92 | return util 93 | -------------------------------------------------------------------------------- /scenarios/testing/blueprint.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/scenarios/testing/blueprint.zip -------------------------------------------------------------------------------- /scenarios/testing/description.json: -------------------------------------------------------------------------------- 1 | { 2 | "multiplayer-compatible": true 3 | } -------------------------------------------------------------------------------- /scenarios/testing/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/scenarios/testing/image.png -------------------------------------------------------------------------------- /scenarios/testing/locale/af/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/ar/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/ca/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/cs/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/da/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/de/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Testen 2 | description=Dies ist ein Testszenario. Die Welt ist mit Laborfliesen gefüllt, um einen sauberen Arbeitsbereich zu schaffen. Die Zeit wurde bei der Mittagszeit eingefroren. Alle Technologien werden von Anfang an erforscht. Bei allen Spielern ist der Cheat-Modus aktiviert, wenn sie das Spiel betreten. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/el/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/en/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Testing 2 | description=This is a testing scenario. The world is filled with lab tiles to provide a clean workspace. Time is frozen at noonday. All technologies are researched from the beginning. All players will have cheat mode enabled upon joining the game. 3 | -------------------------------------------------------------------------------- /scenarios/testing/locale/es-ES/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Testeo 2 | description=Este es un escenario de pruebas. El mundo está lleno de baldosas de laboratorio para proveer un entorno de trabajo limpio. El tiempo está fijado en mediodía. Todas las tecnologías están investigadas desde el principio. Todos los jugadores tendrán el modo de trucos habilitado al unirse al juego. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/et/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/fi/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/fr/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Scénario d'essai 2 | description=Il s'agit d'un scénario d'essai. Le monde est rempli de tuiles de laboratoire pour fournir un espace de travail propre. Le temps est gelé à midi. Toutes les technologies sont recherchées. Tous les joueurs auront le mode de triche activé après avoir rejoint le jeu. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/he/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/hu/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/it/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Test 2 | description=Questo è uno scenario di prova. Il mondo è pieno di mattonelle di laboratorio per fornire uno spazio di lavoro pulito. Il tempo viene congelato a mezzogiorno. Tutte le tecnologie sono ricercate fin dall'inizio. Tutti i giocatori avranno i trucchi abilitati quando entreranno in gioco. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/ja/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=テスト用シナリオ 2 | description=これはテスト用シナリオです。ワールドはクリーンな作業スペースを提供するためにラボのタイルで敷き詰められています。時間は正午に固定されています。全てのテクノロジーは最初から研究済みです。全てのプレイヤーはゲームに参加するとチートモードが有効になります。 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/ko/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=테스트 중 2 | description=이건 테스트 시나리오입니다. 세상은 깨끗한 작업 공간을 제공하기 위해 실험실 타일로 가득 차 있습니다. 시간은 정오로 고정되어 있습니다. 모든 기술은 처음부터 연구됩니다. 모든 플레이어는 게임에 참여하면 치트 모드가 활성화됩니다. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/nl/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Testen 2 | description=Dit is een testscenario. De wereld is gevuld met laboratorium tegels om een schone werkruimte te bieden. Tijd is stilgezet op 's middags. Alle technologieën zijn vanaf het begin onderzocht. Alle spelers hebben valsspeelmodus ingeschakeld wanneer ze deelnemen aan het spel. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/no/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/pl/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Testowanie 2 | description=To jest scenariusz testowy. Świat jest wypełniony kafelkami laboratoryjnymi, aby zapewnić czyste miejsce do pracy. Czas zatrzymany jest w południe. Wszystkie technologie są ukończone od razu. Wszyscy gracze będą mieli włączony tryb "cheat mode" po dołączeniu do gry. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/pt-BZ/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Testando 2 | description=Este é um cenário de teste. O mundo está cheio de blocos de laboratório para fornecer um espaço de trabalho limpo. O tempo é congelado ao meio-dia. Todas as tecnologias estão pesquisadas desde o início. Todos os jogadores terão o modo trapaça ativado ao entrar no jogo. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/pt-PT/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Testando 2 | 3 | -------------------------------------------------------------------------------- /scenarios/testing/locale/ro/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Testare 2 | description=Acesta este un scenariu de testare. Lumea este plină de plăci de laborator pentru a oferi un spațiu de lucru curat. Timpul este înghețat la amiază. Toate tehnologiile au fost cercetate de la început. Toți jucătorii vor avea cheat mode-ul activat când intră în joc. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/ru/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Тестирование 2 | description=Это сценарий тестирования. Мир заполнен лабораторной плиткой, чтобы обеспечить чистую рабочую область. Время заморожено в полдень. Все технологии исследованы с самого начала. При вступлении в игру будет включён чит-режим. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/sr/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/sv-SE/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/tr/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Test 2 | description=Bu bir test Senaryosudur. Tüm dünya temiz bir çalışma alanı sağlamak için Lab karoları ile kaplanmıştır. Zaman öğle olacak şekilde dondurulmuştur. Tüm teknolojiler baştan araştırılmıştır. Tüm oyuncular oyuna hile modu etkin bir şekilde katılacaktır. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/uk/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=Тестування 2 | description=Це тестовий сценарій. Світ заповнений лабораторною плиткою, щоб забезпечити чистий робочий простір. Час зупинився опівдні. Всі технології досліджуються з самого початку. Усі гравці матимуть увімкнений режим читів після приєднання до гри. 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/vi/testing.cfg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /scenarios/testing/locale/zh-CN/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=测试模式 2 | description=这是一个测试场景。该场景铺满实验室地格,以确保提供一个干净的工作区。时间被冻结在白天。所有科技在初始化阶段解锁。所有玩家在加入游戏时都将开启作弊模式。 3 | 4 | -------------------------------------------------------------------------------- /scenarios/testing/locale/zh-TW/testing.cfg: -------------------------------------------------------------------------------- 1 | scenario-name=測試 2 | description=這是測試的場景。 為了提供一個乾淨的工作區,世界充滿實驗室陶磚。時間停止在中午。所有科技從頭開始研發。所有玩家上線時會開啓作弊模式。 3 | 4 | -------------------------------------------------------------------------------- /screenshots/editor-shortcut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/screenshots/editor-shortcut.png -------------------------------------------------------------------------------- /screenshots/testing-lab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/screenshots/testing-lab.png -------------------------------------------------------------------------------- /screenshots/testing-tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/screenshots/testing-tools.png -------------------------------------------------------------------------------- /scripts/aggregate-chest.lua: -------------------------------------------------------------------------------- 1 | local aggregate_chest_names = { 2 | ["ee-aggregate-chest"] = "ee-aggregate-chest", 3 | ["ee-aggregate-chest-passive-provider"] = "ee-aggregate-chest-passive-provider", 4 | } 5 | 6 | --- @type table 7 | local filters = {} 8 | do 9 | local include_hidden = settings.global["ee-aggregate-include-hidden"].value --[[@as boolean]] 10 | local i = 0 11 | for quality_name in pairs(prototypes.quality) do 12 | local this_filters = {} 13 | for item_name, prototype in pairs(prototypes.item) do 14 | if string.find(item_name, "^parameter%-") then 15 | goto continue 16 | end 17 | if prototype.hidden and not include_hidden then 18 | goto continue 19 | end 20 | i = i + 1 21 | this_filters[i] = { 22 | name = item_name, 23 | quality = quality_name, 24 | count = prototype.stack_size, 25 | mode = "exactly", 26 | index = i, 27 | } 28 | ::continue:: 29 | end 30 | filters[quality_name] = this_filters 31 | end 32 | end 33 | --- Set the filters for the given aggregate chest and removes the bar if there is one 34 | --- @param entity LuaEntity 35 | local function set_filters(entity) 36 | entity.remove_unfiltered_items = true 37 | entity.infinity_container_filters = filters[entity.quality.name] 38 | entity.get_inventory(defines.inventory.chest).set_bar() 39 | end 40 | 41 | -- Update the filters of all existing aggregate chests 42 | local function update_all_filters() 43 | for _, surface in pairs(game.surfaces) do 44 | for _, entity in pairs(surface.find_entities_filtered({ name = aggregate_chest_names })) do 45 | set_filters(entity) 46 | end 47 | end 48 | end 49 | 50 | --- @param e BuiltEvent 51 | local function on_entity_built(e) 52 | local entity = e.entity or e.destination 53 | if not entity or not entity.valid or not aggregate_chest_names[entity.name] then 54 | return 55 | end 56 | set_filters(entity) 57 | end 58 | 59 | --- @param e EventData.on_player_setup_blueprint 60 | local function on_player_setup_blueprint(e) 61 | local blueprint = e.stack or e.record 62 | if not blueprint then 63 | return 64 | end 65 | 66 | local entities = blueprint.get_blueprint_entities() 67 | if not entities then 68 | return 69 | end 70 | local set = false 71 | for _, entity in pairs(entities) do 72 | if aggregate_chest_names[entity.name] then 73 | set = true 74 | entity.infinity_settings.filters = nil --- @diagnostic disable-line 75 | end 76 | end 77 | if set then 78 | blueprint.set_blueprint_entities(entities) 79 | end 80 | end 81 | 82 | local aggregate_chest = {} 83 | 84 | aggregate_chest.on_configuration_changed = function(_) 85 | update_all_filters() 86 | end 87 | 88 | aggregate_chest.events = { 89 | [defines.events.on_built_entity] = on_entity_built, 90 | [defines.events.on_entity_cloned] = on_entity_built, 91 | [defines.events.on_player_setup_blueprint] = on_player_setup_blueprint, 92 | [defines.events.on_robot_built_entity] = on_entity_built, 93 | [defines.events.on_space_platform_built_entity] = on_entity_built, 94 | [defines.events.script_raised_built] = on_entity_built, 95 | [defines.events.script_raised_revive] = on_entity_built, 96 | } 97 | 98 | return aggregate_chest 99 | -------------------------------------------------------------------------------- /scripts/cheat-mode.lua: -------------------------------------------------------------------------------- 1 | local util = require("scripts.util") 2 | 3 | local character_modifiers = { 4 | character_build_distance_bonus = 1000000, 5 | character_mining_speed_modifier = 2, 6 | character_reach_distance_bonus = 1000000, 7 | character_resource_reach_distance_bonus = 1000000, 8 | } 9 | 10 | local equipment_to_add = { 11 | { name = "ee-infinity-fission-reactor-equipment", position = { 0, 0 } }, 12 | { name = "ee-super-personal-roboport-equipment", position = { 1, 0 } }, 13 | { name = "ee-super-exoskeleton-equipment", position = { 2, 0 } }, 14 | { name = "ee-super-exoskeleton-equipment", position = { 3, 0 } }, 15 | { name = "ee-super-energy-shield-equipment", position = { 4, 0 } }, 16 | { name = "ee-super-night-vision-equipment", position = { 5, 0 } }, 17 | { name = "ee-super-battery-equipment", position = { 6, 0 } }, 18 | { name = "belt-immunity-equipment", position = { 7, 0 } }, 19 | } 20 | 21 | local items_to_add = { 22 | { name = "ee-infinity-accumulator", count = 50 }, 23 | { name = "ee-infinity-chest", count = 50 }, 24 | { name = "ee-super-construction-robot", count = 100 }, 25 | { name = "ee-super-inserter", count = 50 }, 26 | { name = "ee-infinity-loader", count = 50 }, 27 | { name = "ee-infinity-pipe", count = 50 }, 28 | { name = "ee-super-substation", count = 50 }, 29 | } 30 | 31 | local items_to_remove = { 32 | { name = "express-loader", count = 50 }, 33 | { name = "bulk-inserter", count = 50 }, 34 | { name = "substation", count = 50 }, 35 | { name = "construction-robot", count = 100 }, 36 | { name = "electric-energy-interface", count = 1 }, 37 | { name = "infinity-chest", count = 20 }, 38 | { name = "infinity-pipe", count = 10 }, 39 | { name = "linked-chest", count = 10 }, 40 | } 41 | 42 | --- @param inventory LuaInventory? 43 | local function set_armor(inventory) 44 | if not inventory or not inventory.valid then 45 | return 46 | end 47 | inventory[1].set_stack({ name = script.active_mods["space-age"] and "mech-armor" or "power-armor-mk2" }) 48 | local grid = inventory[1].grid 49 | if not grid then 50 | return 51 | end 52 | for i = 1, #equipment_to_add do 53 | grid.put(equipment_to_add[i]) 54 | end 55 | end 56 | 57 | --- @param player LuaPlayer 58 | local function set_character_cheats(player) 59 | if player.character_reach_distance_bonus >= 1000000 then 60 | return 61 | end 62 | local character = player.character 63 | if not character or not character.valid then 64 | return 65 | end 66 | for modifier, amount in pairs(character_modifiers) do 67 | character[modifier] = character[modifier] + amount 68 | end 69 | end 70 | 71 | --- @param player LuaPlayer 72 | local function set_loadout(player) 73 | -- Remove default items 74 | local main_inventory = player.get_main_inventory() 75 | if not main_inventory then 76 | return 77 | end 78 | local items_to_remove = items_to_remove 79 | for i = 1, #items_to_remove do 80 | main_inventory.remove(items_to_remove[i]) 81 | end 82 | -- Add custom items 83 | local items_to_add = items_to_add 84 | for i = 1, #items_to_add do 85 | main_inventory.insert(items_to_add[i]) 86 | end 87 | if player.controller_type == defines.controllers.character then 88 | set_armor(player.get_inventory(defines.inventory.character_armor)) 89 | set_character_cheats(player) 90 | elseif player.controller_type == defines.controllers.editor then 91 | set_armor(player.get_inventory(defines.inventory.editor_armor)) 92 | end 93 | end 94 | 95 | --- @param force LuaForce 96 | local function disable_recipes(force) 97 | for _, recipe in pairs(force.recipes) do 98 | if recipe.category == "ee-testing-tool" then 99 | recipe.enabled = false 100 | end 101 | end 102 | end 103 | 104 | --- @param force LuaForce 105 | local function enable_recipes(force) 106 | for _, recipe in pairs(force.recipes) do 107 | if recipe.category == "ee-testing-tool" then 108 | recipe.enabled = true 109 | end 110 | end 111 | for _, player in pairs(force.players) do 112 | player.clear_recipe_notifications() 113 | end 114 | end 115 | 116 | --- @param e EventData.on_console_command 117 | local function on_console_command(e) 118 | if e.command ~= "cheat" or not game.console_command_used then 119 | return 120 | end 121 | local player = game.get_player(e.player_index) 122 | if not player or not player.valid then 123 | return 124 | end 125 | if e.parameters == "all" then 126 | set_loadout(player) 127 | end 128 | enable_recipes(player.force --[[@as LuaForce]]) 129 | if game.is_multiplayer() then 130 | player.force.print({ "message.ee-tools-enabled", player.name }) 131 | end 132 | end 133 | 134 | --- @param e EventData.on_player_created 135 | local function on_player_created(e) 136 | local player = game.get_player(e.player_index) 137 | if not player then 138 | return 139 | end 140 | if util.in_debug_world() or util.in_testing_scenario() then 141 | set_loadout(player) 142 | enable_recipes(player.force --[[@as LuaForce]]) 143 | end 144 | end 145 | 146 | --- @param e EventData.on_player_toggled_map_editor 147 | local function on_player_toggled_map_editor(e) 148 | local player = game.get_player(e.player_index) 149 | if not player or not player.cheat_mode or player.controller_type ~= defines.controllers.character then 150 | return 151 | end 152 | set_character_cheats(player) 153 | end 154 | 155 | local cheat_mode = {} 156 | 157 | function cheat_mode.on_configuration_changed() 158 | for _, force in pairs(game.forces) do 159 | for _, player in pairs(force.players) do 160 | if player.cheat_mode then 161 | enable_recipes(force) 162 | break 163 | end 164 | end 165 | end 166 | end 167 | 168 | cheat_mode.events = { 169 | [defines.events.on_console_command] = on_console_command, 170 | [defines.events.on_player_created] = on_player_created, 171 | [defines.events.on_player_toggled_map_editor] = on_player_toggled_map_editor, 172 | } 173 | 174 | cheat_mode.add_remote_interface = function() 175 | remote.add_interface("ee_cheat_mode", { 176 | --- @param force LuaForce 177 | disable_testing_recipes = function(force) 178 | disable_recipes(force) 179 | end, 180 | --- @param force LuaForce 181 | enable_testing_recipes = function(force) 182 | enable_recipes(force) 183 | end, 184 | }) 185 | end 186 | 187 | return cheat_mode 188 | -------------------------------------------------------------------------------- /scripts/debug-world.lua: -------------------------------------------------------------------------------- 1 | local util = require("scripts.util") 2 | 3 | --- @param surface LuaSurface 4 | local function setup_surface(surface) 5 | surface.generate_with_lab_tiles = true 6 | surface.show_clouds = false 7 | surface.freeze_daytime = true 8 | surface.daytime = 0 9 | surface.clear(true) 10 | end 11 | 12 | --- @param force LuaForce 13 | local function setup_force(force) 14 | force.max_successful_attempts_per_tick_per_construction_queue = 30 15 | force.max_failed_attempts_per_tick_per_construction_queue = 10 16 | force.research_all_technologies() 17 | if util.in_testing_scenario() then 18 | force.rechart() 19 | end 20 | end 21 | 22 | --- @param player LuaPlayer 23 | local function setup_player(player) 24 | player.cheat_mode = true 25 | local start_in_editor = player.mod_settings["ee-start-in-editor"] 26 | if start_in_editor and start_in_editor.value then 27 | player.toggle_map_editor() 28 | end 29 | if util.in_debug_world() then 30 | local items = remote.call("freeplay", "get_created_items") --[[@as table]] 31 | remote.call("freeplay", "set_created_items", {}) --- @diagnostic disable-line: missing-fields 32 | remote.call("freeplay", "set_respawn_items", {}) --- @diagnostic disable-line: missing-fields 33 | for name, count in pairs(items) do 34 | player.remove_item({ name = name, count = count }) 35 | end 36 | end 37 | end 38 | 39 | --- @param e EventData.on_force_created 40 | local function on_force_created(e) 41 | if not util.in_debug_world() and not util.in_testing_scenario() then 42 | return 43 | end 44 | setup_force(e.force) 45 | end 46 | 47 | --- @param e EventData.on_player_created 48 | local function on_player_created(e) 49 | if not util.in_debug_world() and not util.in_testing_scenario() then 50 | return 51 | end 52 | local player = game.get_player(e.player_index) 53 | if player then 54 | setup_player(player) 55 | end 56 | end 57 | 58 | --- @param e EventData.on_surface_cleared 59 | local function on_surface_cleared(e) 60 | if not util.in_debug_world() then 61 | return 62 | end 63 | local surface = game.get_surface(e.surface_index) 64 | if not surface then 65 | return 66 | end 67 | surface.create_entity({ 68 | name = "ee-infinity-accumulator-primary-output", 69 | position = { -24, -24 }, 70 | force = game.forces.player, 71 | create_build_effect_smoke = false, 72 | }) 73 | surface.create_entity({ 74 | name = "ee-super-substation", 75 | position = { -22, -24 }, 76 | force = game.forces.player, 77 | create_build_effect_smoke = false, 78 | }) 79 | end 80 | 81 | local function on_init() 82 | if not util.in_debug_world() and not util.in_testing_scenario() then 83 | return 84 | end 85 | if game.tick ~= 0 then 86 | return 87 | end 88 | for _, force in pairs(game.forces) do 89 | setup_force(force) 90 | end 91 | for _, player in pairs(game.players) do 92 | setup_player(player) 93 | end 94 | 95 | if util.in_debug_world() then 96 | local nauvis = game.get_surface("nauvis") 97 | if nauvis then 98 | setup_surface(nauvis) 99 | end 100 | end 101 | end 102 | 103 | local debug_world = {} 104 | 105 | debug_world.on_init = on_init 106 | 107 | debug_world.events = { 108 | [defines.events.on_force_created] = on_force_created, 109 | [defines.events.on_player_created] = on_player_created, 110 | [defines.events.on_surface_cleared] = on_surface_cleared, 111 | } 112 | 113 | return debug_world 114 | -------------------------------------------------------------------------------- /scripts/editor.lua: -------------------------------------------------------------------------------- 1 | local util = require("scripts.util") 2 | 3 | local editor_gui_width = 474 4 | 5 | --- @param player LuaPlayer 6 | --- @return boolean 7 | local function se_check_in_spaceship(player) 8 | local se_interface = remote.interfaces["space-exploration"] 9 | if not se_interface or not se_interface.get_surface_type then 10 | return false 11 | end 12 | local surface_type = remote.call("space-exploration", "get_surface_type", { surface_index = player.surface_index }) --- @diagnostic disable-line: missing-fields 13 | return surface_type == "spaceship" 14 | end 15 | 16 | --- @param e EventData.CustomInputEvent|EventData.on_lua_shortcut 17 | local function on_toggle_editor(e) 18 | local input = e.prototype_name or e.input_name 19 | if input ~= "ee-toggle-map-editor" then 20 | return 21 | end 22 | 23 | local player = game.get_player(e.player_index) 24 | if not player then 25 | return 26 | end 27 | 28 | local group = player.permission_group 29 | if not player.admin or (group and not group.allows_action(defines.input_action.toggle_map_editor)) then 30 | player.print({ "message.ee-cannot-use-map-editor" }) 31 | return 32 | end 33 | 34 | local lab_setting = player.mod_settings["ee-testing-lab"].value 35 | if lab_setting ~= "off" and se_check_in_spaceship(player) then 36 | player.print({ "message.ee-cannot-use-testing-lab-spaceship" }) 37 | return 38 | end 39 | 40 | player.toggle_map_editor() 41 | end 42 | 43 | --- @param e EventData.on_player_toggled_map_editor 44 | local function on_player_toggled_map_editor(e) 45 | local player = game.get_player(e.player_index) 46 | if not player then 47 | return 48 | end 49 | 50 | player.set_shortcut_toggled("ee-toggle-map-editor", player.physical_controller_type == defines.controllers.editor) 51 | 52 | if storage.editor_toggled or not game.tick_paused then 53 | return 54 | end 55 | storage.editor_toggled = true 56 | if game.tick_paused and settings.global["ee-prevent-initial-pause"].value then 57 | game.tick_paused = false 58 | end 59 | end 60 | 61 | --- @param e EventData.on_player_created 62 | local function on_player_created(e) 63 | local player = game.get_player(e.player_index) 64 | if not player then 65 | return 66 | end 67 | 68 | util.player_can_use_editor(player) 69 | 70 | if player.mod_settings["ee-auto-alt-mode"].value then 71 | local game_view_settings = player.game_view_settings 72 | game_view_settings.show_entity_info = true 73 | player.game_view_settings = game_view_settings 74 | end 75 | 76 | if not util.in_debug_world() and not util.in_testing_scenario() then 77 | player.print({ "message.ee-welcome" }) 78 | end 79 | end 80 | 81 | --- @param e EventData.on_permission_group_edited 82 | local function on_permission_group_edited(e) 83 | if string.find(e.type, "permission") and e.action ~= defines.input_action.toggle_map_editor then 84 | return 85 | end 86 | for _, player in pairs(e.group.players) do 87 | util.player_can_use_editor(player) 88 | end 89 | end 90 | 91 | --- @class SERemoteViewToggledEventData: EventData 92 | --- @field player_index uint 93 | 94 | local function register_se_events() 95 | local se = remote.interfaces["space-exploration"] 96 | if not se then 97 | return 98 | end 99 | if se.get_on_remote_view_started_event then 100 | script.on_event(remote.call("space-exploration", "get_on_remote_view_started_event") --[[@as uint]], function(e) 101 | --- @cast e SERemoteViewToggledEventData 102 | game.get_player(e.player_index).set_shortcut_available("ee-toggle-map-editor", false) 103 | end) 104 | end 105 | if se.get_on_remote_view_stopped_event then 106 | script.on_event(remote.call("space-exploration", "get_on_remote_view_stopped_event") --[[@as uint]], function(e) 107 | --- @cast e SERemoteViewToggledEventData 108 | util.player_can_use_editor(game.get_player(e.player_index) --[[@as LuaPlayer]]) 109 | end) 110 | end 111 | end 112 | 113 | local editor = {} 114 | 115 | editor.on_init = function() 116 | for player_index in pairs(game.players) do 117 | --- @cast player_index uint 118 | on_player_created({ player_index = player_index }) --- @diagnostic disable-line: missing-fields 119 | end 120 | register_se_events() 121 | end 122 | 123 | editor.on_load = register_se_events 124 | 125 | editor.on_configuration_changed = function() 126 | for _, player in pairs(game.players) do 127 | util.player_can_use_editor(player) 128 | end 129 | end 130 | 131 | editor.events = { 132 | [defines.events.on_lua_shortcut] = on_toggle_editor, 133 | [defines.events.on_permission_group_edited] = on_permission_group_edited, 134 | [defines.events.on_player_created] = on_player_created, 135 | [defines.events.on_player_toggled_map_editor] = on_player_toggled_map_editor, 136 | ["ee-toggle-map-editor"] = on_toggle_editor, 137 | } 138 | 139 | return editor 140 | -------------------------------------------------------------------------------- /scripts/infinity-loader.lua: -------------------------------------------------------------------------------- 1 | local flib_direction = require("__flib__.direction") 2 | local flib_migration = require("__flib__.migration") 3 | local position = require("__flib__.position") 4 | 5 | local transport_belt_connectables = { 6 | "transport-belt", 7 | "underground-belt", 8 | "splitter", 9 | "loader", 10 | "loader-1x1", 11 | "linked-belt", 12 | "lane-splitter", 13 | } 14 | 15 | --- @param entity LuaEntity 16 | local function snap(entity) 17 | local offset_direction = entity.direction 18 | if entity.loader_type == "input" then 19 | offset_direction = flib_direction.opposite(offset_direction) 20 | end 21 | local belt_position = position.add(entity.position, flib_direction.to_vector(offset_direction)) 22 | local belt = 23 | entity.surface.find_entities_filtered({ position = belt_position, type = transport_belt_connectables })[1] 24 | if not belt then 25 | belt = 26 | entity.surface.find_entities_filtered({ position = belt_position, ghost_type = transport_belt_connectables })[1] 27 | end 28 | if not belt then 29 | return 30 | end 31 | if belt.direction == flib_direction.opposite(entity.direction) then 32 | entity.loader_type = entity.loader_type == "output" and "input" or "output" 33 | end 34 | end 35 | 36 | --- @param entity LuaEntity 37 | --- @param chest LuaEntity? 38 | local function sync_chest_filter(entity, chest) 39 | if not chest then 40 | chest = entity.surface.find_entity("ee-infinity-loader-chest", entity.position) 41 | end 42 | if not chest then 43 | entity.destroy() 44 | return 45 | end 46 | for i = 1, 2 do 47 | local filter = entity.get_filter(i) 48 | if filter then 49 | chest.set_infinity_container_filter(i, { 50 | index = i, 51 | name = filter.name --[[@as string]], 52 | quality = filter.quality, 53 | count = prototypes.item[filter.name].stack_size * 5, 54 | mode = "exactly", 55 | }) 56 | else 57 | chest.set_infinity_container_filter(i, nil) 58 | end 59 | end 60 | end 61 | 62 | --- @param loader LuaEntity 63 | --- @param combinator LuaEntity 64 | local function copy_from_loader_to_combinator(loader, combinator) 65 | local cb = combinator.get_or_create_control_behavior() --[[@as LuaConstantCombinatorControlBehavior]] 66 | --- @type LuaLogisticSection? 67 | local section 68 | for _, sec in pairs(cb.sections) do 69 | if sec.group == "" then 70 | section = sec 71 | break 72 | end 73 | end 74 | if not section then 75 | section = cb.add_section() 76 | end 77 | if not section then 78 | return -- When will this ever happen? 79 | end 80 | --- @type ItemFilter? 81 | local first_filter 82 | for i = 1, 2 do 83 | local filter = loader.get_filter(i) 84 | if not filter then 85 | goto continue 86 | end 87 | if i == 1 then 88 | first_filter = filter 89 | elseif first_filter and filter.name == first_filter.name and filter.quality == first_filter.quality then 90 | return 91 | end 92 | section.set_slot(i, { 93 | value = { 94 | type = "item", 95 | name = filter.name --[[@as string]], 96 | quality = filter.quality, 97 | }, 98 | min = 1, 99 | }) 100 | ::continue:: 101 | end 102 | end 103 | 104 | --- @param combinator LuaEntity 105 | --- @param loader LuaEntity 106 | local function copy_from_combinator_to_loader(combinator, loader) 107 | local cb = combinator.get_control_behavior() --[[@as LuaConstantCombinatorControlBehavior?]] 108 | if not cb then 109 | return 110 | end 111 | local section = cb.get_section(1) 112 | if not section then 113 | return 114 | end 115 | for i = 1, 2 do 116 | local filter = section.filters[i] 117 | if filter then 118 | local value = filter.value 119 | if value and prototypes[value.type or "item"][value.name] then 120 | loader.set_filter(i, { name = value.name, quality = value.quality }) 121 | else 122 | loader.set_filter(i, nil) 123 | end 124 | end 125 | end 126 | sync_chest_filter(loader) 127 | end 128 | 129 | --- @param e BuiltEvent 130 | local function on_entity_built(e) 131 | local entity = e.entity or e.destination 132 | if not entity.valid then 133 | return 134 | end 135 | 136 | if entity.name ~= "ee-infinity-loader" then 137 | return 138 | end 139 | 140 | -- Create chest 141 | local chest = entity.surface.create_entity({ 142 | name = "ee-infinity-loader-chest", 143 | position = entity.position, 144 | force = entity.force, 145 | create_build_effect_smoke = false, 146 | raise_built = true, 147 | }) 148 | 149 | if not chest then 150 | entity.destroy() 151 | return 152 | end 153 | 154 | chest.remove_unfiltered_items = true 155 | sync_chest_filter(entity, chest) 156 | snap(entity) 157 | end 158 | 159 | --- @param e DestroyedEvent 160 | local function on_entity_destroyed(e) 161 | local entity = e.entity 162 | if not entity.valid or entity.name ~= "ee-infinity-loader" then 163 | return 164 | end 165 | local chest = entity.surface.find_entity("ee-infinity-loader-chest", entity.position) 166 | if chest then 167 | chest.destroy({ raise_destroy = true }) 168 | end 169 | end 170 | 171 | --- @param e EventData.on_player_rotated_entity 172 | local function on_entity_rotated(e) 173 | local entity = e.entity 174 | if not entity.valid or entity.name ~= "ee-infinity-loader" then 175 | return 176 | end 177 | sync_chest_filter(entity) 178 | end 179 | 180 | --- @param e EventData.on_entity_settings_pasted 181 | local function on_entity_settings_pasted(e) 182 | local source, destination = e.source, e.destination 183 | if not source.valid or not destination.valid then 184 | return 185 | end 186 | local source_is_loader, destination_is_loader = 187 | source.name == "ee-infinity-loader", destination.name == "ee-infinity-loader" 188 | if source_is_loader and destination.name == "constant-combinator" then 189 | copy_from_loader_to_combinator(source, destination) 190 | elseif source.name == "constant-combinator" and destination_is_loader then 191 | copy_from_combinator_to_loader(source, destination) 192 | elseif destination_is_loader then 193 | sync_chest_filter(destination) 194 | end 195 | end 196 | 197 | --- @param e EventData.on_gui_opened 198 | local function on_gui_opened(e) 199 | if e.gui_type ~= defines.gui_type.entity then 200 | return 201 | end 202 | local entity = e.entity 203 | if not entity or not entity.valid then 204 | return 205 | end 206 | if entity.name == "ee-infinity-loader" then 207 | storage.infinity_loader_open[e.player_index] = entity 208 | end 209 | end 210 | 211 | --- @param e EventData.on_gui_closed 212 | local function on_gui_closed(e) 213 | if e.gui_type ~= defines.gui_type.entity then 214 | return 215 | end 216 | local loader = storage.infinity_loader_open[e.player_index] 217 | if loader and loader.valid then 218 | sync_chest_filter(loader) 219 | storage.infinity_loader_open[e.player_index] = nil 220 | end 221 | end 222 | 223 | local infinity_loader = {} 224 | 225 | function infinity_loader.on_init() 226 | --- @type table 227 | storage.infinity_loader_open = {} 228 | end 229 | 230 | --- @param e ConfigurationChangedData 231 | function infinity_loader.on_configuration_changed(e) 232 | flib_migration.on_config_changed( 233 | e, 234 | infinity_loader.migrations, 235 | script.mod_name, 236 | e.mod_changes.EditorExtensions and e.mod_changes.EditorExtensions.old_version 237 | ) 238 | end 239 | 240 | infinity_loader.migrations = { 241 | ["2.0.0"] = function() 242 | for _, surface in pairs(game.surfaces) do 243 | for _, combinator in pairs(surface.find_entities_filtered({ name = "ee-infinity-loader-dummy-combinator" })) do 244 | local cb = combinator.get_control_behavior() --[[@as LuaConstantCombinatorControlBehavior?]] 245 | if not cb then 246 | goto continue 247 | end 248 | local section = cb.get_section(1) 249 | if not section then 250 | goto continue 251 | end 252 | local filter_1, filter_2 = section.filters[1], section.filters[2] 253 | local loader = combinator.surface.create_entity({ 254 | name = "ee-infinity-loader", 255 | direction = combinator.direction, 256 | position = combinator.position, 257 | force = combinator.force, 258 | last_user = combinator.last_user, 259 | fast_replace = true, 260 | create_build_effect_smoke = false, 261 | }) 262 | if not loader then 263 | error("Failed to create infinity loader replacement.") 264 | end 265 | if filter_1 and filter_1.value then 266 | loader.set_filter(1, { name = filter_1.value.name, quality = filter_1.value.quality, amount = filter_1.min }) 267 | end 268 | if filter_2 and filter_2.value then 269 | loader.set_filter(2, { name = filter_2.value.name, quality = filter_2.value.quality, amount = filter_2.min }) 270 | end 271 | snap(loader) 272 | combinator.destroy() 273 | ::continue:: 274 | end 275 | end 276 | end, 277 | --- @param old_version string 278 | ["2.4.0"] = function(old_version) 279 | if not flib_migration.is_newer_version("2.0.0", old_version) then 280 | return 281 | end 282 | for _, surface in pairs(game.surfaces) do 283 | for _, loader in pairs(surface.find_entities_filtered({ name = "ee-infinity-loader" })) do 284 | loader.set_filter(2, loader.get_filter(1)) 285 | end 286 | end 287 | end, 288 | } 289 | 290 | infinity_loader.events = { 291 | [defines.events.on_built_entity] = on_entity_built, 292 | [defines.events.on_entity_cloned] = on_entity_built, 293 | [defines.events.on_entity_died] = on_entity_destroyed, 294 | [defines.events.on_entity_settings_pasted] = on_entity_settings_pasted, 295 | [defines.events.on_gui_closed] = on_gui_closed, 296 | [defines.events.on_gui_opened] = on_gui_opened, 297 | [defines.events.on_player_mined_entity] = on_entity_destroyed, 298 | [defines.events.on_player_rotated_entity] = on_entity_rotated, 299 | [defines.events.on_robot_built_entity] = on_entity_built, 300 | [defines.events.on_robot_mined_entity] = on_entity_destroyed, 301 | [defines.events.script_raised_built] = on_entity_built, 302 | [defines.events.script_raised_destroy] = on_entity_destroyed, 303 | [defines.events.script_raised_revive] = on_entity_built, 304 | [defines.events.on_space_platform_built_entity] = on_entity_built, 305 | [defines.events.on_space_platform_mined_entity] = on_entity_destroyed, 306 | } 307 | 308 | infinity_loader.on_nth_tick = { 309 | [15] = function() 310 | for unit_number, loader in pairs(storage.infinity_loader_open) do 311 | if loader.valid then 312 | sync_chest_filter(loader) 313 | else 314 | storage.infinity_loader_open[unit_number] = nil 315 | end 316 | end 317 | end, 318 | } 319 | 320 | return infinity_loader 321 | -------------------------------------------------------------------------------- /scripts/infinity-pipe.lua: -------------------------------------------------------------------------------- 1 | --- @param pipe LuaEntity 2 | --- @param combinator LuaEntity 3 | local function copy_from_pipe_to_combinator(pipe, combinator) 4 | local filter = pipe.get_infinity_pipe_filter() 5 | if not filter then 6 | return 7 | end 8 | local cb = combinator.get_or_create_control_behavior() --[[@as LuaConstantCombinatorControlBehavior]] 9 | --- @type LuaLogisticSection? 10 | local section 11 | for _, sec in pairs(cb.sections) do 12 | if sec.group == "" then 13 | section = sec 14 | break 15 | end 16 | end 17 | if not section then 18 | section = cb.add_section() 19 | end 20 | if not section then 21 | return -- When will this ever happen? 22 | end 23 | section.set_slot(1, { 24 | value = { 25 | comparator = "=", 26 | type = "fluid", 27 | name = filter.name --[[@as string]], 28 | quality = "normal", 29 | }, 30 | min = 1, 31 | }) 32 | end 33 | 34 | --- @param combinator LuaEntity 35 | --- @param pipe LuaEntity 36 | local function copy_from_combinator_to_pipe(combinator, pipe) 37 | local cb = combinator.get_control_behavior() --[[@as LuaConstantCombinatorControlBehavior?]] 38 | if not cb then 39 | return 40 | end 41 | local cb = combinator.get_control_behavior() --[[@as LuaConstantCombinatorControlBehavior?]] 42 | if not cb then 43 | return 44 | end 45 | local section = cb.get_section(1) 46 | if not section then 47 | return 48 | end 49 | local filter = section.filters[1] 50 | if not filter then 51 | return 52 | end 53 | local value = filter.value 54 | -- XXX: `filter` will not always have a `type` field. 55 | if value and prototypes.fluid[value.name] then 56 | pipe.set_infinity_pipe_filter({ type = "fluid", name = value.name, percentage = 1 }) 57 | else 58 | pipe.set_infinity_pipe_filter(nil) 59 | end 60 | end 61 | 62 | --- @param e EventData.on_entity_settings_pasted 63 | local function on_entity_settings_pasted(e) 64 | local source, destination = e.source, e.destination 65 | if not source.valid or not destination.valid then 66 | return 67 | end 68 | local source_is_pipe, destination_is_pipe = source.type == "infinity-pipe", destination.type == "infinity-pipe" 69 | if source_is_pipe and destination.name == "constant-combinator" then 70 | copy_from_pipe_to_combinator(source, destination) 71 | elseif source.name == "constant-combinator" and destination_is_pipe then 72 | copy_from_combinator_to_pipe(source, destination) 73 | end 74 | end 75 | 76 | local infinity_pipe = {} 77 | 78 | infinity_pipe.events = { 79 | [defines.events.on_entity_settings_pasted] = on_entity_settings_pasted, 80 | } 81 | 82 | return infinity_pipe 83 | -------------------------------------------------------------------------------- /scripts/infinity-wagon.lua: -------------------------------------------------------------------------------- 1 | --- @class InfinityFluidWagonData 2 | --- @field flip integer 3 | --- @field proxy LuaEntity 4 | --- @field proxy_fluidbox LuaFluidBox 5 | --- @field wagon LuaEntity 6 | --- @field wagon_last_position MapPosition 7 | --- @field wagon_name string 8 | 9 | --- @param player LuaPlayer 10 | --- @param entity LuaEntity 11 | local function open_gui(player, entity) 12 | player.opened = storage.wagons[entity.unit_number].proxy 13 | end 14 | 15 | --- @param e BuiltEvent 16 | local function on_entity_built(e) 17 | local entity = e.entity or e.destination 18 | if not entity or not entity.valid or entity.name ~= "ee-infinity-fluid-wagon" then 19 | return 20 | end 21 | 22 | local proxy = entity.surface.create_entity({ 23 | name = "ee-infinity-wagon-pipe", 24 | position = entity.position, 25 | force = entity.force, 26 | }) 27 | if not proxy then 28 | return 29 | end 30 | 31 | -- Create all api lookups here to save time in on_tick() 32 | local data = { 33 | flip = 0, 34 | proxy = proxy, 35 | proxy_fluidbox = proxy.fluidbox, 36 | wagon = entity, 37 | wagon_last_position = entity.position, 38 | wagon_name = entity.name, 39 | } 40 | storage.wagons[entity.unit_number] = data 41 | 42 | local tags = e.tags 43 | if not tags or not tags.EditorExtensions then 44 | return 45 | end 46 | proxy.set_infinity_pipe_filter(tags.EditorExtensions --[[@as InfinityPipeFilter]]) 47 | end 48 | 49 | --- @param e DestroyedEvent 50 | local function on_entity_destroyed(e) 51 | local entity = e.entity 52 | if not entity or not entity.valid or entity.name ~= "ee-infinity-fluid-wagon" then 53 | return 54 | end 55 | 56 | local proxy = storage.wagons[entity.unit_number].proxy 57 | if proxy and proxy.valid then 58 | proxy.destroy({}) 59 | end 60 | storage.wagons[entity.unit_number] = nil 61 | end 62 | 63 | --- @param e EventData.on_marked_for_deconstruction 64 | local function on_marked_for_deconstruction(e) 65 | local entity = e.entity 66 | if not entity.valid or entity.name ~= "ee-infinity-cargo-wagon" then 67 | return 68 | end 69 | storage.wagons[entity.unit_number].flip = 3 70 | entity.get_inventory(defines.inventory.cargo_wagon).clear() 71 | end 72 | 73 | --- @param e EventData.on_cancelled_deconstruction 74 | local function on_cancelled_deconstruction(e) 75 | local entity = e.entity 76 | if not entity.valid or entity.name ~= "ee-infinity-cargo-wagon" then 77 | return 78 | end 79 | -- Resume syncing 80 | storage.wagons[entity.unit_number].flip = 0 81 | end 82 | 83 | local abs = math.abs 84 | 85 | --- @param data InfinityFluidWagonData 86 | local function sync_fluid(data) 87 | if data.flip == 0 then 88 | local fluid = data.proxy_fluidbox[1] 89 | data.wagon.set_fluid(1, fluid and fluid.amount > 0 and { 90 | name = fluid.name, 91 | amount = (abs(fluid.amount) * 250), 92 | temperature = fluid.temperature, 93 | } or nil) 94 | data.flip = 1 95 | elseif data.flip == 1 then 96 | local fluid = data.wagon.get_fluid(1) 97 | data.proxy_fluidbox[1] = fluid 98 | and fluid.amount > 0 99 | and { 100 | name = fluid.name, 101 | amount = (abs(fluid.amount) / 250), 102 | temperature = fluid.temperature, 103 | } 104 | or nil 105 | data.flip = 0 106 | end 107 | end 108 | 109 | local function on_tick() 110 | for unit_number, data in pairs(storage.wagons) do 111 | if not data.wagon.valid or not data.proxy.valid then 112 | if data.wagon.valid then 113 | data.wagon.destroy({ raise_destroy = true }) 114 | end 115 | if data.proxy.valid then 116 | data.proxy.destroy({ raise_destroy = true }) 117 | end 118 | storage.wagons[unit_number] = nil 119 | goto continue 120 | end 121 | sync_fluid(data) 122 | local position = data.wagon.position 123 | local last_position = data.wagon_last_position 124 | if not last_position or last_position.x ~= position.x or last_position.y ~= position.y then 125 | data.proxy.teleport(data.wagon.position) 126 | data.wagon_last_position = data.wagon.position 127 | end 128 | ::continue:: 129 | end 130 | end 131 | 132 | --- @param e EventData.CustomInputEvent 133 | local function on_linked_open_gui(e) 134 | local player = game.get_player(e.player_index) 135 | if not player then 136 | return 137 | end 138 | local entity = player.selected 139 | if not entity or entity.name ~= "ee-infinity-fluid-wagon" then 140 | return 141 | end 142 | if not player.can_reach_entity(entity) then 143 | return 144 | end 145 | open_gui(player, entity) 146 | end 147 | 148 | --- @param e EventData.on_entity_settings_pasted 149 | local function on_entity_settings_pasted(e) 150 | local source, destination = e.source, e.destination 151 | if not source.valid or not destination.valid then 152 | return 153 | end 154 | if source.name ~= "ee-infinity-fluid-wagon" or destination.name ~= "ee-infinity-fluid-wagon" then 155 | return 156 | end 157 | if source.name ~= destination.name then 158 | return 159 | end 160 | 161 | storage.wagons[destination.unit_number].proxy.copy_settings(storage.wagons[source.unit_number].proxy) 162 | end 163 | 164 | --- @param e EventData.on_player_setup_blueprint 165 | local function on_player_setup_blueprint(e) 166 | local blueprint = e.stack or e.record 167 | if not blueprint then 168 | return 169 | end 170 | 171 | local entities = blueprint.get_blueprint_entities() 172 | if not entities then 173 | return 174 | end 175 | for i, entity in pairs(entities) do 176 | --- @cast i uint 177 | if entity.name ~= "ee-infinity-fluid-wagon" then 178 | goto continue 179 | end 180 | local real_entity = e.surface.find_entity(entity.name, entity.position) 181 | if not real_entity then 182 | goto continue 183 | end 184 | local proxy = storage.wagons[real_entity.unit_number].proxy 185 | local tags = {} 186 | if entity.name == "ee-infinity-cargo-wagon" then 187 | tags.filters = proxy.infinity_container_filters 188 | tags.remove_unfiltered_items = proxy.remove_unfiltered_items 189 | else 190 | tags = proxy.get_infinity_pipe_filter() 191 | end 192 | blueprint.set_blueprint_entity_tag(i, "EditorExtensions", tags --[[@as AnyBasic]]) 193 | ::continue:: 194 | end 195 | end 196 | 197 | local infinity_wagon = {} 198 | 199 | infinity_wagon.on_init = function() 200 | --- @type table 201 | storage.wagons = {} 202 | end 203 | 204 | infinity_wagon.events = { 205 | [defines.events.on_built_entity] = on_entity_built, 206 | [defines.events.on_cancelled_deconstruction] = on_cancelled_deconstruction, 207 | [defines.events.on_entity_cloned] = on_entity_built, 208 | [defines.events.on_entity_died] = on_entity_destroyed, 209 | [defines.events.on_entity_settings_pasted] = on_entity_settings_pasted, 210 | [defines.events.on_marked_for_deconstruction] = on_marked_for_deconstruction, 211 | [defines.events.on_player_mined_entity] = on_entity_destroyed, 212 | [defines.events.on_player_setup_blueprint] = on_player_setup_blueprint, 213 | [defines.events.on_robot_built_entity] = on_entity_built, 214 | [defines.events.on_robot_mined_entity] = on_entity_destroyed, 215 | [defines.events.on_tick] = on_tick, 216 | [defines.events.script_raised_built] = on_entity_built, 217 | [defines.events.script_raised_destroy] = on_entity_destroyed, 218 | [defines.events.script_raised_revive] = on_entity_built, 219 | [defines.events.on_space_platform_built_entity] = on_entity_built, 220 | [defines.events.on_space_platform_mined_entity] = on_entity_destroyed, 221 | ["ee-linked-open-gui"] = on_linked_open_gui, 222 | } 223 | 224 | return infinity_wagon 225 | -------------------------------------------------------------------------------- /scripts/inventory-filters.lua: -------------------------------------------------------------------------------- 1 | local gui = require("__flib__.gui") 2 | local migration = require("__flib__.migration") 3 | 4 | local util = require("scripts.util") 5 | 6 | local filters_table_version = 0 7 | local filters_table_migrations = {} 8 | 9 | --- @param player LuaPlayer 10 | --- @param string string 11 | local function import_filters(player, string) 12 | if string == "" then 13 | return 14 | end 15 | local decoded_string = helpers.decode_string(string) 16 | if 17 | decoded_string 18 | and string.sub(decoded_string, 1, 16) == "EditorExtensions" 19 | and string.sub(decoded_string, 18, 34) == "inventory_filters" 20 | then 21 | -- Extract version for migrations 22 | local version, json = string.match(decoded_string, "^.-%-.-%-(%d-)%-(.*)$") 23 | local input = helpers.json_to_table(json) 24 | if input then 25 | -- Run migrations 26 | migration.run(version, filters_table_migrations, nil, input) 27 | -- Sanitize the filters to only include currently existing prototypes 28 | local item_prototypes = prototypes.item 29 | local output = {} 30 | local i = 0 31 | local filters = input.filters 32 | for _, filter in pairs(filters) do 33 | if item_prototypes[filter.name] then 34 | i = i + 1 35 | filter.index = i 36 | output[i] = filter 37 | end 38 | end 39 | player.infinity_inventory_filters = output 40 | player.remove_unfiltered_items = input.remove_unfiltered_items 41 | return true 42 | end 43 | end 44 | return false 45 | end 46 | 47 | --- @param player LuaPlayer 48 | --- @return string? 49 | local function export_filters(player) 50 | local filters = player.infinity_inventory_filters 51 | local output = { 52 | filters = filters, 53 | remove_unfiltered_items = player.remove_unfiltered_items, 54 | } 55 | return helpers.encode_string( 56 | "EditorExtensions-inventory_filters-" .. filters_table_version .. "-" .. helpers.table_to_json(output) 57 | ) 58 | end 59 | 60 | -- String GUI 61 | 62 | --- @param player LuaPlayer 63 | --- @return boolean 64 | local function destroy_string_gui(player) 65 | local window = player.gui.screen.ee_inventory_filters 66 | if not window or not window.valid then 67 | return false 68 | end 69 | 70 | window.destroy() 71 | 72 | return true 73 | end 74 | 75 | --- @param e EventData.on_gui_click 76 | local function on_string_gui_import_click(e) 77 | local player = game.get_player(e.player_index) 78 | if not player then 79 | return 80 | end 81 | 82 | local string = e.element.parent.parent.textbox.text 83 | if import_filters(player, string) then 84 | destroy_string_gui(player) 85 | util.flying_text(player, { "message.ee-imported-infinity-filters" }) 86 | else 87 | util.flying_text(player, { "message.ee-invalid-infinity-filters-string" }, true) 88 | end 89 | end 90 | 91 | --- @param e EventData.on_gui_click 92 | local function on_string_gui_cancel_click(e) 93 | local player = game.get_player(e.player_index) 94 | if not player then 95 | return 96 | end 97 | 98 | destroy_string_gui(player) 99 | 100 | -- Keep controller GUI open 101 | player.opened = defines.gui_type.controller 102 | end 103 | 104 | --- @param player LuaPlayer 105 | --- @param mode string 106 | local function build_string_gui(player, mode) 107 | destroy_string_gui(player) 108 | local elems = gui.add(player.gui.screen, { 109 | type = "frame", 110 | name = "ee_inventory_filters", 111 | direction = "vertical", 112 | caption = { "gui.ee-" .. mode .. "-infinity-filters" }, 113 | elem_mods = { auto_center = true }, 114 | { 115 | type = "text-box", 116 | name = "textbox", 117 | style_mods = { width = 400, height = 300 }, 118 | clear_and_focus_on_right_click = true, 119 | text = mode == "import" and "" or export_filters(player), 120 | elem_mods = { word_wrap = true }, 121 | }, 122 | { 123 | type = "flow", 124 | style = "dialog_buttons_horizontal_flow", 125 | drag_target = "ee_inventory_filters", 126 | { 127 | type = "button", 128 | style = "back_button", 129 | caption = { "gui.cancel" }, 130 | handler = on_string_gui_cancel_click, 131 | }, 132 | { 133 | type = "empty-widget", 134 | style = "flib_dialog_footer_drag_handle", 135 | style_mods = mode == "export" and { right_margin = 0 } or nil, 136 | ignored_by_interaction = true, 137 | }, 138 | { 139 | type = "button", 140 | style = "confirm_button", 141 | caption = { "gui.confirm" }, 142 | visible = mode == "import", 143 | handler = on_string_gui_import_click, 144 | }, 145 | }, 146 | }) 147 | 148 | elems.textbox.select_all() 149 | elems.textbox.focus() 150 | end 151 | 152 | -- Relative GUI 153 | 154 | --- @param player LuaPlayer 155 | local function destroy_relative_gui(player) 156 | local window = player.gui.relative.ee_inventory_filters 157 | if window and window.valid then 158 | window.destroy() 159 | end 160 | end 161 | 162 | --- @param e EventData.on_gui_click 163 | local function on_relative_gui_button_click(e) 164 | local player = game.get_player(e.player_index) 165 | if not player then 166 | return 167 | end 168 | 169 | local mode = e.element.name 170 | build_string_gui(player, mode) 171 | end 172 | 173 | --- @param player LuaPlayer 174 | local function build_relative_gui(player) 175 | destroy_relative_gui(player) 176 | gui.add(player.gui.relative, { 177 | type = "frame", 178 | name = "ee_inventory_filters", 179 | style = "slot_window_frame", 180 | anchor = { 181 | gui = defines.relative_gui_type.controller_gui, 182 | position = defines.relative_gui_position.left, 183 | name = "editor", 184 | }, 185 | { 186 | type = "frame", 187 | style = "shortcut_bar_inner_panel", 188 | direction = "vertical", 189 | { 190 | type = "sprite-button", 191 | name = "import", 192 | style = "shortcut_bar_button", 193 | sprite = "ee_import_inventory_filters", 194 | tooltip = { "gui.ee-import-infinity-filters" }, 195 | handler = on_relative_gui_button_click, 196 | }, 197 | { 198 | type = "sprite-button", 199 | name = "export", 200 | style = "shortcut_bar_button", 201 | sprite = "ee_export_inventory_filters", 202 | tooltip = { "gui.ee-export-infinity-filters" }, 203 | handler = on_relative_gui_button_click, 204 | }, 205 | }, 206 | }) 207 | end 208 | 209 | --- @param e EventData.on_gui_closed 210 | local function on_gui_closed(e) 211 | if e.gui_type ~= defines.gui_type.controller then 212 | return 213 | end 214 | local player = game.get_player(e.player_index) 215 | if not player then 216 | return 217 | end 218 | if destroy_string_gui(player) then 219 | player.opened = defines.gui_type.controller 220 | end 221 | end 222 | 223 | --- @param e EventData.on_player_toggled_map_editor 224 | local function on_player_toggled_map_editor(e) 225 | local player = game.get_player(e.player_index) 226 | if not player then 227 | return 228 | end 229 | local in_editor = player.controller_type == defines.controllers.editor 230 | if not in_editor or storage.applied_default_filters[e.player_index] then 231 | return 232 | end 233 | 234 | -- Apply default infinity filters if this is their first time in the editor 235 | storage.applied_default_filters[e.player_index] = true 236 | local default_filters = player.mod_settings["ee-default-infinity-filters"].value --[[@as string]] 237 | if default_filters == "" then 238 | return 239 | end 240 | import_filters(player, default_filters) 241 | end 242 | 243 | --- @param e EventData.on_player_created 244 | local function on_player_created(e) 245 | local player = game.get_player(e.player_index) 246 | if not player then 247 | return 248 | end 249 | 250 | build_relative_gui(player) 251 | end 252 | 253 | --- @param e EventData.on_player_removed 254 | local function on_player_removed(e) 255 | if storage.applied_default_filters then 256 | storage.applied_default_filters[e.player_index] = nil 257 | end 258 | end 259 | 260 | local inventory_filters = {} 261 | 262 | inventory_filters.on_init = function() 263 | --- @type table 264 | storage.applied_default_filters = {} 265 | end 266 | 267 | inventory_filters.on_configuration_changed = function() 268 | for _, player in pairs(game.players) do 269 | destroy_string_gui(player) 270 | build_relative_gui(player) 271 | end 272 | end 273 | 274 | inventory_filters.events = { 275 | [defines.events.on_gui_closed] = on_gui_closed, 276 | [defines.events.on_player_created] = on_player_created, 277 | [defines.events.on_player_removed] = on_player_removed, 278 | [defines.events.on_player_toggled_map_editor] = on_player_toggled_map_editor, 279 | } 280 | 281 | gui.add_handlers({ 282 | destroy_string_gui = destroy_string_gui, 283 | on_relative_gui_button_click = on_relative_gui_button_click, 284 | on_string_gui_cancel_click = on_string_gui_cancel_click, 285 | on_string_gui_import_click = on_string_gui_import_click, 286 | }) 287 | 288 | return inventory_filters 289 | -------------------------------------------------------------------------------- /scripts/inventory-sync.lua: -------------------------------------------------------------------------------- 1 | local table = require("__flib__.table") 2 | 3 | --- @class ItemFilters table 4 | -- 5 | --- @class InventorySyncData 6 | --- @field filters ItemFilters 7 | --- @field hand_location uint? 8 | --- @field inventory LuaInventory 9 | 10 | --- @param player LuaPlayer 11 | local function pre_sync(player) 12 | local prefix = table.find(defines.controllers, player.controller_type) .. "_" 13 | local hand_location = player.hand_location or {} 14 | --- @type table 15 | local sync_tables = {} 16 | for _, name in ipairs({ "cursor", "main", "guns", "armor", "ammo" }) do 17 | --- @type ItemFilters 18 | local sync_filters = {} 19 | local sync_inventory 20 | local inventory_def = defines.inventory[prefix .. name] 21 | if name == "cursor" then 22 | sync_inventory = game.create_inventory(1) 23 | local cursor_stack = player.cursor_stack 24 | if cursor_stack and cursor_stack.valid_for_read then 25 | sync_inventory[1].transfer_stack(cursor_stack) 26 | end 27 | elseif inventory_def then 28 | local source_inventory = player.get_inventory(inventory_def) --[[@as LuaInventory]] 29 | local get_filter = source_inventory.get_filter 30 | local set_filter = source_inventory.set_filter 31 | local supports_filters = source_inventory.supports_filters() 32 | local source_inventory_len = #source_inventory --[[@as uint16]] 33 | sync_inventory = game.create_inventory(source_inventory_len) 34 | for i = 1, source_inventory_len do 35 | --- @cast i uint 36 | sync_inventory[i].transfer_stack(source_inventory[i]) 37 | if supports_filters then 38 | sync_filters[i] = get_filter(i) 39 | set_filter(i, nil) 40 | end 41 | end 42 | end 43 | if sync_inventory then 44 | --- @type InventorySyncData 45 | sync_tables[name] = { 46 | filters = sync_filters, 47 | hand_location = hand_location.inventory == inventory_def and hand_location.slot or nil, 48 | inventory = sync_inventory, 49 | } 50 | end 51 | end 52 | storage.inventory_sync[player.index] = sync_tables 53 | end 54 | 55 | --- @param player LuaPlayer 56 | local function post_sync(player) 57 | -- determine prefix based on controller type 58 | local prefix = table.find(defines.controllers, player.controller_type) .. "_" 59 | -- iterate all inventories 60 | local sync_data = storage.inventory_sync[player.index] 61 | if not sync_data then 62 | return 63 | end 64 | storage.inventory_sync[player.index] = nil 65 | -- Cursor first to allow setting the hand, then armor to correct the inventory size 66 | for _, name in ipairs({ "cursor", "armor", "main", "guns", "ammo" }) do 67 | local sync_table = sync_data[name] 68 | -- God mode doesn't have every inventory 69 | if not sync_table then 70 | goto continue 71 | end 72 | local sync_filters = sync_table.filters 73 | local sync_inventory = sync_table.inventory 74 | if name == "cursor" and player.cursor_stack then 75 | player.cursor_stack.transfer_stack(sync_inventory[1]) 76 | else 77 | local inventory_def = defines.inventory[prefix .. name] 78 | if not inventory_def then 79 | goto continue 80 | end 81 | local destination_inventory = player.get_inventory(inventory_def) --[[@as LuaInventory]] 82 | local set_filter = destination_inventory.set_filter 83 | local supports_filters = destination_inventory.supports_filters() 84 | for i = 1, math.min(#destination_inventory, #sync_inventory) do 85 | --- @cast i uint 86 | if supports_filters then 87 | set_filter(i, sync_filters[i]) 88 | end 89 | destination_inventory[i].clear() 90 | destination_inventory[i].transfer_stack(sync_inventory[i]) 91 | end 92 | local hand_location = sync_table.hand_location 93 | if hand_location and hand_location <= #destination_inventory then 94 | player.hand_location = { inventory = inventory_def, slot = hand_location } 95 | end 96 | end 97 | sync_inventory.destroy() 98 | ::continue:: 99 | end 100 | end 101 | 102 | --- @param e EventData.on_pre_player_toggled_map_editor 103 | local function on_pre_player_toggled_map_editor(e) 104 | local player = game.get_player(e.player_index) 105 | if not player or not player.cheat_mode then 106 | return 107 | end 108 | if not player.mod_settings["ee-inventory-sync"].value then 109 | return 110 | end 111 | pre_sync(player) 112 | end 113 | 114 | --- @param e EventData.on_player_toggled_map_editor 115 | local function on_player_toggled_map_editor(e) 116 | local player = game.get_player(e.player_index) 117 | if not player or not player.cheat_mode then 118 | return 119 | end 120 | if not player.mod_settings["ee-inventory-sync"].value then 121 | return 122 | end 123 | post_sync(player) 124 | end 125 | 126 | local inventory_sync = {} 127 | 128 | inventory_sync.on_init = function() 129 | --- @type table> 130 | storage.inventory_sync = {} 131 | end 132 | 133 | inventory_sync.events = { 134 | [defines.events.on_pre_player_toggled_map_editor] = on_pre_player_toggled_map_editor, 135 | [defines.events.on_player_toggled_map_editor] = on_player_toggled_map_editor, 136 | } 137 | 138 | return inventory_sync 139 | -------------------------------------------------------------------------------- /scripts/linked-belt.lua: -------------------------------------------------------------------------------- 1 | local util = require("scripts.util") 2 | 3 | --- @param objects LuaRenderObject[] 4 | --- @param color Color 5 | --- @param dashed boolean 6 | --- @param player_index uint 7 | --- @param source LuaEntity 8 | --- @param destination LuaEntity? 9 | local function draw_connection(objects, color, dashed, player_index, source, destination) 10 | for _, entity in pairs({ source, destination }) do 11 | objects[#objects + 1] = rendering.draw_circle({ 12 | color = color, 13 | radius = 0.15, 14 | width = 2, 15 | filled = not dashed, 16 | target = entity.position, 17 | surface = entity.surface, 18 | players = { player_index }, 19 | }) 20 | end 21 | if destination and source.surface == destination.surface then 22 | objects[#objects + 1] = rendering.draw_line({ 23 | color = color, 24 | width = 2, 25 | gap_length = dashed and 0.3 or 0, 26 | dash_length = dashed and 0.3 or 0, 27 | from = source.position, 28 | to = destination.position, 29 | surface = source.surface, 30 | players = { player_index }, 31 | }) 32 | end 33 | end 34 | 35 | --- @type table 36 | local colors = { 37 | red = { r = 1, g = 0.5, b = 0.5 }, 38 | green = { r = 0.3, g = 0.8, b = 0.3 }, 39 | teal = { r = 0.5, g = 1, b = 1 }, 40 | } 41 | 42 | --- @param player LuaPlayer 43 | local function render_connection(player) 44 | local objects = storage.linked_belt_render_objects[player.index] or {} 45 | for i = #objects, 1, -1 do 46 | objects[i].destroy() 47 | objects[i] = nil 48 | end 49 | 50 | local source = storage.linked_belt_source[player.index] 51 | local selected = player.selected 52 | if selected and selected.name ~= "ee-linked-belt" then 53 | selected = nil 54 | end 55 | 56 | if selected then 57 | local neighbour = selected.linked_belt_neighbour 58 | if neighbour and neighbour ~= source then 59 | draw_connection(objects, colors.green, false, player.index, selected, neighbour) 60 | end 61 | end 62 | 63 | if source and source.valid then 64 | local neighbour = source.linked_belt_neighbour 65 | if neighbour then 66 | draw_connection(objects, colors.red, false, player.index, source, neighbour) 67 | end 68 | if selected and selected ~= neighbour then 69 | draw_connection(objects, colors.teal, true, player.index, source, selected) 70 | end 71 | draw_connection(objects, colors.teal, true, player.index, source) 72 | end 73 | 74 | if objects[1] then 75 | storage.linked_belt_render_objects[player.index] = objects 76 | else 77 | storage.linked_belt_render_objects[player.index] = nil 78 | end 79 | end 80 | 81 | --- @param player LuaPlayer 82 | --- @param entity LuaEntity 83 | --- @param shift boolean? 84 | local function start_connection(player, entity, shift) 85 | local neighbour = entity.linked_belt_neighbour 86 | local source 87 | if neighbour then 88 | if shift then 89 | source = neighbour 90 | else 91 | source = entity 92 | end 93 | else 94 | source = entity 95 | end 96 | storage.linked_belt_source[player.index] = source 97 | 98 | render_connection(player) 99 | end 100 | 101 | --- @param player LuaPlayer 102 | --- @param entity LuaEntity 103 | --- @param shift boolean? 104 | local function finish_connection(player, entity, shift) 105 | local source = storage.linked_belt_source[player.index] 106 | if not source or not source.valid then 107 | return 108 | end 109 | 110 | local neighbour = entity.linked_belt_neighbour 111 | if entity.unit_number == source.unit_number then 112 | return 113 | end 114 | if neighbour and not shift then 115 | util.flying_text(player, { "message.ee-connection-blocked" }, true, entity.position) 116 | return 117 | end 118 | if neighbour then 119 | entity.disconnect_linked_belts() 120 | end 121 | 122 | entity.linked_belt_type = source.linked_belt_type == "input" and "output" or "input" 123 | entity.connect_linked_belts(source) 124 | 125 | storage.linked_belt_source[player.index] = nil 126 | 127 | render_connection(player) 128 | end 129 | 130 | --- @param player LuaPlayer 131 | local function cancel_connection(player) 132 | local source = storage.linked_belt_source[player.index] 133 | if not source then 134 | return 135 | end 136 | storage.linked_belt_source[player.index] = nil 137 | render_connection(player) 138 | end 139 | 140 | --- @param e EventData.on_player_rotated_entity 141 | local function on_player_rotated_entity(e) 142 | local entity = e.entity 143 | if not entity.valid or entity.name ~= "ee-linked-belt" then 144 | return 145 | end 146 | 147 | entity.direction = e.previous_direction 148 | 149 | local neighbour = entity.linked_belt_neighbour 150 | if neighbour then 151 | -- disconnect, flip both ends, reconnect 152 | entity.disconnect_linked_belts() 153 | entity.linked_belt_type = entity.linked_belt_type == "output" and "input" or "output" 154 | neighbour.linked_belt_type = neighbour.linked_belt_type == "output" and "input" or "output" 155 | entity.connect_linked_belts(neighbour) 156 | else 157 | entity.linked_belt_type = entity.linked_belt_type == "output" and "input" or "output" 158 | end 159 | end 160 | 161 | --- @param e EventData.on_selected_entity_changed 162 | local function on_selected_entity_changed(e) 163 | local player = game.get_player(e.player_index) 164 | if not player then 165 | return 166 | end 167 | 168 | render_connection(player) 169 | end 170 | 171 | --- @param e EventData.CustomInputEvent 172 | local function on_clear_cursor(e) 173 | local player = game.get_player(e.player_index) 174 | if not player then 175 | return 176 | end 177 | cancel_connection(player) 178 | end 179 | 180 | --- @param e EventData.CustomInputEvent 181 | local function on_left_click(e) 182 | local player = game.get_player(e.player_index) 183 | if not player then 184 | return 185 | end 186 | 187 | local selected = player.selected 188 | if not selected or selected.name ~= "ee-linked-belt" then 189 | return 190 | end 191 | 192 | local source = storage.linked_belt_source[e.player_index] 193 | if source then 194 | finish_connection(player, selected) 195 | else 196 | start_connection(player, selected) 197 | end 198 | end 199 | 200 | --- @param e EventData.CustomInputEvent 201 | local function on_shift_left_click(e) 202 | local player = game.get_player(e.player_index) 203 | if not player then 204 | return 205 | end 206 | 207 | local selected = player.selected 208 | if not selected or selected.name ~= "ee-linked-belt" then 209 | return 210 | end 211 | 212 | local source = storage.linked_belt_source[e.player_index] 213 | if source then 214 | finish_connection(player, selected, true) 215 | else 216 | start_connection(player, selected, true) 217 | end 218 | end 219 | 220 | --- @param e EventData.CustomInputEvent 221 | local function on_shift_right_click(e) 222 | local player = game.get_player(e.player_index) 223 | if not player then 224 | return 225 | end 226 | 227 | local selected = player.selected 228 | if not selected or selected.name ~= "ee-linked-belt" or not selected.linked_belt_neighbour then 229 | return 230 | end 231 | 232 | selected.disconnect_linked_belts() 233 | render_connection(player) 234 | end 235 | 236 | local linked_belt = {} 237 | 238 | linked_belt.on_init = function() 239 | --- @type table 240 | storage.linked_belt_source = {} 241 | --- @type table 242 | storage.linked_belt_render_objects = {} 243 | end 244 | 245 | linked_belt.events = { 246 | [defines.events.on_player_rotated_entity] = on_player_rotated_entity, 247 | [defines.events.on_selected_entity_changed] = on_selected_entity_changed, 248 | ["ee-linked-clear-cursor"] = on_clear_cursor, 249 | ["ee-linked-copy-entity-settings"] = on_shift_right_click, 250 | ["ee-linked-open-gui"] = on_left_click, 251 | ["ee-linked-paste-entity-settings"] = on_shift_left_click, 252 | } 253 | 254 | return linked_belt 255 | -------------------------------------------------------------------------------- /scripts/migrations.lua: -------------------------------------------------------------------------------- 1 | local flib_migration = require("__flib__.migration") 2 | 3 | local infinity_accumulator = require("scripts.infinity-accumulator") 4 | local infinity_loader = require("scripts.infinity-loader") 5 | local inventory_filters = require("scripts.inventory-filters") 6 | local inventory_sync = require("scripts.inventory-sync") 7 | local linked_belt = require("scripts.linked-belt") 8 | 9 | local version_migrations = { 10 | ["2.0.0"] = function() 11 | -- Preserve testing lab state 12 | local testing_lab_state = {} 13 | for player_index, player_table in pairs(storage.players) do 14 | local player = game.get_player(player_index) 15 | if player and player_table.lab_state and player_table.normal_state then 16 | testing_lab_state[player_index] = { 17 | normal = player_table.normal_state, 18 | lab = player_table.lab_state, 19 | player = player, 20 | refresh = false, 21 | } 22 | end 23 | end 24 | -- NUKE EVERYTHING 25 | storage = { testing_lab_state = testing_lab_state, wagons = storage.wagons } 26 | rendering.clear("EditorExtensions") 27 | for _, player in pairs(game.players) do 28 | for _, gui in pairs({ player.gui.top, player.gui.left, player.gui.center, player.gui.screen, player.gui.relative }) do 29 | for _, child in pairs(gui.children) do 30 | if child.get_mod() == "EditorExtensions" then 31 | child.destroy() 32 | end 33 | end 34 | end 35 | end 36 | -- Start over 37 | infinity_accumulator.on_init() 38 | infinity_loader.on_init() 39 | inventory_filters.on_init() 40 | inventory_sync.on_init() 41 | linked_belt.on_init() 42 | end, 43 | ["2.3.0"] = function() 44 | storage.aggregate_filters = nil 45 | storage.infinity_pipe_amount_type = nil 46 | for _, gui in pairs(storage.infinity_pipe_gui or {}) do 47 | local window = gui.elems.ee_infinity_pipe_window 48 | if window and window.valid then 49 | window.destroy() 50 | end 51 | end 52 | storage.infinity_pipe_gui = nil 53 | end, 54 | ["2.3.1"] = function() 55 | for surface_name, surface in pairs(game.surfaces) do 56 | if string.find(surface_name, "EE_TESTSURFACE_") then 57 | for force_name, force in pairs(game.forces) do 58 | if not string.find(force_name, "EE_TESTFORCE_") then 59 | force.set_surface_hidden(surface, true) 60 | end 61 | end 62 | end 63 | end 64 | end, 65 | ["2.5.0"] = function() 66 | local to_remove = {} 67 | for unit_number, wagon_data in pairs(storage.wagons) do 68 | local proxy = wagon_data.proxy 69 | if proxy and proxy.valid and proxy.name == "ee-infinity-wagon-chest" then 70 | local wagon = proxy.surface.find_entity("ee-infinity-cargo-wagon", proxy.position) 71 | if wagon then 72 | wagon.infinity_container_filters = proxy.infinity_container_filters 73 | wagon.remove_unfiltered_items = proxy.remove_unfiltered_items 74 | proxy.destroy() 75 | end 76 | table.insert(to_remove, unit_number) 77 | end 78 | end 79 | for _, unit_number in pairs(to_remove) do 80 | storage.wagons[unit_number] = nil 81 | end 82 | end, 83 | } 84 | 85 | local migrations = {} 86 | 87 | migrations.on_configuration_changed = function(e) 88 | flib_migration.on_config_changed(e, version_migrations) 89 | end 90 | 91 | return migrations 92 | -------------------------------------------------------------------------------- /scripts/scenarios/testing.lua: -------------------------------------------------------------------------------- 1 | -- This file exists only to prevent a crash with pre-1.13.7 testing scenarios. 2 | 3 | script.on_configuration_changed(function() 4 | game.reload_script() 5 | end) 6 | 7 | return {} 8 | -------------------------------------------------------------------------------- /scripts/super-pump.lua: -------------------------------------------------------------------------------- 1 | local gui = require("__flib__.gui") 2 | local math = require("__flib__.math") 3 | local table = require("__flib__.table") 4 | 5 | --- @param entity LuaEntity 6 | --- @param speed double 7 | local function set_speed(entity, speed) 8 | entity.fluidbox[2] = { 9 | name = "ee-super-pump-speed-fluid", 10 | amount = 100000000000, 11 | temperature = speed + 0.01, -- avoid floating point imprecision 12 | } 13 | end 14 | 15 | --- @param entity LuaEntity 16 | local function get_speed(entity) 17 | return math.floor(entity.fluidbox[2].temperature) 18 | end 19 | 20 | local slider_to_temperature = { 21 | [0] = 0, 22 | [1] = 100, 23 | [2] = 200, 24 | [3] = 300, 25 | [4] = 400, 26 | [5] = 500, 27 | [6] = 600, 28 | [7] = 700, 29 | [8] = 800, 30 | [9] = 900, 31 | [10] = 1000, 32 | [11] = 2000, 33 | [12] = 3000, 34 | [13] = 4000, 35 | [14] = 5000, 36 | [15] = 6000, 37 | [16] = 7000, 38 | [17] = 8000, 39 | [18] = 9000, 40 | [19] = 10000, 41 | [20] = 15000, 42 | [21] = 20000, 43 | [22] = 25000, 44 | [23] = 30000, 45 | } 46 | local temperature_to_slider = table.invert(slider_to_temperature) 47 | 48 | --- @param speed double 49 | --- @return double 50 | local function to_slider_value(speed) 51 | local index 52 | if speed == 0 then 53 | index = 0 54 | elseif speed < 1000 then 55 | index = math.floor(speed / 100) * 100 56 | elseif speed < 10000 then 57 | index = math.floor(speed / 1000) * 1000 58 | elseif speed < 30000 then 59 | index = math.floor(speed / 5000) * 5000 60 | else 61 | index = 30000 62 | end 63 | return temperature_to_slider[index] 64 | end 65 | 66 | --- @param value double 67 | --- @return double 68 | local function from_slider_value(value) 69 | return slider_to_temperature[value] 70 | end 71 | 72 | --- @param entity LuaEntity 73 | --- @param flow LuaGuiElement 74 | local function update_gui(entity, flow) 75 | local speed = get_speed(entity) 76 | 77 | local textfield = flow.speed_textfield --[[@as LuaGuiElement]] 78 | textfield.style = "ee_slider_textfield" 79 | textfield.text = tostring(speed) 80 | 81 | local slider = flow.speed_slider --[[@as LuaGuiElement]] 82 | slider.slider_value = to_slider_value(speed) 83 | end 84 | 85 | local handlers = { 86 | --- @param entity LuaEntity 87 | --- @param e EventData.on_gui_value_changed 88 | on_pump_speed_slider_value_changed = function(entity, e) 89 | local new_speed = from_slider_value(e.element.slider_value) 90 | set_speed(entity, new_speed) 91 | update_gui(entity, e.element.parent) 92 | end, 93 | 94 | --- @param entity LuaEntity 95 | --- @param e EventData.on_gui_text_changed 96 | on_pump_speed_textfield_changed = function(entity, e) 97 | local textfield = e.element 98 | local text = textfield.text 99 | local speed = tonumber(text) 100 | 101 | if not speed or speed > 600000 then 102 | textfield.style = "ee_invalid_slider_textfield" 103 | return 104 | end 105 | 106 | set_speed(entity, speed) 107 | update_gui(entity, e.element.parent) 108 | end, 109 | } 110 | 111 | gui.add_handlers(handlers, function(e, handler) 112 | local player = game.get_player(e.player_index) 113 | if not player or player.opened_gui_type ~= defines.gui_type.entity then 114 | return 115 | end 116 | local entity = player.opened 117 | if not entity or not entity.valid then 118 | return 119 | end 120 | if entity.name ~= "ee-super-pump" then 121 | return 122 | end 123 | handler(entity, e) 124 | end) 125 | 126 | --- @param player LuaPlayer 127 | local function create_gui(player) 128 | local existing = player.gui.relative.ee_super_pump_window 129 | if existing then 130 | existing.destroy() 131 | end 132 | 133 | gui.add(player.gui.relative, { 134 | type = "frame", 135 | name = "ee_super_pump_window", 136 | style = "frame_with_even_paddings", 137 | style_mods = { width = 448 }, 138 | anchor = { 139 | gui = defines.relative_gui_type.pump_gui, 140 | position = defines.relative_gui_position.bottom, 141 | name = "ee-super-pump", 142 | }, 143 | { 144 | type = "frame", 145 | name = "inner_frame", 146 | style = "inside_shallow_frame_with_padding", 147 | { 148 | type = "flow", 149 | name = "inner_flow", 150 | style_mods = { vertical_align = "center" }, 151 | { type = "label", caption = { "gui.ee-speed" }, tooltip = { "gui.ee-speed-tooltip" } }, 152 | { 153 | type = "slider", 154 | name = "speed_slider", 155 | style_mods = { horizontally_stretchable = true, margin = { 0, 8, 0, 8 } }, 156 | minimum_value = 0, 157 | maximum_value = 23, 158 | value = 0, 159 | handler = { [defines.events.on_gui_value_changed] = handlers.on_pump_speed_slider_value_changed }, 160 | }, 161 | { 162 | type = "textfield", 163 | name = "speed_textfield", 164 | style = "ee_slider_textfield", 165 | numeric = true, 166 | clear_and_focus_on_right_click = true, 167 | handler = { [defines.events.on_gui_text_changed] = handlers.on_pump_speed_textfield_changed }, 168 | }, 169 | }, 170 | }, 171 | }) 172 | end 173 | 174 | --- @param e BuiltEvent 175 | local function on_entity_built(e) 176 | local entity = e.entity or e.destination 177 | if not entity or not entity.valid or entity.name ~= "ee-super-pump" then 178 | return 179 | end 180 | local speed = 12000 181 | local tags = e.tags 182 | if tags and tags.EditorExtensions then 183 | speed = tags.EditorExtensions.speed --[[@as double]] 184 | end 185 | set_speed(entity, speed) 186 | end 187 | 188 | --- @param e EventData.on_player_setup_blueprint 189 | local function on_player_setup_blueprint(e) 190 | local blueprint = e.stack or e.record 191 | if not blueprint then 192 | return 193 | end 194 | 195 | local entities = blueprint.get_blueprint_entities() 196 | if not entities then 197 | return 198 | end 199 | for i, entity in pairs(entities) do 200 | --- @cast i uint 201 | if entity.name ~= "ee-super-pump" then 202 | goto continue 203 | end 204 | local real_entity = e.surface.find_entity(entity.name, entity.position) 205 | if not real_entity then 206 | goto continue 207 | end 208 | blueprint.set_blueprint_entity_tag(i, "EditorExtensions", { speed = get_speed(real_entity) }) 209 | ::continue:: 210 | end 211 | end 212 | 213 | --- @param e EventData.on_entity_settings_pasted 214 | local function on_entity_settings_pasted(e) 215 | local source, destination = e.source, e.destination 216 | if not source.valid or not destination.valid then 217 | return 218 | end 219 | if source.name ~= "ee-super-pump" or destination.name ~= "ee-super-pump" then 220 | return 221 | end 222 | set_speed(destination, get_speed(source)) 223 | end 224 | 225 | --- @param e EventData.on_gui_opened 226 | local function on_gui_opened(e) 227 | local player = game.get_player(e.player_index) 228 | if not player or player.opened_gui_type ~= defines.gui_type.entity then 229 | return 230 | end 231 | local entity = e.entity 232 | if not entity or not entity.valid then 233 | return 234 | end 235 | if entity.name ~= "ee-super-pump" then 236 | return 237 | end 238 | 239 | update_gui(entity, player.gui.relative.ee_super_pump_window.inner_frame.inner_flow) 240 | end 241 | 242 | --- @param e EventData.on_player_created 243 | local function on_player_created(e) 244 | local player = game.get_player(e.player_index) 245 | if not player then 246 | return 247 | end 248 | 249 | create_gui(player) 250 | end 251 | 252 | local super_pump = {} 253 | 254 | super_pump.on_configuration_changed = function() 255 | for _, player in pairs(game.players) do 256 | create_gui(player) 257 | end 258 | end 259 | 260 | super_pump.events = { 261 | [defines.events.on_built_entity] = on_entity_built, 262 | [defines.events.on_entity_cloned] = on_entity_built, 263 | [defines.events.on_entity_settings_pasted] = on_entity_settings_pasted, 264 | [defines.events.on_gui_opened] = on_gui_opened, 265 | [defines.events.on_player_created] = on_player_created, 266 | [defines.events.on_player_setup_blueprint] = on_player_setup_blueprint, 267 | [defines.events.on_robot_built_entity] = on_entity_built, 268 | [defines.events.script_raised_built] = on_entity_built, 269 | [defines.events.script_raised_revive] = on_entity_built, 270 | [defines.events.on_space_platform_built_entity] = on_entity_built, 271 | } 272 | 273 | return super_pump 274 | -------------------------------------------------------------------------------- /scripts/testing-lab.lua: -------------------------------------------------------------------------------- 1 | --- @class LabState 2 | --- @field lab StateData 3 | --- @field normal StateData 4 | --- @field player LuaPlayer 5 | --- @field refresh boolean? 6 | 7 | --- @class StateData 8 | --- @field force LuaForce 9 | --- @field position MapPosition 10 | --- @field surface LuaSurface 11 | --- @field vehicle LuaEntity? 12 | --- @field is_driver boolean? 13 | 14 | --- @alias LabSetting 15 | --- | "force" 16 | --- | "off" 17 | --- | "personal" 18 | 19 | local empty_map_gen_settings = { 20 | default_enable_all_autoplace_controls = false, 21 | property_expression_names = { cliffiness = 0 }, 22 | autoplace_settings = { 23 | tile = { settings = { ["out-of-map"] = { frequency = "normal", size = "normal", richness = "normal" } } }, 24 | }, 25 | starting_area = "none", 26 | } 27 | 28 | --- @param player LuaPlayer 29 | --- @param lab_setting LabSetting 30 | --- @return LabState? 31 | local function create_lab(player, lab_setting) 32 | local key 33 | if lab_setting == "personal" then 34 | key = player.index 35 | elseif game.forces["EE_TESTSURFACE_shared"] then 36 | -- For versions prior to 1.13.0, all forces used the "shared" lab 37 | key = "shared" 38 | else 39 | -- Use the actual force name, not the testing lab force name 40 | key = string.gsub(player.force.name, "EE_TESTFORCE_", "") 41 | end 42 | local surface_name = "EE_TESTSURFACE_" .. key 43 | local force_name = "EE_TESTFORCE_" .. key 44 | 45 | local surface = game.get_surface(surface_name) 46 | if not surface then 47 | surface = game.create_surface(surface_name, empty_map_gen_settings) 48 | for force_name, force in pairs(game.forces) do 49 | if not string.find(force_name, "EE_TESTFORCE_") then 50 | force.set_surface_hidden(surface, true) 51 | end 52 | end 53 | player.force.set_surface_hidden(surface, true) 54 | if not surface then 55 | player.print("Could not create test surface") 56 | return 57 | end 58 | -- Lab conditions 59 | surface.generate_with_lab_tiles = true 60 | surface.freeze_daytime = true 61 | surface.show_clouds = false 62 | surface.daytime = 0 63 | -- Warn the player about the passage of time 64 | player.print({ "message.ee-time-passes-in-lab" }) 65 | end 66 | 67 | local force = game.forces[force_name] 68 | if not game.forces[force_name] then 69 | if #game.forces == 64 then 70 | player.print( 71 | "Cannot create a testing lab force. Factorio only supports up to 64 forces at once. Please use a shared lab." 72 | ) 73 | return 74 | end 75 | 76 | force = game.create_force(force_name) 77 | if settings.global["ee-testing-lab-match-research"].value then 78 | -- Sync research techs with the parent force 79 | for name, tech in pairs(player.force.technologies) do 80 | force.technologies[name].researched = tech.researched 81 | end 82 | else 83 | force.research_all_technologies() 84 | end 85 | end 86 | 87 | return { 88 | lab = { force = force, position = { x = 0, y = 0 }, surface = surface }, 89 | normal = { force = player.force, position = player.position, surface = player.surface }, 90 | player = player, 91 | } 92 | end 93 | 94 | --- @param player LuaPlayer 95 | --- @param to_state StateData 96 | local function transfer_player(player, to_state) 97 | if not to_state.force.valid or not to_state.surface.valid then 98 | return 99 | end 100 | 101 | -- Change force first to avoid spilling items into the real world on inventory size change - see #143 102 | player.force = to_state.force 103 | player.teleport(to_state.position, to_state.surface) 104 | end 105 | 106 | --- @param player LuaPlayer 107 | local function enter_lab(player) 108 | local lab_state = storage.testing_lab_state[player.index] 109 | if not lab_state then 110 | return 111 | end 112 | 113 | local normal_data = lab_state.normal 114 | normal_data.force = player.force --[[@as LuaForce]] 115 | normal_data.position = player.position 116 | normal_data.surface = player.surface 117 | 118 | transfer_player(player, lab_state.lab) 119 | end 120 | 121 | --- @param lab_state LabState 122 | local function exit_lab(lab_state) 123 | local lab_data = lab_state.lab 124 | if lab_state.player.surface == lab_data.surface then 125 | lab_data.position = lab_state.player.position 126 | end 127 | 128 | transfer_player(lab_state.player, lab_state.normal) 129 | end 130 | 131 | --- @param player LuaPlayer 132 | --- @return LabSetting 133 | local function get_lab_setting(player) 134 | return player.mod_settings["ee-testing-lab"].value --[[@as LabSetting]] 135 | end 136 | 137 | --- @param e EventData.on_pre_player_toggled_map_editor 138 | local function on_pre_player_toggled_map_editor(e) 139 | local player = game.get_player(e.player_index) 140 | if not player then 141 | return 142 | end 143 | 144 | local lab_setting = get_lab_setting(player) 145 | if lab_setting == "off" then 146 | return 147 | end 148 | 149 | local in_editor = player.physical_controller_type == defines.controllers.editor 150 | local lab_state = storage.testing_lab_state[e.player_index] 151 | if not lab_state and not in_editor then 152 | lab_state = create_lab(player, lab_setting) 153 | storage.testing_lab_state[e.player_index] = lab_state 154 | end 155 | if not lab_state then 156 | return 157 | end 158 | 159 | local current_state = in_editor and lab_state.lab or lab_state.normal 160 | current_state.vehicle = player.vehicle 161 | current_state.is_driver = player.driving 162 | 163 | if in_editor then 164 | exit_lab(lab_state) 165 | end 166 | end 167 | 168 | --- @param player LuaPlayer 169 | local function sync_vehicle_state(player) 170 | local lab_state = storage.testing_lab_state[player.index] 171 | if not lab_state then 172 | return 173 | end 174 | 175 | local in_editor = player.physical_controller_type == defines.controllers.editor 176 | local new_state = in_editor and lab_state.lab or lab_state.normal 177 | 178 | local vehicle = new_state.vehicle 179 | if not vehicle or not vehicle.valid then 180 | return 181 | end 182 | 183 | if new_state.is_driver and not vehicle.get_driver() then 184 | new_state.vehicle.set_driver(player) 185 | elseif not new_state.is_driver and not vehicle.get_passenger() then 186 | new_state.vehicle.set_passenger(player) 187 | end 188 | end 189 | 190 | --- @param e EventData.on_player_toggled_map_editor 191 | local function on_player_toggled_map_editor(e) 192 | local player = game.get_player(e.player_index) 193 | if not player then 194 | return 195 | end 196 | 197 | if get_lab_setting(player) == "off" then 198 | return 199 | end 200 | 201 | if player.physical_controller_type == defines.controllers.editor then 202 | enter_lab(player) 203 | end 204 | 205 | sync_vehicle_state(player) 206 | end 207 | 208 | --- @param e EventData.on_force_reset 209 | local function on_force_reset(e) 210 | local parent_force = e.force 211 | if string.find(parent_force.name, "EE_TESTFORCE_") then 212 | return 213 | end 214 | if not settings.global["ee-testing-lab-match-research"].value then 215 | return 216 | end 217 | 218 | local testing_force = game.forces["EE_TESTFORCE_" .. parent_force.name] 219 | if not testing_force then 220 | return 221 | end 222 | 223 | for name, tech in pairs(parent_force.technologies) do 224 | testing_force.technologies[name].researched = tech.researched 225 | end 226 | testing_force.reset_technology_effects() 227 | end 228 | 229 | --- @param e EventData.on_research_reversed 230 | local function on_research_reversed(e) 231 | local parent_force = e.research.force 232 | if string.find(parent_force.name, "EE_TESTFORCE_") then 233 | return 234 | end 235 | if not settings.global["ee-testing-lab-match-research"].value then 236 | return 237 | end 238 | 239 | local testing_force = game.forces["EE_TESTFORCE_" .. parent_force.name] 240 | if testing_force then 241 | testing_force.technologies[e.research.name].researched = false 242 | end 243 | 244 | for i in pairs(parent_force.players) do 245 | local testing_force = game.forces["EE_TESTFORCE_" .. i] 246 | if testing_force then 247 | testing_force.technologies[e.research.name].researched = false 248 | end 249 | end 250 | end 251 | 252 | --- @param e EventData.on_research_finished 253 | local function on_research_finished(e) 254 | local parent_force = e.research.force 255 | if string.find(parent_force.name, "EE_TESTFORCE_") then 256 | return 257 | end 258 | if not settings.global["ee-testing-lab-match-research"].value then 259 | return 260 | end 261 | 262 | local testing_force = game.forces["EE_TESTFORCE_" .. parent_force.name] 263 | if testing_force then 264 | testing_force.technologies[e.research.name].researched = true 265 | end 266 | 267 | for i in pairs(parent_force.players) do 268 | local testing_force = game.forces["EE_TESTFORCE_" .. i] 269 | if testing_force then 270 | testing_force.technologies[e.research.name].researched = true 271 | end 272 | end 273 | end 274 | 275 | local function on_match_research_setting_changed() 276 | for _, force in pairs(game.forces) do 277 | local _, _, force_key = string.find(force.name, "EE_TESTFORCE_(.*)") 278 | if not force_key then 279 | goto continue 280 | end 281 | if not settings.global["ee-testing-lab-match-research"].value then 282 | force.research_all_technologies() 283 | goto continue 284 | end 285 | 286 | local parent_force 287 | local force_key_num = tonumber(force_key) --- @cast force_key_num uint? 288 | if force_key_num then 289 | local player = game.get_player(force_key_num) --[[@as LuaPlayer]] 290 | parent_force = remote.call("EditorExtensions", "get_player_proper_force", player) 291 | else 292 | parent_force = game.forces[force_key] 293 | end 294 | if parent_force then 295 | -- Sync research techs with the parent force 296 | for name, tech in pairs(parent_force.technologies) do 297 | force.technologies[name].researched = tech.researched 298 | end 299 | end 300 | force.reset_technology_effects() 301 | ::continue:: 302 | end 303 | end 304 | 305 | --- @param e EventData.on_runtime_mod_setting_changed 306 | local function on_testing_lab_setting_changed(e) 307 | local lab_state = storage.testing_lab_state[e.player_index] 308 | if lab_state then 309 | lab_state.refresh = true 310 | end 311 | end 312 | 313 | --- @param e EventData.on_runtime_mod_setting_changed 314 | local function on_runtime_mod_setting_changed(e) 315 | if e.setting == "ee-testing-lab-match-research" then 316 | on_match_research_setting_changed() 317 | elseif e.setting == "ee-testing-lab" then 318 | on_testing_lab_setting_changed(e) 319 | end 320 | end 321 | 322 | local testing_lab = {} 323 | 324 | testing_lab.on_init = function() 325 | --- @type table 326 | storage.testing_lab_state = {} 327 | end 328 | 329 | testing_lab.events = { 330 | [defines.events.on_force_reset] = on_force_reset, 331 | [defines.events.on_player_toggled_map_editor] = on_player_toggled_map_editor, 332 | [defines.events.on_pre_player_toggled_map_editor] = on_pre_player_toggled_map_editor, 333 | [defines.events.on_research_finished] = on_research_finished, 334 | [defines.events.on_research_reversed] = on_research_reversed, 335 | [defines.events.on_runtime_mod_setting_changed] = on_runtime_mod_setting_changed, 336 | } 337 | 338 | testing_lab.add_remote_interface = function() 339 | remote.add_interface("EditorExtensions", { 340 | --- Get the force that the player is actually on, ignoring the testing lab force. 341 | --- @param player LuaPlayer 342 | --- @return ForceID 343 | get_player_proper_force = function(player) 344 | if not player or not player.valid then 345 | error("Did not pass a valid LuaPlayer") 346 | end 347 | local in_editor = player.physical_controller_type == defines.controllers.editor 348 | local ts_setting = player.mod_settings["ee-testing-lab"].value 349 | if 350 | ts_setting == "off" 351 | or not in_editor 352 | or not storage.testing_lab_state 353 | or not storage.testing_lab_state[player.index] 354 | then 355 | return player.force 356 | end 357 | 358 | return storage.testing_lab_state[player.index].normal.force 359 | end, 360 | }) 361 | end 362 | 363 | return testing_lab 364 | -------------------------------------------------------------------------------- /scripts/update-notification.lua: -------------------------------------------------------------------------------- 1 | local content = 2 | [[Editor Extensions has been updated to 2.0. This version is a BREAKING CHANGE, meaning that your testing setups may not function as they did before. 3 | 4 | The infinity loader has been overhauled to fix belt saturation issues, solve edge cases with blueprints, and make them much more UPS efficient. Due to this, [font=default-bold][color=255,50,50]all previously placed infinity loaders will no longer function.[/color][/font] You will need to replace them in order for your testing setups to work again. 5 | 6 | Due to game engine limitations, the new infinity loader only supports a single item filter. To put different items on each side of a belt, use two infinity loaders. 7 | 8 | Each legacy infinity loader has been located and put into your alerts panel. If you wish to remove them, press the button below, or use the [font=default-bold]/ee-remove-legacy-loaders[/font] command. 9 | 10 | There are many other changes, improvements, and new features as well. Please consult the changelog for more details. 11 | 12 | Finally, the mod's control scripting has been rewritten from scratch, so there may be a few crashes. Please report any crashes you run into, and I will fix them posthaste. Thank you for your patience, and thank you for using Editor Extensions! 13 | 14 | - raiguard]] 15 | 16 | local flib_gui = require("__flib__.gui") 17 | local flib_migration = require("__flib__.migration") 18 | 19 | local function remove_legacy_loaders() 20 | for _, loader in pairs(storage.legacy_infinity_loaders or {}) do 21 | if loader.valid then 22 | loader.destroy() 23 | end 24 | end 25 | storage.legacy_infinity_loaders = nil 26 | end 27 | 28 | local function on_notification_confirm_clicked(e) 29 | local player = game.get_player(e.player_index) 30 | if not player then 31 | return 32 | end 33 | 34 | local window = player.gui.screen.ee_update_notification_window 35 | if not window then 36 | return 37 | end 38 | 39 | window.destroy() 40 | end 41 | 42 | flib_gui.add_handlers({ 43 | on_notification_confirm_clicked = on_notification_confirm_clicked, 44 | on_notification_remove_legacy_loaders_clicked = remove_legacy_loaders, 45 | }) 46 | 47 | --- @param player LuaPlayer 48 | local function create_gui(player) 49 | if player.gui.screen.ee_update_notification_window then 50 | return 51 | end 52 | 53 | flib_gui.add(player.gui.screen, { 54 | type = "frame", 55 | name = "ee_update_notification_window", 56 | style_mods = { width = 500 }, 57 | direction = "vertical", 58 | caption = "Editor Extensions 2.0", 59 | elem_mods = { auto_center = true }, 60 | { 61 | type = "frame", 62 | style = "inside_shallow_frame_with_padding", 63 | { type = "label", style_mods = { single_line = false }, caption = content }, 64 | }, 65 | { 66 | type = "flow", 67 | style = "dialog_buttons_horizontal_flow", 68 | drag_target = "ee_update_notification_window", 69 | { 70 | type = "button", 71 | style = "red_button", 72 | style_mods = { height = 32, bottom_padding = 2, font = "default-dialog-button" }, 73 | caption = "[img=utility/warning] Destroy all legacy loaders", 74 | handler = { 75 | [defines.events.on_gui_click] = remove_legacy_loaders, 76 | }, 77 | }, 78 | { type = "empty-widget", style = "flib_dialog_footer_drag_handle", ignored_by_interaction = true }, 79 | { 80 | type = "button", 81 | style = "confirm_button", 82 | caption = { "gui.confirm" }, 83 | handler = { [defines.events.on_gui_click] = on_notification_confirm_clicked }, 84 | }, 85 | }, 86 | }) 87 | end 88 | 89 | --- @param e BuiltEvent 90 | local function on_entity_built(e) 91 | local entity = e.entity or e.destination 92 | if not entity.valid or entity.name ~= "ee-infinity-loader-dummy-combinator" then 93 | return 94 | end 95 | local loaders = storage.legacy_infinity_loaders 96 | if not loaders then 97 | loaders = {} 98 | storage.legacy_infinity_loaders = loaders 99 | end 100 | loaders[entity.unit_number] = entity 101 | end 102 | 103 | local update_notification = {} 104 | 105 | --- @param e ConfigurationChangedData 106 | update_notification.on_configuration_changed = function(e) 107 | local ee_changes = e.mod_changes["EditorExtensions"] 108 | if 109 | not ee_changes 110 | or not ee_changes.old_version 111 | or flib_migration.is_newer_version("1.99.99", ee_changes.old_version) 112 | then 113 | return 114 | end 115 | 116 | for _, player in pairs(game.players) do 117 | create_gui(player) 118 | end 119 | 120 | --- @type table 121 | local loaders = {} 122 | for _, surface in pairs(game.surfaces) do 123 | for _, loader in pairs(surface.find_entities_filtered({ name = "ee-infinity-loader-dummy-combinator" })) do 124 | loaders[loader.unit_number] = loader 125 | end 126 | for _, chest in pairs(surface.find_entities_filtered({ name = "ee-infinity-loader-chest" })) do 127 | chest.destroy() 128 | end 129 | end 130 | storage.legacy_infinity_loaders = loaders 131 | end 132 | 133 | update_notification.on_nth_tick = { 134 | [180] = function() 135 | if not storage.legacy_infinity_loaders then 136 | return 137 | end 138 | 139 | for i, legacy in pairs(storage.legacy_infinity_loaders) do 140 | if not legacy.valid then 141 | storage.legacy_infinity_loaders[i] = nil 142 | goto continue 143 | end 144 | 145 | for _, player in pairs(legacy.force.players) do 146 | player.add_custom_alert( 147 | legacy, 148 | { type = "item", name = "ee-infinity-loader" }, 149 | "Remove legacy infinity loader", 150 | true 151 | ) 152 | end 153 | 154 | ::continue:: 155 | end 156 | 157 | if not next(storage.legacy_infinity_loaders) then 158 | storage.legacy_infinity_loaders = nil 159 | end 160 | end, 161 | } 162 | 163 | commands.add_command("ee-remove-legacy-loaders", nil, function() 164 | remove_legacy_loaders() 165 | end) 166 | 167 | update_notification.events = { 168 | [defines.events.on_built_entity] = on_entity_built, 169 | [defines.events.on_entity_cloned] = on_entity_built, 170 | [defines.events.on_robot_built_entity] = on_entity_built, 171 | [defines.events.script_raised_built] = on_entity_built, 172 | [defines.events.script_raised_revive] = on_entity_built, 173 | [defines.events.on_space_platform_built_entity] = on_entity_built, 174 | } 175 | 176 | return update_notification 177 | -------------------------------------------------------------------------------- /scripts/util.lua: -------------------------------------------------------------------------------- 1 | --- @class Util 2 | local util = {} 3 | 4 | local coreutil = require("__core__.lualib.util") 5 | util.parse_energy = coreutil.parse_energy 6 | 7 | --- @param handler flib.GuiElemHandler 8 | function util.close_button(handler) 9 | return { 10 | type = "sprite-button", 11 | style = "frame_action_button", 12 | sprite = "utility/close", 13 | -- hovered_sprite = "utility/close_black", 14 | -- clicked_sprite = "utility/close_black", 15 | tooltip = { "gui.close-instruction" }, 16 | mouse_button_filter = { "left" }, 17 | handler = { [defines.events.on_gui_click] = handler }, 18 | } 19 | end 20 | 21 | --- @param mode string 22 | --- @param handler flib.GuiElemHandler 23 | --- @return flib.GuiElemDef 24 | function util.mode_radio_button(mode, handler) 25 | return { 26 | type = "radiobutton", 27 | name = "mode_radio_button_" .. string.gsub(mode, "%-", "_"), 28 | caption = { "gui-infinity-container." .. mode }, 29 | tooltip = { "gui-infinity-pipe." .. mode .. "-tooltip" }, 30 | state = false, 31 | tags = { mode = mode }, 32 | handler = { [defines.events.on_gui_checked_state_changed] = handler }, 33 | } 34 | end 35 | 36 | function util.pusher() 37 | return { type = "empty-widget", style = "flib_horizontal_pusher", ignored_by_interaction = true } 38 | end 39 | 40 | --- @return boolean 41 | function util.in_debug_world() 42 | if not settings.global["ee-override-debug-world"].value then 43 | return false 44 | end 45 | if script.level.mod_name ~= "base" or script.level.level_name ~= "freeplay" then 46 | return false 47 | end 48 | local nauvis = game.get_surface("nauvis") 49 | if not nauvis then 50 | return false 51 | end 52 | local mps = nauvis.map_gen_settings 53 | return mps.height == 50 and mps.width == 50 54 | end 55 | 56 | --- @return boolean 57 | function util.in_testing_scenario() 58 | return script.level.mod_name == "EditorExtensions" and script.level.level_name == "testing" 59 | end 60 | 61 | --- @param player LuaPlayer 62 | --- @param message LocalisedString 63 | --- @param play_sound boolean? 64 | --- @param position MapPosition? 65 | function util.flying_text(player, message, play_sound, position) 66 | player.create_local_flying_text({ 67 | text = message, 68 | create_at_cursor = not position, 69 | position = position, 70 | }) 71 | if play_sound then 72 | player.play_sound({ path = "utility/cannot_build" }) 73 | end 74 | end 75 | 76 | --- @param player LuaPlayer 77 | --- @param to_state boolean? 78 | --- @return boolean 79 | function util.player_can_use_editor(player, to_state) 80 | local can_use_editor = to_state 81 | if can_use_editor == nil then 82 | local permission_group = player.permission_group 83 | if permission_group then 84 | can_use_editor = permission_group.allows_action(defines.input_action.toggle_map_editor) 85 | if not can_use_editor and player.controller_type == defines.controllers.editor then 86 | player.print({ "message.ee-cannot-use-map-editor" }) 87 | -- XXX: We need to re-enable the capability in order to get them out of the editor 88 | permission_group.set_allows_action(defines.input_action.toggle_map_editor, true) 89 | player.toggle_map_editor() 90 | permission_group.set_allows_action(defines.input_action.toggle_map_editor, false) 91 | end 92 | end 93 | end 94 | player.set_shortcut_available("ee-toggle-map-editor", can_use_editor or false) 95 | return can_use_editor and player.admin or false 96 | end 97 | 98 | return util 99 | -------------------------------------------------------------------------------- /settings.lua: -------------------------------------------------------------------------------- 1 | data:extend({ 2 | -- STARTUP SETTINGS 3 | { 4 | type = "string-setting", 5 | name = "ee-lab-tile-graphics", 6 | setting_type = "startup", 7 | allowed_values = { "default", "all-light", "all-dark", "tutorial-grid", "refined-concrete" }, 8 | default_value = "default", 9 | order = "aa", 10 | }, 11 | { 12 | type = "bool-setting", 13 | name = "ee-allow-changing-aggregate-chest-filters", 14 | setting_type = "startup", 15 | default_value = false, 16 | order = "ab", 17 | }, 18 | { 19 | type = "int-setting", 20 | name = "ee-controller-inventory_size", 21 | setting_type = "startup", 22 | default_value = 150, 23 | order = "ba", 24 | }, 25 | { 26 | type = "bool-setting", 27 | name = "ee-controller-enable_flash_light", 28 | setting_type = "startup", 29 | default_value = true, 30 | order = "bb", 31 | }, 32 | { 33 | type = "bool-setting", 34 | name = "ee-controller-render_as_day", 35 | setting_type = "startup", 36 | default_value = true, 37 | order = "bc", 38 | }, 39 | { 40 | type = "bool-setting", 41 | name = "ee-controller-instant_blueprint_building", 42 | setting_type = "startup", 43 | default_value = true, 44 | order = "bda", 45 | }, 46 | { 47 | type = "bool-setting", 48 | name = "ee-controller-instant_deconstruction", 49 | setting_type = "startup", 50 | default_value = true, 51 | order = "bdb", 52 | }, 53 | { 54 | type = "bool-setting", 55 | name = "ee-controller-instant_upgrading", 56 | setting_type = "startup", 57 | default_value = true, 58 | order = "bdc", 59 | }, 60 | { 61 | type = "bool-setting", 62 | name = "ee-controller-instant_rail_planner", 63 | setting_type = "startup", 64 | default_value = true, 65 | order = "bdd", 66 | }, 67 | { 68 | type = "bool-setting", 69 | name = "ee-controller-show_additional_entity_info_gui", 70 | setting_type = "startup", 71 | default_value = false, 72 | order = "be", 73 | }, 74 | { 75 | type = "bool-setting", 76 | name = "ee-controller-fill_built_entity_energy_buffers", 77 | setting_type = "startup", 78 | default_value = true, 79 | order = "bf", 80 | }, 81 | { 82 | type = "bool-setting", 83 | name = "ee-controller-show_character_tab_in_controller_gui", 84 | setting_type = "startup", 85 | default_value = false, 86 | order = "bga", 87 | }, 88 | { 89 | type = "bool-setting", 90 | name = "ee-controller-show_infinity_filters_in_controller_gui", 91 | setting_type = "startup", 92 | default_value = true, 93 | order = "bgb", 94 | }, 95 | -- MAP SETTINGS 96 | { 97 | type = "bool-setting", 98 | name = "ee-aggregate-include-hidden", 99 | setting_type = "runtime-global", 100 | default_value = true, 101 | order = "a", 102 | }, 103 | { 104 | type = "bool-setting", 105 | name = "ee-prevent-initial-pause", 106 | setting_type = "runtime-global", 107 | default_value = true, 108 | order = "b", 109 | }, 110 | { 111 | type = "bool-setting", 112 | name = "ee-testing-lab-match-research", 113 | setting_type = "runtime-global", 114 | default_value = true, 115 | order = "c", 116 | }, 117 | { 118 | type = "bool-setting", 119 | name = "ee-override-debug-world", 120 | setting_type = "runtime-global", 121 | default_value = true, 122 | order = "d", 123 | }, 124 | -- PLAYER SETTINGS 125 | { 126 | type = "string-setting", 127 | name = "ee-default-infinity-filters", 128 | setting_type = "runtime-per-user", 129 | allow_blank = true, 130 | default_value = "", 131 | order = "a", 132 | }, 133 | { 134 | type = "bool-setting", 135 | name = "ee-inventory-sync", 136 | setting_type = "runtime-per-user", 137 | default_value = true, 138 | order = "b", 139 | }, 140 | { 141 | type = "bool-setting", 142 | name = "ee-auto-alt-mode", 143 | setting_type = "runtime-per-user", 144 | default_value = true, 145 | order = "c", 146 | }, 147 | { 148 | type = "bool-setting", 149 | name = "ee-start-in-editor", 150 | setting_type = "runtime-per-user", 151 | default_value = false, 152 | order = "d", 153 | }, 154 | { 155 | type = "string-setting", 156 | name = "ee-testing-lab", 157 | setting_type = "runtime-per-user", 158 | allowed_values = { "off", "personal", "shared" }, 159 | default_value = "off", 160 | order = "e", 161 | }, 162 | }) 163 | -------------------------------------------------------------------------------- /stylua.toml: -------------------------------------------------------------------------------- 1 | indent_type = "Spaces" 2 | indent_width = 2 3 | -------------------------------------------------------------------------------- /thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raiguard/EditorExtensions/2bffaa7fbc54bfa8d98d6f63d76cabf3d045bbf2/thumbnail.png -------------------------------------------------------------------------------- /types.lua: -------------------------------------------------------------------------------- 1 | --- @meta 2 | 3 | --- @alias BuiltEvent EventData.on_built_entity|EventData.on_robot_built_entity|EventData.on_space_platform_built_entity|EventData.on_entity_cloned|EventData.script_raised_built|EventData.script_raised_revive 4 | --- @alias DestroyedEvent EventData.on_player_mined_entity|EventData.on_robot_mined_entity|EventData.on_space_platform_mined_entity|EventData.on_entity_died|EventData.script_raised_destroy 5 | --------------------------------------------------------------------------------