Machine-code cleanup (#28489)
This commit is contained in:
@@ -75,8 +75,7 @@ public sealed partial class FlatpackCreatorMenu : FancyWindow
|
|||||||
else if (_currentBoard != null)
|
else if (_currentBoard != null)
|
||||||
{
|
{
|
||||||
Dictionary<string, int> cost;
|
Dictionary<string, int> cost;
|
||||||
if (_entityManager.TryGetComponent(_currentBoard, out machineBoardComp) &&
|
if (_entityManager.TryGetComponent(_currentBoard, out machineBoardComp))
|
||||||
machineBoardComp.Prototype is not null)
|
|
||||||
cost = _flatpack.GetFlatpackCreationCost((_owner, flatpacker), (_currentBoard.Value, machineBoardComp));
|
cost = _flatpack.GetFlatpackCreationCost((_owner, flatpacker), (_currentBoard.Value, machineBoardComp));
|
||||||
else
|
else
|
||||||
cost = _flatpack.GetFlatpackCreationCost((_owner, flatpacker));
|
cost = _flatpack.GetFlatpackCreationCost((_owner, flatpacker));
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Server.Construction.Components;
|
using Content.Server.Construction.Components;
|
||||||
using Content.Shared.Construction.Components;
|
using Content.Shared.Construction.Components;
|
||||||
|
using Content.Shared.Prototypes;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.IntegrationTests.Tests;
|
namespace Content.IntegrationTests.Tests;
|
||||||
@@ -49,12 +51,11 @@ public sealed class MachineBoardTest
|
|||||||
|
|
||||||
Assert.Multiple(() =>
|
Assert.Multiple(() =>
|
||||||
{
|
{
|
||||||
Assert.That(mId, Is.Not.Null, $"Machine board {p.ID} does not have a corresponding machine.");
|
|
||||||
Assert.That(protoMan.TryIndex<EntityPrototype>(mId, out var mProto),
|
Assert.That(protoMan.TryIndex<EntityPrototype>(mId, out var mProto),
|
||||||
$"Machine board {p.ID}'s corresponding machine has an invalid prototype.");
|
$"Machine board {p.ID}'s corresponding machine has an invalid prototype.");
|
||||||
Assert.That(mProto.TryGetComponent<MachineComponent>(out var mComp),
|
Assert.That(mProto.TryGetComponent<MachineComponent>(out var mComp),
|
||||||
$"Machine board {p.ID}'s corresponding machine {mId} does not have MachineComponent");
|
$"Machine board {p.ID}'s corresponding machine {mId} does not have MachineComponent");
|
||||||
Assert.That(mComp.BoardPrototype, Is.EqualTo(p.ID),
|
Assert.That(mComp.Board, Is.EqualTo(p.ID),
|
||||||
$"Machine {mId}'s BoardPrototype is not equal to it's corresponding machine board, {p.ID}");
|
$"Machine {mId}'s BoardPrototype is not equal to it's corresponding machine board, {p.ID}");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -101,4 +102,40 @@ public sealed class MachineBoardTest
|
|||||||
|
|
||||||
await pair.CleanReturnAsync();
|
await pair.CleanReturnAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ensures that every single computer board's corresponding entity
|
||||||
|
/// is a computer that can be properly deconstructed to the correct board
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public async Task TestValidateBoardComponentRequirements()
|
||||||
|
{
|
||||||
|
await using var pair = await PoolManager.GetServerClient();
|
||||||
|
var server = pair.Server;
|
||||||
|
|
||||||
|
var entMan = server.ResolveDependency<IEntityManager>();
|
||||||
|
var protoMan = server.ResolveDependency<IPrototypeManager>();
|
||||||
|
|
||||||
|
await server.WaitAssertion(() =>
|
||||||
|
{
|
||||||
|
foreach (var p in protoMan.EnumeratePrototypes<EntityPrototype>()
|
||||||
|
.Where(p => !p.Abstract)
|
||||||
|
.Where(p => !pair.IsTestPrototype(p))
|
||||||
|
.Where(p => !_ignoredPrototypes.Contains(p.ID)))
|
||||||
|
{
|
||||||
|
if (!p.TryGetComponent<MachineBoardComponent>(out var board, entMan.ComponentFactory))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Assert.Multiple(() =>
|
||||||
|
{
|
||||||
|
foreach (var component in board.ComponentRequirements.Keys)
|
||||||
|
{
|
||||||
|
Assert.That(entMan.ComponentFactory.TryGetRegistration(component, out _), $"Invalid component requirement {component} specified on machine board entity {p}");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await pair.CleanReturnAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ public sealed class MaterialArbitrageTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Lets assume the possible lathe for resource multipliers:
|
// Lets assume the possible lathe for resource multipliers:
|
||||||
var multiplier = MathF.Pow(LatheComponent.DefaultPartRatingMaterialUseMultiplier, MachinePartComponent.MaxRating - 1);
|
// TODO: each recipe can technically have its own cost multiplier associated with it, so this test needs redone to factor that in.
|
||||||
|
var multiplier = MathF.Pow(0.85f, 3);
|
||||||
|
|
||||||
// create construction dictionary
|
// create construction dictionary
|
||||||
Dictionary<string, ConstructionComponent> constructionRecipes = new();
|
Dictionary<string, ConstructionComponent> constructionRecipes = new();
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
using Content.Shared.Construction.Components;
|
|
||||||
|
|
||||||
namespace Content.Server.Construction.Components
|
|
||||||
{
|
|
||||||
[RequiresExplicitImplementation]
|
|
||||||
public interface IRefreshParts
|
|
||||||
{
|
|
||||||
void RefreshParts(IEnumerable<MachinePartComponent> parts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +1,17 @@
|
|||||||
using Robust.Shared.Containers;
|
using Content.Shared.Construction.Components;
|
||||||
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
|
||||||
|
|
||||||
namespace Content.Server.Construction.Components
|
namespace Content.Server.Construction.Components;
|
||||||
{
|
|
||||||
[RegisterComponent, ComponentProtoName("Machine")]
|
[RegisterComponent]
|
||||||
public sealed partial class MachineComponent : Component
|
public sealed partial class MachineComponent : Component
|
||||||
{
|
{
|
||||||
[DataField("board", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
|
[DataField]
|
||||||
public string? BoardPrototype { get; private set; }
|
public EntProtoId<MachineBoardComponent>? Board { get; private set; }
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public Container BoardContainer = default!;
|
public Container BoardContainer = default!;
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public Container PartContainer = default!;
|
public Container PartContainer = default!;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The different types of scaling that are available for machine upgrades
|
|
||||||
/// </summary>
|
|
||||||
public enum MachineUpgradeScalingType : byte
|
|
||||||
{
|
|
||||||
Linear,
|
|
||||||
Exponential
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
using Content.Shared.Construction.Components;
|
using Content.Shared.Construction.Components;
|
||||||
using Content.Shared.Construction.Prototypes;
|
using Content.Shared.Stacks;
|
||||||
|
using Content.Shared.Tag;
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Server.Construction.Components
|
namespace Content.Server.Construction.Components
|
||||||
{
|
{
|
||||||
@@ -14,29 +15,23 @@ namespace Content.Server.Construction.Components
|
|||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public bool HasBoard => BoardContainer?.ContainedEntities.Count != 0;
|
public bool HasBoard => BoardContainer?.ContainedEntities.Count != 0;
|
||||||
|
|
||||||
[DataField("progress", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, MachinePartPrototype>))]
|
|
||||||
public Dictionary<string, int> Progress = new();
|
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public readonly Dictionary<string, int> MaterialProgress = new();
|
public readonly Dictionary<ProtoId<StackPrototype>, int> MaterialProgress = new();
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public readonly Dictionary<string, int> ComponentProgress = new();
|
public readonly Dictionary<string, int> ComponentProgress = new();
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public readonly Dictionary<string, int> TagProgress = new();
|
public readonly Dictionary<ProtoId<TagPrototype>, int> TagProgress = new();
|
||||||
|
|
||||||
[DataField("requirements", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, MachinePartPrototype>))]
|
|
||||||
public Dictionary<string, int> Requirements = new();
|
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public Dictionary<string, int> MaterialRequirements = new();
|
public Dictionary<ProtoId<StackPrototype>, int> MaterialRequirements = new();
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public Dictionary<string, GenericPartInfo> ComponentRequirements = new();
|
public Dictionary<string, GenericPartInfo> ComponentRequirements = new();
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public Dictionary<string, GenericPartInfo> TagRequirements = new();
|
public Dictionary<ProtoId<TagPrototype>, GenericPartInfo> TagRequirements = new();
|
||||||
|
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public Container BoardContainer = default!;
|
public Container BoardContainer = default!;
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
using Robust.Shared.Audio;
|
|
||||||
|
|
||||||
namespace Content.Server.Construction.Components;
|
|
||||||
|
|
||||||
[RegisterComponent]
|
|
||||||
public sealed partial class PartExchangerComponent : Component
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// How long it takes to exchange the parts
|
|
||||||
/// </summary>
|
|
||||||
[DataField("exchangeDuration")]
|
|
||||||
public float ExchangeDuration = 3;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Whether or not the distance check is needed.
|
|
||||||
/// Good for BRPED.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// I fucking hate BRPED and if you ever add it
|
|
||||||
/// i will personally kill your dog.
|
|
||||||
/// </remarks>
|
|
||||||
[DataField("doDistanceCheck")]
|
|
||||||
public bool DoDistanceCheck = true;
|
|
||||||
|
|
||||||
[DataField("exchangeSound")]
|
|
||||||
public SoundSpecifier ExchangeSound = new SoundPathSpecifier("/Audio/Items/rped.ogg");
|
|
||||||
|
|
||||||
public EntityUid? AudioStream;
|
|
||||||
}
|
|
||||||
@@ -2,6 +2,7 @@ using Content.Server.Construction.Components;
|
|||||||
using Content.Shared.Construction;
|
using Content.Shared.Construction;
|
||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
namespace Content.Server.Construction.Conditions
|
namespace Content.Server.Construction.Conditions
|
||||||
@@ -17,7 +18,7 @@ namespace Content.Server.Construction.Conditions
|
|||||||
public SpriteSpecifier? GuideIconBoard { get; private set; }
|
public SpriteSpecifier? GuideIconBoard { get; private set; }
|
||||||
|
|
||||||
[DataField("guideIconParts")]
|
[DataField("guideIconParts")]
|
||||||
public SpriteSpecifier? GuideIconPart { get; private set; }
|
public SpriteSpecifier? GuideIconParts { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
public bool Condition(EntityUid uid, IEntityManager entityManager)
|
public bool Condition(EntityUid uid, IEntityManager entityManager)
|
||||||
@@ -33,6 +34,8 @@ namespace Content.Server.Construction.Conditions
|
|||||||
var entity = args.Examined;
|
var entity = args.Examined;
|
||||||
|
|
||||||
var entityManager = IoCManager.Resolve<IEntityManager>();
|
var entityManager = IoCManager.Resolve<IEntityManager>();
|
||||||
|
var protoManager = IoCManager.Resolve<IPrototypeManager>();
|
||||||
|
var constructionSys = entityManager.System<ConstructionSystem>();
|
||||||
|
|
||||||
if (!entityManager.TryGetComponent(entity, out MachineFrameComponent? machineFrame))
|
if (!entityManager.TryGetComponent(entity, out MachineFrameComponent? machineFrame))
|
||||||
return false;
|
return false;
|
||||||
@@ -47,17 +50,6 @@ namespace Content.Server.Construction.Conditions
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-requirement-label"));
|
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-requirement-label"));
|
||||||
foreach (var (part, required) in machineFrame.Requirements)
|
|
||||||
{
|
|
||||||
var amount = required - machineFrame.Progress[part];
|
|
||||||
|
|
||||||
if(amount == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
|
|
||||||
("amount", amount),
|
|
||||||
("elementName", Loc.GetString(part))));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var (material, required) in machineFrame.MaterialRequirements)
|
foreach (var (material, required) in machineFrame.MaterialRequirements)
|
||||||
{
|
{
|
||||||
@@ -65,10 +57,12 @@ namespace Content.Server.Construction.Conditions
|
|||||||
|
|
||||||
if(amount == 0)
|
if(amount == 0)
|
||||||
continue;
|
continue;
|
||||||
|
var stack = protoManager.Index(material);
|
||||||
|
var stackEnt = protoManager.Index(stack.Spawn);
|
||||||
|
|
||||||
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
|
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
|
||||||
("amount", amount),
|
("amount", amount),
|
||||||
("elementName", Loc.GetString(material))));
|
("elementName", stackEnt.Name)));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var (compName, info) in machineFrame.ComponentRequirements)
|
foreach (var (compName, info) in machineFrame.ComponentRequirements)
|
||||||
@@ -78,9 +72,10 @@ namespace Content.Server.Construction.Conditions
|
|||||||
if(amount == 0)
|
if(amount == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
var examineName = constructionSys.GetExamineName(info);
|
||||||
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
|
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
|
||||||
("amount", info.Amount),
|
("amount", info.Amount),
|
||||||
("elementName", Loc.GetString(info.ExamineName))));
|
("elementName", examineName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var (tagName, info) in machineFrame.TagRequirements)
|
foreach (var (tagName, info) in machineFrame.TagRequirements)
|
||||||
@@ -90,9 +85,10 @@ namespace Content.Server.Construction.Conditions
|
|||||||
if(amount == 0)
|
if(amount == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
var examineName = constructionSys.GetExamineName(info);
|
||||||
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
|
args.PushMarkup(Loc.GetString("construction-condition-machine-frame-required-element-entry",
|
||||||
("amount", info.Amount),
|
("amount", info.Amount),
|
||||||
("elementName", Loc.GetString(info.ExamineName)))
|
("elementName", examineName))
|
||||||
+ "\n");
|
+ "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +107,7 @@ namespace Content.Server.Construction.Conditions
|
|||||||
yield return new ConstructionGuideEntry()
|
yield return new ConstructionGuideEntry()
|
||||||
{
|
{
|
||||||
Localization = "construction-step-condition-machine-frame-parts",
|
Localization = "construction-step-condition-machine-frame-parts",
|
||||||
Icon = GuideIconPart,
|
Icon = GuideIconParts,
|
||||||
EntryNumber = 0, // Set this to anything so the guide generation takes this as a numbered step.
|
EntryNumber = 0, // Set this to anything so the guide generation takes this as a numbered step.
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ namespace Content.Server.Construction
|
|||||||
|
|
||||||
// If the set graph prototype does not exist, also return null. This could be due to admemes changing values
|
// If the set graph prototype does not exist, also return null. This could be due to admemes changing values
|
||||||
// in ViewVariables, so even though the construction state is invalid, just return null.
|
// in ViewVariables, so even though the construction state is invalid, just return null.
|
||||||
return _prototypeManager.TryIndex(construction.Graph, out ConstructionGraphPrototype? graph) ? graph : null;
|
return PrototypeManager.TryIndex(construction.Graph, out ConstructionGraphPrototype? graph) ? graph : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -300,7 +300,7 @@ namespace Content.Server.Construction
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Exit if the new entity's prototype is the same as the original, or the prototype is invalid
|
// Exit if the new entity's prototype is the same as the original, or the prototype is invalid
|
||||||
if (newEntity == metaData.EntityPrototype?.ID || !_prototypeManager.HasIndex<EntityPrototype>(newEntity))
|
if (newEntity == metaData.EntityPrototype?.ID || !PrototypeManager.HasIndex<EntityPrototype>(newEntity))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// [Optional] Exit if the new entity's prototype is a parent of the original
|
// [Optional] Exit if the new entity's prototype is a parent of the original
|
||||||
@@ -310,7 +310,7 @@ namespace Content.Server.Construction
|
|||||||
if (GetCurrentNode(uid, construction)?.DoNotReplaceInheritingEntities == true &&
|
if (GetCurrentNode(uid, construction)?.DoNotReplaceInheritingEntities == true &&
|
||||||
metaData.EntityPrototype?.ID != null)
|
metaData.EntityPrototype?.ID != null)
|
||||||
{
|
{
|
||||||
var parents = _prototypeManager.EnumerateParents<EntityPrototype>(metaData.EntityPrototype.ID)?.ToList();
|
var parents = PrototypeManager.EnumerateParents<EntityPrototype>(metaData.EntityPrototype.ID)?.ToList();
|
||||||
|
|
||||||
if (parents != null && parents.Any(x => x.ID == newEntity))
|
if (parents != null && parents.Any(x => x.ID == newEntity))
|
||||||
return null;
|
return null;
|
||||||
@@ -427,7 +427,7 @@ namespace Content.Server.Construction
|
|||||||
if (!Resolve(uid, ref construction))
|
if (!Resolve(uid, ref construction))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!_prototypeManager.TryIndex<ConstructionGraphPrototype>(graphId, out var graph))
|
if (!PrototypeManager.TryIndex<ConstructionGraphPrototype>(graphId, out var graph))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if(GetNodeFromGraph(graph, nodeId) is not {})
|
if(GetNodeFromGraph(graph, nodeId) is not {})
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace Content.Server.Construction
|
|||||||
|
|
||||||
private void OnGuideRequested(RequestConstructionGuide msg, EntitySessionEventArgs args)
|
private void OnGuideRequested(RequestConstructionGuide msg, EntitySessionEventArgs args)
|
||||||
{
|
{
|
||||||
if (!_prototypeManager.TryIndex(msg.ConstructionId, out ConstructionPrototype? prototype))
|
if (!PrototypeManager.TryIndex(msg.ConstructionId, out ConstructionPrototype? prototype))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(GetGuide(prototype) is {} guide)
|
if(GetGuide(prototype) is {} guide)
|
||||||
@@ -41,7 +41,7 @@ namespace Content.Server.Construction
|
|||||||
component.Node == component.DeconstructionNode)
|
component.Node == component.DeconstructionNode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!_prototypeManager.TryIndex(component.Graph, out ConstructionGraphPrototype? graph))
|
if (!PrototypeManager.TryIndex(component.Graph, out ConstructionGraphPrototype? graph))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (component.DeconstructionNode == null)
|
if (component.DeconstructionNode == null)
|
||||||
@@ -145,7 +145,7 @@ namespace Content.Server.Construction
|
|||||||
return guide;
|
return guide;
|
||||||
|
|
||||||
// If the graph doesn't actually exist, do nothing.
|
// If the graph doesn't actually exist, do nothing.
|
||||||
if (!_prototypeManager.TryIndex(construction.Graph, out ConstructionGraphPrototype? graph))
|
if (!PrototypeManager.TryIndex(construction.Graph, out ConstructionGraphPrototype? graph))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// If either the start node or the target node are missing, do nothing.
|
// If either the start node or the target node are missing, do nothing.
|
||||||
|
|||||||
@@ -325,13 +325,13 @@ namespace Content.Server.Construction
|
|||||||
// LEGACY CODE. See warning at the top of the file!
|
// LEGACY CODE. See warning at the top of the file!
|
||||||
public async Task<bool> TryStartItemConstruction(string prototype, EntityUid user)
|
public async Task<bool> TryStartItemConstruction(string prototype, EntityUid user)
|
||||||
{
|
{
|
||||||
if (!_prototypeManager.TryIndex(prototype, out ConstructionPrototype? constructionPrototype))
|
if (!PrototypeManager.TryIndex(prototype, out ConstructionPrototype? constructionPrototype))
|
||||||
{
|
{
|
||||||
Log.Error($"Tried to start construction of invalid recipe '{prototype}'!");
|
Log.Error($"Tried to start construction of invalid recipe '{prototype}'!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_prototypeManager.TryIndex(constructionPrototype.Graph,
|
if (!PrototypeManager.TryIndex(constructionPrototype.Graph,
|
||||||
out ConstructionGraphPrototype? constructionGraph))
|
out ConstructionGraphPrototype? constructionGraph))
|
||||||
{
|
{
|
||||||
Log.Error(
|
Log.Error(
|
||||||
@@ -404,14 +404,14 @@ namespace Content.Server.Construction
|
|||||||
// LEGACY CODE. See warning at the top of the file!
|
// LEGACY CODE. See warning at the top of the file!
|
||||||
private async void HandleStartStructureConstruction(TryStartStructureConstructionMessage ev, EntitySessionEventArgs args)
|
private async void HandleStartStructureConstruction(TryStartStructureConstructionMessage ev, EntitySessionEventArgs args)
|
||||||
{
|
{
|
||||||
if (!_prototypeManager.TryIndex(ev.PrototypeName, out ConstructionPrototype? constructionPrototype))
|
if (!PrototypeManager.TryIndex(ev.PrototypeName, out ConstructionPrototype? constructionPrototype))
|
||||||
{
|
{
|
||||||
Log.Error($"Tried to start construction of invalid recipe '{ev.PrototypeName}'!");
|
Log.Error($"Tried to start construction of invalid recipe '{ev.PrototypeName}'!");
|
||||||
RaiseNetworkEvent(new AckStructureConstructionMessage(ev.Ack));
|
RaiseNetworkEvent(new AckStructureConstructionMessage(ev.Ack));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_prototypeManager.TryIndex(constructionPrototype.Graph, out ConstructionGraphPrototype? constructionGraph))
|
if (!PrototypeManager.TryIndex(constructionPrototype.Graph, out ConstructionGraphPrototype? constructionGraph))
|
||||||
{
|
{
|
||||||
Log.Error($"Invalid construction graph '{constructionPrototype.Graph}' in recipe '{ev.PrototypeName}'!");
|
Log.Error($"Invalid construction graph '{constructionPrototype.Graph}' in recipe '{ev.PrototypeName}'!");
|
||||||
RaiseNetworkEvent(new AckStructureConstructionMessage(ev.Ack));
|
RaiseNetworkEvent(new AckStructureConstructionMessage(ev.Ack));
|
||||||
|
|||||||
@@ -1,23 +1,15 @@
|
|||||||
using System.Linq;
|
|
||||||
using Content.Server.Construction.Components;
|
using Content.Server.Construction.Components;
|
||||||
using Content.Server.Examine;
|
|
||||||
using Content.Shared.Construction.Components;
|
using Content.Shared.Construction.Components;
|
||||||
using Content.Shared.Construction.Prototypes;
|
|
||||||
using Content.Shared.Verbs;
|
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Utility;
|
|
||||||
|
|
||||||
namespace Content.Server.Construction;
|
namespace Content.Server.Construction;
|
||||||
|
|
||||||
public sealed partial class ConstructionSystem
|
public sealed partial class ConstructionSystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly ExamineSystem _examineSystem = default!;
|
|
||||||
|
|
||||||
private void InitializeMachines()
|
private void InitializeMachines()
|
||||||
{
|
{
|
||||||
SubscribeLocalEvent<MachineComponent, ComponentInit>(OnMachineInit);
|
SubscribeLocalEvent<MachineComponent, ComponentInit>(OnMachineInit);
|
||||||
SubscribeLocalEvent<MachineComponent, MapInitEvent>(OnMachineMapInit);
|
SubscribeLocalEvent<MachineComponent, MapInitEvent>(OnMachineMapInit);
|
||||||
SubscribeLocalEvent<MachineComponent, GetVerbsEvent<ExamineVerb>>(OnMachineExaminableVerb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnMachineInit(EntityUid uid, MachineComponent component, ComponentInit args)
|
private void OnMachineInit(EntityUid uid, MachineComponent component, ComponentInit args)
|
||||||
@@ -29,84 +21,6 @@ public sealed partial class ConstructionSystem
|
|||||||
private void OnMachineMapInit(EntityUid uid, MachineComponent component, MapInitEvent args)
|
private void OnMachineMapInit(EntityUid uid, MachineComponent component, MapInitEvent args)
|
||||||
{
|
{
|
||||||
CreateBoardAndStockParts(uid, component);
|
CreateBoardAndStockParts(uid, component);
|
||||||
RefreshParts(uid, component);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnMachineExaminableVerb(EntityUid uid, MachineComponent component, GetVerbsEvent<ExamineVerb> args)
|
|
||||||
{
|
|
||||||
if (!args.CanInteract || !args.CanAccess)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var markup = new FormattedMessage();
|
|
||||||
RaiseLocalEvent(uid, new UpgradeExamineEvent(ref markup));
|
|
||||||
if (markup.IsEmpty)
|
|
||||||
return; // Not upgradable.
|
|
||||||
|
|
||||||
markup = FormattedMessage.FromMarkup(markup.ToMarkup().TrimEnd('\n')); // Cursed workaround to https://github.com/space-wizards/RobustToolbox/issues/3371
|
|
||||||
|
|
||||||
var verb = new ExamineVerb()
|
|
||||||
{
|
|
||||||
Act = () =>
|
|
||||||
{
|
|
||||||
_examineSystem.SendExamineTooltip(args.User, uid, markup, getVerbs: false, centerAtCursor: false);
|
|
||||||
},
|
|
||||||
Text = Loc.GetString("machine-upgrade-examinable-verb-text"),
|
|
||||||
Message = Loc.GetString("machine-upgrade-examinable-verb-message"),
|
|
||||||
Category = VerbCategory.Examine,
|
|
||||||
Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/pickup.svg.192dpi.png"))
|
|
||||||
};
|
|
||||||
|
|
||||||
args.Verbs.Add(verb);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<MachinePartComponent> GetAllParts(EntityUid uid, MachineComponent? component = null)
|
|
||||||
{
|
|
||||||
if (!Resolve(uid, ref component))
|
|
||||||
return new List<MachinePartComponent>();
|
|
||||||
|
|
||||||
return GetAllParts(component);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<MachinePartComponent> GetAllParts(MachineComponent component)
|
|
||||||
{
|
|
||||||
var parts = new List<MachinePartComponent>();
|
|
||||||
|
|
||||||
foreach (var entity in component.PartContainer.ContainedEntities)
|
|
||||||
{
|
|
||||||
if (TryComp<MachinePartComponent>(entity, out var machinePart))
|
|
||||||
parts.Add(machinePart);
|
|
||||||
}
|
|
||||||
|
|
||||||
return parts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dictionary<string, float> GetPartsRatings(List<MachinePartComponent> parts)
|
|
||||||
{
|
|
||||||
var output = new Dictionary<string, float>();
|
|
||||||
foreach (var type in _prototypeManager.EnumeratePrototypes<MachinePartPrototype>())
|
|
||||||
{
|
|
||||||
var amount = 0f;
|
|
||||||
var sumRating = 0f;
|
|
||||||
foreach (var part in parts.Where(part => part.PartType == type.ID))
|
|
||||||
{
|
|
||||||
amount++;
|
|
||||||
sumRating += part.Rating;
|
|
||||||
}
|
|
||||||
var rating = amount != 0 ? sumRating / amount : 0;
|
|
||||||
output.Add(type.ID, rating);
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RefreshParts(EntityUid uid, MachineComponent component)
|
|
||||||
{
|
|
||||||
var parts = GetAllParts(component);
|
|
||||||
EntityManager.EventBus.RaiseLocalEvent(uid, new RefreshPartsEvent
|
|
||||||
{
|
|
||||||
Parts = parts,
|
|
||||||
PartRatings = GetPartsRatings(parts),
|
|
||||||
}, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateBoardAndStockParts(EntityUid uid, MachineComponent component)
|
private void CreateBoardAndStockParts(EntityUid uid, MachineComponent component)
|
||||||
@@ -115,54 +29,37 @@ public sealed partial class ConstructionSystem
|
|||||||
var boardContainer = _container.EnsureContainer<Container>(uid, MachineFrameComponent.BoardContainerName);
|
var boardContainer = _container.EnsureContainer<Container>(uid, MachineFrameComponent.BoardContainerName);
|
||||||
var partContainer = _container.EnsureContainer<Container>(uid, MachineFrameComponent.PartContainerName);
|
var partContainer = _container.EnsureContainer<Container>(uid, MachineFrameComponent.PartContainerName);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(component.BoardPrototype))
|
if (string.IsNullOrEmpty(component.Board))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// We're done here, let's suppose all containers are correct just so we don't screw SaveLoadSave.
|
// We're done here, let's suppose all containers are correct just so we don't screw SaveLoadSave.
|
||||||
if (boardContainer.ContainedEntities.Count > 0)
|
if (boardContainer.ContainedEntities.Count > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var board = EntityManager.SpawnEntity(component.BoardPrototype, Transform(uid).Coordinates);
|
var xform = Transform(uid);
|
||||||
|
if (!TrySpawnInContainer(component.Board, uid, MachineFrameComponent.BoardContainerName, out var board))
|
||||||
if (!_container.Insert(board, component.BoardContainer))
|
|
||||||
{
|
{
|
||||||
throw new Exception($"Couldn't insert board with prototype {component.BoardPrototype} to machine with prototype {MetaData(uid).EntityPrototype?.ID ?? "N/A"}!");
|
throw new Exception($"Couldn't insert board with prototype {component.Board} to machine with prototype {Prototype(uid)?.ID ?? "N/A"}!");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TryComp<MachineBoardComponent>(board, out var machineBoard))
|
if (!TryComp<MachineBoardComponent>(board, out var machineBoard))
|
||||||
{
|
{
|
||||||
throw new Exception($"Entity with prototype {component.BoardPrototype} doesn't have a {nameof(MachineBoardComponent)}!");
|
throw new Exception($"Entity with prototype {component.Board} doesn't have a {nameof(MachineBoardComponent)}!");
|
||||||
}
|
}
|
||||||
|
|
||||||
var xform = Transform(uid);
|
foreach (var (stackType, amount) in machineBoard.StackRequirements)
|
||||||
foreach (var (part, amount) in machineBoard.Requirements)
|
|
||||||
{
|
{
|
||||||
var partProto = _prototypeManager.Index<MachinePartPrototype>(part);
|
var stack = _stackSystem.Spawn(amount, stackType, xform.Coordinates);
|
||||||
for (var i = 0; i < amount; i++)
|
|
||||||
{
|
|
||||||
var p = EntityManager.SpawnEntity(partProto.StockPartPrototype, xform.Coordinates);
|
|
||||||
|
|
||||||
if (!_container.Insert(p, partContainer))
|
|
||||||
throw new Exception($"Couldn't insert machine part of type {part} to machine with prototype {partProto.StockPartPrototype}!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var (stackType, amount) in machineBoard.MaterialRequirements)
|
|
||||||
{
|
|
||||||
var stack = _stackSystem.Spawn(amount, stackType, Transform(uid).Coordinates);
|
|
||||||
|
|
||||||
if (!_container.Insert(stack, partContainer))
|
if (!_container.Insert(stack, partContainer))
|
||||||
throw new Exception($"Couldn't insert machine material of type {stackType} to machine with prototype {MetaData(uid).EntityPrototype?.ID ?? "N/A"}");
|
throw new Exception($"Couldn't insert machine material of type {stackType} to machine with prototype {Prototype(uid)?.ID ?? "N/A"}");
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var (compName, info) in machineBoard.ComponentRequirements)
|
foreach (var (compName, info) in machineBoard.ComponentRequirements)
|
||||||
{
|
{
|
||||||
for (var i = 0; i < info.Amount; i++)
|
for (var i = 0; i < info.Amount; i++)
|
||||||
{
|
{
|
||||||
var c = EntityManager.SpawnEntity(info.DefaultPrototype, Transform(uid).Coordinates);
|
if(!TrySpawnInContainer(info.DefaultPrototype, uid, MachineFrameComponent.PartContainerName, out _))
|
||||||
|
throw new Exception($"Couldn't insert machine component part with default prototype '{compName}' to machine with prototype {Prototype(uid)?.ID ?? "N/A"}");
|
||||||
if(!_container.Insert(c, partContainer))
|
|
||||||
throw new Exception($"Couldn't insert machine component part with default prototype '{compName}' to machine with prototype {MetaData(uid).EntityPrototype?.ID ?? "N/A"}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,58 +67,9 @@ public sealed partial class ConstructionSystem
|
|||||||
{
|
{
|
||||||
for (var i = 0; i < info.Amount; i++)
|
for (var i = 0; i < info.Amount; i++)
|
||||||
{
|
{
|
||||||
var c = EntityManager.SpawnEntity(info.DefaultPrototype, Transform(uid).Coordinates);
|
if(!TrySpawnInContainer(info.DefaultPrototype, uid, MachineFrameComponent.PartContainerName, out _))
|
||||||
|
throw new Exception($"Couldn't insert machine component part with default prototype '{tagName}' to machine with prototype {Prototype(uid)?.ID ?? "N/A"}");
|
||||||
if(!_container.Insert(c, partContainer))
|
|
||||||
throw new Exception($"Couldn't insert machine component part with default prototype '{tagName}' to machine with prototype {MetaData(uid).EntityPrototype?.ID ?? "N/A"}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class RefreshPartsEvent : EntityEventArgs
|
|
||||||
{
|
|
||||||
public IReadOnlyList<MachinePartComponent> Parts = new List<MachinePartComponent>();
|
|
||||||
|
|
||||||
public Dictionary<string, float> PartRatings = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class UpgradeExamineEvent : EntityEventArgs
|
|
||||||
{
|
|
||||||
private FormattedMessage Message;
|
|
||||||
|
|
||||||
public UpgradeExamineEvent(ref FormattedMessage message)
|
|
||||||
{
|
|
||||||
Message = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Add a line to the upgrade examine tooltip with a percentage-based increase or decrease.
|
|
||||||
/// </summary>
|
|
||||||
public void AddPercentageUpgrade(string upgradedLocId, float multiplier)
|
|
||||||
{
|
|
||||||
var percent = Math.Round(100 * MathF.Abs(multiplier - 1), 2);
|
|
||||||
var locId = multiplier switch {
|
|
||||||
< 1 => "machine-upgrade-decreased-by-percentage",
|
|
||||||
1 or float.NaN => "machine-upgrade-not-upgraded",
|
|
||||||
> 1 => "machine-upgrade-increased-by-percentage",
|
|
||||||
};
|
|
||||||
var upgraded = Loc.GetString(upgradedLocId);
|
|
||||||
this.Message.AddMarkup(Loc.GetString(locId, ("upgraded", upgraded), ("percent", percent)) + '\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Add a line to the upgrade examine tooltip with a numeric increase or decrease.
|
|
||||||
/// </summary>
|
|
||||||
public void AddNumberUpgrade(string upgradedLocId, int number)
|
|
||||||
{
|
|
||||||
var difference = Math.Abs(number);
|
|
||||||
var locId = number switch {
|
|
||||||
< 0 => "machine-upgrade-decreased-by-amount",
|
|
||||||
0 => "machine-upgrade-not-upgraded",
|
|
||||||
> 0 => "machine-upgrade-increased-by-amount",
|
|
||||||
};
|
|
||||||
var upgraded = Loc.GetString(upgradedLocId);
|
|
||||||
this.Message.AddMarkup(Loc.GetString(locId, ("upgraded", upgraded), ("difference", difference)) + '\n');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ namespace Content.Server.Construction
|
|||||||
[UsedImplicitly]
|
[UsedImplicitly]
|
||||||
public sealed partial class ConstructionSystem : SharedConstructionSystem
|
public sealed partial class ConstructionSystem : SharedConstructionSystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
|
||||||
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
||||||
[Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
|
[Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
|
||||||
[Dependency] private readonly ContainerSystem _container = default!;
|
[Dependency] private readonly ContainerSystem _container = default!;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using Content.Shared.Stacks;
|
|||||||
using Content.Shared.Tag;
|
using Content.Shared.Tag;
|
||||||
using Content.Shared.Popups;
|
using Content.Shared.Popups;
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Server.Construction;
|
namespace Content.Server.Construction;
|
||||||
|
|
||||||
@@ -62,24 +62,7 @@ public sealed class MachineFrameSystem : EntitySystem
|
|||||||
// If this changes in the future, then RegenerateProgress() also needs to be updated.
|
// If this changes in the future, then RegenerateProgress() also needs to be updated.
|
||||||
// Note that one entity is ALLOWED to satisfy more than one kind of component or tag requirements. This is
|
// Note that one entity is ALLOWED to satisfy more than one kind of component or tag requirements. This is
|
||||||
// necessary in order to avoid weird entity-ordering shenanigans in RegenerateProgress().
|
// necessary in order to avoid weird entity-ordering shenanigans in RegenerateProgress().
|
||||||
var stack = CompOrNull<StackComponent>(args.Used);
|
if (TryComp<StackComponent>(args.Used, out var stack))
|
||||||
var machinePart = CompOrNull<MachinePartComponent>(args.Used);
|
|
||||||
if (stack != null && machinePart != null)
|
|
||||||
{
|
|
||||||
if (TryInsertPartStack(uid, args.Used, component, machinePart, stack))
|
|
||||||
args.Handled = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle parts
|
|
||||||
if (machinePart != null)
|
|
||||||
{
|
|
||||||
if (TryInsertPart(uid, args.Used, component, machinePart))
|
|
||||||
args.Handled = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stack != null)
|
|
||||||
{
|
{
|
||||||
if (TryInsertStack(uid, args.Used, component, stack))
|
if (TryInsertStack(uid, args.Used, component, stack))
|
||||||
args.Handled = true;
|
args.Handled = true;
|
||||||
@@ -172,67 +155,6 @@ public sealed class MachineFrameSystem : EntitySystem
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <returns>Whether or not the function had any effect. Does not indicate success.</returns>
|
|
||||||
private bool TryInsertPart(EntityUid uid, EntityUid used, MachineFrameComponent component, MachinePartComponent machinePart)
|
|
||||||
{
|
|
||||||
DebugTools.Assert(!HasComp<StackComponent>(uid));
|
|
||||||
if (!component.Requirements.ContainsKey(machinePart.PartType))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (component.Progress[machinePart.PartType] >= component.Requirements[machinePart.PartType])
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!_container.TryRemoveFromContainer(used))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!_container.Insert(used, component.PartContainer))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
component.Progress[machinePart.PartType]++;
|
|
||||||
if (IsComplete(component))
|
|
||||||
_popupSystem.PopupEntity(Loc.GetString("machine-frame-component-on-complete"), uid);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <returns>Whether or not the function had any effect. Does not indicate success.</returns>
|
|
||||||
private bool TryInsertPartStack(EntityUid uid, EntityUid used, MachineFrameComponent component, MachinePartComponent machinePart, StackComponent stack)
|
|
||||||
{
|
|
||||||
if (!component.Requirements.ContainsKey(machinePart.PartType))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var progress = component.Progress[machinePart.PartType];
|
|
||||||
var requirement = component.Requirements[machinePart.PartType];
|
|
||||||
|
|
||||||
var needed = requirement - progress;
|
|
||||||
if (needed <= 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var count = stack.Count;
|
|
||||||
if (count < needed)
|
|
||||||
{
|
|
||||||
if (!_container.Insert(used, component.PartContainer))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
component.Progress[machinePart.PartType] += count;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var splitStack = _stack.Split(used, needed, Transform(uid).Coordinates, stack);
|
|
||||||
|
|
||||||
if (splitStack == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!_container.Insert(splitStack.Value, component.PartContainer))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
component.Progress[machinePart.PartType] += needed;
|
|
||||||
if (IsComplete(component))
|
|
||||||
_popupSystem.PopupEntity(Loc.GetString("machine-frame-component-on-complete"), uid);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <returns>Whether or not the function had any effect. Does not indicate success.</returns>
|
/// <returns>Whether or not the function had any effect. Does not indicate success.</returns>
|
||||||
private bool TryInsertStack(EntityUid uid, EntityUid used, MachineFrameComponent component, StackComponent stack)
|
private bool TryInsertStack(EntityUid uid, EntityUid used, MachineFrameComponent component, StackComponent stack)
|
||||||
{
|
{
|
||||||
@@ -281,12 +203,6 @@ public sealed class MachineFrameSystem : EntitySystem
|
|||||||
if (!component.HasBoard)
|
if (!component.HasBoard)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
foreach (var (part, amount) in component.Requirements)
|
|
||||||
{
|
|
||||||
if (component.Progress[part] < amount)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var (type, amount) in component.MaterialRequirements)
|
foreach (var (type, amount) in component.MaterialRequirements)
|
||||||
{
|
{
|
||||||
if (component.MaterialProgress[type] < amount)
|
if (component.MaterialProgress[type] < amount)
|
||||||
@@ -310,21 +226,14 @@ public sealed class MachineFrameSystem : EntitySystem
|
|||||||
|
|
||||||
public void ResetProgressAndRequirements(MachineFrameComponent component, MachineBoardComponent machineBoard)
|
public void ResetProgressAndRequirements(MachineFrameComponent component, MachineBoardComponent machineBoard)
|
||||||
{
|
{
|
||||||
component.Requirements = new Dictionary<string, int>(machineBoard.Requirements);
|
component.MaterialRequirements = new Dictionary<ProtoId<StackPrototype>, int>(machineBoard.StackRequirements);
|
||||||
component.MaterialRequirements = new Dictionary<string, int>(machineBoard.MaterialIdRequirements);
|
|
||||||
component.ComponentRequirements = new Dictionary<string, GenericPartInfo>(machineBoard.ComponentRequirements);
|
component.ComponentRequirements = new Dictionary<string, GenericPartInfo>(machineBoard.ComponentRequirements);
|
||||||
component.TagRequirements = new Dictionary<string, GenericPartInfo>(machineBoard.TagRequirements);
|
component.TagRequirements = new Dictionary<ProtoId<TagPrototype>, GenericPartInfo>(machineBoard.TagRequirements);
|
||||||
|
|
||||||
component.Progress.Clear();
|
|
||||||
component.MaterialProgress.Clear();
|
component.MaterialProgress.Clear();
|
||||||
component.ComponentProgress.Clear();
|
component.ComponentProgress.Clear();
|
||||||
component.TagProgress.Clear();
|
component.TagProgress.Clear();
|
||||||
|
|
||||||
foreach (var (machinePart, _) in component.Requirements)
|
|
||||||
{
|
|
||||||
component.Progress[machinePart] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var (stackType, _) in component.MaterialRequirements)
|
foreach (var (stackType, _) in component.MaterialRequirements)
|
||||||
{
|
{
|
||||||
component.MaterialProgress[stackType] = 0;
|
component.MaterialProgress[stackType] = 0;
|
||||||
@@ -349,7 +258,6 @@ public sealed class MachineFrameSystem : EntitySystem
|
|||||||
component.MaterialRequirements.Clear();
|
component.MaterialRequirements.Clear();
|
||||||
component.ComponentRequirements.Clear();
|
component.ComponentRequirements.Clear();
|
||||||
component.TagRequirements.Clear();
|
component.TagRequirements.Clear();
|
||||||
component.Progress.Clear();
|
|
||||||
component.MaterialProgress.Clear();
|
component.MaterialProgress.Clear();
|
||||||
component.ComponentProgress.Clear();
|
component.ComponentProgress.Clear();
|
||||||
component.TagProgress.Clear();
|
component.TagProgress.Clear();
|
||||||
@@ -368,19 +276,6 @@ public sealed class MachineFrameSystem : EntitySystem
|
|||||||
|
|
||||||
foreach (var part in component.PartContainer.ContainedEntities)
|
foreach (var part in component.PartContainer.ContainedEntities)
|
||||||
{
|
{
|
||||||
if (TryComp<MachinePartComponent>(part, out var machinePart))
|
|
||||||
{
|
|
||||||
// Check this is part of the requirements...
|
|
||||||
if (!component.Requirements.ContainsKey(machinePart.PartType))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!component.Progress.ContainsKey(machinePart.PartType))
|
|
||||||
component.Progress[machinePart.PartType] = 1;
|
|
||||||
else
|
|
||||||
component.Progress[machinePart.PartType]++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TryComp<StackComponent>(part, out var stack))
|
if (TryComp<StackComponent>(part, out var stack))
|
||||||
{
|
{
|
||||||
var type = stack.StackTypeId;
|
var type = stack.StackTypeId;
|
||||||
@@ -404,9 +299,7 @@ public sealed class MachineFrameSystem : EntitySystem
|
|||||||
if (!HasComp(part, registration.Type))
|
if (!HasComp(part, registration.Type))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!component.ComponentProgress.ContainsKey(compName))
|
if (!component.ComponentProgress.TryAdd(compName, 1))
|
||||||
component.ComponentProgress[compName] = 1;
|
|
||||||
else
|
|
||||||
component.ComponentProgress[compName]++;
|
component.ComponentProgress[compName]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -419,18 +312,17 @@ public sealed class MachineFrameSystem : EntitySystem
|
|||||||
if (!_tag.HasTag(tagComp, tagName))
|
if (!_tag.HasTag(tagComp, tagName))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!component.TagProgress.ContainsKey(tagName))
|
if (!component.TagProgress.TryAdd(tagName, 1))
|
||||||
component.TagProgress[tagName] = 1;
|
|
||||||
else
|
|
||||||
component.TagProgress[tagName]++;
|
component.TagProgress[tagName]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void OnMachineFrameExamined(EntityUid uid, MachineFrameComponent component, ExaminedEvent args)
|
private void OnMachineFrameExamined(EntityUid uid, MachineFrameComponent component, ExaminedEvent args)
|
||||||
{
|
{
|
||||||
if (!args.IsInDetailsRange)
|
if (!args.IsInDetailsRange || !component.HasBoard)
|
||||||
return;
|
return;
|
||||||
if (component.HasBoard)
|
|
||||||
args.PushMarkup(Loc.GetString("machine-frame-component-on-examine-label", ("board", EntityManager.GetComponent<MetaDataComponent>(component.BoardContainer.ContainedEntities[0]).EntityName)));
|
var board = component.BoardContainer.ContainedEntities[0];
|
||||||
|
args.PushMarkup(Loc.GetString("machine-frame-component-on-examine-label", ("board", Name(board))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,180 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Content.Server.Construction.Components;
|
|
||||||
using Content.Server.Storage.EntitySystems;
|
|
||||||
using Content.Shared.DoAfter;
|
|
||||||
using Content.Shared.Construction.Components;
|
|
||||||
using Content.Shared.Exchanger;
|
|
||||||
using Content.Shared.Interaction;
|
|
||||||
using Content.Shared.Popups;
|
|
||||||
using Content.Shared.Storage;
|
|
||||||
using Robust.Shared.Containers;
|
|
||||||
using Robust.Shared.Utility;
|
|
||||||
using Content.Shared.Wires;
|
|
||||||
using Robust.Shared.Audio.Systems;
|
|
||||||
using Robust.Shared.Collections;
|
|
||||||
|
|
||||||
namespace Content.Server.Construction;
|
|
||||||
|
|
||||||
public sealed class PartExchangerSystem : EntitySystem
|
|
||||||
{
|
|
||||||
[Dependency] private readonly ConstructionSystem _construction = default!;
|
|
||||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
|
||||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
|
||||||
[Dependency] private readonly SharedContainerSystem _container = default!;
|
|
||||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
|
||||||
[Dependency] private readonly StorageSystem _storage = default!;
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public override void Initialize()
|
|
||||||
{
|
|
||||||
SubscribeLocalEvent<PartExchangerComponent, AfterInteractEvent>(OnAfterInteract);
|
|
||||||
SubscribeLocalEvent<PartExchangerComponent, ExchangerDoAfterEvent>(OnDoAfter);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnDoAfter(EntityUid uid, PartExchangerComponent component, DoAfterEvent args)
|
|
||||||
{
|
|
||||||
if (args.Cancelled)
|
|
||||||
{
|
|
||||||
component.AudioStream = _audio.Stop(component.AudioStream);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.Handled || args.Args.Target == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!TryComp<StorageComponent>(uid, out var storage))
|
|
||||||
return; //the parts are stored in here
|
|
||||||
|
|
||||||
var machinePartQuery = GetEntityQuery<MachinePartComponent>();
|
|
||||||
var machineParts = new List<(EntityUid, MachinePartComponent)>();
|
|
||||||
|
|
||||||
foreach (var item in storage.Container.ContainedEntities) //get parts in RPED
|
|
||||||
{
|
|
||||||
if (machinePartQuery.TryGetComponent(item, out var part))
|
|
||||||
machineParts.Add((item, part));
|
|
||||||
}
|
|
||||||
|
|
||||||
TryExchangeMachineParts(args.Args.Target.Value, uid, machineParts);
|
|
||||||
TryConstructMachineParts(args.Args.Target.Value, uid, machineParts);
|
|
||||||
|
|
||||||
args.Handled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void TryExchangeMachineParts(EntityUid uid, EntityUid storageUid, List<(EntityUid part, MachinePartComponent partComp)> machineParts)
|
|
||||||
{
|
|
||||||
if (!TryComp<MachineComponent>(uid, out var machine))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var machinePartQuery = GetEntityQuery<MachinePartComponent>();
|
|
||||||
var board = machine.BoardContainer.ContainedEntities.FirstOrNull();
|
|
||||||
|
|
||||||
if (board == null || !TryComp<MachineBoardComponent>(board, out var macBoardComp))
|
|
||||||
return;
|
|
||||||
|
|
||||||
foreach (var item in new ValueList<EntityUid>(machine.PartContainer.ContainedEntities)) //clone so don't modify during enumeration
|
|
||||||
{
|
|
||||||
if (machinePartQuery.TryGetComponent(item, out var part))
|
|
||||||
{
|
|
||||||
machineParts.Add((item, part));
|
|
||||||
_container.RemoveEntity(uid, item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
machineParts.Sort((x, y) => y.partComp.Rating.CompareTo(x.partComp.Rating));
|
|
||||||
|
|
||||||
var updatedParts = new List<(EntityUid part, MachinePartComponent partComp)>();
|
|
||||||
foreach (var (type, amount) in macBoardComp.Requirements)
|
|
||||||
{
|
|
||||||
var target = machineParts.Where(p => p.partComp.PartType == type).Take(amount);
|
|
||||||
updatedParts.AddRange(target);
|
|
||||||
}
|
|
||||||
foreach (var part in updatedParts)
|
|
||||||
{
|
|
||||||
_container.Insert(part.part, machine.PartContainer);
|
|
||||||
machineParts.Remove(part);
|
|
||||||
}
|
|
||||||
|
|
||||||
//put the unused parts back into rped. (this also does the "swapping")
|
|
||||||
foreach (var (unused, _) in machineParts)
|
|
||||||
{
|
|
||||||
_storage.Insert(storageUid, unused, out _, playSound: false);
|
|
||||||
}
|
|
||||||
_construction.RefreshParts(uid, machine);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void TryConstructMachineParts(EntityUid uid, EntityUid storageEnt, List<(EntityUid part, MachinePartComponent partComp)> machineParts)
|
|
||||||
{
|
|
||||||
if (!TryComp<MachineFrameComponent>(uid, out var machine))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var machinePartQuery = GetEntityQuery<MachinePartComponent>();
|
|
||||||
var board = machine.BoardContainer.ContainedEntities.FirstOrNull();
|
|
||||||
|
|
||||||
if (!machine.HasBoard || !TryComp<MachineBoardComponent>(board, out var macBoardComp))
|
|
||||||
return;
|
|
||||||
|
|
||||||
foreach (var item in new ValueList<EntityUid>(machine.PartContainer.ContainedEntities)) //clone so don't modify during enumeration
|
|
||||||
{
|
|
||||||
if (machinePartQuery.TryGetComponent(item, out var part))
|
|
||||||
{
|
|
||||||
machineParts.Add((item, part));
|
|
||||||
_container.RemoveEntity(uid, item);
|
|
||||||
machine.Progress[part.PartType]--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
machineParts.Sort((x, y) => y.partComp.Rating.CompareTo(x.partComp.Rating));
|
|
||||||
|
|
||||||
var updatedParts = new List<(EntityUid part, MachinePartComponent partComp)>();
|
|
||||||
foreach (var (type, amount) in macBoardComp.Requirements)
|
|
||||||
{
|
|
||||||
var target = machineParts.Where(p => p.partComp.PartType == type).Take(amount);
|
|
||||||
updatedParts.AddRange(target);
|
|
||||||
}
|
|
||||||
foreach (var pair in updatedParts)
|
|
||||||
{
|
|
||||||
var part = pair.partComp;
|
|
||||||
var partEnt = pair.part;
|
|
||||||
|
|
||||||
if (!machine.Requirements.ContainsKey(part.PartType))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
_container.Insert(partEnt, machine.PartContainer);
|
|
||||||
machine.Progress[part.PartType]++;
|
|
||||||
machineParts.Remove(pair);
|
|
||||||
}
|
|
||||||
|
|
||||||
//put the unused parts back into rped. (this also does the "swapping")
|
|
||||||
foreach (var (unused, _) in machineParts)
|
|
||||||
{
|
|
||||||
_storage.Insert(storageEnt, unused, out _, playSound: false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnAfterInteract(EntityUid uid, PartExchangerComponent component, AfterInteractEvent args)
|
|
||||||
{
|
|
||||||
if (component.DoDistanceCheck && !args.CanReach)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (args.Target == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!HasComp<MachineComponent>(args.Target) && !HasComp<MachineFrameComponent>(args.Target))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (TryComp<WiresPanelComponent>(args.Target, out var panel) && !panel.Open)
|
|
||||||
{
|
|
||||||
_popup.PopupEntity(Loc.GetString("construction-step-condition-wire-panel-open"),
|
|
||||||
args.Target.Value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
component.AudioStream = _audio.PlayPvs(component.ExchangeSound, uid).Value.Entity;
|
|
||||||
|
|
||||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.ExchangeDuration, new ExchangerDoAfterEvent(), uid, target: args.Target, used: uid)
|
|
||||||
{
|
|
||||||
BreakOnDamage = true,
|
|
||||||
BreakOnMove = true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -71,6 +71,15 @@ namespace Content.Server.Stack
|
|||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Spawns a stack of a certain stack type. See <see cref="StackPrototype"/>.
|
||||||
|
/// </summary>
|
||||||
|
public EntityUid Spawn(int amount, ProtoId<StackPrototype> id, EntityCoordinates spawnPosition)
|
||||||
|
{
|
||||||
|
var proto = _prototypeManager.Index(id);
|
||||||
|
return Spawn(amount, proto, spawnPosition);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Spawns a stack of a certain stack type. See <see cref="StackPrototype"/>.
|
/// Spawns a stack of a certain stack type. See <see cref="StackPrototype"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,54 +1,47 @@
|
|||||||
using Content.Shared.Construction.Prototypes;
|
|
||||||
using Content.Shared.Stacks;
|
using Content.Shared.Stacks;
|
||||||
|
using Content.Shared.Tag;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
|
|
||||||
|
|
||||||
namespace Content.Shared.Construction.Components
|
namespace Content.Shared.Construction.Components;
|
||||||
{
|
|
||||||
[RegisterComponent, NetworkedComponent]
|
[RegisterComponent, NetworkedComponent]
|
||||||
public sealed partial class MachineBoardComponent : Component
|
public sealed partial class MachineBoardComponent : Component
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
/// <summary>
|
||||||
|
/// The stacks needed to construct this machine
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public Dictionary<ProtoId<StackPrototype>, int> StackRequirements = new();
|
||||||
|
|
||||||
[DataField("requirements", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, MachinePartPrototype>))]
|
/// <summary>
|
||||||
public Dictionary<string, int> Requirements = new();
|
/// Entities needed to construct this machine, discriminated by tag.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public Dictionary<ProtoId<TagPrototype>, GenericPartInfo> TagRequirements = new();
|
||||||
|
|
||||||
[DataField("materialRequirements")]
|
/// <summary>
|
||||||
public Dictionary<string, int> MaterialIdRequirements = new();
|
/// Entities needed to construct this machine, discriminated by component.
|
||||||
|
/// </summary>
|
||||||
[DataField("tagRequirements")]
|
[DataField]
|
||||||
public Dictionary<string, GenericPartInfo> TagRequirements = new();
|
|
||||||
|
|
||||||
[DataField("componentRequirements")]
|
|
||||||
public Dictionary<string, GenericPartInfo> ComponentRequirements = new();
|
public Dictionary<string, GenericPartInfo> ComponentRequirements = new();
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
/// <summary>
|
||||||
[DataField("prototype")]
|
/// The machine that's constructed when this machine board is completed.
|
||||||
public string? Prototype { get; private set; }
|
/// </summary>
|
||||||
|
[DataField(required: true)]
|
||||||
public IEnumerable<KeyValuePair<StackPrototype, int>> MaterialRequirements
|
public EntProtoId Prototype;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
foreach (var (materialId, amount) in MaterialIdRequirements)
|
|
||||||
{
|
|
||||||
var material = _prototypeManager.Index<StackPrototype>(materialId);
|
|
||||||
yield return new KeyValuePair<StackPrototype, int>(material, amount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[DataDefinition, Serializable]
|
||||||
[DataDefinition]
|
|
||||||
public partial struct GenericPartInfo
|
public partial struct GenericPartInfo
|
||||||
{
|
{
|
||||||
[DataField("Amount")]
|
[DataField(required: true)]
|
||||||
public int Amount;
|
public int Amount;
|
||||||
[DataField("ExamineName")]
|
|
||||||
public string ExamineName;
|
[DataField(required: true)]
|
||||||
[DataField("DefaultPrototype")]
|
public EntProtoId DefaultPrototype;
|
||||||
public string DefaultPrototype;
|
|
||||||
}
|
[DataField]
|
||||||
|
public LocId? ExamineName;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
using Content.Shared.Construction.Prototypes;
|
|
||||||
using Robust.Shared.GameStates;
|
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
|
||||||
|
|
||||||
namespace Content.Shared.Construction.Components
|
|
||||||
{
|
|
||||||
[RegisterComponent, NetworkedComponent]
|
|
||||||
public sealed partial class MachinePartComponent : Component
|
|
||||||
{
|
|
||||||
[DataField("part", required: true, customTypeSerializer: typeof(PrototypeIdSerializer<MachinePartPrototype>))]
|
|
||||||
public string PartType { get; private set; } = default!;
|
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
|
||||||
[DataField("rating")]
|
|
||||||
public int Rating { get; private set; } = 1;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This number is used in tests to ensure that you can't use high quality machines for arbitrage. In
|
|
||||||
/// principle there is nothing wrong with using higher quality parts, but you have to be careful to not
|
|
||||||
/// allow them to be put into a lathe or something like that.
|
|
||||||
/// </summary>
|
|
||||||
public const int MaxRating = 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Shared.Construction.Components;
|
using Content.Shared.Construction.Components;
|
||||||
using Content.Shared.Construction.Prototypes;
|
|
||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using Content.Shared.Lathe;
|
using Content.Shared.Lathe;
|
||||||
using Content.Shared.Materials;
|
using Content.Shared.Materials;
|
||||||
using Content.Shared.Stacks;
|
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Shared.Construction
|
namespace Content.Shared.Construction
|
||||||
@@ -16,6 +14,7 @@ namespace Content.Shared.Construction
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||||
[Dependency] private readonly SharedLatheSystem _lathe = default!;
|
[Dependency] private readonly SharedLatheSystem _lathe = default!;
|
||||||
|
[Dependency] private readonly SharedConstructionSystem _construction = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -31,32 +30,30 @@ namespace Content.Shared.Construction
|
|||||||
using (args.PushGroup(nameof(MachineBoardComponent)))
|
using (args.PushGroup(nameof(MachineBoardComponent)))
|
||||||
{
|
{
|
||||||
args.PushMarkup(Loc.GetString("machine-board-component-on-examine-label"));
|
args.PushMarkup(Loc.GetString("machine-board-component-on-examine-label"));
|
||||||
foreach (var (part, amount) in component.Requirements)
|
foreach (var (material, amount) in component.StackRequirements)
|
||||||
{
|
{
|
||||||
args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
|
var stack = _prototype.Index(material);
|
||||||
("amount", amount),
|
var name = _prototype.Index(stack.Spawn).Name;
|
||||||
("requiredElement", Loc.GetString(_prototype.Index<MachinePartPrototype>(part).Name))));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var (material, amount) in component.MaterialRequirements)
|
|
||||||
{
|
|
||||||
args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
|
args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
|
||||||
("amount", amount),
|
("amount", amount),
|
||||||
("requiredElement", Loc.GetString(material.Name))));
|
("requiredElement", Loc.GetString(name))));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var (_, info) in component.ComponentRequirements)
|
foreach (var (_, info) in component.ComponentRequirements)
|
||||||
{
|
{
|
||||||
|
var examineName = _construction.GetExamineName(info);
|
||||||
args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
|
args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
|
||||||
("amount", info.Amount),
|
("amount", info.Amount),
|
||||||
("requiredElement", Loc.GetString(info.ExamineName))));
|
("requiredElement", examineName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var (_, info) in component.TagRequirements)
|
foreach (var (_, info) in component.TagRequirements)
|
||||||
{
|
{
|
||||||
|
var examineName = _construction.GetExamineName(info);
|
||||||
args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
|
args.PushMarkup(Loc.GetString("machine-board-component-required-element-entry-text",
|
||||||
("amount", info.Amount),
|
("amount", info.Amount),
|
||||||
("requiredElement", Loc.GetString(info.ExamineName))));
|
("requiredElement", examineName)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,30 +63,13 @@ namespace Content.Shared.Construction
|
|||||||
var (_, comp) = entity;
|
var (_, comp) = entity;
|
||||||
|
|
||||||
var materials = new Dictionary<string, int>();
|
var materials = new Dictionary<string, int>();
|
||||||
foreach (var (partId, amount) in comp.Requirements)
|
|
||||||
|
foreach (var (stackId, amount) in comp.StackRequirements)
|
||||||
{
|
{
|
||||||
var partProto = _prototype.Index<MachinePartPrototype>(partId);
|
var stackProto = _prototype.Index(stackId);
|
||||||
|
|
||||||
if (!_lathe.TryGetRecipesFromEntity(partProto.StockPartPrototype, out var recipes))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var partRecipe = recipes[0];
|
|
||||||
if (recipes.Count > 1)
|
|
||||||
partRecipe = recipes.MinBy(p => p.RequiredMaterials.Values.Sum());
|
|
||||||
|
|
||||||
foreach (var (mat, matAmount) in partRecipe!.RequiredMaterials)
|
|
||||||
{
|
|
||||||
materials.TryAdd(mat, 0);
|
|
||||||
materials[mat] += matAmount * amount * coefficient;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var (stackId, amount) in comp.MaterialIdRequirements)
|
|
||||||
{
|
|
||||||
var stackProto = _prototype.Index<StackPrototype>(stackId);
|
|
||||||
var defaultProto = _prototype.Index(stackProto.Spawn);
|
var defaultProto = _prototype.Index(stackProto.Spawn);
|
||||||
|
|
||||||
if (defaultProto.TryGetComponent<PhysicalCompositionComponent>(out var physComp))
|
if (defaultProto.TryGetComponent<PhysicalCompositionComponent>(out var physComp, EntityManager.ComponentFactory))
|
||||||
{
|
{
|
||||||
foreach (var (mat, matAmount) in physComp.MaterialComposition)
|
foreach (var (mat, matAmount) in physComp.MaterialComposition)
|
||||||
{
|
{
|
||||||
@@ -130,7 +110,7 @@ namespace Content.Shared.Construction
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (_prototype.TryIndex(defaultProtoId, out var defaultProto) &&
|
else if (_prototype.TryIndex(defaultProtoId, out var defaultProto) &&
|
||||||
defaultProto.TryGetComponent<PhysicalCompositionComponent>(out var physComp))
|
defaultProto.TryGetComponent<PhysicalCompositionComponent>(out var physComp, EntityManager.ComponentFactory))
|
||||||
{
|
{
|
||||||
foreach (var (mat, matAmount) in physComp.MaterialComposition)
|
foreach (var (mat, matAmount) in physComp.MaterialComposition)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
using Robust.Shared.Prototypes;
|
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
|
||||||
|
|
||||||
namespace Content.Shared.Construction.Prototypes;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This is a prototype for categorizing
|
|
||||||
/// different types of machine parts.
|
|
||||||
/// </summary>
|
|
||||||
[Prototype("machinePart")]
|
|
||||||
public sealed partial class MachinePartPrototype : IPrototype
|
|
||||||
{
|
|
||||||
/// <inheritdoc/>
|
|
||||||
[IdDataField]
|
|
||||||
public string ID { get; private set; } = default!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A human-readable name for the machine part type.
|
|
||||||
/// </summary>
|
|
||||||
[DataField("name")]
|
|
||||||
public string Name = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A stock part entity based on the machine part.
|
|
||||||
/// </summary>
|
|
||||||
[DataField("stockPartPrototype", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>), required: true)]
|
|
||||||
public string StockPartPrototype = string.Empty;
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Content.Shared.Construction.Components;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
using static Content.Shared.Interaction.SharedInteractionSystem;
|
using static Content.Shared.Interaction.SharedInteractionSystem;
|
||||||
|
|
||||||
namespace Content.Shared.Construction
|
namespace Content.Shared.Construction
|
||||||
@@ -7,6 +9,7 @@ namespace Content.Shared.Construction
|
|||||||
public abstract class SharedConstructionSystem : EntitySystem
|
public abstract class SharedConstructionSystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IMapManager _mapManager = default!;
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||||
|
[Dependency] protected readonly IPrototypeManager PrototypeManager = default!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get predicate for construction obstruction checks.
|
/// Get predicate for construction obstruction checks.
|
||||||
@@ -22,5 +25,13 @@ namespace Content.Shared.Construction
|
|||||||
var ignored = grid.GetAnchoredEntities(coords).ToHashSet();
|
var ignored = grid.GetAnchoredEntities(coords).ToHashSet();
|
||||||
return e => ignored.Contains(e);
|
return e => ignored.Contains(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetExamineName(GenericPartInfo info)
|
||||||
|
{
|
||||||
|
if (info.ExamineName is not null)
|
||||||
|
return Loc.GetString(info.ExamineName.Value);
|
||||||
|
|
||||||
|
return PrototypeManager.Index(info.DefaultPrototype).Name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.Numerics;
|
|
||||||
using Content.Shared.Construction.Components;
|
using Content.Shared.Construction.Components;
|
||||||
using Content.Shared.Administration.Logs;
|
using Content.Shared.Administration.Logs;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
@@ -9,7 +8,6 @@ using Content.Shared.Popups;
|
|||||||
using Content.Shared.Tools.Systems;
|
using Content.Shared.Tools.Systems;
|
||||||
using Robust.Shared.Audio.Systems;
|
using Robust.Shared.Audio.Systems;
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Map;
|
|
||||||
using Robust.Shared.Map.Components;
|
using Robust.Shared.Map.Components;
|
||||||
using Robust.Shared.Network;
|
using Robust.Shared.Network;
|
||||||
using Robust.Shared.Physics.Components;
|
using Robust.Shared.Physics.Components;
|
||||||
@@ -88,7 +86,8 @@ public abstract class SharedFlatpackSystem : EntitySystem
|
|||||||
if (_net.IsServer)
|
if (_net.IsServer)
|
||||||
{
|
{
|
||||||
var spawn = Spawn(comp.Entity, _map.GridTileToLocal(grid, gridComp, buildPos));
|
var spawn = Spawn(comp.Entity, _map.GridTileToLocal(grid, gridComp, buildPos));
|
||||||
_adminLogger.Add(LogType.Construction, LogImpact.Low,
|
_adminLogger.Add(LogType.Construction,
|
||||||
|
LogImpact.Low,
|
||||||
$"{ToPrettyString(args.User):player} unpacked {ToPrettyString(spawn):entity} at {xform.Coordinates} from {ToPrettyString(uid):entity}");
|
$"{ToPrettyString(args.User):player} unpacked {ToPrettyString(spawn):entity} at {xform.Coordinates} from {ToPrettyString(uid):entity}");
|
||||||
QueueDel(uid);
|
QueueDel(uid);
|
||||||
}
|
}
|
||||||
@@ -115,9 +114,7 @@ public abstract class SharedFlatpackSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var machinePrototypeId = new EntProtoId();
|
var machinePrototypeId = new EntProtoId();
|
||||||
if (TryComp<MachineBoardComponent>(board, out var machineBoard) && machineBoard.Prototype is not null)
|
if (TryComp<ComputerBoardComponent>(board, out var computerBoard) && computerBoard.Prototype is not null)
|
||||||
machinePrototypeId = machineBoard.Prototype;
|
|
||||||
else if (TryComp<ComputerBoardComponent>(board, out var computerBoard) && computerBoard.Prototype is not null)
|
|
||||||
machinePrototypeId = computerBoard.Prototype;
|
machinePrototypeId = computerBoard.Prototype;
|
||||||
|
|
||||||
var comp = ent.Comp!;
|
var comp = ent.Comp!;
|
||||||
|
|||||||
@@ -59,8 +59,6 @@ namespace Content.Shared.Lathe
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||||
public float MaterialUseMultiplier = 1;
|
public float MaterialUseMultiplier = 1;
|
||||||
|
|
||||||
public const float DefaultPartRatingMaterialUseMultiplier = 0.85f;
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1,10 @@
|
|||||||
# Shown when examining an in-construction object
|
# Shown when examining an in-construction object
|
||||||
construction-insert-arbitrary-entity = Next, insert {$stepName}.
|
construction-insert-arbitrary-entity = Next, insert {$stepName}.
|
||||||
|
|
||||||
|
construction-insert-info-examine-name-instrument-brass = brass instrument
|
||||||
|
construction-insert-info-examine-name-instrument-keyed = keyed instrument
|
||||||
|
construction-insert-info-examine-name-instrument-percussion = percussion instrument
|
||||||
|
construction-insert-info-examine-name-instrument-string = string intrument
|
||||||
|
construction-insert-info-examine-name-instrument-woodwind = woodwind instrument
|
||||||
|
construction-insert-info-examine-name-knife = knife
|
||||||
|
construction-insert-info-examine-name-utensil = utensil
|
||||||
|
|||||||
@@ -11,10 +11,9 @@
|
|||||||
state: security
|
state: security
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ShuttleGunSvalinnMachineGun
|
prototype: ShuttleGunSvalinnMachineGun
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Manipulator: 4
|
Manipulator: 4
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
Steel: 5
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
|
|
||||||
@@ -29,10 +28,9 @@
|
|||||||
state: security
|
state: security
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ShuttleGunPerforator
|
prototype: ShuttleGunPerforator
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 4
|
MatterBin: 4
|
||||||
Manipulator: 6
|
Manipulator: 6
|
||||||
materialRequirements:
|
|
||||||
Steel: 10
|
Steel: 10
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
|
|
||||||
@@ -47,10 +45,9 @@
|
|||||||
state: security
|
state: security
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ShuttleGunFriendship
|
prototype: ShuttleGunFriendship
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 3
|
MatterBin: 3
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
materialRequirements:
|
|
||||||
Steel: 7
|
Steel: 7
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
|
|
||||||
@@ -65,10 +62,9 @@
|
|||||||
state: security
|
state: security
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ShuttleGunDuster
|
prototype: ShuttleGunDuster
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 6
|
MatterBin: 6
|
||||||
Manipulator: 4
|
Manipulator: 4
|
||||||
materialRequirements:
|
|
||||||
Steel: 10
|
Steel: 10
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
Uranium: 2
|
Uranium: 2
|
||||||
@@ -84,9 +80,8 @@
|
|||||||
state: security
|
state: security
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ShuttleGunKinetic
|
prototype: ShuttleGunKinetic
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Manipulator: 3
|
Manipulator: 3
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
Steel: 5
|
||||||
CableHV: 2
|
CableHV: 2
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ParticleAcceleratorEndCapUnfinished
|
prototype: ParticleAcceleratorEndCapUnfinished
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Glass: 15
|
Glass: 15
|
||||||
Steel: 15
|
Steel: 15
|
||||||
|
|
||||||
@@ -24,10 +24,9 @@
|
|||||||
prototype: ParticleAcceleratorFuelChamberUnfinished
|
prototype: ParticleAcceleratorFuelChamberUnfinished
|
||||||
componentRequirements:
|
componentRequirements:
|
||||||
AmeFuelContainer:
|
AmeFuelContainer:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: AmeJar
|
defaultPrototype: AmeJar
|
||||||
ExamineName: AME Fuel Jar
|
stackRequirements:
|
||||||
materialRequirements:
|
|
||||||
Glass: 10
|
Glass: 10
|
||||||
Steel: 10
|
Steel: 10
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ParticleAcceleratorPowerBoxUnfinished
|
prototype: ParticleAcceleratorPowerBoxUnfinished
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Glass: 5
|
Glass: 5
|
||||||
Steel: 5
|
Steel: 5
|
||||||
|
|
||||||
@@ -57,7 +56,7 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ParticleAcceleratorEmitterStarboardUnfinished
|
prototype: ParticleAcceleratorEmitterStarboardUnfinished
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Glass: 5
|
Glass: 5
|
||||||
Steel: 5
|
Steel: 5
|
||||||
|
|
||||||
@@ -71,7 +70,7 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ParticleAcceleratorEmitterForeUnfinished
|
prototype: ParticleAcceleratorEmitterForeUnfinished
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Glass: 5
|
Glass: 5
|
||||||
Steel: 5
|
Steel: 5
|
||||||
|
|
||||||
@@ -85,6 +84,6 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ParticleAcceleratorEmitterPortUnfinished
|
prototype: ParticleAcceleratorEmitterPortUnfinished
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Glass: 5
|
Glass: 5
|
||||||
Steel: 5
|
Steel: 5
|
||||||
|
|||||||
@@ -6,10 +6,9 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Autolathe
|
prototype: Autolathe
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 3
|
MatterBin: 3
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -20,15 +19,13 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: AutolatheHyperConvection
|
prototype: AutolatheHyperConvection
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 3
|
MatterBin: 3
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
Igniter:
|
Igniter:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: Igniter
|
defaultPrototype: Igniter
|
||||||
ExamineName: Igniter
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ProtolatheMachineCircuitboard
|
id: ProtolatheMachineCircuitboard
|
||||||
@@ -38,14 +35,13 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Protolathe
|
prototype: Protolathe
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: BaseMachineCircuitboard
|
parent: BaseMachineCircuitboard
|
||||||
@@ -55,17 +51,15 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ProtolatheHyperConvection
|
prototype: ProtolatheHyperConvection
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
Igniter:
|
Igniter:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: Igniter
|
defaultPrototype: Igniter
|
||||||
ExamineName: Igniter
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: BiofabricatorMachineCircuitboard
|
id: BiofabricatorMachineCircuitboard
|
||||||
@@ -75,9 +69,8 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Biofabricator
|
prototype: Biofabricator
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 4
|
MatterBin: 4
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -90,14 +83,13 @@
|
|||||||
state: security
|
state: security
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SecurityTechFab
|
prototype: SecurityTechFab
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: AmmoTechFabCircuitboard
|
id: AmmoTechFabCircuitboard
|
||||||
@@ -109,7 +101,7 @@
|
|||||||
state: security
|
state: security
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: AmmoTechFab
|
prototype: AmmoTechFab
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
|
|
||||||
@@ -123,14 +115,13 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MedicalTechFab
|
prototype: MedicalTechFab
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
- type: StealTarget
|
- type: StealTarget
|
||||||
stealGroup: MedicalTechFabCircuitboard
|
stealGroup: MedicalTechFabCircuitboard
|
||||||
|
|
||||||
@@ -143,14 +134,13 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: CircuitImprinter
|
prototype: CircuitImprinter
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: BaseMachineCircuitboard
|
parent: BaseMachineCircuitboard
|
||||||
@@ -162,17 +152,15 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: CircuitImprinterHyperConvection
|
prototype: CircuitImprinterHyperConvection
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
Igniter:
|
Igniter:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: Igniter
|
defaultPrototype: Igniter
|
||||||
ExamineName: Igniter
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ExosuitFabricatorMachineCircuitboard
|
id: ExosuitFabricatorMachineCircuitboard
|
||||||
@@ -183,10 +171,9 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ExosuitFabricator
|
prototype: ExosuitFabricator
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 3
|
Manipulator: 3
|
||||||
materialRequirements:
|
|
||||||
Glass: 5
|
Glass: 5
|
||||||
- type: GuideHelp
|
- type: GuideHelp
|
||||||
guides:
|
guides:
|
||||||
@@ -203,7 +190,7 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ResearchAndDevelopmentServer
|
prototype: ResearchAndDevelopmentServer
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Plasma: 5
|
Plasma: 5
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -213,7 +200,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: UniformPrinter
|
prototype: UniformPrinter
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
|
|
||||||
@@ -226,16 +213,14 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Vaccinator
|
prototype: Vaccinator
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
materialRequirements:
|
|
||||||
Cable: 5
|
Cable: 5
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: DiagnoserMachineCircuitboard
|
id: DiagnoserMachineCircuitboard
|
||||||
@@ -246,18 +231,16 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: DiseaseDiagnoser
|
prototype: DiseaseDiagnoser
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Cable: 5
|
Cable: 5
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
componentRequirements:
|
componentRequirements:
|
||||||
DiseaseSwab:
|
BotanySwab:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: DiseaseSwab
|
defaultPrototype: DiseaseSwab
|
||||||
ExamineName: Swab
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ArtifactAnalyzerMachineCircuitboard
|
id: ArtifactAnalyzerMachineCircuitboard
|
||||||
@@ -269,10 +252,9 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineArtifactAnalyzer
|
prototype: MachineArtifactAnalyzer
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 3
|
Manipulator: 3
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
Glass: 5
|
Glass: 5
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -285,9 +267,8 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineArtifactCrusher
|
prototype: MachineArtifactCrusher
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
Steel: 5
|
Steel: 5
|
||||||
|
|
||||||
@@ -301,9 +282,8 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineAnomalyVessel
|
prototype: MachineAnomalyVessel
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 3
|
Capacitor: 3
|
||||||
materialRequirements:
|
|
||||||
Cable: 1
|
Cable: 1
|
||||||
PlasmaGlass: 10
|
PlasmaGlass: 10
|
||||||
|
|
||||||
@@ -317,9 +297,8 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineAnomalyVesselExperimental
|
prototype: MachineAnomalyVesselExperimental
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 3
|
Capacitor: 3
|
||||||
materialRequirements:
|
|
||||||
Cable: 5
|
Cable: 5
|
||||||
PlasmaGlass: 15
|
PlasmaGlass: 15
|
||||||
MetalRod: 4
|
MetalRod: 4
|
||||||
@@ -334,10 +313,9 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineAnomalySynchronizer
|
prototype: MachineAnomalySynchronizer
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
Capacitor: 5
|
Capacitor: 5
|
||||||
materialRequirements:
|
|
||||||
PlasmaGlass: 5
|
PlasmaGlass: 5
|
||||||
Cable: 5
|
Cable: 5
|
||||||
|
|
||||||
@@ -351,9 +329,8 @@
|
|||||||
state: science
|
state: science
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineAPE
|
prototype: MachineAPE
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Cable: 1
|
Cable: 1
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
@@ -367,10 +344,9 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: GasThermoMachineFreezer
|
prototype: GasThermoMachineFreezer
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Cable: 5
|
Cable: 5
|
||||||
- type: Construction
|
- type: Construction
|
||||||
deconstructionTarget: null
|
deconstructionTarget: null
|
||||||
@@ -387,10 +363,9 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: GasThermoMachineHeater
|
prototype: GasThermoMachineHeater
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Cable: 5
|
Cable: 5
|
||||||
- type: Construction
|
- type: Construction
|
||||||
graph: ThermomachineBoard
|
graph: ThermomachineBoard
|
||||||
@@ -407,10 +382,9 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: GasThermoMachineHellfireFreezer
|
prototype: GasThermoMachineHellfireFreezer
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Plasma: 1
|
Plasma: 1
|
||||||
- type: Construction
|
- type: Construction
|
||||||
deconstructionTarget: null
|
deconstructionTarget: null
|
||||||
@@ -427,10 +401,9 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: GasThermoMachineHellfireHeater
|
prototype: GasThermoMachineHellfireHeater
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Plasma: 1
|
Plasma: 1
|
||||||
- type: Construction
|
- type: Construction
|
||||||
graph: ThermomachineBoard
|
graph: ThermomachineBoard
|
||||||
@@ -447,9 +420,8 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: BaseGasCondenser
|
prototype: BaseGasCondenser
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -462,10 +434,9 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: PortableScrubber
|
prototype: PortableScrubber
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
materialRequirements:
|
|
||||||
Cable: 5
|
Cable: 5
|
||||||
Glass: 2
|
Glass: 2
|
||||||
|
|
||||||
@@ -479,10 +450,9 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SpaceHeater
|
prototype: SpaceHeater
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Cable: 5
|
Cable: 5
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -495,10 +465,9 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: CloningPod
|
prototype: CloningPod
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
Cable: 1
|
Cable: 1
|
||||||
|
|
||||||
@@ -512,9 +481,8 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MedicalScanner
|
prototype: MedicalScanner
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
Glass: 5
|
Glass: 5
|
||||||
Cable: 1
|
Cable: 1
|
||||||
|
|
||||||
@@ -526,7 +494,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: CrewMonitoringServer
|
prototype: CrewMonitoringServer
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Steel: 1
|
Steel: 1
|
||||||
Cable: 2
|
Cable: 2
|
||||||
|
|
||||||
@@ -540,7 +508,7 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: CryoPod
|
prototype: CryoPod
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Glass: 5
|
Glass: 5
|
||||||
Cable: 1
|
Cable: 1
|
||||||
|
|
||||||
@@ -554,16 +522,14 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ChemMaster
|
prototype: ChemMaster
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
Cable: 1
|
Cable: 1
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ChemDispenserMachineCircuitboard
|
id: ChemDispenserMachineCircuitboard
|
||||||
@@ -575,16 +541,14 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ChemDispenserEmpty
|
prototype: ChemDispenserEmpty
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
Steel: 3
|
Steel: 3
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: BiomassReclaimerMachineCircuitboard
|
id: BiomassReclaimerMachineCircuitboard
|
||||||
@@ -594,16 +558,15 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: BiomassReclaimer
|
prototype: BiomassReclaimer
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
|
Steel: 5
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
Knife:
|
Knife:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: KitchenKnife
|
defaultPrototype: KitchenKnife
|
||||||
ExamineName: Knife
|
examineName: construction-insert-info-examine-name-knife
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: HydroponicsTrayMachineCircuitboard
|
id: HydroponicsTrayMachineCircuitboard
|
||||||
@@ -615,15 +578,14 @@
|
|||||||
state: service
|
state: service
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: HydroponicsTrayEmpty
|
prototype: HydroponicsTrayEmpty
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
# replacing the console screen
|
# replacing the console screen
|
||||||
Glass: 5
|
Glass: 5
|
||||||
Cable: 2
|
Cable: 2
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 2
|
amount: 2
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: SeedExtractorMachineCircuitboard
|
id: SeedExtractorMachineCircuitboard
|
||||||
@@ -635,10 +597,9 @@
|
|||||||
state: service
|
state: service
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SeedExtractor
|
prototype: SeedExtractor
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
# replacing the console screen
|
# replacing the console screen
|
||||||
Glass: 1
|
Glass: 1
|
||||||
Cable: 2
|
Cable: 2
|
||||||
@@ -654,11 +615,13 @@
|
|||||||
state: power_mod
|
state: power_mod
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SMESBasicEmpty
|
prototype: SMESBasicEmpty
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
PowerCell: 4
|
|
||||||
materialRequirements:
|
|
||||||
CableHV: 10
|
CableHV: 10
|
||||||
|
componentRequirements:
|
||||||
|
PowerCell:
|
||||||
|
amount: 4
|
||||||
|
defaultPrototype: PowerCellSmall
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CellRechargerCircuitboard
|
id: CellRechargerCircuitboard
|
||||||
@@ -671,9 +634,8 @@
|
|||||||
state: charger_APC
|
state: charger_APC
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: PowerCellRecharger
|
prototype: PowerCellRecharger
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Cable: 5
|
Cable: 5
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
@@ -693,9 +655,8 @@
|
|||||||
state: charger_APC
|
state: charger_APC
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: PowerCageRecharger
|
prototype: PowerCageRecharger
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 4
|
Capacitor: 4
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
Steel: 5
|
||||||
Cable: 10
|
Cable: 10
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
@@ -716,9 +677,8 @@
|
|||||||
state: charger_APC
|
state: charger_APC
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: BorgCharger
|
prototype: BorgCharger
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Cable: 5
|
Cable: 5
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
@@ -738,9 +698,8 @@
|
|||||||
state: charger_APC
|
state: charger_APC
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: WeaponCapacitorRecharger
|
prototype: WeaponCapacitorRecharger
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
CableMV: 5
|
CableMV: 5
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
@@ -760,9 +719,8 @@
|
|||||||
state: charger_APC
|
state: charger_APC
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: TurboItemRecharger
|
prototype: TurboItemRecharger
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
CableMV: 5
|
CableMV: 5
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
@@ -777,12 +735,14 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SubstationBasicEmpty
|
prototype: SubstationBasicEmpty
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
PowerCell: 1
|
|
||||||
materialRequirements:
|
|
||||||
CableMV: 5
|
CableMV: 5
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
|
componentRequirements:
|
||||||
|
PowerCell:
|
||||||
|
amount: 1
|
||||||
|
defaultPrototype: PowerCellSmall
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
Glass: 200
|
Glass: 200
|
||||||
@@ -798,31 +758,31 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: DawInstrument
|
prototype: DawInstrument
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Glass: 1
|
Glass: 1
|
||||||
Cable: 1
|
Cable: 1
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
# One instrument to bring them all and in the darkness bind them...
|
# One instrument to bring them all and in the darkness bind them...
|
||||||
KeyedInstrument:
|
KeyedInstrument:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: SynthesizerInstrument
|
defaultPrototype: SynthesizerInstrument
|
||||||
ExamineName: Keyed Instrument
|
examineName: construction-insert-info-examine-name-instrument-keyed
|
||||||
StringInstrument:
|
StringInstrument:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: AcousticGuitarInstrument
|
defaultPrototype: AcousticGuitarInstrument
|
||||||
ExamineName: String Instrument
|
examineName: construction-insert-info-examine-name-instrument-string
|
||||||
PercussionInstrument:
|
PercussionInstrument:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: GlockenspielInstrument
|
defaultPrototype: GlockenspielInstrument
|
||||||
ExamineName: Percussion Instrument
|
examineName: construction-insert-info-examine-name-instrument-percussion
|
||||||
BrassInstrument:
|
BrassInstrument:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: TrumpetInstrument
|
defaultPrototype: TrumpetInstrument
|
||||||
ExamineName: Brass Instrument
|
examineName: construction-insert-info-examine-name-instrument-brass
|
||||||
WoodwindInstrument:
|
WoodwindInstrument:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: SaxophoneInstrument
|
defaultPrototype: SaxophoneInstrument
|
||||||
ExamineName: Woodwind Instrument
|
examineName: construction-insert-info-examine-name-instrument-woodwind
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: PortableGeneratorPacmanMachineCircuitboard
|
id: PortableGeneratorPacmanMachineCircuitboard
|
||||||
@@ -833,9 +793,8 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: PortableGeneratorPacman
|
prototype: PortableGeneratorPacman
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
@@ -852,9 +811,8 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Thruster
|
prototype: Thruster
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 4
|
Capacitor: 4
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
Steel: 5
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -864,10 +822,9 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Gyroscope
|
prototype: Gyroscope
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
Glass: 2
|
Glass: 2
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -879,9 +836,8 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: PortableGeneratorSuperPacman
|
prototype: PortableGeneratorSuperPacman
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
CableHV: 10
|
CableHV: 10
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
@@ -900,9 +856,8 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: PortableGeneratorJrPacman
|
prototype: PortableGeneratorJrPacman
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
Cable: 10
|
Cable: 10
|
||||||
- type: PhysicalComposition
|
- type: PhysicalComposition
|
||||||
materialComposition:
|
materialComposition:
|
||||||
@@ -920,14 +875,13 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: KitchenReagentGrinder
|
prototype: KitchenReagentGrinder
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 2
|
MatterBin: 2
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: HotplateMachineCircuitboard
|
id: HotplateMachineCircuitboard
|
||||||
@@ -937,9 +891,8 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ChemistryHotplate
|
prototype: ChemistryHotplate
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -950,9 +903,8 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: KitchenElectricGrill
|
prototype: KitchenElectricGrill
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 4
|
Capacitor: 4
|
||||||
materialRequirements:
|
|
||||||
Glass: 2
|
Glass: 2
|
||||||
Cable: 5
|
Cable: 5
|
||||||
|
|
||||||
@@ -965,10 +917,9 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: StasisBed
|
prototype: StasisBed
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
materialRequirements:
|
|
||||||
Cable: 3
|
Cable: 3
|
||||||
Steel: 2
|
Steel: 2
|
||||||
|
|
||||||
@@ -982,9 +933,8 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineElectrolysisUnit
|
prototype: MachineElectrolysisUnit
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Cable: 1
|
Cable: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -997,9 +947,8 @@
|
|||||||
state: medical
|
state: medical
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineCentrifuge
|
prototype: MachineCentrifuge
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
materialRequirements:
|
|
||||||
Steel: 1
|
Steel: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -1011,9 +960,8 @@
|
|||||||
state: supply
|
state: supply
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MaterialReclaimer
|
prototype: MaterialReclaimer
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
Steel: 5
|
||||||
Plastic: 5
|
Plastic: 5
|
||||||
|
|
||||||
@@ -1026,10 +974,9 @@
|
|||||||
state: supply
|
state: supply
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: OreProcessor
|
prototype: OreProcessor
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 3
|
Manipulator: 3
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -1041,10 +988,9 @@
|
|||||||
state: supply
|
state: supply
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: OreProcessorIndustrial
|
prototype: OreProcessorIndustrial
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 3
|
Manipulator: 3
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -1054,7 +1000,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Sheetifier
|
prototype: Sheetifier
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
|
|
||||||
@@ -1067,9 +1013,8 @@
|
|||||||
state: service
|
state: service
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: KitchenMicrowave
|
prototype: KitchenMicrowave
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
materialRequirements:
|
|
||||||
Glass: 2
|
Glass: 2
|
||||||
Cable: 2
|
Cable: 2
|
||||||
- type: Tag
|
- type: Tag
|
||||||
@@ -1085,13 +1030,13 @@
|
|||||||
state: service
|
state: service
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: FatExtractor
|
prototype: FatExtractor
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
componentRequirements:
|
componentRequirements:
|
||||||
Utensil:
|
Utensil:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: ForkPlastic
|
defaultPrototype: ForkPlastic
|
||||||
ExamineName: Utensil
|
examineName: construction-insert-info-examine-name-utensil
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: BaseMachineCircuitboard
|
parent: BaseMachineCircuitboard
|
||||||
@@ -1100,10 +1045,9 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: MachineFlatpacker
|
prototype: MachineFlatpacker
|
||||||
requirements:
|
stackRequirements:
|
||||||
Manipulator: 2
|
Manipulator: 2
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
materialRequirements:
|
|
||||||
Steel: 1
|
Steel: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -1115,9 +1059,8 @@
|
|||||||
state: engineering
|
state: engineering
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Emitter
|
prototype: Emitter
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
Glass: 2
|
Glass: 2
|
||||||
|
|
||||||
@@ -1129,7 +1072,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SurveillanceCameraRouterConstructed
|
prototype: SurveillanceCameraRouterConstructed
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Cable: 1
|
Cable: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -1140,7 +1083,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SurveillanceCameraWirelessRouterConstructed
|
prototype: SurveillanceCameraWirelessRouterConstructed
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Cable: 2
|
Cable: 2
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
@@ -1152,7 +1095,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SurveillanceWirelessCameraMovableConstructed
|
prototype: SurveillanceWirelessCameraMovableConstructed
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Glass: 2
|
Glass: 2
|
||||||
Cable: 2
|
Cable: 2
|
||||||
|
|
||||||
@@ -1164,7 +1107,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SurveillanceWirelessCameraAnchoredConstructed
|
prototype: SurveillanceWirelessCameraAnchoredConstructed
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Cable: 2
|
Cable: 2
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
@@ -1176,10 +1119,9 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: GasRecycler
|
prototype: GasRecycler
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 1
|
Capacitor: 1
|
||||||
Manipulator: 1
|
Manipulator: 1
|
||||||
materialRequirements:
|
|
||||||
Steel: 10
|
Steel: 10
|
||||||
Plasma: 5
|
Plasma: 5
|
||||||
|
|
||||||
@@ -1193,13 +1135,12 @@
|
|||||||
state: service
|
state: service
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: BoozeDispenserEmpty
|
prototype: BoozeDispenserEmpty
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Steel: 5
|
Steel: 5
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CargoTelepadMachineCircuitboard
|
id: CargoTelepadMachineCircuitboard
|
||||||
@@ -1211,9 +1152,8 @@
|
|||||||
state: supply
|
state: supply
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: CargoTelepad
|
prototype: CargoTelepad
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 2
|
Capacitor: 2
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
Steel: 5
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -1226,13 +1166,12 @@
|
|||||||
state: service
|
state: service
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SodaDispenserEmpty
|
prototype: SodaDispenserEmpty
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Steel: 5
|
Steel: 5
|
||||||
tagRequirements:
|
tagRequirements:
|
||||||
GlassBeaker:
|
GlassBeaker:
|
||||||
Amount: 1
|
amount: 1
|
||||||
DefaultPrototype: Beaker
|
defaultPrototype: Beaker
|
||||||
ExamineName: Glass Beaker
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: TelecomServerCircuitboard
|
id: TelecomServerCircuitboard
|
||||||
@@ -1242,7 +1181,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: TelecomServer
|
prototype: TelecomServer
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
Steel: 1
|
Steel: 1
|
||||||
Cable: 2
|
Cable: 2
|
||||||
|
|
||||||
@@ -1254,9 +1193,8 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: SalvageMagnet
|
prototype: SalvageMagnet
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 4
|
Capacitor: 4
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
Steel: 5
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
Cable: 2
|
Cable: 2
|
||||||
@@ -1269,10 +1207,9 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: GravityGeneratorMini
|
prototype: GravityGeneratorMini
|
||||||
requirements:
|
stackRequirements:
|
||||||
Capacitor: 4
|
Capacitor: 4
|
||||||
MatterBin: 3
|
MatterBin: 3
|
||||||
materialRequirements:
|
|
||||||
Steel: 5
|
Steel: 5
|
||||||
CableHV: 5
|
CableHV: 5
|
||||||
Uranium: 2
|
Uranium: 2
|
||||||
@@ -1284,10 +1221,9 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: ReagentGrinderIndustrial
|
prototype: ReagentGrinderIndustrial
|
||||||
requirements:
|
stackRequirements:
|
||||||
MatterBin: 1
|
MatterBin: 1
|
||||||
Manipulator: 3
|
Manipulator: 3
|
||||||
materialRequirements:
|
|
||||||
Glass: 1
|
Glass: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
@@ -1298,7 +1234,7 @@
|
|||||||
components:
|
components:
|
||||||
- type: MachineBoard
|
- type: MachineBoard
|
||||||
prototype: Jukebox
|
prototype: Jukebox
|
||||||
materialRequirements:
|
stackRequirements:
|
||||||
WoodPlank: 5
|
WoodPlank: 5
|
||||||
Steel: 2
|
Steel: 2
|
||||||
Glass: 5
|
Glass: 5
|
||||||
|
|||||||
@@ -21,9 +21,6 @@
|
|||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: capacitor
|
state: capacitor
|
||||||
- type: MachinePart
|
|
||||||
part: Capacitor
|
|
||||||
rating: 1
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
- CapacitorStockPart
|
- CapacitorStockPart
|
||||||
@@ -39,11 +36,8 @@
|
|||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: micro_mani
|
state: micro_mani
|
||||||
- type: MachinePart
|
|
||||||
part: Manipulator
|
|
||||||
rating: 1
|
|
||||||
- type: Stack
|
- type: Stack
|
||||||
stackType: MicroManipulator
|
stackType: Manipulator
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: MatterBinStockPart
|
id: MatterBinStockPart
|
||||||
@@ -54,8 +48,5 @@
|
|||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: matter_bin
|
state: matter_bin
|
||||||
- type: MachinePart
|
|
||||||
part: MatterBin
|
|
||||||
rating: 1
|
|
||||||
- type: Stack
|
- type: Stack
|
||||||
stackType: MatterBin
|
stackType: MatterBin
|
||||||
|
|||||||
@@ -73,9 +73,6 @@
|
|||||||
- type: Battery
|
- type: Battery
|
||||||
maxCharge: 360
|
maxCharge: 360
|
||||||
startingCharge: 360
|
startingCharge: 360
|
||||||
- type: MachinePart
|
|
||||||
part: PowerCell
|
|
||||||
rating: 1
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
- PowerCellSmall
|
- PowerCellSmall
|
||||||
@@ -114,9 +111,6 @@
|
|||||||
- type: Battery
|
- type: Battery
|
||||||
maxCharge: 720
|
maxCharge: 720
|
||||||
startingCharge: 720
|
startingCharge: 720
|
||||||
- type: MachinePart
|
|
||||||
part: PowerCell
|
|
||||||
rating: 2
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: PowerCellMediumPrinted
|
id: PowerCellMediumPrinted
|
||||||
@@ -152,9 +146,6 @@
|
|||||||
- type: Battery
|
- type: Battery
|
||||||
maxCharge: 1080
|
maxCharge: 1080
|
||||||
startingCharge: 1080
|
startingCharge: 1080
|
||||||
- type: MachinePart
|
|
||||||
part: PowerCell
|
|
||||||
rating: 3
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: PowerCellHighPrinted
|
id: PowerCellHighPrinted
|
||||||
@@ -190,9 +181,6 @@
|
|||||||
- type: Battery
|
- type: Battery
|
||||||
maxCharge: 1800
|
maxCharge: 1800
|
||||||
startingCharge: 1800
|
startingCharge: 1800
|
||||||
- type: MachinePart
|
|
||||||
part: PowerCell
|
|
||||||
rating: 4
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: PowerCellHyperPrinted
|
id: PowerCellHyperPrinted
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
- type: machinePart
|
|
||||||
id: Capacitor
|
|
||||||
name: machine-part-name-capacitor
|
|
||||||
stockPartPrototype: CapacitorStockPart
|
|
||||||
|
|
||||||
- type: machinePart
|
|
||||||
id: Manipulator
|
|
||||||
name: machine-part-name-manipulator
|
|
||||||
stockPartPrototype: MicroManipulatorStockPart
|
|
||||||
|
|
||||||
- type: machinePart
|
|
||||||
id: MatterBin
|
|
||||||
name: machine-part-name-matter-bin
|
|
||||||
stockPartPrototype: MatterBinStockPart
|
|
||||||
|
|
||||||
- type: machinePart
|
|
||||||
id: PowerCell
|
|
||||||
name: machine-part-name-power-cell
|
|
||||||
stockPartPrototype: PowerCellSmall
|
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
maxCount: 10
|
maxCount: 10
|
||||||
|
|
||||||
- type: stack
|
- type: stack
|
||||||
id: MicroManipulator
|
id: Manipulator
|
||||||
name: micro manipulator
|
name: micro manipulator
|
||||||
spawn: MicroManipulatorStockPart
|
spawn: MicroManipulatorStockPart
|
||||||
maxCount: 10
|
maxCount: 10
|
||||||
|
|||||||
Reference in New Issue
Block a user