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 0000000000..5be60b4622
Binary files /dev/null and b/Resources/Textures/Objects/Storage/boxes.rsi/trigger.png differ
diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-10.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-10.png
new file mode 100644
index 0000000000..474a751b13
Binary files /dev/null and b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-10.png differ
diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-20.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-20.png
new file mode 100644
index 0000000000..b9f4c45e07
Binary files /dev/null and b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-20.png differ
diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-30.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-30.png
new file mode 100644
index 0000000000..1d04573c5c
Binary files /dev/null and b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-30.png differ
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 0000000000..0ebbd08fae
Binary files /dev/null and b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-equipped-BELT.png differ
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 0000000000..00ba40526d
Binary files /dev/null and b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-left.png differ
diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-right.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-right.png
new file mode 100644
index 0000000000..86ce3a5412
Binary files /dev/null and b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-right.png differ
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 0000000000..77e4b57293
Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/addtrigger.png differ
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 0000000000..a6c4d89d6c
Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/complete.png differ
diff --git a/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/empty.png b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/empty.png
new file mode 100644
index 0000000000..f5e5d3b5aa
Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/empty.png differ
diff --git a/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/meta.json b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/meta.json
new file mode 100644
index 0000000000..4b39b7a3be
--- /dev/null
+++ b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/meta.json
@@ -0,0 +1,34 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from austation at commit https://github.com/austation/austation/commit/71d8e7406d84f8ec8cb79bf153b050e7e09d2a17 and modified by IProduceWidgets",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "empty",
+ "directions": 1
+ },
+ {
+ "name": "wired",
+ "directions": 1
+ },
+ {
+ "name": "addtrigger",
+ "directions": 1
+ },
+ {
+ "name": "complete",
+ "directions": 1
+ },
+ {
+ "name": "primed",
+ "directions": 1,
+ "delays": [
+ [ 0.2, 0.2 ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/primed.png b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/primed.png
new file mode 100644
index 0000000000..56a28ec57c
Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/primed.png differ
diff --git a/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/wired.png b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/wired.png
new file mode 100644
index 0000000000..c74ea20376
Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/wired.png differ
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_0.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_0.png
new file mode 100644
index 0000000000..dadf77beb8
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_0.png differ
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 0000000000..c2cbf1272a
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_1.png differ
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 0000000000..c4335bdd6b
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_10.png differ
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 0000000000..83d067820b
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_11.png differ
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 0000000000..9590e82dbb
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_12.png differ
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 0000000000..b1a67c53fb
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_13.png differ
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_14.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_14.png
new file mode 100644
index 0000000000..61ef8cd47c
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_14.png differ
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 0000000000..01ce8b4944
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_15.png differ
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 0000000000..05a9a89d9a
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_2.png differ
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 0000000000..d2046266b6
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_3.png differ
diff --git a/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_4.png b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_4.png
new file mode 100644
index 0000000000..d1edbc5b69
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_4.png differ
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 0000000000..bb9da73f71
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_5.png differ
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 0000000000..0736f7b9a7
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_6.png differ
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 0000000000..c606f14cd8
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_7.png differ
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 0000000000..d4cfcb35da
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_8.png differ
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 0000000000..49abe32294
Binary files /dev/null and b/Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_9.png differ
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"
+
+ }
+ ]
+}