move lathe recipes into packs (easier for forks and maintaining) (#33095)

* 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>
This commit is contained in:
deltanedas
2025-02-07 18:22:49 +00:00
committed by GitHub
parent f37d5c9f0f
commit 1f5fab5761
28 changed files with 1304 additions and 875 deletions

View 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;
}

View 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

View 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.");
}
});
});

View 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)

View 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();
}
}

View 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

View File

@@ -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();
}

View 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)

View File

@@ -301,3 +301,11 @@
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

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,7 @@
## Static
- type: latheRecipePack
id: SheetifierStatic
recipes:
- MaterialSheetMeat
- SheetPaper

View File

@@ -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

View File

@@ -245,6 +245,23 @@
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

View File

@@ -27,6 +27,7 @@
- BoxShotgunIncendiary
- MagazineRifleIncendiary
- MagazinePistolIncendiary
- MagazinePistolSubMachineGunIncendiary
- MagazineLightRifleIncendiary
- SpeedLoaderMagnumIncendiary
- MagazineShotgunIncendiary
@@ -74,6 +75,7 @@
recipeUnlocks:
- MagazineRifleUranium
- MagazinePistolUranium
- MagazinePistolSubMachineGunUranium
- MagazineLightRifleUranium
- SpeedLoaderMagnumUranium
- MagazineBoxPistolUranium

View File

@@ -11,7 +11,6 @@
cost: 5000
recipeUnlocks:
- ProximitySensor
- ExosuitFabricatorMachineCircuitboard
- type: technology
id: BasicAnomalousResearch