]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
move lathe recipes into packs (easier for forks and maintaining) (#33095)
authordeltanedas <39013340+deltanedas@users.noreply.github.com>
Fri, 7 Feb 2025 18:22:49 +0000 (18:22 +0000)
committerGitHub <noreply@github.com>
Fri, 7 Feb 2025 18:22:49 +0000 (19:22 +0100)
* add LatheRecipePackPrototype

* change Lathe and EmagLathe to use packs

* add AddRecipesFromPacks helper to SharedLatheSystem

* update lathe logic to work with packs and clean up some stuff

* migrate individual recipes to recipe packs

* update client

* remove node/artifact scanner from techs

* :trollface:

* fix test and make it include emag recipes

* add test that every dynamic recipe must be researched

* pro

* fix

* fix

* fix all tests, genuinely good test i wonder who made it

* add unused uranium and incendiary drozd mags to tech and lathe

* add recipes

* add incendiary prototype

* undo some changes

* troll

* :trollface:

* true

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
* shitmed real

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
* update funny test

* :trollface:

* :trollface:

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
28 files changed:
Content.Client/Lathe/UI/LatheMenu.xaml.cs
Content.IntegrationTests/Tests/Lathe/LatheTest.cs
Content.IntegrationTests/Tests/ResearchTest.cs
Content.Server/Lathe/LatheSystem.cs
Content.Shared/Lathe/EmagLatheComponent.cs
Content.Shared/Lathe/LatheComponent.cs
Content.Shared/Lathe/Prototypes/LatheRecipePackPrototype.cs [new file with mode: 0644]
Content.Shared/Lathe/SharedLatheSystem.cs
Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml
Resources/Prototypes/Entities/Structures/Machines/lathe.yml
Resources/Prototypes/Recipes/Lathes/Packs/animal_cubes.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/bedsheets.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/biogen.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/cargo.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/engineering.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/medical.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/ore.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/robotics.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/science.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/security.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/service.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/shared.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/sheetifier.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/tiles.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/security.yml
Resources/Prototypes/Research/arsenal.yml
Resources/Prototypes/Research/experimental.yml

index 02464d22e124c534b80fa67302410bf750ffb30c..fa99a9dd8ebf20dc0db045eb0669391f0531a5c3 100644 (file)
@@ -64,7 +64,7 @@ public sealed partial class LatheMenu : DefaultWindow
 
         if (_entityManager.TryGetComponent<LatheComponent>(Entity, out var latheComponent))
         {
-            if (!latheComponent.DynamicRecipes.Any())
+            if (!latheComponent.DynamicPacks.Any())
             {
                 ServerListButton.Visible = false;
             }
index 88aece967b75db28fe602a6ce49ec0d05dde53e9..2fe347f6362303a3c744b82b265c8be154c35f02 100644 (file)
@@ -26,6 +26,7 @@ public sealed class LatheTest
         var compFactory = server.ResolveDependency<IComponentFactory>();
         var materialStorageSystem = server.System<SharedMaterialStorageSystem>();
         var whitelistSystem = server.System<EntityWhitelistSystem>();
+        var latheSystem = server.System<SharedLatheSystem>();
 
         await server.WaitAssertion(() =>
         {
@@ -74,14 +75,14 @@ public sealed class LatheTest
                         }
                     }
 
-                    // Collect all the recipes assigned to this lathe
-                    var recipes = new List<ProtoId<LatheRecipePrototype>>();
-                    recipes.AddRange(latheComp.StaticRecipes);
-                    recipes.AddRange(latheComp.DynamicRecipes);
+                    // Collect all possible recipes assigned to this lathe
+                    var recipes = new HashSet<ProtoId<LatheRecipePrototype>>();
+                    latheSystem.AddRecipesFromPacks(recipes, latheComp.StaticPacks);
+                    latheSystem.AddRecipesFromPacks(recipes, latheComp.DynamicPacks);
                     if (latheProto.TryGetComponent<EmagLatheRecipesComponent>(out var emagRecipesComp, compFactory))
                     {
-                        recipes.AddRange(emagRecipesComp.EmagStaticRecipes);
-                        recipes.AddRange(emagRecipesComp.EmagDynamicRecipes);
+                        latheSystem.AddRecipesFromPacks(recipes, emagRecipesComp.EmagStaticPacks);
+                        latheSystem.AddRecipesFromPacks(recipes, emagRecipesComp.EmagDynamicPacks);
                     }
 
                     // Check each recipe assigned to this lathe
index 7ae29a79ffd58706cd3ae0ecac8b92f9e7462bfa..4661a1ea9e163678b4d6df1fcfb6de54bde74bd3 100644 (file)
@@ -52,13 +52,16 @@ public sealed class ResearchTest
         await using var pair = await PoolManager.GetServerClient();
         var server = pair.Server;
 
+        var entMan = server.ResolveDependency<IEntityManager>();
         var protoManager = server.ResolveDependency<IPrototypeManager>();
         var compFact = server.ResolveDependency<IComponentFactory>();
 
+        var latheSys = entMan.System<SharedLatheSystem>();
+
         await server.WaitAssertion(() =>
         {
             var allEnts = protoManager.EnumeratePrototypes<EntityPrototype>();
-            var allLathes = new HashSet<LatheComponent>();
+            var latheTechs = new HashSet<ProtoId<LatheRecipePrototype>>();
             foreach (var proto in allEnts)
             {
                 if (proto.Abstract)
@@ -69,30 +72,31 @@ public sealed class ResearchTest
 
                 if (!proto.TryGetComponent<LatheComponent>(out var lathe, compFact))
                     continue;
-                allLathes.Add(lathe);
-            }
 
-            var latheTechs = new HashSet<string>();
-            foreach (var lathe in allLathes)
-            {
-                if (lathe.DynamicRecipes == null)
-                    continue;
+                latheSys.AddRecipesFromPacks(latheTechs, lathe.DynamicPacks);
 
-                foreach (var recipe in lathe.DynamicRecipes)
-                {
-                    latheTechs.Add(recipe);
-                }
+                if (proto.TryGetComponent<EmagLatheRecipesComponent>(out var emag, compFact))
+                    latheSys.AddRecipesFromPacks(latheTechs, emag.EmagDynamicPacks);
             }
 
             Assert.Multiple(() =>
             {
+                // check that every recipe a tech adds can be made on some lathe
+                var unlockedTechs = new HashSet<ProtoId<LatheRecipePrototype>>();
                 foreach (var tech in protoManager.EnumeratePrototypes<TechnologyPrototype>())
                 {
+                    unlockedTechs.UnionWith(tech.RecipeUnlocks);
                     foreach (var recipe in tech.RecipeUnlocks)
                     {
-                        Assert.That(latheTechs, Does.Contain(recipe), $"Recipe \"{recipe}\" cannot be unlocked on any lathes.");
+                        Assert.That(latheTechs, Does.Contain(recipe), $"Recipe '{recipe}' from tech '{tech.ID}' cannot be unlocked on any lathes.");
                     }
                 }
+
+                // now check that every dynamic recipe a lathe lists can be unlocked
+                foreach (var recipe in latheTechs)
+                {
+                    Assert.That(unlockedTechs, Does.Contain(recipe), $"Recipe '{recipe}' is dynamic on a lathe but cannot be unlocked by research.");
+                }
             });
         });
 
index ba82e65aa79ac473b65119eaaa1743246e87ac28..68a5228bdfccb4ea1f209e165a5c0f2869ea0d55 100644 (file)
@@ -19,6 +19,7 @@ using Content.Shared.Emag.Components;
 using Content.Shared.Emag.Systems;
 using Content.Shared.Examine;
 using Content.Shared.Lathe;
+using Content.Shared.Lathe.Prototypes;
 using Content.Shared.Materials;
 using Content.Shared.Power;
 using Content.Shared.ReagentSpeed;
@@ -57,6 +58,7 @@ namespace Content.Server.Lathe
         /// Per-tick cache
         /// </summary>
         private readonly List<GasMixture> _environments = new();
+        private readonly HashSet<ProtoId<LatheRecipePrototype>> _availableRecipes = new();
 
         public override void Initialize()
         {
@@ -156,19 +158,16 @@ namespace Content.Server.Lathe
 
         public List<ProtoId<LatheRecipePrototype>> GetAvailableRecipes(EntityUid uid, LatheComponent component, bool getUnavailable = false)
         {
+            _availableRecipes.Clear();
+            AddRecipesFromPacks(_availableRecipes, component.StaticPacks);
             var ev = new LatheGetRecipesEvent(uid, getUnavailable)
             {
-                Recipes = new HashSet<ProtoId<LatheRecipePrototype>>(component.StaticRecipes)
+                Recipes = _availableRecipes
             };
             RaiseLocalEvent(uid, ev);
             return ev.Recipes.ToList();
         }
 
-        public static List<ProtoId<LatheRecipePrototype>> GetAllBaseRecipes(LatheComponent component)
-        {
-            return component.StaticRecipes.Union(component.DynamicRecipes).ToList();
-        }
-
         public bool TryAddToQueue(EntityUid uid, LatheRecipePrototype recipe, LatheComponent? component = null)
         {
             if (!Resolve(uid, ref component))
@@ -277,35 +276,42 @@ namespace Content.Server.Lathe
             _uiSys.SetUiState(uid, LatheUiKey.Key, state);
         }
 
+        /// <summary>
+        /// Adds every unlocked recipe from each pack to the recipes list.
+        /// </summary>
+        public void AddRecipesFromDynamicPacks(ref LatheGetRecipesEvent args, TechnologyDatabaseComponent database, IEnumerable<ProtoId<LatheRecipePackPrototype>> packs)
+        {
+            foreach (var id in packs)
+            {
+                var pack = _proto.Index(id);
+                foreach (var recipe in pack.Recipes)
+                {
+                    if (args.getUnavailable || database.UnlockedRecipes.Contains(recipe))
+                        args.Recipes.Add(recipe);
+                }
+            }
+        }
+
         private void OnGetRecipes(EntityUid uid, TechnologyDatabaseComponent component, LatheGetRecipesEvent args)
         {
             if (uid != args.Lathe || !TryComp<LatheComponent>(uid, out var latheComponent))
                 return;
 
-            foreach (var recipe in latheComponent.DynamicRecipes)
-            {
-                if (!(args.getUnavailable || component.UnlockedRecipes.Contains(recipe)) || args.Recipes.Contains(recipe))
-                    continue;
-                args.Recipes.Add(recipe);
-            }
+            AddRecipesFromDynamicPacks(ref args, component, latheComponent.DynamicPacks);
         }
 
         private void GetEmagLatheRecipes(EntityUid uid, EmagLatheRecipesComponent component, LatheGetRecipesEvent args)
         {
-            if (uid != args.Lathe || !TryComp<TechnologyDatabaseComponent>(uid, out var technologyDatabase))
+            if (uid != args.Lathe)
                 return;
+
             if (!args.getUnavailable && !_emag.CheckFlag(uid, EmagType.Interaction))
                 return;
-            foreach (var recipe in component.EmagDynamicRecipes)
-            {
-                if (!(args.getUnavailable || technologyDatabase.UnlockedRecipes.Contains(recipe)) || args.Recipes.Contains(recipe))
-                    continue;
-                args.Recipes.Add(recipe);
-            }
-            foreach (var recipe in component.EmagStaticRecipes)
-            {
-                args.Recipes.Add(recipe);
-            }
+
+            AddRecipesFromPacks(args.Recipes, component.EmagStaticPacks);
+
+            if (TryComp<TechnologyDatabaseComponent>(uid, out var database))
+                AddRecipesFromDynamicPacks(ref args, database, component.EmagDynamicPacks);
         }
 
         private void OnHeatStartPrinting(EntityUid uid, LatheHeatProducingComponent component, LatheStartPrintingEvent args)
index 9fe53c8d4932cddee010f3624fc97ba31e7de70a..672748308c282f2f8f6bd28ad8eebb32a072f034 100644 (file)
@@ -1,4 +1,4 @@
-using Content.Shared.Research.Prototypes;
+using Content.Shared.Lathe.Prototypes;
 using Robust.Shared.GameStates;
 using Robust.Shared.Prototypes;
 using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
@@ -9,15 +9,15 @@ namespace Content.Shared.Lathe
     public sealed partial class EmagLatheRecipesComponent : Component
     {
         /// <summary>
-        /// All of the dynamic recipes that the lathe is capable to get using EMAG
+        /// All of the dynamic recipe packs that the lathe is capable to get using EMAG
         /// </summary>
         [DataField, AutoNetworkedField]
-        public List<ProtoId<LatheRecipePrototype>> EmagDynamicRecipes = new();
+        public List<ProtoId<LatheRecipePackPrototype>> EmagDynamicPacks = new();
 
         /// <summary>
-        /// All of the static recipes that the lathe is capable to get using EMAG
+        /// All of the static recipe packs that the lathe is capable to get using EMAG
         /// </summary>
         [DataField, AutoNetworkedField]
-        public List<ProtoId<LatheRecipePrototype>> EmagStaticRecipes = new();
+        public List<ProtoId<LatheRecipePackPrototype>> EmagStaticPacks = new();
     }
 }
index de4311e5595c15772595debc9c25b4468050fbb3..aaf273e0fe947a0916a1c9fac398087170a46c89 100644 (file)
@@ -1,4 +1,5 @@
 using Content.Shared.Construction.Prototypes;
+using Content.Shared.Lathe.Prototypes;
 using Content.Shared.Research.Prototypes;
 using Robust.Shared.Audio;
 using Robust.Shared.GameStates;
@@ -10,16 +11,16 @@ namespace Content.Shared.Lathe
     public sealed partial class LatheComponent : Component
     {
         /// <summary>
-        /// All of the recipes that the lathe has by default
+        /// All of the recipe packs that the lathe has by default
         /// </summary>
         [DataField]
-        public List<ProtoId<LatheRecipePrototype>> StaticRecipes = new();
+        public List<ProtoId<LatheRecipePackPrototype>> StaticPacks = new();
 
         /// <summary>
-        /// All of the recipes that the lathe is capable of researching
+        /// All of the recipe packs that the lathe is capable of researching
         /// </summary>
         [DataField]
-        public List<ProtoId<LatheRecipePrototype>> DynamicRecipes = new();
+        public List<ProtoId<LatheRecipePackPrototype>> DynamicPacks = new();
 
         /// <summary>
         /// The lathe's construction queue
diff --git a/Content.Shared/Lathe/Prototypes/LatheRecipePackPrototype.cs b/Content.Shared/Lathe/Prototypes/LatheRecipePackPrototype.cs
new file mode 100644 (file)
index 0000000..ada880f
--- /dev/null
@@ -0,0 +1,31 @@
+using Content.Shared.Research.Prototypes;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array;
+
+namespace Content.Shared.Lathe.Prototypes;
+
+/// <summary>
+/// A pack of lathe recipes that one or more lathes can use.
+/// Packs will inherit the parents recipes when using inheritance, so you don't need to copy paste them.
+/// </summary>
+[Prototype]
+public sealed partial class LatheRecipePackPrototype : IPrototype, IInheritingPrototype
+{
+    [ViewVariables]
+    [IdDataField]
+    public string ID { get; private set; } = default!;
+
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<LatheRecipePackPrototype>))]
+    public string[]? Parents { get; }
+
+    [NeverPushInheritance]
+    [AbstractDataField]
+    public bool Abstract { get; }
+
+    /// <summary>
+    /// The lathe recipes contained by this pack.
+    /// </summary>
+    [DataField(required: true)]
+    [AlwaysPushInheritance]
+    public HashSet<ProtoId<LatheRecipePrototype>> Recipes = new();
+}
index 7328787f25ef71d3ef8c538dd750ffa2a4af895b..ae5519d16c4dd5c37180e64f8e90b131e1a11925 100644 (file)
@@ -2,6 +2,7 @@ using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using Content.Shared.Emag.Systems;
 using Content.Shared.Examine;
+using Content.Shared.Lathe.Prototypes;
 using Content.Shared.Localizations;
 using Content.Shared.Materials;
 using Content.Shared.Research.Prototypes;
@@ -33,6 +34,18 @@ public abstract class SharedLatheSystem : EntitySystem
         BuildInverseRecipeDictionary();
     }
 
+    /// <summary>
+    /// Add every recipe in the list of recipe packs to a single hashset.
+    /// </summary>
+    public void AddRecipesFromPacks(HashSet<ProtoId<LatheRecipePrototype>> recipes, IEnumerable<ProtoId<LatheRecipePackPrototype>> packs)
+    {
+        foreach (var id in packs)
+        {
+            var pack = _proto.Index(id);
+            recipes.UnionWith(pack.Recipes);
+        }
+    }
+
     private void OnExamined(Entity<LatheComponent> ent, ref ExaminedEvent args)
     {
         if (!args.IsInDetailsRange)
index 1853962544576f59cfd7c983adb9f1a31832110c..b554a15a98b283966315c63eea9a48a639c90d7d 100644 (file)
       map: ["enum.GunVisualLayers.Base"]
     - state: mag-1
       map: ["enum.GunVisualLayers.Mag"]
+
+- type: entity
+  parent: BaseMagazinePistolSubMachineGun
+  id: MagazinePistolSubMachineGunIncendiary
+  name: SMG magazine (.35 auto incendiary)
+  components:
+  - type: BallisticAmmoProvider
+    proto: CartridgePistolIncendiary
index a3cb8c014c2e5912a393e2254fed5dbb2d67e032..2616effd47ce31c8a505a52b74c1d0dfa22e7d0c 100644 (file)
     runningState: building
     unlitIdleState: unlit
     unlitRunningState: unlit-building
-    staticRecipes:
-      - Wirecutter
-      - Igniter
-      - Signaller
-      - Screwdriver
-      - Welder
-      - Wrench
-      - CrowbarGreen
-      - Multitool
-      - NetworkConfigurator
-      - SprayPainter
-      - FlashlightLantern
-      - CableStack
-      - CableMVStack
-      - CableHVStack
-      - HandheldGPSBasic
-      - TRayScanner
-      - AirTank
-      - GasAnalyzer
-      - UtilityBelt
-      - Pickaxe
-      - ModularReceiver
-      - AppraisalTool
-      - SheetRGlass
-      - Beaker
-      - Syringe
-      - HandLabeler
-      - LightTube
-      - LedLightTube
-      - SodiumLightTube
-      - ExteriorLightTube
-      - LightBulb
-      - LedLightBulb
-      - DimLightBulb
-      - WarmLightBulb
-      - Bucket
-      - DrinkMug
-      - DrinkMugMetal
-      - DrinkGlass
-      - DrinkShotGlass
-      - DrinkGlassCoupeShaped
-      - CustomDrinkJug
-      - FoodPlate
-      - FoodPlateSmall
-      - FoodPlatePlastic
-      - FoodPlateSmallPlastic
-      - FoodBowlBig
-      - FoodPlateTin
-      - FoodPlateMuffinTin
-      - FoodKebabSkewer
-      - SprayBottle
-      - MopItem
-      - Holoprojector
-      - Mousetrap
-      - LightReplacer
-      - TrashBag
-      - PowerCellSmall
-      - PowerCellMedium
-      - RollerBedSpawnFolded
-      - CheapRollerBedSpawnFolded
-      - EmergencyRollerBedSpawnFolded
-      - MicroManipulatorStockPart
-      - MatterBinStockPart
-      - CapacitorStockPart
-      - ConveyorBeltAssembly
-      - IntercomElectronics
-      - FirelockElectronics
-      - DoorElectronics
-      - AirAlarmElectronics
-      - StationMapElectronics
-      - FireAlarmElectronics
-      - MailingUnitElectronics
-      - SignalTimerElectronics
-      - APCElectronics
-      - SMESMachineCircuitboard
-      - SubstationMachineCircuitboard
-      - WallmountSubstationElectronics
-      - CellRechargerCircuitboard
-      - WeaponCapacitorRechargerCircuitboard
-      - HandheldStationMap
-      - ClothingHeadHatWelding
-      - WetFloorSign
-      - ClothingHeadHatCone
-      - FreezerElectronics
+    staticPacks:
+    - ToolsStatic
+    - PartsStatic
+    - AtmosStatic
+    - CablesStatic
+    - CargoStatic
+    - MaterialsStatic
+    - BasicChemistryStatic
+    - RollerBedsStatic
+    - LightsStatic
+    - ServiceStatic
+    - PowerCellsStatic
+    - ElectronicsStatic
   - type: EmagLatheRecipes
-    emagStaticRecipes:
-      - BoxLethalshot
-      - BoxShotgunSlug
-      - CombatKnife
-      - MagazineBoxLightRifle
-      - MagazineBoxMagnum
-      - MagazineBoxPistol
-      - MagazineBoxRifle
-      - MagazineLightRifle
-      - MagazineLightRifleEmpty
-      - MagazinePistol
-      - MagazinePistolEmpty
-      - MagazinePistolSubMachineGun
-      - MagazinePistolSubMachineGunEmpty
-      - MagazinePistolSubMachineGunTopMounted
-      - MagazinePistolSubMachineGunTopMountedEmpty
-      - MagazineRifle
-      - MagazineRifleEmpty
-      - MagazineShotgun
-      - MagazineShotgunEmpty
-      - MagazineShotgunSlug
-      - RiotShield
-      - SpeedLoaderMagnum
-      - SpeedLoaderMagnumEmpty
+    emagStaticPacks:
+    - SecurityAmmoStatic
+    - SecurityWeaponsStatic
   - type: BlueprintReceiver
     whitelist:
       tags:
     runningState: building
     unlitIdleState: unlit
     unlitRunningState: unlit-building
-    staticRecipes:
-    - LargeBeaker
-    - Dropper
-    - ClothingEyesGlassesChemical
-    dynamicRecipes:
-      - PowerDrill
-      - MiningDrill
-      - MiningDrillDiamond
-      - AnomalyScanner
-      - AnomalyLocator
-      - AnomalyLocatorWide
-      - Scalpel
-      - Retractor
-      - Cautery
-      - Drill
-      - WeaponParticleDecelerator
-      - HoloprojectorField
-      - Saw
-      - Hemostat
-      - CryostasisBeaker
-      - SyringeCryostasis
-      - Syringe
-      - Implanter
-      - PillCanister
-      - ChemistryEmptyBottle01
-      - AdvMopItem
-      - WeaponSprayNozzle
-      - ClothingBackpackWaterTank
-      - MegaSprayBottle
-      - TimerTrigger
-      - ChemicalPayload
-      - FlashPayload
-      - Signaller
-      - SignallerAdvanced
-      - SignalTrigger
-      - VoiceTrigger
-      - Igniter
-      - HandHeldMassScanner
-      - PowerCellMicroreactor
-      - PowerCellHigh
-      - WeaponPistolCHIMP
-      - ClothingMaskWeldingGas
-      - MineralScannerEmpty
-      - AdvancedMineralScannerEmpty
-      - WeaponGauntletGorilla
-      - SynthesizerInstrument
-      - ClothingShoesBootsMagSci
-      - ClothingShoesBootsMoon
-      - ClothingShoesBootsSpeed
-      - NodeScanner
-      - HolofanProjector
-      - BluespaceBeaker
-      - SyringeBluespace
-      - WeaponForceGun
-      - WeaponLaserSvalinn
-      - WeaponProtoKineticAccelerator
-      - WeaponTetherGun
-      - ClothingBackpackHolding
-      - ClothingBackpackSatchelHolding
-      - ClothingBackpackDuffelHolding
-      - WelderExperimental
-      - JawsOfLife
-      - FauxTileAstroGrass
-      - FauxTileMowedAstroGrass
-      - FauxTileJungleAstroGrass
-      - FauxTileAstroIce
-      - FauxTileAstroSnow
-      - FauxTileAstroAsteroidSand
-      - OreBagOfHolding
-      - DeviceQuantumSpinInverter
+    staticPacks:
+    - ChemistryStatic
+    - SurgeryStatic
+    dynamicPacks:
+    - AdvancedTools
+    - ScienceEquipment
+    - ScienceClothing
+    - PowerCells
+    - ScienceWeapons
+    - Mining
+    - AtmosTools
+    - EngineeringWeapons
+    - Chemistry
+    - Janitor
+    - Instruments
+    - Equipment
+    - FauxTiles
   - type: EmagLatheRecipes
-    emagDynamicRecipes:
-      - BoxBeanbag
-      - BoxShotgunIncendiary
-      - BoxShotgunUranium
-      - BoxShellTranquilizer
-      - ExplosivePayload
-      - GrenadeBlast
-      - GrenadeEMP
-      - GrenadeFlash
-      - HoloprojectorSecurity
-      - MagazineBoxLightRifleIncendiary
-      - MagazineBoxLightRifleUranium
-      - MagazineBoxMagnumIncendiary
-      - MagazineBoxMagnumUranium
-      - MagazineBoxPistolIncendiary
-      - MagazineBoxPistolUranium
-      - MagazineBoxRifleIncendiary
-      - MagazineBoxRifleUranium
-      - MagazineGrenadeEmpty
-      - MagazineLightRifleIncendiary
-      - MagazineLightRifleUranium
-      - MagazinePistolIncendiary
-      - MagazinePistolUranium
-      - MagazineRifleIncendiary
-      - MagazineRifleUranium
-      - MagazineShotgunBeanbag
-      - MagazineShotgunIncendiary
-      - MagazineShotgunIncendiary
-      - PortableRecharger
-      - PowerCageHigh
-      - PowerCageMedium
-      - PowerCageSmall
-      - SpeedLoaderMagnumIncendiary
-      - SpeedLoaderMagnumUranium
-      - TelescopicShield
-      - Truncheon
-      - WeaponAdvancedLaser
-      - WeaponLaserCannon
-      - WeaponLaserCarbine
-      - WeaponXrayCannon
+    emagDynamicPacks:
+    - SecurityAmmo
+    - SecurityExplosives
+    - SecurityEquipment
+    - SecurityWeapons
 
 - type: entity
   id: ProtolatheHyperConvection
     producingSound: /Audio/Machines/circuitprinter.ogg
     idleState: icon
     runningState: building
-    staticRecipes:
-    - ProtolatheMachineCircuitboard
-    - AutolatheMachineCircuitboard
-    - CircuitImprinterMachineCircuitboard
-    - BiogeneratorMachineCircuitboard
-    - OreProcessorMachineCircuitboard
-    - ElectrolysisUnitMachineCircuitboard
-    - CentrifugeMachineCircuitboard
-    - ChemDispenserMachineCircuitboard
-    - ChemMasterMachineCircuitboard
-    - CondenserMachineCircuitBoard
-    - HotplateMachineCircuitboard
-    - UniformPrinterMachineCircuitboard
-    - FloorGreenCircuit
-    - FloorBlueCircuit
-    - FloorRedCircuit
-    - MicrowaveMachineCircuitboard
-    - ReagentGrinderMachineCircuitboard
-    - ElectricGrillMachineCircuitboard
-    - BoozeDispenserMachineCircuitboard
-    - SodaDispenserMachineCircuitboard
-    - SpaceHeaterMachineCircuitBoard
-    - CutterMachineCircuitboard
-    - SalvageMagnetMachineCircuitboard
-    - BorgChargerCircuitboard
-    dynamicRecipes:
-      - ThermomachineFreezerMachineCircuitBoard
-      - HellfireFreezerMachineCircuitBoard
-      - PortableScrubberMachineCircuitBoard
-      - CloningPodMachineCircuitboard
-      - MedicalScannerMachineCircuitboard
-      - CryoPodMachineCircuitboard
-      - VaccinatorMachineCircuitboard
-      - DiagnoserMachineCircuitboard
-      - BiomassReclaimerMachineCircuitboard
-      - BiofabricatorMachineCircuitboard
-      - SurveillanceCameraRouterCircuitboard
-      - SurveillanceCameraMonitorCircuitboard
-      - SurveillanceWirelessCameraMonitorCircuitboard
-      - SurveillanceCameraWirelessRouterCircuitboard
-      - ComputerTelevisionCircuitboard
-      - SurveillanceWirelessCameraMovableCircuitboard
-      - SurveillanceWirelessCameraAnchoredCircuitboard
-      - HydroponicsTrayMachineCircuitboard
-      - SolarControlComputerCircuitboard
-      - SolarTrackerElectronics
-      - TurboItemRechargerCircuitboard
-      - AutolatheHyperConvectionMachineCircuitboard
-      - ProtolatheHyperConvectionMachineCircuitboard
-      - CircuitImprinterHyperConvectionMachineCircuitboard
-      - FatExtractorMachineCircuitboard
-      - FlatpackerMachineCircuitboard
-      - SheetifierMachineCircuitboard
-      - ShuttleConsoleCircuitboard
-      - RadarConsoleCircuitboard
-      - TechDiskComputerCircuitboard
-      - DawInstrumentMachineCircuitboard
-      - CloningConsoleComputerCircuitboard
-      - StasisBedMachineCircuitboard
-      - OreProcessorIndustrialMachineCircuitboard
-      - CargoTelepadMachineCircuitboard
-      - RipleyCentralElectronics
-      - RipleyPeripheralsElectronics
-      - HonkerCentralElectronics
-      - HonkerPeripheralsElectronics
-      - HonkerTargetingElectronics
-      - HamtrCentralElectronics
-      - HamtrPeripheralsElectronics
-      - PortableGeneratorPacmanMachineCircuitboard
-      - PortableGeneratorSuperPacmanMachineCircuitboard
-      - PortableGeneratorJrPacmanMachineCircuitboard
-      - WallmountSubstationElectronics
-      - PowerCageRechargerCircuitboard
-      - EmitterCircuitboard
-      - ThrusterMachineCircuitboard
-      - GyroscopeMachineCircuitboard
-      - MiniGravityGeneratorCircuitboard
-      - ShuttleGunKineticCircuitboard
-      - GasRecyclerMachineCircuitboard
-      - SeedExtractorMachineCircuitboard
-      - AnalysisComputerCircuitboard
-      - ExosuitFabricatorMachineCircuitboard
-      - AnomalyVesselCircuitboard
-      - AnomalyVesselExperimentalCircuitboard
-      - AnomalySynchronizerCircuitboard
-      - APECircuitboard
-      - ArtifactAnalyzerMachineCircuitboard
-      - ArtifactCrusherMachineCircuitboard
-      - TelecomServerCircuitboard
-      - MassMediaCircuitboard
-      - ReagentGrinderIndustrialMachineCircuitboard
-      - JukeboxCircuitBoard
-      - SMESAdvancedMachineCircuitboard
-      - HolopadMachineCircuitboard
+    staticPacks:
+    - ScienceBoardsStatic
+    - ServiceBoardsStatic
+    - CargoBoardsStatic
+    - MedicalBoardsStatic
+    - EngineeringBoardsStatic
+    - CircuitFloorsStatic
+    dynamicPacks:
+    - EngineeringBoards
+    - CargoBoards
+    - MedicalBoards
+    - ServiceBoards
+    - ScienceBoards
+    - CameraBoards
+    - MechBoards
+    - ShuttleBoards
   - type: EmagLatheRecipes
-    emagDynamicRecipes:
-      - ShuttleGunDusterCircuitboard
-      - ShuttleGunFriendshipCircuitboard
-      - ShuttleGunPerforatorCircuitboard
-      - ShuttleGunSvalinnMachineGunCircuitboard
+    emagDynamicPacks:
+    - SecurityBoards
   - type: MaterialStorage
     whitelist:
       tags:
   - type: Lathe
     idleState: fab-idle
     runningState: fab-active
-    staticRecipes:
-    - MMI
-    - PositronicBrain
-    - SciFlash
-    - BorgModuleCable
-    - BorgModuleFireExtinguisher
-    - BorgModuleRadiationDetection
-    - BorgModuleTool
-    - CyborgEndoskeleton
-    - LeftArmBorg
-    - RightArmBorg
-    - LeftLegBorg
-    - RightLegBorg
-    - LightHeadBorg
-    - TorsoBorg
-    dynamicRecipes:
-    - ProximitySensor
-    - BorgModuleAdvancedCleaning
-    - BorgModuleAdvancedTool
-    - BorgModuleGPS
-    - BorgModuleArtifact
-    - BorgModuleAnomaly
-    - BorgModuleGardening
-    - BorgModuleHarvesting
-    - BorgModuleDefibrillator
-    - BorgModuleAdvancedTreatment
-    - RipleyHarness
-    - RipleyLArm
-    - RipleyRArm
-    - RipleyLLeg
-    - RipleyRLeg
-    - MechEquipmentGrabber
-    - HonkerHarness
-    - HonkerLArm
-    - HonkerRArm
-    - HonkerLLeg
-    - HonkerRLeg
-    - MechEquipmentHorn
-    - MechEquipmentGrabberSmall
-    - HamtrHarness
-    - HamtrLArm
-    - HamtrRArm
-    - HamtrLLeg
-    - HamtrRLeg
-    - VimHarness
+    staticPacks:
+    - RoboticsStatic
+    - BorgModulesStatic
+    - BorgLimbsStatic
+    dynamicPacks:
+    - Robotics
+    - BorgModules
+    - MechParts
+    - MechEquipment
   - type: MaterialStorage
     whitelist:
       tags:
   - type: Lathe
     idleState: icon
     runningState: building
-    staticRecipes:
-    - MonkeyCube
-    - KoboldCube
-    - CowCube
-    - GoatCube
-    - MothroachCube
-    - MouseCube
-    - CockroachCube
+    staticPacks:
+    - FriendlyCubesStatic
   - type: EmagLatheRecipes
-    emagStaticRecipes:
-    - AbominationCube
-    - SpaceCarpCube
-    - SpaceTickCube
+    emagStaticPacks:
+    - HostileCubesStatic
 
 - type: entity
   id: SecurityTechFab
   - type: Lathe
     idleState: icon
     runningState: icon
-    staticRecipes:
-      - BoxLethalshot
-      - BoxShotgunPractice
-      - BoxShotgunSlug
-      - ClothingEyesHudSecurity
-      - CombatKnife
-      - Flash
-      - ForensicPad
-      - Handcuffs
-      - MagazineBoxLightRifle
-      - MagazineBoxLightRiflePractice
-      - MagazineBoxMagnum
-      - MagazineBoxMagnumPractice
-      - MagazineBoxPistol
-      - MagazineBoxPistolPractice
-      - MagazineBoxRifle
-      - MagazineBoxRiflePractice
-      - MagazineLightRifle
-      - MagazineLightRifleEmpty
-      - MagazinePistol
-      - MagazinePistolEmpty
-      - MagazinePistolSubMachineGun
-      - MagazinePistolSubMachineGunEmpty
-      - MagazinePistolSubMachineGunTopMounted
-      - MagazinePistolSubMachineGunTopMountedEmpty
-      - MagazineRifle
-      - MagazineRifleEmpty
-      - MagazineShotgun
-      - MagazineShotgunEmpty
-      - MagazineShotgunSlug
-      - RiotShield
-      - SpeedLoaderMagnum
-      - SpeedLoaderMagnumEmpty
-      - Stunbaton
-      - TargetClown
-      - TargetHuman
-      - TargetSyndicate
-      - WeaponDisablerPractice
-      - WeaponFlareGunSecurity
-      - WeaponLaserCarbinePractice
-      - Zipties
-    dynamicRecipes:
-      - BoxBeanbag
-      - BoxShotgunIncendiary
-      - BoxShotgunUranium
-      - BoxShellTranquilizer
-      - ClothingBackpackElectropack
-      - ExplosivePayload
-      - FlashPayload
-      - GrenadeBlast
-      - GrenadeEMP
-      - GrenadeFlash
-      - HoloprojectorSecurity
-      - MagazineBoxLightRifleIncendiary
-      - MagazineBoxLightRifleUranium
-      - MagazineBoxMagnumIncendiary
-      - MagazineBoxMagnumUranium
-      - MagazineBoxPistolIncendiary
-      - MagazineBoxPistolUranium
-      - MagazineBoxRifleIncendiary
-      - MagazineBoxRifleUranium
-      - MagazineGrenadeEmpty
-      - MagazineLightRifleIncendiary
-      - MagazineLightRifleUranium
-      - MagazinePistolIncendiary
-      - MagazinePistolUranium
-      - MagazineRifleIncendiary
-      - MagazineRifleUranium
-      - MagazineShotgunBeanbag
-      - MagazineShotgunIncendiary
-      - PortableRecharger
-      - PowerCageHigh
-      - PowerCageMedium
-      - PowerCageSmall
-      - ShuttleGunDusterCircuitboard
-      - ShuttleGunFriendshipCircuitboard
-      - ShuttleGunPerforatorCircuitboard
-      - ShuttleGunSvalinnMachineGunCircuitboard
-      - Signaller
-      - SignalTrigger
-      - SpeedLoaderMagnumIncendiary
-      - SpeedLoaderMagnumUranium
-      - TelescopicShield
-      - TimerTrigger
-      - Truncheon
-      - VoiceTrigger
-      - WeaponAdvancedLaser
-      - WeaponDisabler
-      - WeaponDisablerSMG
-      - WeaponLaserCannon
-      - WeaponLaserCarbine
-      - WeaponXrayCannon
+    staticPacks:
+    - SecurityEquipmentStatic
+    - SecurityPracticeStatic
+    - SecurityAmmoStatic
+    - SecurityWeaponsStatic
+    dynamicPacks:
+    - SecurityEquipment
+    - SecurityBoards
+    - SecurityExplosives
+    - SecurityAmmo
+    - SecurityWeapons
   - type: MaterialStorage
     whitelist:
       tags:
     - type: Lathe
       idleState: icon
       runningState: icon
-      staticRecipes:
-        - BoxLethalshot
-        - BoxShotgunSlug
-        - BoxShellTranquilizer
-        - MagazineBoxLightRifle
-        - MagazineBoxMagnum
-        - MagazineBoxPistol
-        - MagazineBoxRifle
-        - MagazineLightRifle
-        - MagazineLightRifleEmpty
-        - MagazinePistol
-        - MagazinePistolEmpty
-        - MagazineRifle
-        - MagazineRifleEmpty
-        - MagazineShotgun
-        - MagazineShotgunEmpty
-        - MagazineShotgunSlug
-        - SpeedLoaderMagnum
-        - SpeedLoaderMagnumEmpty
+      staticPacks:
+      - SecurityAmmoStatic
     - type: MaterialStorage
       whitelist:
         tags:
   - type: Lathe
     idleState: icon
     runningState: icon
-    staticRecipes:
-      - Brutepack
-      - Ointment
-      - Gauze
-      - HandLabeler
-      - Defibrillator
-      - HandheldHealthAnalyzer
-      - ClothingHandsGlovesLatex
-      - ClothingHandsGlovesNitrile
-      - ClothingMaskSterile
-      - DiseaseSwab
-      - Beaker
-      - LargeBeaker
-      - Dropper
-      - Jug
-      - Syringe
-      - Implanter
-      - PillCanister
-      - BodyBag
-      - ChemistryEmptyBottle01
-      - RollerBedSpawnFolded
-      - CheapRollerBedSpawnFolded
-      - EmergencyRollerBedSpawnFolded
-      - Medkit
-      - MedkitBurn
-      - MedkitToxin
-      - MedkitO2
-      - MedkitBrute
-      - MedkitAdvanced
-      - MedkitRadiation
-      - MedkitCombat
-      - Scalpel
-      - Retractor
-      - Cautery
-      - Drill
-      - Saw
-      - Hemostat
-      - ClothingEyesGlassesChemical
-      - WhiteCane
-    dynamicRecipes:
-      - ChemicalPayload
-      - CryostasisBeaker
-      - BluespaceBeaker
-      - SyringeBluespace
-      - SyringeCryostasis
+    staticPacks:
+    - TopicalsStatic
+    - ChemistryStatic
+    - MedicalStatic
+    - RollerBedsStatic
+    - MedicalClothingStatic
+    - EmptyMedkitsStatic
+    - SurgeryStatic
+    dynamicPacks:
+    - Chemistry
   - type: Machine
     board: MedicalTechFabCircuitboard
   - type: StealTarget
     producingSound: /Audio/Machines/uniformprinter.ogg
     idleState: icon
     runningState: building
-    staticRecipes:
-      - ClothingUniformJumpsuitColorGrey
-      - ClothingUniformJumpskirtColorGrey
-      - ClothingUniformJumpsuitBartender
-      - ClothingUniformJumpskirtBartender
-      - ClothingHeadHatCapcap
-      - ClothingHeadHatCaptain
-      - ClothingUniformJumpsuitCaptain
-      - ClothingUniformJumpskirtCaptain
-      - ClothingUniformJumpsuitCapFormal
-      - ClothingUniformJumpskirtCapFormalDress
-      - ClothingUniformJumpsuitCargo
-      - ClothingUniformJumpskirtCargo
-      - ClothingUniformJumpsuitSalvageSpecialist
-      - ClothingHeadHatBeretEngineering
-      - ClothingUniformJumpsuitChiefEngineer
-      - ClothingUniformJumpskirtChiefEngineer
-      - ClothingUniformJumpsuitChiefEngineerTurtle
-      - ClothingUniformJumpskirtChiefEngineerTurtle
-      - ClothingUniformJumpsuitChaplain
-      - ClothingUniformJumpskirtChaplain
-      - ClothingUniformJumpsuitChef
-      - ClothingUniformJumpskirtChef
-      - ClothingUniformJumpsuitChemistry
-      - ClothingUniformJumpskirtChemistry
-      - ClothingUniformJumpsuitClown
-      - ClothingHeadHatBeretCmo
-      - ClothingUniformJumpsuitCMO
-      - ClothingUniformJumpskirtCMO
-      - ClothingUniformJumpsuitCMOTurtle
-      - ClothingUniformJumpskirtCMOTurtle
-      - ClothingUniformJumpsuitDetective
-      - ClothingUniformJumpskirtDetective
-      - ClothingUniformJumpsuitEngineering
-      - ClothingUniformJumpskirtEngineering
-      - ClothingUniformJumpsuitSeniorEngineer
-      - ClothingUniformJumpskirtSeniorEngineer
-      - ClothingHeadHatHopcap
-      - ClothingUniformJumpsuitHoP
-      - ClothingUniformJumpskirtHoP
-      - ClothingHeadHatBeretHoS
-      - ClothingHeadHatHoshat
-      - ClothingUniformJumpsuitHoS
-      - ClothingUniformJumpskirtHoS
-      - ClothingUniformJumpsuitHosFormal
-      - ClothingUniformJumpskirtHosFormal
-      - ClothingUniformJumpsuitHoSAlt
-      - ClothingUniformJumpskirtHoSAlt
-      - ClothingUniformJumpsuitHoSBlue
-      - ClothingUniformJumpsuitHoSGrey
-      - ClothingUniformJumpsuitHoSParadeMale
-      - ClothingUniformJumpskirtHoSParadeMale
-      - ClothingUniformJumpsuitHydroponics
-      - ClothingUniformJumpskirtHydroponics
-      - ClothingUniformJumpsuitJanitor
-      - ClothingUniformJumpskirtJanitor
-      - ClothingUniformJumpsuitLawyerBlack
-      - ClothingUniformJumpsuitLibrarian
-      - ClothingUniformJumpskirtColorLightBrown
-      - ClothingHeadHatBeretSeniorPhysician
-      - ClothingUniformJumpsuitMedicalDoctor
-      - ClothingUniformJumpskirtMedicalDoctor
-      - ClothingUniformJumpsuitSeniorPhysician
-      - ClothingUniformJumpskirtSeniorPhysician
-      - ClothingUniformJumpsuitMime
-      - ClothingUniformJumpskirtMime
-      - ClothingUniformJumpsuitMusician
-      - ClothingUniformJumpsuitParamedic
-      - ClothingUniformJumpskirtParamedic
-      - ClothingUniformJumpsuitSeniorOfficer
-      - ClothingUniformJumpskirtSeniorOfficer
-      - ClothingUniformJumpsuitPrisoner
-      - ClothingUniformJumpskirtPrisoner
-      - ClothingHeadHatQMsoft
-      - ClothingHeadHatBeretQM
-      - ClothingUniformJumpsuitQM
-      - ClothingUniformJumpskirtQM
-      - ClothingUniformJumpsuitQMTurtleneck
-      - ClothingUniformJumpskirtQMTurtleneck
-      - ClothingUniformJumpsuitQMFormal
-      - ClothingHeadHatBeretRND
-      - ClothingUniformJumpsuitResearchDirector
-      - ClothingUniformJumpskirtResearchDirector
-      - ClothingUniformJumpsuitScientist
-      - ClothingUniformJumpskirtScientist
-      - ClothingUniformJumpsuitSeniorResearcher
-      - ClothingUniformJumpskirtSeniorResearcher
-      - ClothingHeadHatBeretSecurity
-      - ClothingUniformJumpsuitSec
-      - ClothingUniformJumpskirtSec
-      - ClothingHeadHatBeretBrigmedic
-      - ClothingUniformJumpsuitBrigmedic
-      - ClothingUniformJumpskirtBrigmedic
-      - ClothingHeadHatBeretWarden
-      - ClothingHeadHatWarden
-      - ClothingUniformJumpsuitWarden
-      - ClothingUniformJumpskirtWarden
-      - ClothingHeadHatParamedicsoft
-      # Winter outfits
-      - ClothingOuterWinterCap
-      - ClothingOuterWinterCE
-      - ClothingOuterWinterCMO
-      - ClothingOuterWinterHoP
-      - ClothingOuterWinterHoSUnarmored
-      - ClothingOuterWinterWardenUnarmored
-      - ClothingOuterWinterQM
-      - ClothingOuterWinterRD
-      - ClothingOuterWinterMusician
-      - ClothingOuterWinterClown
-      - ClothingOuterWinterMime
-      - ClothingOuterWinterCoat
-      - ClothingOuterWinterJani
-      - ClothingOuterWinterBar
-      - ClothingOuterWinterChef
-      - ClothingOuterWinterHydro
-      - ClothingOuterWinterAtmos
-      - ClothingOuterWinterEngi
-      - ClothingOuterWinterCargo
-      - ClothingOuterWinterMiner
-      - ClothingOuterWinterMed
-      - ClothingOuterWinterPara
-      - ClothingOuterWinterChem
-      - ClothingOuterWinterGen
-      - ClothingOuterWinterViro
-      - ClothingOuterWinterSci
-      - ClothingOuterWinterRobo
-      - ClothingOuterWinterSec
-      # Ties
-      - ClothingNeckTieRed
-      - ClothingNeckTieDet
-      - ClothingNeckTieSci
-      # Scarfs - All scarfs avaible in winterdrobe
-      - ClothingNeckScarfStripedGreen
-      - ClothingNeckScarfStripedBlue
-      - ClothingNeckScarfStripedRed
-      - ClothingNeckScarfStripedBrown
-      - ClothingNeckScarfStripedLightBlue
-      - ClothingNeckScarfStripedOrange
-      - ClothingNeckScarfStripedBlack
-      - ClothingNeckScarfStripedPurple
-      # Carpets
-      - Carpet
-      - CarpetBlack
-      - CarpetPink
-      - CarpetBlue
-      - CarpetGreen
-      - CarpetOrange
-      - CarpetPurple
-      - CarpetCyan
-      - CarpetWhite
-      # Bedsheets
-      - BedsheetBlack
-      - BedsheetBlue
-      - BedsheetBrown
-      - BedsheetGreen
-      - BedsheetGrey
-      - BedsheetOrange
-      - BedsheetPurple
-      - BedsheetRed
-      - BedsheetWhite
-      - BedsheetYellow
-      - BedsheetClown
-      - BedsheetCosmos
-      - BedsheetIan
-      - BedsheetMedical
-      - BedsheetMime
-      - BedsheetNT
-      - BedsheetRainbow
-      - BedsheetBrigmedic
+    staticPacks:
+    - ClothingCivilian
+    - ClothingCargo
+    - ClothingCommand
+    - ClothingEngineering
+    - ClothingMedical
+    - ClothingScience
+    - ClothingSecurity
+    - ClothingService
+    - WinterCoats
+    - Ties
+    - Scarves
+    - Carpets
+    - Bedsheets
   - type: EmagLatheRecipes
-    emagStaticRecipes:
-      # Clothing
-      - ClothingHeadHatCentcomcap
-      - ClothingHeadHatCentcom
-      - ClothingUniformJumpsuitCentcomAgent
-      - ClothingUniformJumpsuitCentcomFormal
-      - ClothingUniformJumpskirtCentcomFormalDress
-      - ClothingUniformJumpsuitCentcomOfficer
-      - ClothingUniformJumpsuitCentcomOfficial
-      - ClothingHeadHatSyndieMAA
-      - ClothingHeadHatSyndie
-      - ClothingUniformJumpsuitOperative
-      - ClothingUniformJumpskirtOperative
-      - ClothingUniformJumpsuitSyndieFormal
-      - ClothingUniformJumpskirtSyndieFormalDress
-      - ClothingHeadPyjamaSyndicateBlack
-      - ClothingUniformJumpsuitPyjamaSyndicateBlack
-      - ClothingHeadPyjamaSyndicatePink
-      - ClothingUniformJumpsuitPyjamaSyndicatePink
-      - ClothingHeadPyjamaSyndicateRed
-      - ClothingUniformJumpsuitPyjamaSyndicateRed
-      - ClothingOuterWinterCentcom
-      - ClothingOuterWinterSyndie
-      - ClothingOuterWinterSyndieCap
-      # Bedsheets
-      - BedsheetSyndie
+    emagStaticPacks:
+    - ClothingCentComm
+    - ClothingSyndie
   - type: MaterialStorage
     whitelist:
       tags:
     reagentOutputSlotId: beaker_slot
     idleState: icon
     runningState: building
-    staticRecipes:
-    - BioGenMilk
-    - BioGenMilkSoy
-    - BioGenEthanol
-    - BioGenCream
-    - BioGenBlackpepper
-    - BioGenEnzyme
-    - BioGenFlour
-    - BioGenSugar
-    - BioGenMonkeyCube
-    - BioGenKoboldCube
-    - BioGenMaterialCloth1
-    - BioGenMaterialCardboard1
-    - BioGenPaper
-    - BioGenPaperRolling1
-    - BioGenCandle
-    - BioGenPlantBGone
-    - BioGenWeedKiller
-    - BioGenPestKiller
-    - BioGenLeft4Zed
-    - BioGenEZNutrient
-    - BioGenRobustHarvest
+    staticPacks:
+    - BioGenIngredientsStatic
+    - BioGenMaterialsStatic
 
 - type: entity
   parent: BaseLathe
       idleState: icon
       runningState: building
       defaultProductionAmount: 10
-      staticRecipes:
-        - SheetSteel
-        - SheetGlass1
-        - SheetRGlassRaw
-        - SheetPlasma1
-        - SheetPGlass1
-        - SheetRPGlass1
-        - SheetUranium1
-        - IngotGold1
-        - IngotSilver1
-        - MaterialBananium1
-        - MaterialDiamond
+      staticPacks:
+      - OreSmelting
+      - RGlassSmelting
 
 - type: entity
   parent: OreProcessor
   - type: Lathe
     materialUseMultiplier: 0.75
     timeMultiplier: 0.5
-    staticRecipes:
-      - SheetSteel
-      - SheetGlass1
-      - SheetRGlassRaw
-      - SheetPlasma1
-      - SheetPGlass1
-      - SheetRPGlass1
-      - SheetPlasteel1
-      - SheetUranium1
-      - SheetUGlass1
-      - SheetRUGlass1
-      - IngotGold1
-      - IngotSilver1
-      - MaterialBananium1
-      - MaterialDiamond
+    staticPacks:
+    - OreSmelting
+    - RGlassSmelting
+    - AdvancedSmelting
 
 - type: entity
   parent: BaseLathe
   - type: Lathe
     idleState: base_machine
     runningState: base_machine_processing
-    staticRecipes:
-    - MaterialSheetMeat
-    - SheetPaper
+    staticPacks:
+    - SheetifierStatic
 
 - type: entity
   parent: BaseLathe
     producingSound: /Audio/Machines/cutter.ogg
     idleState: icon
     runningState: building
-    staticRecipes:
-      - FloorTileItemDark
-      - FloorTileItemDarkDiagonalMini
-      - FloorTileItemDarkDiagonal
-      - FloorTileItemDarkHerringbone
-      - FloorTileItemDarkMini
-      - FloorTileItemDarkMono
-      - FloorTileItemDarkPavement
-      - FloorTileItemDarkPavementVertical
-      - FloorTileItemDarkOffset
-      - FloorTileItemSteelCheckerDark
-      - FloorTileItemSteel
-      - FloorTileItemSteelOffset
-      - FloorTileItemSteelDiagonalMini
-      - FloorTileItemSteelDiagonal
-      - FloorTileItemSteelHerringbone
-      - FloorTileItemSteelMini
-      - FloorTileItemSteelMono
-      - FloorTileItemSteelPavement
-      - FloorTileItemSteelPavementVertical
-      - FloorTileItemWhite
-      - FloorTileItemWhiteOffset
-      - FloorTileItemWhiteDiagonalMini
-      - FloorTileItemWhiteDiagonal
-      - FloorTileItemWhiteHerringbone
-      - FloorTileItemWhiteMini
-      - FloorTileItemWhiteMono
-      - FloorTileItemWhitePavement
-      - FloorTileItemWhitePavementVertical
-      - FloorTileItemSteelCheckerLight
-      - FloorTileItemGratingMaint
-      - FloorTileItemTechmaint
-      - FloorTileItemSteelMaint
-      - FloorTileItemWood
-      - FloorTileItemWoodLarge
-      - FloorTileItemWoodPattern
-      - FloorTileItemConcrete
-      - FloorTileItemConcreteMono
-      - FloorTileItemConcreteSmooth
-      - FloorTileItemGrayConcrete
-      - FloorTileItemGrayConcreteMono
-      - FloorTileItemGrayConcreteSmooth
-      - FloorTileItemOldConcrete
-      - FloorTileItemOldConcreteMono
-      - FloorTileItemOldConcreteSmooth
+    staticPacks:
+    - FloorTilesStatic
   - type: MaterialStorage
     whitelist:
       tags:
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/animal_cubes.yml b/Resources/Prototypes/Recipes/Lathes/Packs/animal_cubes.yml
new file mode 100644 (file)
index 0000000..1a1cd50
--- /dev/null
@@ -0,0 +1,19 @@
+## Static
+
+- type: latheRecipePack
+  id: FriendlyCubesStatic
+  recipes:
+  - MonkeyCube
+  - KoboldCube
+  - CowCube
+  - GoatCube
+  - MothroachCube
+  - MouseCube
+  - CockroachCube
+
+- type: latheRecipePack
+  id: HostileCubesStatic
+  recipes:
+  - AbominationCube
+  - SpaceCarpCube
+  - SpaceTickCube
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/bedsheets.yml b/Resources/Prototypes/Recipes/Lathes/Packs/bedsheets.yml
new file mode 100644 (file)
index 0000000..7d55c71
--- /dev/null
@@ -0,0 +1,23 @@
+## Static
+
+- type: latheRecipePack
+  id: Bedsheets
+  recipes:
+  - BedsheetBlack
+  - BedsheetBlue
+  - BedsheetBrown
+  - BedsheetGreen
+  - BedsheetGrey
+  - BedsheetOrange
+  - BedsheetPurple
+  - BedsheetRed
+  - BedsheetWhite
+  - BedsheetYellow
+  - BedsheetClown
+  - BedsheetCosmos
+  - BedsheetIan
+  - BedsheetMedical
+  - BedsheetMime
+  - BedsheetNT
+  - BedsheetRainbow
+  - BedsheetBrigmedic
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/biogen.yml b/Resources/Prototypes/Recipes/Lathes/Packs/biogen.yml
new file mode 100644 (file)
index 0000000..49ac26c
--- /dev/null
@@ -0,0 +1,30 @@
+## Static
+
+- type: latheRecipePack
+  id: BioGenIngredientsStatic
+  recipes:
+  - BioGenMilk
+  - BioGenMilkSoy
+  - BioGenEthanol
+  - BioGenCream
+  - BioGenBlackpepper
+  - BioGenEnzyme
+  - BioGenFlour
+  - BioGenSugar
+  - BioGenMonkeyCube
+  - BioGenKoboldCube
+  - BioGenCandle
+  - BioGenPlantBGone
+  - BioGenWeedKiller
+  - BioGenPestKiller
+  - BioGenLeft4Zed
+  - BioGenEZNutrient
+  - BioGenRobustHarvest
+
+- type: latheRecipePack
+  id: BioGenMaterialsStatic
+  recipes:
+  - BioGenMaterialCloth1
+  - BioGenMaterialCardboard1
+  - BioGenPaper
+  - BioGenPaperRolling1
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/cargo.yml b/Resources/Prototypes/Recipes/Lathes/Packs/cargo.yml
new file mode 100644 (file)
index 0000000..6ca2ef8
--- /dev/null
@@ -0,0 +1,31 @@
+## Static
+
+- type: latheRecipePack
+  id: CargoStatic
+  recipes:
+  - AppraisalTool
+  - Pickaxe
+
+- type: latheRecipePack
+  id: CargoBoardsStatic
+  recipes:
+  - OreProcessorMachineCircuitboard
+  - SalvageMagnetMachineCircuitboard
+
+## Dynamic
+
+- type: latheRecipePack
+  id: Mining
+  recipes:
+  - MiningDrill
+  - MiningDrillDiamond
+  - MineralScannerEmpty
+  - AdvancedMineralScannerEmpty
+  - OreBagOfHolding
+
+- type: latheRecipePack
+  id: CargoBoards
+  recipes:
+  - OreProcessorIndustrialMachineCircuitboard
+  - CargoTelepadMachineCircuitboard
+  - ShuttleGunKineticCircuitboard
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml b/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml
new file mode 100644 (file)
index 0000000..15ba04b
--- /dev/null
@@ -0,0 +1,227 @@
+## Static
+
+- type: latheRecipePack
+  id: ClothingCivilian
+  recipes:
+  - ClothingUniformJumpsuitColorGrey
+  - ClothingUniformJumpskirtColorGrey
+
+- type: latheRecipePack
+  id: ClothingCargo
+  recipes:
+  - ClothingUniformJumpsuitCargo
+  - ClothingUniformJumpskirtCargo
+  - ClothingUniformJumpsuitSalvageSpecialist
+  - ClothingHeadHatQMsoft
+  - ClothingHeadHatBeretQM
+  - ClothingUniformJumpsuitQM
+  - ClothingUniformJumpskirtQM
+  - ClothingUniformJumpsuitQMTurtleneck
+  - ClothingUniformJumpskirtQMTurtleneck
+  - ClothingUniformJumpsuitQMFormal
+
+- type: latheRecipePack
+  id: ClothingCommand
+  recipes:
+  # Captain
+  - ClothingHeadHatCapcap
+  - ClothingHeadHatCaptain
+  - ClothingUniformJumpsuitCaptain
+  - ClothingUniformJumpskirtCaptain
+  - ClothingUniformJumpsuitCapFormal
+  - ClothingUniformJumpskirtCapFormalDress
+  # HoP
+  - ClothingHeadHatHopcap
+  - ClothingUniformJumpsuitHoP
+  - ClothingUniformJumpskirtHoP
+
+- type: latheRecipePack
+  id: ClothingEngineering
+  recipes:
+  - ClothingHeadHatBeretEngineering
+  - ClothingUniformJumpsuitChiefEngineer
+  - ClothingUniformJumpskirtChiefEngineer
+  - ClothingUniformJumpsuitChiefEngineerTurtle
+  - ClothingUniformJumpskirtChiefEngineerTurtle
+  - ClothingUniformJumpsuitEngineering
+  - ClothingUniformJumpskirtEngineering
+  - ClothingUniformJumpsuitSeniorEngineer
+  - ClothingUniformJumpskirtSeniorEngineer
+
+- type: latheRecipePack
+  id: ClothingMedical
+  recipes:
+  - ClothingUniformJumpsuitChemistry
+  - ClothingUniformJumpskirtChemistry
+  - ClothingHeadHatBeretCmo
+  - ClothingUniformJumpsuitCMO
+  - ClothingUniformJumpskirtCMO
+  - ClothingUniformJumpsuitCMOTurtle
+  - ClothingUniformJumpskirtCMOTurtle
+  - ClothingHeadHatBeretSeniorPhysician
+  - ClothingUniformJumpsuitMedicalDoctor
+  - ClothingUniformJumpskirtMedicalDoctor
+  - ClothingUniformJumpsuitSeniorPhysician
+  - ClothingUniformJumpskirtSeniorPhysician
+  - ClothingUniformJumpsuitParamedic
+  - ClothingUniformJumpskirtParamedic
+  - ClothingHeadHatParamedicsoft
+
+- type: latheRecipePack
+  id: ClothingScience
+  recipes:
+  - ClothingHeadHatBeretRND
+  - ClothingUniformJumpsuitResearchDirector
+  - ClothingUniformJumpskirtResearchDirector
+  - ClothingUniformJumpsuitScientist
+  - ClothingUniformJumpskirtScientist
+  - ClothingUniformJumpsuitSeniorResearcher
+  - ClothingUniformJumpskirtSeniorResearcher
+
+- type: latheRecipePack
+  id: ClothingSecurity
+  recipes:
+  - ClothingUniformJumpsuitDetective
+  - ClothingUniformJumpskirtDetective
+  - ClothingHeadHatBeretHoS
+  - ClothingHeadHatHoshat
+  - ClothingUniformJumpsuitHoS
+  - ClothingUniformJumpskirtHoS
+  - ClothingUniformJumpsuitHosFormal
+  - ClothingUniformJumpskirtHosFormal
+  - ClothingUniformJumpsuitHoSAlt
+  - ClothingUniformJumpskirtHoSAlt
+  - ClothingUniformJumpsuitHoSBlue
+  - ClothingUniformJumpsuitHoSGrey
+  - ClothingUniformJumpsuitHoSParadeMale
+  - ClothingUniformJumpskirtHoSParadeMale
+  - ClothingUniformJumpsuitSeniorOfficer
+  - ClothingUniformJumpskirtSeniorOfficer
+  - ClothingUniformJumpsuitPrisoner
+  - ClothingUniformJumpskirtPrisoner
+  - ClothingHeadHatBeretSecurity
+  - ClothingUniformJumpsuitSec
+  - ClothingUniformJumpskirtSec
+  - ClothingHeadHatBeretBrigmedic
+  - ClothingUniformJumpsuitBrigmedic
+  - ClothingUniformJumpskirtBrigmedic
+  - ClothingHeadHatBeretWarden
+  - ClothingHeadHatWarden
+  - ClothingUniformJumpsuitWarden
+  - ClothingUniformJumpskirtWarden
+
+- type: latheRecipePack
+  id: ClothingService
+  recipes:
+  - ClothingUniformJumpsuitBartender
+  - ClothingUniformJumpskirtBartender
+  - ClothingUniformJumpsuitChaplain
+  - ClothingUniformJumpskirtChaplain
+  - ClothingUniformJumpsuitChef
+  - ClothingUniformJumpskirtChef
+  - ClothingUniformJumpsuitClown
+  - ClothingUniformJumpsuitHydroponics
+  - ClothingUniformJumpskirtHydroponics
+  - ClothingUniformJumpsuitJanitor
+  - ClothingUniformJumpskirtJanitor
+  - ClothingUniformJumpsuitLawyerBlack
+  - ClothingUniformJumpsuitLibrarian
+  - ClothingUniformJumpskirtColorLightBrown
+  - ClothingUniformJumpsuitMime
+  - ClothingUniformJumpskirtMime
+  - ClothingUniformJumpsuitMusician
+
+- type: latheRecipePack
+  id: WinterCoats
+  recipes:
+  - ClothingOuterWinterCap
+  - ClothingOuterWinterCE
+  - ClothingOuterWinterCMO
+  - ClothingOuterWinterHoP
+  - ClothingOuterWinterHoSUnarmored
+  - ClothingOuterWinterWardenUnarmored
+  - ClothingOuterWinterQM
+  - ClothingOuterWinterRD
+  - ClothingOuterWinterMusician
+  - ClothingOuterWinterClown
+  - ClothingOuterWinterMime
+  - ClothingOuterWinterCoat
+  - ClothingOuterWinterJani
+  - ClothingOuterWinterBar
+  - ClothingOuterWinterChef
+  - ClothingOuterWinterHydro
+  - ClothingOuterWinterAtmos
+  - ClothingOuterWinterEngi
+  - ClothingOuterWinterCargo
+  - ClothingOuterWinterMiner
+  - ClothingOuterWinterMed
+  - ClothingOuterWinterPara
+  - ClothingOuterWinterChem
+  - ClothingOuterWinterGen
+  - ClothingOuterWinterViro
+  - ClothingOuterWinterSci
+  - ClothingOuterWinterRobo
+  - ClothingOuterWinterSec
+
+- type: latheRecipePack
+  id: Ties
+  recipes:
+  - ClothingNeckTieRed
+  - ClothingNeckTieDet
+  - ClothingNeckTieSci
+
+- type: latheRecipePack
+  id: Scarves
+  recipes:
+  - ClothingNeckScarfStripedGreen
+  - ClothingNeckScarfStripedBlue
+  - ClothingNeckScarfStripedRed
+  - ClothingNeckScarfStripedBrown
+  - ClothingNeckScarfStripedLightBlue
+  - ClothingNeckScarfStripedOrange
+  - ClothingNeckScarfStripedBlack
+  - ClothingNeckScarfStripedPurple
+
+- type: latheRecipePack
+  id: Carpets
+  recipes:
+  - Carpet
+  - CarpetBlack
+  - CarpetPink
+  - CarpetBlue
+  - CarpetGreen
+  - CarpetOrange
+  - CarpetPurple
+  - CarpetCyan
+  - CarpetWhite
+
+- type: latheRecipePack
+  id: ClothingCentComm
+  recipes:
+  - ClothingHeadHatCentcomcap
+  - ClothingHeadHatCentcom
+  - ClothingUniformJumpsuitCentcomAgent
+  - ClothingUniformJumpsuitCentcomFormal
+  - ClothingUniformJumpskirtCentcomFormalDress
+  - ClothingUniformJumpsuitCentcomOfficer
+  - ClothingUniformJumpsuitCentcomOfficial
+
+- type: latheRecipePack
+  id: ClothingSyndie
+  recipes:
+  - ClothingHeadHatSyndieMAA
+  - ClothingHeadHatSyndie
+  - ClothingUniformJumpsuitOperative
+  - ClothingUniformJumpskirtOperative
+  - ClothingUniformJumpsuitSyndieFormal
+  - ClothingUniformJumpskirtSyndieFormalDress
+  - ClothingHeadPyjamaSyndicateBlack
+  - ClothingUniformJumpsuitPyjamaSyndicateBlack
+  - ClothingHeadPyjamaSyndicatePink
+  - ClothingUniformJumpsuitPyjamaSyndicatePink
+  - ClothingHeadPyjamaSyndicateRed
+  - ClothingUniformJumpsuitPyjamaSyndicateRed
+  - ClothingOuterWinterCentcom
+  - ClothingOuterWinterSyndie
+  - ClothingOuterWinterSyndieCap
+  - BedsheetSyndie
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/engineering.yml b/Resources/Prototypes/Recipes/Lathes/Packs/engineering.yml
new file mode 100644 (file)
index 0000000..63d529f
--- /dev/null
@@ -0,0 +1,87 @@
+## Static
+
+- type: latheRecipePack
+  id: ToolsStatic
+  recipes:
+  - Wirecutter
+  - Screwdriver
+  - Welder
+  - Wrench
+  - CrowbarGreen
+  - Multitool
+  - NetworkConfigurator
+  - Signaller
+  - SprayPainter
+  - FlashlightLantern
+  - HandheldGPSBasic
+  - TRayScanner
+  - UtilityBelt
+  - HandheldStationMap
+  - ClothingHeadHatWelding
+  - ClothingHeadHatCone
+
+- type: latheRecipePack
+  id: AtmosStatic
+  recipes:
+  - AirTank
+  - GasAnalyzer
+
+- type: latheRecipePack
+  id: ElectronicsStatic
+  recipes:
+  - IntercomElectronics
+  - FirelockElectronics
+  - DoorElectronics
+  - AirAlarmElectronics
+  - StationMapElectronics
+  - FireAlarmElectronics
+  - MailingUnitElectronics
+  - SignalTimerElectronics
+  - APCElectronics
+  - SMESMachineCircuitboard
+  - SubstationMachineCircuitboard
+  - WallmountSubstationElectronics
+  - CellRechargerCircuitboard
+  - WeaponCapacitorRechargerCircuitboard
+  - FreezerElectronics
+
+- type: latheRecipePack
+  id: EngineeringBoardsStatic
+  recipes:
+  - SpaceHeaterMachineCircuitBoard
+
+## Dynamic
+
+- type: latheRecipePack
+  id: AdvancedTools
+  recipes:
+  - PowerDrill
+  - WelderExperimental
+  - JawsOfLife
+
+- type: latheRecipePack
+  id: AtmosTools
+  recipes:
+  - HolofanProjector
+
+- type: latheRecipePack
+  id: EngineeringWeapons
+  recipes:
+  - WeaponParticleDecelerator
+
+- type: latheRecipePack
+  id: EngineeringBoards
+  recipes:
+  - ThermomachineFreezerMachineCircuitBoard
+  - HellfireFreezerMachineCircuitBoard
+  - PortableScrubberMachineCircuitBoard
+  - SolarControlComputerCircuitboard
+  - SolarTrackerElectronics
+  - GasRecyclerMachineCircuitboard
+  - PortableGeneratorPacmanMachineCircuitboard
+  - PortableGeneratorSuperPacmanMachineCircuitboard
+  - PortableGeneratorJrPacmanMachineCircuitboard
+  - EmitterCircuitboard
+  - TelecomServerCircuitboard
+  - SMESAdvancedMachineCircuitboard
+  - HolopadMachineCircuitboard
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/medical.yml b/Resources/Prototypes/Recipes/Lathes/Packs/medical.yml
new file mode 100644 (file)
index 0000000..c92cb13
--- /dev/null
@@ -0,0 +1,101 @@
+## Static
+
+- type: latheRecipePack
+  id: TopicalsStatic
+  recipes:
+  - Brutepack
+  - Ointment
+  - Gauze
+
+- type: latheRecipePack
+  id: BasicChemistryStatic
+  recipes:
+  - Beaker
+  - LargeBeaker
+  - Syringe
+  - PillCanister
+  - HandLabeler
+
+- type: latheRecipePack
+  parent: BasicChemistryStatic
+  id: ChemistryStatic
+  recipes:
+  - Jug
+  - ChemistryEmptyBottle01
+  - ClothingEyesGlassesChemical
+
+- type: latheRecipePack
+  id: SurgeryStatic
+  recipes:
+  - Scalpel
+  - Retractor
+  - Cautery
+  - Drill
+  - Saw
+  - Hemostat
+
+- type: latheRecipePack
+  id: MedicalStatic
+  recipes:
+  - Implanter
+  - Defibrillator
+  - HandheldHealthAnalyzer
+  - DiseaseSwab
+  - BodyBag
+  - WhiteCane
+
+- type: latheRecipePack
+  id: RollerBedsStatic
+  recipes:
+  - RollerBedSpawnFolded
+  - CheapRollerBedSpawnFolded
+  - EmergencyRollerBedSpawnFolded
+
+- type: latheRecipePack
+  id: MedicalClothingStatic
+  recipes:
+  - ClothingHandsGlovesLatex
+  - ClothingHandsGlovesNitrile
+  - ClothingMaskSterile
+
+# These are all empty
+- type: latheRecipePack
+  id: EmptyMedkitsStatic
+  recipes:
+  - Medkit
+  - MedkitBurn
+  - MedkitToxin
+  - MedkitO2
+  - MedkitBrute
+  - MedkitAdvanced
+  - MedkitRadiation
+  - MedkitCombat
+
+- type: latheRecipePack
+  id: MedicalBoardsStatic
+  recipes:
+  - ElectrolysisUnitMachineCircuitboard
+  - CentrifugeMachineCircuitboard
+  - ChemDispenserMachineCircuitboard
+  - ChemMasterMachineCircuitboard
+  - CondenserMachineCircuitBoard
+  - HotplateMachineCircuitboard
+
+## Dynamic
+
+# Shared with protolathe
+- type: latheRecipePack
+  id: Chemistry
+  recipes:
+  - ChemicalPayload
+  - CryostasisBeaker
+  - SyringeCryostasis
+  - BluespaceBeaker
+  - SyringeBluespace
+
+- type: latheRecipePack
+  id: MedicalBoards
+  recipes:
+  - StasisBedMachineCircuitboard
+  - CryoPodMachineCircuitboard
+  - BiomassReclaimerMachineCircuitboard
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/ore.yml b/Resources/Prototypes/Recipes/Lathes/Packs/ore.yml
new file mode 100644 (file)
index 0000000..c84436c
--- /dev/null
@@ -0,0 +1,27 @@
+## Static
+
+- type: latheRecipePack
+  id: OreSmelting
+  recipes:
+  - SheetSteel
+  - SheetGlass1
+  - SheetPlasma1
+  - SheetUranium1
+  - IngotGold1
+  - IngotSilver1
+  - MaterialBananium1
+  - MaterialDiamond
+
+- type: latheRecipePack
+  id: RGlassSmelting
+  recipes:
+  - SheetRGlassRaw
+  - SheetPGlass1
+  - SheetRPGlass1
+
+- type: latheRecipePack
+  id: AdvancedSmelting
+  recipes:
+  - SheetPlasteel1
+  - SheetUGlass1
+  - SheetRUGlass1
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/robotics.yml b/Resources/Prototypes/Recipes/Lathes/Packs/robotics.yml
new file mode 100644 (file)
index 0000000..19bff4a
--- /dev/null
@@ -0,0 +1,74 @@
+## Static
+
+- type: latheRecipePack
+  id: RoboticsStatic
+  recipes:
+  - MMI
+  - PositronicBrain
+  - SciFlash
+  - CyborgEndoskeleton
+
+- type: latheRecipePack
+  id: BorgModulesStatic
+  recipes:
+  - BorgModuleCable
+  - BorgModuleFireExtinguisher
+  - BorgModuleRadiationDetection
+  - BorgModuleTool
+
+- type: latheRecipePack
+  id: BorgLimbsStatic
+  recipes:
+  - LeftArmBorg
+  - RightArmBorg
+  - LeftLegBorg
+  - RightLegBorg
+  - LightHeadBorg
+  - TorsoBorg
+
+## Dynamic
+
+- type: latheRecipePack
+  id: Robotics
+  recipes:
+  - ProximitySensor
+
+- type: latheRecipePack
+  id: BorgModules
+  recipes:
+  - BorgModuleAdvancedCleaning
+  - BorgModuleAdvancedTool
+  - BorgModuleGPS
+  - BorgModuleArtifact
+  - BorgModuleAnomaly
+  - BorgModuleGardening
+  - BorgModuleHarvesting
+  - BorgModuleDefibrillator
+  - BorgModuleAdvancedTreatment
+
+- type: latheRecipePack
+  id: MechParts
+  recipes:
+  - RipleyHarness
+  - RipleyLArm
+  - RipleyRArm
+  - RipleyLLeg
+  - RipleyRLeg
+  - HonkerHarness
+  - HonkerLArm
+  - HonkerRArm
+  - HonkerLLeg
+  - HonkerRLeg
+  - HamtrHarness
+  - HamtrLArm
+  - HamtrRArm
+  - HamtrLLeg
+  - HamtrRLeg
+  - VimHarness
+
+- type: latheRecipePack
+  id: MechEquipment
+  recipes:
+    - MechEquipmentGrabber
+    - MechEquipmentHorn
+    - MechEquipmentGrabberSmall
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/science.yml b/Resources/Prototypes/Recipes/Lathes/Packs/science.yml
new file mode 100644 (file)
index 0000000..4278693
--- /dev/null
@@ -0,0 +1,127 @@
+## Static
+
+- type: latheRecipePack
+  id: ScienceBoardsStatic
+  recipes:
+  - ProtolatheMachineCircuitboard
+  - AutolatheMachineCircuitboard
+  - CircuitImprinterMachineCircuitboard
+  - ExosuitFabricatorMachineCircuitboard
+  - CutterMachineCircuitboard
+  - BorgChargerCircuitboard
+
+- type: latheRecipePack
+  id: CircuitFloorsStatic
+  recipes:
+  - FloorGreenCircuit
+  - FloorBlueCircuit
+  - FloorRedCircuit
+
+## Dynamic
+
+- type: latheRecipePack
+  id: ScienceEquipment
+  recipes:
+  - AnomalyScanner
+  - NodeScanner
+  - AnomalyLocator
+  - AnomalyLocatorWide
+  - HoloprojectorField
+  - SignallerAdvanced
+  - DeviceQuantumSpinInverter
+
+- type: latheRecipePack
+  id: ScienceClothing
+  recipes:
+  - ClothingShoesBootsMagSci
+  - ClothingShoesBootsMoon
+  - ClothingShoesBootsSpeed
+  - ClothingBackpackHolding
+  - ClothingBackpackSatchelHolding
+  - ClothingBackpackDuffelHolding
+
+- type: latheRecipePack
+  id: PowerCells
+  recipes:
+  - PowerCellMicroreactor
+  - PowerCellHigh
+
+- type: latheRecipePack
+  id: ScienceWeapons
+  recipes:
+  - WeaponPistolCHIMP
+  - WeaponForceGun
+  - WeaponLaserSvalinn
+  - WeaponProtoKineticAccelerator
+  - WeaponTetherGun
+  - WeaponGauntletGorilla
+
+- type: latheRecipePack
+  id: FauxTiles
+  recipes:
+  - FauxTileAstroGrass
+  - FauxTileMowedAstroGrass
+  - FauxTileJungleAstroGrass
+  - FauxTileAstroIce
+  - FauxTileAstroSnow
+  - FauxTileAstroAsteroidSand
+
+# Only contains parts for making basic modular grenades, no actual explosives
+- type: latheRecipePack
+  id: ScienceExplosives
+  recipes:
+  - ChemicalPayload
+  - FlashPayload
+  - TimerTrigger
+  - SignalTrigger
+  - VoiceTrigger
+
+- type: latheRecipePack
+  id: ScienceBoards
+  recipes:
+  - TurboItemRechargerCircuitboard
+  - AutolatheHyperConvectionMachineCircuitboard
+  - ProtolatheHyperConvectionMachineCircuitboard
+  - CircuitImprinterHyperConvectionMachineCircuitboard
+  - TechDiskComputerCircuitboard
+  - FlatpackerMachineCircuitboard
+  - SheetifierMachineCircuitboard
+  - PowerCageRechargerCircuitboard
+  - AnalysisComputerCircuitboard
+  - AnomalyVesselCircuitboard
+  - AnomalyVesselExperimentalCircuitboard
+  - AnomalySynchronizerCircuitboard
+  - APECircuitboard
+  - ArtifactAnalyzerMachineCircuitboard
+  - ArtifactCrusherMachineCircuitboard
+
+- type: latheRecipePack
+  id: CameraBoards
+  recipes:
+  - SurveillanceCameraRouterCircuitboard
+  - SurveillanceCameraMonitorCircuitboard
+  - SurveillanceWirelessCameraMonitorCircuitboard
+  - SurveillanceCameraWirelessRouterCircuitboard
+  - ComputerTelevisionCircuitboard
+  - SurveillanceWirelessCameraMovableCircuitboard
+  - SurveillanceWirelessCameraAnchoredCircuitboard
+
+- type: latheRecipePack
+  id: MechBoards
+  recipes:
+  - RipleyCentralElectronics
+  - RipleyPeripheralsElectronics
+  - HonkerCentralElectronics
+  - HonkerPeripheralsElectronics
+  - HonkerTargetingElectronics
+  - HamtrCentralElectronics
+  - HamtrPeripheralsElectronics
+
+- type: latheRecipePack
+  id: ShuttleBoards
+  recipes:
+  - ShuttleConsoleCircuitboard
+  - RadarConsoleCircuitboard
+  - ThrusterMachineCircuitboard
+  - GyroscopeMachineCircuitboard
+  - MiniGravityGeneratorCircuitboard
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/security.yml b/Resources/Prototypes/Recipes/Lathes/Packs/security.yml
new file mode 100644 (file)
index 0000000..77f2131
--- /dev/null
@@ -0,0 +1,131 @@
+## Static recipes
+
+- type: latheRecipePack
+  id: SecurityEquipmentStatic
+  recipes:
+  - ClothingEyesHudSecurity
+  - ForensicPad
+  - Handcuffs
+  - TargetClown
+  - TargetHuman
+  - TargetSyndicate
+  - Zipties
+
+# Practice ammo/mags and practice weapons
+- type: latheRecipePack
+  id: SecurityPracticeStatic
+  recipes:
+  - BoxShotgunPractice
+  - MagazineBoxLightRiflePractice
+  - MagazineBoxMagnumPractice
+  - MagazineBoxPistolPractice
+  - MagazineBoxRiflePractice
+  - WeaponDisablerPractice
+  - WeaponLaserCarbinePractice
+  - WeaponFlareGunSecurity
+
+# Shared between secfab and emagged autolathe
+- type: latheRecipePack
+  id: SecurityAmmoStatic
+  recipes:
+  - BoxLethalshot
+  - BoxShotgunSlug
+  - MagazineBoxLightRifle
+  - MagazineBoxMagnum
+  - MagazineBoxPistol
+  - MagazineBoxRifle
+  - MagazineLightRifle
+  - MagazineLightRifleEmpty
+  - MagazinePistol
+  - MagazinePistolEmpty
+  - MagazinePistolSubMachineGun
+  - MagazinePistolSubMachineGunEmpty
+  - MagazinePistolSubMachineGunTopMounted
+  - MagazinePistolSubMachineGunTopMountedEmpty
+  - MagazineRifle
+  - MagazineRifleEmpty
+  - MagazineShotgun
+  - MagazineShotgunEmpty
+  - MagazineShotgunSlug
+  - SpeedLoaderMagnum
+  - SpeedLoaderMagnumEmpty
+
+- type: latheRecipePack
+  id: SecurityWeaponsStatic
+  recipes:
+  - Flash
+  - Stunbaton
+  - CombatKnife
+  - RiotShield
+
+## Dynamic recipes
+
+- type: latheRecipePack
+  id: SecurityEquipment
+  recipes:
+  - ClothingBackpackElectropack
+  - HoloprojectorSecurity
+  - PortableRecharger
+  - PowerCageHigh
+  - PowerCageMedium
+  - PowerCageSmall
+  - TelescopicShield
+
+- type: latheRecipePack
+  id: SecurityBoards
+  recipes:
+  - ShuttleGunDusterCircuitboard
+  - ShuttleGunFriendshipCircuitboard
+  - ShuttleGunPerforatorCircuitboard
+  - ShuttleGunSvalinnMachineGunCircuitboard
+
+- type: latheRecipePack
+  parent:
+  - ScienceExplosives # sec gets everything for modular grenade making that sci does
+  id: SecurityExplosives
+  recipes:
+  - ExplosivePayload
+  - GrenadeBlast
+  - GrenadeEMP
+  - GrenadeFlash
+  - MagazineGrenadeEmpty
+
+# Shared between secfab and emagged protolathe
+- type: latheRecipePack
+  id: SecurityAmmo
+  recipes:
+  - BoxBeanbag
+  - BoxShotgunIncendiary
+  - BoxShotgunUranium
+  - BoxShellTranquilizer
+  - MagazineBoxLightRifleIncendiary
+  - MagazineBoxLightRifleUranium
+  - MagazineBoxMagnumIncendiary
+  - MagazineBoxMagnumUranium
+  - MagazineBoxPistolIncendiary
+  - MagazineBoxPistolUranium
+  - MagazineBoxRifleIncendiary
+  - MagazineBoxRifleUranium
+  - MagazineLightRifleIncendiary
+  - MagazineLightRifleUranium
+  - MagazinePistolIncendiary
+  - MagazinePistolUranium
+  - MagazinePistolSubMachineGunIncendiary
+  - MagazinePistolSubMachineGunUranium
+  - MagazineRifleIncendiary
+  - MagazineRifleUranium
+  - MagazineShotgunBeanbag
+  - MagazineShotgunIncendiary
+  - SpeedLoaderMagnumIncendiary
+  - SpeedLoaderMagnumUranium
+
+- type: latheRecipePack
+  id: SecurityWeapons
+  recipes:
+  - Truncheon
+  - WeaponAdvancedLaser
+  - WeaponDisabler
+  - WeaponDisablerSMG
+  - WeaponLaserCannon
+  - WeaponLaserCarbine
+  - WeaponXrayCannon
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/service.yml b/Resources/Prototypes/Recipes/Lathes/Packs/service.yml
new file mode 100644 (file)
index 0000000..bbf5ec0
--- /dev/null
@@ -0,0 +1,62 @@
+## Static
+
+- type: latheRecipePack
+  id: ServiceStatic
+  recipes:
+  - Bucket
+  - DrinkMug
+  - DrinkMugMetal
+  - DrinkGlass
+  - DrinkShotGlass
+  - DrinkGlassCoupeShaped
+  - CustomDrinkJug
+  - FoodPlate
+  - FoodPlateSmall
+  - FoodPlatePlastic
+  - FoodPlateSmallPlastic
+  - FoodBowlBig
+  - FoodPlateTin
+  - FoodPlateMuffinTin
+  - FoodKebabSkewer
+  - SprayBottle
+  - MopItem
+  - Holoprojector
+  - WetFloorSign
+
+- type: latheRecipePack
+  id: ServiceBoardsStatic
+  recipes:
+  - BiogeneratorMachineCircuitboard
+  - UniformPrinterMachineCircuitboard
+  - MicrowaveMachineCircuitboard
+  - ReagentGrinderMachineCircuitboard
+  - ElectricGrillMachineCircuitboard
+  - BoozeDispenserMachineCircuitboard
+  - SodaDispenserMachineCircuitboard
+
+## Dynamic
+
+- type: latheRecipePack
+  id: Janitor
+  recipes:
+  - AdvMopItem
+  - WeaponSprayNozzle
+  - ClothingBackpackWaterTank
+  - MegaSprayBottle
+
+- type: latheRecipePack
+  id: Instruments
+  recipes:
+  - SynthesizerInstrument
+
+- type: latheRecipePack
+  id: ServiceBoards
+  recipes:
+  - BiofabricatorMachineCircuitboard
+  - FatExtractorMachineCircuitboard
+  - HydroponicsTrayMachineCircuitboard # roundstart gear being unlocked roundstart when
+  - SeedExtractorMachineCircuitboard # ^
+  - MassMediaCircuitboard
+  - ReagentGrinderIndustrialMachineCircuitboard
+  - JukeboxCircuitBoard
+  - DawInstrumentMachineCircuitboard
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/shared.yml b/Resources/Prototypes/Recipes/Lathes/Packs/shared.yml
new file mode 100644 (file)
index 0000000..44ba33c
--- /dev/null
@@ -0,0 +1,51 @@
+## Static
+
+- type: latheRecipePack
+  id: MaterialsStatic
+  recipes:
+  - SheetRGlass
+
+- type: latheRecipePack
+  id: PartsStatic
+  recipes:
+  - Igniter
+  - ModularReceiver
+  - MicroManipulatorStockPart
+  - MatterBinStockPart
+  - CapacitorStockPart
+  - ConveyorBeltAssembly
+
+- type: latheRecipePack
+  id: LightsStatic
+  recipes:
+  - LightTube
+  - LedLightTube
+  - SodiumLightTube
+  - ExteriorLightTube
+  - LightBulb
+  - LedLightBulb
+  - DimLightBulb
+  - WarmLightBulb
+
+- type: latheRecipePack
+  id: PowerCellsStatic
+  recipes:
+  - PowerCellSmall
+  - PowerCellMedium
+
+- type: latheRecipePack
+  id: CablesStatic
+  recipes:
+  - CableStack
+  - CableMVStack
+  - CableHVStack
+
+## Dynamic
+
+# Things you'd expect sci salv and engi to make use of
+- type: latheRecipePack
+  id: Equipment
+  recipes:
+  - HandHeldMassScanner
+  - ClothingMaskWeldingGas
+  - SignallerAdvanced
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/sheetifier.yml b/Resources/Prototypes/Recipes/Lathes/Packs/sheetifier.yml
new file mode 100644 (file)
index 0000000..18aaef5
--- /dev/null
@@ -0,0 +1,7 @@
+## Static
+
+- type: latheRecipePack
+  id: SheetifierStatic
+  recipes:
+  - MaterialSheetMeat
+  - SheetPaper
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/tiles.yml b/Resources/Prototypes/Recipes/Lathes/Packs/tiles.yml
new file mode 100644 (file)
index 0000000..51db1dc
--- /dev/null
@@ -0,0 +1,49 @@
+## Static
+
+- type: latheRecipePack
+  id: FloorTilesStatic
+  recipes:
+  - FloorTileItemDark
+  - FloorTileItemDarkDiagonalMini
+  - FloorTileItemDarkDiagonal
+  - FloorTileItemDarkHerringbone
+  - FloorTileItemDarkMini
+  - FloorTileItemDarkMono
+  - FloorTileItemDarkPavement
+  - FloorTileItemDarkPavementVertical
+  - FloorTileItemDarkOffset
+  - FloorTileItemSteelCheckerDark
+  - FloorTileItemSteel
+  - FloorTileItemSteelOffset
+  - FloorTileItemSteelDiagonalMini
+  - FloorTileItemSteelDiagonal
+  - FloorTileItemSteelHerringbone
+  - FloorTileItemSteelMini
+  - FloorTileItemSteelMono
+  - FloorTileItemSteelPavement
+  - FloorTileItemSteelPavementVertical
+  - FloorTileItemWhite
+  - FloorTileItemWhiteOffset
+  - FloorTileItemWhiteDiagonalMini
+  - FloorTileItemWhiteDiagonal
+  - FloorTileItemWhiteHerringbone
+  - FloorTileItemWhiteMini
+  - FloorTileItemWhiteMono
+  - FloorTileItemWhitePavement
+  - FloorTileItemWhitePavementVertical
+  - FloorTileItemSteelCheckerLight
+  - FloorTileItemGratingMaint
+  - FloorTileItemTechmaint
+  - FloorTileItemSteelMaint
+  - FloorTileItemWood
+  - FloorTileItemWoodLarge
+  - FloorTileItemWoodPattern
+  - FloorTileItemConcrete
+  - FloorTileItemConcreteMono
+  - FloorTileItemConcreteSmooth
+  - FloorTileItemGrayConcrete
+  - FloorTileItemGrayConcreteMono
+  - FloorTileItemGrayConcreteSmooth
+  - FloorTileItemOldConcrete
+  - FloorTileItemOldConcreteMono
+  - FloorTileItemOldConcreteSmooth
index f6f303e5e3b19989bae5ffec4c767d12fc89940d..c72701711b70881322c04b20d5607e8ecff25265 100644 (file)
   materials:
     Steel: 300
 
+- type: latheRecipe
+  parent: BaseAmmoRecipe
+  id: MagazinePistolSubMachineGunUranium
+  result: MagazinePistolSubMachineGunUranium
+  materials:
+    Steel: 25
+    Plastic: 250
+    Uranium: 250
+
+- type: latheRecipe
+  parent: BaseAmmoRecipe
+  id: MagazinePistolSubMachineGunIncendiary
+  result: MagazinePistolSubMachineGunIncendiary
+  materials:
+    Steel: 25
+    Plastic: 275
+
 - type: latheRecipe
   parent: BaseEmptyAmmoRecipe
   id: MagazinePistolSubMachineGunTopMountedEmpty
index 553258fdb3f45fab4a19ab909c787caa69655d17..6cecc490358151e2806c9ea20e4ee52fbd994dc8 100644 (file)
@@ -27,6 +27,7 @@
   - BoxShotgunIncendiary
   - MagazineRifleIncendiary
   - MagazinePistolIncendiary
+  - MagazinePistolSubMachineGunIncendiary
   - MagazineLightRifleIncendiary
   - SpeedLoaderMagnumIncendiary
   - MagazineShotgunIncendiary
@@ -74,6 +75,7 @@
   recipeUnlocks:
   - MagazineRifleUranium
   - MagazinePistolUranium
+  - MagazinePistolSubMachineGunUranium
   - MagazineLightRifleUranium
   - SpeedLoaderMagnumUranium
   - MagazineBoxPistolUranium
index 34443e78f00c6ebff7f1448cb95b91186697c10d..be19a1170287f68997e332f062fa23a92dd91d8b 100644 (file)
@@ -11,7 +11,6 @@
   cost: 5000
   recipeUnlocks:
   - ProximitySensor
-  - ExosuitFabricatorMachineCircuitboard
 
 - type: technology
   id: BasicAnomalousResearch