clovis 1 miesiąc temu
rodzic
commit
4bda270eaa

Plik diff jest za duży
+ 602 - 111
package-lock.json


+ 1 - 0
package.json

@@ -20,6 +20,7 @@
     "react": "^19.2.0",
     "react-dom": "^19.2.0",
     "react-router": "^8.3.0",
+    "sharp": "^0.35.3",
     "simplebar-react": "^3.3.2",
     "zustand": "^5.0.14"
   },

BIN
public/data/2.0/icon_128.webp


BIN
public/data/2.0/icon_56.webp


BIN
public/data/2.0/icon_64.webp


+ 6 - 3
scripts/factorio-dump/helpers/command.helper.ts

@@ -28,7 +28,8 @@ async function runCommand(command: string, args?: string[]): Promise<number | nu
   });
 }
 
-const FACTORIO_BIN_PATH = `C:\\Program Files\\Factorio\\bin\\x64\\factorio.exe`;
+//const FACTORIO_BIN_PATH = `C:\\Program Files\\Factorio\\bin\\x64\\factorio.exe`;
+const FACTORIO_BIN_PATH = `/opt/factorio/bin/x64/factorio`;
 /**
  * Dumps data.raw as JSON to the script output folder and exits.
  * the output are genereate in Factorio data folder under script-output/.
@@ -57,13 +58,15 @@ export const dumpFactorioIcon = async () => {
   await waitForFactorio(false, 60000);
 };
 
+var isWin = process.platform === "win32";
+
 /** Check whether Factorio is running after a delay */
 export async function checkIfFactorioIsRunning(delayMs = 1000): Promise<boolean> {
   return new Promise((resolve, reject) => {
     setTimeout(() => {
-      exec("tasklist", (err, stdout, _) => {
+      exec(isWin ? "tasklist" : "ps -A", (err, stdout, _) => {
         if (err != null) reject(err);
-        resolve(stdout.toLowerCase().includes("factorio.exe"));
+        resolve(stdout.toLowerCase().includes("factorio"));
       });
     }, delayMs);
   });

+ 8 - 3
scripts/factorio-dump/helpers/file.helper.ts

@@ -4,9 +4,14 @@ export function getJsonData(file: string): unknown {
   const str = fs.readFileSync(file).toString();
   return JSON.parse(str);
 }
-
-const appDataPath = process.env["AppData"] || `${process.env["HOME"] ?? ""}/Library/Application Support`;
-export const factorioPath = `${appDataPath}/Factorio`;
+export let factorioPath: string = "";
+var isWin = process.platform === "win32";
+if (isWin) {
+  const appDataPath = process.env["AppData"] || `${process.env["HOME"] ?? ""}/Library/Application Support`;
+  factorioPath = `${appDataPath}/Factorio`;
+} else {
+  factorioPath = `/home/clovis/shared/Factorio`;
+}
 export const scriptOutputPath = `${factorioPath}/script-output`;
 export const dataRawPath = `${scriptOutputPath}/data-raw-dump.json`;
 

+ 3 - 2
scripts/factorio-dump/helpers/locale.helper.ts

@@ -33,7 +33,7 @@ export async function aggregateI18n(
   prefixes: string[],
   inputFolder: string,
   outputFolder: string,
-  i18nCode: string
+  i18nCode: string,
 ): Promise<void> {
   // Resolve absolute paths
   const inputPath = path.resolve(inputFolder);
@@ -74,6 +74,7 @@ export async function aggregateI18n(
   const outputFile = path.join(outputPath, `${i18nCode}.json`);
   await fs.writeFile(outputFile, JSON.stringify(result, null, 2), "utf-8");
 }
+const config_folder = process.platform == "win32" ? "config_w" : "config_l";
 /**
  * Updates the first `locale=` line in a file to the supplied locale code.
  *
@@ -81,7 +82,7 @@ export async function aggregateI18n(
  *
  */
 export async function setLocaleInIni(localCode: string): Promise<void> {
-  const resolvedPath = path.resolve(factorioPath, "config", "config.ini");
+  const resolvedPath = path.resolve(factorioPath, config_folder, "config.ini");
   const content = await fs.readFile(resolvedPath, "utf8");
   await fs.writeFile(resolvedPath, content.replace(/^locale=.*$/m, "locale=" + localCode), "utf8");
 }

+ 11 - 12
scripts/factorio-dump/helpers/recipes.helper.ts

@@ -12,16 +12,17 @@ export type Recipe = {
   icon?: string;
   subgroup: string;
   order?: string;
-    /** The [category](prototype:RecipeCategory) of this recipe. Controls which machines can craft this recipe.
+  /** The [categories](prototype:RecipeCategory) of this recipe. Controls which machines can craft this recipe.
 
-The built-in categories can be found [here](https://wiki.factorio.com/Data.raw#recipe-category). The base `"crafting"` category can not contain recipes with fluid ingredients or products. */
-  category?: string;
-  additional_categories?: string[];
+The built-in categories can be found [here](https://wiki.factorio.com/Data.raw#recipe-category). The base `"crafting"` category can not contain recipes with fluid ingredients or products.
+
+The array must contain at least one category, it cannot be empty. */
+  categories?: string[];
   /** The amount of time it takes to make this recipe. Must be `> 0.001`. Equals the number of seconds it takes to craft at crafting speed `1`. */
   energy_required?: number;
   /** Whether the recipe is allowed to have the extra inserter overload bonus applied (4 * stack inserter stack size). */
   allow_inserter_overload?: boolean;
-  
+
   allow_productivity?: boolean;
   allow_quality?: boolean;
   allow_speed?: boolean;
@@ -67,17 +68,15 @@ export function parseRecipe(recipe: RecipePrototype, itemsMap: Record<string, It
     name: recipe.name,
     icon: getRecipeIcon(recipe, mainProduct),
     subgroup: getRecipeSubGroup(recipe, mainProduct),
-    energy_required:recipe.energy_required,
-    allow_inserter_overload:recipe.allow_inserter_overload,
-    overload_multiplier:recipe.overload_multiplier,
+    energy_required: recipe.energy_required,
+    allow_inserter_overload: recipe.allow_inserter_overload,
+    overload_multiplier: recipe.overload_multiplier,
     order: recipe.order ?? mainProduct.order,
-    category: recipe.category ?? "crafting",
-    additional_categories: recipe.additional_categories,
+    categories: recipe.categories ?? ["crafting"],
     ingredients,
     results: recipe.results,
   };
-  if (recipe.category) r.category = recipe.category;
-  if (recipe.additional_categories) r.additional_categories = recipe.additional_categories;
+
   if (recipe.allow_productivity) r.allow_productivity = true;
   if (recipe.allow_quality) r.allow_quality = true;
   if (recipe.allow_speed) r.allow_speed = true;

Plik diff jest za duży
+ 301 - 76
scripts/factorio-dump/lua-api/models.ts


+ 13 - 55
src/assets/MachineSelector.tsx

@@ -1,39 +1,21 @@
-import React, {
-  useCallback,
-  useEffect,
-  useMemo,
-  useState,
-  type CSSProperties,
-} from "react";
+import React, { useCallback, useEffect, useMemo, useState, type CSSProperties } from "react";
 import data from "../assets/data/2.0/data.json";
 import styles from "./MachineSelector.module.css";
 import Icon from "./icon";
-import {
-  Autocomplete,
-  Box,
-  Popper,
-  TextField,
-  InputAdornment,
-} from "@mui/material";
+import { Autocomplete, Box, Popper, TextField, InputAdornment } from "@mui/material";
 import SelectMenu from "./SelectFactorioMenu";
 import Tooltip from "./Tooltip";
 import type { Recipe } from "../../scripts/factorio-dump/helpers/recipes.helper";
 import type { Machine } from "../../scripts/factorio-dump/process-data.models";
 import { useQualityScroller } from "../hooks/useQualityScroller"; // <-- Import Hook
 
-const recipeList = data.recipeGroup.flatMap((r) =>
-  r.subGroup.flatMap((s) => (s.children ?? []) as Recipe[]),
-);
+const recipeList = data.recipeGroup.flatMap((r) => r.subGroup.flatMap((s) => (s.children ?? []) as Recipe[]));
 const machines = data.machines as Machine[];
 
 type MachineSelectorProps = {
   className?: string;
   style?: CSSProperties;
-  onChange?: (selection: {
-    machine: Machine | null;
-    qualityLevel: number;
-    recipe: Recipe | null;
-  }) => void;
+  onChange?: (selection: { machine: Machine | null; qualityLevel: number; recipe: Recipe | null }) => void;
 };
 
 function MachineSelector({ style, className, onChange }: MachineSelectorProps) {
@@ -42,8 +24,7 @@ function MachineSelector({ style, className, onChange }: MachineSelectorProps) {
   const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
   const [showMenuRecipe, setShowMenuRecipe] = useState(false);
 
-  const { scrollRef, activeQuality, setQualityName } =
-    useQualityScroller("normal");
+  const { scrollRef, activeQuality, setQualityName } = useQualityScroller("normal");
 
   useEffect(() => {
     if (onChange) {
@@ -53,12 +34,8 @@ function MachineSelector({ style, className, onChange }: MachineSelectorProps) {
 
   const machineOptions = useMemo(() => {
     if (recipe == null) return [];
-    const categories = [recipe.category];
-    if (recipe.additional_categories)
-      categories.push(...recipe.additional_categories);
-    return machines.filter((m) =>
-      m.crafting_categories.some((c) => categories.includes(c)),
-    );
+    const categories = recipe.categories ?? [];
+    return machines.filter((m) => m.crafting_categories.some((c) => categories.includes(c)));
   }, [recipe]);
 
   useEffect(() => {
@@ -81,16 +58,9 @@ function MachineSelector({ style, className, onChange }: MachineSelectorProps) {
   }, []);
 
   return (
-    <div
-      className={className}
-      style={{ ...style, display: "flex", gap: "12px", alignItems: "center" }}
-    >
+    <div className={className} style={{ ...style, display: "flex", gap: "12px", alignItems: "center" }}>
       {/* Recipe Trigger */}
-      <div
-        onClick={onOpenRecipe}
-        className={styles.machineSpecRecipe}
-        style={{ cursor: "pointer" }}
-      >
+      <div onClick={onOpenRecipe} className={styles.machineSpecRecipe} style={{ cursor: "pointer" }}>
         {recipe == null ? (
           <div
             style={{
@@ -130,15 +100,8 @@ function MachineSelector({ style, className, onChange }: MachineSelectorProps) {
               startAdornment: machine ? (
                 <InputAdornment position="start">
                   {/* Just attach the scrollRef here! */}
-                  <div
-                    title="Shift + Scroll to change quality"
-                    style={{ cursor: "ns-resize", display: "flex" }}
-                  >
-                    <Icon
-                      iconName={machine.icon ?? ""}
-                      size={28}
-                      qualityLevel={activeQuality.level}
-                    />
+                  <div title="Shift + Scroll to change quality" style={{ cursor: "ns-resize", display: "flex" }}>
+                    <Icon iconName={machine.icon ?? ""} size={28} qualityLevel={activeQuality.level} />
                   </div>
                 </InputAdornment>
               ) : null,
@@ -149,19 +112,14 @@ function MachineSelector({ style, className, onChange }: MachineSelectorProps) {
           const { key, ...optionProps } = props;
           return (
             <Box key={key} component="li" {...optionProps} sx={{ gap: 2 }}>
-              <Icon iconName={option.icon ?? ""} size={30} qualityLevel={activeQuality.level}/>
+              <Icon iconName={option.icon ?? ""} size={30} qualityLevel={activeQuality.level} />
               {option.name}
             </Box>
           );
         }}
       />
 
-      <Popper
-        open={showMenuRecipe}
-        anchorEl={anchorEl}
-        placement="bottom-start"
-        style={{ zIndex: 1300 }}
-      >
+      <Popper open={showMenuRecipe} anchorEl={anchorEl} placement="bottom-start" style={{ zIndex: 1300 }}>
         <SelectMenu
           title="Select recipe"
           categories={data.recipeGroup}

+ 11 - 0
src/assets/components/ClockWizard.module.css

@@ -0,0 +1,11 @@
+.h2 {
+  font-size: 20px;
+  color: #f1be64;
+  margin: 0 0 12px 0;
+}
+.input {
+  width: 80px;
+  background: #242324;
+  color: #f1be64;
+  border: 1px solid #646464;
+}

+ 176 - 57
src/assets/components/ClockWizard.tsx

@@ -1,19 +1,19 @@
 import { useMemo, useState } from "react";
 import ModuleSlots from "./ModuleSlots";
-import styles from "./ClockWizard.module.css"; // (Create a simple flex-col layout for this)
+import styles from "./ClockWizard.module.css";
 import { useClockStore } from "../../store/useClockStore";
 import type { Recipe } from "../../../scripts/factorio-dump/helpers/recipes.helper";
-import type {
-  Machine,
-  Module,
-} from "../../../scripts/factorio-dump/process-data.models";
+import type { Machine, Module } from "../../../scripts/factorio-dump/process-data.models";
 import {
   calculateOptimalBatch,
   computeMachineStats,
   generateAdvancedClock,
+  type ClockConfig,
 } from "../../engine/factorioEngine";
 import MachineSelector from "../MachineSelector";
 import BeaconConfigurator, { type BeaconGroup } from "./BeaconConfigurator";
+import ExpressionInput from "./ExpressionInpux";
+import InputConfigurator from "./InputConfigurator";
 
 export default function ClockWizard() {
   const loadState = useClockStore((s) => s.loadState);
@@ -21,86 +21,190 @@ export default function ClockWizard() {
   const [recipe, setRecipe] = useState<Recipe | null>(null);
   const [machine, setMachine] = useState<Machine | null>(null);
   const [machineQuality, setMachineQuality] = useState<number>(0);
-  
-  const [machineModules, setMachineModules] = useState<{ module: Module, qualityLevel: number }[]>([]);
+
+  const [machineModules, setMachineModules] = useState<{ module: Module; qualityLevel: number }[]>([]);
   const [beaconGroups, setBeaconGroups] = useState<BeaconGroup[]>([]);
+
+  // Storing user preferences for inserter mapping (mixed belts, presets)
   const [inputConfigs, setInputConfigs] = useState<Record<string, any>>({});
 
+  // Target Throughput State
+  const [targetThroughput, setTargetThroughput] = useState<number>(0);
+
   // --- LIVE STATS CALCULATION ---
   const stats = useMemo(() => {
     if (!machine || !recipe) return null;
-    return computeMachineStats({
-      machine,
-      machineQualityLevel: machineQuality,
-      machineModules: machineModules,
-      beacons: beaconGroups.map(bg => ({
-        beacon: bg.beacon,
-        beaconQualityLevel: bg.qualityLevel,
-        count: bg.count,
-        modules: bg.modules
-      }))
-    }, recipe);
+    return computeMachineStats(
+      {
+        machine,
+        machineQualityLevel: machineQuality,
+        machineModules,
+        beacons: beaconGroups.map((bg) => ({
+          beacon: bg.beacon,
+          beaconQualityLevel: bg.qualityLevel,
+          count: bg.count,
+          modules: bg.modules,
+        })),
+      },
+      recipe,
+    );
   }, [machine, recipe, machineQuality, machineModules, beaconGroups]);
 
+  // --- THROUGHPUT & SCALING MATH ---
+  const throughputData = useMemo(() => {
+    if (!stats || !recipe || !recipe.results) return null;
+
+    // Find main output
+    const mainResult = recipe.results[0];
+    const baseAmount = (mainResult as any).amount ?? (mainResult as any).amount_min ?? 1;
+    const yieldPerCraft = baseAmount * (1 + stats.productivityBonus);
+
+    // Items per minute for ONE machine
+    const baseItemsPerMin = yieldPerCraft * stats.craftsPerSecond * 60;
+
+    // How many machines are needed?
+    const requiredMachines = targetThroughput > 0 ? Math.ceil(targetThroughput / baseItemsPerMin) : 1;
+
+    return {
+      mainOutputName: mainResult.name,
+      baseItemsPerMin,
+      requiredMachines,
+      actualThroughput: requiredMachines * baseItemsPerMin,
+    };
+  }, [stats, recipe, targetThroughput]);
 
   const handleGenerate = () => {
-    if (!recipe || !machine || !stats) return;
+    if (!recipe || !machine || !stats || !throughputData) return;
 
-    // 1. Math
+    // Math
     const batch = calculateOptimalBatch(recipe, stats, 16);
 
-    // 2. Blueprint / Timeline Blocks
-    const clockData = generateAdvancedClock(batch, {
-      stackSize: 16,
-      //inputConfigs // (Assuming inputConfigs logic is mapped inside generator)
+    // Build the strict Config Interface
+    const clockConfig: ClockConfig = {
+      machineCount: throughputData.requiredMachines,
+      inputs: {},
+      outputs: {},
+    };
+
+    // Map UI input configs to the Engine contract
+    Object.keys(batch.inputs).forEach((itemId) => {
+      const userCfg = inputConfigs[itemId] || {};
+      clockConfig.inputs[itemId] = {
+        inserterId: userCfg.inserterId || `in-${itemId}`,
+        presetId: userCfg.source === "belt" ? "belt_to_chest" : "chest_to_chest",
+        swingTicks: userCfg.source === "belt" ? 12 : 8,
+        stackSize: 16,
+      };
     });
 
-    // 3. Update Store
+    // Default output configs (could also be exposed in UI later)
+    Object.keys(batch.outputs).forEach((itemId) => {
+      clockConfig.outputs[itemId] = {
+        inserterId: `out-${itemId}`,
+        presetId: "chest_to_belt",
+        swingTicks: 12,
+        stackSize: 16,
+      };
+    });
+
+    // 3. Generate Blueprint / Timeline Blocks
+    const clockData = generateAdvancedClock(batch, clockConfig);
+
+    // 4. Update Store
     loadState({
       duration: clockData.duration,
-      rows: Object.fromEntries(clockData.rows.map(r => [r.id, r])),
-      rowOrder: clockData.rows.map(r => r.id),
-      blocks: Object.fromEntries(clockData.blocks.map(b => [b.id, b])),
-      selectedBlockIds: new Set()
+      rows: Object.fromEntries(clockData.rows.map((r) => [r.id, r])),
+      rowOrder: clockData.rows.map((r) => r.id),
+      blocks: Object.fromEntries(clockData.blocks.map((b) => [b.id, b])),
+      selectedBlockIds: new Set(),
     });
   };
 
   return (
-    <div className={styles.wrap} style={{ display: "flex", flexDirection: "column", gap: "24px", padding: "20px", background: "#313031", color: "#ffe6c0", border: "1px solid #646464", borderRadius: "8px" }}>
-      
-      {/* 1. Recipe & Machine */}
+    <div
+      className={styles.wrap}
+      style={{
+        display: "flex",
+        flexDirection: "column",
+        gap: "24px",
+        padding: "20px",
+        background: "#313031",
+        color: "#ffe6c0",
+        border: "1px solid #646464",
+        borderRadius: "8px",
+      }}
+    >
+      {/*  Recipe & Machine */}
       <div style={{ display: "flex", gap: "20px", alignItems: "flex-start" }}>
         <div style={{ flex: 1 }}>
-          <h2 style={{ fontSize: "16px", color: "#f1be64", margin: "0 0 12px 0" }}>1. Setup Machine</h2>
-          <MachineSelector 
-            onChange={(res) => { 
-              setMachine(res.machine); 
-              setMachineQuality(res.qualityLevel); 
-              setRecipe(res.recipe); 
-            }} 
+          <h2 className={styles.h2}>1. Setup Machine</h2>
+          <MachineSelector
+            onChange={(res) => {
+              setMachine(res.machine);
+              setMachineQuality(res.qualityLevel);
+              setRecipe(res.recipe);
+            }}
           />
         </div>
 
         {/* --- STATS PREVIEW DASHBOARD --- */}
-        {stats && (
-          <div style={{ flex: 1, background: "#1a1a1a", border: "1px dashed #f1be64", borderRadius: "6px", padding: "12px", display: "grid", gridTemplateColumns: "1fr 1fr", gap: "10px" }}>
-            <div style={{ gridColumn: "span 2" }}>
-               <h3 style={{ margin: 0, fontSize: "12px", color: "#999", textTransform: "uppercase" }}>Live Capabilities</h3>
+        {stats && throughputData && (
+          <div
+            style={{
+              flex: 1,
+              background: "#1a1a1a",
+              border: "1px dashed #f1be64",
+              borderRadius: "6px",
+              padding: "12px",
+              display: "grid",
+              gridTemplateColumns: "1fr 1fr",
+              gap: "10px",
+            }}
+          >
+            <div
+              style={{ gridColumn: "span 2", display: "flex", justifyContent: "space-between", alignItems: "center" }}
+            >
+              <h3 style={{ margin: 0, fontSize: "12px", color: "#999", textTransform: "uppercase" }}>
+                Live Capabilities
+              </h3>
+
+              {/* Target Throughput Input */}
+              <div style={{ display: "flex", alignItems: "center", gap: "8px" }}>
+                <label style={{ fontSize: "11px", color: "#999" }}>Target (items/min)</label>
+                <ExpressionInput
+                  value={targetThroughput || 0}
+                  onCommit={(value) => setTargetThroughput(value)}
+                  className={styles.input}
+                ></ExpressionInput>
+              </div>
             </div>
+
             <div>
-              <div style={{ fontSize: "11px", color: "#999" }}>Crafting Speed</div>
-              <div style={{ fontSize: "18px", color: "#7fc98a", fontWeight: "bold" }}>{stats.actualCraftingSpeed.toFixed(2)}</div>
+              <div style={{ fontSize: "11px", color: "#999" }}>Machine Output</div>
+              <div style={{ fontSize: "18px", color: "#7fc98a", fontWeight: "bold" }}>
+                {Math.round(throughputData.baseItemsPerMin)}{" "}
+                <span style={{ fontSize: "12px", color: "#999", fontWeight: "normal" }}>
+                  / min ({Math.round(throughputData.baseItemsPerMin / 6) / 10} / sec)
+                </span>
+              </div>
             </div>
             <div>
-              <div style={{ fontSize: "11px", color: "#999" }}>Productivity</div>
-              <div style={{ fontSize: "18px", color: "#7fc98a", fontWeight: "bold" }}>+{Math.round(stats.productivityBonus * 100)}%</div>
+              <div style={{ fontSize: "11px", color: "#999" }}>Machines Needed</div>
+              <div style={{ fontSize: "18px", color: "#f1be64", fontWeight: "bold" }}>
+                {throughputData.requiredMachines}
+                {targetThroughput > 0 && (
+                  <span style={{ fontSize: "11px", color: "#999", marginLeft: "6px", fontWeight: "normal" }}>
+                    ({Math.round(throughputData.actualThroughput)}/m)
+                  </span>
+                )}
+              </div>
             </div>
             <div>
               <div style={{ fontSize: "11px", color: "#999" }}>Craft Time (Ticks)</div>
               <div style={{ fontSize: "14px", color: "#ffe6c0" }}>{stats.singleCraftTicks.toFixed(1)}t</div>
             </div>
             <div>
-              <div style={{ fontSize: "11px", color: "#999" }}>Overload Limit (Multiplier)</div>
+              <div style={{ fontSize: "11px", color: "#999" }}>Overload Limit</div>
               <div style={{ fontSize: "14px", color: "#ffe6c0" }}>{stats.overloadMultiplier}x</div>
             </div>
           </div>
@@ -109,25 +213,40 @@ export default function ClockWizard() {
 
       {machine && recipe && (
         <>
-          {/* 2. Modules & Beacons */}
+          {/*  Modules & Beacons */}
           <div style={{ display: "flex", gap: "40px" }}>
             <div style={{ flex: 1 }}>
-              <h2 style={{ fontSize: "14px", color: "#f1be64", margin: "0 0 12px 0" }}>2. Machine Modules</h2>
-              <ModuleSlots 
-                maxSlots={machine.module_slots || 0} 
+              <h2 className={styles.h2}>2. Machine Modules</h2>
+              <ModuleSlots
+                maxSlots={machine.module_slots || 0}
                 allowedEffects={machine.allowed_effects as string[]}
-                onChange={setMachineModules} 
+                onChange={setMachineModules}
               />
             </div>
             <div style={{ flex: 2 }}>
-              <h2 style={{ fontSize: "14px", color: "#f1be64", margin: "0 0 12px 0" }}>3. Beacons</h2>
+              <h2 className={styles.h2}>3. Beacons</h2>
               <BeaconConfigurator groups={beaconGroups} onChange={setBeaconGroups} />
             </div>
           </div>
 
-          <button 
+          {/*  Input Configurator (Mixed Belts) */}
+          <div style={{ width: "100%" }}>
+            <h2 className={styles.h2}>4. Route Inputs (Mixed Belts)</h2>
+            <InputConfigurator recipe={recipe} configs={inputConfigs} onChange={setInputConfigs} />
+          </div>
+
+          <button
             onClick={handleGenerate}
-            style={{ padding: "10px 16px", background: "#f1be64", color: "#1a1300", fontWeight: "bold", border: "none", borderRadius: "4px", cursor: "pointer", alignSelf: "flex-start" }}
+            style={{
+              padding: "10px 16px",
+              background: "#f1be64",
+              color: "#1a1300",
+              fontWeight: "bold",
+              border: "none",
+              borderRadius: "4px",
+              cursor: "pointer",
+              alignSelf: "flex-start",
+            }}
           >
             Generate Optimized Timeline
           </button>
@@ -135,4 +254,4 @@ export default function ClockWizard() {
       )}
     </div>
   );
-}
+}

+ 78 - 66
src/assets/components/InputConfigurator.tsx

@@ -1,39 +1,50 @@
-import { useState, useMemo } from "react";
-
+import { useEffect, useMemo } from "react";
 import styles from "./InputConfigurator.module.css";
 import type { Recipe } from "../../../scripts/factorio-dump/helpers/recipes.helper";
 import Icon from "../icon";
 
-type InputConfig = {
+export type InputConfig = {
   itemId: string;
-  inserterId: string; // Grouping key (e.g., "1", "2")
+  inserterId: string;
   source: "chest" | "belt";
 };
 
-export default function InputConfigurator({ recipe }: { recipe: Recipe }) {
-  // Default: every solid ingredient gets its own inserter and chest
-  const [configs, setConfigs] = useState<Record<string, InputConfig>>(() => {
-    const initial: Record<string, InputConfig> = {};
-    const solidIngredients =
-      recipe.ingredients?.filter((i) => i.type === "item") || [];
+type InputConfiguratorProps = {
+  recipe: Recipe;
+  configs: Record<string, InputConfig>;
+  onChange: (configs: Record<string, InputConfig>) => void;
+};
+
+export default function InputConfigurator({ recipe, configs, onChange }: InputConfiguratorProps) {
+  const solidIngredients = useMemo(() => {
+    return recipe.ingredients?.filter((i) => i.type === "item") || [];
+  }, [recipe]);
+
+  // Initialize default configurations when the recipe changes
+  useEffect(() => {
+    let needsUpdate = false;
+    const newConfigs = { ...configs };
+
     solidIngredients.forEach((ing, i) => {
-      initial[ing.itemId] = {
-        itemId: ing.itemId,
-        inserterId: `Inserter ${i + 1}`,
-        source: "chest",
-      };
+      if (!newConfigs[ing.itemId]) {
+        // By default, every ingredient gets its own dedicated inserter and chest
+        newConfigs[ing.itemId] = {
+          itemId: ing.itemId,
+          inserterId: `in-${i + 1}`,
+          source: "chest",
+        };
+        needsUpdate = true;
+      }
     });
-    return initial;
-  });
+
+    if (needsUpdate) onChange(newConfigs);
+  }, [recipe, solidIngredients]); // Only re-run if recipe changes, not when configs change
 
   const updateConfig = (itemId: string, patch: Partial<InputConfig>) => {
-    setConfigs((prev) => ({
-      ...prev,
-      [itemId]: { ...prev[itemId], ...patch },
-    }));
+    onChange({ ...configs, [itemId]: { ...configs[itemId], ...patch } });
   };
 
-  // Group items by their assigned inserter for the preview
+  // Group items by their assigned inserter to generate the live preview
   const groupedInserters = useMemo(() => {
     const groups: Record<string, string[]> = {};
     Object.values(configs).forEach((cfg) => {
@@ -43,72 +54,73 @@ export default function InputConfigurator({ recipe }: { recipe: Recipe }) {
     return groups;
   }, [configs]);
 
-  const solidIngredients =
-    recipe.ingredients?.filter((i) => i.type === "item") || [];
+  if (solidIngredients.length === 0) {
+    return (
+      <div className={styles.wrap}>
+        <span style={{ color: "#999" }}>No solid inputs required for this recipe.</span>
+      </div>
+    );
+  }
 
   return (
     <div className={styles.wrap}>
-      <h3>Input Inserter Configuration</h3>
       <table className={styles.table}>
         <thead>
           <tr>
             <th>Ingredient</th>
-            <th>Inserter Group</th>
+            <th>Inserter Grouping ID</th>
             <th>Source Type</th>
           </tr>
         </thead>
         <tbody>
-          {solidIngredients.map((ing) => (
-            <tr key={ing.itemId}>
-              <td>
-                <div className={styles.itemLabel}>
-                  <Icon iconName={`item/${ing.itemId}.png`} size={24} />
-                  <span>
-                    {ing.amount} {ing.itemId}
-                  </span>
-                </div>
-              </td>
-              <td>
-                {/* Typing "1" for two items puts them on the same mixed belt inserter */}
-                <input
-                  type="text"
-                  value={configs[ing.itemId].inserterId}
-                  onChange={(e) =>
-                    updateConfig(ing.itemId, { inserterId: e.target.value })
-                  }
-                  className={styles.groupInput}
-                />
-              </td>
-              <td>
-                <select
-                  value={configs[ing.itemId].source}
-                  onChange={(e) =>
-                    updateConfig(ing.itemId, {
-                      source: e.target.value as "chest" | "belt",
-                    })
-                  }
-                >
-                  <option value="chest">Chest</option>
-                  <option value="belt">Belt</option>
-                </select>
-              </td>
-            </tr>
-          ))}
+          {solidIngredients.map((ing) => {
+            const config = configs[ing.itemId];
+            if (!config) return null;
+
+            return (
+              <tr key={ing.itemId}>
+                <td>
+                  <div className={styles.itemLabel}>
+                    <Icon iconName={`item/${ing.itemId}.png`} size={24} />
+                    <span>
+                      {ing.amount} {ing.itemId}
+                    </span>
+                  </div>
+                </td>
+                <td>
+                  <input
+                    type="text"
+                    value={config.inserterId}
+                    onChange={(e) => updateConfig(ing.itemId, { inserterId: e.target.value })}
+                    className={styles.groupInput}
+                    title="Give ingredients the same ID to put them on a mixed belt / shared inserter"
+                  />
+                </td>
+                <td>
+                  <select
+                    value={config.source}
+                    onChange={(e) => updateConfig(ing.itemId, { source: e.target.value as "chest" | "belt" })}
+                  >
+                    <option value="chest">Chest (Fast: ~8 ticks)</option>
+                    <option value="belt">Belt (Slow: ~12 ticks)</option>
+                  </select>
+                </td>
+              </tr>
+            );
+          })}
         </tbody>
       </table>
 
       {/* Visual sanity check for the user */}
       <div className={styles.preview}>
-        <h4>Resulting Rows on Timeline:</h4>
+        <h4>Resulting Inserter Rows:</h4>
         {Object.entries(groupedInserters).map(([inserterId, items]) => (
           <div key={inserterId} className={styles.previewRow}>
             <strong>{inserterId}:</strong>
             {items.map((id) => (
               <Icon key={id} iconName={`item/${id}.png`} size={20} />
             ))}
-            <span className={styles.presetTag}>
-              ({configs[items[0]].source} → machine)
-            </span>
+            <span className={styles.presetTag}>({configs[items[0]]?.source} → machine)</span>
           </div>
         ))}
       </div>

Plik diff jest za duży
+ 442 - 157
src/assets/data/2.0/data.json


Plik diff jest za duży
+ 321 - 473
src/assets/data/2.0/i18n/de.json


+ 15 - 168
src/assets/data/2.0/i18n/en.json

@@ -33,13 +33,11 @@
       "parameter-7": "Parameter 7",
       "parameter-8": "Parameter 8",
       "parameter-9": "Parameter 9",
-      "ee-super-pump-speed-fluid": "Speedfluid",
       "fluid-unknown": "Unknown fluid"
     },
     "descriptions": {
       "thruster-fuel": "Liquid thruster fuel",
       "fusion-plasma": "Ultra-high-temperature ions generated in [entity=fusion-reactor] and consumed by a [entity=fusion-generator]. It is not a normal fluid and cannot be moved in [entity=pipe], it can only be moved through the Fusion reactor and Fusion generator.\nThe temperature of plasma determines its energy value.\nA quantity of plasma also represents that amount of coolant that travels with it, and the heated coolant is output by the Fusion generator as the plasma is used for energy.",
-      "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.",
       "fluid-unknown": "This fluid is not available due to mod removal, it will be restored if the mod is re-enabled."
     }
   },
@@ -120,7 +118,6 @@
       "ice-platform": "Ice platform",
       "foundation": "Foundation",
       "cliff-explosives": "Cliff explosives",
-      "region-cloner_selection-tool": "Region Cloner Selection Tool",
       "repair-pack": "Repair pack",
       "blueprint": "Blueprint",
       "deconstruction-planner": "Deconstruction planner",
@@ -268,6 +265,7 @@
       "cargo-landing-pad": "Cargo landing pad",
       "space-platform-foundation": "Space platform foundation",
       "cargo-bay": "Cargo bay",
+      "landing-pad-unloading-bay": "Landing pad unloading bay",
       "asteroid-collector": "Asteroid collector",
       "crusher": "Crusher",
       "thruster": "Thruster",
@@ -369,9 +367,7 @@
       "artillery-targeting-remote": "Artillery targeting remote",
       "item-unknown": "Unknown item",
       "no-item": "No item",
-      "rcalc-heat-dummy": "Heat",
-      "rcalc-pollution-dummy": "Pollution",
-      "rcalc-power-dummy": "Power",
+      "electric-energy-interface-equipment": "Electric energy interface equipment",
       "electric-energy-interface": "Electric energy interface",
       "linked-chest": "Linked chest",
       "proxy-container": "Proxy container",
@@ -385,52 +381,10 @@
       "infinity-cargo-wagon": "Infinity cargo wagon",
       "infinity-chest": "Infinity chest",
       "infinity-pipe": "Infinity pipe",
-      "rcalc-selection-tool": "Rate Calculator selector",
       "selection-tool": "Selection tool",
       "simple-entity-with-force": "Simple entity with force",
       "simple-entity-with-owner": "Simple entity with owner",
-      "burner-generator": "Burner generator",
-      "ee-infinity-chest": "Infinity chest",
-      "ee-infinity-chest-active-provider": "Infinity active provider chest",
-      "ee-infinity-chest-passive-provider": "Infinity passive provider chest",
-      "ee-infinity-chest-storage": "Infinity storage chest",
-      "ee-infinity-chest-buffer": "Infinity buffer chest",
-      "ee-infinity-chest-requester": "Infinity requester chest",
-      "ee-aggregate-chest": "Aggregate chest",
-      "ee-aggregate-chest-passive-provider": "Aggregate passive provider chest",
-      "ee-linked-chest": "Linked chest",
-      "ee-infinity-loader": "Infinity loader",
-      "ee-linked-belt": "Linked belt",
-      "ee-super-inserter": "Super inserter",
-      "ee-infinity-pipe": "Infinity pipe",
-      "ee-super-pump": "Super pump",
-      "ee-infinity-heat-pipe": "Infinity heat pipe",
-      "ee-super-radar": "Super radar",
-      "ee-super-lab": "Super lab",
-      "ee-infinity-accumulator": "Infinity accumulator",
-      "ee-super-electric-pole": "Super electric pole",
-      "ee-super-substation": "Super substation",
-      "ee-super-locomotive": "Super locomotive",
-      "ee-infinity-cargo-wagon": "Infinity cargo wagon",
-      "ee-infinity-fluid-wagon": "Infinity fluid wagon",
-      "ee-super-fuel": "Super fuel",
-      "ee-super-roboport": "Super roboport",
-      "ee-super-construction-robot": "Super construction robot",
-      "ee-super-logistic-robot": "Super logistic robot",
-      "ee-super-beacon": "Super beacon",
-      "ee-super-speed-module": "Super speed module",
-      "ee-super-efficiency-module": "Super efficiency module",
-      "ee-super-productivity-module": "Super productivity module",
-      "ee-super-clean-module": "Super clean module",
-      "ee-super-slow-module": "Super slow module",
-      "ee-super-inefficiency-module": "Super inefficiency module",
-      "ee-super-dirty-module": "Super dirty module",
-      "ee-infinity-fission-reactor-equipment": "Infinity fission reactor",
-      "ee-super-personal-roboport-equipment": "Super personal roboport",
-      "ee-super-exoskeleton-equipment": "Super exoskeleton",
-      "ee-super-energy-shield-equipment": "Super energy shield",
-      "ee-super-night-vision-equipment": "Super night vision",
-      "ee-super-battery-equipment": "Super personal battery"
+      "burner-generator": "Burner generator"
     },
     "descriptions": {
       "rail": "Use to build straight rails manually or through the rail planner.\n[font=default-semibold][color=#80cef0]Left-click[/color][/font] to build short paths directly.\n[font=default-semibold][color=#80cef0]Shift + Left-click[/color][/font] to place long ghost paths.\n[font=default-semibold][color=#80cef0]KEY-CODE-NOT-DEFINE-IN-HEADLESS-MODE[/color][/font] to switch between ground and elevated paths.",
@@ -504,29 +458,7 @@
       "green-wire": "Used to connect machines to the circuit network using [font=default-semibold][color=#80cef0]Left-click[/color][/font].",
       "red-wire": "Used to connect machines to the circuit network using [font=default-semibold][color=#80cef0]Left-click[/color][/font].",
       "artillery-targeting-remote": "Allows firing artillery manually from the map or the world.",
-      "item-unknown": "This item is not available due to mod removal, it will be restored if the mod is re-enabled.",
-      "ee-infinity-chest": "Creates or destroys items using customizable item filters.",
-      "ee-aggregate-chest": "Contains every item in the game.\n[color=255,57,48]Will cause performance issues if abused, use sparingly![/color]",
-      "ee-infinity-loader": "Creates or destroys items on a belt using customizable filters.",
-      "ee-linked-belt": "Instantly transports items to another linked belt.",
-      "ee-infinity-heat-pipe": "Creates or destroys a configurable amount of heat.",
-      "ee-infinity-accumulator": "Produces, drains, or stores a configurable amount of electric energy.",
-      "ee-infinity-cargo-wagon": "Creates or destroys items using customizable item filters (identical to infinity chest).",
-      "ee-infinity-fluid-wagon": "Creates or destroys fluids using a customizable fluid filter (identical to infinity pipe).\n[color=255,57,48]Will cause performance issues if abused, use sparingly![/color]",
-      "ee-super-fuel": "Nuclear fuel that lasts pretty much forever.",
-      "ee-super-speed-module": "Massively increases machine speed.",
-      "ee-super-efficiency-module": "Massively decreases machine energy consumption. Minimum energy consumption is 20%.",
-      "ee-super-productivity-module": "Massively increases machine productivity.",
-      "ee-super-clean-module": "Massively decreases machine pollution. Minimum pollution is 20%.",
-      "ee-super-slow-module": "Massively decreases machine speed. Minimum speed is 20%.",
-      "ee-super-inefficiency-module": "Massively increases machine energy consumption.",
-      "ee-super-dirty-module": "Massively increases machine pollution.",
-      "ee-infinity-fission-reactor-equipment": "Generates virtually unlimited power for your equipment.",
-      "ee-super-personal-roboport-equipment": "Personal robport with massive construction area and robot capacity.",
-      "ee-super-exoskeleton-equipment": "Very small and very quick exoskeleton.",
-      "ee-super-energy-shield-equipment": "Ridiculously overpowered energy shield, makes you practically immortal.",
-      "ee-super-night-vision-equipment": "Perfect night vision, you can see as if it's daytime.",
-      "ee-super-battery-equipment": "Ridiculously massive battery."
+      "item-unknown": "This item is not available due to mod removal, it will be restored if the mod is re-enabled."
     }
   },
   "recipe": {
@@ -599,10 +531,8 @@
       "stone-brick-recycling": "Stone brick recycling",
       "stone-wall-recycling": "Wall recycling",
       "concrete": "Concrete",
-      "hazard-concrete-recycling": "Hazard concrete recycling",
       "hazard-concrete": "Hazard concrete",
       "refined-concrete": "Refined concrete",
-      "refined-hazard-concrete-recycling": "Refined hazard concrete recycling",
       "refined-hazard-concrete": "Refined hazard concrete",
       "landfill": "Landfill",
       "landfill-recycling": "Landfill recycling",
@@ -613,7 +543,6 @@
       "ice-platform": "Ice platform",
       "foundation": "Foundation",
       "cliff-explosives": "Cliff explosives",
-      "region-cloner_selection-tool-recycling": "Region Cloner Selection Tool recycling",
       "repair-pack": "Repair pack",
       "blueprint-recycling": "Blueprint recycling",
       "deconstruction-planner-recycling": "Deconstruction planner recycling",
@@ -775,8 +704,8 @@
       "calcite-recycling": "Calcite recycling",
       "molten-iron-from-lava": "Molten iron from lava",
       "molten-copper-from-lava": "Molten copper from lava",
-      "molten-iron": "Iron ore melting",
-      "molten-copper": "Copper ore melting",
+      "iron-ore-melting": "Iron ore melting",
+      "copper-ore-melting": "Copper ore melting",
       "casting-iron": "Casting iron",
       "casting-copper": "Casting copper",
       "casting-steel": "Casting steel",
@@ -832,7 +761,7 @@
       "biter-egg": "Biter egg",
       "biter-egg-recycling": "Biter egg recycling",
       "pentapod-egg-recycling": "Pentapod egg recycling",
-      "wood-processing": "Wood processing",
+      "tree-seed": "Tree seed",
       "tree-seed-recycling": "Tree seed recycling",
       "fish-breeding": "Fish breeding",
       "nutrients-from-fish": "Nutrients from fish",
@@ -881,6 +810,7 @@
       "cargo-landing-pad": "Cargo landing pad",
       "space-platform-foundation": "Space platform foundation",
       "cargo-bay": "Cargo bay",
+      "landing-pad-unloading-bay": "Landing pad unloading bay",
       "asteroid-collector": "Asteroid collector",
       "crusher": "Crusher",
       "thruster": "Thruster",
@@ -904,6 +834,7 @@
       "thruster-oxidizer": "Thruster oxidizer",
       "advanced-thruster-oxidizer": "Advanced thruster oxidizer",
       "pistol": "Pistol",
+      "pistol-recycling": "Pistol recycling",
       "submachine-gun": "Submachine gun",
       "railgun": "Railgun",
       "teslagun": "Tesla gun",
@@ -1067,6 +998,7 @@
       "gate-recycling": "Gate recycling",
       "grenade-recycling": "Grenade recycling",
       "gun-turret-recycling": "Gun turret recycling",
+      "hazard-concrete-recycling": "Hazard concrete recycling",
       "heat-exchanger-recycling": "Heat exchanger recycling",
       "heat-interface-recycling": "Heat interface recycling",
       "heat-pipe-recycling": "Heat pipe recycling",
@@ -1078,6 +1010,7 @@
       "item-unknown-recycling": "Unknown item recycling",
       "lab-recycling": "Lab recycling",
       "land-mine-recycling": "Land mine recycling",
+      "landing-pad-unloading-bay-recycling": "Landing pad unloading bay recycling",
       "laser-turret-recycling": "Laser turret recycling",
       "lightning-collector-recycling": "Lightning collector recycling",
       "lightning-rod-recycling": "Lightning rod recycling",
@@ -1102,7 +1035,6 @@
       "piercing-rounds-magazine-recycling": "Piercing rounds magazine recycling",
       "piercing-shotgun-shell-recycling": "Piercing shotgun shells recycling",
       "pipe-to-ground-recycling": "Pipe to ground recycling",
-      "pistol-recycling": "Pistol recycling",
       "poison-capsule-recycling": "Poison capsule recycling",
       "power-armor-mk2-recycling": "Power armor MK2 recycling",
       "power-armor-recycling": "Power armor recycling",
@@ -1126,12 +1058,10 @@
       "railgun-ammo-recycling": "Railgun ammo recycling",
       "railgun-recycling": "Railgun recycling",
       "railgun-turret-recycling": "Railgun turret recycling",
-      "rcalc-heat-dummy-recycling": "Heat recycling",
-      "rcalc-pollution-dummy-recycling": "Pollution recycling",
-      "rcalc-power-dummy-recycling": "Power recycling",
       "recipe-unknown": "Unknown recipe",
       "recycler-recycling": "Recycler recycling",
       "refined-concrete-recycling": "Refined concrete recycling",
+      "refined-hazard-concrete-recycling": "Refined hazard concrete recycling",
       "repair-pack-recycling": "Repair pack recycling",
       "requester-chest-recycling": "Requester chest recycling",
       "roboport-recycling": "Roboport recycling",
@@ -1177,6 +1107,7 @@
       "underground-belt-recycling": "Underground belt recycling",
       "uranium-cannon-shell-recycling": "Uranium cannon shell recycling",
       "uranium-rounds-magazine-recycling": "Uranium rounds magazine recycling",
+      "electric-energy-interface-equipment-recycling": "Electric energy interface equipment recycling",
       "electric-energy-interface-recycling": "Electric energy interface recycling",
       "linked-chest-recycling": "Linked chest recycling",
       "proxy-container-recycling": "Proxy container recycling",
@@ -1190,93 +1121,10 @@
       "infinity-cargo-wagon-recycling": "Infinity cargo wagon recycling",
       "infinity-chest": "Infinity chest",
       "infinity-pipe": "Infinity pipe",
-      "rcalc-selection-tool-recycling": "Rate Calculator selector recycling",
       "selection-tool-recycling": "Selection tool recycling",
       "simple-entity-with-force-recycling": "Simple entity with force recycling",
       "simple-entity-with-owner-recycling": "Simple entity with owner recycling",
-      "burner-generator-recycling": "Burner generator recycling",
-      "ee-infinity-chest": "Infinity chest",
-      "ee-infinity-chest-recycling": "Infinity chest recycling",
-      "ee-infinity-chest-active-provider": "Infinity active provider chest",
-      "ee-infinity-chest-active-provider-recycling": "Infinity active provider chest recycling",
-      "ee-infinity-chest-passive-provider": "Infinity passive provider chest",
-      "ee-infinity-chest-passive-provider-recycling": "Infinity passive provider chest recycling",
-      "ee-infinity-chest-storage": "Infinity storage chest",
-      "ee-infinity-chest-storage-recycling": "Infinity storage chest recycling",
-      "ee-infinity-chest-buffer": "Infinity buffer chest",
-      "ee-infinity-chest-buffer-recycling": "Infinity buffer chest recycling",
-      "ee-infinity-chest-requester": "Infinity requester chest",
-      "ee-infinity-chest-requester-recycling": "Infinity requester chest recycling",
-      "ee-aggregate-chest": "Aggregate chest",
-      "ee-aggregate-chest-recycling": "Aggregate chest recycling",
-      "ee-aggregate-chest-passive-provider": "Aggregate passive provider chest",
-      "ee-aggregate-chest-passive-provider-recycling": "Aggregate passive provider chest recycling",
-      "ee-linked-chest": "Linked chest",
-      "ee-linked-chest-recycling": "Linked chest recycling",
-      "ee-infinity-loader": "Infinity loader",
-      "ee-infinity-loader-recycling": "Infinity loader recycling",
-      "ee-linked-belt": "Linked belt",
-      "ee-linked-belt-recycling": "Linked belt recycling",
-      "ee-super-inserter": "Super inserter",
-      "ee-super-inserter-recycling": "Super inserter recycling",
-      "ee-infinity-pipe": "Infinity pipe",
-      "ee-infinity-pipe-recycling": "Infinity pipe recycling",
-      "ee-super-pump": "Super pump",
-      "ee-super-pump-recycling": "Super pump recycling",
-      "ee-infinity-heat-pipe": "Infinity heat pipe",
-      "ee-infinity-heat-pipe-recycling": "Infinity heat pipe recycling",
-      "ee-super-radar": "Super radar",
-      "ee-super-radar-recycling": "Super radar recycling",
-      "ee-super-lab": "Super lab",
-      "ee-super-lab-recycling": "Super lab recycling",
-      "ee-infinity-accumulator": "Infinity accumulator",
-      "ee-infinity-accumulator-recycling": "Infinity accumulator recycling",
-      "ee-super-electric-pole": "Super electric pole",
-      "ee-super-electric-pole-recycling": "Super electric pole recycling",
-      "ee-super-substation": "Super substation",
-      "ee-super-substation-recycling": "Super substation recycling",
-      "ee-super-locomotive": "Super locomotive",
-      "ee-super-locomotive-recycling": "Super locomotive recycling",
-      "ee-infinity-cargo-wagon": "Infinity cargo wagon",
-      "ee-infinity-cargo-wagon-recycling": "Infinity cargo wagon recycling",
-      "ee-infinity-fluid-wagon": "Infinity fluid wagon",
-      "ee-infinity-fluid-wagon-recycling": "Infinity fluid wagon recycling",
-      "ee-super-fuel": "Super fuel",
-      "ee-super-fuel-recycling": "Super fuel recycling",
-      "ee-super-roboport": "Super roboport",
-      "ee-super-roboport-recycling": "Super roboport recycling",
-      "ee-super-construction-robot": "Super construction robot",
-      "ee-super-construction-robot-recycling": "Super construction robot recycling",
-      "ee-super-logistic-robot": "Super logistic robot",
-      "ee-super-logistic-robot-recycling": "Super logistic robot recycling",
-      "ee-super-beacon": "Super beacon",
-      "ee-super-beacon-recycling": "Super beacon recycling",
-      "ee-super-speed-module": "Super speed module",
-      "ee-super-speed-module-recycling": "Super speed module recycling",
-      "ee-super-efficiency-module": "Super efficiency module",
-      "ee-super-efficiency-module-recycling": "Super efficiency module recycling",
-      "ee-super-productivity-module": "Super productivity module",
-      "ee-super-productivity-module-recycling": "Super productivity module recycling",
-      "ee-super-clean-module": "Super clean module",
-      "ee-super-clean-module-recycling": "Super clean module recycling",
-      "ee-super-slow-module": "Super slow module",
-      "ee-super-slow-module-recycling": "Super slow module recycling",
-      "ee-super-inefficiency-module": "Super inefficiency module",
-      "ee-super-inefficiency-module-recycling": "Super inefficiency module recycling",
-      "ee-super-dirty-module": "Super dirty module",
-      "ee-super-dirty-module-recycling": "Super dirty module recycling",
-      "ee-infinity-fission-reactor-equipment": "Infinity fission reactor",
-      "ee-infinity-fission-reactor-equipment-recycling": "Infinity fission reactor recycling",
-      "ee-super-personal-roboport-equipment": "Super personal roboport",
-      "ee-super-personal-roboport-equipment-recycling": "Super personal roboport recycling",
-      "ee-super-exoskeleton-equipment": "Super exoskeleton",
-      "ee-super-exoskeleton-equipment-recycling": "Super exoskeleton recycling",
-      "ee-super-energy-shield-equipment": "Super energy shield",
-      "ee-super-energy-shield-equipment-recycling": "Super energy shield recycling",
-      "ee-super-night-vision-equipment": "Super night vision",
-      "ee-super-night-vision-equipment-recycling": "Super night vision recycling",
-      "ee-super-battery-equipment": "Super personal battery",
-      "ee-super-battery-equipment-recycling": "Super personal battery recycling"
+      "burner-generator-recycling": "Burner generator recycling"
     },
     "descriptions": {
       "ammoniacal-solution-separation": "[fluid=ammoniacal-solution] is gained by an [entity=offshore-pump] in the oceans of [planet=aquilo].",
@@ -1297,8 +1145,7 @@
       "tiles": "Tiles",
       "environment": "Environment",
       "effects": "Effects",
-      "other": "Unsorted",
-      "ee-tools": "Testing Tools"
+      "other": "Unsorted"
     }
   },
   "quality": {

+ 25 - 178
src/assets/data/2.0/i18n/fr.json

@@ -33,13 +33,11 @@
       "parameter-7": "Paramètre 7",
       "parameter-8": "Paramètre 8",
       "parameter-9": "Paramètre 9",
-      "ee-super-pump-speed-fluid": "Fluide de vitesse",
       "fluid-unknown": "Fluide inconnu"
     },
     "descriptions": {
       "thruster-fuel": "Carburant liquide pour propulseur",
       "fusion-plasma": "Ions à très haute température générés dans un [entity=fusion-reactor] et consommés par un [entity=fusion-generator]. Il ne s'agit pas d'un fluide normal et il ne peut pas être transporté dans un [entity=pipe], il ne peut être transporté que entre le Réacteur de fusion et le Générateur de fusion.\nLa température du plasma détermine sa valeur énergétique.\nLa quantité de plasma représente également la quantité de liquide de refroidissement qui l'accompagne. Du liquide de refroidissement réchauffé est produit par le Générateur de fusion lorsque le plasma est utilisé pour produire de l'énergie.",
-      "ee-super-pump-speed-fluid": "Si vous voyez ce message, retournez maintenant! Ceci est utilisé par Editor Extensions pour contrôler la vitesse de la super pompe et n'a aucune utilité ailleurs.",
       "fluid-unknown": "Le fluide n'est pas disponible dû à la suppression d'un mod, il sera restauré lorsque celui-ci sera réactivé."
     }
   },
@@ -120,7 +118,6 @@
       "ice-platform": "Plateforme de glace",
       "foundation": "Fondation",
       "cliff-explosives": "Explosifs de falaise",
-      "region-cloner_selection-tool": "Region Cloner Selection Tool",
       "repair-pack": "Kit de réparation",
       "blueprint": "Plan",
       "deconstruction-planner": "Planificateur de déconstruction",
@@ -150,7 +147,7 @@
       "recycler": "Recycleur",
       "agricultural-tower": "Tour agricole",
       "biochamber": "Chambre biologique",
-      "captive-biter-spawner": "Nid de déchiqueteur captif",
+      "captive-biter-spawner": "Nid de Biters captif",
       "assembling-machine-1": "Machine d'assemblage",
       "assembling-machine-2": "Machine d'assemblage rapide",
       "assembling-machine-3": "Machine d'assemblage très rapide",
@@ -242,7 +239,7 @@
       "yumako-mash": "Purée de Yumako",
       "jelly": "Gelée",
       "carbon-fiber": "Fibre de carbone",
-      "biter-egg": "Oeuf de déchiqueteur",
+      "biter-egg": "Œuf de Biters",
       "pentapod-egg": "Oeuf de pentapode",
       "tree-seed": "Graine d'arbre",
       "lithium": "Lithium",
@@ -268,6 +265,7 @@
       "cargo-landing-pad": "Aire d'atterrissage cargo",
       "space-platform-foundation": "Fondation de plateforme spatiale",
       "cargo-bay": "Baie cargo",
+      "landing-pad-unloading-bay": "Baie de déchargement de l'aire d'atterrissage",
       "asteroid-collector": "Collecteur d'astéroïdes",
       "crusher": "Broyeur",
       "thruster": "Propulseur",
@@ -282,7 +280,7 @@
       "tank-machine-gun": "Mitrailleuse de véhicule",
       "vehicle-machine-gun": "Mitrailleuse de véhicule",
       "railgun": "Canon électromagnétique",
-      "teslagun": "Pistolet Tesla",
+      "teslagun": "Fusil Tesla",
       "tank-flamethrower": "Lance-flamme du véhicule",
       "shotgun": "Fusil à pompe",
       "combat-shotgun": "Fusil à pompe de combat",
@@ -369,9 +367,7 @@
       "artillery-targeting-remote": "Commande à distance de l'artillerie",
       "item-unknown": "Objet inconnu.",
       "no-item": "Aucun objet",
-      "rcalc-heat-dummy": "Chaleur",
-      "rcalc-pollution-dummy": "Pollution",
-      "rcalc-power-dummy": "Énergie",
+      "electric-energy-interface-equipment": "Équipements d'interface pour l'énergie électrique",
       "electric-energy-interface": "Interface de l’énergie électrique",
       "linked-chest": "Coffre lié",
       "proxy-container": "Conteneur fictif",
@@ -385,52 +381,10 @@
       "infinity-cargo-wagon": "Wagon de marchandises infini",
       "infinity-chest": "Coffre infini",
       "infinity-pipe": "Tuyau infini",
-      "rcalc-selection-tool": "Sélecteur du Calculateur de Taux",
       "selection-tool": "Outil de sélection",
       "simple-entity-with-force": "Entité simple avec une force",
       "simple-entity-with-owner": "Entité simple avec un propriétaire",
-      "burner-generator": "Générateur thermique",
-      "ee-infinity-chest": "Coffre infini",
-      "ee-infinity-chest-active-provider": "Coffre logistique d'approvisionnement actif infini",
-      "ee-infinity-chest-passive-provider": "Coffre logistique d'approvisionnement passif infini",
-      "ee-infinity-chest-storage": "Coffre logistique de stockage infini",
-      "ee-infinity-chest-buffer": "Coffre logistique tampon infini",
-      "ee-infinity-chest-requester": "Coffre logistique demandeur infini",
-      "ee-aggregate-chest": "Coffre agrégé",
-      "ee-aggregate-chest-passive-provider": "Coffre logistique d'approvisionnement passif agrégé",
-      "ee-linked-chest": "Coffre lié",
-      "ee-infinity-loader": "Chargeur infini",
-      "ee-linked-belt": "Convoyeur lié",
-      "ee-super-inserter": "Super bras robotisé",
-      "ee-infinity-pipe": "Tuyau infini",
-      "ee-super-pump": "Super pompe",
-      "ee-infinity-heat-pipe": "Conduite de chaleur infinie",
-      "ee-super-radar": "Super radar",
-      "ee-super-lab": "Super laboratoire",
-      "ee-infinity-accumulator": "Accumulateur infini",
-      "ee-super-electric-pole": "Super poteau électrique",
-      "ee-super-substation": "Super poste électrique",
-      "ee-super-locomotive": "Super locomotive",
-      "ee-infinity-cargo-wagon": "Wagon de marchandises infini",
-      "ee-infinity-fluid-wagon": "Wagon de fluide infini",
-      "ee-super-fuel": "Super combustibles",
-      "ee-super-roboport": "Super roboport",
-      "ee-super-construction-robot": "Super robot de construction",
-      "ee-super-logistic-robot": "Super robot logistique",
-      "ee-super-beacon": "Super diffuseur",
-      "ee-super-speed-module": "Super module vite",
-      "ee-super-efficiency-module": "Super module d'efficacité",
-      "ee-super-productivity-module": "Super module de productivité",
-      "ee-super-clean-module": "Super module propre",
-      "ee-super-slow-module": "Super module lent",
-      "ee-super-inefficiency-module": "Super module d'inefficacité",
-      "ee-super-dirty-module": "Super module sale",
-      "ee-infinity-fission-reactor-equipment": "Réacteur à fission infini",
-      "ee-super-personal-roboport-equipment": "Super roboport personnel",
-      "ee-super-exoskeleton-equipment": "Super exosquelette",
-      "ee-super-energy-shield-equipment": "Super bouclier d'énergie",
-      "ee-super-night-vision-equipment": "Super vision nocturne",
-      "ee-super-battery-equipment": "Super batterie personnelle"
+      "burner-generator": "Générateur thermique"
     },
     "descriptions": {
       "rail": "À utiliser pour construire des rails droits manuellement ou à l'aide du planificateur ferroviaire.\n[font=default-semibold][color=#80cef0]Clic gauche[/color][/font] pour construire des voies courtes directement.\n[font=default-semibold][color=#80cef0]Shift + Clic gauche[/color][/font] pour placer de longues voies fantômes.\n[font=default-semibold][color=#80cef0]KEY-CODE-NOT-DEFINE-IN-HEADLESS-MODE[/color][/font] pour basculer entre des voies au sol et des voies surélevées.",
@@ -504,29 +458,7 @@
       "green-wire": "Utilisé pour connecter les machines au réseau logique à l’aide de [font=default-semibold][color=#80cef0]Clic gauche[/color][/font].",
       "red-wire": "Utilisé pour connecter les machines au réseau logique à l’aide de [font=default-semibold][color=#80cef0]Clic gauche[/color][/font].",
       "artillery-targeting-remote": "Permet le tir d’artillerie manuellement à partir de la carte ou du monde.",
-      "item-unknown": "Cet objet n'est pas disponible dû à la suppression d'un mod, il sera restauré lorsque celui-ci sera réactivé.",
-      "ee-infinity-chest": "Crée ou détruit des objets à l'aide de filtres personnalisables.",
-      "ee-aggregate-chest": "Contient tous les objets du jeu.\n[color=255,57,48]Cela causera des problèmes de performance en cas d'abus, utilisez avec modération![/color]",
-      "ee-infinity-loader": "Crée ou détruit des objets sur un convoyeur à l'aide des filtres personnalisables.",
-      "ee-linked-belt": "Transporte instantanément des items vers une autre convoyeur lié.",
-      "ee-infinity-heat-pipe": "Crée ou détruit une quantité configurable de chaleur.",
-      "ee-infinity-accumulator": "Produit, consomme ou stocke une quantité configurable d'énergie électrique.",
-      "ee-infinity-cargo-wagon": "Crée ou détruit des objets en utilisant des filtres d'objet personnalisables (identique au coffre infini).",
-      "ee-infinity-fluid-wagon": "Crée ou détruit des fluides à l'aide d'un filtre de fluide (identique au tuyau infini).\n[color=255,57,48]Cela causera des problèmes de performance en cas d'abus, utilisez avec modération![/color]",
-      "ee-super-fuel": "Combustible nucléaire qui dure pour presque tout temps.",
-      "ee-super-speed-module": "Augmente massivement la vitesse de la machine.",
-      "ee-super-efficiency-module": "Réduit massivement la consommation d'énergie de la machine. La consommation d'énergie minimale est de 20%.",
-      "ee-super-productivity-module": "Augmente massivement la productivité de la machine.",
-      "ee-super-clean-module": "Réduit massivement la pollution de la machine. La pollution minimale est de 20%.",
-      "ee-super-slow-module": "Réduit massivement la vitesse de la machine. La vitesse minimale est de 20%.",
-      "ee-super-inefficiency-module": "Augmente massivement la consommation d'énergie de la machine.",
-      "ee-super-dirty-module": "Augmente massivement la pollution de la machine.",
-      "ee-infinity-fission-reactor-equipment": "Génère de l'énergie quasiment illimitée pour votre équipement.",
-      "ee-super-personal-roboport-equipment": "Roboport personnelle avec une zone de construction et capacité de robot énorme.",
-      "ee-super-exoskeleton-equipment": "Exosquelette très vite et très petit.",
-      "ee-super-energy-shield-equipment": "Bouclier d'énergie superpuissant ridicule, vous rends pratiquement immortel.",
-      "ee-super-night-vision-equipment": "La vision nocturne parfaite, vous voyez comme si c'était la journée.",
-      "ee-super-battery-equipment": "Batterie de capacité énorme."
+      "item-unknown": "Cet objet n'est pas disponible dû à la suppression d'un mod, il sera restauré lorsque celui-ci sera réactivé."
     }
   },
   "recipe": {
@@ -599,10 +531,8 @@
       "stone-brick-recycling": "Recyclage de Brique en pierre",
       "stone-wall-recycling": "Recyclage de Mur",
       "concrete": "Béton",
-      "hazard-concrete-recycling": "Recyclage de Zone de danger en béton",
       "hazard-concrete": "Zone de danger en béton",
       "refined-concrete": "Béton armé",
-      "refined-hazard-concrete-recycling": "Recyclage de Zone de danger en béton armé",
       "refined-hazard-concrete": "Zone de danger en béton armé",
       "landfill": "Remblai",
       "landfill-recycling": "Recyclage de Remblai",
@@ -613,7 +543,6 @@
       "ice-platform": "Plateforme de glace",
       "foundation": "Fondation",
       "cliff-explosives": "Explosifs de falaise",
-      "region-cloner_selection-tool-recycling": "Recyclage de Region Cloner Selection Tool",
       "repair-pack": "Kit de réparation",
       "blueprint-recycling": "Recyclage de Plan",
       "deconstruction-planner-recycling": "Recyclage de Planificateur de déconstruction",
@@ -641,8 +570,8 @@
       "recycler": "Recycleur",
       "agricultural-tower": "Tour agricole",
       "biochamber": "Chambre biologique",
-      "captive-biter-spawner": "Nid de déchiqueteur captif",
-      "captive-biter-spawner-recycling": "Recyclage de Nid de déchiqueteur captif",
+      "captive-biter-spawner": "Nid de Biters captif",
+      "captive-biter-spawner-recycling": "Recyclage de Nid de Biters captif",
       "assembling-machine-1": "Machine d'assemblage",
       "assembling-machine-2": "Machine d'assemblage rapide",
       "assembling-machine-3": "Machine d'assemblage très rapide",
@@ -775,8 +704,8 @@
       "calcite-recycling": "Recyclage de Calcite",
       "molten-iron-from-lava": "Fer fondu à partir de lave",
       "molten-copper-from-lava": "Cuivre fondu à partir de lave",
-      "molten-iron": "Fonte du minerai de fer",
-      "molten-copper": "Fonte du minerai de cuivre",
+      "iron-ore-melting": "Fonte du minerai de fer",
+      "copper-ore-melting": "Fonte du minerai de cuivre",
       "casting-iron": "Moulage du fer",
       "casting-copper": "Moulage du cuivre",
       "casting-steel": "Moulage de l'acier",
@@ -829,14 +758,14 @@
       "bioflux": "Bioflux",
       "burnt-spoilage": "Brûler la Pourriture",
       "carbon-fiber": "Fibre de carbone",
-      "biter-egg": "Oeuf de déchiqueteur",
-      "biter-egg-recycling": "Recyclage de Oeuf de déchiqueteur",
+      "biter-egg": "Œuf de Biters",
+      "biter-egg-recycling": "Recyclage de Œuf de Biters",
       "pentapod-egg-recycling": "Recyclage de Oeuf de pentapode",
-      "wood-processing": "Traitement du bois",
+      "tree-seed": "Graine d'arbre",
       "tree-seed-recycling": "Recyclage de Graine d'arbre",
       "fish-breeding": "Élevage de poissons",
       "nutrients-from-fish": "Nutriments provenant de poissons",
-      "nutrients-from-biter-egg": "Nutriments provenant d'oeufs de déchiqueteurs",
+      "nutrients-from-biter-egg": "Nutriments provenant d'œufs de Biters",
       "quantum-processor-recycling": "Recyclage de Processeur quantique",
       "ammoniacal-solution-separation": "Séparation de la solution d'ammoniac",
       "solid-fuel-from-ammonia": "Combustible solide à partir de l'ammoniac",
@@ -881,6 +810,7 @@
       "cargo-landing-pad": "Aire d'atterrissage cargo",
       "space-platform-foundation": "Fondation de plateforme spatiale",
       "cargo-bay": "Baie cargo",
+      "landing-pad-unloading-bay": "Baie de déchargement de l'aire d'atterrissage",
       "asteroid-collector": "Collecteur d'astéroïdes",
       "crusher": "Broyeur",
       "thruster": "Propulseur",
@@ -904,9 +834,10 @@
       "thruster-oxidizer": "Comburant pour propulseur",
       "advanced-thruster-oxidizer": "Comburant avancé pour propulseur",
       "pistol": "Pistolet",
+      "pistol-recycling": "Recyclage de Pistolet",
       "submachine-gun": "Fusil d'assaut",
       "railgun": "Canon électromagnétique",
-      "teslagun": "Pistolet Tesla",
+      "teslagun": "Fusil Tesla",
       "shotgun": "Fusil à pompe",
       "combat-shotgun": "Fusil à pompe de combat",
       "rocket-launcher": "Lance-missiles",
@@ -1067,6 +998,7 @@
       "gate-recycling": "Recyclage de Porte",
       "grenade-recycling": "Recyclage de Grenade",
       "gun-turret-recycling": "Recyclage de Tourelle mitrailleuse",
+      "hazard-concrete-recycling": "Recyclage de Zone de danger en béton",
       "heat-exchanger-recycling": "Recyclage de Échangeur de chaleur",
       "heat-interface-recycling": "Recyclage de Interface thermique",
       "heat-pipe-recycling": "Recyclage de Conduite de chaleur",
@@ -1078,6 +1010,7 @@
       "item-unknown-recycling": "Recyclage de Objet inconnu.",
       "lab-recycling": "Recyclage de Laboratoire",
       "land-mine-recycling": "Recyclage de Mine",
+      "landing-pad-unloading-bay-recycling": "Recyclage de Baie de déchargement de l'aire d'atterrissage",
       "laser-turret-recycling": "Recyclage de Tourelle laser",
       "lightning-collector-recycling": "Recyclage de Capteur de foudre",
       "lightning-rod-recycling": "Recyclage de Paratonnerre",
@@ -1102,7 +1035,6 @@
       "piercing-rounds-magazine-recycling": "Recyclage de Chargeur de munitions perforantes",
       "piercing-shotgun-shell-recycling": "Recyclage de Cartouches perforantes",
       "pipe-to-ground-recycling": "Recyclage de Tuyau souterrain",
-      "pistol-recycling": "Recyclage de Pistolet",
       "poison-capsule-recycling": "Recyclage de Capsule de poison",
       "power-armor-mk2-recycling": "Recyclage de Armure de puissance MK2",
       "power-armor-recycling": "Recyclage de Armure de puissance",
@@ -1126,12 +1058,10 @@
       "railgun-ammo-recycling": "Recyclage de Munition pour canon électromagnétique",
       "railgun-recycling": "Recyclage de Canon électromagnétique",
       "railgun-turret-recycling": "Recyclage de Tourelle à canon électromagnétique",
-      "rcalc-heat-dummy-recycling": "Recyclage de Chaleur",
-      "rcalc-pollution-dummy-recycling": "Recyclage de Pollution",
-      "rcalc-power-dummy-recycling": "Recyclage de Énergie",
       "recipe-unknown": "Recette inconnue",
       "recycler-recycling": "Recyclage de Recycleur",
       "refined-concrete-recycling": "Recyclage de Béton armé",
+      "refined-hazard-concrete-recycling": "Recyclage de Zone de danger en béton armé",
       "repair-pack-recycling": "Recyclage de Kit de réparation",
       "requester-chest-recycling": "Recyclage de Coffre logistique de demandes",
       "roboport-recycling": "Recyclage de Roboport",
@@ -1165,7 +1095,7 @@
       "tank-recycling": "Recyclage de Tank",
       "tesla-ammo-recycling": "Recyclage de Munition Tesla",
       "tesla-turret-recycling": "Recyclage de Tourelle Tesla",
-      "teslagun-recycling": "Recyclage de Pistolet Tesla",
+      "teslagun-recycling": "Recyclage de Fusil Tesla",
       "thruster-recycling": "Recyclage de Propulseur",
       "toolbelt-equipment-recycling": "Recyclage de Équipement de ceinture à outils",
       "train-stop-recycling": "Recyclage de Arrêt de train",
@@ -1177,6 +1107,7 @@
       "underground-belt-recycling": "Recyclage de Convoyeur souterrain",
       "uranium-cannon-shell-recycling": "Recyclage de Obus d'uranium",
       "uranium-rounds-magazine-recycling": "Recyclage de Chargeur de munitions à l'uranium",
+      "electric-energy-interface-equipment-recycling": "Recyclage de Équipements d'interface pour l'énergie électrique",
       "electric-energy-interface-recycling": "Recyclage de Interface de l’énergie électrique",
       "linked-chest-recycling": "Recyclage de Coffre lié",
       "proxy-container-recycling": "Recyclage de Conteneur fictif",
@@ -1190,93 +1121,10 @@
       "infinity-cargo-wagon-recycling": "Recyclage de Wagon de marchandises infini",
       "infinity-chest": "Coffre infini",
       "infinity-pipe": "Tuyau infini",
-      "rcalc-selection-tool-recycling": "Recyclage de Sélecteur du Calculateur de Taux",
       "selection-tool-recycling": "Recyclage de Outil de sélection",
       "simple-entity-with-force-recycling": "Recyclage de Entité simple avec une force",
       "simple-entity-with-owner-recycling": "Recyclage de Entité simple avec un propriétaire",
-      "burner-generator-recycling": "Recyclage de Générateur thermique",
-      "ee-infinity-chest": "Coffre infini",
-      "ee-infinity-chest-recycling": "Recyclage de Coffre infini",
-      "ee-infinity-chest-active-provider": "Coffre logistique d'approvisionnement actif infini",
-      "ee-infinity-chest-active-provider-recycling": "Recyclage de Coffre logistique d'approvisionnement actif infini",
-      "ee-infinity-chest-passive-provider": "Coffre logistique d'approvisionnement passif infini",
-      "ee-infinity-chest-passive-provider-recycling": "Recyclage de Coffre logistique d'approvisionnement passif infini",
-      "ee-infinity-chest-storage": "Coffre logistique de stockage infini",
-      "ee-infinity-chest-storage-recycling": "Recyclage de Coffre logistique de stockage infini",
-      "ee-infinity-chest-buffer": "Coffre logistique tampon infini",
-      "ee-infinity-chest-buffer-recycling": "Recyclage de Coffre logistique tampon infini",
-      "ee-infinity-chest-requester": "Coffre logistique demandeur infini",
-      "ee-infinity-chest-requester-recycling": "Recyclage de Coffre logistique demandeur infini",
-      "ee-aggregate-chest": "Coffre agrégé",
-      "ee-aggregate-chest-recycling": "Recyclage de Coffre agrégé",
-      "ee-aggregate-chest-passive-provider": "Coffre logistique d'approvisionnement passif agrégé",
-      "ee-aggregate-chest-passive-provider-recycling": "Recyclage de Coffre logistique d'approvisionnement passif agrégé",
-      "ee-linked-chest": "Coffre lié",
-      "ee-linked-chest-recycling": "Recyclage de Coffre lié",
-      "ee-infinity-loader": "Chargeur infini",
-      "ee-infinity-loader-recycling": "Recyclage de Chargeur infini",
-      "ee-linked-belt": "Convoyeur lié",
-      "ee-linked-belt-recycling": "Recyclage de Convoyeur lié",
-      "ee-super-inserter": "Super bras robotisé",
-      "ee-super-inserter-recycling": "Recyclage de Super bras robotisé",
-      "ee-infinity-pipe": "Tuyau infini",
-      "ee-infinity-pipe-recycling": "Recyclage de Tuyau infini",
-      "ee-super-pump": "Super pompe",
-      "ee-super-pump-recycling": "Recyclage de Super pompe",
-      "ee-infinity-heat-pipe": "Conduite de chaleur infinie",
-      "ee-infinity-heat-pipe-recycling": "Recyclage de Conduite de chaleur infinie",
-      "ee-super-radar": "Super radar",
-      "ee-super-radar-recycling": "Recyclage de Super radar",
-      "ee-super-lab": "Super laboratoire",
-      "ee-super-lab-recycling": "Recyclage de Super laboratoire",
-      "ee-infinity-accumulator": "Accumulateur infini",
-      "ee-infinity-accumulator-recycling": "Recyclage de Accumulateur infini",
-      "ee-super-electric-pole": "Super poteau électrique",
-      "ee-super-electric-pole-recycling": "Recyclage de Super poteau électrique",
-      "ee-super-substation": "Super poste électrique",
-      "ee-super-substation-recycling": "Recyclage de Super poste électrique",
-      "ee-super-locomotive": "Super locomotive",
-      "ee-super-locomotive-recycling": "Recyclage de Super locomotive",
-      "ee-infinity-cargo-wagon": "Wagon de marchandises infini",
-      "ee-infinity-cargo-wagon-recycling": "Recyclage de Wagon de marchandises infini",
-      "ee-infinity-fluid-wagon": "Wagon de fluide infini",
-      "ee-infinity-fluid-wagon-recycling": "Recyclage de Wagon de fluide infini",
-      "ee-super-fuel": "Super combustibles",
-      "ee-super-fuel-recycling": "Recyclage de Super combustibles",
-      "ee-super-roboport": "Super roboport",
-      "ee-super-roboport-recycling": "Recyclage de Super roboport",
-      "ee-super-construction-robot": "Super robot de construction",
-      "ee-super-construction-robot-recycling": "Recyclage de Super robot de construction",
-      "ee-super-logistic-robot": "Super robot logistique",
-      "ee-super-logistic-robot-recycling": "Recyclage de Super robot logistique",
-      "ee-super-beacon": "Super diffuseur",
-      "ee-super-beacon-recycling": "Recyclage de Super diffuseur",
-      "ee-super-speed-module": "Super module vite",
-      "ee-super-speed-module-recycling": "Recyclage de Super module vite",
-      "ee-super-efficiency-module": "Super module d'efficacité",
-      "ee-super-efficiency-module-recycling": "Recyclage de Super module d'efficacité",
-      "ee-super-productivity-module": "Super module de productivité",
-      "ee-super-productivity-module-recycling": "Recyclage de Super module de productivité",
-      "ee-super-clean-module": "Super module propre",
-      "ee-super-clean-module-recycling": "Recyclage de Super module propre",
-      "ee-super-slow-module": "Super module lent",
-      "ee-super-slow-module-recycling": "Recyclage de Super module lent",
-      "ee-super-inefficiency-module": "Super module d'inefficacité",
-      "ee-super-inefficiency-module-recycling": "Recyclage de Super module d'inefficacité",
-      "ee-super-dirty-module": "Super module sale",
-      "ee-super-dirty-module-recycling": "Recyclage de Super module sale",
-      "ee-infinity-fission-reactor-equipment": "Réacteur à fission infini",
-      "ee-infinity-fission-reactor-equipment-recycling": "Recyclage de Réacteur à fission infini",
-      "ee-super-personal-roboport-equipment": "Super roboport personnel",
-      "ee-super-personal-roboport-equipment-recycling": "Recyclage de Super roboport personnel",
-      "ee-super-exoskeleton-equipment": "Super exosquelette",
-      "ee-super-exoskeleton-equipment-recycling": "Recyclage de Super exosquelette",
-      "ee-super-energy-shield-equipment": "Super bouclier d'énergie",
-      "ee-super-energy-shield-equipment-recycling": "Recyclage de Super bouclier d'énergie",
-      "ee-super-night-vision-equipment": "Super vision nocturne",
-      "ee-super-night-vision-equipment-recycling": "Recyclage de Super vision nocturne",
-      "ee-super-battery-equipment": "Super batterie personnelle",
-      "ee-super-battery-equipment-recycling": "Recyclage de Super batterie personnelle"
+      "burner-generator-recycling": "Recyclage de Générateur thermique"
     },
     "descriptions": {
       "ammoniacal-solution-separation": "La [fluid=ammoniacal-solution] est prélevée par une [entity=offshore-pump] depuis les océans de [planet=aquilo].",
@@ -1297,8 +1145,7 @@
       "tiles": "Tuiles",
       "environment": "Environnement",
       "effects": "Effets",
-      "other": "Non triés",
-      "ee-tools": "Outils de test"
+      "other": "Non triés"
     }
   },
   "quality": {

+ 109 - 262
src/assets/data/2.0/i18n/ja.json

@@ -33,13 +33,11 @@
       "parameter-7": "パラメーター 7",
       "parameter-8": "パラメーター 8",
       "parameter-9": "パラメーター 9",
-      "ee-super-pump-speed-fluid": "Speedfluid",
       "fluid-unknown": "不明な流体"
     },
     "descriptions": {
       "thruster-fuel": "スラスターの液体燃料",
-      "fusion-plasma": "[entity=fusion-reactor] の中で生成され、 [entity=fusion-generator] で消費される超高温のイオン。通常の流体ではないため、 [entity=pipe] で移動させることはできず、核融合炉と核融合発電機の間でのみ移動させることができます。\nプラズマは温度によってエネルギー量が決まります。\nプラズマの量は共に移動する冷却剤の量も示し、加熱された冷却剤はプラズマをエネルギーとして利用する際に放出されます。",
-      "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.",
+      "fusion-plasma": "[entity=fusion-reactor] の中で生成され、 [entity=fusion-generator] で消費される超高温のイオンです。通常の流体ではないため、 [entity=pipe] で移動させることはできず、核融合炉と核融合発電機の間でのみ移動させることができます。\nプラズマは温度によってエネルギー量が決まります。\nプラズマの量は共に移動する冷却剤の量も示し、加熱された冷却剤はプラズマをエネルギーとして利用する際に放出されます。",
       "fluid-unknown": "MODが削除されたためこの流体は利用できません。MODを再度有効にすれば復元されます。"
     }
   },
@@ -120,7 +118,6 @@
       "ice-platform": "氷のプラットフォーム",
       "foundation": "基盤",
       "cliff-explosives": "崖用爆薬",
-      "region-cloner_selection-tool": "Region Cloner Selection Tool",
       "repair-pack": "リペアキット",
       "blueprint": "建設計画",
       "deconstruction-planner": "解体プランナー",
@@ -180,7 +177,7 @@
       "empty-module-slot": "空のモジュールスロット",
       "wood": "木材",
       "coal": "石炭",
-      "stone": "石",
+      "stone": "石",
       "iron-ore": "鉄鉱石",
       "copper-ore": "銅鉱石",
       "uranium-ore": "ウラン鉱石",
@@ -218,7 +215,7 @@
       "rocket-fuel": "ロケット燃料",
       "uranium-235": "ウラン-235",
       "uranium-238": "ウラン-238",
-      "uranium-fuel-cell": "燃料棒",
+      "uranium-fuel-cell": "燃料棒",
       "depleted-uranium-fuel-cell": "使用済み燃料棒",
       "nuclear-fuel": "核燃料",
       "calcite": "方解石",
@@ -268,6 +265,7 @@
       "cargo-landing-pad": "カーゴ降着パッド",
       "space-platform-foundation": "宇宙プラットフォーム基盤",
       "cargo-bay": "カーゴベイ",
+      "landing-pad-unloading-bay": "降着パッド荷下ろしベイ",
       "asteroid-collector": "アステロイド収集機",
       "crusher": "破砕機",
       "thruster": "スラスター",
@@ -293,15 +291,15 @@
       "spidertron-rocket-launcher-2": "スパイダートロンロケットランチャー",
       "spidertron-rocket-launcher-3": "スパイダートロンロケットランチャー",
       "spidertron-rocket-launcher-4": "スパイダートロンロケットランチャー",
-      "tank-cannon": "戦車の大砲",
+      "tank-cannon": "戦車砲",
       "firearm-magazine": "通常弾薬",
       "piercing-rounds-magazine": "貫通弾薬",
-      "uranium-rounds-magazine": "劣化ウラン弾薬",
+      "uranium-rounds-magazine": "ウラン弾薬",
       "shotgun-shell": "ショットガン弾薬",
       "piercing-shotgun-shell": "貫通ショットガン弾薬",
       "cannon-shell": "砲弾",
       "explosive-cannon-shell": "炸裂砲弾",
-      "uranium-cannon-shell": "劣化ウラン砲弾",
+      "uranium-cannon-shell": "ウラン砲弾",
       "explosive-uranium-cannon-shell": "炸裂ウラン砲弾",
       "artillery-shell": "長距離砲弾",
       "rocket": "ロケット弾",
@@ -324,22 +322,22 @@
       "power-armor": "パワーアーマー",
       "power-armor-mk2": "パワーアーマーMK2",
       "mech-armor": "メックアーマー",
-      "solar-panel-equipment": "携帯ソーラーパネルモジュール",
+      "solar-panel-equipment": "携帯ソーラーパネル",
       "fission-reactor-equipment": "携帯原子炉",
       "fusion-reactor-equipment": "携帯核融合炉",
       "battery-equipment": "個人用バッテリー",
       "battery-mk2-equipment": "個人用バッテリーMK2",
       "battery-mk3-equipment": "個人用バッテリーMK3",
-      "belt-immunity-equipment": "ベルト移動耐性装備",
-      "exoskeleton-equipment": "強化外骨格モジュール",
+      "belt-immunity-equipment": "ベルト移動耐性",
+      "exoskeleton-equipment": "強化外骨格",
       "personal-roboport-equipment": "携帯ロボットステーション",
       "personal-roboport-mk2-equipment": "携帯ロボットステーションMK2",
-      "night-vision-equipment": "暗視モジュール",
+      "night-vision-equipment": "暗視眼鏡",
       "toolbelt-equipment": "拡張ツールベルト",
-      "energy-shield-equipment": "エネルギーシールドモジュール",
-      "energy-shield-mk2-equipment": "エネルギーシールドモジュールMK2",
-      "personal-laser-defense-equipment": "携帯レーザー防御モジュール",
-      "discharge-defense-equipment": "携帯放電防御モジュール",
+      "energy-shield-equipment": "エネルギーシールド",
+      "energy-shield-mk2-equipment": "エネルギーシールドMK2",
+      "personal-laser-defense-equipment": "携帯レーザー防御",
+      "discharge-defense-equipment": "放電防御",
       "stone-wall": "防壁",
       "gate": "ゲート",
       "radar": "レーダー",
@@ -365,13 +363,11 @@
       "green-wire": "グリーンケーブル",
       "red-wire": "レッドケーブル",
       "spidertron-remote": "スパイダートロンリモコン",
-      "discharge-defense-remote": "放電モジュール制御装置",
+      "discharge-defense-remote": "放電防御リモコン",
       "artillery-targeting-remote": "遠方照準器",
       "item-unknown": "不明なアイテム",
       "no-item": "アイテムなし",
-      "rcalc-heat-dummy": "熱",
-      "rcalc-pollution-dummy": "汚染",
-      "rcalc-power-dummy": "電力",
+      "electric-energy-interface-equipment": "携帯電力インターフェイス装備",
       "electric-energy-interface": "電力インターフェイス",
       "linked-chest": "リンクされたチェスト",
       "proxy-container": "プロキシコンテナ",
@@ -385,52 +381,10 @@
       "infinity-cargo-wagon": "無限貨物車両",
       "infinity-chest": "無限チェスト",
       "infinity-pipe": "無限パイプ",
-      "rcalc-selection-tool": "Rate Calculator ツール",
       "selection-tool": "選択ツール",
       "simple-entity-with-force": "勢力を持つ一般エンティティ",
-      "simple-entity-with-owner": "所有権を持つ一般エンティティ",
-      "burner-generator": "燃料式発電機",
-      "ee-infinity-chest": "無限チェスト",
-      "ee-infinity-chest-active-provider": "無限アクティブ供給チェスト",
-      "ee-infinity-chest-passive-provider": "無限パッシブ供給チェスト",
-      "ee-infinity-chest-storage": "無限貯蔵チェスト",
-      "ee-infinity-chest-buffer": "無限バッファーチェスト",
-      "ee-infinity-chest-requester": "無限要求チェスト",
-      "ee-aggregate-chest": "Aggregate chest",
-      "ee-aggregate-chest-passive-provider": "Aggregate passive provider chest",
-      "ee-linked-chest": "Linked chest",
-      "ee-infinity-loader": "無限ローダー",
-      "ee-linked-belt": "Linked belt",
-      "ee-super-inserter": "スーパーインサータ",
-      "ee-infinity-pipe": "無限パイプ",
-      "ee-super-pump": "スーパーポンプ",
-      "ee-infinity-heat-pipe": "無限ヒートパイプ",
-      "ee-super-radar": "スーパーレーダー",
-      "ee-super-lab": "スーパー研究所",
-      "ee-infinity-accumulator": "無限蓄電池",
-      "ee-super-electric-pole": "スーパー電柱",
-      "ee-super-substation": "スーパー広域電柱",
-      "ee-super-locomotive": "スーパー機関車",
-      "ee-infinity-cargo-wagon": "無限貨車",
-      "ee-infinity-fluid-wagon": "無限タンク貨車",
-      "ee-super-fuel": "Super fuel",
-      "ee-super-roboport": "スーパーロボットステーション",
-      "ee-super-construction-robot": "スーパー建設ロボット",
-      "ee-super-logistic-robot": "スーパー物流ロボット",
-      "ee-super-beacon": "スーパービーコン",
-      "ee-super-speed-module": "Super speed module",
-      "ee-super-efficiency-module": "Super efficiency module",
-      "ee-super-productivity-module": "Super productivity module",
-      "ee-super-clean-module": "Super clean module",
-      "ee-super-slow-module": "Super slow module",
-      "ee-super-inefficiency-module": "Super inefficiency module",
-      "ee-super-dirty-module": "Super dirty module",
-      "ee-infinity-fission-reactor-equipment": "Infinity fission reactor",
-      "ee-super-personal-roboport-equipment": "Super personal roboport",
-      "ee-super-exoskeleton-equipment": "Super exoskeleton",
-      "ee-super-energy-shield-equipment": "Super energy shield",
-      "ee-super-night-vision-equipment": "Super night vision",
-      "ee-super-battery-equipment": "スーパー個人用バッテリー"
+      "simple-entity-with-owner": "所有者を持つ一般エンティティ",
+      "burner-generator": "燃料式発電機"
     },
     "descriptions": {
       "rail": "手動またはレールプランナーを使用して、直線レールを敷設できます。\n[font=default-semibold][color=#80cef0]左クリック[/color][/font] を使用して短いパスを直接敷設できます。\n[font=default-semibold][color=#80cef0]Shift + 左クリック[/color][/font] を使用して長いゴーストパスを敷設できます。\n[font=default-semibold][color=#80cef0]KEY-CODE-NOT-DEFINE-IN-HEADLESS-MODE[/color][/font] で地上と高架のパスを切り替えられます。",
@@ -441,92 +395,70 @@
       "overgrowth-jellynut-soil": "[entity=jellystem] に適した土壌で、赤のバイオームならどこにでも設置できる。",
       "ice-platform": "十分に寒冷な惑星上の安定した氷で出来た浮遊プラットフォーム",
       "foundation": "耐熱シールドと深いねじ杭を備えた工学的構造基盤。溶岩やオイルの海、大抵の水面に設置できます。",
-      "repair-pack": "近くの機器の修理に使用します。",
+      "repair-pack": "味方のエンティティの修理に使用します。",
       "blueprint": "自動建設のための計画を保存します。",
-      "deconstruction-planner": "アイテムをマークし、建設ロボットに回収させます。",
-      "upgrade-planner": "アイテムをマークし、建設ロボットにアップグレードさせます。",
+      "deconstruction-planner": "アイテムを印つけして、建設ロボットに回収させます。",
+      "upgrade-planner": "アイテムを印つけして、建設ロボットにアップグレードさせます。",
       "blueprint-book": "建設計画などを保管します。",
-      "speed-module": "マシンの稼働速度を向上させます。エネルギー消費量は増加します。",
-      "speed-module-2": "マシンの稼働速度を向上させます。エネルギー消費量は増加します。",
-      "speed-module-3": "マシンの稼働速度を向上させます。エネルギー消費量は増加します。",
-      "efficiency-module": "エネルギー消費量を減少させます。最大20%まで省エネできます。",
-      "efficiency-module-2": "エネルギー消費量を減少させます。最大20%まで省エネできます。",
-      "efficiency-module-3": "エネルギー消費量を減少させます。最大20%まで省エネできます。",
-      "productivity-module": "エネルギー消費量の増加と加工速度の低下を引き起こしますが、マシンは定期的に余剰品を生産するようになります。\n中間生産物にのみ使用可能。",
-      "productivity-module-2": "エネルギー消費量の増加と加工速度の低下を引き起こしますが、マシンは定期的に余剰品を生産するようになります。\n中間生産物にのみ使用可能。",
-      "productivity-module-3": "エネルギー消費量の増加と加工速度の低下を引き起こしますが、マシンは定期的に余剰品を生産するようになります。\n中間生産物にのみ使用可能。",
-      "quality-module": "設備がより高品質の製品を作れるようになります。",
-      "quality-module-2": "設備がより高品質の製品を作れるようになります。",
-      "quality-module-3": "設備がより高品質の製品を作れるようになります。",
-      "empty-module-slot": "機械の空のモジュールスロット。アップグレードプランナーで新しいモジュールを配置したり、既存のモジュールを取り外すときに使用します。",
-      "yumako-seed": "ユマコ用土壌に植えることが出来ます。",
-      "jellynut-seed": "ゼリーナット用土壌に植えることが出来ます。",
-      "yumako": "美味しい食用作物。",
-      "jellynut": "ぬるぬるした栽培作物。食べると移動速度の向上をもたらします。",
-      "bioflux": "栄養価の高いグレバの作物のブレンド。食べると耐久力再生と移動速度の向上をもたらします。",
+      "speed-module": "エネルギー消費量の増加を代償として、機械の速度を向上させます。",
+      "speed-module-2": "エネルギー消費量の増加を代償として、機械の速度を向上させます。",
+      "speed-module-3": "エネルギー消費量の増加を代償として、機械の速度を向上させます。",
+      "efficiency-module": "エネルギー消費量を減少させます。エネルギー消費量の最小割合は20%です。",
+      "efficiency-module-2": "エネルギー消費量を減少させます。エネルギー消費量の最小割合は20%です。",
+      "efficiency-module-3": "エネルギー消費量を減少させます。エネルギー消費量の最小割合は20%です。",
+      "productivity-module": "エネルギー消費量の増加と速度の低下を代償として、機械は追加の製品を生産します。\n中間生産物のみ使用可能です。",
+      "productivity-module-2": "エネルギー消費量の増加と速度の低下を代償として、機械は追加の製品を生産します。\n中間生産物のみ使用可能です。",
+      "productivity-module-3": "エネルギー消費量の増加と速度の低下を代償として、機械は追加の製品を生産します。\n中間生産物のみ使用可能です。",
+      "quality-module": "機械がより高品質の製品を作れるようになります。",
+      "quality-module-2": "機械がより高品質の製品を作れるようになります。",
+      "quality-module-3": "機械がより高品質の製品を作れるようになります。",
+      "empty-module-slot": "機械の空のモジュールスロットです。アップグレードプランナーで新しいモジュールを配置したり、既存のモジュールを取り外すときに使用します。",
+      "yumako-seed": "ユマコ用土壌に作付けすることが出来ます。",
+      "jellynut-seed": "ゼリーナット用土壌に作付けすることが出来ます。",
+      "yumako": "栄養価の高い栽培作物です。食べると耐久力再生をもたらします。",
+      "jellynut": "ぬるぬるした栽培作物です。食べると移動速度の向上をもたらします。",
+      "bioflux": "栄養価の高いグレバの作物のブレンドです。食べると耐久力再生と移動速度の向上をもたらします。",
       "yumako-mash": "食べると耐久力再生をもたらします。",
       "jelly": "食べると移動速度の向上をもたらします。",
-      "automation-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "logistic-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "military-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "chemical-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "production-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "utility-science-pack": "研究所でテクノロジーを開発するために消費します。",
+      "automation-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "logistic-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "military-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "chemical-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "production-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "utility-science-pack": "研究所でテクノロジーを開発するために使用されます。",
       "space-science-pack": "研究所で研究のために使用されます。宇宙空間でアステロイドを処理することで得られます。",
-      "metallurgic-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "agricultural-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "electromagnetic-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "cryogenic-science-pack": "研究所でテクノロジーを開発するために消費します。",
-      "promethium-science-pack": "研究所でテクノロジーを開発するために消費します。",
+      "metallurgic-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "agricultural-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "electromagnetic-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "cryogenic-science-pack": "研究所でテクノロジーを開発するために使用されます。",
+      "promethium-science-pack": "研究所でテクノロジーを開発するために使用されます。",
       "science": "全体的な研究出力を表します。",
       "space-platform-foundation": "既存の宇宙プラットフォームを拡張するために宇宙空間で配置します。",
       "space-platform-starter-pack": "宇宙プラットフォーム基盤を配置するために必要なものが全て含まれています。",
-      "metallic-asteroid-chunk": "金属含有量が高いアステロイドの破片。",
-      "carbonic-asteroid-chunk": "炭素含有量が高いアステロイドの破片。",
-      "oxide-asteroid-chunk": "酸素含有量が高いアステロイドの破片。",
-      "promethium-asteroid-chunk": "砕け散った惑星に接近したときにのみ見つかるアステロイドの破片。",
+      "metallic-asteroid-chunk": "金属含有量が高いアステロイドの破片です。",
+      "carbonic-asteroid-chunk": "炭素含有量が高いアステロイドの破片です。",
+      "oxide-asteroid-chunk": "酸素含有量が高いアステロイドの破片です。",
+      "promethium-asteroid-chunk": "砕け散った惑星に接近したときにのみ見つかるアステロイドの破片です。",
       "capture-robot-rocket": "標的となった [entity=biter-spawner] に組み付いて捕獲し、 [entity=captive-biter-spawner] にします。",
       "railgun-ammo": "最大級のアステロイドをも打ち砕くことができます。",
       "slowdown-capsule": "影響を受けた敵の移動速度が減少します。",
-      "solar-panel-equipment": "装備用モジュールに電力を供給します。夜間は発電しません。",
+      "solar-panel-equipment": "装備用モジュールに電力を供給します。",
       "fission-reactor-equipment": "装備用モジュールに電力を供給します。",
       "fusion-reactor-equipment": "装備用モジュールに電力を供給します。",
       "belt-immunity-equipment": "プレイヤーがベルトで流されるのを防ぎます。",
-      "exoskeleton-equipment": "プレイヤーの移動速度を上させます。",
+      "exoskeleton-equipment": "プレイヤーの移動速度を上させます。",
       "personal-roboport-equipment": "建設ロボットがプレイヤーのインベントリを起点に行動できるようになります。",
       "personal-roboport-mk2-equipment": "建設ロボットがプレイヤーのインベントリを起点に行動できるようになります。",
       "night-vision-equipment": "暗闇での視認性を向上させます。",
       "energy-shield-equipment": "プレイヤーを守るエネルギーシールドを展開します。",
       "energy-shield-mk2-equipment": "プレイヤーを守るエネルギーシールドを展開します。",
-      "discharge-defense-equipment": "制御装置から放電すると、近くの敵にダメージを与えた上で、後退・スタンさせます。",
-      "land-mine": "敵が接近すると爆発し、ダメージを与えスタンさせます。",
+      "discharge-defense-equipment": "リモコンで発動すると、近くの敵にダメージを与えて、ノックバックさせて、スタン状態にします。",
+      "land-mine": "敵が接近すると爆発し、ダメージを与えスタンさせます。",
       "copper-wire": "[font=default-semibold][color=#80cef0]左クリック[/color][/font]を押すことで、電柱や電源スイッチを任意に接続したり接続を外したりするのに使えます。",
-      "green-wire": "[font=default-semibold][color=#80cef0]左クリック[/color][/font]で設備を回路ネットワークに接続します。",
-      "red-wire": "[font=default-semibold][color=#80cef0]左クリック[/color][/font]で設備を回路ネットワークに接続します。",
+      "green-wire": "[font=default-semibold][color=#80cef0]左クリック[/color][/font]で機械を回路ネットワークに接続します。",
+      "red-wire": "[font=default-semibold][color=#80cef0]左クリック[/color][/font]で機械を回路ネットワークに接続します。",
       "artillery-targeting-remote": "画面または地図上でプレイヤーの手動による砲撃が可能となります。",
-      "item-unknown": "MODが削除されたためこのアイテムは利用できません。MODを再度有効にすれば復元されます。",
-      "ee-infinity-chest": "Creates or destroys items using customizable item filters.",
-      "ee-aggregate-chest": "Contains every item in the game.\n[color=255,57,48]Will cause performance issues if abused, use sparingly![/color]",
-      "ee-infinity-loader": "Creates or destroys items on a belt using customizable filters.",
-      "ee-linked-belt": "Instantly transports items to another linked belt.",
-      "ee-infinity-heat-pipe": "Creates or destroys a configurable amount of heat.",
-      "ee-infinity-accumulator": "Produces, drains, or stores a configurable amount of electric energy.",
-      "ee-infinity-cargo-wagon": "Creates or destroys items using customizable item filters (identical to infinity chest).",
-      "ee-infinity-fluid-wagon": "Creates or destroys fluids using a customizable fluid filter (identical to infinity pipe).\n[color=255,57,48]Will cause performance issues if abused, use sparingly![/color]",
-      "ee-super-fuel": "Nuclear fuel that lasts pretty much forever.",
-      "ee-super-speed-module": "Massively increases machine speed.",
-      "ee-super-efficiency-module": "Massively decreases machine energy consumption. Minimum energy consumption is 20%.",
-      "ee-super-productivity-module": "Massively increases machine productivity.",
-      "ee-super-clean-module": "Massively decreases machine pollution. Minimum pollution is 20%.",
-      "ee-super-slow-module": "Massively decreases machine speed. Minimum speed is 20%.",
-      "ee-super-inefficiency-module": "Massively increases machine energy consumption.",
-      "ee-super-dirty-module": "Massively increases machine pollution.",
-      "ee-infinity-fission-reactor-equipment": "Generates virtually unlimited power for your equipment.",
-      "ee-super-personal-roboport-equipment": "Personal robport with massive construction area and robot capacity.",
-      "ee-super-exoskeleton-equipment": "Very small and very quick exoskeleton.",
-      "ee-super-energy-shield-equipment": "Ridiculously overpowered energy shield, makes you practically immortal.",
-      "ee-super-night-vision-equipment": "Perfect night vision, you can see as if it's daytime.",
-      "ee-super-battery-equipment": "Ridiculously massive battery."
+      "item-unknown": "MODが削除されたためこのアイテムは利用できません。MODを再度有効にすれば復元されます。"
     }
   },
   "recipe": {
@@ -599,10 +531,8 @@
       "stone-brick-recycling": "石レンガ (リサイクル)",
       "stone-wall-recycling": "防壁 (リサイクル)",
       "concrete": "コンクリート",
-      "hazard-concrete-recycling": "警戒色コンクリート (リサイクル)",
       "hazard-concrete": "警戒色コンクリート",
       "refined-concrete": "鉄筋コンクリート",
-      "refined-hazard-concrete-recycling": "警戒色鉄筋コンクリート (リサイクル)",
       "refined-hazard-concrete": "警戒色鉄筋コンクリート",
       "landfill": "埋立地",
       "landfill-recycling": "埋立地 (リサイクル)",
@@ -613,7 +543,6 @@
       "ice-platform": "氷のプラットフォーム",
       "foundation": "基盤",
       "cliff-explosives": "崖用爆薬",
-      "region-cloner_selection-tool-recycling": "Region Cloner Selection Tool (リサイクル)",
       "repair-pack": "リペアキット",
       "blueprint-recycling": "建設計画 (リサイクル)",
       "deconstruction-planner-recycling": "解体プランナー (リサイクル)",
@@ -671,8 +600,8 @@
       "quality-module-2": "品質モジュール2",
       "quality-module-3": "品質モジュール3",
       "empty-module-slot-recycling": "空のモジュールスロット (リサイクル)",
-      "basic-oil-processing": "基本的な石油加工",
-      "advanced-oil-processing": "発展的な石油加工",
+      "basic-oil-processing": "基本原油処理",
+      "advanced-oil-processing": "応用原油処理",
       "simple-coal-liquefaction": "簡易石炭液化",
       "coal-liquefaction": "石炭液化",
       "heavy-oil-cracking": "重油を軽油に分解",
@@ -689,7 +618,7 @@
       "wooden-chest-recycling": "木製チェスト (リサイクル)",
       "coal-recycling": "石炭 (リサイクル)",
       "stone-furnace-recycling": "石の炉 (リサイクル)",
-      "stone-recycling": "石 (リサイクル)",
+      "stone-recycling": "石 (リサイクル)",
       "iron-ore-recycling": "鉄鉱石 (リサイクル)",
       "copper-ore-recycling": "銅鉱石 (リサイクル)",
       "uranium-ore-recycling": "ウラン鉱石 (リサイクル)",
@@ -763,20 +692,20 @@
       "low-density-structure": "軽量化素材",
       "rocket-fuel": "ロケット燃料",
       "nuclear-fuel-recycling": "核燃料 (リサイクル)",
-      "uranium-processing": "ウラン濃縮処理",
+      "uranium-processing": "ウラン処理",
       "uranium-235-recycling": "ウラン-235 (リサイクル)",
       "uranium-238-recycling": "ウラン-238 (リサイクル)",
-      "uranium-fuel-cell": "燃料棒",
-      "uranium-fuel-cell-recycling": "燃料棒 (リサイクル)",
+      "uranium-fuel-cell": "燃料棒",
+      "uranium-fuel-cell-recycling": "燃料棒 (リサイクル)",
       "depleted-uranium-fuel-cell-recycling": "使用済み燃料棒 (リサイクル)",
       "nuclear-fuel-reprocessing": "核燃料再処理",
-      "kovarex-enrichment-process": "Kovarex濃縮プロセス",
+      "kovarex-enrichment-process": "Kovarex濃縮処理",
       "nuclear-fuel": "核燃料",
       "calcite-recycling": "方解石 (リサイクル)",
       "molten-iron-from-lava": "溶融鉄(溶岩)",
       "molten-copper-from-lava": "溶融銅(溶岩)",
-      "molten-iron": "鉄鉱石融解",
-      "molten-copper": "銅鉱石融解",
+      "iron-ore-melting": "鉄鉱石融解",
+      "copper-ore-melting": "銅鉱石融解",
       "casting-iron": "鉄板(鋳造)",
       "casting-copper": "銅板(鋳造)",
       "casting-steel": "鋼材(鋳造)",
@@ -832,7 +761,7 @@
       "biter-egg": "バイターの卵",
       "biter-egg-recycling": "バイターの卵 (リサイクル)",
       "pentapod-egg-recycling": "ペンタポッドの卵 (リサイクル)",
-      "wood-processing": "木材処理",
+      "tree-seed": "木の種子",
       "tree-seed-recycling": "木の種子 (リサイクル)",
       "fish-breeding": "魚の養殖",
       "nutrients-from-fish": "栄養素(魚)",
@@ -881,6 +810,7 @@
       "cargo-landing-pad": "カーゴ降着パッド",
       "space-platform-foundation": "宇宙プラットフォーム基盤",
       "cargo-bay": "カーゴベイ",
+      "landing-pad-unloading-bay": "降着パッド荷下ろしベイ",
       "asteroid-collector": "アステロイド収集機",
       "crusher": "破砕機",
       "thruster": "スラスター",
@@ -904,6 +834,7 @@
       "thruster-oxidizer": "スラスター酸化剤",
       "advanced-thruster-oxidizer": "発展スラスター酸化剤",
       "pistol": "ハンドガン",
+      "pistol-recycling": "ハンドガン (リサイクル)",
       "submachine-gun": "サブマシンガン",
       "railgun": "レールガン",
       "teslagun": "テスラガン",
@@ -913,12 +844,12 @@
       "flamethrower": "火炎放射器",
       "firearm-magazine": "通常弾薬",
       "piercing-rounds-magazine": "貫通弾薬",
-      "uranium-rounds-magazine": "劣化ウラン弾薬",
+      "uranium-rounds-magazine": "ウラン弾薬",
       "shotgun-shell": "ショットガン弾薬",
       "piercing-shotgun-shell": "貫通ショットガン弾薬",
       "cannon-shell": "砲弾",
       "explosive-cannon-shell": "炸裂砲弾",
-      "uranium-cannon-shell": "劣化ウラン砲弾",
+      "uranium-cannon-shell": "ウラン砲弾",
       "explosive-uranium-cannon-shell": "炸裂ウラン砲弾",
       "artillery-shell": "長距離砲弾",
       "rocket": "ロケット弾",
@@ -942,22 +873,22 @@
       "power-armor": "パワーアーマー",
       "power-armor-mk2": "パワーアーマーMK2",
       "mech-armor": "メックアーマー",
-      "solar-panel-equipment": "携帯ソーラーパネルモジュール",
+      "solar-panel-equipment": "携帯ソーラーパネル",
       "fission-reactor-equipment": "携帯原子炉",
       "fusion-reactor-equipment": "携帯核融合炉",
       "battery-equipment": "個人用バッテリー",
       "battery-mk2-equipment": "個人用バッテリーMK2",
       "battery-mk3-equipment": "個人用バッテリーMK3",
-      "belt-immunity-equipment": "ベルト移動耐性装備",
-      "exoskeleton-equipment": "強化外骨格モジュール",
+      "belt-immunity-equipment": "ベルト移動耐性",
+      "exoskeleton-equipment": "強化外骨格",
       "personal-roboport-equipment": "携帯ロボットステーション",
       "personal-roboport-mk2-equipment": "携帯ロボットステーションMK2",
-      "night-vision-equipment": "暗視モジュール",
+      "night-vision-equipment": "暗視眼鏡",
       "toolbelt-equipment": "拡張ツールベルト",
-      "energy-shield-equipment": "エネルギーシールドモジュール",
-      "energy-shield-mk2-equipment": "エネルギーシールドモジュールMK2",
-      "personal-laser-defense-equipment": "携帯レーザー防御モジュール",
-      "discharge-defense-equipment": "携帯放電防御モジュール",
+      "energy-shield-equipment": "エネルギーシールド",
+      "energy-shield-mk2-equipment": "エネルギーシールドMK2",
+      "personal-laser-defense-equipment": "携帯レーザー防御",
+      "discharge-defense-equipment": "放電防御",
       "stone-wall": "防壁",
       "gate": "ゲート",
       "radar": "レーダー",
@@ -999,7 +930,7 @@
       "battery-mk3-equipment-recycling": "個人用バッテリーMK3 (リサイクル)",
       "battery-recycling": "電池 (リサイクル)",
       "beacon-recycling": "ビーコン (リサイクル)",
-      "belt-immunity-equipment-recycling": "ベルト移動耐性装備 (リサイクル)",
+      "belt-immunity-equipment-recycling": "ベルト移動耐性 (リサイクル)",
       "big-electric-pole-recycling": "大型電柱 (リサイクル)",
       "big-mining-drill-recycling": "大型掘削機 (リサイクル)",
       "biochamber-recycling": "バイオチャンバー (リサイクル)",
@@ -1027,7 +958,7 @@
       "decider-combinator-recycling": "条件回路 (リサイクル)",
       "defender-capsule-recycling": "ディフェンダーカプセル (リサイクル)",
       "destroyer-capsule-recycling": "デストロイヤーカプセル (リサイクル)",
-      "discharge-defense-equipment-recycling": "携帯放電防御モジュール (リサイクル)",
+      "discharge-defense-equipment-recycling": "放電防御 (リサイクル)",
       "display-panel-recycling": "ディスプレイパネル (リサイクル)",
       "distractor-capsule-recycling": "ディストラクターカプセル (リサイクル)",
       "efficiency-module-2-recycling": "エネルギー効率モジュール2 (リサイクル)",
@@ -1038,10 +969,10 @@
       "electric-mining-drill-recycling": "電動掘削機 (リサイクル)",
       "electromagnetic-plant-recycling": "電磁プラント (リサイクル)",
       "electronic-circuit-recycling": "電子基板 (リサイクル)",
-      "energy-shield-equipment-recycling": "エネルギーシールドモジュール (リサイクル)",
-      "energy-shield-mk2-equipment-recycling": "エネルギーシールドモジュールMK2 (リサイクル)",
+      "energy-shield-equipment-recycling": "エネルギーシールド (リサイクル)",
+      "energy-shield-mk2-equipment-recycling": "エネルギーシールドMK2 (リサイクル)",
       "engine-unit-recycling": "エンジンユニット (リサイクル)",
-      "exoskeleton-equipment-recycling": "強化外骨格モジュール (リサイクル)",
+      "exoskeleton-equipment-recycling": "強化外骨格 (リサイクル)",
       "explosive-cannon-shell-recycling": "炸裂砲弾 (リサイクル)",
       "explosive-rocket-recycling": "炸裂ロケット弾 (リサイクル)",
       "explosive-uranium-cannon-shell-recycling": "炸裂ウラン砲弾 (リサイクル)",
@@ -1067,6 +998,7 @@
       "gate-recycling": "ゲート (リサイクル)",
       "grenade-recycling": "グレネード (リサイクル)",
       "gun-turret-recycling": "ガンタレット (リサイクル)",
+      "hazard-concrete-recycling": "警戒色コンクリート (リサイクル)",
       "heat-exchanger-recycling": "熱交換器 (リサイクル)",
       "heat-interface-recycling": "熱インターフェイス (リサイクル)",
       "heat-pipe-recycling": "ヒートパイプ (リサイクル)",
@@ -1078,6 +1010,7 @@
       "item-unknown-recycling": "不明なアイテム (リサイクル)",
       "lab-recycling": "研究所 (リサイクル)",
       "land-mine-recycling": "地雷 (リサイクル)",
+      "landing-pad-unloading-bay-recycling": "降着パッド荷下ろしベイ (リサイクル)",
       "laser-turret-recycling": "レーザータレット (リサイクル)",
       "lightning-collector-recycling": "集雷装置 (リサイクル)",
       "lightning-rod-recycling": "避雷針 (リサイクル)",
@@ -1089,20 +1022,19 @@
       "mech-armor-recycling": "メックアーマー (リサイクル)",
       "medium-electric-pole-recycling": "中型電柱 (リサイクル)",
       "modular-armor-recycling": "モジュラーアーマー (リサイクル)",
-      "night-vision-equipment-recycling": "暗視モジュール (リサイクル)",
+      "night-vision-equipment-recycling": "暗視眼鏡 (リサイクル)",
       "nuclear-reactor-recycling": "原子炉 (リサイクル)",
       "offshore-pump-recycling": "汲み上げポンプ (リサイクル)",
       "oil-refinery-recycling": "原油精製所 (リサイクル)",
       "overgrowth-jellynut-soil-recycling": "肥沃なゼリーナット用土壌 (リサイクル)",
       "overgrowth-yumako-soil-recycling": "肥沃なユマコ用土壌 (リサイクル)",
       "passive-provider-chest-recycling": "パッシブ供給チェスト (リサイクル)",
-      "personal-laser-defense-equipment-recycling": "携帯レーザー防御モジュール (リサイクル)",
+      "personal-laser-defense-equipment-recycling": "携帯レーザー防御 (リサイクル)",
       "personal-roboport-equipment-recycling": "携帯ロボットステーション (リサイクル)",
       "personal-roboport-mk2-equipment-recycling": "携帯ロボットステーションMK2 (リサイクル)",
       "piercing-rounds-magazine-recycling": "貫通弾薬 (リサイクル)",
       "piercing-shotgun-shell-recycling": "貫通ショットガン弾薬 (リサイクル)",
       "pipe-to-ground-recycling": "地下パイプ (リサイクル)",
-      "pistol-recycling": "ハンドガン (リサイクル)",
       "poison-capsule-recycling": "毒素カプセル (リサイクル)",
       "power-armor-mk2-recycling": "パワーアーマーMK2 (リサイクル)",
       "power-armor-recycling": "パワーアーマー (リサイクル)",
@@ -1126,12 +1058,10 @@
       "railgun-ammo-recycling": "レールガン弾 (リサイクル)",
       "railgun-recycling": "レールガン (リサイクル)",
       "railgun-turret-recycling": "レールガンタレット (リサイクル)",
-      "rcalc-heat-dummy-recycling": "熱 (リサイクル)",
-      "rcalc-pollution-dummy-recycling": "汚染 (リサイクル)",
-      "rcalc-power-dummy-recycling": "電力 (リサイクル)",
       "recipe-unknown": "不明なレシピ",
       "recycler-recycling": "リサイクラー (リサイクル)",
       "refined-concrete-recycling": "鉄筋コンクリート (リサイクル)",
+      "refined-hazard-concrete-recycling": "警戒色鉄筋コンクリート (リサイクル)",
       "repair-pack-recycling": "リペアキット (リサイクル)",
       "requester-chest-recycling": "要求チェスト (リサイクル)",
       "roboport-recycling": "ロボットステーション (リサイクル)",
@@ -1145,7 +1075,7 @@
       "slowdown-capsule-recycling": "粘着カプセル (リサイクル)",
       "small-electric-pole-recycling": "小型電柱 (リサイクル)",
       "small-lamp-recycling": "ランプ (リサイクル)",
-      "solar-panel-equipment-recycling": "携帯ソーラーパネルモジュール (リサイクル)",
+      "solar-panel-equipment-recycling": "携帯ソーラーパネル (リサイクル)",
       "solar-panel-recycling": "ソーラーパネル (リサイクル)",
       "space-platform-foundation-recycling": "宇宙プラットフォーム基盤 (リサイクル)",
       "space-platform-starter-pack-recycling": "宇宙プラットフォームスタートパック (リサイクル)",
@@ -1175,8 +1105,9 @@
       "turbo-transport-belt-recycling": "ターボ搬送ベルト (リサイクル)",
       "turbo-underground-belt-recycling": "ターボ地下ベルト (リサイクル)",
       "underground-belt-recycling": "地下搬送ベルト (リサイクル)",
-      "uranium-cannon-shell-recycling": "劣化ウラン砲弾 (リサイクル)",
-      "uranium-rounds-magazine-recycling": "劣化ウラン弾薬 (リサイクル)",
+      "uranium-cannon-shell-recycling": "ウラン砲弾 (リサイクル)",
+      "uranium-rounds-magazine-recycling": "ウラン弾薬 (リサイクル)",
+      "electric-energy-interface-equipment-recycling": "携帯電力インターフェイス装備 (リサイクル)",
       "electric-energy-interface-recycling": "電力インターフェイス (リサイクル)",
       "linked-chest-recycling": "リンクされたチェスト (リサイクル)",
       "proxy-container-recycling": "プロキシコンテナ (リサイクル)",
@@ -1190,93 +1121,10 @@
       "infinity-cargo-wagon-recycling": "無限貨物車両 (リサイクル)",
       "infinity-chest": "無限チェスト",
       "infinity-pipe": "無限パイプ",
-      "rcalc-selection-tool-recycling": "Rate Calculator ツール (リサイクル)",
       "selection-tool-recycling": "選択ツール (リサイクル)",
       "simple-entity-with-force-recycling": "勢力を持つ一般エンティティ (リサイクル)",
-      "simple-entity-with-owner-recycling": "所有権を持つ一般エンティティ (リサイクル)",
-      "burner-generator-recycling": "燃料式発電機 (リサイクル)",
-      "ee-infinity-chest": "無限チェスト",
-      "ee-infinity-chest-recycling": "無限チェスト (リサイクル)",
-      "ee-infinity-chest-active-provider": "無限アクティブ供給チェスト",
-      "ee-infinity-chest-active-provider-recycling": "無限アクティブ供給チェスト (リサイクル)",
-      "ee-infinity-chest-passive-provider": "無限パッシブ供給チェスト",
-      "ee-infinity-chest-passive-provider-recycling": "無限パッシブ供給チェスト (リサイクル)",
-      "ee-infinity-chest-storage": "無限貯蔵チェスト",
-      "ee-infinity-chest-storage-recycling": "無限貯蔵チェスト (リサイクル)",
-      "ee-infinity-chest-buffer": "無限バッファーチェスト",
-      "ee-infinity-chest-buffer-recycling": "無限バッファーチェスト (リサイクル)",
-      "ee-infinity-chest-requester": "無限要求チェスト",
-      "ee-infinity-chest-requester-recycling": "無限要求チェスト (リサイクル)",
-      "ee-aggregate-chest": "Aggregate chest",
-      "ee-aggregate-chest-recycling": "Aggregate chest (リサイクル)",
-      "ee-aggregate-chest-passive-provider": "Aggregate passive provider chest",
-      "ee-aggregate-chest-passive-provider-recycling": "Aggregate passive provider chest (リサイクル)",
-      "ee-linked-chest": "Linked chest",
-      "ee-linked-chest-recycling": "Linked chest (リサイクル)",
-      "ee-infinity-loader": "無限ローダー",
-      "ee-infinity-loader-recycling": "無限ローダー (リサイクル)",
-      "ee-linked-belt": "Linked belt",
-      "ee-linked-belt-recycling": "Linked belt (リサイクル)",
-      "ee-super-inserter": "スーパーインサータ",
-      "ee-super-inserter-recycling": "スーパーインサータ (リサイクル)",
-      "ee-infinity-pipe": "無限パイプ",
-      "ee-infinity-pipe-recycling": "無限パイプ (リサイクル)",
-      "ee-super-pump": "スーパーポンプ",
-      "ee-super-pump-recycling": "スーパーポンプ (リサイクル)",
-      "ee-infinity-heat-pipe": "無限ヒートパイプ",
-      "ee-infinity-heat-pipe-recycling": "無限ヒートパイプ (リサイクル)",
-      "ee-super-radar": "スーパーレーダー",
-      "ee-super-radar-recycling": "スーパーレーダー (リサイクル)",
-      "ee-super-lab": "スーパー研究所",
-      "ee-super-lab-recycling": "スーパー研究所 (リサイクル)",
-      "ee-infinity-accumulator": "無限蓄電池",
-      "ee-infinity-accumulator-recycling": "無限蓄電池 (リサイクル)",
-      "ee-super-electric-pole": "スーパー電柱",
-      "ee-super-electric-pole-recycling": "スーパー電柱 (リサイクル)",
-      "ee-super-substation": "スーパー広域電柱",
-      "ee-super-substation-recycling": "スーパー広域電柱 (リサイクル)",
-      "ee-super-locomotive": "スーパー機関車",
-      "ee-super-locomotive-recycling": "スーパー機関車 (リサイクル)",
-      "ee-infinity-cargo-wagon": "無限貨車",
-      "ee-infinity-cargo-wagon-recycling": "無限貨車 (リサイクル)",
-      "ee-infinity-fluid-wagon": "無限タンク貨車",
-      "ee-infinity-fluid-wagon-recycling": "無限タンク貨車 (リサイクル)",
-      "ee-super-fuel": "Super fuel",
-      "ee-super-fuel-recycling": "Super fuel (リサイクル)",
-      "ee-super-roboport": "スーパーロボットステーション",
-      "ee-super-roboport-recycling": "スーパーロボットステーション (リサイクル)",
-      "ee-super-construction-robot": "スーパー建設ロボット",
-      "ee-super-construction-robot-recycling": "スーパー建設ロボット (リサイクル)",
-      "ee-super-logistic-robot": "スーパー物流ロボット",
-      "ee-super-logistic-robot-recycling": "スーパー物流ロボット (リサイクル)",
-      "ee-super-beacon": "スーパービーコン",
-      "ee-super-beacon-recycling": "スーパービーコン (リサイクル)",
-      "ee-super-speed-module": "Super speed module",
-      "ee-super-speed-module-recycling": "Super speed module (リサイクル)",
-      "ee-super-efficiency-module": "Super efficiency module",
-      "ee-super-efficiency-module-recycling": "Super efficiency module (リサイクル)",
-      "ee-super-productivity-module": "Super productivity module",
-      "ee-super-productivity-module-recycling": "Super productivity module (リサイクル)",
-      "ee-super-clean-module": "Super clean module",
-      "ee-super-clean-module-recycling": "Super clean module (リサイクル)",
-      "ee-super-slow-module": "Super slow module",
-      "ee-super-slow-module-recycling": "Super slow module (リサイクル)",
-      "ee-super-inefficiency-module": "Super inefficiency module",
-      "ee-super-inefficiency-module-recycling": "Super inefficiency module (リサイクル)",
-      "ee-super-dirty-module": "Super dirty module",
-      "ee-super-dirty-module-recycling": "Super dirty module (リサイクル)",
-      "ee-infinity-fission-reactor-equipment": "Infinity fission reactor",
-      "ee-infinity-fission-reactor-equipment-recycling": "Infinity fission reactor (リサイクル)",
-      "ee-super-personal-roboport-equipment": "Super personal roboport",
-      "ee-super-personal-roboport-equipment-recycling": "Super personal roboport (リサイクル)",
-      "ee-super-exoskeleton-equipment": "Super exoskeleton",
-      "ee-super-exoskeleton-equipment-recycling": "Super exoskeleton (リサイクル)",
-      "ee-super-energy-shield-equipment": "Super energy shield",
-      "ee-super-energy-shield-equipment-recycling": "Super energy shield (リサイクル)",
-      "ee-super-night-vision-equipment": "Super night vision",
-      "ee-super-night-vision-equipment-recycling": "Super night vision (リサイクル)",
-      "ee-super-battery-equipment": "スーパー個人用バッテリー",
-      "ee-super-battery-equipment-recycling": "スーパー個人用バッテリー (リサイクル)"
+      "simple-entity-with-owner-recycling": "所有者を持つ一般エンティティ (リサイクル)",
+      "burner-generator-recycling": "燃料式発電機 (リサイクル)"
     },
     "descriptions": {
       "ammoniacal-solution-separation": "[fluid=ammoniacal-solution] は [entity=offshore-pump] を [planet=aquilo] の海に使用すると得られます。",
@@ -1292,13 +1140,12 @@
       "space": "宇宙",
       "combat": "戦闘",
       "fluids": "流体",
-      "signals": "信号",
+      "signals": "シグナル",
       "enemies": "敵",
       "tiles": "タイル",
       "environment": "環境",
       "effects": "効果",
-      "other": "その他",
-      "ee-tools": "Testing Tools"
+      "other": "その他"
     }
   },
   "quality": {
@@ -1473,13 +1320,13 @@
       "signal-unknown": "不明なシグナル"
     },
     "descriptions": {
-      "signal-everything": "全ての入力信号が条件を満たしている場合、真を返します。\n入力信号がない場合は真を返します。",
-      "signal-each": "全ての入力信号に対して評価・操作を行います。",
-      "signal-anything": "いずれかの入力信号が条件を満たしている場合、真を返します。\n入力信号がない場合は偽を返します。",
-      "signal-item-parameter": "特殊ワイルドカード信号\n時刻表への割り込みに使用すると、全ての発車条件にパスした最初のアイテムにマッチし、信号をそのアイテムで置き換えます。\n対象駅の名前の中にあるリッチテキストタグも置き換えます。",
-      "signal-fuel-parameter": "特殊ワイルドカード信号\n時刻表への割り込みに使用すると、全ての発車条件にパスした最初の燃料にマッチし、信号をその燃料で置き換えます。\n対象駅の名前の中にあるリッチテキストタグも置き換えます。",
-      "signal-fluid-parameter": "特殊ワイルドカード信号\n時刻表への割り込みに使用すると、全ての発車条件にパスした最初の流体にマッチし、信号をその流体で置き換えます。\n対象駅の名前の中にあるリッチテキストタグも置き換えます。",
-      "signal-signal-parameter": "特殊ワイルドカード信号\n時刻表への割り込みに使用すると、全ての発車条件にパスした最初の信号にマッチし、信号をその信号で置き換えます。\n対象駅の名前の中にあるリッチテキストタグも置き換えます。",
+      "signal-everything": "全ての入力シグナルが条件を満たしている場合、真を返します。\n入力シグナルがない場合は真を返します。\nすべての入力シグナルを出力します。",
+      "signal-each": "各入力シグナルについて、条件を個別に評価します。\n完全に合格するためには、シグナルはすべての条件を満たす必要があります。\nすべての条件を満たしたシグナルをすべて出力します。",
+      "signal-anything": "いずれかの入力シグナルが条件を満たしている場合、真を返します。\n入力シグナルがない場合は偽を返します。\n最初の入力シグナル、またはすべての条件を満たした最初のシグナルを出力します。いずれの場合も、シグナルの順序を尊重します。",
+      "signal-item-parameter": "特殊ワイルドカードシグナル\n時刻表への割り込みに使用すると、全ての発車条件を満たした最初のアイテムにマッチして、シグナルをそのアイテムで置き換えます。\n対象駅の名前の中にあるリッチテキストタグも置き換えます。",
+      "signal-fuel-parameter": "特殊ワイルドカードシグナル\n時刻表への割り込みに使用すると、全ての発車条件を満たした最初の燃料にマッチして、シグナルをその燃料で置き換えます。\n対象駅の名前の中にあるリッチテキストタグも置き換えます。",
+      "signal-fluid-parameter": "特殊ワイルドカードシグナル\n時刻表への割り込みに使用すると、全ての発車条件を満たした最初の流体にマッチして、シグナルをその流体で置き換えます。\n対象駅の名前の中にあるリッチテキストタグも置き換えます。",
+      "signal-signal-parameter": "特殊ワイルドカードシグナル\n時刻表への割り込みに使用すると、全ての発車条件を満たした最初のシグナルにマッチして、シグナルをそのシグナルで置き換えます。\n対象駅の名前の中にあるリッチテキストタグも置き換えます。",
       "signal-unknown": "MODが削除されたためこのシグナルは利用できません。MODを再度有効にすれば復元されます。"
     }
   }

+ 15 - 168
src/assets/data/2.0/i18n/zh-CH.json

@@ -33,13 +33,11 @@
       "parameter-7": "Parameter 7",
       "parameter-8": "Parameter 8",
       "parameter-9": "Parameter 9",
-      "ee-super-pump-speed-fluid": "Speedfluid",
       "fluid-unknown": "Unknown fluid"
     },
     "descriptions": {
       "thruster-fuel": "Liquid thruster fuel",
       "fusion-plasma": "Ultra-high-temperature ions generated in [entity=fusion-reactor] and consumed by a [entity=fusion-generator]. It is not a normal fluid and cannot be moved in [entity=pipe], it can only be moved through the Fusion reactor and Fusion generator.\nThe temperature of plasma determines its energy value.\nA quantity of plasma also represents that amount of coolant that travels with it, and the heated coolant is output by the Fusion generator as the plasma is used for energy.",
-      "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.",
       "fluid-unknown": "This fluid is not available due to mod removal, it will be restored if the mod is re-enabled."
     }
   },
@@ -120,7 +118,6 @@
       "ice-platform": "Ice platform",
       "foundation": "Foundation",
       "cliff-explosives": "Cliff explosives",
-      "region-cloner_selection-tool": "Region Cloner Selection Tool",
       "repair-pack": "Repair pack",
       "blueprint": "Blueprint",
       "deconstruction-planner": "Deconstruction planner",
@@ -268,6 +265,7 @@
       "cargo-landing-pad": "Cargo landing pad",
       "space-platform-foundation": "Space platform foundation",
       "cargo-bay": "Cargo bay",
+      "landing-pad-unloading-bay": "Landing pad unloading bay",
       "asteroid-collector": "Asteroid collector",
       "crusher": "Crusher",
       "thruster": "Thruster",
@@ -369,9 +367,7 @@
       "artillery-targeting-remote": "Artillery targeting remote",
       "item-unknown": "Unknown item",
       "no-item": "No item",
-      "rcalc-heat-dummy": "Heat",
-      "rcalc-pollution-dummy": "Pollution",
-      "rcalc-power-dummy": "Power",
+      "electric-energy-interface-equipment": "Electric energy interface equipment",
       "electric-energy-interface": "Electric energy interface",
       "linked-chest": "Linked chest",
       "proxy-container": "Proxy container",
@@ -385,52 +381,10 @@
       "infinity-cargo-wagon": "Infinity cargo wagon",
       "infinity-chest": "Infinity chest",
       "infinity-pipe": "Infinity pipe",
-      "rcalc-selection-tool": "Rate Calculator selector",
       "selection-tool": "Selection tool",
       "simple-entity-with-force": "Simple entity with force",
       "simple-entity-with-owner": "Simple entity with owner",
-      "burner-generator": "Burner generator",
-      "ee-infinity-chest": "Infinity chest",
-      "ee-infinity-chest-active-provider": "Infinity active provider chest",
-      "ee-infinity-chest-passive-provider": "Infinity passive provider chest",
-      "ee-infinity-chest-storage": "Infinity storage chest",
-      "ee-infinity-chest-buffer": "Infinity buffer chest",
-      "ee-infinity-chest-requester": "Infinity requester chest",
-      "ee-aggregate-chest": "Aggregate chest",
-      "ee-aggregate-chest-passive-provider": "Aggregate passive provider chest",
-      "ee-linked-chest": "Linked chest",
-      "ee-infinity-loader": "Infinity loader",
-      "ee-linked-belt": "Linked belt",
-      "ee-super-inserter": "Super inserter",
-      "ee-infinity-pipe": "Infinity pipe",
-      "ee-super-pump": "Super pump",
-      "ee-infinity-heat-pipe": "Infinity heat pipe",
-      "ee-super-radar": "Super radar",
-      "ee-super-lab": "Super lab",
-      "ee-infinity-accumulator": "Infinity accumulator",
-      "ee-super-electric-pole": "Super electric pole",
-      "ee-super-substation": "Super substation",
-      "ee-super-locomotive": "Super locomotive",
-      "ee-infinity-cargo-wagon": "Infinity cargo wagon",
-      "ee-infinity-fluid-wagon": "Infinity fluid wagon",
-      "ee-super-fuel": "Super fuel",
-      "ee-super-roboport": "Super roboport",
-      "ee-super-construction-robot": "Super construction robot",
-      "ee-super-logistic-robot": "Super logistic robot",
-      "ee-super-beacon": "Super beacon",
-      "ee-super-speed-module": "Super speed module",
-      "ee-super-efficiency-module": "Super efficiency module",
-      "ee-super-productivity-module": "Super productivity module",
-      "ee-super-clean-module": "Super clean module",
-      "ee-super-slow-module": "Super slow module",
-      "ee-super-inefficiency-module": "Super inefficiency module",
-      "ee-super-dirty-module": "Super dirty module",
-      "ee-infinity-fission-reactor-equipment": "Infinity fission reactor",
-      "ee-super-personal-roboport-equipment": "Super personal roboport",
-      "ee-super-exoskeleton-equipment": "Super exoskeleton",
-      "ee-super-energy-shield-equipment": "Super energy shield",
-      "ee-super-night-vision-equipment": "Super night vision",
-      "ee-super-battery-equipment": "Super personal battery"
+      "burner-generator": "Burner generator"
     },
     "descriptions": {
       "rail": "Use to build straight rails manually or through the rail planner.\n[font=default-semibold][color=#80cef0]Left-click[/color][/font] to build short paths directly.\n[font=default-semibold][color=#80cef0]Shift + Left-click[/color][/font] to place long ghost paths.\n[font=default-semibold][color=#80cef0]KEY-CODE-NOT-DEFINE-IN-HEADLESS-MODE[/color][/font] to switch between ground and elevated paths.",
@@ -504,29 +458,7 @@
       "green-wire": "Used to connect machines to the circuit network using [font=default-semibold][color=#80cef0]Left-click[/color][/font].",
       "red-wire": "Used to connect machines to the circuit network using [font=default-semibold][color=#80cef0]Left-click[/color][/font].",
       "artillery-targeting-remote": "Allows firing artillery manually from the map or the world.",
-      "item-unknown": "This item is not available due to mod removal, it will be restored if the mod is re-enabled.",
-      "ee-infinity-chest": "Creates or destroys items using customizable item filters.",
-      "ee-aggregate-chest": "Contains every item in the game.\n[color=255,57,48]Will cause performance issues if abused, use sparingly![/color]",
-      "ee-infinity-loader": "Creates or destroys items on a belt using customizable filters.",
-      "ee-linked-belt": "Instantly transports items to another linked belt.",
-      "ee-infinity-heat-pipe": "Creates or destroys a configurable amount of heat.",
-      "ee-infinity-accumulator": "Produces, drains, or stores a configurable amount of electric energy.",
-      "ee-infinity-cargo-wagon": "Creates or destroys items using customizable item filters (identical to infinity chest).",
-      "ee-infinity-fluid-wagon": "Creates or destroys fluids using a customizable fluid filter (identical to infinity pipe).\n[color=255,57,48]Will cause performance issues if abused, use sparingly![/color]",
-      "ee-super-fuel": "Nuclear fuel that lasts pretty much forever.",
-      "ee-super-speed-module": "Massively increases machine speed.",
-      "ee-super-efficiency-module": "Massively decreases machine energy consumption. Minimum energy consumption is 20%.",
-      "ee-super-productivity-module": "Massively increases machine productivity.",
-      "ee-super-clean-module": "Massively decreases machine pollution. Minimum pollution is 20%.",
-      "ee-super-slow-module": "Massively decreases machine speed. Minimum speed is 20%.",
-      "ee-super-inefficiency-module": "Massively increases machine energy consumption.",
-      "ee-super-dirty-module": "Massively increases machine pollution.",
-      "ee-infinity-fission-reactor-equipment": "Generates virtually unlimited power for your equipment.",
-      "ee-super-personal-roboport-equipment": "Personal robport with massive construction area and robot capacity.",
-      "ee-super-exoskeleton-equipment": "Very small and very quick exoskeleton.",
-      "ee-super-energy-shield-equipment": "Ridiculously overpowered energy shield, makes you practically immortal.",
-      "ee-super-night-vision-equipment": "Perfect night vision, you can see as if it's daytime.",
-      "ee-super-battery-equipment": "Ridiculously massive battery."
+      "item-unknown": "This item is not available due to mod removal, it will be restored if the mod is re-enabled."
     }
   },
   "recipe": {
@@ -599,10 +531,8 @@
       "stone-brick-recycling": "Stone brick recycling",
       "stone-wall-recycling": "Wall recycling",
       "concrete": "Concrete",
-      "hazard-concrete-recycling": "Hazard concrete recycling",
       "hazard-concrete": "Hazard concrete",
       "refined-concrete": "Refined concrete",
-      "refined-hazard-concrete-recycling": "Refined hazard concrete recycling",
       "refined-hazard-concrete": "Refined hazard concrete",
       "landfill": "Landfill",
       "landfill-recycling": "Landfill recycling",
@@ -613,7 +543,6 @@
       "ice-platform": "Ice platform",
       "foundation": "Foundation",
       "cliff-explosives": "Cliff explosives",
-      "region-cloner_selection-tool-recycling": "Region Cloner Selection Tool recycling",
       "repair-pack": "Repair pack",
       "blueprint-recycling": "Blueprint recycling",
       "deconstruction-planner-recycling": "Deconstruction planner recycling",
@@ -775,8 +704,8 @@
       "calcite-recycling": "Calcite recycling",
       "molten-iron-from-lava": "Molten iron from lava",
       "molten-copper-from-lava": "Molten copper from lava",
-      "molten-iron": "Iron ore melting",
-      "molten-copper": "Copper ore melting",
+      "iron-ore-melting": "Iron ore melting",
+      "copper-ore-melting": "Copper ore melting",
       "casting-iron": "Casting iron",
       "casting-copper": "Casting copper",
       "casting-steel": "Casting steel",
@@ -832,7 +761,7 @@
       "biter-egg": "Biter egg",
       "biter-egg-recycling": "Biter egg recycling",
       "pentapod-egg-recycling": "Pentapod egg recycling",
-      "wood-processing": "Wood processing",
+      "tree-seed": "Tree seed",
       "tree-seed-recycling": "Tree seed recycling",
       "fish-breeding": "Fish breeding",
       "nutrients-from-fish": "Nutrients from fish",
@@ -881,6 +810,7 @@
       "cargo-landing-pad": "Cargo landing pad",
       "space-platform-foundation": "Space platform foundation",
       "cargo-bay": "Cargo bay",
+      "landing-pad-unloading-bay": "Landing pad unloading bay",
       "asteroid-collector": "Asteroid collector",
       "crusher": "Crusher",
       "thruster": "Thruster",
@@ -904,6 +834,7 @@
       "thruster-oxidizer": "Thruster oxidizer",
       "advanced-thruster-oxidizer": "Advanced thruster oxidizer",
       "pistol": "Pistol",
+      "pistol-recycling": "Pistol recycling",
       "submachine-gun": "Submachine gun",
       "railgun": "Railgun",
       "teslagun": "Tesla gun",
@@ -1067,6 +998,7 @@
       "gate-recycling": "Gate recycling",
       "grenade-recycling": "Grenade recycling",
       "gun-turret-recycling": "Gun turret recycling",
+      "hazard-concrete-recycling": "Hazard concrete recycling",
       "heat-exchanger-recycling": "Heat exchanger recycling",
       "heat-interface-recycling": "Heat interface recycling",
       "heat-pipe-recycling": "Heat pipe recycling",
@@ -1078,6 +1010,7 @@
       "item-unknown-recycling": "Unknown item recycling",
       "lab-recycling": "Lab recycling",
       "land-mine-recycling": "Land mine recycling",
+      "landing-pad-unloading-bay-recycling": "Landing pad unloading bay recycling",
       "laser-turret-recycling": "Laser turret recycling",
       "lightning-collector-recycling": "Lightning collector recycling",
       "lightning-rod-recycling": "Lightning rod recycling",
@@ -1102,7 +1035,6 @@
       "piercing-rounds-magazine-recycling": "Piercing rounds magazine recycling",
       "piercing-shotgun-shell-recycling": "Piercing shotgun shells recycling",
       "pipe-to-ground-recycling": "Pipe to ground recycling",
-      "pistol-recycling": "Pistol recycling",
       "poison-capsule-recycling": "Poison capsule recycling",
       "power-armor-mk2-recycling": "Power armor MK2 recycling",
       "power-armor-recycling": "Power armor recycling",
@@ -1126,12 +1058,10 @@
       "railgun-ammo-recycling": "Railgun ammo recycling",
       "railgun-recycling": "Railgun recycling",
       "railgun-turret-recycling": "Railgun turret recycling",
-      "rcalc-heat-dummy-recycling": "Heat recycling",
-      "rcalc-pollution-dummy-recycling": "Pollution recycling",
-      "rcalc-power-dummy-recycling": "Power recycling",
       "recipe-unknown": "Unknown recipe",
       "recycler-recycling": "Recycler recycling",
       "refined-concrete-recycling": "Refined concrete recycling",
+      "refined-hazard-concrete-recycling": "Refined hazard concrete recycling",
       "repair-pack-recycling": "Repair pack recycling",
       "requester-chest-recycling": "Requester chest recycling",
       "roboport-recycling": "Roboport recycling",
@@ -1177,6 +1107,7 @@
       "underground-belt-recycling": "Underground belt recycling",
       "uranium-cannon-shell-recycling": "Uranium cannon shell recycling",
       "uranium-rounds-magazine-recycling": "Uranium rounds magazine recycling",
+      "electric-energy-interface-equipment-recycling": "Electric energy interface equipment recycling",
       "electric-energy-interface-recycling": "Electric energy interface recycling",
       "linked-chest-recycling": "Linked chest recycling",
       "proxy-container-recycling": "Proxy container recycling",
@@ -1190,93 +1121,10 @@
       "infinity-cargo-wagon-recycling": "Infinity cargo wagon recycling",
       "infinity-chest": "Infinity chest",
       "infinity-pipe": "Infinity pipe",
-      "rcalc-selection-tool-recycling": "Rate Calculator selector recycling",
       "selection-tool-recycling": "Selection tool recycling",
       "simple-entity-with-force-recycling": "Simple entity with force recycling",
       "simple-entity-with-owner-recycling": "Simple entity with owner recycling",
-      "burner-generator-recycling": "Burner generator recycling",
-      "ee-infinity-chest": "Infinity chest",
-      "ee-infinity-chest-recycling": "Infinity chest recycling",
-      "ee-infinity-chest-active-provider": "Infinity active provider chest",
-      "ee-infinity-chest-active-provider-recycling": "Infinity active provider chest recycling",
-      "ee-infinity-chest-passive-provider": "Infinity passive provider chest",
-      "ee-infinity-chest-passive-provider-recycling": "Infinity passive provider chest recycling",
-      "ee-infinity-chest-storage": "Infinity storage chest",
-      "ee-infinity-chest-storage-recycling": "Infinity storage chest recycling",
-      "ee-infinity-chest-buffer": "Infinity buffer chest",
-      "ee-infinity-chest-buffer-recycling": "Infinity buffer chest recycling",
-      "ee-infinity-chest-requester": "Infinity requester chest",
-      "ee-infinity-chest-requester-recycling": "Infinity requester chest recycling",
-      "ee-aggregate-chest": "Aggregate chest",
-      "ee-aggregate-chest-recycling": "Aggregate chest recycling",
-      "ee-aggregate-chest-passive-provider": "Aggregate passive provider chest",
-      "ee-aggregate-chest-passive-provider-recycling": "Aggregate passive provider chest recycling",
-      "ee-linked-chest": "Linked chest",
-      "ee-linked-chest-recycling": "Linked chest recycling",
-      "ee-infinity-loader": "Infinity loader",
-      "ee-infinity-loader-recycling": "Infinity loader recycling",
-      "ee-linked-belt": "Linked belt",
-      "ee-linked-belt-recycling": "Linked belt recycling",
-      "ee-super-inserter": "Super inserter",
-      "ee-super-inserter-recycling": "Super inserter recycling",
-      "ee-infinity-pipe": "Infinity pipe",
-      "ee-infinity-pipe-recycling": "Infinity pipe recycling",
-      "ee-super-pump": "Super pump",
-      "ee-super-pump-recycling": "Super pump recycling",
-      "ee-infinity-heat-pipe": "Infinity heat pipe",
-      "ee-infinity-heat-pipe-recycling": "Infinity heat pipe recycling",
-      "ee-super-radar": "Super radar",
-      "ee-super-radar-recycling": "Super radar recycling",
-      "ee-super-lab": "Super lab",
-      "ee-super-lab-recycling": "Super lab recycling",
-      "ee-infinity-accumulator": "Infinity accumulator",
-      "ee-infinity-accumulator-recycling": "Infinity accumulator recycling",
-      "ee-super-electric-pole": "Super electric pole",
-      "ee-super-electric-pole-recycling": "Super electric pole recycling",
-      "ee-super-substation": "Super substation",
-      "ee-super-substation-recycling": "Super substation recycling",
-      "ee-super-locomotive": "Super locomotive",
-      "ee-super-locomotive-recycling": "Super locomotive recycling",
-      "ee-infinity-cargo-wagon": "Infinity cargo wagon",
-      "ee-infinity-cargo-wagon-recycling": "Infinity cargo wagon recycling",
-      "ee-infinity-fluid-wagon": "Infinity fluid wagon",
-      "ee-infinity-fluid-wagon-recycling": "Infinity fluid wagon recycling",
-      "ee-super-fuel": "Super fuel",
-      "ee-super-fuel-recycling": "Super fuel recycling",
-      "ee-super-roboport": "Super roboport",
-      "ee-super-roboport-recycling": "Super roboport recycling",
-      "ee-super-construction-robot": "Super construction robot",
-      "ee-super-construction-robot-recycling": "Super construction robot recycling",
-      "ee-super-logistic-robot": "Super logistic robot",
-      "ee-super-logistic-robot-recycling": "Super logistic robot recycling",
-      "ee-super-beacon": "Super beacon",
-      "ee-super-beacon-recycling": "Super beacon recycling",
-      "ee-super-speed-module": "Super speed module",
-      "ee-super-speed-module-recycling": "Super speed module recycling",
-      "ee-super-efficiency-module": "Super efficiency module",
-      "ee-super-efficiency-module-recycling": "Super efficiency module recycling",
-      "ee-super-productivity-module": "Super productivity module",
-      "ee-super-productivity-module-recycling": "Super productivity module recycling",
-      "ee-super-clean-module": "Super clean module",
-      "ee-super-clean-module-recycling": "Super clean module recycling",
-      "ee-super-slow-module": "Super slow module",
-      "ee-super-slow-module-recycling": "Super slow module recycling",
-      "ee-super-inefficiency-module": "Super inefficiency module",
-      "ee-super-inefficiency-module-recycling": "Super inefficiency module recycling",
-      "ee-super-dirty-module": "Super dirty module",
-      "ee-super-dirty-module-recycling": "Super dirty module recycling",
-      "ee-infinity-fission-reactor-equipment": "Infinity fission reactor",
-      "ee-infinity-fission-reactor-equipment-recycling": "Infinity fission reactor recycling",
-      "ee-super-personal-roboport-equipment": "Super personal roboport",
-      "ee-super-personal-roboport-equipment-recycling": "Super personal roboport recycling",
-      "ee-super-exoskeleton-equipment": "Super exoskeleton",
-      "ee-super-exoskeleton-equipment-recycling": "Super exoskeleton recycling",
-      "ee-super-energy-shield-equipment": "Super energy shield",
-      "ee-super-energy-shield-equipment-recycling": "Super energy shield recycling",
-      "ee-super-night-vision-equipment": "Super night vision",
-      "ee-super-night-vision-equipment-recycling": "Super night vision recycling",
-      "ee-super-battery-equipment": "Super personal battery",
-      "ee-super-battery-equipment-recycling": "Super personal battery recycling"
+      "burner-generator-recycling": "Burner generator recycling"
     },
     "descriptions": {
       "ammoniacal-solution-separation": "[fluid=ammoniacal-solution] is gained by an [entity=offshore-pump] in the oceans of [planet=aquilo].",
@@ -1297,8 +1145,7 @@
       "tiles": "Tiles",
       "environment": "Environment",
       "effects": "Effects",
-      "other": "Unsorted",
-      "ee-tools": "Testing Tools"
+      "other": "Unsorted"
     }
   },
   "quality": {

+ 720 - 690
src/assets/data/2.0/iconMap.json

@@ -138,4145 +138,4175 @@
     "size": 64
   },
   {
-    "name": "entity/big-volcanic-rock.png",
+    "name": "entity/big-volcanic-rock-hot.png",
     "x": 1280,
     "y": 0,
     "size": 64
   },
   {
-    "name": "entity/big-worm-turret.png",
+    "name": "entity/big-volcanic-rock.png",
     "x": 1344,
     "y": 0,
     "size": 64
   },
   {
-    "name": "entity/big-wriggler-pentapod-premature.png",
+    "name": "entity/big-worm-turret.png",
     "x": 1408,
     "y": 0,
     "size": 64
   },
   {
-    "name": "entity/big-wriggler-pentapod.png",
+    "name": "entity/big-wriggler-pentapod-premature.png",
     "x": 1472,
     "y": 0,
     "size": 64
   },
   {
-    "name": "entity/biochamber.png",
+    "name": "entity/big-wriggler-pentapod.png",
     "x": 1536,
     "y": 0,
     "size": 64
   },
   {
-    "name": "entity/biter-spawner.png",
+    "name": "entity/biochamber.png",
     "x": 1600,
     "y": 0,
     "size": 64
   },
   {
-    "name": "entity/boompuff.png",
+    "name": "entity/biter-spawner.png",
     "x": 1664,
     "y": 0,
     "size": 64
   },
   {
-    "name": "entity/captive-biter-spawner.png",
+    "name": "entity/boompuff.png",
     "x": 0,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/cargo-pod-container.png",
+    "name": "entity/captive-biter-spawner.png",
     "x": 64,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/cargo-pod.png",
+    "name": "entity/cargo-pod-container.png",
     "x": 128,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/centrifuge.png",
+    "name": "entity/cargo-pod.png",
     "x": 192,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/character.png",
+    "name": "entity/centrifuge.png",
     "x": 256,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/chemical-plant.png",
+    "name": "entity/character.png",
     "x": 320,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/cliff.png",
+    "name": "entity/chemical-plant.png",
     "x": 384,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/copper-stromatolite.png",
+    "name": "entity/cliff.png",
     "x": 448,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/crude-oil.png",
+    "name": "entity/copper-stromatolite.png",
     "x": 512,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/crusher.png",
+    "name": "entity/crude-oil.png",
     "x": 576,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/cryogenic-plant.png",
+    "name": "entity/crusher.png",
     "x": 640,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/cuttlepop.png",
+    "name": "entity/cryogenic-plant.png",
     "x": 704,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/defender.png",
+    "name": "entity/cuttlepop.png",
     "x": 768,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/destroyer.png",
+    "name": "entity/defender.png",
     "x": 832,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/distractor.png",
+    "name": "entity/destroyer.png",
     "x": 896,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/electromagnetic-plant.png",
+    "name": "entity/distractor.png",
     "x": 960,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/entity-ghost.png",
+    "name": "entity/electromagnetic-plant.png",
     "x": 1024,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fish.png",
+    "name": "entity/entity-ghost.png",
     "x": 1088,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fluorine-vent.png",
+    "name": "entity/fish.png",
     "x": 1152,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/foundry.png",
+    "name": "entity/fluorine-vent.png",
     "x": 1216,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fulgoran-ruin-attractor.png",
+    "name": "entity/foundry.png",
     "x": 1280,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fulgoran-ruin-big.png",
+    "name": "entity/fulgora-sunk-ruin-big.png",
     "x": 1344,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fulgoran-ruin-colossal.png",
+    "name": "entity/fulgora-sunk-ruin-medium-tall.png",
     "x": 1408,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fulgoran-ruin-huge.png",
+    "name": "entity/fulgoran-ruin-attractor.png",
     "x": 1472,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fulgoran-ruin-medium.png",
+    "name": "entity/fulgoran-ruin-big.png",
     "x": 1536,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fulgoran-ruin-small.png",
+    "name": "entity/fulgoran-ruin-colossal.png",
     "x": 1600,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fulgoran-ruin-stonehenge.png",
+    "name": "entity/fulgoran-ruin-huge.png",
     "x": 1664,
     "y": 64,
     "size": 64
   },
   {
-    "name": "entity/fulgoran-ruin-vault.png",
+    "name": "entity/fulgoran-ruin-medium.png",
     "x": 0,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/fulgurite-small.png",
+    "name": "entity/fulgoran-ruin-small.png",
     "x": 64,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/fulgurite.png",
+    "name": "entity/fulgoran-ruin-stonehenge.png",
     "x": 128,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/funneltrunk.png",
+    "name": "entity/fulgoran-ruin-vault.png",
     "x": 192,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/gleba-spawner-small.png",
+    "name": "entity/fulgurite-small.png",
     "x": 256,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/gleba-spawner.png",
+    "name": "entity/fulgurite.png",
     "x": 320,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/hairyclubnub.png",
+    "name": "entity/funneltrunk.png",
     "x": 384,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/huge-carbonic-asteroid.png",
+    "name": "entity/gleba-spawner-small.png",
     "x": 448,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/huge-metallic-asteroid.png",
+    "name": "entity/gleba-spawner.png",
     "x": 512,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/huge-oxide-asteroid.png",
+    "name": "entity/hairyclubnub.png",
     "x": 576,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/huge-promethium-asteroid.png",
+    "name": "entity/huge-carbonic-asteroid.png",
     "x": 640,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/huge-rock.png",
+    "name": "entity/huge-metallic-asteroid.png",
     "x": 704,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/huge-volcanic-rock.png",
+    "name": "entity/huge-oxide-asteroid.png",
     "x": 768,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/iron-stromatolite.png",
+    "name": "entity/huge-promethium-asteroid.png",
     "x": 832,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/item-on-ground.png",
+    "name": "entity/huge-rock.png",
     "x": 896,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/item-request-proxy.png",
+    "name": "entity/huge-volcanic-rock-hot.png",
     "x": 960,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/jellystem.png",
+    "name": "entity/huge-volcanic-rock.png",
     "x": 1024,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/lickmaw.png",
+    "name": "entity/iron-stromatolite.png",
     "x": 1088,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/lightning.png",
+    "name": "entity/item-on-ground.png",
     "x": 1152,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/lithium-brine.png",
+    "name": "entity/item-request-proxy.png",
     "x": 1216,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/lithium-iceberg-big.png",
+    "name": "entity/jellystem.png",
     "x": 1280,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/lithium-iceberg-huge.png",
+    "name": "entity/lickmaw.png",
     "x": 1344,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/medium-biter.png",
+    "name": "entity/lightning.png",
     "x": 1408,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/medium-carbonic-asteroid.png",
+    "name": "entity/lithium-brine.png",
     "x": 1472,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/medium-demolisher-corpse.png",
+    "name": "entity/lithium-iceberg-big.png",
     "x": 1536,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/medium-demolisher.png",
+    "name": "entity/lithium-iceberg-huge.png",
     "x": 1600,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/medium-metallic-asteroid.png",
+    "name": "entity/medium-biter.png",
     "x": 1664,
     "y": 128,
     "size": 64
   },
   {
-    "name": "entity/medium-oxide-asteroid.png",
+    "name": "entity/medium-carbonic-asteroid.png",
     "x": 0,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/medium-promethium-asteroid.png",
+    "name": "entity/medium-demolisher-corpse.png",
     "x": 64,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/medium-spitter.png",
+    "name": "entity/medium-demolisher.png",
     "x": 128,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/medium-stomper-pentapod.png",
+    "name": "entity/medium-metallic-asteroid.png",
     "x": 192,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/medium-stomper-shell.png",
+    "name": "entity/medium-oxide-asteroid.png",
     "x": 256,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/medium-strafer-pentapod.png",
+    "name": "entity/medium-promethium-asteroid.png",
     "x": 320,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/medium-worm-turret.png",
+    "name": "entity/medium-spitter.png",
     "x": 384,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/medium-wriggler-pentapod-premature.png",
+    "name": "entity/medium-stomper-pentapod.png",
     "x": 448,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/medium-wriggler-pentapod.png",
+    "name": "entity/medium-stomper-shell.png",
     "x": 512,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/oil-refinery.png",
+    "name": "entity/medium-strafer-pentapod.png",
     "x": 576,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/slipstack.png",
+    "name": "entity/medium-worm-turret.png",
     "x": 640,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-biter.png",
+    "name": "entity/medium-wriggler-pentapod-premature.png",
     "x": 704,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-carbonic-asteroid.png",
+    "name": "entity/medium-wriggler-pentapod.png",
     "x": 768,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-demolisher-corpse.png",
+    "name": "entity/oil-refinery.png",
     "x": 832,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-demolisher.png",
+    "name": "entity/slipstack.png",
     "x": 896,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-metallic-asteroid.png",
+    "name": "entity/small-biter.png",
     "x": 960,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-oxide-asteroid.png",
+    "name": "entity/small-carbonic-asteroid.png",
     "x": 1024,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-promethium-asteroid.png",
+    "name": "entity/small-demolisher-corpse.png",
     "x": 1088,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-spitter.png",
+    "name": "entity/small-demolisher.png",
     "x": 1152,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-stomper-pentapod.png",
+    "name": "entity/small-metallic-asteroid.png",
     "x": 1216,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-stomper-shell.png",
+    "name": "entity/small-oxide-asteroid.png",
     "x": 1280,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-strafer-pentapod.png",
+    "name": "entity/small-promethium-asteroid.png",
     "x": 1344,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-worm-turret.png",
+    "name": "entity/small-spitter.png",
     "x": 1408,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-wriggler-pentapod-premature.png",
+    "name": "entity/small-stomper-pentapod.png",
     "x": 1472,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/small-wriggler-pentapod.png",
+    "name": "entity/small-stomper-shell.png",
     "x": 1536,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/space-platform-hub.png",
+    "name": "entity/small-strafer-pentapod.png",
     "x": 1600,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/spitter-spawner.png",
+    "name": "entity/small-worm-turret.png",
     "x": 1664,
     "y": 192,
     "size": 64
   },
   {
-    "name": "entity/stingfrond.png",
+    "name": "entity/small-wriggler-pentapod-premature.png",
     "x": 0,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/sulfuric-acid-geyser.png",
+    "name": "entity/small-wriggler-pentapod.png",
     "x": 64,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/sunnycomb.png",
+    "name": "entity/space-platform-hub.png",
     "x": 128,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/teflilly.png",
+    "name": "entity/spitter-spawner.png",
     "x": 192,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/tile-ghost.png",
+    "name": "entity/stingfrond.png",
     "x": 256,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/tree-01.png",
+    "name": "entity/sulfuric-acid-geyser.png",
     "x": 320,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/vulcanus-chimney-cold.png",
+    "name": "entity/sunnycomb.png",
     "x": 384,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/vulcanus-chimney-faded.png",
+    "name": "entity/teflilly.png",
     "x": 448,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/vulcanus-chimney-short.png",
+    "name": "entity/tile-ghost.png",
     "x": 512,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/vulcanus-chimney-truncated.png",
+    "name": "entity/tree-01.png",
     "x": 576,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/vulcanus-chimney.png",
+    "name": "entity/tree-plant.png",
     "x": 640,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/water-cane.png",
+    "name": "entity/vulcanus-chimney-cold.png",
     "x": 704,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/wube-logo-space-platform.png",
+    "name": "entity/vulcanus-chimney-faded.png",
     "x": 768,
     "y": 256,
     "size": 64
   },
   {
-    "name": "entity/yumako-tree.png",
+    "name": "entity/vulcanus-chimney-short.png",
     "x": 832,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/ammonia.png",
+    "name": "entity/vulcanus-chimney-truncated.png",
     "x": 896,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/ammoniacal-solution.png",
+    "name": "entity/vulcanus-chimney.png",
     "x": 960,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/crude-oil.png",
+    "name": "entity/water-cane.png",
     "x": 1024,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/electrolyte.png",
+    "name": "entity/wube-logo-space-platform.png",
     "x": 1088,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/fluorine.png",
+    "name": "entity/yumako-tree.png",
     "x": 1152,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/fluoroketone-cold.png",
+    "name": "fluid/ammonia.png",
     "x": 1216,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/fluoroketone-hot.png",
+    "name": "fluid/ammoniacal-solution.png",
     "x": 1280,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/fusion-plasma.png",
+    "name": "fluid/crude-oil.png",
     "x": 1344,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/heavy-oil.png",
+    "name": "fluid/electrolyte.png",
     "x": 1408,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/holmium-solution.png",
+    "name": "fluid/fluorine.png",
     "x": 1472,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/lava.png",
+    "name": "fluid/fluoroketone-cold.png",
     "x": 1536,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/light-oil.png",
+    "name": "fluid/fluoroketone-hot.png",
     "x": 1600,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/lithium-brine.png",
+    "name": "fluid/fusion-plasma.png",
     "x": 1664,
     "y": 256,
     "size": 64
   },
   {
-    "name": "fluid/lubricant.png",
+    "name": "fluid/heavy-oil.png",
     "x": 0,
     "y": 320,
     "size": 64
   },
   {
-    "name": "fluid/molten-copper.png",
+    "name": "fluid/holmium-solution.png",
     "x": 64,
     "y": 320,
     "size": 64
   },
   {
-    "name": "fluid/molten-iron.png",
+    "name": "fluid/lava.png",
     "x": 128,
     "y": 320,
     "size": 64
   },
   {
-    "name": "fluid/petroleum-gas.png",
+    "name": "fluid/light-oil.png",
     "x": 192,
     "y": 320,
     "size": 64
   },
   {
-    "name": "fluid/steam.png",
+    "name": "fluid/lithium-brine.png",
     "x": 256,
     "y": 320,
     "size": 64
   },
   {
-    "name": "fluid/sulfuric-acid.png",
+    "name": "fluid/lubricant.png",
     "x": 320,
     "y": 320,
     "size": 64
   },
   {
-    "name": "fluid/thruster-fuel.png",
+    "name": "fluid/molten-copper.png",
     "x": 384,
     "y": 320,
     "size": 64
   },
   {
-    "name": "fluid/thruster-oxidizer.png",
+    "name": "fluid/molten-iron.png",
     "x": 448,
     "y": 320,
     "size": 64
   },
   {
-    "name": "fluid/water.png",
+    "name": "fluid/petroleum-gas.png",
     "x": 512,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/accumulator.png",
+    "name": "fluid/steam.png",
     "x": 576,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/active-provider-chest.png",
+    "name": "fluid/sulfuric-acid.png",
     "x": 640,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/advanced-circuit.png",
+    "name": "fluid/thruster-fuel.png",
     "x": 704,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/agricultural-science-pack.png",
+    "name": "fluid/thruster-oxidizer.png",
     "x": 768,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/agricultural-tower.png",
+    "name": "fluid/water.png",
     "x": 832,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/arithmetic-combinator.png",
+    "name": "item/accumulator.png",
     "x": 896,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/artificial-jellynut-soil.png",
+    "name": "item/active-provider-chest.png",
     "x": 960,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/artificial-yumako-soil.png",
+    "name": "item/advanced-circuit.png",
     "x": 1024,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/artillery-shell.png",
+    "name": "item/agricultural-science-pack.png",
     "x": 1088,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/artillery-targeting-remote.png",
+    "name": "item/agricultural-tower.png",
     "x": 1152,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/artillery-turret.png",
+    "name": "item/arithmetic-combinator.png",
     "x": 1216,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/artillery-wagon.png",
+    "name": "item/artificial-jellynut-soil.png",
     "x": 1280,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/assembling-machine-1.png",
+    "name": "item/artificial-yumako-soil.png",
     "x": 1344,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/assembling-machine-2.png",
+    "name": "item/artillery-shell.png",
     "x": 1408,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/assembling-machine-3.png",
+    "name": "item/artillery-targeting-remote.png",
     "x": 1472,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/asteroid-collector.png",
+    "name": "item/artillery-turret.png",
     "x": 1536,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/atomic-bomb.png",
+    "name": "item/artillery-wagon.png",
     "x": 1600,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/automation-science-pack.png",
+    "name": "item/assembling-machine-1.png",
     "x": 1664,
     "y": 320,
     "size": 64
   },
   {
-    "name": "item/barrel.png",
+    "name": "item/assembling-machine-2.png",
     "x": 0,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/battery-equipment.png",
+    "name": "item/assembling-machine-3.png",
     "x": 64,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/battery-mk2-equipment.png",
+    "name": "item/asteroid-collector.png",
     "x": 128,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/battery-mk3-equipment.png",
+    "name": "item/atomic-bomb.png",
     "x": 192,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/battery.png",
+    "name": "item/automation-science-pack.png",
     "x": 256,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/beacon.png",
+    "name": "item/barrel.png",
     "x": 320,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/belt-immunity-equipment.png",
+    "name": "item/battery-equipment.png",
     "x": 384,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/big-electric-pole.png",
+    "name": "item/battery-mk2-equipment.png",
     "x": 448,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/big-mining-drill.png",
+    "name": "item/battery-mk3-equipment.png",
     "x": 512,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/biochamber.png",
+    "name": "item/battery.png",
     "x": 576,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/bioflux.png",
+    "name": "item/beacon.png",
     "x": 640,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/biolab.png",
+    "name": "item/belt-immunity-equipment.png",
     "x": 704,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/biter-egg.png",
+    "name": "item/big-electric-pole.png",
     "x": 768,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/blueprint-book.png",
+    "name": "item/big-mining-drill.png",
     "x": 832,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/blueprint.png",
+    "name": "item/biochamber.png",
     "x": 896,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/boiler.png",
+    "name": "item/bioflux.png",
     "x": 960,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/buffer-chest.png",
+    "name": "item/biolab.png",
     "x": 1024,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/bulk-inserter.png",
+    "name": "item/biter-egg.png",
     "x": 1088,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/burner-inserter.png",
+    "name": "item/blueprint-book.png",
     "x": 1152,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/burner-mining-drill.png",
+    "name": "item/blueprint.png",
     "x": 1216,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/calcite.png",
+    "name": "item/boiler.png",
     "x": 1280,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/cannon-shell.png",
+    "name": "item/buffer-chest.png",
     "x": 1344,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/captive-biter-spawner.png",
+    "name": "item/bulk-inserter.png",
     "x": 1408,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/capture-robot-rocket.png",
+    "name": "item/burner-inserter.png",
     "x": 1472,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/car.png",
+    "name": "item/burner-mining-drill.png",
     "x": 1536,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/carbon-fiber.png",
+    "name": "item/calcite.png",
     "x": 1600,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/carbon.png",
+    "name": "item/cannon-shell.png",
     "x": 1664,
     "y": 384,
     "size": 64
   },
   {
-    "name": "item/carbonic-asteroid-chunk.png",
+    "name": "item/captive-biter-spawner.png",
     "x": 0,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/cargo-bay.png",
+    "name": "item/capture-robot-rocket.png",
     "x": 64,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/cargo-landing-pad.png",
+    "name": "item/car.png",
     "x": 128,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/cargo-wagon.png",
+    "name": "item/carbon-fiber.png",
     "x": 192,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/centrifuge.png",
+    "name": "item/carbon.png",
     "x": 256,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/chemical-plant.png",
+    "name": "item/carbonic-asteroid-chunk.png",
     "x": 320,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/chemical-science-pack.png",
+    "name": "item/cargo-bay.png",
     "x": 384,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/cliff-explosives.png",
+    "name": "item/cargo-landing-pad.png",
     "x": 448,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/cluster-grenade.png",
+    "name": "item/cargo-wagon.png",
     "x": 512,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/coal.png",
+    "name": "item/centrifuge.png",
     "x": 576,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/combat-shotgun.png",
+    "name": "item/chemical-plant.png",
     "x": 640,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/concrete.png",
+    "name": "item/chemical-science-pack.png",
     "x": 704,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/constant-combinator.png",
+    "name": "item/cliff-explosives.png",
     "x": 768,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/construction-robot.png",
+    "name": "item/cluster-grenade.png",
     "x": 832,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/copper-bacteria.png",
+    "name": "item/coal.png",
     "x": 896,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/copper-cable.png",
+    "name": "item/combat-shotgun.png",
     "x": 960,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/copper-ore.png",
+    "name": "item/concrete.png",
     "x": 1024,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/copper-plate.png",
+    "name": "item/constant-combinator.png",
     "x": 1088,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/crude-oil-barrel.png",
+    "name": "item/construction-robot.png",
     "x": 1152,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/crusher.png",
+    "name": "item/copper-bacteria.png",
     "x": 1216,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/cryogenic-plant.png",
+    "name": "item/copper-cable.png",
     "x": 1280,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/cryogenic-science-pack.png",
+    "name": "item/copper-ore.png",
     "x": 1344,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/decider-combinator.png",
+    "name": "item/copper-plate.png",
     "x": 1408,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/deconstruction-planner.png",
+    "name": "item/crude-oil-barrel.png",
     "x": 1472,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/defender-capsule.png",
+    "name": "item/crusher.png",
     "x": 1536,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/depleted-uranium-fuel-cell.png",
+    "name": "item/cryogenic-plant.png",
     "x": 1600,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/destroyer-capsule.png",
+    "name": "item/cryogenic-science-pack.png",
     "x": 1664,
     "y": 448,
     "size": 64
   },
   {
-    "name": "item/discharge-defense-equipment.png",
+    "name": "item/decider-combinator.png",
     "x": 0,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/discharge-defense-remote.png",
+    "name": "item/deconstruction-planner.png",
     "x": 64,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/display-panel.png",
+    "name": "item/defender-capsule.png",
     "x": 128,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/distractor-capsule.png",
+    "name": "item/depleted-uranium-fuel-cell.png",
     "x": 192,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/efficiency-module-2.png",
+    "name": "item/destroyer-capsule.png",
     "x": 256,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/efficiency-module-3.png",
+    "name": "item/discharge-defense-equipment.png",
     "x": 320,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/efficiency-module.png",
+    "name": "item/discharge-defense-remote.png",
     "x": 384,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/electric-engine-unit.png",
+    "name": "item/display-panel.png",
     "x": 448,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/electric-furnace.png",
+    "name": "item/distractor-capsule.png",
     "x": 512,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/electric-mining-drill.png",
+    "name": "item/efficiency-module-2.png",
     "x": 576,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/electromagnetic-plant.png",
+    "name": "item/efficiency-module-3.png",
     "x": 640,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/electromagnetic-science-pack.png",
+    "name": "item/efficiency-module.png",
     "x": 704,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/electronic-circuit.png",
+    "name": "item/electric-engine-unit.png",
     "x": 768,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/energy-shield-equipment.png",
+    "name": "item/electric-furnace.png",
     "x": 832,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/energy-shield-mk2-equipment.png",
+    "name": "item/electric-mining-drill.png",
     "x": 896,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/engine-unit.png",
+    "name": "item/electromagnetic-plant.png",
     "x": 960,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/exoskeleton-equipment.png",
+    "name": "item/electromagnetic-science-pack.png",
     "x": 1024,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/explosive-cannon-shell.png",
+    "name": "item/electronic-circuit.png",
     "x": 1088,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/explosive-rocket.png",
+    "name": "item/energy-shield-equipment.png",
     "x": 1152,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/explosive-uranium-cannon-shell.png",
+    "name": "item/energy-shield-mk2-equipment.png",
     "x": 1216,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/explosives.png",
+    "name": "item/engine-unit.png",
     "x": 1280,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/express-splitter.png",
+    "name": "item/exoskeleton-equipment.png",
     "x": 1344,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/express-transport-belt.png",
+    "name": "item/explosive-cannon-shell.png",
     "x": 1408,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/express-underground-belt.png",
+    "name": "item/explosive-rocket.png",
     "x": 1472,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/fast-inserter.png",
+    "name": "item/explosive-uranium-cannon-shell.png",
     "x": 1536,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/fast-splitter.png",
+    "name": "item/explosives.png",
     "x": 1600,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/fast-transport-belt.png",
+    "name": "item/express-splitter.png",
     "x": 1664,
     "y": 512,
     "size": 64
   },
   {
-    "name": "item/fast-underground-belt.png",
+    "name": "item/express-transport-belt.png",
     "x": 0,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/firearm-magazine.png",
+    "name": "item/express-underground-belt.png",
     "x": 64,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/fission-reactor-equipment.png",
+    "name": "item/fast-inserter.png",
     "x": 128,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/flamethrower-ammo.png",
+    "name": "item/fast-splitter.png",
     "x": 192,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/flamethrower-turret.png",
+    "name": "item/fast-transport-belt.png",
     "x": 256,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/flamethrower.png",
+    "name": "item/fast-underground-belt.png",
     "x": 320,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/fluid-wagon.png",
+    "name": "item/firearm-magazine.png",
     "x": 384,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/fluoroketone-cold-barrel.png",
+    "name": "item/fission-reactor-equipment.png",
     "x": 448,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/fluoroketone-hot-barrel.png",
+    "name": "item/flamethrower-ammo.png",
     "x": 512,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/flying-robot-frame.png",
+    "name": "item/flamethrower-turret.png",
     "x": 576,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/foundation.png",
+    "name": "item/flamethrower.png",
     "x": 640,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/foundry.png",
+    "name": "item/fluid-wagon.png",
     "x": 704,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/fusion-generator.png",
+    "name": "item/fluoroketone-cold-barrel.png",
     "x": 768,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/fusion-power-cell.png",
+    "name": "item/fluoroketone-hot-barrel.png",
     "x": 832,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/fusion-reactor-equipment.png",
+    "name": "item/flying-robot-frame.png",
     "x": 896,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/fusion-reactor.png",
+    "name": "item/foundation.png",
     "x": 960,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/gate.png",
+    "name": "item/foundry.png",
     "x": 1024,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/grenade.png",
+    "name": "item/fusion-generator.png",
     "x": 1088,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/gun-turret.png",
+    "name": "item/fusion-power-cell.png",
     "x": 1152,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/hazard-concrete.png",
+    "name": "item/fusion-reactor-equipment.png",
     "x": 1216,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/heat-exchanger.png",
+    "name": "item/fusion-reactor.png",
     "x": 1280,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/heat-pipe.png",
+    "name": "item/gate.png",
     "x": 1344,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/heating-tower.png",
+    "name": "item/grenade.png",
     "x": 1408,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/heavy-armor.png",
+    "name": "item/gun-turret.png",
     "x": 1472,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/heavy-oil-barrel.png",
+    "name": "item/hazard-concrete.png",
     "x": 1536,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/holmium-ore.png",
+    "name": "item/heat-exchanger.png",
     "x": 1600,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/holmium-plate.png",
+    "name": "item/heat-pipe.png",
     "x": 1664,
     "y": 576,
     "size": 64
   },
   {
-    "name": "item/ice-platform.png",
+    "name": "item/heating-tower.png",
     "x": 0,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/ice.png",
+    "name": "item/heavy-armor.png",
     "x": 64,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/inserter.png",
+    "name": "item/heavy-oil-barrel.png",
     "x": 128,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/iron-bacteria.png",
+    "name": "item/holmium-ore.png",
     "x": 192,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/iron-chest.png",
+    "name": "item/holmium-plate.png",
     "x": 256,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/iron-gear-wheel.png",
+    "name": "item/ice-platform.png",
     "x": 320,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/iron-ore.png",
+    "name": "item/ice.png",
     "x": 384,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/iron-plate.png",
+    "name": "item/inserter.png",
     "x": 448,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/iron-stick.png",
+    "name": "item/iron-bacteria.png",
     "x": 512,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/jelly.png",
+    "name": "item/iron-chest.png",
     "x": 576,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/jellynut-seed.png",
+    "name": "item/iron-gear-wheel.png",
     "x": 640,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/jellynut.png",
+    "name": "item/iron-ore.png",
     "x": 704,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/lab.png",
+    "name": "item/iron-plate.png",
     "x": 768,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/land-mine.png",
+    "name": "item/iron-stick.png",
     "x": 832,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/landfill.png",
+    "name": "item/jelly.png",
     "x": 896,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/laser-turret.png",
+    "name": "item/jellynut-seed.png",
     "x": 960,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/light-armor.png",
+    "name": "item/jellynut.png",
     "x": 1024,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/light-oil-barrel.png",
+    "name": "item/lab.png",
     "x": 1088,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/lightning-collector.png",
+    "name": "item/land-mine.png",
     "x": 1152,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/lightning-rod.png",
+    "name": "item/landfill.png",
     "x": 1216,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/lithium-plate.png",
+    "name": "item/landing-pad-unloading-bay.png",
     "x": 1280,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/lithium.png",
+    "name": "item/laser-turret.png",
     "x": 1344,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/locomotive.png",
+    "name": "item/light-armor.png",
     "x": 1408,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/logistic-robot.png",
+    "name": "item/light-oil-barrel.png",
     "x": 1472,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/logistic-science-pack.png",
+    "name": "item/lightning-collector.png",
     "x": 1536,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/long-handed-inserter.png",
+    "name": "item/lightning-rod.png",
     "x": 1600,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/low-density-structure.png",
+    "name": "item/lithium-plate.png",
     "x": 1664,
     "y": 640,
     "size": 64
   },
   {
-    "name": "item/lubricant-barrel.png",
+    "name": "item/lithium.png",
     "x": 0,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/mech-armor.png",
+    "name": "item/locomotive.png",
     "x": 64,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/medium-electric-pole.png",
+    "name": "item/logistic-robot.png",
     "x": 128,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/metallic-asteroid-chunk.png",
+    "name": "item/logistic-science-pack.png",
     "x": 192,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/metallurgic-science-pack.png",
+    "name": "item/long-handed-inserter.png",
     "x": 256,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/military-science-pack.png",
+    "name": "item/low-density-structure.png",
     "x": 320,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/modular-armor.png",
+    "name": "item/lubricant-barrel.png",
     "x": 384,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/night-vision-equipment.png",
+    "name": "item/mech-armor.png",
     "x": 448,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/nuclear-fuel.png",
+    "name": "item/medium-electric-pole.png",
     "x": 512,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/nuclear-reactor.png",
+    "name": "item/metallic-asteroid-chunk.png",
     "x": 576,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/nutrients.png",
+    "name": "item/metallurgic-science-pack.png",
     "x": 640,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/offshore-pump.png",
+    "name": "item/military-science-pack.png",
     "x": 704,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/oil-refinery.png",
+    "name": "item/modular-armor.png",
     "x": 768,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/overgrowth-jellynut-soil.png",
+    "name": "item/night-vision-equipment.png",
     "x": 832,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/overgrowth-yumako-soil.png",
+    "name": "item/nuclear-fuel.png",
     "x": 896,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/oxide-asteroid-chunk.png",
+    "name": "item/nuclear-reactor.png",
     "x": 960,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-0.png",
+    "name": "item/nutrients.png",
     "x": 1024,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-1.png",
+    "name": "item/offshore-pump.png",
     "x": 1088,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-2.png",
+    "name": "item/oil-refinery.png",
     "x": 1152,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-3.png",
+    "name": "item/overgrowth-jellynut-soil.png",
     "x": 1216,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-4.png",
+    "name": "item/overgrowth-yumako-soil.png",
     "x": 1280,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-5.png",
+    "name": "item/oxide-asteroid-chunk.png",
     "x": 1344,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-6.png",
+    "name": "item/parameter-0.png",
     "x": 1408,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-7.png",
+    "name": "item/parameter-1.png",
     "x": 1472,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-8.png",
+    "name": "item/parameter-2.png",
     "x": 1536,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/parameter-9.png",
+    "name": "item/parameter-3.png",
     "x": 1600,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/passive-provider-chest.png",
+    "name": "item/parameter-4.png",
     "x": 1664,
     "y": 704,
     "size": 64
   },
   {
-    "name": "item/pentapod-egg.png",
+    "name": "item/parameter-5.png",
     "x": 0,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/personal-laser-defense-equipment.png",
+    "name": "item/parameter-6.png",
     "x": 64,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/personal-roboport-equipment.png",
+    "name": "item/parameter-7.png",
     "x": 128,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/personal-roboport-mk2-equipment.png",
+    "name": "item/parameter-8.png",
     "x": 192,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/petroleum-gas-barrel.png",
+    "name": "item/parameter-9.png",
     "x": 256,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/piercing-rounds-magazine.png",
+    "name": "item/passive-provider-chest.png",
     "x": 320,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/piercing-shotgun-shell.png",
+    "name": "item/pentapod-egg.png",
     "x": 384,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/pipe-to-ground.png",
+    "name": "item/personal-laser-defense-equipment.png",
     "x": 448,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/pipe.png",
+    "name": "item/personal-roboport-equipment.png",
     "x": 512,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/pistol.png",
+    "name": "item/personal-roboport-mk2-equipment.png",
     "x": 576,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/plastic-bar.png",
+    "name": "item/petroleum-gas-barrel.png",
     "x": 640,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/poison-capsule.png",
+    "name": "item/piercing-rounds-magazine.png",
     "x": 704,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/power-armor-mk2.png",
+    "name": "item/piercing-shotgun-shell.png",
     "x": 768,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/power-armor.png",
+    "name": "item/pipe-to-ground.png",
     "x": 832,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/power-switch.png",
+    "name": "item/pipe.png",
     "x": 896,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/processing-unit.png",
+    "name": "item/pistol.png",
     "x": 960,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/production-science-pack.png",
+    "name": "item/plastic-bar.png",
     "x": 1024,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/productivity-module-2.png",
+    "name": "item/poison-capsule.png",
     "x": 1088,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/productivity-module-3.png",
+    "name": "item/power-armor-mk2.png",
     "x": 1152,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/productivity-module.png",
+    "name": "item/power-armor.png",
     "x": 1216,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/programmable-speaker.png",
+    "name": "item/power-switch.png",
     "x": 1280,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/promethium-asteroid-chunk.png",
+    "name": "item/processing-unit.png",
     "x": 1344,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/promethium-science-pack.png",
+    "name": "item/production-science-pack.png",
     "x": 1408,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/pump.png",
+    "name": "item/productivity-module-2.png",
     "x": 1472,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/pumpjack.png",
+    "name": "item/productivity-module-3.png",
     "x": 1536,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/quality-module-2.png",
+    "name": "item/productivity-module.png",
     "x": 1600,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/quality-module-3.png",
+    "name": "item/programmable-speaker.png",
     "x": 1664,
     "y": 768,
     "size": 64
   },
   {
-    "name": "item/quality-module.png",
+    "name": "item/promethium-asteroid-chunk.png",
     "x": 0,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/quantum-processor.png",
+    "name": "item/promethium-science-pack.png",
     "x": 64,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/radar.png",
+    "name": "item/pump.png",
     "x": 128,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rail-chain-signal.png",
+    "name": "item/pumpjack.png",
     "x": 192,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rail-ramp.png",
+    "name": "item/quality-module-2.png",
     "x": 256,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rail-signal.png",
+    "name": "item/quality-module-3.png",
     "x": 320,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rail-support.png",
+    "name": "item/quality-module.png",
     "x": 384,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rail.png",
+    "name": "item/quantum-processor.png",
     "x": 448,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/railgun-ammo.png",
+    "name": "item/radar.png",
     "x": 512,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/railgun-turret.png",
+    "name": "item/rail-chain-signal.png",
     "x": 576,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/railgun.png",
+    "name": "item/rail-ramp.png",
     "x": 640,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/raw-fish.png",
+    "name": "item/rail-signal.png",
     "x": 704,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/recycler.png",
+    "name": "item/rail-support.png",
     "x": 768,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/refined-concrete.png",
+    "name": "item/rail.png",
     "x": 832,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/refined-hazard-concrete.png",
+    "name": "item/railgun-ammo.png",
     "x": 896,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/repair-pack.png",
+    "name": "item/railgun-turret.png",
     "x": 960,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/requester-chest.png",
+    "name": "item/railgun.png",
     "x": 1024,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/roboport.png",
+    "name": "item/raw-fish.png",
     "x": 1088,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rocket-fuel.png",
+    "name": "item/recycler.png",
     "x": 1152,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rocket-launcher.png",
+    "name": "item/refined-concrete.png",
     "x": 1216,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rocket-part.png",
+    "name": "item/refined-hazard-concrete.png",
     "x": 1280,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rocket-silo.png",
+    "name": "item/repair-pack.png",
     "x": 1344,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rocket-turret.png",
+    "name": "item/requester-chest.png",
     "x": 1408,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/rocket.png",
+    "name": "item/roboport.png",
     "x": 1472,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/scrap.png",
+    "name": "item/rocket-fuel.png",
     "x": 1536,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/selector-combinator.png",
+    "name": "item/rocket-launcher.png",
     "x": 1600,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/shotgun-shell.png",
+    "name": "item/rocket-part.png",
     "x": 1664,
     "y": 832,
     "size": 64
   },
   {
-    "name": "item/shotgun.png",
+    "name": "item/rocket-silo.png",
     "x": 0,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/slowdown-capsule.png",
+    "name": "item/rocket-turret.png",
     "x": 64,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/small-electric-pole.png",
+    "name": "item/rocket.png",
     "x": 128,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/small-lamp.png",
+    "name": "item/scrap.png",
     "x": 192,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/solar-panel-equipment.png",
+    "name": "item/selector-combinator.png",
     "x": 256,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/solar-panel.png",
+    "name": "item/shotgun-shell.png",
     "x": 320,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/solid-fuel.png",
+    "name": "item/shotgun.png",
     "x": 384,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/space-platform-foundation.png",
+    "name": "item/slowdown-capsule.png",
     "x": 448,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/space-platform-starter-pack.png",
+    "name": "item/small-electric-pole.png",
     "x": 512,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/space-science-pack.png",
+    "name": "item/small-lamp.png",
     "x": 576,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/speed-module-2.png",
+    "name": "item/solar-panel-equipment.png",
     "x": 640,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/speed-module-3.png",
+    "name": "item/solar-panel.png",
     "x": 704,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/speed-module.png",
+    "name": "item/solid-fuel.png",
     "x": 768,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/spidertron-remote.png",
+    "name": "item/space-platform-foundation.png",
     "x": 832,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/spidertron.png",
+    "name": "item/space-platform-starter-pack.png",
     "x": 896,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/splitter.png",
+    "name": "item/space-science-pack.png",
     "x": 960,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/spoilage.png",
+    "name": "item/speed-module-2.png",
     "x": 1024,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/stack-inserter.png",
+    "name": "item/speed-module-3.png",
     "x": 1088,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/steam-engine.png",
+    "name": "item/speed-module.png",
     "x": 1152,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/steam-turbine.png",
+    "name": "item/spidertron-remote.png",
     "x": 1216,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/steel-chest.png",
+    "name": "item/spidertron.png",
     "x": 1280,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/steel-furnace.png",
+    "name": "item/splitter.png",
     "x": 1344,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/steel-plate.png",
+    "name": "item/spoilage.png",
     "x": 1408,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/stone-brick.png",
+    "name": "item/stack-inserter.png",
     "x": 1472,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/stone-furnace.png",
+    "name": "item/steam-engine.png",
     "x": 1536,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/stone-wall.png",
+    "name": "item/steam-turbine.png",
     "x": 1600,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/stone.png",
+    "name": "item/steel-chest.png",
     "x": 1664,
     "y": 896,
     "size": 64
   },
   {
-    "name": "item/storage-chest.png",
+    "name": "item/steel-furnace.png",
     "x": 0,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/storage-tank.png",
+    "name": "item/steel-plate.png",
     "x": 64,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/submachine-gun.png",
+    "name": "item/stone-brick.png",
     "x": 128,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/substation.png",
+    "name": "item/stone-furnace.png",
     "x": 192,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/sulfur.png",
+    "name": "item/stone-wall.png",
     "x": 256,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/sulfuric-acid-barrel.png",
+    "name": "item/stone.png",
     "x": 320,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/supercapacitor.png",
+    "name": "item/storage-chest.png",
     "x": 384,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/superconductor.png",
+    "name": "item/storage-tank.png",
     "x": 448,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/tank.png",
+    "name": "item/submachine-gun.png",
     "x": 512,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/tesla-ammo.png",
+    "name": "item/substation.png",
     "x": 576,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/tesla-turret.png",
+    "name": "item/sulfur.png",
     "x": 640,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/teslagun.png",
+    "name": "item/sulfuric-acid-barrel.png",
     "x": 704,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/thruster.png",
+    "name": "item/supercapacitor.png",
     "x": 768,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/toolbelt-equipment.png",
+    "name": "item/superconductor.png",
     "x": 832,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/train-stop.png",
+    "name": "item/tank.png",
     "x": 896,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/transport-belt.png",
+    "name": "item/tesla-ammo.png",
     "x": 960,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/tree-seed.png",
+    "name": "item/tesla-turret.png",
     "x": 1024,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/tungsten-carbide.png",
+    "name": "item/teslagun.png",
     "x": 1088,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/tungsten-ore.png",
+    "name": "item/thruster.png",
     "x": 1152,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/tungsten-plate.png",
+    "name": "item/toolbelt-equipment.png",
     "x": 1216,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/turbo-splitter.png",
+    "name": "item/train-stop.png",
     "x": 1280,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/turbo-transport-belt.png",
+    "name": "item/transport-belt.png",
     "x": 1344,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/turbo-underground-belt.png",
+    "name": "item/tree-seed.png",
     "x": 1408,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/underground-belt.png",
+    "name": "item/tungsten-carbide.png",
     "x": 1472,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/upgrade-planner.png",
+    "name": "item/tungsten-ore.png",
     "x": 1536,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/uranium-235.png",
+    "name": "item/tungsten-plate.png",
     "x": 1600,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/uranium-238.png",
+    "name": "item/turbo-splitter.png",
     "x": 1664,
     "y": 960,
     "size": 64
   },
   {
-    "name": "item/uranium-cannon-shell.png",
+    "name": "item/turbo-transport-belt.png",
     "x": 0,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/uranium-fuel-cell.png",
+    "name": "item/turbo-underground-belt.png",
     "x": 64,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/uranium-ore.png",
+    "name": "item/underground-belt.png",
     "x": 128,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/uranium-rounds-magazine.png",
+    "name": "item/upgrade-planner.png",
     "x": 192,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/utility-science-pack.png",
+    "name": "item/uranium-235.png",
     "x": 256,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/water-barrel.png",
+    "name": "item/uranium-238.png",
     "x": 320,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/wood.png",
+    "name": "item/uranium-cannon-shell.png",
     "x": 384,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/wooden-chest.png",
+    "name": "item/uranium-fuel-cell.png",
     "x": 448,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/yumako-mash.png",
+    "name": "item/uranium-ore.png",
     "x": 512,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/yumako-seed.png",
+    "name": "item/uranium-rounds-magazine.png",
     "x": 576,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "item/yumako.png",
+    "name": "item/utility-science-pack.png",
     "x": 640,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "quality/epic.png",
+    "name": "item/water-barrel.png",
     "x": 704,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "quality/legendary.png",
+    "name": "item/wood.png",
     "x": 768,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "quality/normal.png",
+    "name": "item/wooden-chest.png",
     "x": 832,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "quality/rare.png",
+    "name": "item/yumako-mash.png",
     "x": 896,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "quality/uncommon.png",
+    "name": "item/yumako-seed.png",
     "x": 960,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/acid-neutralisation.png",
+    "name": "item/yumako.png",
     "x": 1024,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/advanced-carbonic-asteroid-crushing.png",
+    "name": "quality/epic.png",
     "x": 1088,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/advanced-metallic-asteroid-crushing.png",
+    "name": "quality/legendary.png",
     "x": 1152,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/advanced-oil-processing.png",
+    "name": "quality/normal.png",
     "x": 1216,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/advanced-oxide-asteroid-crushing.png",
+    "name": "quality/rare.png",
     "x": 1280,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/advanced-thruster-fuel.png",
+    "name": "quality/uncommon.png",
     "x": 1344,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/advanced-thruster-oxidizer.png",
+    "name": "recipe/acid-neutralisation.png",
     "x": 1408,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/ammonia-rocket-fuel.png",
+    "name": "recipe/advanced-carbonic-asteroid-crushing.png",
     "x": 1472,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/ammoniacal-solution-separation.png",
+    "name": "recipe/advanced-metallic-asteroid-crushing.png",
     "x": 1536,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/artificial-jellynut-soil.png",
+    "name": "recipe/advanced-oil-processing.png",
     "x": 1600,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/artificial-yumako-soil.png",
+    "name": "recipe/advanced-oxide-asteroid-crushing.png",
     "x": 1664,
     "y": 1024,
     "size": 64
   },
   {
-    "name": "recipe/basic-oil-processing.png",
+    "name": "recipe/advanced-thruster-fuel.png",
     "x": 0,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/bioflux.png",
+    "name": "recipe/advanced-thruster-oxidizer.png",
     "x": 64,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/biolubricant.png",
+    "name": "recipe/ammonia-rocket-fuel.png",
     "x": 128,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/bioplastic.png",
+    "name": "recipe/ammoniacal-solution-separation.png",
     "x": 192,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/biosulfur.png",
+    "name": "recipe/artificial-jellynut-soil.png",
     "x": 256,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/biter-egg.png",
+    "name": "recipe/artificial-yumako-soil.png",
     "x": 320,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/burnt-spoilage.png",
+    "name": "recipe/basic-oil-processing.png",
     "x": 384,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/carbon.png",
+    "name": "recipe/bioflux.png",
     "x": 448,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/carbonic-asteroid-crushing.png",
+    "name": "recipe/biolubricant.png",
     "x": 512,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/carbonic-asteroid-reprocessing.png",
+    "name": "recipe/bioplastic.png",
     "x": 576,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-copper-cable.png",
+    "name": "recipe/biosulfur.png",
     "x": 640,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-copper.png",
+    "name": "recipe/biter-egg.png",
     "x": 704,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-iron-gear-wheel.png",
+    "name": "recipe/burnt-spoilage.png",
     "x": 768,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-iron-stick.png",
+    "name": "recipe/carbon.png",
     "x": 832,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-iron.png",
+    "name": "recipe/carbonic-asteroid-crushing.png",
     "x": 896,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-low-density-structure.png",
+    "name": "recipe/carbonic-asteroid-reprocessing.png",
     "x": 960,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-pipe-to-ground.png",
+    "name": "recipe/casting-copper-cable.png",
     "x": 1024,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-pipe.png",
+    "name": "recipe/casting-copper.png",
     "x": 1088,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/casting-steel.png",
+    "name": "recipe/casting-iron-gear-wheel.png",
     "x": 1152,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/coal-liquefaction.png",
+    "name": "recipe/casting-iron-stick.png",
     "x": 1216,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/coal-synthesis.png",
+    "name": "recipe/casting-iron.png",
     "x": 1280,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/concrete-from-molten-iron.png",
+    "name": "recipe/casting-low-density-structure.png",
     "x": 1344,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/copper-bacteria-cultivation.png",
+    "name": "recipe/casting-pipe-to-ground.png",
     "x": 1408,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/copper-bacteria.png",
+    "name": "recipe/casting-pipe.png",
     "x": 1472,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/crude-oil-barrel.png",
+    "name": "recipe/casting-steel.png",
     "x": 1536,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/empty-crude-oil-barrel.png",
+    "name": "recipe/coal-liquefaction.png",
     "x": 1600,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/empty-fluoroketone-cold-barrel.png",
+    "name": "recipe/coal-synthesis.png",
     "x": 1664,
     "y": 1088,
     "size": 64
   },
   {
-    "name": "recipe/empty-fluoroketone-hot-barrel.png",
+    "name": "recipe/concrete-from-molten-iron.png",
     "x": 0,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/empty-heavy-oil-barrel.png",
+    "name": "recipe/copper-bacteria-cultivation.png",
     "x": 64,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/empty-light-oil-barrel.png",
+    "name": "recipe/copper-bacteria.png",
     "x": 128,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/empty-lubricant-barrel.png",
+    "name": "recipe/copper-ore-melting.png",
     "x": 192,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/empty-petroleum-gas-barrel.png",
+    "name": "recipe/crude-oil-barrel.png",
     "x": 256,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/empty-sulfuric-acid-barrel.png",
+    "name": "recipe/empty-crude-oil-barrel.png",
     "x": 320,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/empty-water-barrel.png",
+    "name": "recipe/empty-fluoroketone-cold-barrel.png",
     "x": 384,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/fish-breeding.png",
+    "name": "recipe/empty-fluoroketone-hot-barrel.png",
     "x": 448,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/fluoroketone-cold-barrel.png",
+    "name": "recipe/empty-heavy-oil-barrel.png",
     "x": 512,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/fluoroketone-cooling.png",
+    "name": "recipe/empty-light-oil-barrel.png",
     "x": 576,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/fluoroketone-hot-barrel.png",
+    "name": "recipe/empty-lubricant-barrel.png",
     "x": 640,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/heavy-oil-barrel.png",
+    "name": "recipe/empty-petroleum-gas-barrel.png",
     "x": 704,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/heavy-oil-cracking.png",
+    "name": "recipe/empty-sulfuric-acid-barrel.png",
     "x": 768,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/ice-melting.png",
+    "name": "recipe/empty-water-barrel.png",
     "x": 832,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/iron-bacteria-cultivation.png",
+    "name": "recipe/fish-breeding.png",
     "x": 896,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/iron-bacteria.png",
+    "name": "recipe/fluoroketone-cold-barrel.png",
     "x": 960,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/jellynut-processing.png",
+    "name": "recipe/fluoroketone-cooling.png",
     "x": 1024,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/kovarex-enrichment-process.png",
+    "name": "recipe/fluoroketone-hot-barrel.png",
     "x": 1088,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/light-oil-barrel.png",
+    "name": "recipe/heavy-oil-barrel.png",
     "x": 1152,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/light-oil-cracking.png",
+    "name": "recipe/heavy-oil-cracking.png",
     "x": 1216,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/lubricant-barrel.png",
+    "name": "recipe/ice-melting.png",
     "x": 1280,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/metallic-asteroid-crushing.png",
+    "name": "recipe/iron-bacteria-cultivation.png",
     "x": 1344,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/metallic-asteroid-reprocessing.png",
+    "name": "recipe/iron-bacteria.png",
     "x": 1408,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/molten-copper-from-lava.png",
+    "name": "recipe/iron-ore-melting.png",
     "x": 1472,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/molten-copper.png",
+    "name": "recipe/jellynut-processing.png",
     "x": 1536,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/molten-iron-from-lava.png",
+    "name": "recipe/kovarex-enrichment-process.png",
     "x": 1600,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/molten-iron.png",
+    "name": "recipe/light-oil-barrel.png",
     "x": 1664,
     "y": 1152,
     "size": 64
   },
   {
-    "name": "recipe/nuclear-fuel-reprocessing.png",
+    "name": "recipe/light-oil-cracking.png",
     "x": 0,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/nutrients-from-bioflux.png",
+    "name": "recipe/lubricant-barrel.png",
     "x": 64,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/nutrients-from-biter-egg.png",
+    "name": "recipe/metallic-asteroid-crushing.png",
     "x": 128,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/nutrients-from-fish.png",
+    "name": "recipe/metallic-asteroid-reprocessing.png",
     "x": 192,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/nutrients-from-spoilage.png",
+    "name": "recipe/molten-copper-from-lava.png",
     "x": 256,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/nutrients-from-yumako-mash.png",
+    "name": "recipe/molten-iron-from-lava.png",
     "x": 320,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/overgrowth-jellynut-soil.png",
+    "name": "recipe/nuclear-fuel-reprocessing.png",
     "x": 384,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/overgrowth-yumako-soil.png",
+    "name": "recipe/nutrients-from-bioflux.png",
     "x": 448,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/oxide-asteroid-crushing.png",
+    "name": "recipe/nutrients-from-biter-egg.png",
     "x": 512,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/oxide-asteroid-reprocessing.png",
+    "name": "recipe/nutrients-from-fish.png",
     "x": 576,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-0.png",
+    "name": "recipe/nutrients-from-spoilage.png",
     "x": 640,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-1.png",
+    "name": "recipe/nutrients-from-yumako-mash.png",
     "x": 704,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-2.png",
+    "name": "recipe/overgrowth-jellynut-soil.png",
     "x": 768,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-3.png",
+    "name": "recipe/overgrowth-yumako-soil.png",
     "x": 832,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-4.png",
+    "name": "recipe/oxide-asteroid-crushing.png",
     "x": 896,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-5.png",
+    "name": "recipe/oxide-asteroid-reprocessing.png",
     "x": 960,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-6.png",
+    "name": "recipe/parameter-0.png",
     "x": 1024,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-7.png",
+    "name": "recipe/parameter-1.png",
     "x": 1088,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-8.png",
+    "name": "recipe/parameter-2.png",
     "x": 1152,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/parameter-9.png",
+    "name": "recipe/parameter-3.png",
     "x": 1216,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/pentapod-egg.png",
+    "name": "recipe/parameter-4.png",
     "x": 1280,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/petroleum-gas-barrel.png",
+    "name": "recipe/parameter-5.png",
     "x": 1344,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/rocket-fuel-from-jelly.png",
+    "name": "recipe/parameter-6.png",
     "x": 1408,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/scrap-recycling.png",
+    "name": "recipe/parameter-7.png",
     "x": 1472,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/simple-coal-liquefaction.png",
+    "name": "recipe/parameter-8.png",
     "x": 1536,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/solid-fuel-from-ammonia.png",
+    "name": "recipe/parameter-9.png",
     "x": 1600,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/solid-fuel-from-heavy-oil.png",
+    "name": "recipe/pentapod-egg.png",
     "x": 1664,
     "y": 1216,
     "size": 64
   },
   {
-    "name": "recipe/solid-fuel-from-light-oil.png",
+    "name": "recipe/petroleum-gas-barrel.png",
     "x": 0,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "recipe/solid-fuel-from-petroleum-gas.png",
+    "name": "recipe/rocket-fuel-from-jelly.png",
     "x": 64,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "recipe/space-science-pack.png",
+    "name": "recipe/scrap-recycling.png",
     "x": 128,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "recipe/steam-condensation.png",
+    "name": "recipe/simple-coal-liquefaction.png",
     "x": 192,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "recipe/sulfuric-acid-barrel.png",
+    "name": "recipe/solid-fuel-from-ammonia.png",
     "x": 256,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "recipe/uranium-processing.png",
+    "name": "recipe/solid-fuel-from-heavy-oil.png",
     "x": 320,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "recipe/water-barrel.png",
+    "name": "recipe/solid-fuel-from-light-oil.png",
     "x": 384,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "recipe/wood-processing.png",
+    "name": "recipe/solid-fuel-from-petroleum-gas.png",
     "x": 448,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "recipe/yumako-processing.png",
+    "name": "recipe/space-science-pack.png",
     "x": 512,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "space-location/aquilo.png",
+    "name": "recipe/steam-condensation.png",
     "x": 576,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "space-location/fulgora.png",
+    "name": "recipe/sulfuric-acid-barrel.png",
     "x": 640,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "space-location/gleba.png",
+    "name": "recipe/uranium-processing.png",
     "x": 704,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "space-location/nauvis.png",
+    "name": "recipe/water-barrel.png",
     "x": 768,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "space-location/shattered-planet.png",
+    "name": "recipe/yumako-processing.png",
     "x": 832,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "space-location/solar-system-edge.png",
+    "name": "space-location/aquilo.png",
     "x": 896,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "space-location/vulcanus.png",
+    "name": "space-location/fulgora.png",
     "x": 960,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/down-arrow.png",
+    "name": "space-location/gleba.png",
     "x": 1024,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/down-left-arrow.png",
+    "name": "space-location/nauvis.png",
     "x": 1088,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/down-right-arrow.png",
+    "name": "space-location/shattered-planet.png",
     "x": 1152,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/left-arrow.png",
+    "name": "space-location/solar-system-edge.png",
     "x": 1216,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/right-arrow.png",
+    "name": "space-location/vulcanus.png",
     "x": 1280,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-circle.png",
+    "name": "virtual-signal/down-arrow.png",
     "x": 1344,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-corner-2.png",
+    "name": "virtual-signal/down-left-arrow.png",
     "x": 1408,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-corner-3.png",
+    "name": "virtual-signal/down-right-arrow.png",
     "x": 1472,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-corner-4.png",
+    "name": "virtual-signal/left-arrow.png",
     "x": 1536,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-corner.png",
+    "name": "virtual-signal/right-arrow.png",
     "x": 1600,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-cross.png",
+    "name": "virtual-signal/shape-circle.png",
     "x": 1664,
     "y": 1280,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-curve-2.png",
+    "name": "virtual-signal/shape-corner-2.png",
     "x": 0,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-curve-3.png",
+    "name": "virtual-signal/shape-corner-3.png",
     "x": 64,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-curve-4.png",
+    "name": "virtual-signal/shape-corner-4.png",
     "x": 128,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-curve.png",
+    "name": "virtual-signal/shape-corner.png",
     "x": 192,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-diagonal-2.png",
+    "name": "virtual-signal/shape-cross.png",
     "x": 256,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-diagonal-cross.png",
+    "name": "virtual-signal/shape-curve-2.png",
     "x": 320,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-diagonal.png",
+    "name": "virtual-signal/shape-curve-3.png",
     "x": 384,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-horizontal.png",
+    "name": "virtual-signal/shape-curve-4.png",
     "x": 448,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-t-2.png",
+    "name": "virtual-signal/shape-curve.png",
     "x": 512,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-t-3.png",
+    "name": "virtual-signal/shape-diagonal-2.png",
     "x": 576,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-t-4.png",
+    "name": "virtual-signal/shape-diagonal-cross.png",
     "x": 640,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-t.png",
+    "name": "virtual-signal/shape-diagonal.png",
     "x": 704,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/shape-vertical.png",
+    "name": "virtual-signal/shape-horizontal.png",
     "x": 768,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-0.png",
+    "name": "virtual-signal/shape-t-2.png",
     "x": 832,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-1.png",
+    "name": "virtual-signal/shape-t-3.png",
     "x": 896,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-2.png",
+    "name": "virtual-signal/shape-t-4.png",
     "x": 960,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-3.png",
+    "name": "virtual-signal/shape-t.png",
     "x": 1024,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-4.png",
+    "name": "virtual-signal/shape-vertical.png",
     "x": 1088,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-5.png",
+    "name": "virtual-signal/signal-0.png",
     "x": 1152,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-6.png",
+    "name": "virtual-signal/signal-1.png",
     "x": 1216,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-7.png",
+    "name": "virtual-signal/signal-2.png",
     "x": 1280,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-8.png",
+    "name": "virtual-signal/signal-3.png",
     "x": 1344,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-9.png",
+    "name": "virtual-signal/signal-4.png",
     "x": 1408,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-A.png",
+    "name": "virtual-signal/signal-5.png",
     "x": 1472,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-B.png",
+    "name": "virtual-signal/signal-6.png",
     "x": 1536,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-C.png",
+    "name": "virtual-signal/signal-7.png",
     "x": 1600,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-D.png",
+    "name": "virtual-signal/signal-8.png",
     "x": 1664,
     "y": 1344,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-E.png",
+    "name": "virtual-signal/signal-9.png",
     "x": 0,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-F.png",
+    "name": "virtual-signal/signal-A.png",
     "x": 64,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-G.png",
+    "name": "virtual-signal/signal-B.png",
     "x": 128,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-H.png",
+    "name": "virtual-signal/signal-C.png",
     "x": 192,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-I.png",
+    "name": "virtual-signal/signal-D.png",
     "x": 256,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-J.png",
+    "name": "virtual-signal/signal-E.png",
     "x": 320,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-K.png",
+    "name": "virtual-signal/signal-F.png",
     "x": 384,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-L.png",
+    "name": "virtual-signal/signal-G.png",
     "x": 448,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-M.png",
+    "name": "virtual-signal/signal-H.png",
     "x": 512,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-N.png",
+    "name": "virtual-signal/signal-I.png",
     "x": 576,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-O.png",
+    "name": "virtual-signal/signal-J.png",
     "x": 640,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-P.png",
+    "name": "virtual-signal/signal-K.png",
     "x": 704,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-Q.png",
+    "name": "virtual-signal/signal-L.png",
     "x": 768,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-R.png",
+    "name": "virtual-signal/signal-M.png",
     "x": 832,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-S.png",
+    "name": "virtual-signal/signal-N.png",
     "x": 896,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-T.png",
+    "name": "virtual-signal/signal-O.png",
     "x": 960,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-U.png",
+    "name": "virtual-signal/signal-P.png",
     "x": 1024,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-V.png",
+    "name": "virtual-signal/signal-Q.png",
     "x": 1088,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-W.png",
+    "name": "virtual-signal/signal-R.png",
     "x": 1152,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-X.png",
+    "name": "virtual-signal/signal-S.png",
     "x": 1216,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-Y.png",
+    "name": "virtual-signal/signal-T.png",
     "x": 1280,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-Z.png",
+    "name": "virtual-signal/signal-U.png",
     "x": 1344,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-alarm.png",
+    "name": "virtual-signal/signal-V.png",
     "x": 1408,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-alert.png",
+    "name": "virtual-signal/signal-W.png",
     "x": 1472,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-ampersand.png",
+    "name": "virtual-signal/signal-X.png",
     "x": 1536,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-anticlockwise-circle-arrow.png",
+    "name": "virtual-signal/signal-Y.png",
     "x": 1600,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-any-quality.png",
+    "name": "virtual-signal/signal-Z.png",
     "x": 1664,
     "y": 1408,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-anything.png",
+    "name": "virtual-signal/signal-alarm.png",
     "x": 0,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-apostrophe.png",
+    "name": "virtual-signal/signal-alert.png",
     "x": 64,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-battery-full.png",
+    "name": "virtual-signal/signal-ampersand.png",
     "x": 128,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-battery-low.png",
+    "name": "virtual-signal/signal-anticlockwise-circle-arrow.png",
     "x": 192,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-battery-mid-level.png",
+    "name": "virtual-signal/signal-any-quality.png",
     "x": 256,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-black.png",
+    "name": "virtual-signal/signal-anything.png",
     "x": 320,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-blue.png",
+    "name": "virtual-signal/signal-apostrophe.png",
     "x": 384,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-check.png",
+    "name": "virtual-signal/signal-battery-full.png",
     "x": 448,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-circumflex-accent.png",
+    "name": "virtual-signal/signal-battery-low.png",
     "x": 512,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-clock.png",
+    "name": "virtual-signal/signal-battery-mid-level.png",
     "x": 576,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-clockwise-circle-arrow.png",
+    "name": "virtual-signal/signal-black.png",
     "x": 640,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-colon.png",
+    "name": "virtual-signal/signal-blue.png",
     "x": 704,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-comma.png",
+    "name": "virtual-signal/signal-check.png",
     "x": 768,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-cyan.png",
+    "name": "virtual-signal/signal-circumflex-accent.png",
     "x": 832,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-damage.png",
+    "name": "virtual-signal/signal-clock.png",
     "x": 896,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-deny.png",
+    "name": "virtual-signal/signal-clockwise-circle-arrow.png",
     "x": 960,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-division.png",
+    "name": "virtual-signal/signal-colon.png",
     "x": 1024,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-dot.png",
+    "name": "virtual-signal/signal-comma.png",
     "x": 1088,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-each.png",
+    "name": "virtual-signal/signal-cyan.png",
     "x": 1152,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-equal.png",
+    "name": "virtual-signal/signal-damage.png",
     "x": 1216,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-everything.png",
+    "name": "virtual-signal/signal-deny.png",
     "x": 1280,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-exclamation-mark.png",
+    "name": "virtual-signal/signal-division.png",
     "x": 1344,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-explosion.png",
+    "name": "virtual-signal/signal-dot.png",
     "x": 1408,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-fire.png",
+    "name": "virtual-signal/signal-each.png",
     "x": 1472,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-fluid-parameter.png",
+    "name": "virtual-signal/signal-equal.png",
     "x": 1536,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-fuel-parameter.png",
+    "name": "virtual-signal/signal-everything.png",
     "x": 1600,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-fuel.png",
+    "name": "virtual-signal/signal-exclamation-mark.png",
     "x": 1664,
     "y": 1472,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-ghost.png",
+    "name": "virtual-signal/signal-explosion.png",
     "x": 0,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-greater-than-or-equal-to.png",
+    "name": "virtual-signal/signal-fire.png",
     "x": 64,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-greater-than.png",
+    "name": "virtual-signal/signal-fluid-parameter.png",
     "x": 128,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-green.png",
+    "name": "virtual-signal/signal-fuel-parameter.png",
     "x": 192,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-grey.png",
+    "name": "virtual-signal/signal-fuel.png",
     "x": 256,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-heart.png",
+    "name": "virtual-signal/signal-ghost.png",
     "x": 320,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-hourglass.png",
+    "name": "virtual-signal/signal-greater-than-or-equal-to.png",
     "x": 384,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-info.png",
+    "name": "virtual-signal/signal-greater-than.png",
     "x": 448,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-input.png",
+    "name": "virtual-signal/signal-green.png",
     "x": 512,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-item-parameter.png",
+    "name": "virtual-signal/signal-grey.png",
     "x": 576,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-left-parenthesis.png",
+    "name": "virtual-signal/signal-heart.png",
     "x": 640,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-left-right-arrow.png",
+    "name": "virtual-signal/signal-hourglass.png",
     "x": 704,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-left-square-bracket.png",
+    "name": "virtual-signal/signal-info.png",
     "x": 768,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-less-than-or-equal-to.png",
+    "name": "virtual-signal/signal-input.png",
     "x": 832,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-less-than.png",
+    "name": "virtual-signal/signal-item-parameter.png",
     "x": 896,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-letter-dot.png",
+    "name": "virtual-signal/signal-left-parenthesis.png",
     "x": 960,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-lightning.png",
+    "name": "virtual-signal/signal-left-right-arrow.png",
     "x": 1024,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-liquid.png",
+    "name": "virtual-signal/signal-left-square-bracket.png",
     "x": 1088,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-lock.png",
+    "name": "virtual-signal/signal-less-than-or-equal-to.png",
     "x": 1152,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-map-marker.png",
+    "name": "virtual-signal/signal-less-than.png",
     "x": 1216,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-mining.png",
+    "name": "virtual-signal/signal-letter-dot.png",
     "x": 1280,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-minus.png",
+    "name": "virtual-signal/signal-lightning.png",
     "x": 1344,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-moon.png",
+    "name": "virtual-signal/signal-liquid.png",
     "x": 1408,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-multiplication.png",
+    "name": "virtual-signal/signal-lock.png",
     "x": 1472,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-no-entry.png",
+    "name": "virtual-signal/signal-map-marker.png",
     "x": 1536,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-not-equal.png",
+    "name": "virtual-signal/signal-mining.png",
     "x": 1600,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-number-sign.png",
+    "name": "virtual-signal/signal-minus.png",
     "x": 1664,
     "y": 1536,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-output.png",
+    "name": "virtual-signal/signal-moon.png",
     "x": 0,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-percent.png",
+    "name": "virtual-signal/signal-multiplication.png",
     "x": 64,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-pink.png",
+    "name": "virtual-signal/signal-no-entry.png",
     "x": 128,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-plus.png",
+    "name": "virtual-signal/signal-not-equal.png",
     "x": 192,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-question-mark.png",
+    "name": "virtual-signal/signal-number-sign.png",
     "x": 256,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-quotation-mark.png",
+    "name": "virtual-signal/signal-output.png",
     "x": 320,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-radioactivity.png",
+    "name": "virtual-signal/signal-percent.png",
     "x": 384,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-recycle.png",
+    "name": "virtual-signal/signal-pink.png",
     "x": 448,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-red.png",
+    "name": "virtual-signal/signal-plus.png",
     "x": 512,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-right-parenthesis.png",
+    "name": "virtual-signal/signal-question-mark.png",
     "x": 576,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-right-square-bracket.png",
+    "name": "virtual-signal/signal-quotation-mark.png",
     "x": 640,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-rightwards-leftwards-arrow.png",
+    "name": "virtual-signal/signal-radioactivity.png",
     "x": 704,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-science-pack.png",
+    "name": "virtual-signal/signal-recycle.png",
     "x": 768,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-shuffle.png",
+    "name": "virtual-signal/signal-red.png",
     "x": 832,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-signal-parameter.png",
+    "name": "virtual-signal/signal-right-parenthesis.png",
     "x": 896,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-skull.png",
+    "name": "virtual-signal/signal-right-square-bracket.png",
     "x": 960,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-slash.png",
+    "name": "virtual-signal/signal-rightwards-leftwards-arrow.png",
     "x": 1024,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-snowflake.png",
+    "name": "virtual-signal/signal-science-pack.png",
     "x": 1088,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-speed.png",
+    "name": "virtual-signal/signal-shuffle.png",
     "x": 1152,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-stack-size.png",
+    "name": "virtual-signal/signal-signal-parameter.png",
     "x": 1216,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-star.png",
+    "name": "virtual-signal/signal-skull.png",
     "x": 1280,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-sun.png",
+    "name": "virtual-signal/signal-slash.png",
     "x": 1344,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-thermometer-blue.png",
+    "name": "virtual-signal/signal-snowflake.png",
     "x": 1408,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-thermometer-red.png",
+    "name": "virtual-signal/signal-speed.png",
     "x": 1472,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-trash-bin.png",
+    "name": "virtual-signal/signal-stack-size.png",
     "x": 1536,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-unlock.png",
+    "name": "virtual-signal/signal-star.png",
     "x": 1600,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-up-down-arrow.png",
+    "name": "virtual-signal/signal-sun.png",
     "x": 1664,
     "y": 1600,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-upwards-downwards-arrow.png",
+    "name": "virtual-signal/signal-thermometer-blue.png",
     "x": 0,
     "y": 1664,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-weapon.png",
+    "name": "virtual-signal/signal-thermometer-red.png",
     "x": 64,
     "y": 1664,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-white-flag.png",
+    "name": "virtual-signal/signal-trash-bin.png",
     "x": 128,
     "y": 1664,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-white.png",
+    "name": "virtual-signal/signal-unlock.png",
     "x": 192,
     "y": 1664,
     "size": 64
   },
   {
-    "name": "virtual-signal/signal-yellow.png",
+    "name": "virtual-signal/signal-up-down-arrow.png",
     "x": 256,
     "y": 1664,
     "size": 64
   },
   {
-    "name": "virtual-signal/up-arrow.png",
+    "name": "virtual-signal/signal-upwards-downwards-arrow.png",
     "x": 320,
     "y": 1664,
     "size": 64
   },
   {
-    "name": "virtual-signal/up-left-arrow.png",
+    "name": "virtual-signal/signal-weapon.png",
     "x": 384,
     "y": 1664,
     "size": 64
   },
   {
-    "name": "virtual-signal/up-right-arrow.png",
+    "name": "virtual-signal/signal-white-flag.png",
     "x": 448,
     "y": 1664,
     "size": 64
   },
+  {
+    "name": "virtual-signal/signal-white.png",
+    "x": 512,
+    "y": 1664,
+    "size": 64
+  },
+  {
+    "name": "virtual-signal/signal-yellow.png",
+    "x": 576,
+    "y": 1664,
+    "size": 64
+  },
+  {
+    "name": "virtual-signal/up-arrow.png",
+    "x": 640,
+    "y": 1664,
+    "size": 64
+  },
+  {
+    "name": "virtual-signal/up-left-arrow.png",
+    "x": 704,
+    "y": 1664,
+    "size": 64
+  },
+  {
+    "name": "virtual-signal/up-right-arrow.png",
+    "x": 768,
+    "y": 1664,
+    "size": 64
+  },
   {
     "name": "item-group/combat.png",
     "x": 0,

+ 171 - 116
src/engine/factorioEngine.ts

@@ -1,9 +1,8 @@
-
 import type { Recipe } from "../../scripts/factorio-dump/helpers/recipes.helper";
 import type { ItemProductPrototype } from "../../scripts/factorio-dump/lua-api/models";
 import type { Beacon, Machine, Module } from "../../scripts/factorio-dump/process-data.models";
-
 import { defaultClockSignal } from "../store/useClockStore";
+
 // --- Math Helpers ---
 const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));
 const lcm = (a: number, b: number): number => (a * b) / gcd(a, b);
@@ -17,65 +16,71 @@ function floatToFraction(val: number) {
 }
 
 // --- Interfaces ---
-export interface BatchPlan {
-  craftsPerCycle: number;
-  durationTicks: number;
-  inputs: Record<string, number>;
-  outputs: Record<string, number>;
+export interface InserterConfig {
+  inserterId?: string; // Used to group mixed belts (e.g., "in-1")
+  presetId: string; // e.g., "chest_to_belt"
+  swingTicks: number; // e.g., 12
+  stackSize: number; // e.g., 16
 }
 
 export interface ClockConfig {
-  stackSize?: number;
-  inputPreset?: string;
-  outputPreset?: string;
-  swingTicks?: number; // e.g., 8 for chest_to_chest, 12 for chest_to_belt
+  /* Keyed by itemId */
+  inputs: Record<string, InserterConfig>;
+  /* Keyed by itemId */
+  outputs: Record<string, InserterConfig>;
+  machineCount?: number;
 }
+
 export interface MachineSetup {
   machine: Machine;
-  machineQualityLevel?: number; // 0 = Normal, 1 = Uncommon, 2 = Rare, 3 = Epic, 4 = Legendary
+  machineQualityLevel?: number;
   machineModules: Array<{ module: Module; qualityLevel: number }>;
   beacons: Array<{
     beacon: Beacon;
     beaconQualityLevel?: number;
     count: number;
-    modules: Array<{ module: Module; qualityLevel: number }>; 
+    modules: Array<{ module: Module; qualityLevel: number }>;
   }>;
 }
+
 export interface CalculatedTimings {
   actualCraftingSpeed: number;
   productivityBonus: number;
   singleCraftTicks: number;
+  craftsPerSecond: number; // NEW: Useful for scaling / target throughput
   overloadMultiplier: number;
 }
 
-// Factorio 2.0 Quality Multipliers (Normal = 1x, Uncommon = 1.3x, Rare = 1.6x, Epic = 1.9x, Legendary = 2.5x)
+export interface BatchPlan {
+  craftsPerCycle: number;
+  durationTicks: number;
+  timings: CalculatedTimings;
+  inputs: Record<string, { totalAmount: number; baseAmount: number }>;
+  outputs: Record<string, { totalAmount: number; baseAmount: number; yieldPerCraft: number; outputBlockLimit: number }>;
+}
+
 function getQualityMultiplier(level: number): number {
-  if (level === 4) return 2.5; // Legendary gets a bigger bump
-  return 1 + (level * 0.3);
+  if (level === 4) return 2.5;
+  return 1 + level * 0.3;
 }
 
+// ---  Machine Stats Calculator ---
 export function computeMachineStats(setup: MachineSetup, recipe: Recipe): CalculatedTimings {
-  let speedBonus = 0;
-  let productivityBonus = 0;
+  // Including your base_effect additions!
+  let speedBonus = setup.machine.effect_receiver?.base_effect?.speed ?? 0;
+  let productivityBonus = setup.machine.effect_receiver?.base_effect?.productivity ?? 0;
 
-  // 1. Machine Quality (e.g. Legendary machine has +150% base speed)
   const machineQualityMultiplier = getQualityMultiplier(setup.machineQualityLevel ?? 0);
   const baseSpeed = setup.machine.crafting_speed * machineQualityMultiplier;
 
-  // 2. Machine Modules (Unpacking the wrapper and applying quality)
   setup.machineModules.forEach(({ module, qualityLevel }) => {
     const modQualityMultiplier = getQualityMultiplier(qualityLevel);
-    
-    if (module.effect?.speed) {
-      speedBonus += module.effect.speed * modQualityMultiplier;
-    }
-    if (module.effect?.productivity) {
-      productivityBonus += module.effect.productivity * modQualityMultiplier;
-    }
+    if (module.effect?.speed) speedBonus += module.effect.speed * modQualityMultiplier;
+    if (module.effect?.productivity) productivityBonus += module.effect.productivity * modQualityMultiplier;
   });
 
-  // 3. Beacons (Unpacking wrapper, applying beacon quality AND module quality)
-  setup.beacons.forEach(b => {
+  let beaconCount = Math.sqrt(setup.beacons.reduce((acc, b) => acc + b.count, 0));
+  setup.beacons.forEach((b) => {
     const beaconQualityLevel = b.beaconQualityLevel ?? 0;
     const effectivityBonus = (b.beacon.distribution_effectivity_bonus_per_quality_level ?? 0) * beaconQualityLevel;
     const distributionEffectivity = b.beacon.distribution_effectivity + effectivityBonus;
@@ -89,15 +94,13 @@ export function computeMachineStats(setup: MachineSetup, recipe: Recipe): Calcul
       if (module.effect?.productivity) beaconProd += module.effect.productivity * modQualityMultiplier;
     });
 
-    speedBonus += beaconSpeed * distributionEffectivity * b.count;
-    productivityBonus += beaconProd * distributionEffectivity * b.count;
+    speedBonus += ((beaconSpeed * distributionEffectivity) / beaconCount) * b.count;
+    productivityBonus += ((beaconProd * distributionEffectivity) / beaconCount) * b.count;
   });
 
-  // Minimum speed multiplier in Factorio is 0.2 (-80%)
   const effectiveSpeedMultiplier = Math.max(0.2, 1 + speedBonus);
   const actualCraftingSpeed = baseSpeed * effectiveSpeedMultiplier;
 
-  // 4. Timing & Insertion Limits
   const energyRequired = recipe.energy_required ?? 0.5;
   const craftTimeSeconds = energyRequired / actualCraftingSpeed;
   const singleCraftTicks = craftTimeSeconds * 60;
@@ -111,143 +114,195 @@ export function computeMachineStats(setup: MachineSetup, recipe: Recipe): Calcul
     actualCraftingSpeed,
     productivityBonus,
     singleCraftTicks,
-    overloadMultiplier
+    craftsPerSecond: 1 / craftTimeSeconds,
+    overloadMultiplier,
   };
 }
 
-// ---  Batch Calculator ---
+// ---  Batch Calculator (Buffer Aware) ---
 export function calculateOptimalBatch(
   recipe: Recipe,
-  productivityBonus: number, 
-  actualCraftingSpeed: number, 
-  stackSize: number = 16
+  timings: CalculatedTimings,
+  itemStackSizes: Record<string, number> = {},
 ): BatchPlan {
-  const prodMultiplier = floatToFraction(1 + productivityBonus);
-  const energyRequired = recipe.energy_required ?? 0.5;
-  const singleCraftTicks = (energyRequired / actualCraftingSpeed) * 60;
-
+  const prodMultiplier = floatToFraction(1 + timings.productivityBonus);
   let optimalN = 1;
 
-  // Process Solid Ingredients
+  // We assume a baseline stack size of 16 for batch math, but execution can vary
+  const baselineStack = 16;
+
   const solidIngredients = (recipe.ingredients || []).filter((ing) => ing.type === "item");
   for (const ing of solidIngredients) {
-    const requiredN = stackSize / gcd(ing.amount, stackSize);
+    const requiredN = baselineStack / gcd(ing.amount, baselineStack);
     optimalN = lcm(optimalN, requiredN);
   }
 
-  // Process Solid Products
-  const solidResults = (recipe.results || []).filter(
-    (res): res is ItemProductPrototype => res.type === "item"
-  );
+  const solidResults = (recipe.results || []).filter((res): res is ItemProductPrototype => res.type === "item");
   for (const res of solidResults) {
     const amount = res.amount ?? res.amount_min ?? 1;
     const numerator = amount * prodMultiplier.num;
-    const denominator = stackSize * prodMultiplier.den;
+    const denominator = baselineStack * prodMultiplier.den;
     const requiredN = denominator / gcd(numerator, denominator);
     optimalN = lcm(optimalN, requiredN);
   }
 
-  const inputs: Record<string, number> = {};
-  solidIngredients.forEach((ing) => { inputs[ing.itemId] = ing.amount * optimalN; });
+  const inputs: BatchPlan["inputs"] = {};
+  solidIngredients.forEach((ing) => {
+    inputs[ing.itemId] = { totalAmount: ing.amount * optimalN, baseAmount: ing.amount };
+  });
 
-  const outputs: Record<string, number> = {};
+  const outputs: BatchPlan["outputs"] = {};
   solidResults.forEach((res) => {
     const amount = res.amount ?? res.amount_min ?? 1;
-    outputs[res.name] = (amount * prodMultiplier.num * optimalN) / prodMultiplier.den;
+    const yieldPerCraft = (amount * prodMultiplier.num) / prodMultiplier.den;
+
+    const maxItemStack = itemStackSizes[res.name] ?? 50;
+    const outputBlockQuantity =
+      recipe.ingredients && recipe.ingredients.length > 0
+        ? Math.min(maxItemStack, timings.overloadMultiplier * amount)
+        : maxItemStack;
+
+    outputs[res.name] = {
+      totalAmount: yieldPerCraft * optimalN,
+      baseAmount: amount,
+      yieldPerCraft,
+      outputBlockLimit: outputBlockQuantity,
+    };
   });
 
   return {
     craftsPerCycle: optimalN,
-    durationTicks: Math.ceil(singleCraftTicks * optimalN),
+    durationTicks: Math.ceil(timings.singleCraftTicks * optimalN),
+    timings,
     inputs,
     outputs,
   };
 }
 
-// ---  Timeline Generator (Drip-Feed Strategy) ---
-export function generateAdvancedClock(batch: BatchPlan, config: ClockConfig = {}) {
-  const {
-    stackSize = 16,
-    inputPreset = "chest_to_chest",
-    outputPreset = "chest_to_chest",
-    swingTicks = 8, // Chest to chest usually takes 8 ticks
-  } = config;
-
-  const rows: any[] = [];
+// ---  Timeline Generator (Row-Configured & Mixed Belt Scheduler) ---
+export function generateAdvancedClock(batch: BatchPlan, config: ClockConfig) {
+  const rowMap: Record<string, any> = {};
   const blocks: any[] = [];
 
+  // Tracks when an inserter is free so mixed belts don't overlap swings
+  const inserterBusyUntil: Record<string, number> = {};
+
+  // Helper to get or create a row based on grouped inserterId
+  const getOrCreateRow = (inserterId: string, itemId: string, isInput: boolean, stackSize: number) => {
+    if (!rowMap[inserterId]) {
+      rowMap[inserterId] = {
+        id: `row-${inserterId}`,
+        name: isInput ? `Input ${inserterId}` : `Output ${inserterId}`,
+        signals: [],
+        stackSize,
+        inserterCount: config.machineCount || 1,
+      };
+    }
+    // Add the signal if it's not already on the row (for mixed belts)
+    if (!rowMap[inserterId].signals.find((s: any) => s.name === itemId)) {
+      rowMap[inserterId].signals.push({ type: "item", name: itemId, subgroup: "intermediate-product" });
+    }
+    return rowMap[inserterId].id;
+  };
+
   // --- Process Inputs ---
-  Object.entries(batch.inputs).forEach(([itemId, totalAmount]) => {
-    const rowId = `row-in-${itemId}`;
-    const swings = totalAmount / stackSize;
-    
-    // How often does the machine consume a full stack of this item?
-    const interval = batch.durationTicks / swings; 
-
-    rows.push({
-      id: rowId,
-      name: `${itemId} In`,
-      signals: [{ type: "item", name: itemId, subgroup: "intermediate-product" }],
-      stackSize,
-      inserterCount: 1,
-    });
+  Object.entries(batch.inputs).forEach(([itemId, data]) => {
+    const cfg = config.inputs[itemId] || { presetId: "chest_to_chest", swingTicks: 8, stackSize: 16 };
+    const inserterId = cfg.inserterId || `in-${itemId}`;
+    const rowId = getOrCreateRow(inserterId, itemId, true, cfg.stackSize);
+
+    const totalSwings = data.totalAmount / cfg.stackSize;
+    const consumptionPerTick = data.baseAmount / batch.timings.singleCraftTicks;
+    const bufferLimit = data.baseAmount * batch.timings.overloadMultiplier;
+
+    let maxBurst = 0;
+    for (let k = 0; k < totalSwings; k++) {
+      const invAtStartOfSwing = k * cfg.stackSize - (k - 1) * cfg.swingTicks * consumptionPerTick;
+      if (invAtStartOfSwing < bufferLimit) maxBurst = k + 1;
+      else break;
+    }
+    if (maxBurst === 0) maxBurst = 1;
+
+    let swingsLeft = totalSwings;
+    let currentArrivalTick = 0;
+    let blockIndex = 0;
+
+    while (swingsLeft > 0) {
+      const burst = Math.min(swingsLeft, maxBurst);
+      let startTick = Math.round(currentArrivalTick - cfg.swingTicks);
+      startTick = ((startTick % batch.durationTicks) + batch.durationTicks) % batch.durationTicks;
+
+      // Ensure the inserter isn't busy with another item on this mixed belt
+      const busyUntil = inserterBusyUntil[inserterId] || 0;
+      if (startTick < busyUntil) {
+        startTick = busyUntil; // Delay swing until the inserter drops the other item
+      }
+
+      const duration = cfg.swingTicks + 1;
+      inserterBusyUntil[inserterId] = startTick + burst * duration; // Mark inserter as busy
 
-    // Spread the blocks evenly across the timeline
-    for (let i = 0; i < swings; i++) {
       blocks.push({
-        id: `block-in-${itemId}-${i}`,
+        id: `block-in-${itemId}-${blockIndex++}`,
         rowId,
-        presetId: inputPreset,
-        start: Math.round(i * interval),
-        duration: swingTicks + 1, // Window open slightly longer than swing
-        count: stackSize,
-        repeat: 1, // Just one swing per interval
+        presetId: cfg.presetId,
+        start: startTick,
+        duration,
+        count: cfg.stackSize,
+        repeat: burst,
       });
+
+      const spanTicks = (burst * cfg.stackSize) / consumptionPerTick;
+      currentArrivalTick += spanTicks;
+      swingsLeft -= burst;
     }
   });
 
   // --- Process Outputs ---
-  Object.entries(batch.outputs).forEach(([itemId, totalAmount]) => {
-    const rowId = `row-out-${itemId}`;
-    const swings = totalAmount / stackSize;
-    
-    // How often does the machine produce a full stack?
-    const interval = batch.durationTicks / swings;
-
-    rows.push({
-      id: rowId,
-      name: `${itemId} Out`,
-      signals: [{ type: "item", name: itemId, subgroup: "intermediate-product" }],
-      stackSize,
-      inserterCount: 1,
-    });
+  Object.entries(batch.outputs).forEach(([itemId, data]) => {
+    const cfg = config.outputs[itemId] || { presetId: "chest_to_chest", swingTicks: 8, stackSize: 16 };
+    const inserterId = cfg.inserterId || `out-${itemId}`;
+
+    const extractionTrigger = Math.min(cfg.stackSize, data.outputBlockLimit);
+    const rowId = getOrCreateRow(inserterId, itemId, false, extractionTrigger);
+
+    const productionPerTick = data.yieldPerCraft / batch.timings.singleCraftTicks;
+    let amountLeft = data.totalAmount;
+    let currentReadyTick = 0;
+    let blockIndex = 0;
 
-    // Output is extracted exactly when a full stack is finished crafting
-    for (let i = 1; i <= swings; i++) {
-      const finishTick = i * interval;
-      // Start the swing so the inserter drops the item exactly as it's ready
-      let startTick = Math.round(finishTick - swingTicks);
-      
-      // Handle edge case where first output finishes extremely fast
-      if (startTick < 0) startTick += batch.durationTicks;
+    while (amountLeft > 0) {
+      const amountToExtract = Math.min(amountLeft, extractionTrigger);
+      const spanTicks = amountToExtract / productionPerTick;
+      currentReadyTick += spanTicks;
+
+      let startTick = Math.round(currentReadyTick - cfg.swingTicks);
+      startTick = ((startTick % batch.durationTicks) + batch.durationTicks) % batch.durationTicks;
+
+      // Output inserter scheduling for mixed belts
+      const busyUntil = inserterBusyUntil[inserterId] || 0;
+      if (startTick < busyUntil) startTick = busyUntil;
+
+      const duration = cfg.swingTicks + 1;
+      inserterBusyUntil[inserterId] = startTick + duration;
 
       blocks.push({
-        id: `block-out-${itemId}-${i}`,
+        id: `block-out-${itemId}-${blockIndex++}`,
         rowId,
-        presetId: outputPreset,
+        presetId: cfg.presetId,
         start: startTick,
-        duration: swingTicks + 1,
-        count: stackSize,
+        duration,
+        count: amountToExtract,
         repeat: 1,
       });
+
+      amountLeft -= amountToExtract;
     }
   });
 
-  // Return exactly the shape expected by the ClockBuilder JSON parser
   return {
     duration: batch.durationTicks,
     clockSignal: defaultClockSignal,
-    rows,
-    blocks
+    rows: Object.values(rowMap),
+    blocks,
   };
-}
+}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików