From 80947b128a8e127bfd1101924c4515fd9c587c9b Mon Sep 17 00:00:00 2001
From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com>
Date: Thu, 25 Sep 2025 17:33:28 -0400
Subject: [PATCH] Add explosive cord. (#25875)
---
Content.Server/ExCable/ExCableNodeGroup.cs | 14 +++
.../Interaction/InteractionSystem.cs | 6 -
.../EntitySystems/NodeGroupSystem.cs | 1 +
.../Power/Components/CablePlacerComponent.cs | 19 +++
.../Power/EntitySystems/CableSystem.Placer.cs | 8 +-
.../Storage/EntitySystems/StorageSystem.cs | 9 --
.../NodeContainer/NodeGroups/NodeGroupID.cs | 1 +
.../PowerMonitoringCableNetworksComponent.cs | 2 +-
Content.Shared/Power/SharedPower.cs | 1 +
Resources/Locale/en-US/stack/stacks.ftl | 4 +
.../Catalog/Fills/Boxes/security.yml | 21 ++++
.../Objects/Devices/Electronics/triggers.yml | 4 +-
.../Entities/Objects/Weapons/Bombs/cord.yml | 115 ++++++++++++++++++
.../Objects/Weapons/Bombs/detonator.yml | 77 ++++++++++++
.../Entities/Structures/Power/cables.yml | 85 ++++++++++++-
.../Graphs/structures/cordage.yml | 27 ++++
.../Graphs/weapons/explosive_detonator.yml | 59 +++++++++
.../Recipes/Lathes/Packs/security.yml | 2 +
.../Prototypes/Recipes/Lathes/devices.yml | 20 +++
Resources/Prototypes/Research/arsenal.yml | 2 +
Resources/Prototypes/Stacks/power_stacks.yml | 10 ++
Resources/Prototypes/tags.yml | 3 +
.../Objects/Storage/boxes.rsi/meta.json | 5 +-
.../Objects/Storage/boxes.rsi/trigger.png | Bin 0 -> 212 bytes
.../Tools/cable-coils.rsi/coilex-10.png | Bin 0 -> 1674 bytes
.../Tools/cable-coils.rsi/coilex-20.png | Bin 0 -> 1949 bytes
.../Tools/cable-coils.rsi/coilex-30.png | Bin 0 -> 2511 bytes
.../cable-coils.rsi/coilex-equipped-BELT.png | Bin 0 -> 1670 bytes
.../cable-coils.rsi/coilex-inhand-left.png | Bin 0 -> 2569 bytes
.../cable-coils.rsi/coilex-inhand-right.png | Bin 0 -> 2553 bytes
.../Objects/Tools/cable-coils.rsi/meta.json | 21 ++++
.../Bombs/detonator.rsi/addtrigger.png | Bin 0 -> 242 bytes
.../Weapons/Bombs/detonator.rsi/complete.png | Bin 0 -> 2351 bytes
.../Weapons/Bombs/detonator.rsi/empty.png | Bin 0 -> 236 bytes
.../Weapons/Bombs/detonator.rsi/meta.json | 34 ++++++
.../Weapons/Bombs/detonator.rsi/primed.png | Bin 0 -> 3508 bytes
.../Weapons/Bombs/detonator.rsi/wired.png | Bin 0 -> 2332 bytes
.../Power/Cables/ex_cable.rsi/excable_0.png | Bin 0 -> 158 bytes
.../Power/Cables/ex_cable.rsi/excable_1.png | Bin 0 -> 201 bytes
.../Power/Cables/ex_cable.rsi/excable_10.png | Bin 0 -> 294 bytes
.../Power/Cables/ex_cable.rsi/excable_11.png | Bin 0 -> 401 bytes
.../Power/Cables/ex_cable.rsi/excable_12.png | Bin 0 -> 144 bytes
.../Power/Cables/ex_cable.rsi/excable_13.png | Bin 0 -> 348 bytes
.../Power/Cables/ex_cable.rsi/excable_14.png | Bin 0 -> 361 bytes
.../Power/Cables/ex_cable.rsi/excable_15.png | Bin 0 -> 486 bytes
.../Power/Cables/ex_cable.rsi/excable_2.png | Bin 0 -> 201 bytes
.../Power/Cables/ex_cable.rsi/excable_3.png | Bin 0 -> 164 bytes
.../Power/Cables/ex_cable.rsi/excable_4.png | Bin 0 -> 183 bytes
.../Power/Cables/ex_cable.rsi/excable_5.png | Bin 0 -> 280 bytes
.../Power/Cables/ex_cable.rsi/excable_6.png | Bin 0 -> 262 bytes
.../Power/Cables/ex_cable.rsi/excable_7.png | Bin 0 -> 375 bytes
.../Power/Cables/ex_cable.rsi/excable_8.png | Bin 0 -> 179 bytes
.../Power/Cables/ex_cable.rsi/excable_9.png | Bin 0 -> 281 bytes
.../Power/Cables/ex_cable.rsi/meta.json | 75 ++++++++++++
54 files changed, 601 insertions(+), 24 deletions(-)
create mode 100644 Content.Server/ExCable/ExCableNodeGroup.cs
create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Bombs/cord.yml
create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Bombs/detonator.yml
create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/structures/cordage.yml
create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/weapons/explosive_detonator.yml
create mode 100644 Resources/Textures/Objects/Storage/boxes.rsi/trigger.png
create mode 100644 Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-10.png
create mode 100644 Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-20.png
create mode 100644 Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-30.png
create mode 100644 Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-equipped-BELT.png
create mode 100644 Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-left.png
create mode 100644 Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-right.png
create mode 100644 Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/addtrigger.png
create mode 100644 Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/complete.png
create mode 100644 Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/empty.png
create mode 100644 Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/meta.json
create mode 100644 Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/primed.png
create mode 100644 Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/wired.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_0.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_1.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_10.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_11.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_12.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_13.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_14.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_15.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_2.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_3.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_4.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_5.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_6.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_7.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_8.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_9.png
create mode 100644 Resources/Textures/Structures/Power/Cables/ex_cable.rsi/meta.json
diff --git a/Content.Server/ExCable/ExCableNodeGroup.cs b/Content.Server/ExCable/ExCableNodeGroup.cs
new file mode 100644
index 0000000000..b505fbad94
--- /dev/null
+++ b/Content.Server/ExCable/ExCableNodeGroup.cs
@@ -0,0 +1,14 @@
+using Content.Server.NodeContainer.NodeGroups;
+using Content.Shared.NodeContainer.NodeGroups;
+using Content.Server.Power.Components;
+using Content.Server.Power.EntitySystems;
+
+namespace Content.Server.ExCable;
+
+///
+/// Dummy Node group class for handling the explosive cables.
+///
+[NodeGroup(NodeGroupID.ExCable)]
+public sealed class ExCableNodeGroup : BaseNodeGroup
+{
+}
diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs
index 9ac82b2185..c5488f458c 100644
--- a/Content.Server/Interaction/InteractionSystem.cs
+++ b/Content.Server/Interaction/InteractionSystem.cs
@@ -1,12 +1,6 @@
using Content.Shared.Interaction;
-using Content.Shared.Storage;
-using JetBrains.Annotations;
-using Robust.Server.GameObjects;
-using Robust.Shared.Containers;
-using Robust.Shared.Player;
namespace Content.Server.Interaction
{
- // TODO Remove Shared prefix
public sealed class InteractionSystem : SharedInteractionSystem;
}
diff --git a/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs b/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs
index 7b55e20f8a..ee72f89abb 100644
--- a/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs
+++ b/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs
@@ -447,6 +447,7 @@ namespace Content.Server.NodeContainer.EntitySystems
NodeGroupID.Pipe => Color.Blue,
NodeGroupID.WireNet => Color.DarkMagenta,
NodeGroupID.Teg => Color.Red,
+ NodeGroupID.ExCable => Color.Pink,
_ => Color.White
};
}
diff --git a/Content.Server/Power/Components/CablePlacerComponent.cs b/Content.Server/Power/Components/CablePlacerComponent.cs
index d52cfa118a..4674692c4a 100644
--- a/Content.Server/Power/Components/CablePlacerComponent.cs
+++ b/Content.Server/Power/Components/CablePlacerComponent.cs
@@ -1,16 +1,35 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Content.Shared.Power;
+using Content.Shared.Whitelist;
namespace Content.Server.Power.Components
{
[RegisterComponent]
public sealed partial class CablePlacerComponent : Component
{
+ ///
+ /// The structure prototype for the cable coil to place.
+ ///
[DataField("cablePrototypeID", customTypeSerializer:typeof(PrototypeIdSerializer))]
public string? CablePrototypeId = "CableHV";
+ ///
+ /// What kind of wire prevents placing this wire over it as CableType.
+ ///
[DataField("blockingWireType")]
public CableType BlockingCableType = CableType.HighVoltage;
+
+ ///
+ /// Blacklist for things the cable cannot be placed over. For things that arent cables with CableTypes.
+ ///
+ [DataField]
+ public EntityWhitelist Blacklist = new();
+
+ ///
+ /// Whether the placed cable should go over tiles or not.
+ ///
+ [DataField]
+ public bool OverTile;
}
}
diff --git a/Content.Server/Power/EntitySystems/CableSystem.Placer.cs b/Content.Server/Power/EntitySystems/CableSystem.Placer.cs
index 55d517cf7d..79ea6b5285 100644
--- a/Content.Server/Power/EntitySystems/CableSystem.Placer.cs
+++ b/Content.Server/Power/EntitySystems/CableSystem.Placer.cs
@@ -4,6 +4,7 @@ using Content.Shared.Database;
using Content.Shared.Interaction;
using Content.Shared.Maps;
using Content.Shared.Stacks;
+using Content.Shared.Whitelist;
using Robust.Shared.Map.Components;
namespace Content.Server.Power.EntitySystems;
@@ -13,6 +14,7 @@ public sealed partial class CableSystem
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
+ [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
private void InitializeCablePlacer()
{
@@ -35,12 +37,14 @@ public sealed partial class CableSystem
var snapPos = _map.TileIndicesFor((gridUid, grid), args.ClickLocation);
var tileDef = (ContentTileDefinition)_tileManager[_map.GetTileRef(gridUid, grid, snapPos).Tile.TypeId];
- if (!tileDef.IsSubFloor || !tileDef.Sturdy)
+ if ((!component.OverTile && !tileDef.IsSubFloor) || !tileDef.Sturdy)
return;
-
foreach (var anchored in _map.GetAnchoredEntities((gridUid, grid), snapPos))
{
+ if (_whitelistSystem.IsBlacklistPass(component.Blacklist, anchored))
+ return;
+
if (TryComp(anchored, out var wire) && wire.CableType == component.BlockingCableType)
return;
}
diff --git a/Content.Server/Storage/EntitySystems/StorageSystem.cs b/Content.Server/Storage/EntitySystems/StorageSystem.cs
index 4b5dd7290c..cdbac12d80 100644
--- a/Content.Server/Storage/EntitySystems/StorageSystem.cs
+++ b/Content.Server/Storage/EntitySystems/StorageSystem.cs
@@ -1,19 +1,11 @@
-using Content.Server.Administration.Managers;
-using Content.Shared.Administration;
using Content.Shared.Explosion;
-using Content.Shared.Ghost;
using Content.Shared.Hands;
-using Content.Shared.Lock;
using Content.Shared.Storage;
using Content.Shared.Storage.Components;
using Content.Shared.Storage.EntitySystems;
-using Content.Shared.Verbs;
-using Robust.Server.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
-using Robust.Shared.Utility;
-
namespace Content.Server.Storage.EntitySystems;
public sealed partial class StorageSystem : SharedStorageSystem
@@ -24,7 +16,6 @@ public sealed partial class StorageSystem : SharedStorageSystem
{
base.Initialize();
SubscribeLocalEvent(OnExploded);
-
SubscribeLocalEvent(OnStorageFillMapInit);
}
diff --git a/Content.Shared/NodeContainer/NodeGroups/NodeGroupID.cs b/Content.Shared/NodeContainer/NodeGroups/NodeGroupID.cs
index 214e9c50ce..f76a4f9022 100644
--- a/Content.Shared/NodeContainer/NodeGroups/NodeGroupID.cs
+++ b/Content.Shared/NodeContainer/NodeGroups/NodeGroupID.cs
@@ -16,4 +16,5 @@ public enum NodeGroupID : byte
///
///
Teg,
+ ExCable,
}
diff --git a/Content.Shared/Power/PowerMonitoringCableNetworksComponent.cs b/Content.Shared/Power/PowerMonitoringCableNetworksComponent.cs
index 75ac8869ed..5a79100d5f 100644
--- a/Content.Shared/Power/PowerMonitoringCableNetworksComponent.cs
+++ b/Content.Shared/Power/PowerMonitoringCableNetworksComponent.cs
@@ -34,6 +34,6 @@ public struct PowerCableChunk
public PowerCableChunk(Vector2i origin)
{
Origin = origin;
- PowerCableData = new int[3];
+ PowerCableData = new int[Enum.GetNames(typeof(CableType)).Length];
}
}
diff --git a/Content.Shared/Power/SharedPower.cs b/Content.Shared/Power/SharedPower.cs
index d45fb96cac..554146b731 100644
--- a/Content.Shared/Power/SharedPower.cs
+++ b/Content.Shared/Power/SharedPower.cs
@@ -31,6 +31,7 @@ namespace Content.Shared.Power
HighVoltage,
MediumVoltage,
Apc,
+ ExCable
}
[Serializable, NetSerializable]
diff --git a/Resources/Locale/en-US/stack/stacks.ftl b/Resources/Locale/en-US/stack/stacks.ftl
index acc7cdba64..6ff0906b83 100644
--- a/Resources/Locale/en-US/stack/stacks.ftl
+++ b/Resources/Locale/en-US/stack/stacks.ftl
@@ -36,6 +36,10 @@ stack-hv-cable = {$amount ->
[1] hv cable
*[other] hv cables
}
+stack-explosive-cord = {$amount ->
+ [1] explosive cord
+ *[other] explosive cords
+}
stack-wood-plank = {$amount ->
[1] wood plank
*[other] wood planks
diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/security.yml b/Resources/Prototypes/Catalog/Fills/Boxes/security.yml
index 818810d0cc..2f9decab7d 100644
--- a/Resources/Prototypes/Catalog/Fills/Boxes/security.yml
+++ b/Resources/Prototypes/Catalog/Fills/Boxes/security.yml
@@ -135,3 +135,24 @@
layers:
- state: box_security
- state: forensic
+
+- type: entity
+ parent: BoxCardboard
+ id: BoxDetonator
+ name: detonator box
+ description: A box of explosive detonators and triggers.
+ components:
+ - type: Item
+ shape:
+ - 0,0,1,1
+ - type: StorageFill
+ contents:
+ - id: EmptyDetonator
+ amount: 3
+ - id: TimerTrigger
+ amount: 2
+ - id: VoiceTrigger
+ - type: Sprite
+ layers:
+ - state: box_security
+ - state: trigger
diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml
index c6943a63e3..af5538fd34 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml
@@ -17,7 +17,7 @@
sprite: Objects/Devices/timer.rsi
state: timer
- type: Item
- size: Small
+ size: Tiny
- type: StaticPrice
price: 40
- type: PayloadTrigger
@@ -79,6 +79,8 @@
name: voice trigger
description: Adds a machine link that is triggered by vocal keywords.
components:
+ - type: Item
+ size: Tiny
- type: Sprite
sprite: Objects/Devices/voice.rsi
state: voice
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/cord.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/cord.yml
new file mode 100644
index 0000000000..4b91c444b7
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/cord.yml
@@ -0,0 +1,115 @@
+# Explosive cable below
+- type: entity
+ parent: [ CableStack, BaseSecurityContraband ]
+ id: CableDetStack
+ name: explosive cord
+ suffix: Full
+ description: Explosive cord for removing whatever is in your way.
+ components:
+ - type: Stack
+ stackType: CableDet
+ baseLayer: base
+ layerStates:
+ - coilex-10
+ - coilex-20
+ - coilex-30
+ - type: Sprite
+ state: coilex-30
+ layers:
+ - state: coilex-30
+ map: ["base"]
+ - type: Item
+ heldPrefix: coilex
+ - type: CablePlacer
+ cablePrototypeID: CableDet
+ blockingWireType: ExCable
+ blacklist:
+ tags:
+ - ExCable
+ overTile: true
+ - type: Appearance
+ - type: Extractable
+ grindableSolutionName: excable
+ - type: SolutionContainerManager
+ solutions:
+ mvcable:
+ reagents:
+ - ReagentId: Thermite
+ Quantity: 3
+ - ReagentId: Charcoal
+ Quantity: 2
+ - type: Damageable
+ damageContainer: StructuralInorganic
+ - type: Destructible # should have the same general explosive behavior as in cables.yml & detonator.yml
+ thresholds:
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Structural # as close as we can get to only letting explosives trigger it.
+ damage: 120
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:ExplodeBehavior
+ - trigger:
+ !type:DamageTrigger # the idea here is to prevent you from just beating it until it explodes.
+ damage: 50
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - type: Explosive
+ explosionType: DemolitionCharge
+ totalIntensity: 60
+ intensitySlope: 5
+ maxIntensity: 30
+ canCreateVacuum: false
+ - type: Tag
+ tags:
+ - Payload
+ # - type: Sticky #While cool, this doesn't actually work because the structure prevents the explosion from the cable reaching the stickied wire.
+ # stickDelay: 5
+ # unstickDelay: 5
+ # whitelist:
+ # components:
+ # - Airlock
+ # tags:
+ # - Window
+ # - Wall
+ # - type: StickyVisualizer
+
+- type: entity
+ parent: CableDetStack
+ id: CableDetStack10
+ suffix: 10
+ components:
+ - type: Sprite
+ state: coilex-10
+ - type: Stack
+ count: 10
+ - type: Explosive # TODO: some how make stacking logic handle the explosion scaling. Maybe also something for lingering stacks.
+ explosionType: DemolitionCharge
+ totalIntensity: 30
+ intensitySlope: 5
+ maxIntensity: 15
+ canCreateVacuum: false
+ - type: Tag
+ tags:
+ - Payload
+
+- type: entity
+ parent: CableDetStack
+ id: CableDetStack1
+ suffix: 1
+ components:
+ - type: Sprite
+ state: coilex-10
+ - type: Stack
+ count: 1
+ - type: Explosive
+ explosionType: DemolitionCharge
+ totalIntensity: 10
+ intensitySlope: 5
+ maxIntensity: 5
+ canCreateVacuum: false
+ - type: Tag
+ tags:
+ - Payload
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/detonator.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/detonator.yml
new file mode 100644
index 0000000000..d92cf1f77b
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/detonator.yml
@@ -0,0 +1,77 @@
+- type: entity
+ parent: [ BaseItem, BaseSecurityContraband ]
+ id: EmptyDetonator
+ name: detonator cap
+ description: A detonator cap. Requires a trigger and wire.
+ components:
+ - type: Sprite
+ sprite: Objects/Weapons/Bombs/detonator.rsi
+ layers:
+ - state: empty
+ map: [ "enum.ConstructionVisuals.Layer" ]
+ - type: Item
+ size: Small
+ - type: PayloadCase
+ - type: Construction
+ graph: DetonatorGraph
+ node: emptyDetonator
+ - type: Damageable
+ damageContainer: StructuralInorganic
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Structural # as close as we can get to only letting explosives trigger it.
+ damage: 120
+ behaviors:
+ - !type:TriggerBehavior
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - trigger:
+ !type:DamageTrigger # the idea here is to prevent you from just beating it until it explodes.
+ damage: 50
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.ConstructionVisuals.Key:
+ enum.ConstructionVisuals.Layer:
+ emptyDetonator: { state: empty }
+ detonatorWithTrigger: { state: addtrigger }
+ wiredDetonator: { state: complete }
+ enum.Trigger.TriggerVisuals.VisualState:
+ enum.ConstructionVisuals.Layer:
+ Primed: { state: primed }
+ Unprimed: { state: complete }
+ - type: StaticPrice
+ price: 25
+
+- type: entity
+ parent: EmptyDetonator
+ id: WiredDetonator
+ name: detonator cap
+ description: A detonator cap.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Explosive # this is the cord, but its a little smaller because I dont want these to be grenades. They need to not really break walls themselves, but do enough to set off the cable. ~125 structural.
+ explosionType: DemolitionCharge
+ totalIntensity: 2.5
+ intensitySlope: 100
+ maxIntensity: 2.5
+ canCreateVacuum: false
+ - type: ExplodeOnTrigger
+ - type: Sticky
+ stickDelay: 2
+ unstickDelay: 2
+ stickPopupStart: comp-sticky-start-stick-bomb
+ stickPopupSuccess: comp-sticky-success-stick-bomb
+ unstickPopupStart: comp-sticky-start-unstick-bomb
+ unstickPopupSuccess: comp-sticky-success-unstick-bomb
+ whitelist:
+ tags:
+ - ExCable
+ blacklist: # can't stick it to other items
+ components:
+ - Item
diff --git a/Resources/Prototypes/Entities/Structures/Power/cables.yml b/Resources/Prototypes/Entities/Structures/Power/cables.yml
index 2a4f1c7f1c..4722b6e0b7 100644
--- a/Resources/Prototypes/Entities/Structures/Power/cables.yml
+++ b/Resources/Prototypes/Entities/Structures/Power/cables.yml
@@ -1,6 +1,6 @@
- type: entity
abstract: true
- id: CableBase
+ id: CablePhysBase
placement:
mode: SnapgridCenter
components:
@@ -13,11 +13,21 @@
- type: Transform
anchored: true
noRot: true
- # TODO: Remove both of these, same with CollideOnAnchor
+ # TODO: Remove both of these, same with CollideOnAnchor
- type: Physics
bodyType: Static
canCollide: false
- type: Fixtures
+ - type: CollideOnAnchor
+ - type: Appearance
+
+- type: entity
+ abstract: true
+ parent: CablePhysBase
+ id: CableBase
+ components:
+ - type: Visibility
+ layer: 1
- type: Sprite
drawdepth: ThinWire
visible: false
@@ -33,8 +43,6 @@
- !type:DoActsBehavior
acts: ["Destruction"]
- type: SubFloorHide
- - type: CollideOnAnchor
- - type: Appearance
- type: Electrified
onHandInteract: false
onInteractUsing: false # wire-cutting handled separately.
@@ -215,3 +223,72 @@
components:
- type: Cable
cuttingQuality: null
+
+# Explosive cable below
+- type: entity
+ id: CableDet
+ parent: [ CablePhysBase, BaseSecurityContraband ]
+ name: explosive cord
+ description: Spaghetti for people who hate walls.
+ components:
+ - type: Cable
+ cableDroppedOnCutPrototype: CableDetStack1
+ cableType: ExCable
+ - type: Sprite
+# color: white # maybe change this later and move the stripes to the CableVisualizerComp layer instead
+ sprite: Structures/Power/Cables/ex_cable.rsi
+ state: excable_0
+ - type: Icon
+ sprite: Structures/Power/Cables/ex_cable.rsi
+ state: excable_4
+ - type: Damageable
+ damageContainer: StructuralInorganic
+ - type: Destructible
+ thresholds:
+ - trigger:
+ !type:DamageTypeTrigger
+ damageType: Structural #this is as close as we can get to only letting explosives set it off.
+ damage: 120
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - !type:ExplodeBehavior
+ - trigger:
+ !type:DamageTrigger #A fallback that deletes it but doesnt explode in case something somehow gets here without exploding violently enough.
+ damage: 50
+ behaviors:
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - trigger:
+ !type:DamageTrigger
+ damage: 35
+ behaviors:
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ CableDetStack1:
+ min: 1
+ max: 1
+ - !type:DoActsBehavior
+ acts: [ "Destruction" ]
+ - type: CableVis
+ node: cordage
+ - type: NodeContainer
+ nodes:
+ cordage:
+ !type:CableNode
+ nodeGroupID: ExCable
+ - type: CableVisualizer
+ statePrefix: excable_
+ - type: Explosive
+ explosionType: DemolitionCharge
+ totalIntensity: 10
+ intensitySlope: 5
+ maxIntensity: 5
+ canCreateVacuum: false
+ - type: ExplodeOnTrigger
+ - type: Construction
+ graph: DetCable
+ node: detonationCable
+ - type: Tag
+ tags:
+ - ExCable
diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/cordage.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/cordage.yml
new file mode 100644
index 0000000000..aa26a1f581
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/cordage.yml
@@ -0,0 +1,27 @@
+- type: constructionGraph
+ id: DetCable
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: detonationCable
+ completed:
+ - !type:SnapToGrid
+ southRotation: true
+ steps:
+ - material: Bananium
+ amount: 1
+ doAfter: 0
+
+ - node: detonationCable
+ entity: CableDet
+ edges:
+ - to: start
+ completed:
+ - !type:SpawnPrototype
+ prototype: CableDetStack1
+ amount: 1
+ - !type:DeleteEntity {}
+ steps:
+ - tool: Cutting
+ doAfter: 0.5
diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/explosive_detonator.yml b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/explosive_detonator.yml
new file mode 100644
index 0000000000..ddd5e29efe
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/explosive_detonator.yml
@@ -0,0 +1,59 @@
+- type: constructionGraph
+ id: DetonatorGraph
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: emptyDetonator
+ steps:
+ - material: Bananium
+ amount: 1
+ doAfter: 1
+
+ - node: emptyDetonator
+ entity: EmptyDetonator
+ actions:
+ - !type:AppearanceChange
+ edges:
+ - to: detonatorWithTrigger
+ steps:
+ - component: PayloadTrigger
+ store: payloadTrigger
+ name: construction-graph-component-payload-trigger
+ doAfter: 0.5
+
+ - node: detonatorWithTrigger
+ entity: EmptyDetonator
+ actions:
+ - !type:AppearanceChange
+ - !type:PlaySound
+ sound: /Audio/Machines/button.ogg
+ edges:
+ - to: emptyDetonator
+ steps:
+ - tool: Prying
+ doAfter: 0.5
+ completed:
+ - !type:EmptyContainer
+ container: payloadTrigger
+ - to: wiredDetonator
+ steps:
+ - material: CableDet
+ doAfter: 0.5
+
+ - node: wiredDetonator
+ entity: WiredDetonator
+ actions:
+ - !type:AppearanceChange
+ - !type:PlaySound
+ sound: /Audio/Machines/button.ogg
+ - !type:AdminLog
+ message: "A detonator cap was crafted"
+ edges:
+ - to: detonatorWithTrigger
+ steps:
+ - tool: Cutting
+ doAfter: 0.5
+ completed:
+ - !type:SpawnPrototype
+ prototype: CableDetStack1
diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/security.yml b/Resources/Prototypes/Recipes/Lathes/Packs/security.yml
index f3e8891b25..0dc5fe3d90 100644
--- a/Resources/Prototypes/Recipes/Lathes/Packs/security.yml
+++ b/Resources/Prototypes/Recipes/Lathes/Packs/security.yml
@@ -90,6 +90,8 @@
- ScienceExplosives # sec gets everything for modular grenade making that sci does
id: SecurityExplosives
recipes:
+ - CableDetStack1
+ - EmptyDetonator
- ExplosivePayload
- GrenadeBlast
- GrenadeEMP
diff --git a/Resources/Prototypes/Recipes/Lathes/devices.yml b/Resources/Prototypes/Recipes/Lathes/devices.yml
index 62a6122342..b703aa1240 100644
--- a/Resources/Prototypes/Recipes/Lathes/devices.yml
+++ b/Resources/Prototypes/Recipes/Lathes/devices.yml
@@ -216,3 +216,23 @@
Steel: 500
Glass: 400
Gold: 100
+
+- type: latheRecipe
+ id: CableDetStack1
+ result: CableDetStack1
+ categories:
+ - Weapons
+ completetime: 2
+ materials:
+ Plastic: 50
+ Plasma: 25
+ Gold: 20
+
+- type: latheRecipe
+ id: EmptyDetonator
+ result: EmptyDetonator
+ categories:
+ - Weapons
+ completetime: 3
+ materials:
+ Steel: 100
diff --git a/Resources/Prototypes/Research/arsenal.yml b/Resources/Prototypes/Research/arsenal.yml
index bb12a2c25f..846eef1452 100644
--- a/Resources/Prototypes/Research/arsenal.yml
+++ b/Resources/Prototypes/Research/arsenal.yml
@@ -116,6 +116,8 @@
- FlashPayload
- ExplosivePayload
- ChemicalPayload
+ - CableDetStack1
+ - EmptyDetonator
- type: technology
id: SpecialMeans
diff --git a/Resources/Prototypes/Stacks/power_stacks.yml b/Resources/Prototypes/Stacks/power_stacks.yml
index 305c85943d..40782d382c 100644
--- a/Resources/Prototypes/Stacks/power_stacks.yml
+++ b/Resources/Prototypes/Stacks/power_stacks.yml
@@ -18,3 +18,13 @@
icon: { sprite: "/Textures/Objects/Tools/cable-coils.rsi", state: coilhv-30 }
spawn: CableHVStack1
maxCount: 30
+
+# Explosive cable below
+
+- type: stack
+ id: CableDet
+ name: stack-explosive-cord
+ icon: { sprite: "/Textures/Objects/Tools/cable-coils.rsi", state: coilex-30 }
+ spawn: CableDetStack1
+ maxCount: 30
+
diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml
index 14dfa9499e..fde9057d64 100644
--- a/Resources/Prototypes/tags.yml
+++ b/Resources/Prototypes/tags.yml
@@ -551,6 +551,9 @@
- type: Tag
id: Enzyme
+- type: Tag
+ id: ExCable
+
- type: Tag
id: ExplosivePassable
diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json
index ea483851b7..64c3fc85c1 100644
--- a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json
+++ b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json
@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/ca674eff9d23e04357b7609ef7e07eadfc1a993f and modified by Flareguy (github), encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef, nitrogentank modified from extendedtank by Errant, agrichemkit by Cerol, modified by ps3moira (github). sechud renamed to secglasses, new sechud, sunglasses by K-Dynamic (github). utensils by gentleman-bird (github)",
+ "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/ca674eff9d23e04357b7609ef7e07eadfc1a993f and modified by Flareguy (github), encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef, nitrogentank modified from extendedtank by Errant, agrichemkit by Cerol, modified by ps3moira (github). sechud renamed to secglasses, new sechud, sunglasses by K-Dynamic (github), trigger by IProduceWidgets, utensils by gentleman-bird (github).",
"size": {
"x": 32,
"y": 32
@@ -197,6 +197,9 @@
{
"name": "vials"
},
+ {
+ "name": "trigger"
+ },
{
"name": "envelope"
},
diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/trigger.png b/Resources/Textures/Objects/Storage/boxes.rsi/trigger.png
new file mode 100644
index 0000000000000000000000000000000000000000..5be60b4622777470dc7ce41354860b721d7caa9a
GIT binary patch
literal 212
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
ZJ^|`z3#m1zNH72Z002ovPDHLkV1l7pm=yp3
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-equipped-BELT.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-equipped-BELT.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ebbd08fae630f34358a115e472c2b16eec69ed4
GIT binary patch
literal 1670
zcmV;126_33P)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_RlH?`~{pS=pf+ZmY$3cLq_69kA9&UHf^vv$g
zY$ac*Hf4i_{3P^*a9V%=i1ZgOCd(
zZ0MN>XxXwV#*GK~A#jF9!6r?nRFE}zB@u}E;R~I1+i7o5h2=?5Wda!ClV7&(=L
zfu5qjZ6QiFF93uHwiV8hfPtfsC>1)4*@zIw3W7R3XUXhffK++HNzQ`Zl8h^F+xW)l
z)Me$uTa4NSB2aebzpVqcSxLFJiB^v^Xkp}K>Cb4bd+JEjyC$_
zDHCO4mT9xjHv6KqP$^bky2`RuS6e-hYax+Cql86`7X886#p8lOyUJ$tYQ
zX)?P*&@LysIRj&y35?rj013^Tv!hbZyqVja9gVRml;NaqZqlU97%0q(Sc4wiy)pMK
z-jddD@y1^d+hY=oHTKAlWKAP@O{8PY@O>^Jf2Ej*0t%T4tmPzaz-set2ODd8jJe0nO0btQCUmA36Nk;N8N05`t_dd~
z;|&IKDYG;z#g}?p7Fh{fn_Aud{xkbspT1J~R&P1dq9e$*^MetDf;Hn@ceUA3MPhiF
z&8@5zQ8IRQ*lIe)2A~CiftZb%sFqFYwoW`mW*&=mqowdI7zFc8@~^B^y8C{{Wq;+RC%ctd0Nx
z0fT8nLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#b48kA{7Tah&n{5P8N!aI7$_ZV4<`X
zT6HkF^b49aBq=VAf@{ISkHxBki?gl{u7V)=0pcz=DY{6B|4RxjVmvtR$GdxvyLW)l
zs4&$GL;+Q^j8r@(W^=1z_bUPz1`x%l#7sSrUd+IAeBHyx*SiSM@;>+H=u`401AHR!
z9McVpc!PLm)6zNb6NgwyQi#uqCk(nE@gvt|m)|%S9Ts?I$jGGTi9^I+gyEO|_lWtNl26VmH_Qx2|y$dw!w*7r<+szZe{|sDd
zZGW`^%zlzyZ)@Qrpnn^3_j_SAvuztrcfvV?`QN)Ibh%x=v{MrYwhFo
z0mx8S%QwKmAuwK~>~)WK_jLC5@0nJAKdz;6zlQ)MrvLx|24YJ`L;xuOasV#AF-Q9V
z000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2k8VG0SFqqevk10003%9L_t(|+U?Y_
z4FW+71i(9qg1!%OA{w|WgFf5?HIX7}*iQ&aUL>HKi8i#ol3N1+004kP^7gOupT1pw
z&e?9SM@y34dta*ks>-Lll>2r~Rb`BkrGLTma$frY0000000000006&c2iX}T3Va2S
QwEzGB07*qoM6N<$f*c+TqyPW_
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-left.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-left.png
new file mode 100644
index 0000000000000000000000000000000000000000..00ba40526d3fb3868238ae453ac238b055ba2b02
GIT binary patch
literal 2569
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
P00000NkvXXu0mjf+<3lR
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/meta.json b/Resources/Textures/Objects/Tools/cable-coils.rsi/meta.json
index d1fcdea7f4..95b59f691d 100644
--- a/Resources/Textures/Objects/Tools/cable-coils.rsi/meta.json
+++ b/Resources/Textures/Objects/Tools/cable-coils.rsi/meta.json
@@ -31,6 +31,14 @@
"name": "coillv-inhand-right",
"directions": 4
},
+ {
+ "name": "coilex-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "coilex-inhand-right",
+ "directions": 4
+ },
{
"name": "coil-30"
},
@@ -70,6 +78,15 @@
{
"name": "coilall-30"
},
+ {
+ "name": "coilex-30"
+ },
+ {
+ "name": "coilex-20"
+ },
+ {
+ "name": "coilex-10"
+ },
{
"name": "coil-equipped-BELT",
"directions": 4
@@ -85,6 +102,10 @@
{
"name": "coilhv-equipped-BELT",
"directions": 4
+ },
+ {
+ "name": "coilex-equipped-BELT",
+ "directions": 4
}
]
}
diff --git a/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/addtrigger.png b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/addtrigger.png
new file mode 100644
index 0000000000000000000000000000000000000000..77e4b572933566538117a98d77e1ed729b5de9f0
GIT binary patch
literal 242
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJot`d^ArXh)PFCbQY{27Mzii>e
z36&RE4?6Gk@W0mmMZwkepyEQw48IADz7x4#d(2h)xiO;X&zDr@u0J@3Cm)OC6bMXB
zJ0h_$SNd7yyQou#nJm*M2W7oajg0zxg~dygp&@hDu5~N58xtiA`X29Oddsr^h(vjj
q`+uXL;`g=DJ4$1DMO*_#6!XnzIR5&fa_$6AYfNelF{r5}E)h(O*3P
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/complete.png b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/complete.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6c4d89d6c2a764bfc3f6daf39cb94b969f5e09a
GIT binary patch
literal 2351
zcmV+~3DEY5P)
zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ulH?`~{m&_K1P}&wgaL
zHdXnNZDuTtF%o)D5)S*XKP~)$AC*Xxu9ePBznK
zwy)idQsL2hGwL||;US+m;qrW5t7w9MMqf_rXf2Mo0J+8$C)!Fq5m2#^O42lvrG4Z|
z3nmuYB#=Z4u=rTZLY)@yNx%#(8AX2T!XHo-2=Z}r!v;s3*AkP{
z2e6sD9CY0=0Cb
zMh7XMCr{Kc8blsTBu^*om;o^=35bg$078>v7F#NX9684Y
zEj_XOK<ep?jxhOH8X_
zo=zU7q1x2Bnju6cmYYa-yAKq#D%!304Slm^8x!$26@L?v)Ioht4C1RS#J{e9&_TwB
zI^>mKk>OhpP+c-IL&ZiAp@a99fg{(7;v1T}u_0B$er&;08Vmt%ebk1Efz7b-)Rhxr
z70y8PPNV?#u1x6>M_?pNc!6i%k~;I&%$u|X985*cc*B6TRFD}~Zp&u24EG!9N~UqxeeLny7A4dBU%;$8m~Y+8BhK!hle+(Y*F@2!B=>Uswpm!NQ4}496?I=;@$cP$6VpG6+Ee;Nf7|0pC
zCgJppqZjHf+=DZ(d?P?`7(s?HetHK%g8GP~c=a?APms+1$U3-#Gd)GHgOkpdJ%Sze
z(|HM@CX^hvE}>s0*6IX)@N3S7VNiM5SRaP93;DFlk?fy+4;elWd|%2eS{G~w5J;#e
z&twor2WtNUV>=bknggsd&THfJ0JADwJclleMK??v8pkwjcX<@yu);W1;1gAEX>4Tx0C=2zkv&MmKpe$i(~2S$2Rn#5M5s;{ii$W&6^me@v=v%)FuC*#nlvOS
zE{=k0!NHHks)LKOt`4q(Aou~|E;uQ=NQwVT3N2zhIPS;0dyl(!fY7Kg)eJ-dRkMs#
zJSJvyt77*n0vHAm#i+zgJ&|6_z;k@v!^hXV2+#69_vh$S@+Jd(BJmv44U2e#cxKbm
zIqwsPSV>Zd&xt1tx*+i**JYRAI2RojcxK4Rq~?i3#A307gLnWRj4lAlg`9juZ
zh4U6?wNhiPd-4|s^V&+9>oi9Y#}X1qLWGPO%Ba9XgjS6d6Dit{dH9DMf0A4>xyoSV
zSU?pjB*zc_2fw>D3saMBQZNQ|z1a507|^{7H0!qgeQev!6TtrrTxo58wE@h2l3s6X
z;Ul1b8@RY`Yw{j&xdRM7>5?HilAoqfC;;zg^i4Tn;1=jzb9-y;kZ8-0M;$M7Zg1=0jkD5SBn6eJr0sneuf6*ut#u0`A>+PIEC
z)qKq`%y7<`%bg2>Kp^1Bx5{>Ve103JK0${C$qn*|IPMW5w?1?{V!khg|I+LD?
z<5;xTY)zlgT4Rj)P>E)LSi313bzlED4^EpuzVXb94oqni7XVOz;*k21!ighME
zWsDJPEwkB-qA1AooY82+dQ+~4{fdpc7n}Vd(npk13XoQ-1wfJ{0OWZN!0H%o4>n=)
zwXUigz&R&Z&vSO~9;%WTMZt2p#9B+c-RAiImBZ~9$|04esrt150TInlKx^Hkl-TzjQc5VLT5l3v0x2bI+Xf;+2w^CNrDyj<
zgcu`ADL9T}sFbe-a?T>9bf3@jyzi$bP-_JMc<<+y@R`86uCUh5{{_#|#TftO-p&%e
m=348!aMyJSFbu;mo%{f<_&sLK&}nl30000
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
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_1.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2cbf1272aca358b48637f81dbcf4621a375a026
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ37#&FArYL(2@4qhus5AKbLPK@
z#K8kDooN%|zCWI?Y1E{|zK8Ss!V^Uk(z;|Aj1rcs>UStf2RvbzI5qmjHi=~umDn42
zBz>6|XC|2N_AF~uoX?h^s&w+pYlHXy6?`(M`UD2@tmf9}WZNXmu(@V&qRz>M?xwub
tJW2nW4X*OYm}Z!;xH%_42{t7bhF@WZrzaoIGzGei!PC{xWt~$(69BukLx=zX
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_10.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_10.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4335bdd6be29116a9c45d97442e3d9ea0cfd0de
GIT binary patch
literal 294
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJx1KJJArYL(2@m18?be&k2GaqndR88nxnN)FF!Mav7uxi5B;NHI$#&7=L*;#y0(OK7driUTN
zv+4=X9v9t9x2`|D=l|hFtwD!9xfo}pZn(qvIM`|OQ-*-NjH=%qiOr5YM*|(FF(=ry
zO_esVvoyKMw;;@9!dr$cSLU014Xox%FFH(QULnXUV#y%FwV{hgOlip_AUmvea+c<%
isxBD@qmD}^3=BIR?Zb1zZPS4sXYh3Ob6Mw<&;$UiB5g1L
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_11.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_11.png
new file mode 100644
index 0000000000000000000000000000000000000000..83d067820b79b94600d090abb1691a5c797c0b3e
GIT binary patch
literal 401
zcmV;C0dD?@P)b;@5JlJNsggF7sgn}r02HBins5MLAw`N@!j%sI6-YFkfO|j*RtgSa{4ITHWyz9v
z{u)c!W^8$9{@b0|Svx0;svcRERYC~&pg6;Kez-~@B!J83LK26w1b_hh*#yQsB!H*Y
z&MZtv2>?OV8X!op#R=HFen}?)qUIflQGgNvoYewE4AVHLA94etuqg#Gs-FPCHb(mm
z7Nx^z;>h_>;t5yRwh-h|`+1x;pYuHLoZt5E`<_4ulPSgm+rBNE7&vM}2oo^Dea?2u
zbB*`+mp@0Cq#ksLZ94<=N5h910;ChbUnya}UFn|lbuS;^KicytORJ(NqrtZ4@z#3p4C^?l3$vC?1$;40KKNB}X?
vAOT<(c#&~OLahYAD?C)xpDzI*kXi#b;9PyjOsakJ00000NkvXXu0mjf;8vv)
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_12.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_12.png
new file mode 100644
index 0000000000000000000000000000000000000000..9590e82dbbec6169448ef3aad6b8e2bc15ee1890
GIT binary patch
literal 144
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DP&Q
bm4QKax5){PtGOXSD;PXo{an^LB{Ts5_jxkL
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_13.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_13.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1a67c53fbbd5171ce91969e2922a7c6bf6a3302
GIT binary patch
literal 348
zcmV-i0i*tjP)4&3R-ExCa+1LX=JVUTHF5n3LXO(J(W=t&Ja^`sIJ_4Y
z*JJe=J(84R=I}iM5jG@aL*bG^VAQ@Pt_qBwb!VzMs-_sEkS~E+&M}j*A0L)46&v_o
uucjEA&kHCfM+c$<(ShhdbRatLYX=@=PlJXgsbSUt0000@Z&cM`Kp`+ZfMC&BBoG7-D9k34TrP$5dIij#
z=-zI3cV_2$pp;);0k42pz$@St@Cy7{fgpP=aJWv#LZ!9ZiVa>%HWfWC;Ye`UpLjtO
zMcMH15SU%RE*Acvdsj>@OGY1Ve`+YbKY-xBof5>5q?0L11k-|i9LG|RK9l1z7b`c2
z0)3IpT-{VVS%0hn_@dd7@+3(<=IR)Q_U9vU%?-iGcu!n9Y6yPEZrf
z^qE)0)`}#VIlLW=n?B=TwU~O-o8hK8oqH(-IGK5`8Mm>e2~c+aqS=5}mdj&sX;@kT
zg7O&X+gc|AJO*1(J>Q7{8u5=zZ)&r5B2dK#=tKaMx_$#sFZy|ZBs&H200000NkvXX
Hu0mjfbYzoH
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_15.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_15.png
new file mode 100644
index 0000000000000000000000000000000000000000..01ce8b4944339900c1ebe0e56759c6a2406988a1
GIT binary patch
literal 486
zcmV@P)XexojSRw!ix4Wy@vX?|)
zY$$b_7^}Y8tW$Ap9&qH4X4(S}(JMF9Rr+EzYtc
z5QjaMEdB90=EXi-_`c9XRC%}phCO?Y}v&)pnNzoL
zlX~8318{52#CS;=72elo04Ld`6ZHiMbPb$e0VnwwES9M^WdDEP0^SO@MxSFTdC!Uf
zNrZEQXVyKN0EZMOniY5yeWpQimK_0tG7XfiyF`F#u!4sA5&<~khb(kzd6o!_QGgNw
c+*GZB4;9nlJy7^e^8f$<07*qoM6N<$f}2##w*UYD
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_2.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..05a9a89d9a8addc52ee3c065fd2eb3ea5c923d14
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ37#&FArYL(2@Qm4YjxHyLDQp_7B9;s(mPzopr0Kb?*GXMYp
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_3.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2046266b600a76172ced2bddf38c1d565c38cb2
GIT binary patch
literal 164
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJY)==*kOyj-#Va6
O7(8A5T-G@yGywqAU_H11
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_5.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb9da73f71226163ba14ef47ed4564e908d0b125
GIT binary patch
literal 280
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ`<^b2ArYL(2@4qhus5AKbLPK@
z#K8kDooN%|zCWI?Y1E{|zK8Ss!V^Uk(z;|Aj1rcs>UStf2RvbzI5qmjHi=~umDn42
zBrlj8;9$9y^-%0<-HPc3$}MO)x@gikrj57GK>k
z#~iMcg0~X{KFf!ND_FCoh^Z0{S1h>yI*GMjbM7
V_*Lp%mIu(Q44$rjF6*2UngBoAXD0vv
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_6.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..0736f7b9a75a848715f715cd0831da10bea4dc7c
GIT binary patch
literal 262
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJvz{)FArYL(2@?)$6B}Y;Iv)x|9O@r))=(U
zVmYy0VZzLrKkJ(vc_bbi&3~oHuxXE91YgemFE1~z%(K($Z#e2Wt+}Q*TyU*Q`joItxf~Gd1W(__@ukPS3
z8He60{u7xU9Q{3+SY9qa!Fa`^LBx{b3A5K_1_pzN9?@*uOF{l)@O1TaS?83{1OVrx
BVO9VD
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_7.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..c606f14cd85e01f93a0b82086d808ad3b3c0b6c5
GIT binary patch
literal 375
zcmV--0f_#IP)KyV8S&CSlIF5j!Yl{*Vz=23ycKFz;4*m&wC*O-SyU+*nmiY
zjQq3)8pRs*Z;reK908gJEP$o~3!rJh0u%v~h9CkIg@w!9IgU_UmNRIjX`1UpMkrWO
zxI`1psgHy-C}9=e`obzZmB*?PrK##}xj?Z0!R+!whOVC}_k9R4kNkXB4)0nUb=
z8p(T*2-v&!@dgX9j^;y-F{=E!Ci4jajsR_^NI;0{M*rE0U-(y36KZ01|CVE
Veu#cYQ6~TZ002ovPDHLkV1ffLmmdHC
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_8.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_8.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4cfcb35da8609926a27b48a25d9c2ce1bab6a6a
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJDo+>3kO5yrNh6CRsO9GUR8x@uSHm30>dBzPNP#2!TkhAZ!apEGc9)&pI^
N;OXk;vd$@?2>`>3Jc9rL
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_9.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_9.png
new file mode 100644
index 0000000000000000000000000000000000000000..49abe322949bfd0e1db431be7bcd29fd072757ee
GIT binary patch
literal 281
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ2c9mDArYL(2@4qhus5AKbLPK@
z#K8kDooN%|zCWI?Y1E{|zK8Ss!V^Uk(z;|Aj1rcs>UStf2RvbzI5qmjHi=~umDn42
z7Mk!Lka05NJ;f-^lcaHqQNjBpA7hq^15n2$pG+o}nT}!=vd?@A8Cf>ZSfjDP?Nz&F
zL&_|vqxvVO9WvpW@pOU3@~KaI4DK(ytiYWZxz;a&Psg_QSIL}L7rzRhPG^Z^3F6tz
zGwpzx)Ul?s45_A35j@2T$}8;JMVD`=;eEs&6X8^P|B#OCQg`PB6Bai(!4}HFz@V<<
VSKRW<#T)2X22WQ%mvv4FO#mQUV$=Wt
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/meta.json b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/meta.json
new file mode 100644
index 0000000000..58fb0e4d29
--- /dev/null
+++ b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/meta.json
@@ -0,0 +1,75 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/fcf375d7d9ce6ceed5c7face899725e5655ab640, striping added by IProduceWidgets",
+ "states": [
+ {
+ "name": "excable_0"
+
+ },
+ {
+ "name": "excable_1"
+
+ },
+ {
+ "name": "excable_2"
+
+ },
+ {
+ "name": "excable_3"
+
+ },
+ {
+ "name": "excable_4"
+
+ },
+ {
+ "name": "excable_5"
+
+ },
+ {
+ "name": "excable_6"
+
+ },
+ {
+ "name": "excable_7"
+
+ },
+ {
+ "name": "excable_8"
+
+ },
+ {
+ "name": "excable_9"
+
+ },
+ {
+ "name": "excable_10"
+
+ },
+ {
+ "name": "excable_11"
+
+ },
+ {
+ "name": "excable_12"
+
+ },
+ {
+ "name": "excable_13"
+
+ },
+ {
+ "name": "excable_14"
+
+ },
+ {
+ "name": "excable_15"
+
+ }
+ ]
+}