From 24778b21b7bff9d78c6a11bd8f67af3c83f6fd18 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 23 May 2024 23:04:42 -0700 Subject: [PATCH] refactor(vm): rework object freazing - let vm carry object dtabase - seperate frozen object info and templates --- data/database.json | 12631 ++++++++++++++++ ic10emu/src/errors.rs | 15 +- ic10emu/src/grammar.rs | 4 +- ic10emu/src/interpreter/instructions.rs | 2 +- ic10emu/src/network.rs | 38 +- ic10emu/src/vm.rs | 207 +- ic10emu/src/vm/instructions/operands.rs | 10 +- ic10emu/src/vm/object.rs | 19 +- ic10emu/src/vm/object/errors.rs | 2 +- ic10emu/src/vm/object/generic/structs.rs | 230 +- ic10emu/src/vm/object/generic/traits.rs | 22 +- ic10emu/src/vm/object/stationpedia.rs | 19 +- .../stationpedia/structs/circuit_holder.rs | 17 +- .../structs/integrated_circuit.rs | 4 +- ic10emu/src/vm/object/templates.rs | 2035 ++- ic10emu/src/vm/object/traits.rs | 18 +- stationeers_data/src/database/prefab_map.rs | 4036 +++++ .../src/enums/{basic_enums.rs => basic.rs} | 2 +- .../src/enums/{script_enums.rs => script.rs} | 0 stationeers_data/src/lib.rs | 43 +- stationeers_data/src/templates.rs | 41 +- xtask/src/generate.rs | 2 +- xtask/src/generate/database.rs | 97 +- xtask/src/generate/enums.rs | 24 +- xtask/src/stationpedia.rs | 12 +- 25 files changed, 18268 insertions(+), 1262 deletions(-) rename stationeers_data/src/enums/{basic_enums.rs => basic.rs} (99%) rename stationeers_data/src/enums/{script_enums.rs => script.rs} (100%) diff --git a/data/database.json b/data/database.json index 1cd7a38..3cf93e7 100644 --- a/data/database.json +++ b/data/database.json @@ -16386,6 +16386,253 @@ ], "processed_reagents": [] }, + "fabricator_info": { + "tier": "Undefined", + "recipes": { + "ItemCannedCondensedMilk": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Milk": 200.0, + "Steel": 1.0 + } + }, + "ItemCannedEdamame": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Oil": 1.0, + "Soy": 15.0, + "Steel": 1.0 + } + }, + "ItemCannedMushroom": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Mushroom": 8.0, + "Oil": 1.0, + "Steel": 1.0 + } + }, + "ItemCannedPowderedEggs": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Egg": 5.0, + "Oil": 1.0, + "Steel": 1.0 + } + }, + "ItemCannedRicePudding": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Oil": 1.0, + "Rice": 5.0, + "Steel": 1.0 + } + }, + "ItemCornSoup": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Corn": 5.0, + "Oil": 1.0, + "Steel": 1.0 + } + }, + "ItemFrenchFries": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Oil": 1.0, + "Potato": 1.0, + "Steel": 1.0 + } + }, + "ItemPumpkinSoup": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Oil": 1.0, + "Pumpkin": 5.0, + "Steel": 1.0 + } + }, + "ItemTomatoSoup": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Oil": 1.0, + "Steel": 1.0, + "Tomato": 5.0 + } + } + } + }, "memory": { "instructions": { "DeviceSetLock": { @@ -17195,6 +17442,1630 @@ ], "processed_reagents": [] }, + "fabricator_info": { + "tier": "Undefined", + "recipes": { + "CardboardBox": { + "tier": "TierOne", + "time": 2.0, + "energy": 120.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 2.0 + } + }, + "ItemCableCoil": { + "tier": "TierOne", + "time": 5.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Copper": 0.5 + } + }, + "ItemCoffeeMug": { + "tier": "TierOne", + "time": 1.0, + "energy": 70.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemEggCarton": { + "tier": "TierOne", + "time": 10.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 2.0 + } + }, + "ItemEmptyCan": { + "tier": "TierOne", + "time": 1.0, + "energy": 70.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 1.0 + } + }, + "ItemEvaSuit": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 5.0 + } + }, + "ItemGlassSheets": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 2.0 + } + }, + "ItemIronFrames": { + "tier": "TierOne", + "time": 4.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 4.0 + } + }, + "ItemIronSheets": { + "tier": "TierOne", + "time": 1.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemKitAccessBridge": { + "tier": "TierOne", + "time": 30.0, + "energy": 15000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Solder": 2.0, + "Steel": 10.0 + } + }, + "ItemKitArcFurnace": { + "tier": "TierOne", + "time": 60.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 20.0 + } + }, + "ItemKitAutolathe": { + "tier": "TierOne", + "time": 180.0, + "energy": 36000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 2.0, + "Iron": 20.0 + } + }, + "ItemKitBeds": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 20.0 + } + }, + "ItemKitBlastDoor": { + "tier": "TierTwo", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 3.0, + "Steel": 15.0 + } + }, + "ItemKitCentrifuge": { + "tier": "TierOne", + "time": 60.0, + "energy": 18000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 20.0 + } + }, + "ItemKitChairs": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 20.0 + } + }, + "ItemKitChute": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemKitCompositeCladding": { + "tier": "TierOne", + "time": 1.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemKitCompositeFloorGrating": { + "tier": "TierOne", + "time": 3.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemKitCrate": { + "tier": "TierOne", + "time": 10.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 10.0 + } + }, + "ItemKitCrateMkII": { + "tier": "TierTwo", + "time": 10.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Gold": 5.0, + "Iron": 10.0 + } + }, + "ItemKitCrateMount": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 10.0 + } + }, + "ItemKitDeepMiner": { + "tier": "TierTwo", + "time": 180.0, + "energy": 72000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 5.0, + "Electrum": 5.0, + "Invar": 10.0, + "Steel": 50.0 + } + }, + "ItemKitDoor": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 3.0, + "Iron": 7.0 + } + }, + "ItemKitElectronicsPrinter": { + "tier": "TierOne", + "time": 120.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 2.0, + "Iron": 20.0 + } + }, + "ItemKitFlagODA": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 8.0 + } + }, + "ItemKitFurnace": { + "tier": "TierOne", + "time": 120.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 10.0, + "Iron": 30.0 + } + }, + "ItemKitFurniture": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 20.0 + } + }, + "ItemKitHydraulicPipeBender": { + "tier": "TierOne", + "time": 180.0, + "energy": 18000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 2.0, + "Iron": 20.0 + } + }, + "ItemKitInteriorDoors": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 3.0, + "Iron": 5.0 + } + }, + "ItemKitLadder": { + "tier": "TierOne", + "time": 3.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 2.0 + } + }, + "ItemKitLocker": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemKitPipe": { + "tier": "TierOne", + "time": 5.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 0.5 + } + }, + "ItemKitRailing": { + "tier": "TierOne", + "time": 1.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemKitRecycler": { + "tier": "TierOne", + "time": 60.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 10.0, + "Iron": 20.0 + } + }, + "ItemKitReinforcedWindows": { + "tier": "TierOne", + "time": 7.0, + "energy": 700.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 2.0 + } + }, + "ItemKitRespawnPointWallMounted": { + "tier": "TierOne", + "time": 20.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Iron": 3.0 + } + }, + "ItemKitRocketManufactory": { + "tier": "TierOne", + "time": 120.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 2.0, + "Iron": 20.0 + } + }, + "ItemKitSDBHopper": { + "tier": "TierOne", + "time": 10.0, + "energy": 700.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 15.0 + } + }, + "ItemKitSecurityPrinter": { + "tier": "TierOne", + "time": 180.0, + "energy": 36000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 20.0, + "Gold": 20.0, + "Steel": 20.0 + } + }, + "ItemKitSign": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemKitSorter": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 1.0, + "Iron": 10.0 + } + }, + "ItemKitStacker": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 10.0 + } + }, + "ItemKitStairs": { + "tier": "TierOne", + "time": 20.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 15.0 + } + }, + "ItemKitStairwell": { + "tier": "TierOne", + "time": 20.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 15.0 + } + }, + "ItemKitStandardChute": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 2.0, + "Electrum": 2.0, + "Iron": 3.0 + } + }, + "ItemKitTables": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 20.0 + } + }, + "ItemKitToolManufactory": { + "tier": "TierOne", + "time": 120.0, + "energy": 24000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 10.0, + "Iron": 20.0 + } + }, + "ItemKitWall": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 1.0 + } + }, + "ItemKitWallArch": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 1.0 + } + }, + "ItemKitWallFlat": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 1.0 + } + }, + "ItemKitWallGeometry": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 1.0 + } + }, + "ItemKitWallIron": { + "tier": "TierOne", + "time": 1.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemKitWallPadded": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 1.0 + } + }, + "ItemKitWindowShutter": { + "tier": "TierOne", + "time": 7.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 1.0, + "Steel": 2.0 + } + }, + "ItemPlasticSheets": { + "tier": "TierOne", + "time": 1.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 0.5 + } + }, + "ItemSpaceHelmet": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Gold": 2.0 + } + }, + "ItemSteelFrames": { + "tier": "TierOne", + "time": 7.0, + "energy": 800.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 2.0 + } + }, + "ItemSteelSheets": { + "tier": "TierOne", + "time": 3.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 0.5 + } + }, + "ItemStelliteGlassSheets": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Silicon": 2.0, + "Stellite": 1.0 + } + }, + "ItemWallLight": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Iron": 1.0, + "Silicon": 1.0 + } + }, + "KitSDBSilo": { + "tier": "TierOne", + "time": 120.0, + "energy": 24000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 20.0, + "Steel": 15.0 + } + }, + "KitStructureCombustionCentrifuge": { + "tier": "TierTwo", + "time": 120.0, + "energy": 24000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 5.0, + "Invar": 10.0, + "Steel": 20.0 + } + } + } + }, "memory": { "instructions": { "DeviceSetLock": { @@ -17343,6 +19214,477 @@ ], "processed_reagents": [] }, + "fabricator_info": { + "tier": "TierOne", + "recipes": { + "ItemBreadLoaf": { + "tier": "TierOne", + "time": 10.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Flour": 200.0, + "Oil": 5.0 + } + }, + "ItemCerealBar": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Flour": 50.0 + } + }, + "ItemChocolateBar": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Cocoa": 2.0, + "Sugar": 10.0 + } + }, + "ItemChocolateCake": { + "tier": "TierOne", + "time": 30.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 5, + "reagents": { + "Cocoa": 2.0, + "Egg": 1.0, + "Flour": 50.0, + "Milk": 5.0, + "Sugar": 50.0 + } + }, + "ItemChocolateCerealBar": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Cocoa": 1.0, + "Flour": 50.0 + } + }, + "ItemCookedCondensedMilk": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Milk": 100.0 + } + }, + "ItemCookedCorn": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Corn": 1.0 + } + }, + "ItemCookedMushroom": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Mushroom": 1.0 + } + }, + "ItemCookedPowderedEggs": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Egg": 4.0 + } + }, + "ItemCookedPumpkin": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Pumpkin": 1.0 + } + }, + "ItemCookedRice": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Rice": 3.0 + } + }, + "ItemCookedSoybean": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Soy": 5.0 + } + }, + "ItemCookedTomato": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Tomato": 1.0 + } + }, + "ItemFries": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Oil": 5.0, + "Potato": 1.0 + } + }, + "ItemMuffin": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Egg": 1.0, + "Flour": 50.0, + "Milk": 10.0 + } + }, + "ItemPlainCake": { + "tier": "TierOne", + "time": 30.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Egg": 1.0, + "Flour": 50.0, + "Milk": 5.0, + "Sugar": 50.0 + } + }, + "ItemPotatoBaked": { + "tier": "TierOne", + "time": 5.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Potato": 1.0 + } + }, + "ItemPumpkinPie": { + "tier": "TierOne", + "time": 10.0, + "energy": 0.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Egg": 1.0, + "Flour": 100.0, + "Milk": 10.0, + "Pumpkin": 10.0 + } + } + } + }, "memory": { "instructions": { "DeviceSetLock": { @@ -24263,6 +26605,3529 @@ ], "processed_reagents": [] }, + "fabricator_info": { + "tier": "Undefined", + "recipes": { + "ApplianceChemistryStation": { + "tier": "TierOne", + "time": 45.0, + "energy": 1500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 1.0, + "Steel": 5.0 + } + }, + "ApplianceDeskLampLeft": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 2.0, + "Silicon": 1.0 + } + }, + "ApplianceDeskLampRight": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 2.0, + "Silicon": 1.0 + } + }, + "ApplianceMicrowave": { + "tier": "TierOne", + "time": 45.0, + "energy": 1500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 1.0, + "Iron": 5.0 + } + }, + "AppliancePackagingMachine": { + "tier": "TierOne", + "time": 30.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 1.0, + "Iron": 10.0 + } + }, + "AppliancePaintMixer": { + "tier": "TierOne", + "time": 45.0, + "energy": 1500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 1.0, + "Steel": 5.0 + } + }, + "AppliancePlantGeneticAnalyzer": { + "tier": "TierOne", + "time": 45.0, + "energy": 4500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 1.0, + "Steel": 5.0 + } + }, + "AppliancePlantGeneticSplicer": { + "tier": "TierOne", + "time": 50.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Inconel": 10.0, + "Stellite": 20.0 + } + }, + "AppliancePlantGeneticStabilizer": { + "tier": "TierOne", + "time": 50.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Inconel": 10.0, + "Stellite": 20.0 + } + }, + "ApplianceReagentProcessor": { + "tier": "TierOne", + "time": 45.0, + "energy": 1500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 1.0, + "Iron": 5.0 + } + }, + "ApplianceTabletDock": { + "tier": "TierOne", + "time": 30.0, + "energy": 750.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 2.0, + "Gold": 1.0, + "Iron": 5.0, + "Silicon": 1.0 + } + }, + "AutolathePrinterMod": { + "tier": "TierTwo", + "time": 180.0, + "energy": 72000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 8.0, + "Electrum": 8.0, + "Solder": 8.0, + "Steel": 35.0 + } + }, + "Battery_Wireless_cell": { + "tier": "TierOne", + "time": 10.0, + "energy": 10000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 2.0, + "Iron": 2.0 + } + }, + "Battery_Wireless_cell_Big": { + "tier": "TierOne", + "time": 20.0, + "energy": 20000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 15.0, + "Gold": 5.0, + "Steel": 5.0 + } + }, + "CartridgeAtmosAnalyser": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CartridgeConfiguration": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CartridgeElectronicReader": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CartridgeGPS": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CartridgeMedicalAnalyser": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CartridgeNetworkAnalyser": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CartridgeOreScanner": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CartridgeOreScannerColor": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 5.0, + "Electrum": 5.0, + "Invar": 5.0, + "Silicon": 5.0 + } + }, + "CartridgePlantAnalyser": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CartridgeTracker": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CircuitboardAdvAirlockControl": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CircuitboardAirControl": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "CircuitboardAirlockControl": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CircuitboardDoorControl": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "CircuitboardGasDisplay": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "CircuitboardGraphDisplay": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "CircuitboardHashDisplay": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "CircuitboardModeControl": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "CircuitboardPowerControl": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "CircuitboardShipDisplay": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "CircuitboardSolarControl": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "DynamicLight": { + "tier": "TierOne", + "time": 20.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 5.0 + } + }, + "ElectronicPrinterMod": { + "tier": "TierOne", + "time": 180.0, + "energy": 72000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 8.0, + "Electrum": 8.0, + "Solder": 8.0, + "Steel": 35.0 + } + }, + "ItemAdvancedTablet": { + "tier": "TierTwo", + "time": 60.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 6, + "reagents": { + "Copper": 5.5, + "Electrum": 1.0, + "Gold": 12.0, + "Iron": 3.0, + "Solder": 5.0, + "Steel": 2.0 + } + }, + "ItemAreaPowerControl": { + "tier": "TierOne", + "time": 5.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Iron": 5.0, + "Solder": 3.0 + } + }, + "ItemBatteryCell": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 2.0, + "Iron": 2.0 + } + }, + "ItemBatteryCellLarge": { + "tier": "TierOne", + "time": 20.0, + "energy": 20000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 5.0, + "Steel": 5.0 + } + }, + "ItemBatteryCellNuclear": { + "tier": "TierTwo", + "time": 180.0, + "energy": 360000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Astroloy": 10.0, + "Inconel": 5.0, + "Steel": 5.0 + } + }, + "ItemBatteryCharger": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 10.0 + } + }, + "ItemBatteryChargerSmall": { + "tier": "TierOne", + "time": 1.0, + "energy": 250.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 2.0, + "Iron": 5.0 + } + }, + "ItemCableAnalyser": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Iron": 1.0, + "Silicon": 2.0 + } + }, + "ItemCableCoil": { + "tier": "TierOne", + "time": 1.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Copper": 0.5 + } + }, + "ItemCableCoilHeavy": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 0.5, + "Gold": 0.5 + } + }, + "ItemCableFuse": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 5.0 + } + }, + "ItemCreditCard": { + "tier": "TierOne", + "time": 5.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Silicon": 5.0 + } + }, + "ItemDataDisk": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "ItemElectronicParts": { + "tier": "TierOne", + "time": 5.0, + "energy": 10.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 2.0, + "Iron": 3.0 + } + }, + "ItemFlashingLight": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 3.0, + "Iron": 2.0 + } + }, + "ItemHEMDroidRepairKit": { + "tier": "TierTwo", + "time": 40.0, + "energy": 1500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Electrum": 10.0, + "Inconel": 5.0, + "Solder": 5.0 + } + }, + "ItemIntegratedCircuit10": { + "tier": "TierOne", + "time": 40.0, + "energy": 4000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Electrum": 5.0, + "Gold": 10.0, + "Solder": 2.0, + "Steel": 4.0 + } + }, + "ItemKitAIMeE": { + "tier": "TierTwo", + "time": 25.0, + "energy": 2200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 7, + "reagents": { + "Astroloy": 10.0, + "Constantan": 8.0, + "Copper": 5.0, + "Electrum": 15.0, + "Gold": 5.0, + "Invar": 7.0, + "Steel": 22.0 + } + }, + "ItemKitAdvancedComposter": { + "tier": "TierTwo", + "time": 55.0, + "energy": 20000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 15.0, + "Electrum": 20.0, + "Solder": 5.0, + "Steel": 30.0 + } + }, + "ItemKitAdvancedFurnace": { + "tier": "TierTwo", + "time": 180.0, + "energy": 36000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 6, + "reagents": { + "Copper": 25.0, + "Electrum": 15.0, + "Gold": 5.0, + "Silicon": 6.0, + "Solder": 8.0, + "Steel": 30.0 + } + }, + "ItemKitAdvancedPackagingMachine": { + "tier": "TierTwo", + "time": 60.0, + "energy": 18000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 10.0, + "Copper": 10.0, + "Electrum": 15.0, + "Steel": 20.0 + } + }, + "ItemKitAutoMinerSmall": { + "tier": "TierTwo", + "time": 90.0, + "energy": 9000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 5, + "reagents": { + "Copper": 15.0, + "Electrum": 50.0, + "Invar": 25.0, + "Iron": 15.0, + "Steel": 100.0 + } + }, + "ItemKitAutomatedOven": { + "tier": "TierTwo", + "time": 50.0, + "energy": 15000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 5, + "reagents": { + "Constantan": 5.0, + "Copper": 15.0, + "Gold": 10.0, + "Solder": 10.0, + "Steel": 25.0 + } + }, + "ItemKitBattery": { + "tier": "TierOne", + "time": 120.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 20.0, + "Gold": 20.0, + "Steel": 20.0 + } + }, + "ItemKitBatteryLarge": { + "tier": "TierTwo", + "time": 240.0, + "energy": 96000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 6, + "reagents": { + "Copper": 35.0, + "Electrum": 10.0, + "Gold": 35.0, + "Silicon": 5.0, + "Steel": 35.0, + "Stellite": 2.0 + } + }, + "ItemKitBeacon": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 2.0, + "Gold": 4.0, + "Solder": 2.0, + "Steel": 5.0 + } + }, + "ItemKitComputer": { + "tier": "TierOne", + "time": 60.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 5.0, + "Iron": 5.0 + } + }, + "ItemKitConsole": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 3.0, + "Iron": 2.0 + } + }, + "ItemKitDynamicGenerator": { + "tier": "TierOne", + "time": 120.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Gold": 15.0, + "Nickel": 15.0, + "Solder": 5.0, + "Steel": 20.0 + } + }, + "ItemKitElevator": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 2.0, + "Gold": 4.0, + "Solder": 2.0, + "Steel": 2.0 + } + }, + "ItemKitFridgeBig": { + "tier": "TierOne", + "time": 10.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 10.0, + "Gold": 5.0, + "Iron": 20.0, + "Steel": 15.0 + } + }, + "ItemKitFridgeSmall": { + "tier": "TierOne", + "time": 10.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 2.0, + "Iron": 10.0 + } + }, + "ItemKitGasGenerator": { + "tier": "TierOne", + "time": 120.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 10.0, + "Iron": 50.0 + } + }, + "ItemKitGroundTelescope": { + "tier": "TierOne", + "time": 150.0, + "energy": 24000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Electrum": 15.0, + "Solder": 10.0, + "Steel": 25.0 + } + }, + "ItemKitGrowLight": { + "tier": "TierOne", + "time": 30.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Electrum": 10.0, + "Steel": 5.0 + } + }, + "ItemKitHarvie": { + "tier": "TierOne", + "time": 60.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 5, + "reagents": { + "Copper": 15.0, + "Electrum": 10.0, + "Silicon": 5.0, + "Solder": 5.0, + "Steel": 10.0 + } + }, + "ItemKitHorizontalAutoMiner": { + "tier": "TierTwo", + "time": 60.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 5, + "reagents": { + "Copper": 7.0, + "Electrum": 25.0, + "Invar": 15.0, + "Iron": 8.0, + "Steel": 60.0 + } + }, + "ItemKitHydroponicStation": { + "tier": "TierOne", + "time": 120.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 20.0, + "Gold": 5.0, + "Nickel": 5.0, + "Steel": 10.0 + } + }, + "ItemKitLandingPadAtmos": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Steel": 5.0 + } + }, + "ItemKitLandingPadBasic": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Steel": 5.0 + } + }, + "ItemKitLandingPadWaypoint": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Steel": 5.0 + } + }, + "ItemKitLargeSatelliteDish": { + "tier": "TierOne", + "time": 240.0, + "energy": 72000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Astroloy": 100.0, + "Inconel": 50.0, + "Waspaloy": 20.0 + } + }, + "ItemKitLogicCircuit": { + "tier": "TierOne", + "time": 40.0, + "energy": 2000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Solder": 2.0, + "Steel": 4.0 + } + }, + "ItemKitLogicInputOutput": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Gold": 1.0 + } + }, + "ItemKitLogicMemory": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Gold": 1.0 + } + }, + "ItemKitLogicProcessor": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Gold": 2.0 + } + }, + "ItemKitLogicSwitch": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Gold": 1.0 + } + }, + "ItemKitLogicTransmitter": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 1.0, + "Electrum": 3.0, + "Gold": 2.0, + "Silicon": 5.0 + } + }, + "ItemKitMusicMachines": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Gold": 2.0 + } + }, + "ItemKitPowerTransmitter": { + "tier": "TierOne", + "time": 20.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 7.0, + "Gold": 5.0, + "Steel": 3.0 + } + }, + "ItemKitPowerTransmitterOmni": { + "tier": "TierOne", + "time": 20.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 8.0, + "Gold": 4.0, + "Steel": 4.0 + } + }, + "ItemKitPressurePlate": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Gold": 2.0 + } + }, + "ItemKitResearchMachine": { + "tier": "TierOne", + "time": 5.0, + "energy": 10.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 2.0, + "Iron": 9.0 + } + }, + "ItemKitSatelliteDish": { + "tier": "TierOne", + "time": 120.0, + "energy": 24000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Electrum": 15.0, + "Solder": 10.0, + "Steel": 20.0 + } + }, + "ItemKitSensor": { + "tier": "TierOne", + "time": 5.0, + "energy": 10.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 3.0 + } + }, + "ItemKitSmallSatelliteDish": { + "tier": "TierOne", + "time": 60.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 10.0, + "Gold": 5.0 + } + }, + "ItemKitSolarPanel": { + "tier": "TierOne", + "time": 60.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 20.0, + "Gold": 5.0, + "Steel": 15.0 + } + }, + "ItemKitSolarPanelBasic": { + "tier": "TierOne", + "time": 30.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 2.0, + "Iron": 10.0 + } + }, + "ItemKitSolarPanelBasicReinforced": { + "tier": "TierTwo", + "time": 120.0, + "energy": 24000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 10.0, + "Electrum": 2.0, + "Invar": 10.0, + "Steel": 10.0 + } + }, + "ItemKitSolarPanelReinforced": { + "tier": "TierTwo", + "time": 120.0, + "energy": 24000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Astroloy": 15.0, + "Copper": 20.0, + "Electrum": 5.0, + "Steel": 10.0 + } + }, + "ItemKitSolidGenerator": { + "tier": "TierOne", + "time": 120.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 10.0, + "Iron": 50.0 + } + }, + "ItemKitSpeaker": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Steel": 5.0 + } + }, + "ItemKitStirlingEngine": { + "tier": "TierOne", + "time": 60.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 20.0, + "Gold": 5.0, + "Steel": 30.0 + } + }, + "ItemKitTransformer": { + "tier": "TierOne", + "time": 60.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 5.0, + "Steel": 10.0 + } + }, + "ItemKitTransformerSmall": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 1.0, + "Iron": 10.0 + } + }, + "ItemKitTurbineGenerator": { + "tier": "TierOne", + "time": 60.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 2.0, + "Gold": 4.0, + "Iron": 5.0, + "Solder": 4.0 + } + }, + "ItemKitUprightWindTurbine": { + "tier": "TierOne", + "time": 60.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 5.0, + "Iron": 10.0 + } + }, + "ItemKitVendingMachine": { + "tier": "TierOne", + "time": 60.0, + "energy": 15000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Electrum": 50.0, + "Gold": 50.0, + "Solder": 10.0, + "Steel": 20.0 + } + }, + "ItemKitVendingMachineRefrigerated": { + "tier": "TierTwo", + "time": 60.0, + "energy": 25000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Electrum": 80.0, + "Gold": 60.0, + "Solder": 30.0, + "Steel": 40.0 + } + }, + "ItemKitWeatherStation": { + "tier": "TierOne", + "time": 60.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 5.0, + "Gold": 3.0, + "Iron": 8.0, + "Steel": 3.0 + } + }, + "ItemKitWindTurbine": { + "tier": "TierTwo", + "time": 60.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Electrum": 5.0, + "Steel": 20.0 + } + }, + "ItemLabeller": { + "tier": "TierOne", + "time": 15.0, + "energy": 800.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 1.0, + "Iron": 3.0 + } + }, + "ItemLaptop": { + "tier": "TierTwo", + "time": 60.0, + "energy": 18000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 5, + "reagents": { + "Copper": 5.5, + "Electrum": 5.0, + "Gold": 12.0, + "Solder": 5.0, + "Steel": 2.0 + } + }, + "ItemPowerConnector": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 3.0, + "Iron": 10.0 + } + }, + "ItemResearchCapsule": { + "tier": "TierOne", + "time": 3.0, + "energy": 400.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 2.0, + "Iron": 9.0 + } + }, + "ItemResearchCapsuleGreen": { + "tier": "TierOne", + "time": 5.0, + "energy": 10.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Astroloy": 2.0, + "Copper": 3.0, + "Gold": 2.0, + "Iron": 9.0 + } + }, + "ItemResearchCapsuleRed": { + "tier": "TierOne", + "time": 8.0, + "energy": 50.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 2.0, + "Iron": 2.0 + } + }, + "ItemResearchCapsuleYellow": { + "tier": "TierOne", + "time": 5.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Astroloy": 3.0, + "Copper": 3.0, + "Gold": 2.0, + "Iron": 9.0 + } + }, + "ItemSoundCartridgeBass": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 2.0, + "Silicon": 2.0 + } + }, + "ItemSoundCartridgeDrums": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 2.0, + "Silicon": 2.0 + } + }, + "ItemSoundCartridgeLeads": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 2.0, + "Silicon": 2.0 + } + }, + "ItemSoundCartridgeSynth": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 2.0, + "Silicon": 2.0 + } + }, + "ItemTablet": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 2.0, + "Solder": 5.0 + } + }, + "ItemWallLight": { + "tier": "TierOne", + "time": 5.0, + "energy": 10.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 1.0 + } + }, + "MotherboardComms": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 5.0, + "Electrum": 2.0, + "Gold": 5.0, + "Silver": 5.0 + } + }, + "MotherboardLogic": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "MotherboardProgrammableChip": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Gold": 5.0 + } + }, + "MotherboardRockets": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 5.0, + "Solder": 5.0 + } + }, + "MotherboardSorter": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Gold": 5.0, + "Silver": 5.0 + } + }, + "PipeBenderMod": { + "tier": "TierTwo", + "time": 180.0, + "energy": 72000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 8.0, + "Electrum": 8.0, + "Solder": 8.0, + "Steel": 35.0 + } + }, + "PortableComposter": { + "tier": "TierOne", + "time": 55.0, + "energy": 20000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 15.0, + "Steel": 10.0 + } + }, + "PortableSolarPanel": { + "tier": "TierOne", + "time": 5.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 3.0, + "Iron": 5.0 + } + }, + "ToolPrinterMod": { + "tier": "TierTwo", + "time": 180.0, + "energy": 72000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 8.0, + "Electrum": 8.0, + "Solder": 8.0, + "Steel": 35.0 + } + } + } + }, "memory": { "instructions": { "DeviceSetLock": { @@ -26738,6 +32603,2732 @@ ], "processed_reagents": [] }, + "fabricator_info": { + "tier": "Undefined", + "recipes": { + "ApplianceSeedTray": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Iron": 10.0, + "Silicon": 15.0 + } + }, + "ItemActiveVent": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 1.0, + "Iron": 5.0 + } + }, + "ItemAdhesiveInsulation": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Silicon": 1.0, + "Steel": 0.5 + } + }, + "ItemDynamicAirCon": { + "tier": "TierOne", + "time": 60.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Gold": 5.0, + "Silver": 5.0, + "Solder": 5.0, + "Steel": 20.0 + } + }, + "ItemDynamicScrubber": { + "tier": "TierOne", + "time": 30.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Gold": 5.0, + "Invar": 5.0, + "Solder": 5.0, + "Steel": 20.0 + } + }, + "ItemGasCanisterEmpty": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemGasCanisterSmart": { + "tier": "TierTwo", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Silicon": 2.0, + "Steel": 15.0 + } + }, + "ItemGasFilterCarbonDioxide": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemGasFilterCarbonDioxideL": { + "tier": "TierTwo", + "time": 45.0, + "energy": 4000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Invar": 1.0, + "Steel": 5.0, + "Stellite": 1.0 + } + }, + "ItemGasFilterCarbonDioxideM": { + "tier": "TierOne", + "time": 20.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 1.0, + "Iron": 5.0, + "Silver": 5.0 + } + }, + "ItemGasFilterNitrogen": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemGasFilterNitrogenL": { + "tier": "TierTwo", + "time": 45.0, + "energy": 4000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Invar": 1.0, + "Steel": 5.0, + "Stellite": 1.0 + } + }, + "ItemGasFilterNitrogenM": { + "tier": "TierOne", + "time": 20.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 1.0, + "Iron": 5.0, + "Silver": 5.0 + } + }, + "ItemGasFilterNitrousOxide": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemGasFilterNitrousOxideL": { + "tier": "TierTwo", + "time": 45.0, + "energy": 4000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Invar": 1.0, + "Steel": 5.0, + "Stellite": 1.0 + } + }, + "ItemGasFilterNitrousOxideM": { + "tier": "TierOne", + "time": 20.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 1.0, + "Iron": 5.0, + "Silver": 5.0 + } + }, + "ItemGasFilterOxygen": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemGasFilterOxygenL": { + "tier": "TierTwo", + "time": 45.0, + "energy": 4000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Invar": 1.0, + "Steel": 5.0, + "Stellite": 1.0 + } + }, + "ItemGasFilterOxygenM": { + "tier": "TierOne", + "time": 20.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 1.0, + "Iron": 5.0, + "Silver": 5.0 + } + }, + "ItemGasFilterPollutants": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemGasFilterPollutantsL": { + "tier": "TierTwo", + "time": 45.0, + "energy": 4000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Invar": 1.0, + "Steel": 5.0, + "Stellite": 1.0 + } + }, + "ItemGasFilterPollutantsM": { + "tier": "TierOne", + "time": 20.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 1.0, + "Iron": 5.0, + "Silver": 5.0 + } + }, + "ItemGasFilterVolatiles": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemGasFilterVolatilesL": { + "tier": "TierTwo", + "time": 45.0, + "energy": 4000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Invar": 1.0, + "Steel": 5.0, + "Stellite": 1.0 + } + }, + "ItemGasFilterVolatilesM": { + "tier": "TierOne", + "time": 20.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 1.0, + "Iron": 5.0, + "Silver": 5.0 + } + }, + "ItemGasFilterWater": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemGasFilterWaterL": { + "tier": "TierTwo", + "time": 45.0, + "energy": 4000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Invar": 1.0, + "Steel": 5.0, + "Stellite": 1.0 + } + }, + "ItemGasFilterWaterM": { + "tier": "TierOne", + "time": 20.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 1.0, + "Iron": 5.0, + "Silver": 5.0 + } + }, + "ItemHydroponicTray": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 10.0 + } + }, + "ItemKitAirlock": { + "tier": "TierOne", + "time": 50.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Steel": 15.0 + } + }, + "ItemKitAirlockGate": { + "tier": "TierOne", + "time": 60.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Steel": 25.0 + } + }, + "ItemKitAtmospherics": { + "tier": "TierOne", + "time": 30.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 20.0, + "Gold": 5.0, + "Iron": 10.0 + } + }, + "ItemKitChute": { + "tier": "TierOne", + "time": 2.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemKitCryoTube": { + "tier": "TierTwo", + "time": 120.0, + "energy": 24000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 10.0, + "Gold": 10.0, + "Silver": 5.0, + "Steel": 35.0 + } + }, + "ItemKitDrinkingFountain": { + "tier": "TierOne", + "time": 20.0, + "energy": 620.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Iron": 5.0, + "Silicon": 8.0 + } + }, + "ItemKitDynamicCanister": { + "tier": "TierOne", + "time": 20.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 20.0 + } + }, + "ItemKitDynamicGasTankAdvanced": { + "tier": "TierTwo", + "time": 40.0, + "energy": 2000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 5.0, + "Iron": 20.0, + "Silicon": 5.0, + "Steel": 15.0 + } + }, + "ItemKitDynamicHydroponics": { + "tier": "TierOne", + "time": 30.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Nickel": 5.0, + "Steel": 20.0 + } + }, + "ItemKitDynamicLiquidCanister": { + "tier": "TierOne", + "time": 20.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 20.0 + } + }, + "ItemKitDynamicMKIILiquidCanister": { + "tier": "TierTwo", + "time": 40.0, + "energy": 2000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 5.0, + "Iron": 20.0, + "Silicon": 5.0, + "Steel": 15.0 + } + }, + "ItemKitEvaporationChamber": { + "tier": "TierOne", + "time": 30.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Silicon": 5.0, + "Steel": 10.0 + } + }, + "ItemKitHeatExchanger": { + "tier": "TierTwo", + "time": 30.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Invar": 10.0, + "Steel": 10.0 + } + }, + "ItemKitIceCrusher": { + "tier": "TierOne", + "time": 30.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 3.0 + } + }, + "ItemKitInsulatedLiquidPipe": { + "tier": "TierOne", + "time": 4.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Silicon": 1.0, + "Steel": 1.0 + } + }, + "ItemKitInsulatedPipe": { + "tier": "TierOne", + "time": 4.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Silicon": 1.0, + "Steel": 1.0 + } + }, + "ItemKitInsulatedPipeUtility": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Silicon": 1.0, + "Steel": 5.0 + } + }, + "ItemKitInsulatedPipeUtilityLiquid": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Silicon": 1.0, + "Steel": 5.0 + } + }, + "ItemKitLargeDirectHeatExchanger": { + "tier": "TierTwo", + "time": 30.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Invar": 10.0, + "Steel": 10.0 + } + }, + "ItemKitLargeExtendableRadiator": { + "tier": "TierTwo", + "time": 30.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Invar": 10.0, + "Steel": 10.0 + } + }, + "ItemKitLiquidRegulator": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 1.0, + "Iron": 5.0 + } + }, + "ItemKitLiquidTank": { + "tier": "TierOne", + "time": 20.0, + "energy": 2000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Steel": 20.0 + } + }, + "ItemKitLiquidTankInsulated": { + "tier": "TierOne", + "time": 30.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Silicon": 30.0, + "Steel": 20.0 + } + }, + "ItemKitLiquidTurboVolumePump": { + "tier": "TierTwo", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 4.0, + "Electrum": 5.0, + "Gold": 4.0, + "Steel": 5.0 + } + }, + "ItemKitPassiveLargeRadiatorGas": { + "tier": "TierTwo", + "time": 30.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Invar": 5.0, + "Steel": 5.0 + } + }, + "ItemKitPassiveLargeRadiatorLiquid": { + "tier": "TierTwo", + "time": 30.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Invar": 5.0, + "Steel": 5.0 + } + }, + "ItemKitPassthroughHeatExchanger": { + "tier": "TierTwo", + "time": 30.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Invar": 10.0, + "Steel": 10.0 + } + }, + "ItemKitPipe": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 0.5 + } + }, + "ItemKitPipeLiquid": { + "tier": "TierOne", + "time": 2.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 0.5 + } + }, + "ItemKitPipeOrgan": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemKitPipeRadiator": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Gold": 3.0, + "Steel": 2.0 + } + }, + "ItemKitPipeRadiatorLiquid": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Gold": 3.0, + "Steel": 2.0 + } + }, + "ItemKitPipeUtility": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemKitPipeUtilityLiquid": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemKitPlanter": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 10.0 + } + }, + "ItemKitPortablesConnector": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemKitPoweredVent": { + "tier": "TierTwo", + "time": 20.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Electrum": 5.0, + "Invar": 2.0, + "Steel": 5.0 + } + }, + "ItemKitRegulator": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 1.0, + "Iron": 5.0 + } + }, + "ItemKitSensor": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "ItemKitShower": { + "tier": "TierOne", + "time": 30.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Iron": 5.0, + "Silicon": 5.0 + } + }, + "ItemKitSleeper": { + "tier": "TierOne", + "time": 60.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 10.0, + "Steel": 25.0 + } + }, + "ItemKitSmallDirectHeatExchanger": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Steel": 3.0 + } + }, + "ItemKitStandardChute": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 2.0, + "Electrum": 2.0, + "Iron": 3.0 + } + }, + "ItemKitSuitStorage": { + "tier": "TierOne", + "time": 30.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Iron": 15.0, + "Silver": 5.0 + } + }, + "ItemKitTank": { + "tier": "TierOne", + "time": 20.0, + "energy": 2000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Steel": 20.0 + } + }, + "ItemKitTankInsulated": { + "tier": "TierOne", + "time": 30.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Silicon": 30.0, + "Steel": 20.0 + } + }, + "ItemKitTurboVolumePump": { + "tier": "TierTwo", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 4.0, + "Electrum": 5.0, + "Gold": 4.0, + "Steel": 5.0 + } + }, + "ItemKitWaterBottleFiller": { + "tier": "TierOne", + "time": 7.0, + "energy": 620.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Iron": 5.0, + "Silicon": 8.0 + } + }, + "ItemKitWaterPurifier": { + "tier": "TierOne", + "time": 30.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 20.0, + "Gold": 5.0, + "Iron": 10.0 + } + }, + "ItemLiquidCanisterEmpty": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemLiquidCanisterSmart": { + "tier": "TierTwo", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Silicon": 2.0, + "Steel": 15.0 + } + }, + "ItemLiquidDrain": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 5.0 + } + }, + "ItemLiquidPipeAnalyzer": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Electrum": 2.0, + "Gold": 2.0, + "Iron": 2.0 + } + }, + "ItemLiquidPipeHeater": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 3.0, + "Iron": 5.0 + } + }, + "ItemLiquidPipeValve": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 3.0 + } + }, + "ItemLiquidPipeVolumePump": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 2.0, + "Iron": 5.0 + } + }, + "ItemPassiveVent": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemPassiveVentInsulated": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Silicon": 5.0, + "Steel": 1.0 + } + }, + "ItemPipeAnalyizer": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Electrum": 2.0, + "Gold": 2.0, + "Iron": 2.0 + } + }, + "ItemPipeCowl": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemPipeDigitalValve": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Invar": 3.0, + "Steel": 5.0 + } + }, + "ItemPipeGasMixer": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 2.0, + "Iron": 2.0 + } + }, + "ItemPipeHeater": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 3.0, + "Iron": 5.0 + } + }, + "ItemPipeIgniter": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 2.0, + "Iron": 2.0 + } + }, + "ItemPipeLabel": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemPipeMeter": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 3.0 + } + }, + "ItemPipeValve": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 3.0 + } + }, + "ItemPipeVolumePump": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 2.0, + "Iron": 5.0 + } + }, + "ItemWallCooler": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 1.0, + "Iron": 3.0 + } + }, + "ItemWallHeater": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 1.0, + "Iron": 3.0 + } + }, + "ItemWaterBottle": { + "tier": "TierOne", + "time": 4.0, + "energy": 120.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 2.0, + "Silicon": 4.0 + } + }, + "ItemWaterPipeDigitalValve": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Invar": 3.0, + "Steel": 5.0 + } + }, + "ItemWaterPipeMeter": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 3.0 + } + }, + "ItemWaterWallCooler": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 1.0, + "Iron": 3.0 + } + } + } + }, "memory": { "instructions": { "DeviceSetLock": { @@ -35469,6 +44060,848 @@ ], "processed_reagents": [] }, + "fabricator_info": { + "tier": "Undefined", + "recipes": { + "ItemKitAccessBridge": { + "tier": "TierOne", + "time": 30.0, + "energy": 9000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 3.0, + "Steel": 10.0 + } + }, + "ItemKitChuteUmbilical": { + "tier": "TierOne", + "time": 5.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 3.0, + "Steel": 10.0 + } + }, + "ItemKitElectricUmbilical": { + "tier": "TierOne", + "time": 5.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Gold": 5.0, + "Steel": 5.0 + } + }, + "ItemKitFuselage": { + "tier": "TierOne", + "time": 120.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 20.0 + } + }, + "ItemKitGasUmbilical": { + "tier": "TierOne", + "time": 5.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Steel": 5.0 + } + }, + "ItemKitGovernedGasRocketEngine": { + "tier": "TierOne", + "time": 60.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 10.0, + "Gold": 5.0, + "Iron": 15.0 + } + }, + "ItemKitLaunchMount": { + "tier": "TierOne", + "time": 240.0, + "energy": 120000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 60.0 + } + }, + "ItemKitLaunchTower": { + "tier": "TierOne", + "time": 30.0, + "energy": 30000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 10.0 + } + }, + "ItemKitLiquidUmbilical": { + "tier": "TierOne", + "time": 5.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Steel": 5.0 + } + }, + "ItemKitPressureFedGasEngine": { + "tier": "TierOne", + "time": 60.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 10.0, + "Electrum": 5.0, + "Invar": 20.0, + "Steel": 20.0 + } + }, + "ItemKitPressureFedLiquidEngine": { + "tier": "TierOne", + "time": 60.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Astroloy": 10.0, + "Inconel": 5.0, + "Waspaloy": 15.0 + } + }, + "ItemKitPumpedLiquidEngine": { + "tier": "TierOne", + "time": 60.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 10.0, + "Electrum": 5.0, + "Steel": 15.0 + } + }, + "ItemKitRocketAvionics": { + "tier": "TierOne", + "time": 5.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 2.0, + "Solder": 3.0 + } + }, + "ItemKitRocketBattery": { + "tier": "TierOne", + "time": 10.0, + "energy": 10000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Electrum": 5.0, + "Solder": 5.0, + "Steel": 10.0 + } + }, + "ItemKitRocketCargoStorage": { + "tier": "TierOne", + "time": 30.0, + "energy": 30000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Constantan": 10.0, + "Invar": 5.0, + "Steel": 10.0 + } + }, + "ItemKitRocketCelestialTracker": { + "tier": "TierOne", + "time": 5.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 5.0, + "Steel": 5.0 + } + }, + "ItemKitRocketCircuitHousing": { + "tier": "TierOne", + "time": 5.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 2.0, + "Solder": 3.0 + } + }, + "ItemKitRocketDatalink": { + "tier": "TierOne", + "time": 5.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 2.0, + "Solder": 3.0 + } + }, + "ItemKitRocketGasFuelTank": { + "tier": "TierOne", + "time": 10.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Steel": 10.0 + } + }, + "ItemKitRocketLiquidFuelTank": { + "tier": "TierOne", + "time": 10.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Steel": 20.0 + } + }, + "ItemKitRocketMiner": { + "tier": "TierOne", + "time": 60.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Constantan": 10.0, + "Electrum": 5.0, + "Invar": 5.0, + "Steel": 10.0 + } + }, + "ItemKitRocketScanner": { + "tier": "TierOne", + "time": 60.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 10.0, + "Gold": 10.0 + } + }, + "ItemKitRocketTransformerSmall": { + "tier": "TierOne", + "time": 60.0, + "energy": 12000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 5.0, + "Steel": 10.0 + } + }, + "ItemKitStairwell": { + "tier": "TierOne", + "time": 20.0, + "energy": 6000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 15.0 + } + }, + "ItemRocketMiningDrillHead": { + "tier": "TierOne", + "time": 30.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 20.0 + } + }, + "ItemRocketMiningDrillHeadDurable": { + "tier": "TierOne", + "time": 30.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 10.0, + "Steel": 10.0 + } + }, + "ItemRocketMiningDrillHeadHighSpeedIce": { + "tier": "TierOne", + "time": 30.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Invar": 5.0, + "Steel": 10.0 + } + }, + "ItemRocketMiningDrillHeadHighSpeedMineral": { + "tier": "TierOne", + "time": 30.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Invar": 5.0, + "Steel": 10.0 + } + }, + "ItemRocketMiningDrillHeadIce": { + "tier": "TierOne", + "time": 30.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 10.0, + "Steel": 10.0 + } + }, + "ItemRocketMiningDrillHeadLongTerm": { + "tier": "TierOne", + "time": 30.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Invar": 5.0, + "Steel": 10.0 + } + }, + "ItemRocketMiningDrillHeadMineral": { + "tier": "TierOne", + "time": 30.0, + "energy": 5000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 10.0, + "Steel": 10.0 + } + }, + "ItemRocketScanningHead": { + "tier": "TierOne", + "time": 60.0, + "energy": 60000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 3.0, + "Gold": 2.0 + } + } + } + }, "memory": { "instructions": { "DeviceSetLock": { @@ -36065,6 +45498,638 @@ ], "processed_reagents": [] }, + "fabricator_info": { + "tier": "Undefined", + "recipes": { + "AccessCardBlack": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardBlue": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardBrown": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardGray": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardGreen": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardKhaki": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardOrange": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardPink": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardPurple": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardRed": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardWhite": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "AccessCardYellow": { + "tier": "TierOne", + "time": 2.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Gold": 1.0, + "Iron": 1.0 + } + }, + "CartridgeAccessController": { + "tier": "TierOne", + "time": 5.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 1.0 + } + }, + "FireArmSMG": { + "tier": "TierOne", + "time": 120.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Nickel": 10.0, + "Steel": 30.0 + } + }, + "Handgun": { + "tier": "TierOne", + "time": 120.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Nickel": 10.0, + "Steel": 30.0 + } + }, + "HandgunMagazine": { + "tier": "TierOne", + "time": 60.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Lead": 1.0, + "Steel": 3.0 + } + }, + "ItemAmmoBox": { + "tier": "TierOne", + "time": 120.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 30.0, + "Lead": 50.0, + "Steel": 30.0 + } + }, + "ItemExplosive": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 5, + "reagents": { + "Copper": 5.0, + "Electrum": 1.0, + "Gold": 5.0, + "Lead": 10.0, + "Steel": 7.0 + } + }, + "ItemGrenade": { + "tier": "TierOne", + "time": 90.0, + "energy": 2900.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 15.0, + "Gold": 1.0, + "Lead": 25.0, + "Steel": 25.0 + } + }, + "ItemMiningCharge": { + "tier": "TierOne", + "time": 7.0, + "energy": 200.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 7.0, + "Lead": 10.0 + } + }, + "SMGMagazine": { + "tier": "TierOne", + "time": 60.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Lead": 1.0, + "Steel": 3.0 + } + }, + "WeaponPistolEnergy": { + "tier": "TierTwo", + "time": 120.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Electrum": 20.0, + "Gold": 10.0, + "Solder": 10.0, + "Steel": 10.0 + } + }, + "WeaponRifleEnergy": { + "tier": "TierTwo", + "time": 240.0, + "energy": 10000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 6, + "reagents": { + "Constantan": 10.0, + "Electrum": 20.0, + "Gold": 10.0, + "Invar": 10.0, + "Solder": 10.0, + "Steel": 20.0 + } + } + } + }, "memory": { "instructions": { "DeviceSetLock": { @@ -39730,6 +49795,2572 @@ ], "processed_reagents": [] }, + "fabricator_info": { + "tier": "Undefined", + "recipes": { + "FlareGun": { + "tier": "TierOne", + "time": 10.0, + "energy": 2000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 10.0, + "Silicon": 10.0 + } + }, + "ItemAngleGrinder": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Iron": 3.0 + } + }, + "ItemArcWelder": { + "tier": "TierOne", + "time": 30.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Electrum": 10.0, + "Invar": 5.0, + "Solder": 10.0, + "Steel": 10.0 + } + }, + "ItemBasketBall": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 1.0 + } + }, + "ItemBeacon": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Gold": 1.0, + "Iron": 2.0 + } + }, + "ItemChemLightBlue": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 1.0 + } + }, + "ItemChemLightGreen": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 1.0 + } + }, + "ItemChemLightRed": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 1.0 + } + }, + "ItemChemLightWhite": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 1.0 + } + }, + "ItemChemLightYellow": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 1.0 + } + }, + "ItemClothingBagOveralls_Aus": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_Brazil": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_Canada": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_China": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_EU": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_France": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_Germany": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_Japan": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_Korea": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_NZ": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_Russia": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_SouthAfrica": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_UK": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_US": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemClothingBagOveralls_Ukraine": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "ItemCrowbar": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 5.0 + } + }, + "ItemDirtCanister": { + "tier": "TierOne", + "time": 5.0, + "energy": 400.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemDisposableBatteryCharger": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Gold": 2.0, + "Iron": 2.0 + } + }, + "ItemDrill": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 5.0 + } + }, + "ItemDuctTape": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 2.0 + } + }, + "ItemEvaSuit": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 5.0 + } + }, + "ItemFlagSmall": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemFlashlight": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Gold": 2.0 + } + }, + "ItemGlasses": { + "tier": "TierOne", + "time": 20.0, + "energy": 250.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Iron": 15.0, + "Silicon": 10.0 + } + }, + "ItemHardBackpack": { + "tier": "TierTwo", + "time": 30.0, + "energy": 1500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Astroloy": 5.0, + "Steel": 15.0, + "Stellite": 5.0 + } + }, + "ItemHardJetpack": { + "tier": "TierTwo", + "time": 40.0, + "energy": 1750.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Astroloy": 8.0, + "Steel": 20.0, + "Stellite": 8.0, + "Waspaloy": 8.0 + } + }, + "ItemHardMiningBackPack": { + "tier": "TierOne", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Invar": 1.0, + "Steel": 6.0 + } + }, + "ItemHardSuit": { + "tier": "TierTwo", + "time": 60.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Astroloy": 10.0, + "Steel": 20.0, + "Stellite": 2.0 + } + }, + "ItemHardsuitHelmet": { + "tier": "TierTwo", + "time": 50.0, + "energy": 1750.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Astroloy": 2.0, + "Steel": 10.0, + "Stellite": 2.0 + } + }, + "ItemIgniter": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Copper": 3.0 + } + }, + "ItemJetpackBasic": { + "tier": "TierOne", + "time": 30.0, + "energy": 1500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Gold": 2.0, + "Lead": 5.0, + "Steel": 10.0 + } + }, + "ItemKitBasket": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 5.0 + } + }, + "ItemLabeller": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Gold": 1.0, + "Iron": 2.0 + } + }, + "ItemMKIIAngleGrinder": { + "tier": "TierTwo", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 1.0, + "Electrum": 4.0, + "Iron": 3.0 + } + }, + "ItemMKIIArcWelder": { + "tier": "TierTwo", + "time": 30.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Electrum": 14.0, + "Invar": 5.0, + "Solder": 10.0, + "Steel": 10.0 + } + }, + "ItemMKIICrowbar": { + "tier": "TierTwo", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 5.0, + "Iron": 5.0 + } + }, + "ItemMKIIDrill": { + "tier": "TierTwo", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 5.0, + "Electrum": 5.0, + "Iron": 5.0 + } + }, + "ItemMKIIDuctTape": { + "tier": "TierTwo", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 1.0, + "Iron": 2.0 + } + }, + "ItemMKIIMiningDrill": { + "tier": "TierTwo", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 2.0, + "Electrum": 5.0, + "Iron": 3.0 + } + }, + "ItemMKIIScrewdriver": { + "tier": "TierTwo", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 2.0, + "Iron": 2.0 + } + }, + "ItemMKIIWireCutters": { + "tier": "TierTwo", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 5.0, + "Iron": 3.0 + } + }, + "ItemMKIIWrench": { + "tier": "TierTwo", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Electrum": 3.0, + "Iron": 3.0 + } + }, + "ItemMarineBodyArmor": { + "tier": "TierOne", + "time": 60.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Nickel": 10.0, + "Silicon": 10.0, + "Steel": 20.0 + } + }, + "ItemMarineHelmet": { + "tier": "TierOne", + "time": 45.0, + "energy": 1750.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Gold": 4.0, + "Silicon": 4.0, + "Steel": 8.0 + } + }, + "ItemMiningBackPack": { + "tier": "TierOne", + "time": 8.0, + "energy": 800.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 6.0 + } + }, + "ItemMiningBelt": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemMiningBeltMKII": { + "tier": "TierTwo", + "time": 10.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Constantan": 5.0, + "Steel": 10.0 + } + }, + "ItemMiningDrill": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 3.0 + } + }, + "ItemMiningDrillHeavy": { + "tier": "TierTwo", + "time": 30.0, + "energy": 2500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Electrum": 5.0, + "Invar": 10.0, + "Solder": 10.0, + "Steel": 10.0 + } + }, + "ItemMiningDrillPneumatic": { + "tier": "TierOne", + "time": 20.0, + "energy": 2000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 4.0, + "Solder": 4.0, + "Steel": 6.0 + } + }, + "ItemMkIIToolbelt": { + "tier": "TierTwo", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Constantan": 5.0, + "Iron": 3.0 + } + }, + "ItemNVG": { + "tier": "TierOne", + "time": 45.0, + "energy": 2750.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Hastelloy": 10.0, + "Silicon": 5.0, + "Steel": 5.0 + } + }, + "ItemPickaxe": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Iron": 2.0 + } + }, + "ItemPlantSampler": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 5.0, + "Iron": 5.0 + } + }, + "ItemRemoteDetonator": { + "tier": "TierOne", + "time": 4.5, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Gold": 1.0, + "Iron": 3.0 + } + }, + "ItemReusableFireExtinguisher": { + "tier": "TierOne", + "time": 20.0, + "energy": 1000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Steel": 5.0 + } + }, + "ItemRoadFlare": { + "tier": "TierOne", + "time": 1.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemScrewdriver": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 2.0 + } + }, + "ItemSensorLenses": { + "tier": "TierTwo", + "time": 45.0, + "energy": 3500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Inconel": 5.0, + "Silicon": 5.0, + "Steel": 5.0 + } + }, + "ItemSensorProcessingUnitCelestialScanner": { + "tier": "TierTwo", + "time": 15.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 5.0, + "Silicon": 5.0 + } + }, + "ItemSensorProcessingUnitMesonScanner": { + "tier": "TierTwo", + "time": 15.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 5.0, + "Silicon": 5.0 + } + }, + "ItemSensorProcessingUnitOreScanner": { + "tier": "TierTwo", + "time": 15.0, + "energy": 100.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Copper": 5.0, + "Gold": 5.0, + "Iron": 5.0, + "Silicon": 5.0 + } + }, + "ItemSpaceHelmet": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Gold": 2.0 + } + }, + "ItemSpacepack": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Iron": 5.0 + } + }, + "ItemSprayCanBlack": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanBlue": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanBrown": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanGreen": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanGrey": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanKhaki": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanOrange": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanPink": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanPurple": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanRed": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanWhite": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayCanYellow": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 1.0 + } + }, + "ItemSprayGun": { + "tier": "TierTwo", + "time": 10.0, + "energy": 2000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Invar": 5.0, + "Silicon": 10.0, + "Steel": 10.0 + } + }, + "ItemTerrainManipulator": { + "tier": "TierOne", + "time": 15.0, + "energy": 600.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 3, + "reagents": { + "Copper": 3.0, + "Gold": 2.0, + "Iron": 5.0 + } + }, + "ItemToolBelt": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemWearLamp": { + "tier": "TierOne", + "time": 15.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 2.0, + "Gold": 2.0 + } + }, + "ItemWeldingTorch": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Copper": 1.0, + "Iron": 3.0 + } + }, + "ItemWireCutters": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ItemWrench": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Iron": 3.0 + } + }, + "ToyLuna": { + "tier": "TierOne", + "time": 10.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 2, + "reagents": { + "Gold": 1.0, + "Iron": 5.0 + } + }, + "UniformCommander": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 25.0 + } + }, + "UniformMarine": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 10.0 + } + }, + "UniformOrangeJumpSuit": { + "tier": "TierOne", + "time": 5.0, + "energy": 500.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 1, + "reagents": { + "Silicon": 10.0 + } + }, + "WeaponPistolEnergy": { + "tier": "TierTwo", + "time": 120.0, + "energy": 3000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 4, + "reagents": { + "Electrum": 20.0, + "Gold": 10.0, + "Solder": 10.0, + "Steel": 10.0 + } + }, + "WeaponRifleEnergy": { + "tier": "TierTwo", + "time": 240.0, + "energy": 10000.0, + "temperature": { + "start": 1.0, + "stop": 80000.0, + "is_valid": false + }, + "pressure": { + "start": 0.0, + "stop": 1000000.0, + "is_valid": false + }, + "required_mix": { + "rule": 0, + "is_any": true, + "is_any_to_remove": false, + "reagents": {} + }, + "count_types": 6, + "reagents": { + "Constantan": 10.0, + "Electrum": 20.0, + "Gold": 10.0, + "Invar": 10.0, + "Solder": 10.0, + "Steel": 20.0 + } + } + } + }, "memory": { "instructions": { "DeviceSetLock": { diff --git a/ic10emu/src/errors.rs b/ic10emu/src/errors.rs index 4259192..b7e79a1 100644 --- a/ic10emu/src/errors.rs +++ b/ic10emu/src/errors.rs @@ -1,8 +1,7 @@ use crate::vm::{ instructions::enums::InstructionOp, object::{ - errors::{LogicError, MemoryError}, - ObjectID, + errors::{LogicError, MemoryError}, templates::Prefab, ObjectID }, }; use serde_derive::{Deserialize, Serialize}; @@ -42,14 +41,24 @@ pub enum VMError { NotAnItem(ObjectID), #[error("object {0} is not programmable")] NotProgrammable(ObjectID), + #[error("{0}")] + TemplateError(#[from] TemplateError), + #[error("missing child object {0}")] + MissingChild(ObjectID), + #[error("object {0} is not parentable")] + NotParentable(ObjectID), } #[derive(Error, Debug, Serialize, Deserialize)] pub enum TemplateError { #[error("object id {0} has a non conforming set of interfaces")] NonConformingObject(ObjectID), - #[error("ObjectID {0} is missing fomr the VM")] + #[error("object id {0} is missing from the VM")] MissingVMObject(ObjectID), + #[error("database has no template for prefab {0}")] + NoTemplateForPrefab(Prefab), + #[error("no prefab provided")] + MissingPrefab, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/ic10emu/src/grammar.rs b/ic10emu/src/grammar.rs index 8c65f9a..d2dbff7 100644 --- a/ic10emu/src/grammar.rs +++ b/ic10emu/src/grammar.rs @@ -10,8 +10,8 @@ use crate::{ }; use itertools::Itertools; use stationeers_data::enums::{ - basic_enums::BasicEnum, - script_enums::{LogicBatchMethod, LogicReagentMode, LogicSlotType, LogicType}, + basic::BasicEnum, + script::{LogicBatchMethod, LogicReagentMode, LogicSlotType, LogicType}, }; use std::{fmt::Display, str::FromStr}; use strum::IntoEnumIterator; diff --git a/ic10emu/src/interpreter/instructions.rs b/ic10emu/src/interpreter/instructions.rs index b7b5369..81dd8b4 100644 --- a/ic10emu/src/interpreter/instructions.rs +++ b/ic10emu/src/interpreter/instructions.rs @@ -13,7 +13,7 @@ use crate::{ }, }, }; -use stationeers_data::enums::script_enums::LogicReagentMode; +use stationeers_data::enums::script::LogicReagentMode; pub trait IC10Marker: IntegratedCircuit {} impl SleepInstruction for T { diff --git a/ic10emu/src/network.rs b/ic10emu/src/network.rs index ebb5e70..cafbbe1 100644 --- a/ic10emu/src/network.rs +++ b/ic10emu/src/network.rs @@ -1,16 +1,16 @@ use std::{collections::HashSet, ops::Deref, rc::Rc}; use crate::vm::{ - enums::script_enums::LogicType, - object::{ - errors::LogicError, macros::ObjectInterface, templates::ConnectionInfo, traits::*, Name, - ObjectID, - }, + object::{errors::LogicError, macros::ObjectInterface, traits::*, Name, ObjectID}, VM, }; use itertools::Itertools; use macro_rules_attribute::derive; use serde_derive::{Deserialize, Serialize}; +use stationeers_data::{ + enums::{script::LogicType, ConnectionRole, ConnectionType}, + templates::ConnectionInfo, +}; use strum_macros::{AsRefStr, EnumIter}; use thiserror::Error; @@ -51,7 +51,6 @@ pub enum Connection { None, } - impl Connection { #[allow(dead_code)] pub fn from_info(typ: ConnectionType, role: ConnectionRole, net: Option) -> Self { @@ -86,67 +85,64 @@ impl Connection { Self::None => ConnectionInfo { typ: ConnectionType::None, role: ConnectionRole::None, - network: None, }, Self::CableNetwork { - net, typ: CableConnectionType::Data, role, + .. } => ConnectionInfo { typ: ConnectionType::Data, role: *role, - network: *net, }, Self::CableNetwork { - net, typ: CableConnectionType::Power, role, + .. } => ConnectionInfo { typ: ConnectionType::Power, role: *role, - network: *net, }, Self::CableNetwork { - net, typ: CableConnectionType::PowerAndData, role, + .. } => ConnectionInfo { typ: ConnectionType::PowerAndData, role: *role, - network: *net, }, Self::Chute { role } => ConnectionInfo { typ: ConnectionType::Chute, role: *role, - network: None, }, Self::Pipe { role } => ConnectionInfo { typ: ConnectionType::Pipe, role: *role, - network: None, }, Self::PipeLiquid { role } => ConnectionInfo { typ: ConnectionType::PipeLiquid, role: *role, - network: None, }, Self::Elevator { role } => ConnectionInfo { typ: ConnectionType::Elevator, role: *role, - network: None, }, Self::LandingPad { role } => ConnectionInfo { typ: ConnectionType::LandingPad, role: *role, - network: None, }, Self::LaunchPad { role } => ConnectionInfo { typ: ConnectionType::LaunchPad, role: *role, - network: None, }, } } + + pub fn get_network(&self) -> Option { + match self { + Self::CableNetwork { net, .. } => net.clone(), + _ => None, + } + } } #[derive(ObjectInterface!, Debug)] @@ -248,14 +244,14 @@ impl Logicable for CableNetwork { } fn can_slot_logic_read( &self, - _slt: crate::vm::enums::script_enums::LogicSlotType, + _slt: stationeers_data::enums::script::LogicSlotType, _index: f64, ) -> bool { false } fn get_slot_logic( &self, - slt: crate::vm::enums::script_enums::LogicSlotType, + slt: stationeers_data::enums::script::LogicSlotType, index: f64, ) -> Result { Err(LogicError::CantSlotRead(slt, index)) diff --git a/ic10emu/src/vm.rs b/ic10emu/src/vm.rs index ba2169b..2998d28 100644 --- a/ic10emu/src/vm.rs +++ b/ic10emu/src/vm.rs @@ -5,11 +5,15 @@ use crate::{ errors::{ICError, TemplateError, VMError}, interpreter::ICState, network::{CableConnectionType, CableNetwork, Connection, FrozenCableNetwork}, - vm::object::{traits::ParentSlotInfo, ObjectID, VMObject}, + vm::object::{ + templates::{FrozenObject, Prefab}, + traits::ParentSlotInfo, + ObjectID, SlotOccupantInfo, VMObject, + }, }; use stationeers_data::{ enums::{ - script_enums::{LogicBatchMethod, LogicSlotType, LogicType}, + script::{LogicBatchMethod, LogicSlotType, LogicType}, ConnectionRole, }, templates::ObjectTemplate, @@ -38,6 +42,7 @@ pub struct VM { /// list of object id's touched on the last operation operation_modified: RefCell>, + template_database: Option>, } #[derive(Debug, Default)] @@ -59,6 +64,7 @@ struct VMTransaction { pub wireless_receivers: Vec, pub id_space: IdSpace, pub networks: BTreeMap, + object_parents: BTreeMap, vm: Rc, } @@ -81,6 +87,7 @@ impl VM { network_id_space: RefCell::new(network_id_space), random: Rc::new(RefCell::new(crate::rand_mscorlib::Random::new())), operation_modified: RefCell::new(Vec::new()), + template_database: stationeers_data::build_prefab_database(), }); let default_network = VMObject::new(CableNetwork::new(default_network_key, vm.clone())); @@ -95,13 +102,84 @@ impl VM { self.random.borrow_mut().next_f64() } - pub fn add_device_from_template( + pub fn import_template_database( + &mut self, + db: impl IntoIterator, + ) { + self.template_database.replace(db.into_iter().collect()); + } + + pub fn get_template(&self, prefab: Prefab) -> Option { + let hash = match prefab { + Prefab::Hash(hash) => hash, + Prefab::Name(name) => const_crc32::crc32(name.as_bytes()) as i32, + }; + self.template_database + .as_ref() + .and_then(|db| db.get(&hash).cloned()) + } + + pub fn add_devices_frozen( self: &Rc, - template: ObjectTemplate, - ) -> Result { + frozen_devices: impl IntoIterator, + ) -> Result, VMError> { let mut transaction = VMTransaction::new(self); - let obj_id = transaction.add_device_from_template(template)?; + let mut obj_ids = Vec::new(); + for frozen in frozen_devices { + let obj_id = transaction.add_device_from_frozen(frozen)?; + obj_ids.push(obj_id) + } + + transaction.finialize()?; + + let transaction_ids = transaction.id_space.in_use_ids(); + self.id_space.borrow_mut().use_new_ids(&transaction_ids); + + self.objects.borrow_mut().extend(transaction.objects); + self.wireless_transmitters + .borrow_mut() + .extend(transaction.wireless_transmitters); + self.wireless_receivers + .borrow_mut() + .extend(transaction.wireless_receivers); + self.circuit_holders + .borrow_mut() + .extend(transaction.circuit_holders); + self.program_holders + .borrow_mut() + .extend(transaction.program_holders); + for (net_id, trans_net) in transaction.networks.into_iter() { + let net = self + .networks + .borrow() + .get(&net_id) + .cloned() + .unwrap_or_else(|| panic!("desync between vm and transaction networks: {net_id}")); + let mut net_ref = net.borrow_mut(); + let net_interface = net_ref + .as_mut_network() + .unwrap_or_else(|| panic!("non network network: {net_id}")); + for id in trans_net.devices { + net_interface.add_data(id); + } + for id in trans_net.power_only { + net_interface.add_power(id); + } + } + + Ok(obj_ids) + } + + pub fn add_device_from_frozen( + self: &Rc, + frozen: FrozenObject, + ) -> Result { + let mut transaction = VMTransaction::new(self); + + let obj_id = transaction.add_device_from_frozen(frozen)?; + + transaction.finialize()?; let transaction_ids = transaction.id_space.in_use_ids(); self.id_space.borrow_mut().use_new_ids(&transaction_ids); @@ -184,11 +262,11 @@ impl VM { if slot.parent == old_id { slot.parent = new_id; } - if slot - .occupant - .is_some_and(|occupant_id| occupant_id == old_id) - { - slot.occupant = Some(new_id); + match slot.occupant.as_mut() { + Some(info) if info.id == old_id => { + info.id = new_id; + } + _ => (), } }); } @@ -813,33 +891,37 @@ impl VM { .get_slot_mut(index) .ok_or(ICError::SlotIndexOutOfRange(index as f64))?; if let Some(target) = target { - if slot.occupant.is_some_and(|occupant| occupant == target) { - slot.quantity = quantity; - Ok(None) - } else { - let Some(item_obj) = self.objects.borrow().get(&target).cloned() else { - return Err(VMError::UnknownId(id)); - }; - let mut item_obj_ref = item_obj.borrow_mut(); - let Some(item) = item_obj_ref.as_mut_item() else { - return Err(VMError::NotAnItem(target)); - }; - if let Some(parent_slot_info) = item.get_parent_slot() { - self.remove_slot_occupant(parent_slot_info.parent, parent_slot_info.slot)?; + match slot.occupant.as_mut() { + Some(info) if info.id == target => { + info.quantity = quantity; + Ok(None) + } + _ => { + let Some(item_obj) = self.objects.borrow().get(&target).cloned() else { + return Err(VMError::UnknownId(id)); + }; + let mut item_obj_ref = item_obj.borrow_mut(); + let Some(item) = item_obj_ref.as_mut_item() else { + return Err(VMError::NotAnItem(target)); + }; + if let Some(parent_slot_info) = item.get_parent_slot() { + self.remove_slot_occupant(parent_slot_info.parent, parent_slot_info.slot)?; + } + item.set_parent_slot(Some(ParentSlotInfo { + parent: id, + slot: index, + })); + let last = slot.occupant.as_ref().map(|info| info.id); + slot.occupant.replace(SlotOccupantInfo { + id: target, + quantity, + }); + Ok(last) } - item.set_parent_slot(Some(ParentSlotInfo { - parent: id, - slot: index, - })); - let last = slot.occupant; - slot.occupant = Some(target); - slot.quantity = quantity; - Ok(last) } } else { - let last = slot.occupant; + let last = slot.occupant.as_ref().map(|info| info.id); slot.occupant = None; - slot.quantity = 0; Ok(last) } } @@ -861,8 +943,7 @@ impl VM { .get_slot_mut(index) .ok_or(ICError::SlotIndexOutOfRange(index as f64))?; - let last = slot.occupant; - slot.occupant = None; + let last = slot.occupant.as_ref().map(|info| info.id); Ok(last) } @@ -880,7 +961,7 @@ impl VM { { None } else { - Some(ObjectTemplate::freeze_object(obj, self)) + Some(FrozenObject::freeze_object(obj, self)) } }) .collect::, _>>()?, @@ -923,9 +1004,10 @@ impl VM { &transaction_networks, state.default_network_key, ); - for template in state.objects { - let _ = transaction.add_device_from_template(template)?; + for frozen in state.objects { + let _ = transaction.add_device_from_frozen(frozen)?; } + transaction.finialize()?; self.circuit_holders.borrow_mut().clear(); self.program_holders.borrow_mut().clear(); @@ -992,6 +1074,7 @@ impl VMTransaction { .keys() .map(|net_id| (*net_id, VMTransactionNetwork::default())) .collect(), + object_parents: BTreeMap::new(), vm: vm.clone(), } } @@ -1013,41 +1096,29 @@ impl VMTransaction { .keys() .map(|net_id| (*net_id, VMTransactionNetwork::default())) .collect(), + object_parents: BTreeMap::new(), vm: vm.clone(), } } - pub fn add_device_from_template( - &mut self, - template: ObjectTemplate, - ) -> Result { - for net_id in &template.connected_networks() { + pub fn add_device_from_frozen(&mut self, frozen: FrozenObject) -> Result { + for net_id in &frozen.connected_networks() { if !self.networks.contains_key(net_id) { return Err(VMError::InvalidNetwork(*net_id)); } } - let obj_id = if let Some(obj_id) = template.object_info().and_then(|info| info.id) { + let obj_id = if let Some(obj_id) = frozen.obj_info.id { self.id_space.use_id(obj_id)?; obj_id } else { self.id_space.next() }; - let obj = template.build(obj_id, &self.vm); + let obj = frozen.build_vm_obj(obj_id, &self.vm)?; - if let Some(storage) = obj.borrow_mut().as_mut_storage() { - for (slot_index, occupant_template) in - template.templates_from_slots().into_iter().enumerate() - { - if let Some(occupant_template) = occupant_template { - let occupant_id = self.add_device_from_template(occupant_template)?; - storage - .get_slot_mut(slot_index) - .unwrap_or_else(|| panic!("object storage slots out of sync with template which built it: {slot_index}")) - .occupant = Some(occupant_id); - } - } + for (index, child_id) in frozen.contained_object_slots() { + self.object_parents.insert(child_id, (index, obj_id)); } if let Some(_w_logicable) = obj.borrow().as_wireless_transmit() { @@ -1086,6 +1157,24 @@ impl VMTransaction { Ok(obj_id) } + + pub fn finialize(&mut self) -> Result<(), VMError> { + for (child, (slot, parent)) in self.object_parents { + let child_obj = self + .objects + .get(&child) + .ok_or(VMError::MissingChild(child))?; + let child_obj_ref = child_obj.borrow_mut(); + let item = child_obj_ref + .as_mut_item() + .ok_or(VMError::NotParentable(child))?; + item.set_parent_slot(Some(ParentSlotInfo { + slot: slot as usize, + parent, + })) + } + Ok(()) + } } pub struct LogicBatchMethodWrapper(LogicBatchMethod); @@ -1202,7 +1291,7 @@ impl IdSpace { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct FrozenVM { - pub objects: Vec, + pub objects: Vec, pub circuit_holders: Vec, pub program_holders: Vec, pub default_network_key: ObjectID, diff --git a/ic10emu/src/vm/instructions/operands.rs b/ic10emu/src/vm/instructions/operands.rs index 3957ba9..ab70f0e 100644 --- a/ic10emu/src/vm/instructions/operands.rs +++ b/ic10emu/src/vm/instructions/operands.rs @@ -2,7 +2,7 @@ use crate::errors::ICError; use crate::interpreter; use crate::vm::{instructions::enums::InstructionOp, object::traits::IntegratedCircuit}; use serde_derive::{Deserialize, Serialize}; -use stationeers_data::enums::script_enums::{ +use stationeers_data::enums::script::{ LogicBatchMethod as BatchMode, LogicReagentMode as ReagentMode, LogicSlotType, LogicType, }; use strum::EnumProperty; @@ -248,7 +248,7 @@ impl InstOperand { } => Ok(*lt), _ => { let val = self.as_value(ic)?; - LogicType::try_from(val).map_err(|| ICError::UnknownLogicType(val)) + LogicType::try_from(val).map_err(|_| ICError::UnknownLogicType(val)) } } } @@ -264,7 +264,7 @@ impl InstOperand { } => Ok(*slt), _ => { let val = self.as_value(ic)?; - LogicSlotType::try_from(val).map_err(|| ICError::UnknownLogicSlotType(val)) + LogicSlotType::try_from(val).map_err(|_| ICError::UnknownLogicSlotType(val)) } } } @@ -277,7 +277,7 @@ impl InstOperand { } => Ok(*bm), _ => { let val = self.as_value(ic)?; - BatchMode::try_from(val).map_err(|| ICError::UnknownBatchMode(val)) + BatchMode::try_from(val).map_err(|_| ICError::UnknownBatchMode(val)) } } } @@ -290,7 +290,7 @@ impl InstOperand { } => Ok(*rm), _ => { let val = self.as_value(ic)?; - ReagentMode::try_from(val).map_err(|| ICError::UnknownReagentMode(val)) + ReagentMode::try_from(val).map_err(|_| ICError::UnknownReagentMode(val)) } } } diff --git a/ic10emu/src/vm/object.rs b/ic10emu/src/vm/object.rs index b0930a6..3170533 100644 --- a/ic10emu/src/vm/object.rs +++ b/ic10emu/src/vm/object.rs @@ -19,8 +19,7 @@ use traits::Object; use crate::vm::VM; use stationeers_data::enums::{ - basic_enums::Class as SlotClass, prefabs::StationpediaPrefab, script_enums::LogicSlotType, - MemoryAccess, + basic::Class as SlotClass, prefabs::StationpediaPrefab, script::LogicSlotType, MemoryAccess, }; pub type ObjectID = u32; @@ -60,6 +59,10 @@ impl VMObject { pub fn get_vm(&self) -> Rc { self.borrow().get_vm().clone() } + + pub fn get_id(&self) -> ObjectID { + *self.borrow().get_id() + } } #[derive(Debug, Default, Clone, Serialize, Deserialize)] @@ -79,7 +82,8 @@ impl Name { pub fn from_prefab_name(name: &str) -> Self { Name { value: name.to_string(), - hash: StationpediaPrefab::from_str(name) + hash: name + .parse::() .map(|prefab| prefab as i32) .unwrap_or_else(|_| const_crc32::crc32(name.as_bytes()) as i32), } @@ -102,6 +106,12 @@ pub struct LogicField { pub value: f64, } +#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] +pub struct SlotOccupantInfo { + pub quantity: u32, + pub id: ObjectID, +} + #[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct Slot { pub parent: ObjectID, @@ -110,6 +120,5 @@ pub struct Slot { pub typ: SlotClass, pub readable_logic: Vec, pub writeable_logic: Vec, - pub occupant: Option, - pub quantity: u32, + pub occupant: Option, } diff --git a/ic10emu/src/vm/object/errors.rs b/ic10emu/src/vm/object/errors.rs index e818f07..bf3d270 100644 --- a/ic10emu/src/vm/object/errors.rs +++ b/ic10emu/src/vm/object/errors.rs @@ -1,7 +1,7 @@ use serde_derive::{Deserialize, Serialize}; use thiserror::Error; -use stationeers_data::enums::script_enums::{LogicSlotType, LogicType}; +use stationeers_data::enums::script::{LogicSlotType, LogicType}; #[derive(Error, Debug, Clone, Serialize, Deserialize)] pub enum LogicError { diff --git a/ic10emu/src/vm/object/generic/structs.rs b/ic10emu/src/vm/object/generic/structs.rs index a6dd513..401dec1 100644 --- a/ic10emu/src/vm/object/generic/structs.rs +++ b/ic10emu/src/vm/object/generic/structs.rs @@ -9,8 +9,8 @@ use crate::{ }; use macro_rules_attribute::derive; use stationeers_data::{ - enums::script_enums::LogicType, - templates::{DeviceInfo, ItemInfo}, + enums::script::LogicType, + templates::{ConsumerInfo, DeviceInfo, FabricatorInfo, InternalAtmoInfo, ItemInfo, ThermalInfo}, }; use std::{collections::BTreeMap, rc::Rc}; @@ -25,6 +25,8 @@ pub struct Generic { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub small_grid: bool, } @@ -39,6 +41,8 @@ pub struct GenericStorage { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub small_grid: bool, pub slots: Vec, } @@ -54,6 +58,8 @@ pub struct GenericLogicable { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub small_grid: bool, pub slots: Vec, pub fields: BTreeMap, @@ -71,6 +77,8 @@ pub struct GenericLogicableDevice { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub small_grid: bool, pub slots: Vec, pub fields: BTreeMap, @@ -81,6 +89,53 @@ pub struct GenericLogicableDevice { pub reagents: Option>, } +#[derive(ObjectInterface!, GWStructure!, GWStorage!, GWLogicable!, GWDevice!)] +#[custom(implements(Object { Structure, Storage, Logicable, Device }))] +pub struct GenericCircuitHolder { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub small_grid: bool, + pub slots: Vec, + pub fields: BTreeMap, + pub modes: Option>, + pub device_info: DeviceInfo, + pub connections: Vec, + pub pins: Option>>, + pub reagents: Option>, +} + +#[derive(ObjectInterface!, GWStructure!, GWStorage!, GWLogicable!, GWDevice!)] +#[custom(implements(Object { Structure, Storage, Logicable, Device }))] +pub struct GenericLogicableDeviceConsumer { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub small_grid: bool, + pub slots: Vec, + pub fields: BTreeMap, + pub modes: Option>, + pub device_info: DeviceInfo, + pub connections: Vec, + pub pins: Option>>, + pub reagents: Option>, + pub consumer_info: ConsumerInfo, +} + #[derive(ObjectInterface!, GWStructure!, GWStorage!, GWLogicable!, GWDevice!, GWMemoryReadable!, GWMemoryWritable!)] #[custom(implements(Object { Structure, Storage, Logicable, Device, MemoryReadable }))] pub struct GenericLogicableDeviceMemoryReadable { @@ -92,6 +147,8 @@ pub struct GenericLogicableDeviceMemoryReadable { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub small_grid: bool, pub slots: Vec, pub fields: BTreeMap, @@ -103,6 +160,32 @@ pub struct GenericLogicableDeviceMemoryReadable { pub memory: Vec, } +#[derive(ObjectInterface!, GWStructure!, GWStorage!, GWLogicable!, GWDevice!, GWMemoryReadable!, GWMemoryWritable!)] +#[custom(implements(Object { Structure, Storage, Logicable, Device, MemoryReadable }))] +pub struct GenericLogicableDeviceConsumerMemoryReadable { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub small_grid: bool, + pub slots: Vec, + pub fields: BTreeMap, + pub modes: Option>, + pub device_info: DeviceInfo, + pub connections: Vec, + pub pins: Option>>, + pub reagents: Option>, + pub consumer_info: ConsumerInfo, + pub fabricator_info: Option, + pub memory: Vec, +} + #[derive(ObjectInterface!, GWStructure!, GWStorage!, GWLogicable!, GWDevice!, GWMemoryReadable!, GWMemoryWritable!)] #[custom(implements(Object { Structure, Storage, Logicable, Device, MemoryReadable, MemoryWritable }))] pub struct GenericLogicableDeviceMemoryReadWriteable { @@ -114,6 +197,8 @@ pub struct GenericLogicableDeviceMemoryReadWriteable { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub small_grid: bool, pub slots: Vec, pub fields: BTreeMap, @@ -125,6 +210,33 @@ pub struct GenericLogicableDeviceMemoryReadWriteable { pub memory: Vec, } + +#[derive(ObjectInterface!, GWStructure!, GWStorage!, GWLogicable!, GWDevice!, GWMemoryReadable!, GWMemoryWritable!)] +#[custom(implements(Object { Structure, Storage, Logicable, Device, MemoryReadable, MemoryWritable }))] +pub struct GenericLogicableDeviceConsumerMemoryReadWriteable { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub small_grid: bool, + pub slots: Vec, + pub fields: BTreeMap, + pub modes: Option>, + pub device_info: DeviceInfo, + pub connections: Vec, + pub pins: Option>>, + pub reagents: Option>, + pub consumer_info: ConsumerInfo, + pub fabricator_info: Option, + pub memory: Vec, +} + #[derive(ObjectInterface!, GWItem!)] #[custom(implements(Object { Item }))] pub struct GenericItem { @@ -136,6 +248,8 @@ pub struct GenericItem { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub item_info: ItemInfo, pub parent_slot: Option, pub damage: Option, @@ -152,12 +266,34 @@ pub struct GenericItemStorage { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub item_info: ItemInfo, pub parent_slot: Option, pub damage: Option, pub slots: Vec, } +#[derive(ObjectInterface!, GWItem!, GWStorage! )] +#[custom(implements(Object { Item, Storage }))] +pub struct GenericItemConsumer { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub item_info: ItemInfo, + pub parent_slot: Option, + pub damage: Option, + pub slots: Vec, + pub consumer_info: ConsumerInfo, +} + #[derive(ObjectInterface!, GWItem!, GWStorage!, GWLogicable! )] #[custom(implements(Object { Item, Storage, Logicable }))] pub struct GenericItemLogicable { @@ -169,6 +305,8 @@ pub struct GenericItemLogicable { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub item_info: ItemInfo, pub parent_slot: Option, pub damage: Option, @@ -188,6 +326,8 @@ pub struct GenericItemLogicableMemoryReadable { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub item_info: ItemInfo, pub parent_slot: Option, pub damage: Option, @@ -208,6 +348,8 @@ pub struct GenericItemLogicableMemoryReadWriteable { pub name: Name, #[custom(object_vm_ref)] pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, pub item_info: ItemInfo, pub parent_slot: Option, pub damage: Option, @@ -216,3 +358,87 @@ pub struct GenericItemLogicableMemoryReadWriteable { pub modes: Option>, pub memory: Vec, } + +#[derive(ObjectInterface!, GWItem!, GWStorage!, GWLogicable! )] +#[custom(implements(Object { Item, Storage, Logicable }))] +pub struct GenericItemCircuitHolder { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub item_info: ItemInfo, + pub parent_slot: Option, + pub damage: Option, + pub slots: Vec, + pub fields: BTreeMap, + pub modes: Option>, +} + + +#[derive(ObjectInterface!, GWItem!, GWStorage!, GWLogicable!)] +#[custom(implements(Object { Item, Storage, Suit, Logicable }))] +pub struct GenericItemSuitLogic { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub item_info: ItemInfo, + pub parent_slot: Option, + pub damage: Option, + pub slots: Vec, + pub fields: BTreeMap, + pub modes: Option>, +} + +#[derive(ObjectInterface!, GWItem!, GWStorage!, GWLogicable!, GWMemoryReadable!, GWMemoryWritable!)] +#[custom(implements(Object { Item, Storage, Suit, Logicable, MemoryReadable, MemoryWritable }))] +pub struct GenericItemSuitCircuitHolder { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub item_info: ItemInfo, + pub parent_slot: Option, + pub damage: Option, + pub slots: Vec, + pub fields: BTreeMap, + pub modes: Option>, + pub memory: Vec, +} + +#[derive(ObjectInterface!, GWItem!, GWStorage! )] +#[custom(implements(Object { Item, Storage, Suit }))] +pub struct GenericItemSuit { + #[custom(object_id)] + pub id: ObjectID, + #[custom(object_prefab)] + pub prefab: Name, + #[custom(object_name)] + pub name: Name, + #[custom(object_vm_ref)] + pub vm: Rc, + pub thermal_info: Option, + pub internal_atmo_info: Option, + pub item_info: ItemInfo, + pub parent_slot: Option, + pub damage: Option, + pub slots: Vec, +} diff --git a/ic10emu/src/vm/object/generic/traits.rs b/ic10emu/src/vm/object/generic/traits.rs index e70fc83..e0b9a8f 100644 --- a/ic10emu/src/vm/object/generic/traits.rs +++ b/ic10emu/src/vm/object/generic/traits.rs @@ -9,8 +9,8 @@ use crate::{ use stationeers_data::{ enums::{ - basic_enums::{Class as SlotClass, GasType, SortingClass}, - script_enums::{LogicSlotType, LogicType}, + basic::{Class as SlotClass, GasType, SortingClass}, + script::{LogicSlotType, LogicType}, }, templates::{DeviceInfo, ItemInfo}, }; @@ -167,7 +167,9 @@ impl Logicable for T { .ok_or_else(|| LogicError::SlotIndexOutOfRange(index, self.slots_count())) .and_then(|slot| { use LogicSlotType::*; - let occupant = slot.occupant.and_then(|id| self.get_vm().get_object(id)); + let occupant = slot + .occupant + .and_then(|info| self.get_vm().get_object(info.id)); match slt { Occupied => { if slot.occupant.is_some() { @@ -177,8 +179,8 @@ impl Logicable for T { } } Quantity => { - if slot.occupant.is_some() { - Ok(slot.quantity as f64) + if let Some(info) = &slot.occupant { + Ok(info.quantity as f64) } else { Ok(0.0) } @@ -261,11 +263,11 @@ impl Logicable for T { Pressure => logicable.get_logic(LogicType::Pressure), PressureAir => logicable .as_suit() - .map(|suit| suit.pressure_air()) + .map(|suit| suit.pressure_air() as f64) .ok_or(LogicError::CantSlotRead(slt, index)), PressureWaste => logicable .as_suit() - .map(|suit| suit.pressure_waste()) + .map(|suit| suit.pressure_waste() as f64) .ok_or(LogicError::CantSlotRead(slt, index)), Temperature => logicable.get_logic(LogicType::Temperature), Seeding => logicable @@ -398,11 +400,13 @@ impl Device for T { .and_then(|slot| { // special case, update slot quantity if >= 1 if slt == Quantity && force && value >= 1.0 { - slot.quantity = value as u32; + if let Some(occupant) = slot.occupant.as_mut() { + occupant.quantity = value as u32; + } return Ok(()); } if slot.writeable_logic.contains(&slt) { - let occupant = slot.occupant.and_then(|id| vm.get_object(id)); + let occupant = slot.occupant.and_then(|info| vm.get_object(info.id)); if let Some(occupant) = occupant { let mut occupant_ref = occupant.borrow_mut(); let logicable = occupant_ref diff --git a/ic10emu/src/vm/object/stationpedia.rs b/ic10emu/src/vm/object/stationpedia.rs index acd11b8..298464e 100644 --- a/ic10emu/src/vm/object/stationpedia.rs +++ b/ic10emu/src/vm/object/stationpedia.rs @@ -2,7 +2,10 @@ use std::rc::Rc; use stationeers_data::{enums::prefabs::StationpediaPrefab, templates::ObjectTemplate}; -use crate::vm::object::VMObject; +use crate::vm::object::{ + templates::{FrozenObject, ObjectInfo, Prefab}, + VMObject, +}; use crate::vm::VM; use super::ObjectID; @@ -10,12 +13,14 @@ use super::ObjectID; pub mod structs; #[allow(unused)] -pub fn object_from_prefab_template( - template: &ObjectTemplate, - id: ObjectID, - vm: &Rc, -) -> Option { - let prefab = StationpediaPrefab::from_repr(template.prefab_info().prefab_hash); +pub fn object_from_frozen(obj: &ObjectInfo, id: ObjectID, vm: &Rc) -> Option { + let hash = match obj.prefab { + Some(Prefab::Hash(hash)) => hash, + Some(Prefab::Name(name)) => const_crc32::crc32(name.as_bytes()) as i32, + None => return None, + }; + + let prefab = StationpediaPrefab::from_repr(hash); match prefab { // Some(StationpediaPrefab::ItemIntegratedCircuit10) => { // Some(VMObject::new(structs::ItemIntegratedCircuit10)) diff --git a/ic10emu/src/vm/object/stationpedia/structs/circuit_holder.rs b/ic10emu/src/vm/object/stationpedia/structs/circuit_holder.rs index e2a10d8..5057ea1 100644 --- a/ic10emu/src/vm/object/stationpedia/structs/circuit_holder.rs +++ b/ic10emu/src/vm/object/stationpedia/structs/circuit_holder.rs @@ -9,9 +9,9 @@ use crate::{ }; use macro_rules_attribute::derive; use stationeers_data::enums::{ - basic_enums::Class as SlotClass, + basic::Class as SlotClass, prefabs::StationpediaPrefab, - script_enums::{LogicSlotType, LogicType}, + script::{LogicSlotType, LogicType}, ConnectionRole, }; use std::rc::Rc; @@ -73,7 +73,6 @@ impl StructureCircuitHousing { ], writeable_logic: vec![], occupant: None, - quantity: 0, }, pins: [None, None, None, None, None, None], connections: [ @@ -163,8 +162,8 @@ impl Logicable for StructureCircuitHousing { LogicType::ReferenceId => Ok(*self.get_id() as f64), LogicType::Error => Ok(self.error as f64), LogicType::LineNumber => { - let result = self.slot.occupant.and_then(|id| { - self.vm.get_object(id).and_then(|obj| { + let result = self.slot.occupant.and_then(|info| { + self.vm.get_object(info.id).and_then(|obj| { obj.borrow() .as_logicable() .map(|logicable| logicable.get_logic(LogicType::LineNumber)) @@ -208,8 +207,8 @@ impl Logicable for StructureCircuitHousing { LogicType::LineNumber => self .slot .occupant - .and_then(|id| { - self.vm.get_object(id).and_then(|obj| { + .and_then(|info| { + self.vm.get_object(info.id).and_then(|obj| { obj.borrow_mut().as_mut_logicable().map(|logicable| { logicable.set_logic(LogicType::LineNumber, value, force) }) @@ -405,11 +404,11 @@ impl CircuitHolder for StructureCircuitHousing { } fn get_ic(&self) -> Option { - self.slot.occupant.and_then(|id| self.vm.get_object(id)) + self.slot.occupant.and_then(|info| self.vm.get_object(info.id)) } fn get_ic_mut(&self) -> Option { - self.slot.occupant.and_then(|id| self.vm.get_object(id)) + self.slot.occupant.and_then(|info| self.vm.get_object(info.id)) } fn hault_and_catch_fire(&mut self) { diff --git a/ic10emu/src/vm/object/stationpedia/structs/integrated_circuit.rs b/ic10emu/src/vm/object/stationpedia/structs/integrated_circuit.rs index 9cec5f0..c2a90c4 100644 --- a/ic10emu/src/vm/object/stationpedia/structs/integrated_circuit.rs +++ b/ic10emu/src/vm/object/stationpedia/structs/integrated_circuit.rs @@ -14,8 +14,8 @@ use crate::{ }; use macro_rules_attribute::derive; use stationeers_data::enums::{ - basic_enums::{Class as SlotClass, GasType, SortingClass}, - script_enums::{LogicSlotType, LogicType}, + basic::{Class as SlotClass, GasType, SortingClass}, + script::{LogicSlotType, LogicType}, }; use std::{collections::BTreeMap, rc::Rc}; diff --git a/ic10emu/src/vm/object/templates.rs b/ic10emu/src/vm/object/templates.rs index 5e1d2d8..17ec12b 100644 --- a/ic10emu/src/vm/object/templates.rs +++ b/ic10emu/src/vm/object/templates.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, rc::Rc}; +use std::{collections::BTreeMap, rc::Rc, str::FromStr}; use crate::{ errors::TemplateError, @@ -6,14 +6,18 @@ use crate::{ vm::{ object::{ generic::structs::{ - Generic, GenericItem, GenericItemLogicable, - GenericItemLogicableMemoryReadWriteable, GenericItemLogicableMemoryReadable, - GenericItemStorage, GenericLogicable, GenericLogicableDevice, + Generic, GenericCircuitHolder, GenericItem, GenericItemCircuitHolder, + GenericItemConsumer, GenericItemLogicable, GenericItemLogicableMemoryReadWriteable, + GenericItemLogicableMemoryReadable, GenericItemStorage, GenericItemSuit, + GenericItemSuitCircuitHolder, GenericItemSuitLogic, GenericLogicable, + GenericLogicableDevice, GenericLogicableDeviceConsumer, + GenericLogicableDeviceConsumerMemoryReadWriteable, + GenericLogicableDeviceConsumerMemoryReadable, GenericLogicableDeviceMemoryReadWriteable, GenericLogicableDeviceMemoryReadable, GenericStorage, }, traits::*, - LogicField, Name, Slot, + LogicField, Name, Slot, SlotOccupantInfo, }, VM, }, @@ -21,9 +25,9 @@ use crate::{ use serde_derive::{Deserialize, Serialize}; use stationeers_data::{ enums::{ - basic_enums::{Class as SlotClass, GasType, SortingClass}, + basic::{Class as SlotClass, GasType, SortingClass}, prefabs::StationpediaPrefab, - script_enums::{LogicSlotType, LogicType}, + script::{LogicSlotType, LogicType}, ConnectionRole, ConnectionType, }, templates::*, @@ -33,10 +37,40 @@ use strum::{EnumProperty, IntoEnumIterator}; use super::{stationpedia, MemoryAccess, ObjectID, VMObject}; #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] +pub enum Prefab { + Hash(i32), + Name(String), +} + +impl std::fmt::Display for Prefab { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let (known_prefab, unknown_str) = match self { + Self::Hash(hash) => ( + StationpediaPrefab::from_repr(*hash), + format!("Unknown({hash}))"), + ), + Self::Name(name) => (StationpediaPrefab::from_str(&name).ok(), name.clone()), + }; + if let Some(known) = known_prefab { + write!(f, "{known}") + } else { + write!(f, "{unknown_str}") + } + } +} + +#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] pub struct ObjectInfo { pub name: Option, pub id: Option, + pub prefab: Option, + pub slots: Option>, + pub damage: Option, + pub device_pins: Option>, + pub connections: Option>, + pub reagents: Option>, + pub memory: Option>, + pub logic_values: Option>, } impl From<&VMObject> for ObjectInfo { @@ -45,1139 +79,948 @@ impl From<&VMObject> for ObjectInfo { ObjectInfo { name: Some(obj_ref.get_name().value.clone()), id: Some(*obj_ref.get_id()), + prefab: Some(Prefab::Hash(obj_ref.get_prefab().hash)), + slots: None, + damage: None, + device_pins: None, + connections: None, + reagents: None, + memory: None, + logic_values: None, } } } -pub struct FrozenObjectTemplate { - obj_info: ObjectInfo, - template: ObjectTemplate, -} +impl ObjectInfo { + pub fn update_from_interfaces(&mut self, interfaces: &ObjectInterfaces<'_>) -> &mut Self { + if let Some(storage) = interfaces.storage { + self.update_from_storage(storage); + } + if let Some(logic) = interfaces.logicable { + self.update_from_logic(logic); + } + if let Some(device) = interfaces.device { + self.update_from_device(device); + } + if let Some(memory) = interfaces.memory_readable { + self.update_from_memory(memory); + } + if let Some(item) = interfaces.item { + self.update_from_item(item); + } + self + } -pub struct FrozenObject { - obj_info: ObjectInfo, - template: Option, -} - -impl FrozenObjectTemplate { - pub fn build_vm_obj(&self, id: ObjectID, vm: &Rc) -> VMObject { - if let Some(obj) = stationpedia::object_from_prefab_template(self, id, vm) { - obj + pub fn update_from_storage(&mut self, storage: StorageRef<'_>) -> &mut Self { + let slots = storage.get_slots(); + if slots.is_empty() { + self.slots = None; } else { - self.build_generic(id, vm.clone()) + self.slots.replace( + slots + .into_iter() + .enumerate() + .filter_map(|(index, slot)| match slot.occupant.as_ref() { + Some(occupant) => Some((index as u32, occupant.clone())), + None => None, + }) + .collect(), + ); + } + self + } + + pub fn update_from_item(&mut self, item: ItemRef<'_>) -> &mut Self { + let damage = item.get_damage(); + if damage == 0.0 { + self.damage = None; + } else { + self.damage.replace(damage); + } + self + } + + pub fn update_from_device(&mut self, device: DeviceRef<'_>) -> &mut Self { + let pins = device.device_pins(); + if pins.is_some_and(|pins| pins.is_empty()) { + self.device_pins = None; + } else { + self.device_pins = pins.map(|pins| { + pins.into_iter() + .enumerate() + .filter_map(|(index, pin)| match pin { + Some(pin) => Some((index as u32, *pin)), + None => None, + }) + .collect() + }); + } + let reagents: BTreeMap = device.get_reagents().iter().copied().collect(); + if reagents.is_empty() { + self.reagents = None; + } else { + self.reagents.replace(reagents); + } + let connections = device.connection_list(); + if connections.is_empty() { + self.connections = None; + } else { + self.connections.replace( + connections + .into_iter() + .enumerate() + .filter_map(|(index, conn)| match conn.get_network() { + Some(net) => Some((index as u32, net)), + None => None, + }) + .collect(), + ); + } + self + } + + pub fn update_from_memory(&mut self, memory: MemoryReadableRef<'_>) -> &mut Self { + if memory.memory_size() != 0 { + self.memory.replace(memory.get_memory_slice().to_vec()); + } else { + self.memory = None; + } + self + } + + pub fn update_from_logic(&mut self, logic: LogicableRef<'_>) -> &mut Self { + self.logic_values.replace( + logic + .valid_logic_types() + .iter() + .filter_map(|lt| match logic.get_logic(*lt) { + Ok(val) => Some((*lt, val)), + _ => None, + }) + .collect(), + ); + self + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct FrozenObject { + pub obj_info: ObjectInfo, + pub template: Option, +} + +impl FrozenObject { + pub fn new(obj_info: ObjectInfo) -> Self { + FrozenObject { + obj_info, + template: None, + } + } + + pub fn with_template(obj_info: ObjectInfo, template: ObjectTemplate) -> Self { + FrozenObject { + obj_info, + template: Some(template), + } + } + + pub fn build_vm_obj(&self, id: ObjectID, vm: &Rc) -> Result { + let template = self.template.map_or_else( + || { + self.obj_info + .prefab + .map(|prefab| { + vm.get_template(prefab) + .ok_or(TemplateError::NoTemplateForPrefab(prefab)) + }) + .transpose()? + .ok_or(TemplateError::MissingPrefab) + }, + |template| Ok(template), + )?; + if let Some(obj) = stationpedia::object_from_frozen(&self.obj_info, id, vm) { + Ok(obj) + } else { + self.build_generic(id, &template, vm.clone()) } } pub fn connected_networks(&self) -> Vec { - use ObjectTemplate::*; - match self.template { - StructureLogicDevice(s) => s - .device - .connection_list - .iter() - .filter_map(|conn| conn.network.as_ref()) - .copied() - .collect(), - StructureLogicDeviceMemory(s) => s - .device - .connection_list - .iter() - .filter_map(|conn| conn.network.as_ref()) - .copied() - .collect(), - _ => vec![], - } + self.obj_info + .connections + .map(|connections| connections.values().copied().collect()) + .unwrap_or_else(Vec::new) } pub fn contained_object_ids(&self) -> Vec { - use ObjectTemplate::*; - match self.template { - StructureSlots(s) => s - .slots - .iter() - .filter_map(|info| { - info.occupant + self.obj_info + .slots + .map(|slots| slots.values().map(|slot| slot.id).collect()) + .unwrap_or_else(Vec::new) + } + + pub fn contained_object_slots(&self) -> Vec<(u32, ObjectID)> { + self.obj_info + .slots + .map(|slots| { + slots + .iter() + .map(|(index, slot)| (*index, slot.id)) + .collect() + }) + .unwrap_or_else(Vec::new) + } + + fn build_slots( + &self, + id: ObjectID, + slots_info: &Vec, + logic_info: Option<&LogicInfo>, + ) -> Vec { + slots_info + .into_iter() + .enumerate() + .map(|(index, info)| Slot { + parent: id, + index, + name: info.name.clone(), + typ: info.typ, + readable_logic: logic_info + .and_then(|info| { + info.logic_slot_types.get(&(index as u32)).map(|s_info| { + s_info + .iter() + .filter_map(|(key, access)| match access { + MemoryAccess::Read | MemoryAccess::ReadWrite => Some(key), + _ => None, + }) + .copied() + .collect::>() + }) + }) + .unwrap_or_else(Vec::new), + writeable_logic: logic_info + .and_then(|info| { + info.logic_slot_types.get(&(index as u32)).map(|s_info| { + s_info + .iter() + .filter_map(|(key, access)| match access { + MemoryAccess::Write | MemoryAccess::ReadWrite => Some(key), + _ => None, + }) + .copied() + .collect::>() + }) + }) + .unwrap_or_else(Vec::new), + occupant: self + .obj_info + .slots + .and_then(|slots| slots.get(&(index as u32)).cloned()), + }) + .collect() + } + + fn build_logic_fields(&self, logic_info: &LogicInfo) -> BTreeMap { + logic_info + .logic_types + .iter() + .map(|(key, access)| { + ( + *key, + LogicField { + field_type: *access, + value: self + .obj_info + .logic_values + .as_ref() + .and_then(|values| values.get(key)) + .copied() + .unwrap_or(0.0), + }, + ) + }) + .collect() + } + + fn build_connections(&self, device_info: &DeviceInfo) -> Vec { + device_info + .connection_list + .iter() + .enumerate() + .map(|(index, conn_info)| { + Connection::from_info( + conn_info.typ, + conn_info.role, + self.obj_info + .connections .as_ref() - .map(|obj| obj.object_info().and_then(|obj_info| obj_info.id)) - }) - .flatten() - .collect(), - StructureLogic(s) => s - .slots - .iter() - .filter_map(|info| { - info.occupant - .as_ref() - .map(|obj| obj.object_info().and_then(|obj_info| obj_info.id)) - }) - .flatten() - .collect(), - StructureLogicDevice(s) => s - .slots - .iter() - .filter_map(|info| { - info.occupant - .as_ref() - .map(|obj| obj.object_info().and_then(|obj_info| obj_info.id)) - }) - .flatten() - .collect(), - StructureLogicDeviceMemory(s) => s - .slots - .iter() - .filter_map(|info| { - info.occupant - .as_ref() - .map(|obj| obj.object_info().and_then(|obj_info| obj_info.id)) - }) - .flatten() - .collect(), - ItemSlots(i) => i - .slots - .iter() - .filter_map(|info| { - info.occupant - .as_ref() - .map(|obj| obj.object_info().and_then(|obj_info| obj_info.id)) - }) - .flatten() - .collect(), - ItemLogic(i) => i - .slots - .iter() - .filter_map(|info| { - info.occupant - .as_ref() - .map(|obj| obj.object_info().and_then(|obj_info| obj_info.id)) - }) - .flatten() - .collect(), - ItemLogicMemory(i) => i - .slots - .iter() - .filter_map(|info| { - info.occupant - .as_ref() - .map(|obj| obj.object_info().and_then(|obj_info| obj_info.id)) - }) - .flatten() - .collect(), - _ => vec![], + .and_then(|connections| connections.get(&(index as u32)).copied()), + ) + }) + .collect() + } + + fn build_pins(&self, device_info: &DeviceInfo) -> Option>> { + let num_pins = device_info.device_pins_length.unwrap_or(0); + if num_pins > 0 { + Some( + (0..num_pins) + .map(|index| { + self.obj_info + .device_pins + .as_ref() + .and_then(|pins| pins.get(&index).copied()) + }) + .collect(), + ) + } else { + None } } - pub fn templates_from_slots(&self) -> Vec> { - use ObjectTemplate::*; - match self.template { - StructureSlots(s) => s.slots.iter().map(|info| info.occupant.clone()).collect(), - StructureLogic(s) => s.slots.iter().map(|info| info.occupant.clone()).collect(), - StructureLogicDevice(s) => s.slots.iter().map(|info| info.occupant.clone()).collect(), - StructureLogicDeviceMemory(s) => { - s.slots.iter().map(|info| info.occupant.clone()).collect() - } - ItemSlots(i) => i.slots.iter().map(|info| info.occupant.clone()).collect(), - ItemLogic(i) => i.slots.iter().map(|info| info.occupant.clone()).collect(), - ItemLogicMemory(i) => i.slots.iter().map(|info| info.occupant.clone()).collect(), - _ => vec![], - } + fn build_memory(&self, memory_info: &MemoryInfo) -> Vec { + self.obj_info + .memory + .clone() + .unwrap_or_else(|| vec![0.0; memory_info.memory_size as usize]) } - fn build_generic(&self, id: ObjectID, vm: Rc) -> VMObject { + fn build_generic( + &self, + id: ObjectID, + template: &ObjectTemplate, + vm: Rc, + ) -> Result { use ObjectTemplate::*; - match self.template { - Structure(s) => VMObject::new(Generic { + match template { + Structure(s) => Ok(VMObject::new(Generic { id, prefab: Name::from_prefab_name(&s.prefab.prefab_name), name: Name::new(&s.prefab.name), vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), small_grid: s.structure.small_grid, - }), - StructureSlots(s) => VMObject::new(GenericStorage { + })), + StructureSlots(s) => Ok(VMObject::new(GenericStorage { id, prefab: Name::from_prefab_name(&s.prefab.prefab_name), name: Name::new(&s.prefab.name), vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), small_grid: s.structure.small_grid, - slots: s - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: Vec::new(), - writeable_logic: Vec::new(), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - }), - StructureLogic(s) => VMObject::new(GenericLogicable { + slots: self.build_slots(id, &s.slots, None), + })), + StructureLogic(s) => Ok(VMObject::new(GenericLogicable { id, prefab: Name::from_prefab_name(&s.prefab.prefab_name), name: Name::new(&s.prefab.name), vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), small_grid: s.structure.small_grid, - slots: s - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: s - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Read | MemoryAccess::ReadWrite => Some(key), - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - writeable_logic: s - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Write | MemoryAccess::ReadWrite => Some(key), - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - fields: s - .logic - .logic_types - .types - .iter() - .map(|(key, access)| { - ( - *key, - LogicField { - field_type: *access, - value: s - .logic - .logic_values - .as_ref() - .and_then(|values| values.get(key)) - .copied() - .unwrap_or(0.0), - }, - ) - }) - .collect(), + slots: self.build_slots(id, &s.slots, Some(&s.logic)), + fields: self.build_logic_fields(&s.logic), modes: s.logic.modes.clone(), - }), - StructureLogicDevice(s) => VMObject::new(GenericLogicableDevice { + })), + StructureLogicDevice(s) => Ok(VMObject::new(GenericLogicableDevice { id, prefab: Name::from_prefab_name(&s.prefab.prefab_name), name: Name::new(&s.prefab.name), vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), small_grid: s.structure.small_grid, - slots: s - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: s - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Read | MemoryAccess::ReadWrite => Some(key), - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - writeable_logic: s - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Write | MemoryAccess::ReadWrite => Some(key), - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - fields: s - .logic - .logic_types - .types - .iter() - .map(|(key, access)| { - ( - *key, - LogicField { - field_type: *access, - value: s - .logic - .logic_values - .as_ref() - .and_then(|values| values.get(key)) - .copied() - .unwrap_or(0.0), - }, - ) - }) - .collect(), + slots: self.build_slots(id, &s.slots, Some(&s.logic)), + fields: self.build_logic_fields(&s.logic), modes: s.logic.modes.clone(), - connections: s - .device - .connection_list - .iter() - .map(|conn_info| { - Connection::from_info(conn_info.typ, conn_info.role, conn_info.network) - }) - .collect(), - pins: s - .device - .device_pins - .as_ref() - .map(|pins| Some(pins.clone())) - .unwrap_or_else(|| { - s.device - .device_pins_length - .map(|pins_len| vec![None; pins_len]) - }), + connections: self.build_connections(&s.device), + pins: self.build_pins(&s.device), device_info: s.device.clone(), - reagents: s.device.reagents.clone(), - }), + reagents: self.obj_info.reagents.clone(), + })), + StructureLogicDeviceConsumer(s) => Ok(VMObject::new(GenericLogicableDeviceConsumer { + id, + prefab: Name::from_prefab_name(&s.prefab.prefab_name), + name: Name::new(&s.prefab.name), + vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), + small_grid: s.structure.small_grid, + slots: self.build_slots(id, &s.slots, Some(&s.logic)), + fields: self.build_logic_fields(&s.logic), + modes: s.logic.modes.clone(), + connections: self.build_connections(&s.device), + pins: self.build_pins(&s.device), + device_info: s.device.clone(), + reagents: self.obj_info.reagents.clone(), + consumer_info: s.consumer_info.clone(), + })), + StructureCircuitHolder(s) => Ok(VMObject::new(GenericCircuitHolder { + id, + prefab: Name::from_prefab_name(&s.prefab.prefab_name), + name: Name::new(&s.prefab.name), + vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), + small_grid: s.structure.small_grid, + slots: self.build_slots(id, &s.slots, Some(&s.logic)), + fields: self.build_logic_fields(&s.logic), + modes: s.logic.modes.clone(), + connections: self.build_connections(&s.device), + pins: self.build_pins(&s.device), + device_info: s.device.clone(), + reagents: self.obj_info.reagents.clone(), + })), StructureLogicDeviceMemory(s) if matches!(s.memory.memory_access, MemoryAccess::Read) => { - VMObject::new(GenericLogicableDeviceMemoryReadable { + Ok(VMObject::new(GenericLogicableDeviceMemoryReadable { id, prefab: Name::from_prefab_name(&s.prefab.prefab_name), name: Name::new(&s.prefab.name), vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), small_grid: s.structure.small_grid, - slots: s - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: s - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Read | MemoryAccess::ReadWrite => { - Some(key) - } - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - writeable_logic: s - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Write | MemoryAccess::ReadWrite => { - Some(key) - } - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - fields: s - .logic - .logic_types - .types - .iter() - .map(|(key, access)| { - ( - *key, - LogicField { - field_type: *access, - value: s - .logic - .logic_values - .as_ref() - .and_then(|values| values.get(key)) - .copied() - .unwrap_or(0.0), - }, - ) - }) - .collect(), + slots: self.build_slots(id, &s.slots, Some(&s.logic)), + fields: self.build_logic_fields(&s.logic), modes: s.logic.modes.clone(), - connections: s - .device - .connection_list - .iter() - .map(|conn_info| { - Connection::from_info(conn_info.typ, conn_info.role, conn_info.network) - }) - .collect(), - pins: s - .device - .device_pins - .as_ref() - .map(|pins| Some(pins.clone())) - .unwrap_or_else(|| { - s.device - .device_pins_length - .map(|pins_len| vec![None; pins_len]) - }), + connections: self.build_connections(&s.device), + pins: self.build_pins(&s.device), device_info: s.device.clone(), - reagents: s.device.reagents.clone(), - memory: s - .memory - .values - .clone() - .unwrap_or_else(|| vec![0.0; s.memory.memory_size]), - }) + reagents: self.obj_info.reagents.clone(), + memory: self.build_memory(&s.memory), + })) } StructureLogicDeviceMemory(s) => { - VMObject::new(GenericLogicableDeviceMemoryReadWriteable { + Ok(VMObject::new(GenericLogicableDeviceMemoryReadWriteable { id, prefab: Name::from_prefab_name(&s.prefab.prefab_name), name: Name::new(&s.prefab.name), vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), small_grid: s.structure.small_grid, - slots: s - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: s - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Read | MemoryAccess::ReadWrite => { - Some(key) - } - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - writeable_logic: s - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Write | MemoryAccess::ReadWrite => { - Some(key) - } - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - fields: s - .logic - .logic_types - .types - .iter() - .map(|(key, access)| { - ( - *key, - LogicField { - field_type: *access, - value: s - .logic - .logic_values - .as_ref() - .and_then(|values| values.get(key)) - .copied() - .unwrap_or(0.0), - }, - ) - }) - .collect(), + slots: self.build_slots(id, &s.slots, Some(&s.logic)), + fields: self.build_logic_fields(&s.logic), modes: s.logic.modes.clone(), - connections: s - .device - .connection_list - .iter() - .map(|conn_info| { - Connection::from_info(conn_info.typ, conn_info.role, conn_info.network) - }) - .collect(), - pins: s - .device - .device_pins - .as_ref() - .map(|pins| Some(pins.clone())) - .unwrap_or_else(|| { - s.device - .device_pins_length - .map(|pins_len| vec![None; pins_len]) - }), + connections: self.build_connections(&s.device), + pins: self.build_pins(&s.device), device_info: s.device.clone(), - reagents: s.device.reagents.clone(), - memory: s - .memory - .values - .clone() - .unwrap_or_else(|| vec![0.0; s.memory.memory_size]), - }) + reagents: self.obj_info.reagents.clone(), + memory: self.build_memory(&s.memory), + })) } - Item(i) => VMObject::new(GenericItem { + StructureLogicDeviceConsumerMemory(s) + if matches!(s.memory.memory_access, MemoryAccess::Read) => + { + Ok(VMObject::new( + GenericLogicableDeviceConsumerMemoryReadable { + id, + prefab: Name::from_prefab_name(&s.prefab.prefab_name), + name: Name::new(&s.prefab.name), + vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), + small_grid: s.structure.small_grid, + slots: self.build_slots(id, &s.slots, Some(&s.logic)), + fields: self.build_logic_fields(&s.logic), + modes: s.logic.modes.clone(), + connections: self.build_connections(&s.device), + pins: self.build_pins(&s.device), + device_info: s.device.clone(), + reagents: self.obj_info.reagents.clone(), + consumer_info: s.consumer_info.clone(), + fabricator_info: s.fabricator_info.clone(), + memory: self.build_memory(&s.memory), + }, + )) + } + StructureLogicDeviceConsumerMemory(s) => Ok(VMObject::new( + GenericLogicableDeviceConsumerMemoryReadWriteable { + id, + prefab: Name::from_prefab_name(&s.prefab.prefab_name), + name: Name::new(&s.prefab.name), + vm, + internal_atmo_info: s.internal_atmo_info.clone(), + thermal_info: s.thermal_info.clone(), + small_grid: s.structure.small_grid, + slots: self.build_slots(id, &s.slots, Some(&s.logic)), + fields: self.build_logic_fields(&s.logic), + modes: s.logic.modes.clone(), + connections: self.build_connections(&s.device), + pins: self.build_pins(&s.device), + device_info: s.device.clone(), + reagents: self.obj_info.reagents.clone(), + consumer_info: s.consumer_info.clone(), + fabricator_info: s.fabricator_info.clone(), + memory: self.build_memory(&s.memory), + }, + )), + Item(i) => Ok(VMObject::new(GenericItem { id, prefab: Name::from_prefab_name(&i.prefab.prefab_name), name: Name::new(&i.prefab.name), vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), item_info: i.item.clone(), parent_slot: None, - damage: i.item.damage, - }), - ItemSlots(i) => VMObject::new(GenericItemStorage { + damage: self.obj_info.damage.clone(), + })), + ItemSlots(i) => Ok(VMObject::new(GenericItemStorage { id, prefab: Name::from_prefab_name(&i.prefab.prefab_name), name: Name::new(&i.prefab.name), vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), item_info: i.item.clone(), parent_slot: None, - damage: i.item.damage, - slots: i - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: Vec::new(), - writeable_logic: Vec::new(), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - }), - ItemLogic(i) => VMObject::new(GenericItemLogicable { + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, None), + })), + ItemConsumer(i) => Ok(VMObject::new(GenericItemConsumer { id, prefab: Name::from_prefab_name(&i.prefab.prefab_name), name: Name::new(&i.prefab.name), vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), item_info: i.item.clone(), parent_slot: None, - damage: i.item.damage, - slots: i - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: i - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Read | MemoryAccess::ReadWrite => Some(key), - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - writeable_logic: i - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Write | MemoryAccess::ReadWrite => Some(key), - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - fields: i - .logic - .logic_types - .types - .iter() - .map(|(key, access)| { - ( - *key, - LogicField { - field_type: *access, - value: i - .logic - .logic_values - .as_ref() - .and_then(|values| values.get(key)) - .copied() - .unwrap_or(0.0), - }, - ) - }) - .collect(), + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, None), + consumer_info: i.consumer_info.clone(), + })), + ItemLogic(i) => Ok(VMObject::new(GenericItemLogicable { + id, + prefab: Name::from_prefab_name(&i.prefab.prefab_name), + name: Name::new(&i.prefab.name), + vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), + item_info: i.item.clone(), + parent_slot: None, + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, Some(&i.logic)), + fields: self.build_logic_fields(&i.logic), modes: i.logic.modes.clone(), - }), + })), ItemLogicMemory(i) if matches!(i.memory.memory_access, MemoryAccess::Read) => { - VMObject::new(GenericItemLogicableMemoryReadable { + Ok(VMObject::new(GenericItemLogicableMemoryReadable { id, prefab: Name::from_prefab_name(&i.prefab.prefab_name), name: Name::new(&i.prefab.name), vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), item_info: i.item.clone(), parent_slot: None, - damage: i.item.damage, - slots: i - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: i - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Read | MemoryAccess::ReadWrite => { - Some(key) - } - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - writeable_logic: i - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Write | MemoryAccess::ReadWrite => { - Some(key) - } - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - fields: i - .logic - .logic_types - .types - .iter() - .map(|(key, access)| { - ( - *key, - LogicField { - field_type: *access, - value: i - .logic - .logic_values - .as_ref() - .and_then(|values| values.get(key)) - .copied() - .unwrap_or(0.0), - }, - ) - }) - .collect(), + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, Some(&i.logic)), + fields: self.build_logic_fields(&i.logic), modes: i.logic.modes.clone(), - memory: i - .memory - .values - .clone() - .unwrap_or_else(|| vec![0.0; i.memory.memory_size]), - }) + memory: self.build_memory(&i.memory), + })) } - ItemLogicMemory(i) => VMObject::new(GenericItemLogicableMemoryReadWriteable { + ItemLogicMemory(i) => Ok(VMObject::new(GenericItemLogicableMemoryReadWriteable { id, prefab: Name::from_prefab_name(&i.prefab.prefab_name), name: Name::new(&i.prefab.name), vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), item_info: i.item.clone(), parent_slot: None, - damage: i.item.damage, - slots: i - .slots - .iter() - .enumerate() - .map(|(index, info)| Slot { - parent: id, - index, - name: info.name.clone(), - typ: info.typ, - readable_logic: i - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Read | MemoryAccess::ReadWrite => Some(key), - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - writeable_logic: i - .logic - .logic_slot_types - .get(&(index as u32)) - .map(|s_info| { - s_info - .slot_types - .iter() - .filter_map(|(key, access)| match access { - MemoryAccess::Write | MemoryAccess::ReadWrite => Some(key), - _ => None, - }) - .copied() - .collect::>() - }) - .unwrap_or_else(Vec::new), - occupant: None, - quantity: info.quantity.unwrap_or(0), - }) - .collect(), - fields: i - .logic - .logic_types - .types - .iter() - .map(|(key, access)| { - ( - *key, - LogicField { - field_type: *access, - value: i - .logic - .logic_values - .as_ref() - .and_then(|values| values.get(key)) - .copied() - .unwrap_or(0.0), - }, - ) - }) - .collect(), + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, Some(&i.logic)), + fields: self.build_logic_fields(&i.logic), modes: i.logic.modes.clone(), - memory: i - .memory - .values - .clone() - .unwrap_or_else(|| vec![0.0; i.memory.memory_size]), - }), + memory: self.build_memory(&i.memory), + })), + ItemCircuitHolder(i) => Ok(VMObject::new(GenericItemCircuitHolder { + id, + prefab: Name::from_prefab_name(&i.prefab.prefab_name), + name: Name::new(&i.prefab.name), + vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), + item_info: i.item.clone(), + parent_slot: None, + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, Some(&i.logic)), + fields: self.build_logic_fields(&i.logic), + modes: i.logic.modes.clone(), + })), + ItemSuit(i) => Ok(VMObject::new(GenericItemSuit { + id, + prefab: Name::from_prefab_name(&i.prefab.prefab_name), + name: Name::new(&i.prefab.name), + vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), + item_info: i.item.clone(), + parent_slot: None, + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, None), + })), + ItemSuitLogic(i) => Ok(VMObject::new(GenericItemSuitLogic { + id, + prefab: Name::from_prefab_name(&i.prefab.prefab_name), + name: Name::new(&i.prefab.name), + vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), + item_info: i.item.clone(), + parent_slot: None, + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, Some(&i.logic)), + fields: self.build_logic_fields(&i.logic), + modes: i.logic.modes.clone(), + })), + ItemSuitCircuitHolder(i) => Ok(VMObject::new(GenericItemSuitCircuitHolder { + id, + prefab: Name::from_prefab_name(&i.prefab.prefab_name), + name: Name::new(&i.prefab.name), + vm, + internal_atmo_info: i.internal_atmo_info.clone(), + thermal_info: i.thermal_info.clone(), + item_info: i.item.clone(), + parent_slot: None, + damage: self.obj_info.damage.clone(), + slots: self.build_slots(id, &i.slots, Some(&i.logic)), + fields: self.build_logic_fields(&i.logic), + modes: i.logic.modes.clone(), + memory: self.build_memory(&i.memory), + })), } } pub fn freeze_object(obj: &VMObject, vm: &Rc) -> Result { let obj_ref = obj.borrow(); let interfaces = ObjectInterfaces::from_object(&*obj_ref); - match interfaces { - ObjectInterfaces { - structure: Some(structure), - storage: None, - memory_readable: None, - memory_writable: None, - logicable: None, - source_code: None, - circuit_holder: None, - item: None, - integrated_circuit: None, - programmable: None, - instructable: None, - logic_stack: None, - device: None, - wireless_transmit: None, - wireless_receive: None, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => { - // completely generic structure? not sure how this got created but it technically - // valid in the data model - Ok(ObjectTemplate::Structure(StructureTemplate { - object: Some(obj.into()), - prefab: obj.into(), - structure: structure.into(), - })) - } - ObjectInterfaces { - structure: Some(structure), - storage: Some(storage), - memory_readable: None, - memory_writable: None, - logicable: None, - source_code: None, - circuit_holder: None, - item: None, - integrated_circuit: None, - programmable: None, - instructable: None, - logic_stack: None, - device: None, - wireless_transmit: None, - wireless_receive: None, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => Ok(ObjectTemplate::StructureSlots(StructureSlotsTemplate { - object: Some(obj.into()), - prefab: obj.into(), - structure: structure.into(), - slots: freeze_storage(storage, vm)?, - })), - ObjectInterfaces { - structure: Some(structure), - storage: Some(storage), - memory_readable: None, - memory_writable: None, - logicable: Some(logic), - source_code: None, - circuit_holder: _ch, - item: None, - integrated_circuit: None, - programmable: None, - instructable: None, - logic_stack: None, - device: None, - wireless_transmit: _wt, - wireless_receive: _wr, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => Ok(ObjectTemplate::StructureLogic(StructureLogicTemplate { - object: Some(obj.into()), - prefab: obj.into(), - structure: structure.into(), - slots: freeze_storage(storage, vm)?, - logic: logic.into(), - })), - ObjectInterfaces { - structure: Some(structure), - storage: Some(storage), - memory_readable: None, - memory_writable: None, - logicable: Some(logic), - source_code: None, - circuit_holder: _ch, - item: None, - integrated_circuit: None, - programmable: None, - instructable: None, - logic_stack: None, - device: Some(device), - wireless_transmit: _wt, - wireless_receive: _wr, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => Ok(ObjectTemplate::StructureLogicDevice( - StructureLogicDeviceTemplate { - object: Some(obj.into()), - prefab: obj.into(), - structure: structure.into(), - slots: freeze_storage(storage, vm)?, - logic: logic.into(), - device: device.into(), - }, - )), - ObjectInterfaces { - structure: Some(structure), - storage: Some(storage), - memory_readable: Some(mem_r), - memory_writable: _mem_w, - logicable: Some(logic), - source_code: None, - circuit_holder: _ch, - item: None, - integrated_circuit: None, - programmable: None, - instructable: _inst, - logic_stack: _logic_stack, - device: Some(device), - wireless_transmit: _wt, - wireless_receive: _wr, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => Ok(ObjectTemplate::StructureLogicDeviceMemory( - StructureLogicDeviceMemoryTemplate { - object: Some(obj.into()), - prefab: obj.into(), - structure: structure.into(), - slots: freeze_storage(storage, vm)?, - logic: logic.into(), - device: device.into(), - memory: mem_r.into(), - }, - )), + let mut obj_info: ObjectInfo = obj.into(); + obj_info.update_from_interfaces(&interfaces); + // if the template is known, omit it. else build it from interfaces + let template = vm + .get_template(Prefab::Hash(obj_ref.get_prefab().hash)) + .map_or_else( + || Some(try_template_from_interfaces(interfaces, obj)), + |_| None, + ) + .transpose()?; - // Item Objects - ObjectInterfaces { - structure: None, - storage: None, - memory_readable: None, - memory_writable: None, - logicable: None, - source_code: None, - circuit_holder: None, - item: Some(item), - integrated_circuit: None, - programmable: None, - instructable: None, - logic_stack: None, - device: None, - wireless_transmit: None, - wireless_receive: None, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => Ok(ObjectTemplate::Item(ItemTemplate { - object: Some(obj.into()), - prefab: obj.into(), - item: item.into(), - })), - ObjectInterfaces { - structure: None, - storage: Some(storage), - memory_readable: None, - memory_writable: None, - logicable: None, - source_code: None, - circuit_holder: None, - item: Some(item), - integrated_circuit: None, - programmable: None, - instructable: None, - logic_stack: None, - device: None, - wireless_transmit: None, - wireless_receive: None, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => Ok(ObjectTemplate::ItemSlots(ItemSlotsTemplate { - object: Some(obj.into()), - prefab: obj.into(), - item: item.into(), - slots: freeze_storage(storage, vm)?, - })), - ObjectInterfaces { - structure: None, - storage: Some(storage), - memory_readable: None, - memory_writable: None, - logicable: Some(logic), - source_code: None, - circuit_holder: _ch, - item: Some(item), - integrated_circuit: None, - programmable: None, - instructable: None, - logic_stack: None, - device: None, - wireless_transmit: _wt, - wireless_receive: _wr, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => Ok(ObjectTemplate::ItemLogic(ItemLogicTemplate { - object: Some(obj.into()), - prefab: obj.into(), - item: item.into(), - slots: freeze_storage(storage, vm)?, - logic: logic.into(), - })), - ObjectInterfaces { - structure: None, - storage: Some(storage), - memory_readable: Some(mem_r), - memory_writable: _mem_w, - logicable: Some(logic), - source_code: None, - circuit_holder: _ch, - item: Some(item), - integrated_circuit: None, - programmable: None, - instructable: _inst, - logic_stack: _logic_stack, - device: None, - wireless_transmit: _wt, - wireless_receive: _wr, - network: None, - plant: None, - suit: None, - chargeable: None, - reagent_interface: None, - fabricator: None, - } => Ok(ObjectTemplate::ItemLogicMemory(ItemLogicMemoryTemplate { - object: Some(obj.into()), - prefab: obj.into(), - item: item.into(), - slots: freeze_storage(storage, vm)?, - logic: logic.into(), - memory: mem_r.into(), - })), - _ => Err(TemplateError::NonConformingObject(*obj_ref.get_id())), - } + Ok(FrozenObject { obj_info, template }) } } -fn freeze_storage(storage: StorageRef<'_>, vm: &Rc) -> Result, TemplateError> { - let slots = storage - .get_slots() - .iter() - .map(|slot| { - Ok(SlotInfo { - name: slot.name.clone(), - typ: slot.typ, - occupant: slot - .occupant - .map(|occupant| { - let occupant = vm - .get_object(occupant) - .ok_or(TemplateError::MissingVMObject(occupant))?; - ObjectTemplate::freeze_object(&occupant, vm) - }) - .map_or(Ok(None), |v| v.map(Some))?, - quantity: if slot.quantity == 0 { - None - } else { - Some(slot.quantity) - }, - }) - }) - .collect::, _>>()?; - Ok(slots) +fn try_template_from_interfaces( + interfaces: ObjectInterfaces, + obj: &VMObject, +) -> Result { + match interfaces { + ObjectInterfaces { + structure: Some(structure), + storage: None, + memory_readable: None, + memory_writable: None, + logicable: None, + source_code: None, + circuit_holder: None, + item: None, + integrated_circuit: None, + programmable: None, + instructable: None, + logic_stack: None, + device: None, + wireless_transmit: None, + wireless_receive: None, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => { + // completely generic structure? not sure how this got created but it technically + // valid in the data model + Ok(ObjectTemplate::Structure(StructureTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + structure: structure.into(), + })) + } + ObjectInterfaces { + structure: Some(structure), + storage: Some(storage), + memory_readable: None, + memory_writable: None, + logicable: None, + source_code: None, + circuit_holder: None, + item: None, + integrated_circuit: None, + programmable: None, + instructable: None, + logic_stack: None, + device: None, + wireless_transmit: None, + wireless_receive: None, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => Ok(ObjectTemplate::StructureSlots(StructureSlotsTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + structure: structure.into(), + slots: storage.into(), + })), + ObjectInterfaces { + structure: Some(structure), + storage: Some(storage), + memory_readable: None, + memory_writable: None, + logicable: Some(logic), + source_code: None, + circuit_holder: _ch, + item: None, + integrated_circuit: None, + programmable: None, + instructable: None, + logic_stack: None, + device: None, + wireless_transmit: _wt, + wireless_receive: _wr, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => Ok(ObjectTemplate::StructureLogic(StructureLogicTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + structure: structure.into(), + slots: storage.into(), + logic: logic.into(), + })), + ObjectInterfaces { + structure: Some(structure), + storage: Some(storage), + memory_readable: None, + memory_writable: None, + logicable: Some(logic), + source_code: None, + circuit_holder: _ch, + item: None, + integrated_circuit: None, + programmable: None, + instructable: None, + logic_stack: None, + device: Some(device), + wireless_transmit: _wt, + wireless_receive: _wr, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => Ok(ObjectTemplate::StructureLogicDevice( + StructureLogicDeviceTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + structure: structure.into(), + slots: storage.into(), + logic: logic.into(), + device: device.into(), + }, + )), + ObjectInterfaces { + structure: Some(structure), + storage: Some(storage), + memory_readable: Some(mem_r), + memory_writable: _mem_w, + logicable: Some(logic), + source_code: None, + circuit_holder: _ch, + item: None, + integrated_circuit: None, + programmable: None, + instructable: _inst, + logic_stack: _logic_stack, + device: Some(device), + wireless_transmit: _wt, + wireless_receive: _wr, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => Ok(ObjectTemplate::StructureLogicDeviceMemory( + StructureLogicDeviceMemoryTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + structure: structure.into(), + slots: storage.into(), + logic: logic.into(), + device: device.into(), + memory: mem_r.into(), + }, + )), + + // Item Objects + ObjectInterfaces { + structure: None, + storage: None, + memory_readable: None, + memory_writable: None, + logicable: None, + source_code: None, + circuit_holder: None, + item: Some(item), + integrated_circuit: None, + programmable: None, + instructable: None, + logic_stack: None, + device: None, + wireless_transmit: None, + wireless_receive: None, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => Ok(ObjectTemplate::Item(ItemTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + item: item.into(), + })), + ObjectInterfaces { + structure: None, + storage: Some(storage), + memory_readable: None, + memory_writable: None, + logicable: None, + source_code: None, + circuit_holder: None, + item: Some(item), + integrated_circuit: None, + programmable: None, + instructable: None, + logic_stack: None, + device: None, + wireless_transmit: None, + wireless_receive: None, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => Ok(ObjectTemplate::ItemSlots(ItemSlotsTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + item: item.into(), + slots: storage.into(), + })), + ObjectInterfaces { + structure: None, + storage: Some(storage), + memory_readable: None, + memory_writable: None, + logicable: Some(logic), + source_code: None, + circuit_holder: _ch, + item: Some(item), + integrated_circuit: None, + programmable: None, + instructable: None, + logic_stack: None, + device: None, + wireless_transmit: _wt, + wireless_receive: _wr, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => Ok(ObjectTemplate::ItemLogic(ItemLogicTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + item: item.into(), + slots: storage.into(), + logic: logic.into(), + })), + ObjectInterfaces { + structure: None, + storage: Some(storage), + memory_readable: Some(mem_r), + memory_writable: _mem_w, + logicable: Some(logic), + source_code: None, + circuit_holder: _ch, + item: Some(item), + integrated_circuit: None, + programmable: None, + instructable: _inst, + logic_stack: _logic_stack, + device: None, + wireless_transmit: _wt, + wireless_receive: _wr, + network: None, + plant: None, + suit: None, + chargeable: None, + reagent_interface: None, + fabricator: None, + internal_atmosphere, + thermal, + } => Ok(ObjectTemplate::ItemLogicMemory(ItemLogicMemoryTemplate { + prefab: obj.into(), + internal_atmo_info: internal_atmosphere.map(Into::into), + thermal_info: thermal.map(Into::into), + item: item.into(), + slots: storage.into(), + logic: logic.into(), + memory: mem_r.into(), + })), + _ => Err(TemplateError::NonConformingObject(obj.get_id())), + } } impl From<&VMObject> for PrefabInfo { @@ -1214,58 +1057,45 @@ impl From> for LogicInfo { .map(|(index, slot)| { ( index as u32, - LogicSlotTypes { - slot_types: LogicSlotType::iter() - .filter_map(|slt| { - let readable = slot.readable_logic.contains(&slt); - let writeable = slot.writeable_logic.contains(&slt); - if readable && writeable { - Some((slt, MemoryAccess::ReadWrite)) - } else if readable { - Some((slt, MemoryAccess::Read)) - } else if writeable { - Some((slt, MemoryAccess::Write)) - } else { - None - } - }) - .collect(), - }, + LogicSlotType::iter() + .filter_map(|slt| { + let readable = slot.readable_logic.contains(&slt); + let writeable = slot.writeable_logic.contains(&slt); + if readable && writeable { + Some((slt, MemoryAccess::ReadWrite)) + } else if readable { + Some((slt, MemoryAccess::Read)) + } else if writeable { + Some((slt, MemoryAccess::Write)) + } else { + None + } + }) + .collect(), ) }) .collect(), - logic_types: LogicTypes { - types: logic - .valid_logic_types() - .iter() - .filter_map(|lt| { - let readable = logic.can_logic_read(*lt); - let writeable = logic.can_logic_write(*lt); - if readable && writeable { - Some((*lt, MemoryAccess::ReadWrite)) - } else if readable { - Some((*lt, MemoryAccess::Read)) - } else if writeable { - Some((*lt, MemoryAccess::Write)) - } else { - None - } - }) - .collect(), - }, + logic_types: logic + .valid_logic_types() + .iter() + .filter_map(|lt| { + let readable = logic.can_logic_read(*lt); + let writeable = logic.can_logic_write(*lt); + if readable && writeable { + Some((*lt, MemoryAccess::ReadWrite)) + } else if readable { + Some((*lt, MemoryAccess::Read)) + } else if writeable { + Some((*lt, MemoryAccess::Write)) + } else { + None + } + }) + .collect(), + modes: logic .known_modes() .map(|modes| modes.iter().cloned().collect()), - logic_values: Some( - logic - .valid_logic_types() - .iter() - .filter_map(|lt| match logic.get_logic(*lt) { - Ok(val) => Some((*lt, val)), - _ => None, - }) - .collect(), - ), transmission_receiver: wr.is_some(), wireless_logic: wt.is_some(), circuit_holder: circuit_holder.is_some(), @@ -1283,11 +1113,6 @@ impl From> for ItemInfo { reagents: item.reagents().cloned(), slot_class: item.slot_class(), sorting_class: item.sorting_class(), - damage: if item.get_damage() == 0.0 { - None - } else { - Some(item.get_damage()) - }, } } } @@ -1301,8 +1126,7 @@ impl From> for DeviceInfo { .iter() .map(|conn| conn.to_info()) .collect(), - device_pins_length: device.device_pins().map(|pins| pins.len()), - device_pins: device.device_pins().map(|pins| pins.to_vec()), + device_pins_length: device.device_pins().map(|pins| pins.len() as u32), has_reagents: device.has_reagents(), has_lock_state: device.has_lock_state(), has_mode_state: device.has_mode_state(), @@ -1311,11 +1135,6 @@ impl From> for DeviceInfo { has_color_state: device.has_color_state(), has_atmosphere: device.has_atmosphere(), has_activate_state: device.has_activate_state(), - reagents: if reagents.is_empty() { - None - } else { - Some(reagents) - }, } } } @@ -1327,6 +1146,7 @@ impl From> for StructureInfo { } } } + impl From> for MemoryInfo { fn from(mem_r: MemoryReadableRef<'_>) -> Self { let mem_w = mem_r.as_memory_writable(); @@ -1337,12 +1157,41 @@ impl From> for MemoryInfo { } else { MemoryAccess::Read }, - memory_size: mem_r.memory_size(), - values: Some(mem_r.get_memory_slice().to_vec()), + memory_size: mem_r.memory_size() as u32, } } } +impl From> for InternalAtmoInfo { + fn from(internal_atmo: InternalAtmosphereRef<'_>) -> Self { + InternalAtmoInfo { + volume: internal_atmo.get_volume() as f32, + } + } +} + +impl From> for ThermalInfo { + fn from(thermal: ThermalRef<'_>) -> Self { + ThermalInfo { + convection_factor: thermal.get_convection_factor(), + radiation_factor: thermal.get_radiation_factor(), + } + } +} + +impl From> for Vec { + fn from(storage: StorageRef<'_>) -> Self { + storage + .get_slots() + .iter() + .map(|slot| SlotInfo { + name: slot.name.clone(), + typ: slot.typ, + }) + .collect() + } +} + #[cfg(test)] mod tests { diff --git a/ic10emu/src/vm/object/traits.rs b/ic10emu/src/vm/object/traits.rs index 5653e05..3ac453a 100644 --- a/ic10emu/src/vm/object/traits.rs +++ b/ic10emu/src/vm/object/traits.rs @@ -14,8 +14,8 @@ use crate::{ }, }; use stationeers_data::enums::{ - basic_enums::{Class as SlotClass, GasType, SortingClass}, - script_enums::{LogicSlotType, LogicType}, + basic::{Class as SlotClass, GasType, SortingClass}, + script::{LogicSlotType, LogicType}, }; use std::{collections::BTreeMap, fmt::Debug}; @@ -126,8 +126,18 @@ tag_object_traits! { } pub trait Suit { - fn pressure_waste(&self) -> f64; - fn pressure_air(&self) -> f64; + fn pressure_waste(&self) -> f32; + fn pressure_waste_max(&self) -> f32; + fn pressure_air(&self) -> f32; + } + + pub trait InternalAtmosphere { + fn get_volume(&self) -> f64; + } + + pub trait Thermal { + fn get_convection_factor(&self) -> f32; + fn get_radiation_factor(&self) -> f32; } pub trait IntegratedCircuit: Logicable + MemoryWritable + SourceCode + Item { diff --git a/stationeers_data/src/database/prefab_map.rs b/stationeers_data/src/database/prefab_map.rs index 329e44c..2331904 100644 --- a/stationeers_data/src/database/prefab_map.rs +++ b/stationeers_data/src/database/prefab_map.rs @@ -20530,6 +20530,89 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: Some(FabricatorInfo { + tier: MachineTier::Undefined, + recipes: vec![ + ("ItemCannedCondensedMilk".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 0f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Milk".into(), 200f64), ("Steel".into(), 1f64)] + .into_iter().collect() }), ("ItemCannedEdamame".into(), Recipe { + tier : MachineTier::TierOne, time : 5f64, energy : 0f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Oil".into(), 1f64), ("Soy".into(), 15f64), ("Steel" + .into(), 1f64)] .into_iter().collect() }), ("ItemCannedMushroom" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 0f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Mushroom".into(), 8f64), ("Oil".into(), + 1f64), ("Steel".into(), 1f64)] .into_iter().collect() }), + ("ItemCannedPowderedEggs".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 0f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Egg".into(), 5f64), ("Oil".into(), 1f64), ("Steel".into(), + 1f64)] .into_iter().collect() }), ("ItemCannedRicePudding" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 0f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Oil".into(), 1f64), ("Rice".into(), + 5f64), ("Steel".into(), 1f64)] .into_iter().collect() }), + ("ItemCornSoup".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 0f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Corn".into(), + 5f64), ("Oil".into(), 1f64), ("Steel".into(), 1f64)] .into_iter() + .collect() }), ("ItemFrenchFries".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 0f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Oil".into(), 1f64), ("Potato".into(), 1f64), ("Steel" + .into(), 1f64)] .into_iter().collect() }), ("ItemPumpkinSoup" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 0f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Oil".into(), 1f64), ("Pumpkin".into(), + 5f64), ("Steel".into(), 1f64)] .into_iter().collect() }), + ("ItemTomatoSoup".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 0f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Oil".into(), + 1f64), ("Steel".into(), 1f64), ("Tomato".into(), 5f64)] + .into_iter().collect() }) + ] + .into_iter() + .collect(), + }), memory: MemoryInfo { instructions: Some( vec![ @@ -21314,6 +21397,514 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: Some(FabricatorInfo { + tier: MachineTier::Undefined, + recipes: vec![ + ("CardboardBox".into(), Recipe { tier : MachineTier::TierOne, + time : 2f64, energy : 120f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Silicon" + .into(), 2f64)] .into_iter().collect() }), ("ItemCableCoil" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 200f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Copper".into(), 0.5f64)] .into_iter() + .collect() }), ("ItemCoffeeMug".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 70f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemEggCarton".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 100f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Silicon" + .into(), 2f64)] .into_iter().collect() }), ("ItemEmptyCan" + .into(), Recipe { tier : MachineTier::TierOne, time : 1f64, + energy : 70f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Steel".into(), 1f64)] .into_iter() + .collect() }), ("ItemEvaSuit".into(), Recipe { tier : + MachineTier::TierOne, time : 15f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 5f64)] .into_iter() + .collect() }), ("ItemGlassSheets".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 2f64)] .into_iter().collect() }), + ("ItemIronFrames".into(), Recipe { tier : MachineTier::TierOne, + time : 4f64, energy : 200f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 4f64)] .into_iter().collect() }), ("ItemIronSheets".into(), + Recipe { tier : MachineTier::TierOne, time : 1f64, energy : + 200f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 1f64)] .into_iter() + .collect() }), ("ItemKitAccessBridge".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 15000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Solder".into(), 2f64), ("Steel" + .into(), 10f64)] .into_iter().collect() }), ("ItemKitArcFurnace" + .into(), Recipe { tier : MachineTier::TierOne, time : 60f64, + energy : 6000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 5f64), ("Iron".into(), + 20f64)] .into_iter().collect() }), ("ItemKitAutolathe".into(), + Recipe { tier : MachineTier::TierOne, time : 180f64, energy : + 36000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 10f64), ("Gold".into(), + 2f64), ("Iron".into(), 20f64)] .into_iter().collect() }), + ("ItemKitBeds".into(), Recipe { tier : MachineTier::TierOne, time + : 10f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 5f64), ("Iron".into(), 20f64)] .into_iter().collect() + }), ("ItemKitBlastDoor".into(), Recipe { tier : + MachineTier::TierTwo, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 3f64), ("Steel".into(), 15f64)] + .into_iter().collect() }), ("ItemKitCentrifuge".into(), Recipe { + tier : MachineTier::TierOne, time : 60f64, energy : 18000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 20f64)] + .into_iter().collect() }), ("ItemKitChairs".into(), Recipe { tier + : MachineTier::TierOne, time : 10f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 20f64)] + .into_iter().collect() }), ("ItemKitChute".into(), Recipe { tier + : MachineTier::TierOne, time : 5f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemKitCompositeCladding".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 200f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemKitCompositeFloorGrating".into(), Recipe { tier : + MachineTier::TierOne, time : 3f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemKitCrate".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 200f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 10f64)] .into_iter().collect() }), ("ItemKitCrateMkII".into(), + Recipe { tier : MachineTier::TierTwo, time : 10f64, energy : + 200f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Gold".into(), 5f64), ("Iron".into(), + 10f64)] .into_iter().collect() }), ("ItemKitCrateMount".into(), + Recipe { tier : MachineTier::TierOne, time : 10f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 10f64)] .into_iter() + .collect() }), ("ItemKitDeepMiner".into(), Recipe { tier : + MachineTier::TierTwo, time : 180f64, energy : 72000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Constantan".into(), 5f64), ("Electrum".into(), 5f64), + ("Invar".into(), 10f64), ("Steel".into(), 50f64)] .into_iter() + .collect() }), ("ItemKitDoor".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 3f64), ("Iron".into(), 7f64)] .into_iter() + .collect() }), ("ItemKitElectronicsPrinter".into(), Recipe { tier + : MachineTier::TierOne, time : 120f64, energy : 12000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 2f64), ("Iron" + .into(), 20f64)] .into_iter().collect() }), ("ItemKitFlagODA" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 8f64)] .into_iter() + .collect() }), ("ItemKitFurnace".into(), Recipe { tier : + MachineTier::TierOne, time : 120f64, energy : 12000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 10f64), ("Iron".into(), 30f64)] + .into_iter().collect() }), ("ItemKitFurniture".into(), Recipe { + tier : MachineTier::TierOne, time : 10f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 20f64)] + .into_iter().collect() }), ("ItemKitHydraulicPipeBender".into(), + Recipe { tier : MachineTier::TierOne, time : 180f64, energy : + 18000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 10f64), ("Gold".into(), + 2f64), ("Iron".into(), 20f64)] .into_iter().collect() }), + ("ItemKitInteriorDoors".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 3f64), ("Iron".into(), 5f64)] .into_iter() + .collect() }), ("ItemKitLadder".into(), Recipe { tier : + MachineTier::TierOne, time : 3f64, energy : 200f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 2f64)] .into_iter().collect() }), + ("ItemKitLocker".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 5f64)] .into_iter().collect() }), ("ItemKitPipe".into(), Recipe { + tier : MachineTier::TierOne, time : 5f64, energy : 200f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 0.5f64)] .into_iter().collect() }), + ("ItemKitRailing".into(), Recipe { tier : MachineTier::TierOne, + time : 1f64, energy : 100f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 1f64)] .into_iter().collect() }), ("ItemKitRecycler".into(), + Recipe { tier : MachineTier::TierOne, time : 60f64, energy : + 12000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 10f64), ("Iron".into(), + 20f64)] .into_iter().collect() }), ("ItemKitReinforcedWindows" + .into(), Recipe { tier : MachineTier::TierOne, time : 7f64, + energy : 700f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Steel".into(), 2f64)] .into_iter() + .collect() }), ("ItemKitRespawnPointWallMounted".into(), Recipe { + tier : MachineTier::TierOne, time : 20f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 1f64), ("Iron".into(), 3f64)] .into_iter() + .collect() }), ("ItemKitRocketManufactory".into(), Recipe { tier + : MachineTier::TierOne, time : 120f64, energy : 12000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 2f64), ("Iron" + .into(), 20f64)] .into_iter().collect() }), ("ItemKitSDBHopper" + .into(), Recipe { tier : MachineTier::TierOne, time : 10f64, + energy : 700f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 15f64)] .into_iter() + .collect() }), ("ItemKitSecurityPrinter".into(), Recipe { tier : + MachineTier::TierOne, time : 180f64, energy : 36000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 20f64), ("Gold".into(), 20f64), ("Steel" + .into(), 20f64)] .into_iter().collect() }), ("ItemKitSign" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 3f64)] .into_iter() + .collect() }), ("ItemKitSorter".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 1f64), ("Iron" + .into(), 10f64)] .into_iter().collect() }), ("ItemKitStacker" + .into(), Recipe { tier : MachineTier::TierOne, time : 10f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 2f64), ("Iron".into(), + 10f64)] .into_iter().collect() }), ("ItemKitStairs".into(), + Recipe { tier : MachineTier::TierOne, time : 20f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 15f64)] .into_iter() + .collect() }), ("ItemKitStairwell".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 6000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 15f64)] .into_iter().collect() }), + ("ItemKitStandardChute".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 2f64), ("Electrum".into(), 2f64), + ("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemKitTables".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 5f64), ("Iron".into(), 20f64)] .into_iter().collect() + }), ("ItemKitToolManufactory".into(), Recipe { tier : + MachineTier::TierOne, time : 120f64, energy : 24000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 10f64), ("Iron".into(), 20f64)] + .into_iter().collect() }), ("ItemKitWall".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Steel".into(), 1f64)] .into_iter().collect() }), + ("ItemKitWallArch".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Steel" + .into(), 1f64)] .into_iter().collect() }), ("ItemKitWallFlat" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Steel".into(), 1f64)] .into_iter() + .collect() }), ("ItemKitWallGeometry".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Steel".into(), 1f64)] .into_iter().collect() }), + ("ItemKitWallIron".into(), Recipe { tier : MachineTier::TierOne, + time : 1f64, energy : 200f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 1f64)] .into_iter().collect() }), ("ItemKitWallPadded".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Steel".into(), 1f64)] .into_iter() + .collect() }), ("ItemKitWindowShutter".into(), Recipe { tier : + MachineTier::TierOne, time : 7f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Iron".into(), 1f64), ("Steel".into(), 2f64)] .into_iter() + .collect() }), ("ItemPlasticSheets".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 200f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 0.5f64)] .into_iter().collect() }), + ("ItemSpaceHelmet".into(), Recipe { tier : MachineTier::TierOne, + time : 15f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 2f64), ("Gold".into(), 2f64)] .into_iter().collect() }), + ("ItemSteelFrames".into(), Recipe { tier : MachineTier::TierOne, + time : 7f64, energy : 800f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Steel" + .into(), 2f64)] .into_iter().collect() }), ("ItemSteelSheets" + .into(), Recipe { tier : MachineTier::TierOne, time : 3f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Steel".into(), 0.5f64)] .into_iter() + .collect() }), ("ItemStelliteGlassSheets".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Silicon".into(), 2f64), ("Stellite".into(), 1f64)] + .into_iter().collect() }), ("ItemWallLight".into(), Recipe { tier + : MachineTier::TierOne, time : 10f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Iron".into(), 1f64), ("Silicon" + .into(), 1f64)] .into_iter().collect() }), ("KitSDBSilo".into(), + Recipe { tier : MachineTier::TierOne, time : 120f64, energy : + 24000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 10f64), ("Gold".into(), + 20f64), ("Steel".into(), 15f64)] .into_iter().collect() }), + ("KitStructureCombustionCentrifuge".into(), Recipe { tier : + MachineTier::TierTwo, time : 120f64, energy : 24000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 5f64), ("Invar".into(), 10f64), + ("Steel".into(), 20f64)] .into_iter().collect() }) + ] + .into_iter() + .collect(), + }), memory: MemoryInfo { instructions: Some( vec![ @@ -21436,6 +22027,157 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: Some(FabricatorInfo { + tier: MachineTier::TierOne, + recipes: vec![ + ("ItemBreadLoaf".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 0f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Flour" + .into(), 200f64), ("Oil".into(), 5f64)] .into_iter().collect() + }), ("ItemCerealBar".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 0f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Flour".into(), 50f64)] .into_iter().collect() }), + ("ItemChocolateBar".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 0f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Cocoa" + .into(), 2f64), ("Sugar".into(), 10f64)] .into_iter().collect() + }), ("ItemChocolateCake".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 0f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 5i64, reagents : + vec![("Cocoa".into(), 2f64), ("Egg".into(), 1f64), ("Flour" + .into(), 50f64), ("Milk".into(), 5f64), ("Sugar".into(), 50f64)] + .into_iter().collect() }), ("ItemChocolateCerealBar".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : 0f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Cocoa".into(), 1f64), ("Flour".into(), 50f64)] + .into_iter().collect() }), ("ItemCookedCondensedMilk".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : 0f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Milk".into(), 100f64)] .into_iter().collect() }), + ("ItemCookedCorn".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 0f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Corn".into(), + 1f64)] .into_iter().collect() }), ("ItemCookedMushroom".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : 0f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Mushroom".into(), 1f64)] .into_iter().collect() }), + ("ItemCookedPowderedEggs".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 0f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Egg".into(), 4f64)] .into_iter().collect() }), + ("ItemCookedPumpkin".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 0f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Pumpkin".into(), 1f64)] .into_iter().collect() }), + ("ItemCookedRice".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 0f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Rice".into(), + 3f64)] .into_iter().collect() }), ("ItemCookedSoybean".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : 0f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Soy".into(), 5f64)] .into_iter().collect() }), + ("ItemCookedTomato".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 0f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Tomato" + .into(), 1f64)] .into_iter().collect() }), ("ItemFries".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : 0f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Oil".into(), 5f64), ("Potato".into(), 1f64)] .into_iter() + .collect() }), ("ItemMuffin".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 0f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Egg".into(), 1f64), ("Flour".into(), 50f64), ("Milk" + .into(), 10f64)] .into_iter().collect() }), ("ItemPlainCake" + .into(), Recipe { tier : MachineTier::TierOne, time : 30f64, + energy : 0f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Egg".into(), 1f64), ("Flour".into(), + 50f64), ("Milk".into(), 5f64), ("Sugar".into(), 50f64)] + .into_iter().collect() }), ("ItemPotatoBaked".into(), Recipe { + tier : MachineTier::TierOne, time : 5f64, energy : 0f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Potato".into(), 1f64)] .into_iter().collect() }), + ("ItemPumpkinPie".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 0f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 4i64, reagents : vec![("Egg".into(), + 1f64), ("Flour".into(), 100f64), ("Milk".into(), 10f64), + ("Pumpkin".into(), 10f64)] .into_iter().collect() }) + ] + .into_iter() + .collect(), + }), memory: MemoryInfo { instructions: Some( vec![ @@ -28197,6 +28939,1139 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: Some(FabricatorInfo { + tier: MachineTier::Undefined, + recipes: vec![ + ("ApplianceChemistryStation".into(), Recipe { tier : + MachineTier::TierOne, time : 45f64, energy : 1500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 1f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("ApplianceDeskLampLeft".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Iron".into(), 2f64), ("Silicon".into(), 1f64)] + .into_iter().collect() }), ("ApplianceDeskLampRight".into(), + Recipe { tier : MachineTier::TierOne, time : 10f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Iron".into(), 2f64), ("Silicon".into(), + 1f64)] .into_iter().collect() }), ("ApplianceMicrowave".into(), + Recipe { tier : MachineTier::TierOne, time : 45f64, energy : + 1500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 2f64), ("Gold".into(), + 1f64), ("Iron".into(), 5f64)] .into_iter().collect() }), + ("AppliancePackagingMachine".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 1f64), ("Iron" + .into(), 10f64)] .into_iter().collect() }), + ("AppliancePaintMixer".into(), Recipe { tier : + MachineTier::TierOne, time : 45f64, energy : 1500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 1f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("AppliancePlantGeneticAnalyzer".into(), Recipe { tier : + MachineTier::TierOne, time : 45f64, energy : 4500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 1f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("AppliancePlantGeneticSplicer".into(), Recipe { tier : + MachineTier::TierOne, time : 50f64, energy : 5000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Inconel".into(), 10f64), ("Stellite".into(), 20f64)] + .into_iter().collect() }), ("AppliancePlantGeneticStabilizer" + .into(), Recipe { tier : MachineTier::TierOne, time : 50f64, + energy : 5000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Inconel".into(), 10f64), ("Stellite" + .into(), 20f64)] .into_iter().collect() }), + ("ApplianceReagentProcessor".into(), Recipe { tier : + MachineTier::TierOne, time : 45f64, energy : 1500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 1f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ApplianceTabletDock" + .into(), Recipe { tier : MachineTier::TierOne, time : 30f64, + energy : 750f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Copper".into(), 2f64), ("Gold".into(), + 1f64), ("Iron".into(), 5f64), ("Silicon".into(), 1f64)] + .into_iter().collect() }), ("AutolathePrinterMod".into(), Recipe + { tier : MachineTier::TierTwo, time : 180f64, energy : 72000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Constantan".into(), 8f64), ("Electrum".into(), 8f64), + ("Solder".into(), 8f64), ("Steel".into(), 35f64)] .into_iter() + .collect() }), ("Battery_Wireless_cell".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 10000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 2f64), ("Iron" + .into(), 2f64)] .into_iter().collect() }), + ("Battery_Wireless_cell_Big".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 20000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 15f64), ("Gold".into(), 5f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("CartridgeAtmosAnalyser".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), + ("CartridgeConfiguration".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), + ("CartridgeElectronicReader".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), ("CartridgeGPS" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Gold".into(), + 5f64), ("Iron".into(), 1f64)] .into_iter().collect() }), + ("CartridgeMedicalAnalyser".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), + ("CartridgeNetworkAnalyser".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), ("CartridgeOreScanner" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Gold".into(), + 5f64), ("Iron".into(), 1f64)] .into_iter().collect() }), + ("CartridgeOreScannerColor".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Constantan".into(), 5f64), ("Electrum".into(), 5f64), + ("Invar".into(), 5f64), ("Silicon".into(), 5f64)] .into_iter() + .collect() }), ("CartridgePlantAnalyser".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), ("CartridgeTracker" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Gold".into(), + 5f64), ("Iron".into(), 1f64)] .into_iter().collect() }), + ("CircuitboardAdvAirlockControl".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), + ("CircuitboardAirControl".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("CircuitboardAirlockControl".into(), Recipe { + tier : MachineTier::TierOne, time : 5f64, energy : 100f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), + ("CircuitboardDoorControl".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("CircuitboardGasDisplay".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), + ("CircuitboardGraphDisplay".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("CircuitboardHashDisplay".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("CircuitboardModeControl".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("CircuitboardPowerControl".into(), Recipe { tier + : MachineTier::TierOne, time : 5f64, energy : 100f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("CircuitboardShipDisplay".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("CircuitboardSolarControl".into(), Recipe { tier + : MachineTier::TierOne, time : 5f64, energy : 100f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("DynamicLight".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Iron".into(), 5f64)] .into_iter() + .collect() }), ("ElectronicPrinterMod".into(), Recipe { tier : + MachineTier::TierOne, time : 180f64, energy : 72000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Constantan".into(), 8f64), ("Electrum".into(), 8f64), + ("Solder".into(), 8f64), ("Steel".into(), 35f64)] .into_iter() + .collect() }), ("ItemAdvancedTablet".into(), Recipe { tier : + MachineTier::TierTwo, time : 60f64, energy : 12000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 6i64, reagents : + vec![("Copper".into(), 5.5f64), ("Electrum".into(), 1f64), + ("Gold".into(), 12f64), ("Iron".into(), 3f64), ("Solder".into(), + 5f64), ("Steel".into(), 2f64)] .into_iter().collect() }), + ("ItemAreaPowerControl".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 5000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Iron".into(), 5f64), ("Solder" + .into(), 3f64)] .into_iter().collect() }), ("ItemBatteryCell" + .into(), Recipe { tier : MachineTier::TierOne, time : 10f64, + energy : 1000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Gold".into(), + 2f64), ("Iron".into(), 2f64)] .into_iter().collect() }), + ("ItemBatteryCellLarge".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 20000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 5f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("ItemBatteryCellNuclear".into(), Recipe { tier : + MachineTier::TierTwo, time : 180f64, energy : 360000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Astroloy".into(), 10f64), ("Inconel".into(), 5f64), + ("Steel".into(), 5f64)] .into_iter().collect() }), + ("ItemBatteryCharger".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 10f64)] .into_iter().collect() }), + ("ItemBatteryChargerSmall".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 250f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ItemCableAnalyser" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 2f64), ("Iron".into(), + 1f64), ("Silicon".into(), 2f64)] .into_iter().collect() }), + ("ItemCableCoil".into(), Recipe { tier : MachineTier::TierOne, + time : 1f64, energy : 100f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Copper" + .into(), 0.5f64)] .into_iter().collect() }), + ("ItemCableCoilHeavy".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 0.5f64), ("Gold".into(), 0.5f64)] + .into_iter().collect() }), ("ItemCableFuse".into(), Recipe { tier + : MachineTier::TierOne, time : 5f64, energy : 100f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 5f64)] .into_iter() + .collect() }), ("ItemCreditCard".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 200f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Silicon".into(), 5f64)] + .into_iter().collect() }), ("ItemDataDisk".into(), Recipe { tier + : MachineTier::TierOne, time : 5f64, energy : 100f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("ItemElectronicParts".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 10f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Gold".into(), 2f64), ("Iron" + .into(), 3f64)] .into_iter().collect() }), ("ItemFlashingLight" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 3f64), ("Iron".into(), + 2f64)] .into_iter().collect() }), ("ItemHEMDroidRepairKit" + .into(), Recipe { tier : MachineTier::TierTwo, time : 40f64, + energy : 1500f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Electrum".into(), 10f64), ("Inconel" + .into(), 5f64), ("Solder".into(), 5f64)] .into_iter().collect() + }), ("ItemIntegratedCircuit10".into(), Recipe { tier : + MachineTier::TierOne, time : 40f64, energy : 4000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Electrum".into(), 5f64), ("Gold".into(), 10f64), ("Solder" + .into(), 2f64), ("Steel".into(), 4f64)] .into_iter().collect() + }), ("ItemKitAIMeE".into(), Recipe { tier : MachineTier::TierTwo, + time : 25f64, energy : 2200f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 7i64, reagents : vec![("Astroloy" + .into(), 10f64), ("Constantan".into(), 8f64), ("Copper".into(), + 5f64), ("Electrum".into(), 15f64), ("Gold".into(), 5f64), + ("Invar".into(), 7f64), ("Steel".into(), 22f64)] .into_iter() + .collect() }), ("ItemKitAdvancedComposter".into(), Recipe { tier + : MachineTier::TierTwo, time : 55f64, energy : 20000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 15f64), ("Electrum".into(), 20f64), + ("Solder".into(), 5f64), ("Steel".into(), 30f64)] .into_iter() + .collect() }), ("ItemKitAdvancedFurnace".into(), Recipe { tier : + MachineTier::TierTwo, time : 180f64, energy : 36000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 6i64, reagents : + vec![("Copper".into(), 25f64), ("Electrum".into(), 15f64), + ("Gold".into(), 5f64), ("Silicon".into(), 6f64), ("Solder" + .into(), 8f64), ("Steel".into(), 30f64)] .into_iter().collect() + }), ("ItemKitAdvancedPackagingMachine".into(), Recipe { tier : + MachineTier::TierTwo, time : 60f64, energy : 18000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Constantan".into(), 10f64), ("Copper".into(), 10f64), + ("Electrum".into(), 15f64), ("Steel".into(), 20f64)] .into_iter() + .collect() }), ("ItemKitAutoMinerSmall".into(), Recipe { tier : + MachineTier::TierTwo, time : 90f64, energy : 9000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 5i64, reagents : + vec![("Copper".into(), 15f64), ("Electrum".into(), 50f64), + ("Invar".into(), 25f64), ("Iron".into(), 15f64), ("Steel".into(), + 100f64)] .into_iter().collect() }), ("ItemKitAutomatedOven" + .into(), Recipe { tier : MachineTier::TierTwo, time : 50f64, + energy : 15000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 5i64, reagents : vec![("Constantan".into(), 5f64), ("Copper" + .into(), 15f64), ("Gold".into(), 10f64), ("Solder".into(), + 10f64), ("Steel".into(), 25f64)] .into_iter().collect() }), + ("ItemKitBattery".into(), Recipe { tier : MachineTier::TierOne, + time : 120f64, energy : 12000f64, temperature : RecipeRange { + start : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 20f64), ("Gold".into(), 20f64), ("Steel".into(), 20f64)] + .into_iter().collect() }), ("ItemKitBatteryLarge".into(), Recipe + { tier : MachineTier::TierTwo, time : 240f64, energy : 96000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 6i64, reagents : + vec![("Copper".into(), 35f64), ("Electrum".into(), 10f64), + ("Gold".into(), 35f64), ("Silicon".into(), 5f64), ("Steel" + .into(), 35f64), ("Stellite".into(), 2f64)] .into_iter() + .collect() }), ("ItemKitBeacon".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 4f64), ("Solder" + .into(), 2f64), ("Steel".into(), 5f64)] .into_iter().collect() + }), ("ItemKitComputer".into(), Recipe { tier : + MachineTier::TierOne, time : 60f64, energy : 6000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 5f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ItemKitConsole" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Gold".into(), + 3f64), ("Iron".into(), 2f64)] .into_iter().collect() }), + ("ItemKitDynamicGenerator".into(), Recipe { tier : + MachineTier::TierOne, time : 120f64, energy : 5000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Gold".into(), 15f64), ("Nickel".into(), 15f64), ("Solder" + .into(), 5f64), ("Steel".into(), 20f64)] .into_iter().collect() + }), ("ItemKitElevator".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 4f64), ("Solder" + .into(), 2f64), ("Steel".into(), 2f64)] .into_iter().collect() + }), ("ItemKitFridgeBig".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 100f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 5f64), ("Iron" + .into(), 20f64), ("Steel".into(), 15f64)] .into_iter().collect() + }), ("ItemKitFridgeSmall".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 100f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 2f64), ("Iron" + .into(), 10f64)] .into_iter().collect() }), + ("ItemKitGasGenerator".into(), Recipe { tier : + MachineTier::TierOne, time : 120f64, energy : 1000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 10f64), ("Iron".into(), 50f64)] + .into_iter().collect() }), ("ItemKitGroundTelescope".into(), + Recipe { tier : MachineTier::TierOne, time : 150f64, energy : + 24000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Electrum".into(), 15f64), ("Solder" + .into(), 10f64), ("Steel".into(), 25f64)] .into_iter().collect() + }), ("ItemKitGrowLight".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Electrum".into(), 10f64), + ("Steel".into(), 5f64)] .into_iter().collect() }), + ("ItemKitHarvie".into(), Recipe { tier : MachineTier::TierOne, + time : 60f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 5i64, reagents : vec![("Copper" + .into(), 15f64), ("Electrum".into(), 10f64), ("Silicon".into(), + 5f64), ("Solder".into(), 5f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("ItemKitHorizontalAutoMiner".into(), + Recipe { tier : MachineTier::TierTwo, time : 60f64, energy : + 60000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 5i64, reagents : vec![("Copper".into(), 7f64), ("Electrum" + .into(), 25f64), ("Invar".into(), 15f64), ("Iron".into(), 8f64), + ("Steel".into(), 60f64)] .into_iter().collect() }), + ("ItemKitHydroponicStation".into(), Recipe { tier : + MachineTier::TierOne, time : 120f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 20f64), ("Gold".into(), 5f64), ("Nickel" + .into(), 5f64), ("Steel".into(), 10f64)] .into_iter().collect() + }), ("ItemKitLandingPadAtmos".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 1f64), ("Steel".into(), 5f64)] + .into_iter().collect() }), ("ItemKitLandingPadBasic".into(), + Recipe { tier : MachineTier::TierOne, time : 10f64, energy : + 1000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 1f64), ("Steel".into(), + 5f64)] .into_iter().collect() }), ("ItemKitLandingPadWaypoint" + .into(), Recipe { tier : MachineTier::TierOne, time : 10f64, + energy : 1000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 1f64), ("Steel".into(), + 5f64)] .into_iter().collect() }), ("ItemKitLargeSatelliteDish" + .into(), Recipe { tier : MachineTier::TierOne, time : 240f64, + energy : 72000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Astroloy".into(), 100f64), ("Inconel" + .into(), 50f64), ("Waspaloy".into(), 20f64)] .into_iter() + .collect() }), ("ItemKitLogicCircuit".into(), Recipe { tier : + MachineTier::TierOne, time : 40f64, energy : 2000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Solder".into(), 2f64), ("Steel" + .into(), 4f64)] .into_iter().collect() }), + ("ItemKitLogicInputOutput".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64)] .into_iter() + .collect() }), ("ItemKitLogicMemory".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64)] .into_iter() + .collect() }), ("ItemKitLogicProcessor".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64)] .into_iter() + .collect() }), ("ItemKitLogicSwitch".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64)] .into_iter() + .collect() }), ("ItemKitLogicTransmitter".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 1f64), ("Electrum".into(), 3f64), ("Gold" + .into(), 2f64), ("Silicon".into(), 5f64)] .into_iter().collect() + }), ("ItemKitMusicMachines".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64)] .into_iter() + .collect() }), ("ItemKitPowerTransmitter".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 7f64), ("Gold".into(), 5f64), ("Steel" + .into(), 3f64)] .into_iter().collect() }), + ("ItemKitPowerTransmitterOmni".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 8f64), ("Gold".into(), 4f64), ("Steel" + .into(), 4f64)] .into_iter().collect() }), + ("ItemKitPressurePlate".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64)] .into_iter() + .collect() }), ("ItemKitResearchMachine".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 10f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Gold".into(), 2f64), ("Iron" + .into(), 9f64)] .into_iter().collect() }), + ("ItemKitSatelliteDish".into(), Recipe { tier : + MachineTier::TierOne, time : 120f64, energy : 24000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Electrum".into(), 15f64), ("Solder".into(), 10f64), + ("Steel".into(), 20f64)] .into_iter().collect() }), + ("ItemKitSensor".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 10f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 1f64), ("Gold".into(), 1f64), ("Iron".into(), 3f64)] + .into_iter().collect() }), ("ItemKitSmallSatelliteDish".into(), + Recipe { tier : MachineTier::TierOne, time : 60f64, energy : + 6000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 10f64), ("Gold".into(), + 5f64)] .into_iter().collect() }), ("ItemKitSolarPanel".into(), + Recipe { tier : MachineTier::TierOne, time : 60f64, energy : + 6000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 20f64), ("Gold".into(), + 5f64), ("Steel".into(), 15f64)] .into_iter().collect() }), + ("ItemKitSolarPanelBasic".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 2f64), ("Iron" + .into(), 10f64)] .into_iter().collect() }), + ("ItemKitSolarPanelBasicReinforced".into(), Recipe { tier : + MachineTier::TierTwo, time : 120f64, energy : 24000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 10f64), ("Electrum".into(), 2f64), + ("Invar".into(), 10f64), ("Steel".into(), 10f64)] .into_iter() + .collect() }), ("ItemKitSolarPanelReinforced".into(), Recipe { + tier : MachineTier::TierTwo, time : 120f64, energy : 24000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Astroloy".into(), 15f64), ("Copper".into(), 20f64), + ("Electrum".into(), 5f64), ("Steel".into(), 10f64)] .into_iter() + .collect() }), ("ItemKitSolidGenerator".into(), Recipe { tier : + MachineTier::TierOne, time : 120f64, energy : 1000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 10f64), ("Iron".into(), 50f64)] + .into_iter().collect() }), ("ItemKitSpeaker".into(), Recipe { + tier : MachineTier::TierOne, time : 10f64, energy : 1000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("ItemKitStirlingEngine".into(), Recipe { tier : + MachineTier::TierOne, time : 60f64, energy : 6000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 20f64), ("Gold".into(), 5f64), ("Steel" + .into(), 30f64)] .into_iter().collect() }), ("ItemKitTransformer" + .into(), Recipe { tier : MachineTier::TierOne, time : 60f64, + energy : 12000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Electrum".into(), 5f64), ("Steel".into(), + 10f64)] .into_iter().collect() }), ("ItemKitTransformerSmall" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 3f64), ("Gold".into(), + 1f64), ("Iron".into(), 10f64)] .into_iter().collect() }), + ("ItemKitTurbineGenerator".into(), Recipe { tier : + MachineTier::TierOne, time : 60f64, energy : 6000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 4f64), ("Iron" + .into(), 5f64), ("Solder".into(), 4f64)] .into_iter().collect() + }), ("ItemKitUprightWindTurbine".into(), Recipe { tier : + MachineTier::TierOne, time : 60f64, energy : 12000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 5f64), ("Iron" + .into(), 10f64)] .into_iter().collect() }), + ("ItemKitVendingMachine".into(), Recipe { tier : + MachineTier::TierOne, time : 60f64, energy : 15000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Electrum".into(), 50f64), ("Gold".into(), 50f64), + ("Solder".into(), 10f64), ("Steel".into(), 20f64)] .into_iter() + .collect() }), ("ItemKitVendingMachineRefrigerated".into(), + Recipe { tier : MachineTier::TierTwo, time : 60f64, energy : + 25000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Electrum".into(), 80f64), ("Gold".into(), + 60f64), ("Solder".into(), 30f64), ("Steel".into(), 40f64)] + .into_iter().collect() }), ("ItemKitWeatherStation".into(), + Recipe { tier : MachineTier::TierOne, time : 60f64, energy : + 12000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Copper".into(), 5f64), ("Gold".into(), + 3f64), ("Iron".into(), 8f64), ("Steel".into(), 3f64)] + .into_iter().collect() }), ("ItemKitWindTurbine".into(), Recipe { + tier : MachineTier::TierTwo, time : 60f64, energy : 12000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Electrum".into(), 5f64), + ("Steel".into(), 20f64)] .into_iter().collect() }), + ("ItemLabeller".into(), Recipe { tier : MachineTier::TierOne, + time : 15f64, energy : 800f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 2f64), ("Gold".into(), 1f64), ("Iron".into(), 3f64)] + .into_iter().collect() }), ("ItemLaptop".into(), Recipe { tier : + MachineTier::TierTwo, time : 60f64, energy : 18000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 5i64, reagents : + vec![("Copper".into(), 5.5f64), ("Electrum".into(), 5f64), + ("Gold".into(), 12f64), ("Solder".into(), 5f64), ("Steel".into(), + 2f64)] .into_iter().collect() }), ("ItemPowerConnector".into(), + Recipe { tier : MachineTier::TierOne, time : 1f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Gold".into(), + 3f64), ("Iron".into(), 10f64)] .into_iter().collect() }), + ("ItemResearchCapsule".into(), Recipe { tier : + MachineTier::TierOne, time : 3f64, energy : 400f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Gold".into(), 2f64), ("Iron" + .into(), 9f64)] .into_iter().collect() }), + ("ItemResearchCapsuleGreen".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 10f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Astroloy".into(), 2f64), ("Copper".into(), 3f64), ("Gold" + .into(), 2f64), ("Iron".into(), 9f64)] .into_iter().collect() }), + ("ItemResearchCapsuleRed".into(), Recipe { tier : + MachineTier::TierOne, time : 8f64, energy : 50f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Gold".into(), 2f64), ("Iron" + .into(), 2f64)] .into_iter().collect() }), + ("ItemResearchCapsuleYellow".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Astroloy".into(), 3f64), ("Copper".into(), 3f64), ("Gold" + .into(), 2f64), ("Iron".into(), 9f64)] .into_iter().collect() }), + ("ItemSoundCartridgeBass".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64), ("Silicon" + .into(), 2f64)] .into_iter().collect() }), + ("ItemSoundCartridgeDrums".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64), ("Silicon" + .into(), 2f64)] .into_iter().collect() }), + ("ItemSoundCartridgeLeads".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64), ("Silicon" + .into(), 2f64)] .into_iter().collect() }), + ("ItemSoundCartridgeSynth".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64), ("Silicon" + .into(), 2f64)] .into_iter().collect() }), ("ItemTablet".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 100f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 3f64), ("Gold".into(), + 2f64), ("Solder".into(), 5f64)] .into_iter().collect() }), + ("ItemWallLight".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 10f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 2f64), ("Iron".into(), 1f64)] .into_iter().collect() }), + ("MotherboardComms".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 4i64, reagents : vec![("Copper" + .into(), 5f64), ("Electrum".into(), 2f64), ("Gold".into(), 5f64), + ("Silver".into(), 5f64)] .into_iter().collect() }), + ("MotherboardLogic".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 5f64), ("Gold".into(), 5f64)] .into_iter().collect() }), + ("MotherboardProgrammableChip".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64)] .into_iter() + .collect() }), ("MotherboardRockets".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Electrum".into(), 5f64), ("Solder".into(), 5f64)] + .into_iter().collect() }), ("MotherboardSorter".into(), Recipe { + tier : MachineTier::TierOne, time : 5f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Gold".into(), 5f64), ("Silver".into(), 5f64)] .into_iter() + .collect() }), ("PipeBenderMod".into(), Recipe { tier : + MachineTier::TierTwo, time : 180f64, energy : 72000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Constantan".into(), 8f64), ("Electrum".into(), 8f64), + ("Solder".into(), 8f64), ("Steel".into(), 35f64)] .into_iter() + .collect() }), ("PortableComposter".into(), Recipe { tier : + MachineTier::TierOne, time : 55f64, energy : 20000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 15f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("PortableSolarPanel".into(), Recipe { + tier : MachineTier::TierOne, time : 5f64, energy : 200f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 3f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ToolPrinterMod" + .into(), Recipe { tier : MachineTier::TierTwo, time : 180f64, + energy : 72000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Constantan".into(), 8f64), ("Electrum" + .into(), 8f64), ("Solder".into(), 8f64), ("Steel".into(), 35f64)] + .into_iter().collect() }) + ] + .into_iter() + .collect(), + }), memory: MemoryInfo { instructions: Some( vec![ @@ -30682,6 +32557,879 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: Some(FabricatorInfo { + tier: MachineTier::Undefined, + recipes: vec![ + ("ApplianceSeedTray".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 10f64), ("Silicon" + .into(), 15f64)] .into_iter().collect() }), ("ItemActiveVent" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Gold".into(), + 1f64), ("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemAdhesiveInsulation".into(), Recipe { tier : + MachineTier::TierOne, time : 2f64, energy : 200f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Silicon".into(), 1f64), ("Steel".into(), 0.5f64)] + .into_iter().collect() }), ("ItemDynamicAirCon".into(), Recipe { + tier : MachineTier::TierOne, time : 60f64, energy : 5000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Gold".into(), 5f64), ("Silver".into(), 5f64), ("Solder" + .into(), 5f64), ("Steel".into(), 20f64)] .into_iter().collect() + }), ("ItemDynamicScrubber".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 5000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Gold".into(), 5f64), ("Invar".into(), 5f64), ("Solder" + .into(), 5f64), ("Steel".into(), 20f64)] .into_iter().collect() + }), ("ItemGasCanisterEmpty".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemGasCanisterSmart".into(), Recipe { tier : + MachineTier::TierTwo, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Silicon".into(), 2f64), ("Steel" + .into(), 15f64)] .into_iter().collect() }), + ("ItemGasFilterCarbonDioxide".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterCarbonDioxideL".into(), Recipe { tier : + MachineTier::TierTwo, time : 45f64, energy : 4000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Invar".into(), 1f64), ("Steel".into(), 5f64), ("Stellite" + .into(), 1f64)] .into_iter().collect() }), + ("ItemGasFilterCarbonDioxideM".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 1f64), ("Iron".into(), 5f64), + ("Silver".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterNitrogen".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterNitrogenL".into(), Recipe { tier : + MachineTier::TierTwo, time : 45f64, energy : 4000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Invar".into(), 1f64), ("Steel".into(), 5f64), ("Stellite" + .into(), 1f64)] .into_iter().collect() }), + ("ItemGasFilterNitrogenM".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 1f64), ("Iron".into(), 5f64), + ("Silver".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterNitrousOxide".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterNitrousOxideL".into(), Recipe { tier : + MachineTier::TierTwo, time : 45f64, energy : 4000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Invar".into(), 1f64), ("Steel".into(), 5f64), ("Stellite" + .into(), 1f64)] .into_iter().collect() }), + ("ItemGasFilterNitrousOxideM".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 1f64), ("Iron".into(), 5f64), + ("Silver".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterOxygen".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterOxygenL".into(), Recipe { tier : + MachineTier::TierTwo, time : 45f64, energy : 4000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Invar".into(), 1f64), ("Steel".into(), 5f64), ("Stellite" + .into(), 1f64)] .into_iter().collect() }), + ("ItemGasFilterOxygenM".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 1f64), ("Iron".into(), 5f64), + ("Silver".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterPollutants".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterPollutantsL".into(), Recipe { tier : + MachineTier::TierTwo, time : 45f64, energy : 4000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Invar".into(), 1f64), ("Steel".into(), 5f64), ("Stellite" + .into(), 1f64)] .into_iter().collect() }), + ("ItemGasFilterPollutantsM".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 1f64), ("Iron".into(), 5f64), + ("Silver".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterVolatiles".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterVolatilesL".into(), Recipe { tier : + MachineTier::TierTwo, time : 45f64, energy : 4000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Invar".into(), 1f64), ("Steel".into(), 5f64), ("Stellite" + .into(), 1f64)] .into_iter().collect() }), + ("ItemGasFilterVolatilesM".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 1f64), ("Iron".into(), 5f64), + ("Silver".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterWater".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemGasFilterWaterL".into(), Recipe { tier : + MachineTier::TierTwo, time : 45f64, energy : 4000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Invar".into(), 1f64), ("Steel".into(), 5f64), ("Stellite" + .into(), 1f64)] .into_iter().collect() }), ("ItemGasFilterWaterM" + .into(), Recipe { tier : MachineTier::TierOne, time : 20f64, + energy : 2500f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Constantan".into(), 1f64), ("Iron" + .into(), 5f64), ("Silver".into(), 5f64)] .into_iter().collect() + }), ("ItemHydroponicTray".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 10f64)] .into_iter().collect() }), + ("ItemKitAirlock".into(), Recipe { tier : MachineTier::TierOne, + time : 50f64, energy : 5000f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 5f64), ("Gold".into(), 5f64), ("Steel".into(), 15f64)] + .into_iter().collect() }), ("ItemKitAirlockGate".into(), Recipe { + tier : MachineTier::TierOne, time : 60f64, energy : 6000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Steel" + .into(), 25f64)] .into_iter().collect() }), + ("ItemKitAtmospherics".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 6000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 20f64), ("Gold".into(), 5f64), ("Iron" + .into(), 10f64)] .into_iter().collect() }), ("ItemKitChute" + .into(), Recipe { tier : MachineTier::TierOne, time : 2f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 3f64)] .into_iter() + .collect() }), ("ItemKitCryoTube".into(), Recipe { tier : + MachineTier::TierTwo, time : 120f64, energy : 24000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 10f64), ("Silver" + .into(), 5f64), ("Steel".into(), 35f64)] .into_iter().collect() + }), ("ItemKitDrinkingFountain".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 620f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Iron".into(), 5f64), ("Silicon" + .into(), 8f64)] .into_iter().collect() }), + ("ItemKitDynamicCanister".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 20f64)] .into_iter().collect() }), + ("ItemKitDynamicGasTankAdvanced".into(), Recipe { tier : + MachineTier::TierTwo, time : 40f64, energy : 2000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 20f64), ("Silicon" + .into(), 5f64), ("Steel".into(), 15f64)] .into_iter().collect() + }), ("ItemKitDynamicHydroponics".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Nickel".into(), 5f64), ("Steel" + .into(), 20f64)] .into_iter().collect() }), + ("ItemKitDynamicLiquidCanister".into(), Recipe { tier : + MachineTier::TierOne, time : 20f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 20f64)] .into_iter().collect() }), + ("ItemKitDynamicMKIILiquidCanister".into(), Recipe { tier : + MachineTier::TierTwo, time : 40f64, energy : 2000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 20f64), ("Silicon" + .into(), 5f64), ("Steel".into(), 15f64)] .into_iter().collect() + }), ("ItemKitEvaporationChamber".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Silicon".into(), 5f64), ("Steel" + .into(), 10f64)] .into_iter().collect() }), + ("ItemKitHeatExchanger".into(), Recipe { tier : + MachineTier::TierTwo, time : 30f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Invar".into(), 10f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("ItemKitIceCrusher".into(), Recipe { + tier : MachineTier::TierOne, time : 30f64, energy : 3000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64), ("Iron" + .into(), 3f64)] .into_iter().collect() }), + ("ItemKitInsulatedLiquidPipe".into(), Recipe { tier : + MachineTier::TierOne, time : 4f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Silicon".into(), 1f64), ("Steel".into(), 1f64)] + .into_iter().collect() }), ("ItemKitInsulatedPipe".into(), Recipe + { tier : MachineTier::TierOne, time : 4f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Silicon".into(), 1f64), ("Steel".into(), 1f64)] + .into_iter().collect() }), ("ItemKitInsulatedPipeUtility".into(), + Recipe { tier : MachineTier::TierOne, time : 15f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Silicon".into(), 1f64), ("Steel".into(), + 5f64)] .into_iter().collect() }), + ("ItemKitInsulatedPipeUtilityLiquid".into(), Recipe { tier : + MachineTier::TierOne, time : 15f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Silicon".into(), 1f64), ("Steel".into(), 5f64)] + .into_iter().collect() }), ("ItemKitLargeDirectHeatExchanger" + .into(), Recipe { tier : MachineTier::TierTwo, time : 30f64, + energy : 1000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Invar".into(), 10f64), ("Steel".into(), + 10f64)] .into_iter().collect() }), + ("ItemKitLargeExtendableRadiator".into(), Recipe { tier : + MachineTier::TierTwo, time : 30f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 10f64), ("Invar".into(), 10f64), ("Steel" + .into(), 10f64)] .into_iter().collect() }), + ("ItemKitLiquidRegulator".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 1f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ItemKitLiquidTank" + .into(), Recipe { tier : MachineTier::TierOne, time : 20f64, + energy : 2000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 5f64), ("Steel".into(), + 20f64)] .into_iter().collect() }), ("ItemKitLiquidTankInsulated" + .into(), Recipe { tier : MachineTier::TierOne, time : 30f64, + energy : 6000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Silicon".into(), + 30f64), ("Steel".into(), 20f64)] .into_iter().collect() }), + ("ItemKitLiquidTurboVolumePump".into(), Recipe { tier : + MachineTier::TierTwo, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 4f64), ("Electrum".into(), 5f64), ("Gold" + .into(), 4f64), ("Steel".into(), 5f64)] .into_iter().collect() + }), ("ItemKitPassiveLargeRadiatorGas".into(), Recipe { tier : + MachineTier::TierTwo, time : 30f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Invar".into(), 5f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("ItemKitPassiveLargeRadiatorLiquid".into(), Recipe { tier : + MachineTier::TierTwo, time : 30f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Invar".into(), 5f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("ItemKitPassthroughHeatExchanger".into(), Recipe { tier : + MachineTier::TierTwo, time : 30f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Invar".into(), 10f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("ItemKitPipe".into(), Recipe { tier : + MachineTier::TierOne, time : 2f64, energy : 200f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 0.5f64)] .into_iter().collect() }), + ("ItemKitPipeLiquid".into(), Recipe { tier : + MachineTier::TierOne, time : 2f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 0.5f64)] .into_iter().collect() }), + ("ItemKitPipeOrgan".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 100f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 3f64)] .into_iter().collect() }), ("ItemKitPipeRadiator".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Gold".into(), 3f64), ("Steel".into(), + 2f64)] .into_iter().collect() }), ("ItemKitPipeRadiatorLiquid" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Gold".into(), 3f64), ("Steel".into(), + 2f64)] .into_iter().collect() }), ("ItemKitPipeUtility".into(), + Recipe { tier : MachineTier::TierOne, time : 15f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 5f64)] .into_iter() + .collect() }), ("ItemKitPipeUtilityLiquid".into(), Recipe { tier + : MachineTier::TierOne, time : 15f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemKitPlanter".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 10f64)] .into_iter().collect() }), ("ItemKitPortablesConnector" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 5f64)] .into_iter() + .collect() }), ("ItemKitPoweredVent".into(), Recipe { tier : + MachineTier::TierTwo, time : 20f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Electrum".into(), 5f64), ("Invar".into(), 2f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), ("ItemKitRegulator" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 2f64), ("Gold".into(), + 1f64), ("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemKitSensor".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 1f64), ("Gold".into(), 1f64), ("Iron".into(), 1f64)] + .into_iter().collect() }), ("ItemKitShower".into(), Recipe { tier + : MachineTier::TierOne, time : 30f64, energy : 3000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 5f64), ("Silicon" + .into(), 5f64)] .into_iter().collect() }), ("ItemKitSleeper" + .into(), Recipe { tier : MachineTier::TierOne, time : 60f64, + energy : 6000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 10f64), ("Gold".into(), + 10f64), ("Steel".into(), 25f64)] .into_iter().collect() }), + ("ItemKitSmallDirectHeatExchanger".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Steel".into(), 3f64)] + .into_iter().collect() }), ("ItemKitStandardChute".into(), Recipe + { tier : MachineTier::TierOne, time : 5f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 2f64), ("Electrum".into(), 2f64), + ("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemKitSuitStorage".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 15f64), ("Silver" + .into(), 5f64)] .into_iter().collect() }), ("ItemKitTank".into(), + Recipe { tier : MachineTier::TierOne, time : 20f64, energy : + 2000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 5f64), ("Steel".into(), + 20f64)] .into_iter().collect() }), ("ItemKitTankInsulated" + .into(), Recipe { tier : MachineTier::TierOne, time : 30f64, + energy : 6000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 5f64), ("Silicon".into(), + 30f64), ("Steel".into(), 20f64)] .into_iter().collect() }), + ("ItemKitTurboVolumePump".into(), Recipe { tier : + MachineTier::TierTwo, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 4f64), ("Electrum".into(), 5f64), ("Gold" + .into(), 4f64), ("Steel".into(), 5f64)] .into_iter().collect() + }), ("ItemKitWaterBottleFiller".into(), Recipe { tier : + MachineTier::TierOne, time : 7f64, energy : 620f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Iron".into(), 5f64), ("Silicon" + .into(), 8f64)] .into_iter().collect() }), + ("ItemKitWaterPurifier".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 6000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 20f64), ("Gold".into(), 5f64), ("Iron" + .into(), 10f64)] .into_iter().collect() }), + ("ItemLiquidCanisterEmpty".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemLiquidCanisterSmart".into(), Recipe { tier : + MachineTier::TierTwo, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Silicon".into(), 2f64), ("Steel" + .into(), 15f64)] .into_iter().collect() }), ("ItemLiquidDrain" + .into(), Recipe { tier : MachineTier::TierOne, time : 10f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 2f64), ("Iron".into(), + 5f64)] .into_iter().collect() }), ("ItemLiquidPipeAnalyzer" + .into(), Recipe { tier : MachineTier::TierOne, time : 10f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Electrum".into(), 2f64), ("Gold".into(), + 2f64), ("Iron".into(), 2f64)] .into_iter().collect() }), + ("ItemLiquidPipeHeater".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Gold".into(), 3f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ItemLiquidPipeValve" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 2f64), ("Iron".into(), + 3f64)] .into_iter().collect() }), ("ItemLiquidPipeVolumePump" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 3f64), ("Gold".into(), + 2f64), ("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemPassiveVent".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 3f64)] .into_iter().collect() }), ("ItemPassiveVentInsulated" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Silicon".into(), 5f64), ("Steel".into(), + 1f64)] .into_iter().collect() }), ("ItemPipeAnalyizer".into(), + Recipe { tier : MachineTier::TierOne, time : 10f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Electrum".into(), 2f64), ("Gold".into(), + 2f64), ("Iron".into(), 2f64)] .into_iter().collect() }), + ("ItemPipeCowl".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 3f64)] .into_iter().collect() }), ("ItemPipeDigitalValve".into(), + Recipe { tier : MachineTier::TierOne, time : 15f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 2f64), ("Invar".into(), + 3f64), ("Steel".into(), 5f64)] .into_iter().collect() }), + ("ItemPipeGasMixer".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 2f64), ("Gold".into(), 2f64), ("Iron".into(), 2f64)] + .into_iter().collect() }), ("ItemPipeHeater".into(), Recipe { + tier : MachineTier::TierOne, time : 5f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Gold".into(), 3f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ItemPipeIgniter" + .into(), Recipe { tier : MachineTier::TierOne, time : 10f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Electrum".into(), 2f64), ("Iron".into(), + 2f64)] .into_iter().collect() }), ("ItemPipeLabel".into(), Recipe + { tier : MachineTier::TierOne, time : 5f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemPipeMeter".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 2f64), ("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemPipeValve".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 2f64), ("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemPipeVolumePump".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Gold".into(), 2f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ItemWallCooler" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 3f64), ("Gold".into(), + 1f64), ("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemWallHeater".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 3f64), ("Gold".into(), 1f64), ("Iron".into(), 3f64)] + .into_iter().collect() }), ("ItemWaterBottle".into(), Recipe { + tier : MachineTier::TierOne, time : 4f64, energy : 120f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Iron".into(), 2f64), ("Silicon".into(), 4f64)] + .into_iter().collect() }), ("ItemWaterPipeDigitalValve".into(), + Recipe { tier : MachineTier::TierOne, time : 15f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 2f64), ("Invar".into(), + 3f64), ("Steel".into(), 5f64)] .into_iter().collect() }), + ("ItemWaterPipeMeter".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Iron".into(), 3f64)] .into_iter() + .collect() }), ("ItemWaterWallCooler".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Gold".into(), 1f64), ("Iron" + .into(), 3f64)] .into_iter().collect() }) + ] + .into_iter() + .collect(), + }), memory: MemoryInfo { instructions: Some( vec![ @@ -39617,6 +42365,282 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: Some(FabricatorInfo { + tier: MachineTier::Undefined, + recipes: vec![ + ("ItemKitAccessBridge".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 9000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 3f64), ("Steel" + .into(), 10f64)] .into_iter().collect() }), + ("ItemKitChuteUmbilical".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 3f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("ItemKitElectricUmbilical".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 2500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Gold".into(), 5f64), ("Steel".into(), + 5f64)] .into_iter().collect() }), ("ItemKitFuselage".into(), + Recipe { tier : MachineTier::TierOne, time : 120f64, energy : + 60000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Steel".into(), 20f64)] .into_iter() + .collect() }), ("ItemKitGasUmbilical".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Steel".into(), 5f64)] + .into_iter().collect() }), ("ItemKitGovernedGasRocketEngine" + .into(), Recipe { tier : MachineTier::TierOne, time : 60f64, + energy : 60000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 10f64), ("Gold".into(), + 5f64), ("Iron".into(), 15f64)] .into_iter().collect() }), + ("ItemKitLaunchMount".into(), Recipe { tier : + MachineTier::TierOne, time : 240f64, energy : 120000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Steel".into(), 60f64)] .into_iter().collect() }), + ("ItemKitLaunchTower".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 30000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Steel".into(), 10f64)] .into_iter().collect() }), + ("ItemKitLiquidUmbilical".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Steel".into(), 5f64)] + .into_iter().collect() }), ("ItemKitPressureFedGasEngine".into(), + Recipe { tier : MachineTier::TierOne, time : 60f64, energy : + 60000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Constantan".into(), 10f64), ("Electrum" + .into(), 5f64), ("Invar".into(), 20f64), ("Steel".into(), 20f64)] + .into_iter().collect() }), ("ItemKitPressureFedLiquidEngine" + .into(), Recipe { tier : MachineTier::TierOne, time : 60f64, + energy : 60000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Astroloy".into(), 10f64), ("Inconel" + .into(), 5f64), ("Waspaloy".into(), 15f64)] .into_iter() + .collect() }), ("ItemKitPumpedLiquidEngine".into(), Recipe { tier + : MachineTier::TierOne, time : 60f64, energy : 60000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 10f64), ("Electrum".into(), 5f64), + ("Steel".into(), 15f64)] .into_iter().collect() }), + ("ItemKitRocketAvionics".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Electrum".into(), 2f64), ("Solder".into(), 3f64)] + .into_iter().collect() }), ("ItemKitRocketBattery".into(), Recipe + { tier : MachineTier::TierOne, time : 10f64, energy : 10000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Electrum".into(), 5f64), ("Solder".into(), 5f64), ("Steel" + .into(), 10f64)] .into_iter().collect() }), + ("ItemKitRocketCargoStorage".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 30000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Constantan".into(), 10f64), ("Invar".into(), 5f64), + ("Steel".into(), 10f64)] .into_iter().collect() }), + ("ItemKitRocketCelestialTracker".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Electrum".into(), 5f64), ("Steel".into(), 5f64)] + .into_iter().collect() }), ("ItemKitRocketCircuitHousing".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 2500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Electrum".into(), 2f64), ("Solder" + .into(), 3f64)] .into_iter().collect() }), + ("ItemKitRocketDatalink".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 2500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Electrum".into(), 2f64), ("Solder".into(), 3f64)] + .into_iter().collect() }), ("ItemKitRocketGasFuelTank".into(), + Recipe { tier : MachineTier::TierOne, time : 10f64, energy : + 5000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 5f64), ("Steel".into(), + 10f64)] .into_iter().collect() }), ("ItemKitRocketLiquidFuelTank" + .into(), Recipe { tier : MachineTier::TierOne, time : 10f64, + energy : 5000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 5f64), ("Steel".into(), + 20f64)] .into_iter().collect() }), ("ItemKitRocketMiner".into(), + Recipe { tier : MachineTier::TierOne, time : 60f64, energy : + 60000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Constantan".into(), 10f64), ("Electrum" + .into(), 5f64), ("Invar".into(), 5f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("ItemKitRocketScanner".into(), Recipe + { tier : MachineTier::TierOne, time : 60f64, energy : 60000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 10f64), ("Gold".into(), 10f64)] + .into_iter().collect() }), ("ItemKitRocketTransformerSmall" + .into(), Recipe { tier : MachineTier::TierOne, time : 60f64, + energy : 12000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Electrum".into(), 5f64), ("Steel".into(), + 10f64)] .into_iter().collect() }), ("ItemKitStairwell".into(), + Recipe { tier : MachineTier::TierOne, time : 20f64, energy : + 6000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 15f64)] .into_iter() + .collect() }), ("ItemRocketMiningDrillHead".into(), Recipe { tier + : MachineTier::TierOne, time : 30f64, energy : 5000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 20f64)] .into_iter().collect() }), + ("ItemRocketMiningDrillHeadDurable".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 5000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Iron".into(), 10f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), + ("ItemRocketMiningDrillHeadHighSpeedIce".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 5000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Invar".into(), 5f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), + ("ItemRocketMiningDrillHeadHighSpeedMineral".into(), Recipe { + tier : MachineTier::TierOne, time : 30f64, energy : 5000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Invar".into(), 5f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("ItemRocketMiningDrillHeadIce" + .into(), Recipe { tier : MachineTier::TierOne, time : 30f64, + energy : 5000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Iron".into(), 10f64), ("Steel".into(), + 10f64)] .into_iter().collect() }), + ("ItemRocketMiningDrillHeadLongTerm".into(), Recipe { tier : + MachineTier::TierOne, time : 30f64, energy : 5000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Invar".into(), 5f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("ItemRocketMiningDrillHeadMineral" + .into(), Recipe { tier : MachineTier::TierOne, time : 30f64, + energy : 5000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Iron".into(), 10f64), ("Steel".into(), + 10f64)] .into_iter().collect() }), ("ItemRocketScanningHead" + .into(), Recipe { tier : MachineTier::TierOne, time : 60f64, + energy : 60000f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 3f64), ("Gold".into(), + 2f64)] .into_iter().collect() }) + ] + .into_iter() + .collect(), + }), memory: MemoryInfo { instructions: Some( vec![ @@ -40209,6 +43233,209 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: Some(FabricatorInfo { + tier: MachineTier::Undefined, + recipes: vec![ + ("AccessCardBlack".into(), Recipe { tier : MachineTier::TierOne, + time : 2f64, energy : 200f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 1f64), ("Gold".into(), 1f64), ("Iron".into(), 1f64)] + .into_iter().collect() }), ("AccessCardBlue".into(), Recipe { + tier : MachineTier::TierOne, time : 2f64, energy : 200f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), ("AccessCardBrown" + .into(), Recipe { tier : MachineTier::TierOne, time : 2f64, + energy : 200f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 1f64), ("Gold".into(), + 1f64), ("Iron".into(), 1f64)] .into_iter().collect() }), + ("AccessCardGray".into(), Recipe { tier : MachineTier::TierOne, + time : 2f64, energy : 200f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 1f64), ("Gold".into(), 1f64), ("Iron".into(), 1f64)] + .into_iter().collect() }), ("AccessCardGreen".into(), Recipe { + tier : MachineTier::TierOne, time : 2f64, energy : 200f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), ("AccessCardKhaki" + .into(), Recipe { tier : MachineTier::TierOne, time : 2f64, + energy : 200f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 1f64), ("Gold".into(), + 1f64), ("Iron".into(), 1f64)] .into_iter().collect() }), + ("AccessCardOrange".into(), Recipe { tier : MachineTier::TierOne, + time : 2f64, energy : 200f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 1f64), ("Gold".into(), 1f64), ("Iron".into(), 1f64)] + .into_iter().collect() }), ("AccessCardPink".into(), Recipe { + tier : MachineTier::TierOne, time : 2f64, energy : 200f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), ("AccessCardPurple" + .into(), Recipe { tier : MachineTier::TierOne, time : 2f64, + energy : 200f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 1f64), ("Gold".into(), + 1f64), ("Iron".into(), 1f64)] .into_iter().collect() }), + ("AccessCardRed".into(), Recipe { tier : MachineTier::TierOne, + time : 2f64, energy : 200f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 1f64), ("Gold".into(), 1f64), ("Iron".into(), 1f64)] + .into_iter().collect() }), ("AccessCardWhite".into(), Recipe { + tier : MachineTier::TierOne, time : 2f64, energy : 200f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 1f64), ("Gold".into(), 1f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), ("AccessCardYellow" + .into(), Recipe { tier : MachineTier::TierOne, time : 2f64, + energy : 200f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 1f64), ("Gold".into(), + 1f64), ("Iron".into(), 1f64)] .into_iter().collect() }), + ("CartridgeAccessController".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 100f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 1f64)] .into_iter().collect() }), ("FireArmSMG".into(), + Recipe { tier : MachineTier::TierOne, time : 120f64, energy : + 3000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Nickel".into(), 10f64), ("Steel".into(), + 30f64)] .into_iter().collect() }), ("Handgun".into(), Recipe { + tier : MachineTier::TierOne, time : 120f64, energy : 3000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Nickel".into(), 10f64), ("Steel".into(), 30f64)] + .into_iter().collect() }), ("HandgunMagazine".into(), Recipe { + tier : MachineTier::TierOne, time : 60f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 3f64), ("Lead".into(), 1f64), ("Steel" + .into(), 3f64)] .into_iter().collect() }), ("ItemAmmoBox".into(), + Recipe { tier : MachineTier::TierOne, time : 120f64, energy : + 3000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 30f64), ("Lead".into(), + 50f64), ("Steel".into(), 30f64)] .into_iter().collect() }), + ("ItemExplosive".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 5i64, reagents : vec![("Copper" + .into(), 5f64), ("Electrum".into(), 1f64), ("Gold".into(), 5f64), + ("Lead".into(), 10f64), ("Steel".into(), 7f64)] .into_iter() + .collect() }), ("ItemGrenade".into(), Recipe { tier : + MachineTier::TierOne, time : 90f64, energy : 2900f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 15f64), ("Gold".into(), 1f64), ("Lead" + .into(), 25f64), ("Steel".into(), 25f64)] .into_iter().collect() + }), ("ItemMiningCharge".into(), Recipe { tier : + MachineTier::TierOne, time : 7f64, energy : 200f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 7f64), ("Lead".into(), 10f64)] .into_iter().collect() + }), ("SMGMagazine".into(), Recipe { tier : MachineTier::TierOne, + time : 60f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Copper" + .into(), 3f64), ("Lead".into(), 1f64), ("Steel".into(), 3f64)] + .into_iter().collect() }), ("WeaponPistolEnergy".into(), Recipe { + tier : MachineTier::TierTwo, time : 120f64, energy : 3000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Electrum".into(), 20f64), ("Gold".into(), 10f64), + ("Solder".into(), 10f64), ("Steel".into(), 10f64)] .into_iter() + .collect() }), ("WeaponRifleEnergy".into(), Recipe { tier : + MachineTier::TierTwo, time : 240f64, energy : 10000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 6i64, reagents : + vec![("Constantan".into(), 10f64), ("Electrum".into(), 20f64), + ("Gold".into(), 10f64), ("Invar".into(), 10f64), ("Solder" + .into(), 10f64), ("Steel".into(), 20f64)] .into_iter().collect() + }) + ] + .into_iter() + .collect(), + }), memory: MemoryInfo { instructions: Some( vec![ @@ -42116,6 +45343,7 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: None, } .into(), ), @@ -43735,6 +46963,814 @@ pub fn build_prefab_database() -> std::collections::BTreeMap< .collect(), processed_reagents: vec![].into_iter().collect(), }, + fabricator_info: Some(FabricatorInfo { + tier: MachineTier::Undefined, + recipes: vec![ + ("FlareGun".into(), Recipe { tier : MachineTier::TierOne, time : + 10f64, energy : 2000f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Iron".into(), + 10f64), ("Silicon".into(), 10f64)] .into_iter().collect() }), + ("ItemAngleGrinder".into(), Recipe { tier : MachineTier::TierOne, + time : 10f64, energy : 500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 1f64), ("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemArcWelder".into(), Recipe { tier : MachineTier::TierOne, + time : 30f64, energy : 2500f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 4i64, reagents : vec![("Electrum" + .into(), 10f64), ("Invar".into(), 5f64), ("Solder".into(), + 10f64), ("Steel".into(), 10f64)] .into_iter().collect() }), + ("ItemBasketBall".into(), Recipe { tier : MachineTier::TierOne, + time : 1f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Silicon" + .into(), 1f64)] .into_iter().collect() }), ("ItemBeacon".into(), + Recipe { tier : MachineTier::TierOne, time : 10f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 2f64), ("Gold".into(), + 1f64), ("Iron".into(), 2f64)] .into_iter().collect() }), + ("ItemChemLightBlue".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 1f64)] .into_iter().collect() }), + ("ItemChemLightGreen".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 1f64)] .into_iter().collect() }), + ("ItemChemLightRed".into(), Recipe { tier : MachineTier::TierOne, + time : 1f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Silicon" + .into(), 1f64)] .into_iter().collect() }), ("ItemChemLightWhite" + .into(), Recipe { tier : MachineTier::TierOne, time : 1f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Silicon".into(), 1f64)] .into_iter() + .collect() }), ("ItemChemLightYellow".into(), Recipe { tier : + MachineTier::TierOne, time : 1f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 1f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_Aus".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_Brazil".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_Canada".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_China".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_EU".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_France".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_Germany".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_Japan".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_Korea".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_NZ".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_Russia".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_SouthAfrica".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_UK".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_US".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemClothingBagOveralls_Ukraine".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("ItemCrowbar".into(), Recipe { tier : MachineTier::TierOne, time + : 10f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 5f64)] .into_iter().collect() }), ("ItemDirtCanister".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 400f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 3f64)] .into_iter() + .collect() }), ("ItemDisposableBatteryCharger".into(), Recipe { + tier : MachineTier::TierOne, time : 10f64, energy : 1000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 2f64), ("Iron" + .into(), 2f64)] .into_iter().collect() }), ("ItemDrill".into(), + Recipe { tier : MachineTier::TierOne, time : 10f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 5f64), ("Iron".into(), + 5f64)] .into_iter().collect() }), ("ItemDuctTape".into(), Recipe + { tier : MachineTier::TierOne, time : 5f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 2f64)] .into_iter().collect() }), + ("ItemEvaSuit".into(), Recipe { tier : MachineTier::TierOne, time + : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 2f64), ("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemFlagSmall".into(), Recipe { tier : MachineTier::TierOne, + time : 1f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 1f64)] .into_iter().collect() }), ("ItemFlashlight".into(), + Recipe { tier : MachineTier::TierOne, time : 15f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 2f64), ("Gold".into(), + 2f64)] .into_iter().collect() }), ("ItemGlasses".into(), Recipe { + tier : MachineTier::TierOne, time : 20f64, energy : 250f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Iron".into(), 15f64), ("Silicon".into(), 10f64)] + .into_iter().collect() }), ("ItemHardBackpack".into(), Recipe { + tier : MachineTier::TierTwo, time : 30f64, energy : 1500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Astroloy".into(), 5f64), ("Steel".into(), 15f64), + ("Stellite".into(), 5f64)] .into_iter().collect() }), + ("ItemHardJetpack".into(), Recipe { tier : MachineTier::TierTwo, + time : 40f64, energy : 1750f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 4i64, reagents : vec![("Astroloy" + .into(), 8f64), ("Steel".into(), 20f64), ("Stellite".into(), + 8f64), ("Waspaloy".into(), 8f64)] .into_iter().collect() }), + ("ItemHardMiningBackPack".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 1000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Invar".into(), 1f64), ("Steel".into(), 6f64)] .into_iter() + .collect() }), ("ItemHardSuit".into(), Recipe { tier : + MachineTier::TierTwo, time : 60f64, energy : 3000f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Astroloy".into(), 10f64), ("Steel".into(), 20f64), + ("Stellite".into(), 2f64)] .into_iter().collect() }), + ("ItemHardsuitHelmet".into(), Recipe { tier : + MachineTier::TierTwo, time : 50f64, energy : 1750f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Astroloy".into(), 2f64), ("Steel".into(), 10f64), + ("Stellite".into(), 2f64)] .into_iter().collect() }), + ("ItemIgniter".into(), Recipe { tier : MachineTier::TierOne, time + : 1f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Copper" + .into(), 3f64)] .into_iter().collect() }), ("ItemJetpackBasic" + .into(), Recipe { tier : MachineTier::TierOne, time : 30f64, + energy : 1500f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Gold".into(), 2f64), ("Lead".into(), + 5f64), ("Steel".into(), 10f64)] .into_iter().collect() }), + ("ItemKitBasket".into(), Recipe { tier : MachineTier::TierOne, + time : 1f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Copper" + .into(), 2f64), ("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemLabeller".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Gold".into(), + 1f64), ("Iron".into(), 2f64)] .into_iter().collect() }), + ("ItemMKIIAngleGrinder".into(), Recipe { tier : + MachineTier::TierTwo, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 1f64), ("Electrum".into(), 4f64), ("Iron" + .into(), 3f64)] .into_iter().collect() }), ("ItemMKIIArcWelder" + .into(), Recipe { tier : MachineTier::TierTwo, time : 30f64, + energy : 2500f64, temperature : RecipeRange { start : 1f64, stop + : 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Electrum".into(), 14f64), ("Invar" + .into(), 5f64), ("Solder".into(), 10f64), ("Steel".into(), + 10f64)] .into_iter().collect() }), ("ItemMKIICrowbar".into(), + Recipe { tier : MachineTier::TierTwo, time : 10f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Electrum".into(), 5f64), ("Iron".into(), + 5f64)] .into_iter().collect() }), ("ItemMKIIDrill".into(), Recipe + { tier : MachineTier::TierTwo, time : 10f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Copper".into(), 5f64), ("Electrum".into(), 5f64), ("Iron" + .into(), 5f64)] .into_iter().collect() }), ("ItemMKIIDuctTape" + .into(), Recipe { tier : MachineTier::TierTwo, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Electrum".into(), 1f64), ("Iron".into(), + 2f64)] .into_iter().collect() }), ("ItemMKIIMiningDrill".into(), + Recipe { tier : MachineTier::TierTwo, time : 5f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 2f64), ("Electrum" + .into(), 5f64), ("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemMKIIScrewdriver".into(), Recipe { tier : + MachineTier::TierTwo, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Electrum".into(), 2f64), ("Iron".into(), 2f64)] + .into_iter().collect() }), ("ItemMKIIWireCutters".into(), Recipe + { tier : MachineTier::TierTwo, time : 5f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Electrum".into(), 5f64), ("Iron".into(), 3f64)] + .into_iter().collect() }), ("ItemMKIIWrench".into(), Recipe { + tier : MachineTier::TierTwo, time : 10f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Electrum".into(), 3f64), ("Iron".into(), 3f64)] + .into_iter().collect() }), ("ItemMarineBodyArmor".into(), Recipe + { tier : MachineTier::TierOne, time : 60f64, energy : 3000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Nickel".into(), 10f64), ("Silicon".into(), 10f64), + ("Steel".into(), 20f64)] .into_iter().collect() }), + ("ItemMarineHelmet".into(), Recipe { tier : MachineTier::TierOne, + time : 45f64, energy : 1750f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Gold".into(), + 4f64), ("Silicon".into(), 4f64), ("Steel".into(), 8f64)] + .into_iter().collect() }), ("ItemMiningBackPack".into(), Recipe { + tier : MachineTier::TierOne, time : 8f64, energy : 800f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 6f64)] .into_iter().collect() }), + ("ItemMiningBelt".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 3f64)] .into_iter().collect() }), ("ItemMiningBeltMKII".into(), + Recipe { tier : MachineTier::TierTwo, time : 10f64, energy : + 1000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Constantan".into(), 5f64), ("Steel" + .into(), 10f64)] .into_iter().collect() }), ("ItemMiningDrill" + .into(), Recipe { tier : MachineTier::TierOne, time : 5f64, + energy : 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 2i64, reagents : vec![("Copper".into(), 2f64), ("Iron".into(), + 3f64)] .into_iter().collect() }), ("ItemMiningDrillHeavy".into(), + Recipe { tier : MachineTier::TierTwo, time : 30f64, energy : + 2500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 4i64, reagents : vec![("Electrum".into(), 5f64), ("Invar".into(), + 10f64), ("Solder".into(), 10f64), ("Steel".into(), 10f64)] + .into_iter().collect() }), ("ItemMiningDrillPneumatic".into(), + Recipe { tier : MachineTier::TierOne, time : 20f64, energy : + 2000f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 4f64), ("Solder".into(), + 4f64), ("Steel".into(), 6f64)] .into_iter().collect() }), + ("ItemMkIIToolbelt".into(), Recipe { tier : MachineTier::TierTwo, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 2i64, reagents : vec![("Constantan" + .into(), 5f64), ("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemNVG".into(), Recipe { tier : MachineTier::TierOne, time : + 45f64, energy : 2750f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Hastelloy" + .into(), 10f64), ("Silicon".into(), 5f64), ("Steel".into(), + 5f64)] .into_iter().collect() }), ("ItemPickaxe".into(), Recipe { + tier : MachineTier::TierOne, time : 1f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 1f64), ("Iron".into(), 2f64)] .into_iter() + .collect() }), ("ItemPlantSampler".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 5f64), ("Iron".into(), 5f64)] .into_iter() + .collect() }), ("ItemRemoteDetonator".into(), Recipe { tier : + MachineTier::TierOne, time : 4.5f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Gold".into(), 1f64), ("Iron".into(), 3f64)] .into_iter() + .collect() }), ("ItemReusableFireExtinguisher".into(), Recipe { + tier : MachineTier::TierOne, time : 20f64, energy : 1000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Steel".into(), 5f64)] .into_iter().collect() }), + ("ItemRoadFlare".into(), Recipe { tier : MachineTier::TierOne, + time : 1f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 1f64)] .into_iter().collect() }), ("ItemScrewdriver".into(), + Recipe { tier : MachineTier::TierOne, time : 10f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 2f64)] .into_iter() + .collect() }), ("ItemSensorLenses".into(), Recipe { tier : + MachineTier::TierTwo, time : 45f64, energy : 3500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 3i64, reagents : + vec![("Inconel".into(), 5f64), ("Silicon".into(), 5f64), ("Steel" + .into(), 5f64)] .into_iter().collect() }), + ("ItemSensorProcessingUnitCelestialScanner".into(), Recipe { tier + : MachineTier::TierTwo, time : 15f64, energy : 100f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 5f64), ("Silicon".into(), 5f64)] .into_iter().collect() + }), ("ItemSensorProcessingUnitMesonScanner".into(), Recipe { tier + : MachineTier::TierTwo, time : 15f64, energy : 100f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 5f64), ("Silicon".into(), 5f64)] .into_iter().collect() + }), ("ItemSensorProcessingUnitOreScanner".into(), Recipe { tier : + MachineTier::TierTwo, time : 15f64, energy : 100f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Copper".into(), 5f64), ("Gold".into(), 5f64), ("Iron" + .into(), 5f64), ("Silicon".into(), 5f64)] .into_iter().collect() + }), ("ItemSpaceHelmet".into(), Recipe { tier : + MachineTier::TierOne, time : 15f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64)] .into_iter() + .collect() }), ("ItemSpacepack".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Iron".into(), 5f64)] .into_iter() + .collect() }), ("ItemSprayCanBlack".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemSprayCanBlue".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 1f64)] .into_iter().collect() }), ("ItemSprayCanBrown".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 1f64)] .into_iter() + .collect() }), ("ItemSprayCanGreen".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemSprayCanGrey".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 1f64)] .into_iter().collect() }), ("ItemSprayCanKhaki".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 1f64)] .into_iter() + .collect() }), ("ItemSprayCanOrange".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemSprayCanPink".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 1f64)] .into_iter().collect() }), ("ItemSprayCanPurple".into(), + Recipe { tier : MachineTier::TierOne, time : 5f64, energy : + 500f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 1i64, reagents : vec![("Iron".into(), 1f64)] .into_iter() + .collect() }), ("ItemSprayCanRed".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemSprayCanWhite".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemSprayCanYellow".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 1f64)] .into_iter().collect() }), + ("ItemSprayGun".into(), Recipe { tier : MachineTier::TierTwo, + time : 10f64, energy : 2000f64, temperature : RecipeRange { start + : 1f64, stop : 80000f64, is_valid : false }, pressure : + RecipeRange { start : 0f64, stop : 1000000f64, is_valid : false + }, required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 3i64, reagents : vec![("Invar" + .into(), 5f64), ("Silicon".into(), 10f64), ("Steel".into(), + 10f64)] .into_iter().collect() }), ("ItemTerrainManipulator" + .into(), Recipe { tier : MachineTier::TierOne, time : 15f64, + energy : 600f64, temperature : RecipeRange { start : 1f64, stop : + 80000f64, is_valid : false }, pressure : RecipeRange { start : + 0f64, stop : 1000000f64, is_valid : false }, required_mix : + RecipeGasMix { rule : 0i64, is_any : true, is_any_to_remove : + false, reagents : vec![] .into_iter().collect() }, count_types : + 3i64, reagents : vec![("Copper".into(), 3f64), ("Gold".into(), + 2f64), ("Iron".into(), 5f64)] .into_iter().collect() }), + ("ItemToolBelt".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 3f64)] .into_iter().collect() }), ("ItemWearLamp".into(), Recipe + { tier : MachineTier::TierOne, time : 15f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 2f64), ("Gold".into(), 2f64)] .into_iter() + .collect() }), ("ItemWeldingTorch".into(), Recipe { tier : + MachineTier::TierOne, time : 10f64, energy : 500f64, temperature + : RecipeRange { start : 1f64, stop : 80000f64, is_valid : false + }, pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Copper".into(), 1f64), ("Iron".into(), 3f64)] .into_iter() + .collect() }), ("ItemWireCutters".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Iron".into(), 3f64)] .into_iter().collect() }), + ("ItemWrench".into(), Recipe { tier : MachineTier::TierOne, time + : 10f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Iron".into(), + 3f64)] .into_iter().collect() }), ("ToyLuna".into(), Recipe { + tier : MachineTier::TierOne, time : 10f64, energy : 500f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 2i64, reagents : + vec![("Gold".into(), 1f64), ("Iron".into(), 5f64)] .into_iter() + .collect() }), ("UniformCommander".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 25f64)] .into_iter().collect() }), + ("UniformMarine".into(), Recipe { tier : MachineTier::TierOne, + time : 5f64, energy : 500f64, temperature : RecipeRange { start : + 1f64, stop : 80000f64, is_valid : false }, pressure : RecipeRange + { start : 0f64, stop : 1000000f64, is_valid : false }, + required_mix : RecipeGasMix { rule : 0i64, is_any : true, + is_any_to_remove : false, reagents : vec![] .into_iter() + .collect() }, count_types : 1i64, reagents : vec![("Silicon" + .into(), 10f64)] .into_iter().collect() }), + ("UniformOrangeJumpSuit".into(), Recipe { tier : + MachineTier::TierOne, time : 5f64, energy : 500f64, temperature : + RecipeRange { start : 1f64, stop : 80000f64, is_valid : false }, + pressure : RecipeRange { start : 0f64, stop : 1000000f64, + is_valid : false }, required_mix : RecipeGasMix { rule : 0i64, + is_any : true, is_any_to_remove : false, reagents : vec![] + .into_iter().collect() }, count_types : 1i64, reagents : + vec![("Silicon".into(), 10f64)] .into_iter().collect() }), + ("WeaponPistolEnergy".into(), Recipe { tier : + MachineTier::TierTwo, time : 120f64, energy : 3000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 4i64, reagents : + vec![("Electrum".into(), 20f64), ("Gold".into(), 10f64), + ("Solder".into(), 10f64), ("Steel".into(), 10f64)] .into_iter() + .collect() }), ("WeaponRifleEnergy".into(), Recipe { tier : + MachineTier::TierTwo, time : 240f64, energy : 10000f64, + temperature : RecipeRange { start : 1f64, stop : 80000f64, + is_valid : false }, pressure : RecipeRange { start : 0f64, stop : + 1000000f64, is_valid : false }, required_mix : RecipeGasMix { + rule : 0i64, is_any : true, is_any_to_remove : false, reagents : + vec![] .into_iter().collect() }, count_types : 6i64, reagents : + vec![("Constantan".into(), 10f64), ("Electrum".into(), 20f64), + ("Gold".into(), 10f64), ("Invar".into(), 10f64), ("Solder" + .into(), 10f64), ("Steel".into(), 20f64)] .into_iter().collect() + }) + ] + .into_iter() + .collect(), + }), memory: MemoryInfo { instructions: Some( vec![ diff --git a/stationeers_data/src/enums/basic_enums.rs b/stationeers_data/src/enums/basic.rs similarity index 99% rename from stationeers_data/src/enums/basic_enums.rs rename to stationeers_data/src/enums/basic.rs index 53b0e13..5f29bb6 100644 --- a/stationeers_data/src/enums/basic_enums.rs +++ b/stationeers_data/src/enums/basic.rs @@ -1,6 +1,6 @@ use serde_derive::{Deserialize, Serialize}; use strum::{AsRefStr, Display, EnumIter, EnumProperty, EnumString, FromRepr}; -use super::script_enums::{LogicSlotType, LogicType}; +use super::script::{LogicSlotType, LogicType}; #[derive( Debug, Display, diff --git a/stationeers_data/src/enums/script_enums.rs b/stationeers_data/src/enums/script.rs similarity index 100% rename from stationeers_data/src/enums/script_enums.rs rename to stationeers_data/src/enums/script.rs diff --git a/stationeers_data/src/lib.rs b/stationeers_data/src/lib.rs index a140cca..63cd167 100644 --- a/stationeers_data/src/lib.rs +++ b/stationeers_data/src/lib.rs @@ -4,10 +4,10 @@ pub mod templates; pub mod enums { use serde_derive::{Deserialize, Serialize}; use std::fmt::Display; - use strum::{AsRefStr, EnumIter, EnumString}; + use strum::{AsRefStr, EnumIter, EnumString, FromRepr}; - pub mod basic_enums; - pub mod script_enums; + pub mod basic; + pub mod script; pub mod prefabs; #[derive(Debug)] @@ -46,6 +46,7 @@ pub mod enums { Deserialize, EnumIter, AsRefStr, + FromRepr, EnumString, )] pub enum ConnectionType { @@ -77,6 +78,7 @@ pub mod enums { Deserialize, EnumIter, AsRefStr, + FromRepr, EnumString, )] pub enum ConnectionRole { @@ -89,16 +91,45 @@ pub mod enums { #[default] None, } + + + #[derive( + Debug, + Default, + Clone, + Copy, + PartialEq, + PartialOrd, + Eq, + Ord, + Hash, + Serialize, + Deserialize, + EnumIter, + AsRefStr, + FromRepr, + EnumString, + )] + #[repr(u32)] + pub enum MachineTier { + #[default] + Undefined = 0, + TierOne = 1, + TierTwo = 2, + TierThree = 3, + #[serde(other)] + Max, + } } #[must_use] pub fn build_prefab_database() -> Option> { #[cfg(feature = "prefab_database")] - let _map = Some(database::build_prefab_database()); + let map = Some(database::build_prefab_database()); #[cfg(not(feature = "prefab_database"))] - let _map = None; + let map = None; - _map + map } #[cfg(feature = "prefab_database")] diff --git a/stationeers_data/src/templates.rs b/stationeers_data/src/templates.rs index 34c468b..ff3279d 100644 --- a/stationeers_data/src/templates.rs +++ b/stationeers_data/src/templates.rs @@ -1,9 +1,9 @@ use std::collections::BTreeMap; use crate::enums::{ - basic_enums::{Class as SlotClass, GasType, SortingClass}, - script_enums::{LogicSlotType, LogicType}, - ConnectionRole, ConnectionType, MemoryAccess, + basic::{Class as SlotClass, GasType, SortingClass}, + script::{LogicSlotType, LogicType}, + ConnectionRole, ConnectionType, MachineTier, MemoryAccess, }; use serde_derive::{Deserialize, Serialize}; @@ -219,6 +219,39 @@ pub struct ConsumerInfo { pub processed_reagents: Vec, } +#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] +pub struct RecipeRange { + pub start: f64, + pub stop: f64, + pub is_valid: bool, +} + +#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] +pub struct RecipeGasMix { + pub rule: i64, + pub is_any: bool, + pub is_any_to_remove: bool, + pub reagents: BTreeMap, +} + +#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] +pub struct Recipe { + pub tier: MachineTier, + pub time: f64, + pub energy: f64, + pub temperature: RecipeRange, + pub pressure: RecipeRange, + pub required_mix: RecipeGasMix, + pub count_types: i64, + pub reagents: BTreeMap +} + +#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] +pub struct FabricatorInfo { + pub tier: MachineTier, + pub recipes: BTreeMap, +} + #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] pub struct StructureInfo { pub small_grid: bool, @@ -303,6 +336,7 @@ pub struct StructureLogicDeviceConsumerTemplate { pub slots: Vec, pub device: DeviceInfo, pub consumer_info: ConsumerInfo, + pub fabricator_info: Option, } #[derive(Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)] @@ -338,6 +372,7 @@ pub struct StructureLogicDeviceConsumerMemoryTemplate { pub slots: Vec, pub device: DeviceInfo, pub consumer_info: ConsumerInfo, + pub fabricator_info: Option, pub memory: MemoryInfo, } diff --git a/xtask/src/generate.rs b/xtask/src/generate.rs index a7ece17..ce26041 100644 --- a/xtask/src/generate.rs +++ b/xtask/src/generate.rs @@ -49,7 +49,7 @@ pub fn generate( eprintln!("generating enums..."); } - let enums_files = enums::generate_enums(&pedia, &enums, workspace)?; + let enums_files = enums::generate(&pedia, &enums, workspace)?; eprintln!("Formatting generated files..."); for file in &enums_files { prepend_generated_comment_and_format(file)?; diff --git a/xtask/src/generate/database.rs b/xtask/src/generate/database.rs index cb3fd73..ac03063 100644 --- a/xtask/src/generate/database.rs +++ b/xtask/src/generate/database.rs @@ -15,13 +15,12 @@ use crate::{ }; use stationeers_data::{ - enums::MemoryAccess, templates::{ - ConnectionInfo, ConsumerInfo, DeviceInfo, Instruction, InternalAtmoInfo, + ConnectionInfo, ConsumerInfo, DeviceInfo, FabricatorInfo, Instruction, InternalAtmoInfo, ItemCircuitHolderTemplate, ItemConsumerTemplate, ItemInfo, ItemLogicMemoryTemplate, ItemLogicTemplate, ItemSlotsTemplate, ItemSuitCircuitHolderTemplate, ItemSuitLogicTemplate, - ItemSuitTemplate, ItemTemplate, LogicInfo, MemoryInfo, ObjectTemplate, PrefabInfo, - SlotInfo, StructureCircuitHolderTemplate, StructureInfo, + ItemSuitTemplate, ItemTemplate, LogicInfo, MemoryInfo, ObjectTemplate, PrefabInfo, Recipe, + RecipeGasMix, RecipeRange, SlotInfo, StructureCircuitHolderTemplate, StructureInfo, StructureLogicDeviceConsumerMemoryTemplate, StructureLogicDeviceConsumerTemplate, StructureLogicDeviceMemoryTemplate, StructureLogicDeviceTemplate, StructureLogicTemplate, StructureSlotsTemplate, StructureTemplate, SuitInfo, ThermalInfo, @@ -203,8 +202,7 @@ pub fn generate_database( // // https://regex101.com/r/V2tXIa/1 // - let null_matcher = regex::Regex::new(r#"(?:(?:,\n)\s*"\w+":\snull)+(,?)"#) - .unwrap(); + let null_matcher = regex::Regex::new(r#"(?:(?:,\n)\s*"\w+":\snull)+(,?)"#).unwrap(); let json = null_matcher.replace_all(&json, "$1"); write!(&mut database_file, "{json}")?; database_file.flush()?; @@ -733,6 +731,7 @@ fn generate_templates(pedia: &Stationpedia) -> Vec { slots: slot_inserts_to_info(slot_inserts), device: device.into(), consumer_info: consumer.into(), + fabricator_info: device.fabricator.as_ref().map(Into::into), }, )); // println!("Structure") @@ -805,6 +804,7 @@ fn generate_templates(pedia: &Stationpedia) -> Vec { slots: slot_inserts_to_info(slot_inserts), device: device.into(), consumer_info: consumer.into(), + fabricator_info: device.fabricator.as_ref().map(Into::into), memory: memory.into(), }, )); @@ -1052,3 +1052,88 @@ impl From<&stationpedia::ResourceConsumer> for ConsumerInfo { } } } + +impl From<&stationpedia::Fabricator> for FabricatorInfo { + fn from(value: &stationpedia::Fabricator) -> Self { + FabricatorInfo { + tier: value + .tier_name + .parse() + .unwrap_or_else(|_| panic!("Unknown MachineTier {}", value.tier_name)), + recipes: value + .recipes + .iter() + .map(|(key, val)| (key.clone(), val.into())) + .collect(), + } + } +} + +impl From<&stationpedia::Recipe> for Recipe { + fn from(value: &stationpedia::Recipe) -> Self { + Recipe { + tier: value + .tier_name + .parse() + .unwrap_or_else(|_| panic!("Unknown MachineTier {}", value.tier_name)), + time: value.time, + energy: value.energy, + temperature: (&value.temperature).into(), + pressure: (&value.pressure).into(), + required_mix: (&value.required_mix).into(), + count_types: value.count_types, + reagents: value + .reagents + .iter() + .filter_map(|(key, val)| { + if *val == 0.0 { + None + } else { + Some((key.clone(), *val)) + } + }) + .collect(), + } + } +} + +impl From<&stationpedia::RecipeTemperature> for RecipeRange { + fn from(value: &stationpedia::RecipeTemperature) -> Self { + RecipeRange { + start: value.start, + stop: value.stop, + is_valid: value.is_valid, + } + } +} + +impl From<&stationpedia::RecipePressure> for RecipeRange { + fn from(value: &stationpedia::RecipePressure) -> Self { + RecipeRange { + start: value.start, + stop: value.stop, + is_valid: value.is_valid, + } + } +} + +impl From<&stationpedia::RecipeGasMix> for RecipeGasMix { + fn from(value: &stationpedia::RecipeGasMix) -> Self { + RecipeGasMix { + rule: value.rule, + is_any: value.is_any, + is_any_to_remove: value.is_any_to_remove, + reagents: value + .reagents + .iter() + .filter_map(|(key, val)| { + if *val == 0.0 { + None + } else { + Some((key.clone(), *val)) + } + }) + .collect(), + } + } +} diff --git a/xtask/src/generate/enums.rs b/xtask/src/generate/enums.rs index 7f38d6f..32a1d43 100644 --- a/xtask/src/generate/enums.rs +++ b/xtask/src/generate/enums.rs @@ -10,7 +10,7 @@ use std::{ use proc_macro2::{Ident, Span, TokenStream}; use quote::quote; -pub fn generate_enums( +pub fn generate( stationpedia: &crate::stationpedia::Stationpedia, enums: &crate::enums::Enums, workspace: &std::path::Path, @@ -28,14 +28,14 @@ pub fn generate_enums( .collect::>(); let mut writer = - std::io::BufWriter::new(std::fs::File::create(enums_path.join("script_enums.rs"))?); + std::io::BufWriter::new(std::fs::File::create(enums_path.join("script.rs"))?); write_repr_enum_use_header(&mut writer)?; for enm in enums.script_enums.values() { write_enum_listing(&mut writer, enm)?; } let mut writer = - std::io::BufWriter::new(std::fs::File::create(enums_path.join("basic_enums.rs"))?); + std::io::BufWriter::new(std::fs::File::create(enums_path.join("basic.rs"))?); write_repr_enum_use_header(&mut writer)?; let script_enums_in_basic = enums .script_enums @@ -75,8 +75,8 @@ pub fn generate_enums( write_repr_enum(&mut writer, "StationpediaPrefab", &prefabs, true)?; Ok(vec![ - enums_path.join("script_enums.rs"), - enums_path.join("basic_enums.rs"), + enums_path.join("script.rs"), + enums_path.join("basic.rs"), enums_path.join("prefabs.rs"), ]) } @@ -116,7 +116,7 @@ fn write_enum_aggragate_mod( }; let display_pat = format!("{name}{display_sep}{{}}"); let name: TokenStream = if name == "_unnamed" { - "".to_string() + String::new() } else { name.clone() } @@ -236,7 +236,7 @@ pub fn write_enum_listing( let variant = ReprEnumVariant { value: var.value as u8, deprecated: var.deprecated, - props: vec![("docs".to_owned(), var.description.to_owned())], + props: vec![("docs".to_owned(), var.description.clone())], }; (n.clone(), variant) }) @@ -255,7 +255,7 @@ pub fn write_enum_listing( let variant = ReprEnumVariant { value: var.value as u16, deprecated: var.deprecated, - props: vec![("docs".to_owned(), var.description.to_owned())], + props: vec![("docs".to_owned(), var.description.clone())], }; (n.clone(), variant) }) @@ -269,7 +269,7 @@ pub fn write_enum_listing( let variant = ReprEnumVariant { value: var.value as u32, deprecated: var.deprecated, - props: vec![("docs".to_owned(), var.description.to_owned())], + props: vec![("docs".to_owned(), var.description.clone())], }; (n.clone(), variant) }) @@ -283,7 +283,7 @@ pub fn write_enum_listing( let variant = ReprEnumVariant { value: var.value as i32, deprecated: var.deprecated, - props: vec![("docs".to_owned(), var.description.to_owned())], + props: vec![("docs".to_owned(), var.description.clone())], }; (n.clone(), variant) }) @@ -297,7 +297,7 @@ pub fn write_enum_listing( let variant = ReprEnumVariant { value: var.value as i32, deprecated: var.deprecated, - props: vec![("docs".to_owned(), var.description.to_owned())], + props: vec![("docs".to_owned(), var.description.clone())], }; (n.clone(), variant) }) @@ -344,7 +344,7 @@ fn write_repr_basic_use_header( write!( writer, "{}", - quote! {use super::script_enums::{ #(#enums),*};}, + quote! {use super::script::{ #(#enums),*};}, )?; Ok(()) } diff --git a/xtask/src/stationpedia.rs b/xtask/src/stationpedia.rs index c17c25c..ccbb353 100644 --- a/xtask/src/stationpedia.rs +++ b/xtask/src/stationpedia.rs @@ -1,5 +1,6 @@ use serde_derive::{Deserialize, Serialize}; use serde_with::{serde_as, DisplayFromStr}; +use stationeers_data::enums::MachineTier; use std::collections::BTreeMap; #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -132,15 +133,6 @@ pub struct BuildState { pub machine_tier: Option, } -#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] -pub enum MachineTier { - Undefined, - TierOne, - TierTwo, - TierThree, - Max, -} - #[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)] pub struct Tool { #[serde(rename = "IsTool", default)] @@ -354,7 +346,7 @@ pub struct Device { #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Fabricator { #[serde(rename = "Tier")] - tier: u32, + pub tier: u32, #[serde(rename = "TierName")] pub tier_name: String, #[serde(rename = "Recipes", default)]