+++ /dev/null
-using Content.Server.Wires;
-using Content.Shared.Construction;
-using Content.Shared.Wires;
-using JetBrains.Annotations;
-
-namespace Content.Server.Construction.Completions;
-
-[UsedImplicitly]
-[DataDefinition]
-public sealed partial class ChangeWiresPanelSecurityLevel : IGraphAction
-{
- [DataField("level")]
- [ValidatePrototypeId<WiresPanelSecurityLevelPrototype>]
- public string WiresPanelSecurityLevelID = "Level0";
-
- public void PerformAction(EntityUid uid, EntityUid? userUid, IEntityManager entityManager)
- {
- if (WiresPanelSecurityLevelID == null)
- return;
-
- if (entityManager.TryGetComponent(uid, out WiresPanelComponent? wiresPanel)
- && entityManager.TrySystem(out WiresSystem? wiresSystem))
- {
- wiresSystem.SetWiresPanelSecurityData(uid, wiresPanel, WiresPanelSecurityLevelID);
- }
- }
-}
--- /dev/null
+using Content.Shared.Construction;
+using Content.Shared.Wires;
+using JetBrains.Annotations;
+
+namespace Content.Server.Construction.Completions;
+
+/// <summary>
+/// This graph action is used to set values on entities with the <see cref="WiresPanelSecurityComponent"/>
+/// </summary>
+
+[UsedImplicitly]
+[DataDefinition]
+public sealed partial class SetWiresPanelSecurity : IGraphAction
+{
+ /// <summary>
+ /// Sets the Examine field on the entity's <see cref="WiresPanelSecurityComponent"/>
+ /// </summary>
+ [DataField("examine")]
+ public string Examine = string.Empty;
+
+ /// <summary>
+ /// Sets the WiresAccessible field on the entity's <see cref="WiresPanelSecurityComponent"/>
+ /// </summary>
+ [DataField("wiresAccessible")]
+ public bool WiresAccessible = true;
+
+ public void PerformAction(EntityUid uid, EntityUid? userUid, IEntityManager entityManager)
+ {
+ if (entityManager.TryGetComponent(uid, out WiresPanelSecurityComponent? _))
+ {
+ var ev = new WiresPanelSecurityEvent(Examine, WiresAccessible);
+ entityManager.EventBus.RaiseLocalEvent(uid, ev);
+ }
+ }
+}
--- /dev/null
+using Content.Shared.Construction;
+using JetBrains.Annotations;
+using Content.Shared.Doors.Components;
+using Content.Shared.Examine;
+using YamlDotNet.Core.Tokens;
+using Content.Shared.Tag;
+
+namespace Content.Server.Construction.Conditions
+{
+ /// <summary>
+ /// This condition checks whether if an entity with the <see cref="TagComponent"/> possesses a specific tag
+ /// </summary>
+ [UsedImplicitly]
+ [DataDefinition]
+ public sealed partial class HasTag : IGraphCondition
+ {
+ /// <summary>
+ /// The tag the entity is being checked for
+ /// </summary>
+ [DataField("tag")]
+ public string Tag { get; private set; }
+
+ public bool Condition(EntityUid uid, IEntityManager entityManager)
+ {
+ if (!entityManager.TrySystem<TagSystem>(out var tagSystem))
+ return false;
+
+ return tagSystem.HasTag(uid, Tag);
+ }
+
+ public bool DoExamine(ExaminedEvent args)
+ {
+ return false;
+ }
+
+ public IEnumerable<ConstructionGuideEntry> GenerateGuideEntry()
+ {
+ yield return new ConstructionGuideEntry()
+ {
+ };
+ }
+ }
+}
using Robust.Server.Containers;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
+using System.Linq;
namespace Content.Server.Construction
{
throw new Exception("Missing construction components");
}
+ // 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))
return null;
+ // [Optional] Exit if the new entity's prototype is a parent of the original
+ // E.g., if an entity with the 'AirlockCommand' prototype was to be replaced with a new entity that
+ // had the 'Airlock' prototype, and DoNotReplaceInheritingEntities was true, the code block would
+ // exit here because 'AirlockCommand' is derived from 'Airlock'
+ if (GetCurrentNode(uid, construction)?.DoNotReplaceInheritingEntities == true &&
+ metaData.EntityPrototype?.ID != null)
+ {
+ var parents = _prototypeManager.EnumerateParents<EntityPrototype>(metaData.EntityPrototype.ID)?.ToList();
+
+ if (parents != null && parents.Any(x => x.ID == newEntity))
+ return null;
+ }
+
// Optional resolves.
Resolve(uid, ref containerManager, false);
using Content.Shared.Prying.Systems;
using Content.Shared.Radio.EntitySystems;
using Content.Shared.Tools.Components;
+using Content.Shared.Tools.Systems;
using Robust.Shared.Containers;
using Robust.Shared.Map;
using Robust.Shared.Utility;
// Event handling. Add your subscriptions here! Just make sure they're all handled by EnqueueEvent.
SubscribeLocalEvent<ConstructionComponent, InteractUsingEvent>(EnqueueEvent,
- new []{typeof(AnchorableSystem), typeof(PryingSystem) },
+ new []{typeof(AnchorableSystem), typeof(PryingSystem), typeof(WeldableSystem)},
new []{typeof(EncryptionKeySystem)});
SubscribeLocalEvent<ConstructionComponent, OnTemperatureChangeEvent>(EnqueueEvent);
SubscribeLocalEvent<ConstructionComponent, PartAssemblyPartInsertedEvent>(EnqueueEvent);
[Dependency] private readonly WiresSystem _wiresSystem = default!;
[Dependency] private readonly PowerReceiverSystem _power = default!;
[Dependency] private readonly DoorBoltSystem _bolts = default!;
- [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
public override void Initialize()
{
{
if (TryComp<WiresPanelComponent>(uid, out var panel) &&
panel.Open &&
- _prototypeManager.TryIndex<WiresPanelSecurityLevelPrototype>(panel.CurrentSecurityLevelID, out var securityLevelPrototype) &&
- securityLevelPrototype.WiresAccessible &&
+ TryComp<WiresPanelSecurityComponent>(uid, out var wiresPanelSecurity) &&
+ wiresPanelSecurity.WiresAccessible &&
TryComp<ActorComponent>(args.User, out var actor))
{
_wiresSystem.OpenUserInterface(uid, actor.PlayerSession);
using System.Linq;
using System.Threading;
using Content.Server.Administration.Logs;
+using Content.Server.Construction;
+using Content.Server.Construction.Components;
using Content.Server.Power.Components;
using Content.Server.UserInterface;
using Content.Shared.Database;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly ConstructionSystem _construction = default!;
// This is where all the wire layouts are stored.
[ViewVariables] private readonly Dictionary<string, WireLayout> _layouts = new();
SubscribeLocalEvent<WiresComponent, WireDoAfterEvent>(OnDoAfter);
SubscribeLocalEvent<ActivatableUIRequiresPanelComponent, ActivatableUIOpenAttemptEvent>(OnAttemptOpenActivatableUI);
SubscribeLocalEvent<ActivatableUIRequiresPanelComponent, PanelChangedEvent>(OnActivatableUIPanelChanged);
+ SubscribeLocalEvent<WiresPanelSecurityComponent, WiresPanelSecurityEvent>(SetWiresPanelSecurity);
}
private void SetOrCreateWireLayout(EntityUid uid, WiresComponent? wires = null)
{
return;
if (panel.Open &&
- _protoMan.TryIndex<WiresPanelSecurityLevelPrototype>(panel.CurrentSecurityLevelID, out var securityLevelPrototype) &&
- securityLevelPrototype.WiresAccessible &&
+ TryComp<WiresPanelSecurityComponent>(uid, out var wiresPanelSecurity) &&
+ wiresPanelSecurity.WiresAccessible &&
(_toolSystem.HasQuality(args.Used, "Cutting", tool) ||
_toolSystem.HasQuality(args.Used, "Pulsing", tool)))
{
if (component.WireSeed == 0)
component.WireSeed = _random.Next(1, int.MaxValue);
+ // Update the construction graph to make sure that it starts on the node specified by WiresPanelSecurityComponent
+ if (TryComp<WiresPanelSecurityComponent>(uid, out var wiresPanelSecurity) &&
+ !string.IsNullOrEmpty(wiresPanelSecurity.SecurityLevel) &&
+ TryComp<ConstructionComponent>(uid, out var construction))
+ {
+ _construction.ChangeNode(uid, null, wiresPanelSecurity.SecurityLevel, true, construction);
+ }
+
UpdateUserInterface(uid);
}
#endregion
RaiseLocalEvent(uid, ref ev);
}
- public void SetWiresPanelSecurityData(EntityUid uid, WiresPanelComponent component, string wiresPanelSecurityLevelID)
+ public void SetWiresPanelSecurity(EntityUid uid, WiresPanelSecurityComponent component, WiresPanelSecurityEvent args)
{
- component.CurrentSecurityLevelID = wiresPanelSecurityLevelID;
+ component.Examine = args.Examine;
+ component.WiresAccessible = args.WiresAccessible;
+
Dirty(uid, component);
- if (_protoMan.TryIndex<WiresPanelSecurityLevelPrototype>(component.CurrentSecurityLevelID, out var securityLevelPrototype) &&
- securityLevelPrototype.WiresAccessible)
+ if (!args.WiresAccessible)
{
_uiSystem.TryCloseAll(uid, WiresUiKey.Key);
}
-using Content.Shared.Construction.Steps;
+using Content.Shared.Construction.Steps;
namespace Content.Shared.Construction
{
-using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.CodeAnalysis;
using Content.Shared.Construction.NodeEntities;
using Content.Shared.Construction.Serialization;
using Robust.Shared.Prototypes;
[DataField("entity", customTypeSerializer: typeof(GraphNodeEntitySerializer), serverOnly:true)]
public IGraphNodeEntity Entity { get; private set; } = new NullNodeEntity();
+ /// <summary>
+ /// Ignore requests to change the entity if the entity's current prototype inherits from specified replacement
+ /// </summary>
+ /// <remarks>
+ /// When this bool is true and a construction node specifies that the current entity should be replaced with a new entity, if the
+ /// current entity has an entity prototype which inherits from the replacement entity prototype, entity replacement will not occur.
+ /// E.g., if an entity with the 'AirlockCommand' prototype was to be replaced with a new entity that had the 'Airlock' prototype,
+ /// and 'DoNotReplaceInheritingEntities' was true, the entity would not be replaced because 'AirlockCommand' is derived from 'Airlock'
+ /// This will largely be used for construction graphs which have removeable upgrades, such as hacking protections for airlocks,
+ /// so that the upgrades can be removed and you can return to the last primary construction step without replacing the entity
+ /// </remarks>
+ [DataField("doNotReplaceInheritingEntities")]
+ public bool DoNotReplaceInheritingEntities = false;
+
public ConstructionGraphEdge? GetEdge(string target)
{
foreach (var edge in _edges)
public abstract class SharedWiresSystem : EntitySystem
{
- [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
-
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<WiresPanelComponent, ExaminedEvent>(OnExamine);
- SubscribeLocalEvent<WiresPanelComponent, WeldableAttemptEvent>(OnWeldableAttempt);
}
private void OnExamine(EntityUid uid, WiresPanelComponent component, ExaminedEvent args)
{
args.PushMarkup(Loc.GetString("wires-panel-component-on-examine-open"));
- if (_prototypeManager.TryIndex<WiresPanelSecurityLevelPrototype>(component.CurrentSecurityLevelID, out var securityLevelPrototype) &&
- securityLevelPrototype.Examine != null)
+ if (TryComp<WiresPanelSecurityComponent>(uid, out var wiresPanelSecurity) &&
+ wiresPanelSecurity.Examine != null)
{
- args.PushMarkup(Loc.GetString(securityLevelPrototype.Examine));
+ args.PushMarkup(Loc.GetString(wiresPanelSecurity.Examine));
}
}
}
-
- private void OnWeldableAttempt(EntityUid uid, WiresPanelComponent component, WeldableAttemptEvent args)
- {
- if (component.Open &&
- _prototypeManager.TryIndex<WiresPanelSecurityLevelPrototype>(component.CurrentSecurityLevelID, out var securityLevelPrototype) &&
- !securityLevelPrototype.WeldingAllowed)
- {
- args.Cancel();
- }
- }
}
[DataField("screwdriverCloseSound")]
public SoundSpecifier ScrewdriverCloseSound = new SoundPathSpecifier("/Audio/Machines/screwdriverclose.ogg");
-
- /// <summary>
- /// This prototype describes the current security features of the wire panel
- /// </summary>
- [DataField("securityLevel")]
- [ValidatePrototypeId<WiresPanelSecurityLevelPrototype>]
- [AutoNetworkedField]
- public string CurrentSecurityLevelID = "Level0";
}
/// <summary>
--- /dev/null
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Wires;
+
+/// <summary>
+/// Allows hacking protections to a be added to an entity.
+/// These safeguards are determined via a construction graph,
+/// so the entity requires <cref="ConstructionComponent"/> for this to function
+/// </summary>
+[NetworkedComponent, RegisterComponent]
+[Access(typeof(SharedWiresSystem))]
+[AutoGenerateComponentState]
+public sealed partial class WiresPanelSecurityComponent : Component
+{
+ /// <summary>
+ /// A verbal description of the wire panel's current security level
+ /// </summary>
+ [DataField("examine")]
+ [AutoNetworkedField]
+ public string? Examine = default!;
+
+ /// <summary>
+ /// Determines whether the wiring is accessible to hackers or not
+ /// </summary>
+ [DataField("wiresAccessible")]
+ [AutoNetworkedField]
+ public bool WiresAccessible = true;
+
+ /// <summary>
+ /// Name of the construction graph node that the entity will start on
+ /// </summary>
+ [DataField("securityLevel")]
+ [AutoNetworkedField]
+ public string SecurityLevel = string.Empty;
+}
+
+/// <summary>
+/// This event gets raised when security settings on a wires panel change
+/// </summary>
+public sealed class WiresPanelSecurityEvent : EntityEventArgs
+{
+ public readonly string? Examine;
+ public readonly bool WiresAccessible;
+
+ public WiresPanelSecurityEvent(string? examine, bool wiresAccessible)
+ {
+ Examine = examine;
+ WiresAccessible = wiresAccessible;
+ }
+}
+++ /dev/null
-using Robust.Shared.Prototypes;
-
-namespace Content.Shared.Wires;
-
-[Prototype("WiresPanelSecurityLevel")]
-public sealed class WiresPanelSecurityLevelPrototype : IPrototype
-{
- [IdDataField]
- public string ID { get; private set; } = default!;
-
- /// <summary>
- /// A verbal description of the wire panel's current security level
- /// </summary>
- [DataField("examine")]
- public string? Examine = default!;
-
- /// <summary>
- /// Determines whether the wiring is accessible to hackers or not
- /// </summary>
- [DataField("wiresAccessible")]
- public bool WiresAccessible = true;
-
- /// <summary>
- /// Determines whether the device can be welded shut or not
- /// </summary>
- /// <remarks>
- /// Should be set false when you need to weld/unweld something to/from the wire panel
- /// </remarks>
- [DataField("weldingAllowed")]
- public bool WeldingAllowed = true;
-}
components:
- type: Sprite
sprite: Structures/Doors/Airlocks/Standard/command.rsi
- - type: WiresPanel
- securityLevel: Level2
- - type: Construction
- node: airlockMedSecurity
+ - type: WiresPanelSecurity
+ securityLevel: medSecurity
- type: entity
parent: Airlock
group: Glass
- type: RadiationBlocker
resistance: 2
-
+ - type: Tag
+ tags:
+ - GlassAirlock
+ # This tag is used to nagivate the Airlock construction graph. It's needed because the construction graph is shared between Airlock, AirlockGlass, and HighSecDoor
- type: entity
parent: AirlockGlass
id: AirlockEngineeringGlass
sprite: Structures/Doors/Airlocks/Glass/command.rsi
- type: PaintableAirlock
group: Glass
- - type: WiresPanel
- securityLevel: Level2
- - type: Construction
- node: glassAirlockMedSecurity
+ - type: WiresPanelSecurity
+ securityLevel: medSecurity
- type: entity
parent: AirlockGlass
enabled: false
usesApcPower: true
- type: WiresPanel
+ - type: WiresPanelSecurity
- type: Wires
BoardName: wires-board-name-airlock
LayoutId: Airlock
- type: AccessReader
- type: StaticPrice
price: 150
+ - type: Tag
+ tags:
+ - Airlock
+ # This tag is used to nagivate the Airlock construction graph. It's needed because the construction graph is shared between Airlock, AirlockGlass, and HighSecDoor
placement:
mode: SnapgridCenter
+
enabled: false\r
usesApcPower: true\r
- type: WiresPanel\r
- securityLevel: Level5\r
+ - type: WiresPanelSecurity\r
+ securityLevel: maxSecurity\r
- type: Wires\r
BoardName: wires-board-name-highsec\r
LayoutId: HighSec\r
key: walls\r
mode: NoSprite\r
- type: Construction\r
- graph: HighSecDoor\r
- node: maxSecurity\r
+ graph: Airlock\r
+ node: highSecDoor\r
+ - type: Tag\r
+ tags:\r
+ - HighSecDoor\r
+ # This tag is used to nagivate the Airlock construction graph. It's needed because this construction graph is shared between Airlock, AirlockGlass, and HighSecDoor
\ No newline at end of file
+++ /dev/null
-- type: WiresPanelSecurityLevel
- id: Level0
- wiresAccessible: true
-
-- type: WiresPanelSecurityLevel
- id: Level1
- examine: wires-panel-component-on-examine-security-level1
- wiresAccessible: false
- weldingAllowed: false
-
-- type: WiresPanelSecurityLevel
- id: Level2
- examine: wires-panel-component-on-examine-security-level2
- wiresAccessible: false
- weldingAllowed: false
-
-- type: WiresPanelSecurityLevel
- id: Level3
- examine: wires-panel-component-on-examine-security-level3
- wiresAccessible: false
- weldingAllowed: false
-
-- type: WiresPanelSecurityLevel
- id: Level4
- examine: wires-panel-component-on-examine-security-level4
- wiresAccessible: false
- weldingAllowed: false
-
-- type: WiresPanelSecurityLevel
- id: Level5
- examine: wires-panel-component-on-examine-security-level5
- wiresAccessible: false
-
-- type: WiresPanelSecurityLevel
- id: Level6
- examine: wires-panel-component-on-examine-security-level6
- wiresAccessible: false
- weldingAllowed: false
-
-- type: WiresPanelSecurityLevel
- id: Level7
- examine: wires-panel-component-on-examine-security-level7
- wiresAccessible: false
- weldingAllowed: false
-
\ No newline at end of file
- tool: Prying
doAfter: 5
+## Glass airlock
- node: glassAirlock
entity: AirlockGlass
+ doNotReplaceInheritingEntities: true
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level0
+ - !type:SetWiresPanelSecurity
+ wiresAccessible: true
+ weldingAllowed: true
edges:
- to: glassElectronics
conditions:
- tool: Prying
doAfter: 2
- - to: glassAirlockMedSecurityBreached
+ - to: medSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
amount: 2
doAfter: 2
- - to: glassAirlockHighSecurityBreached
+ - to: highSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
- material: Plasteel
amount: 2
doAfter: 2
-
-## Return node so that removing all internal plating doesn't reset the door
- - node: glassAirlockUnsecured
+
+## Standard airlock
+ - node: airlock
+ entity: Airlock
+ doNotReplaceInheritingEntities: true
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level0
+ - !type:SetWiresPanelSecurity
+ wiresAccessible: true
+ weldingAllowed: true
edges:
- - to: glassElectronics
+ - to: wired
conditions:
- !type:EntityAnchored {}
- !type:DoorWelded {}
- !type:WirePanel {}
- !type:AllWiresCut
completed:
- - !type:SpawnPrototype
- prototype: SheetRGlass1
- amount: 1
+ - !type:EmptyAllContainers {}
steps:
- tool: Prying
- doAfter: 2
+ doAfter: 5
- - to: glassAirlockMedSecurityBreached
+ - to: medSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
- material: Steel
amount: 2
doAfter: 2
-
- - to: glassAirlockHighSecurityBreached
+
+ - to: highSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
amount: 2
doAfter: 2
-## Medium security level airlock: a layer of steel plating protects the internal wiring
- - node: glassAirlockMedSecurityBreached
+## High security door
+ - node: highSecDoor
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level1
- edges:
- - to: glassAirlockUnsecured
- completed:
- - !type:GivePrototype
- prototype: SheetSteel1
- amount: 2
+ - !type:SetWiresPanelSecurity
+ wiresAccessible: true
+ weldingAllowed: true
+ edges:
+ - to: medSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
- - tool: Prying
- doAfter: 4
+ - material: Steel
+ amount: 2
+ doAfter: 2
- - to: glassAirlockMedSecurity
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 3
-
- - node: glassAirlockMedSecurity
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level2
- edges:
- - to: glassAirlockMedSecurityBreached
+ - to: highSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
- - tool: Welding
- doAfter: 10
+ - material: Plasteel
+ amount: 2
+ doAfter: 2
-## High security level airlock: a layer of plasteel plating protects the internal wiring
- - node: glassAirlockHighSecurityBreached
+## Medium security level door: a layer of steel plating protects the internal wiring
+ - node: medSecurityUnfinished
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level3
+ - !type:SetWiresPanelSecurity
+ examine: wires-panel-component-on-examine-security-level1
+ wiresAccessible: false
+ weldingAllowed: false
edges:
- - to: glassAirlockUnsecured
+ - to: glassAirlock
completed:
- !type:GivePrototype
- prototype: SheetPlasteel1
+ prototype: SheetSteel1
amount: 2
conditions:
- !type:WirePanel {}
+ - !type:HasTag
+ tag: GlassAirlock
steps:
- tool: Prying
doAfter: 4
-
- - to: glassAirlockHighSecurity
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 5
-
- - node: glassAirlockHighSecurity
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level4
- edges:
- - to: glassAirlockHighSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 15
-
- - to: glassAirlockMaxSecurity
- conditions:
- - !type:WirePanel {}
- steps:
- - material: MetalRod
- amount: 2
- doAfter: 1
-
-## Max security level airlock: an electric grill is added
- - node: glassAirlockMaxSecurity
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level5
- edges:
- - to: glassAirlockHighSecurity
+
+ - to: airlock
completed:
- - !type:AttemptElectrocute
- !type:GivePrototype
- prototype: PartRodMetal1
+ prototype: SheetSteel1
amount: 2
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Cutting
- doAfter: 0.5
-
- - to: glassAirlockSuperMaxSecurityBreached
conditions:
- !type:WirePanel {}
- steps:
- - material: Plasteel
- amount: 2
- doAfter: 2
-
-## Super max security level airlock: an additional layer of plasteel is added
- - node: glassAirlockSuperMaxSecurityBreached
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level6
- edges:
- - to: glassAirlockMaxSecurity
+ - !type:HasTag
+ tag: Airlock
+ steps:
+ - tool: Prying
+ doAfter: 4
+
+ - to: highSecDoor
completed:
- !type:GivePrototype
- prototype: SheetPlasteel1
+ prototype: SheetSteel1
amount: 2
conditions:
- !type:WirePanel {}
+ - !type:HasTag
+ tag: HighSecDoor
steps:
- tool: Prying
doAfter: 4
- - to: glassAirlockSuperMaxSecurity
+ - to: medSecurity
conditions:
- !type:WirePanel {}
steps:
- tool: Welding
- doAfter: 5
+ doAfter: 3
- - node: glassAirlockSuperMaxSecurity
+ - node: medSecurity
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level7
+ - !type:SetWiresPanelSecurity
+ examine: wires-panel-component-on-examine-security-level2
+ wiresAccessible: false
+ weldingAllowed: false
edges:
- - to: glassAirlockSuperMaxSecurityBreached
+ - to: medSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
- tool: Welding
- doAfter: 15
+ doAfter: 10
- - node: airlock
- entity: Airlock
+## High security level door: a layer of plasteel plating protects the internal wiring
+ - node: highSecurityUnfinished
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level0
+ - !type:SetWiresPanelSecurity
+ examine: wires-panel-component-on-examine-security-level3
+ wiresAccessible: false
+ weldingAllowed: false
edges:
- - to: wired #TODO DOOR ELECTRONICS. If door electronics ever govern access permissions, this step should probably be further down? It makes it too easy to swap permissions around. See also windoor.
- conditions:
- - !type:EntityAnchored {}
- - !type:DoorWelded {}
- - !type:DoorBolted
- value: false
- - !type:WirePanel {}
- - !type:AllWiresCut
+ - to: glassAirlock
completed:
- - !type:EmptyAllContainers {}
- steps:
- - tool: Prying
- doAfter: 5
-
- - to: airlockMedSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - material: Steel
- amount: 2
- doAfter: 2
-
- - to: airlockHighSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - material: Plasteel
+ - !type:GivePrototype
+ prototype: SheetPlasteel1
amount: 2
- doAfter: 2
-
-## Return node so that removing all internal plating doesn't reset the door
- - node: airlockUnsecured
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level0
- edges:
- - to: wired
conditions:
- - !type:EntityAnchored {}
- - !type:DoorWelded {}
- - !type:DoorBolted
- value: false
- !type:WirePanel {}
- - !type:AllWiresCut
- completed:
- - !type:EmptyAllContainers {}
+ - !type:HasTag
+ tag: GlassAirlock
steps:
- tool: Prying
- doAfter: 5
-
- - to: airlockMedSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - material: Steel
- amount: 2
- doAfter: 2
+ doAfter: 4
- - to: airlockHighSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - material: Plasteel
- amount: 2
- doAfter: 2
-
-## Medium security level airlock: a layer of steel plating protects the internal wiring
- - node: airlockMedSecurityBreached
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level1
- edges:
- - to: airlockUnsecured
+ - to: airlock
completed:
- !type:GivePrototype
- prototype: SheetSteel1
+ prototype: SheetPlasteel1
amount: 2
conditions:
- !type:WirePanel {}
+ - !type:HasTag
+ tag: Airlock
steps:
- tool: Prying
doAfter: 4
-
- - to: airlockMedSecurity
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 3
-
- - node: airlockMedSecurity
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level2
- edges:
- - to: airlockMedSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 10
-
-## High security level airlock: a layer of plasteel plating protects the internal wiring
- - node: airlockHighSecurityBreached
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level3
- edges:
- - to: airlockUnsecured
+
+ - to: highSecDoor
completed:
- !type:GivePrototype
prototype: SheetPlasteel1
amount: 2
conditions:
- !type:WirePanel {}
+ - !type:HasTag
+ tag: HighSecDoor
steps:
- tool: Prying
doAfter: 4
- - to: airlockHighSecurity
+ - to: highSecurity
conditions:
- !type:WirePanel {}
steps:
- tool: Welding
doAfter: 5
- - node: airlockHighSecurity
+ - node: highSecurity
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level4
+ - !type:SetWiresPanelSecurity
+ examine: wires-panel-component-on-examine-security-level4
+ wiresAccessible: false
+ weldingAllowed: false
edges:
- - to: airlockHighSecurityBreached
+ - to: highSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
- tool: Welding
doAfter: 15
- - to: airlockMaxSecurity
+ - to: maxSecurity
conditions:
- !type:WirePanel {}
steps:
amount: 2
doAfter: 1
-## Max security level airlock: an electric grill is added
- - node: airlockMaxSecurity
+## Max security level door: an electric grill is added
+ - node: maxSecurity
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level5
+ - !type:SetWiresPanelSecurity
+ examine: wires-panel-component-on-examine-security-level5
+ wiresAccessible: false
+ weldingAllowed: true
edges:
- - to: airlockHighSecurity
+ - to: highSecurity
completed:
- !type:AttemptElectrocute
- !type:GivePrototype
- tool: Cutting
doAfter: 0.5
- - to: airlockSuperMaxSecurityBreached
+ - to: superMaxSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
amount: 2
doAfter: 2
-## Super max security level airlock: an additional layer of plasteel is added
- - node: airlockSuperMaxSecurityBreached
+## Super max security level door: an additional layer of plasteel is added
+ - node: superMaxSecurityUnfinished
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level6
+ - !type:SetWiresPanelSecurity
+ examine: wires-panel-component-on-examine-security-level6
+ wiresAccessible: false
+ weldingAllowed: false
edges:
- - to: airlockMaxSecurity
+ - to: maxSecurity
completed:
- !type:GivePrototype
prototype: SheetPlasteel1
- tool: Prying
doAfter: 4
- - to: airlockSuperMaxSecurity
+ - to: superMaxSecurity
conditions:
- !type:WirePanel {}
steps:
- tool: Welding
doAfter: 5
- - node: airlockSuperMaxSecurity
+ - node: superMaxSecurity
actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level7
+ - !type:SetWiresPanelSecurity
+ examine: wires-panel-component-on-examine-security-level7
+ wiresAccessible: false
+ weldingAllowed: false
edges:
- - to: airlockSuperMaxSecurityBreached
+ - to: superMaxSecurityUnfinished
conditions:
- !type:WirePanel {}
steps:
- tool: Welding
- doAfter: 15
+ doAfter: 15
+
+++ /dev/null
-- type: constructionGraph
- id: HighSecDoor
- start: start
- graph:
- - node: start
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level0
- edges:
- - to: medSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - material: Steel
- amount: 2
- doAfter: 2
-
- - to: highSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - material: Plasteel
- amount: 2
- doAfter: 2
-
-## Medium security level door: a layer of steel plating protects the internal wiring
- - node: medSecurityBreached
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level1
- edges:
- - to: start
- completed:
- - !type:GivePrototype
- prototype: SheetSteel1
- amount: 2
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Prying
- doAfter: 4
-
- - to: medSecurity
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 3
-
- - node: medSecurity
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level2
- edges:
- - to: medSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 10
-
-## High security level door: a layer of plasteel plating protects the internal wiring
- - node: highSecurityBreached
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level3
- edges:
- - to: start
- completed:
- - !type:GivePrototype
- prototype: SheetPlasteel1
- amount: 2
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Prying
- doAfter: 4
-
- - to: highSecurity
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 5
-
- - node: highSecurity
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level4
- edges:
- - to: highSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 15
-
- - to: maxSecurity
- conditions:
- - !type:WirePanel {}
- steps:
- - material: MetalRod
- amount: 2
- doAfter: 1
-
-## Max security level door: an electric grill is added
- - node: maxSecurity
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level5
- edges:
- - to: highSecurity
- completed:
- - !type:AttemptElectrocute
- - !type:GivePrototype
- prototype: PartRodMetal1
- amount: 2
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Cutting
- doAfter: 0.5
-
- - to: superMaxSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - material: Plasteel
- amount: 2
- doAfter: 2
-
-## Super max security level door: an additional layer of plasteel is added
- - node: superMaxSecurityBreached
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level6
- edges:
- - to: maxSecurity
- completed:
- - !type:GivePrototype
- prototype: SheetPlasteel1
- amount: 2
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Prying
- doAfter: 4
-
- - to: superMaxSecurity
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 5
-
- - node: superMaxSecurity
- actions:
- - !type:ChangeWiresPanelSecurityLevel
- level: Level7
- edges:
- - to: superMaxSecurityBreached
- conditions:
- - !type:WirePanel {}
- steps:
- - tool: Welding
- doAfter: 15
- type: Tag
id: AirAlarmElectronics
+
+- type: Tag
+ id: Airlock
- type: Tag
id: AirSensor
- type: Tag
id: GeigerCounter
+
+- type: Tag
+ id: GlassAirlock
- type: Tag
id: GlassBeaker
- type: Tag
id: GuideEmbeded
-
- type: Tag
id: Hamster
- type: Tag
id: HighRiskItem
+
+- type: Tag
+ id: HighSecDoor
- type: Tag
id: Hoe