]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add explosive cord. (#25875)
authorIProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com>
Thu, 25 Sep 2025 21:33:28 +0000 (17:33 -0400)
committerGitHub <noreply@github.com>
Thu, 25 Sep 2025 21:33:28 +0000 (23:33 +0200)
54 files changed:
Content.Server/ExCable/ExCableNodeGroup.cs [new file with mode: 0644]
Content.Server/Interaction/InteractionSystem.cs
Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs
Content.Server/Power/Components/CablePlacerComponent.cs
Content.Server/Power/EntitySystems/CableSystem.Placer.cs
Content.Server/Storage/EntitySystems/StorageSystem.cs
Content.Shared/NodeContainer/NodeGroups/NodeGroupID.cs
Content.Shared/Power/PowerMonitoringCableNetworksComponent.cs
Content.Shared/Power/SharedPower.cs
Resources/Locale/en-US/stack/stacks.ftl
Resources/Prototypes/Catalog/Fills/Boxes/security.yml
Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml
Resources/Prototypes/Entities/Objects/Weapons/Bombs/cord.yml [new file with mode: 0644]
Resources/Prototypes/Entities/Objects/Weapons/Bombs/detonator.yml [new file with mode: 0644]
Resources/Prototypes/Entities/Structures/Power/cables.yml
Resources/Prototypes/Recipes/Construction/Graphs/structures/cordage.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Construction/Graphs/weapons/explosive_detonator.yml [new file with mode: 0644]
Resources/Prototypes/Recipes/Lathes/Packs/security.yml
Resources/Prototypes/Recipes/Lathes/devices.yml
Resources/Prototypes/Research/arsenal.yml
Resources/Prototypes/Stacks/power_stacks.yml
Resources/Prototypes/tags.yml
Resources/Textures/Objects/Storage/boxes.rsi/meta.json
Resources/Textures/Objects/Storage/boxes.rsi/trigger.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-10.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-20.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-30.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-equipped-BELT.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-left.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-right.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/cable-coils.rsi/meta.json
Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/addtrigger.png [new file with mode: 0644]
Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/complete.png [new file with mode: 0644]
Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/empty.png [new file with mode: 0644]
Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/primed.png [new file with mode: 0644]
Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/wired.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_0.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_1.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_10.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_11.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_12.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_13.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_14.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_15.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_2.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_3.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_4.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_5.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_6.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_7.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_8.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/excable_9.png [new file with mode: 0644]
Resources/Textures/Structures/Power/Cables/ex_cable.rsi/meta.json [new file with mode: 0644]

diff --git a/Content.Server/ExCable/ExCableNodeGroup.cs b/Content.Server/ExCable/ExCableNodeGroup.cs
new file mode 100644 (file)
index 0000000..b505fba
--- /dev/null
@@ -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;
+
+/// <summary>
+/// Dummy Node group class for handling the explosive cables.
+/// </summary>
+[NodeGroup(NodeGroupID.ExCable)]
+public sealed class ExCableNodeGroup : BaseNodeGroup
+{
+}
index 9ac82b21858d31e7e7b23af3c8518cd89eda9d2c..c5488f458c5a2bf4e116e05154dfa63a81700a2e 100644 (file)
@@ -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;
 }
index 7b55e20f8a27a5013657b6dd16b1e02f8ff68147..ee72f89abbcd0117357cd61ac50c1e05ca800f6a 100644 (file)
@@ -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
             };
         }
index d52cfa118a446ddeaa7e409425211e5c0f0dd59f..4674692c4a4dd28b9e7e6a934547b01aa3f12b01 100644 (file)
@@ -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
     {
+        /// <summary>
+        /// The structure prototype for the cable coil to place.
+        /// </summary>
         [DataField("cablePrototypeID", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
         public string? CablePrototypeId = "CableHV";
 
+        /// <summary>
+        /// What kind of wire prevents placing this wire over it as CableType.
+        /// </summary>
         [DataField("blockingWireType")]
         public CableType BlockingCableType = CableType.HighVoltage;
+
+        /// <summary>
+        /// Blacklist for things the cable cannot be placed over. For things that arent cables with CableTypes.
+        /// </summary>
+        [DataField]
+        public EntityWhitelist Blacklist = new();
+
+        /// <summary>
+        /// Whether the placed cable should go over tiles or not.
+        /// </summary>
+        [DataField]
+        public bool OverTile;
     }
 }
index 55d517cf7d3b73994567e839ee7e88b27db63aa6..79ea6b5285c189546dc552954d2f52b1237422b7 100644 (file)
@@ -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<CableComponent>(anchored, out var wire) && wire.CableType == component.BlockingCableType)
                 return;
         }
index 4b5dd7290c0f5b2603c604b0dbf77a92862fedd8..cdbac12d804a038ea4de6c6378900bf6e353c9f8 100644 (file)
@@ -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<StorageComponent, BeforeExplodeEvent>(OnExploded);
-
         SubscribeLocalEvent<StorageFillComponent, MapInitEvent>(OnStorageFillMapInit);
     }
 
index 214e9c50ce9116b604e1f67357d75f4c40722f67..f76a4f9022abe9d9d632268952ab11d8773cd353 100644 (file)
@@ -16,4 +16,5 @@ public enum NodeGroupID : byte
     /// <seealso cref="Content.Server.Power.Generation.Teg.TegSystem"/>
     /// <seealso cref="Content.Server.Power.Generation.Teg.TegNodeGroup"/>
     Teg,
+    ExCable,
 }
index 75ac8869ed078a20bce9823e878189b29084903c..5a79100d5f99e299a5ccd5fea48184751cff3e73 100644 (file)
@@ -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];
     }
 }
index d45fb96cac0539dde8cbb0c010be9c2529c02c01..554146b73184c9ed0f516f53400e9231c02afac6 100644 (file)
@@ -31,6 +31,7 @@ namespace Content.Shared.Power
         HighVoltage,
         MediumVoltage,
         Apc,
+        ExCable
     }
 
     [Serializable, NetSerializable]
index acc7cdba64f06f2c3380238a71cdb9a75eb4be0c..6ff0906b83131c10101471ac2f37b8b2d013004c 100644 (file)
@@ -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
index 818810d0cc16d4be8e1d25807dddc0abdda5670c..2f9decab7d44c56afbb094712ac05b53868bb41a 100644 (file)
     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
index c6943a63e3d81add9a55703effce9372810fcc5e..af5538fd345b8b22a3c337fa94e81f46214baf33 100644 (file)
@@ -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 (file)
index 0000000..4b91c44
--- /dev/null
@@ -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 (file)
index 0000000..d92cf1f
--- /dev/null
@@ -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
index 2a4f1c7f1cce88e6a80f88af64f0ea903a4d5197..4722b6e0b7f3bc6ea443399c4a4c55d6b92c8416 100644 (file)
@@ -1,6 +1,6 @@
 - type: entity
   abstract: true
-  id: CableBase
+  id: CablePhysBase
   placement:
     mode: SnapgridCenter
   components:
   - 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.
   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 (file)
index 0000000..aa26a1f
--- /dev/null
@@ -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 (file)
index 0000000..ddd5e29
--- /dev/null
@@ -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
index f3e8891b25856641da98ee9fa9f5e8cbe26ca599..0dc5fe3d90105534d544f1382497980b44d1f44a 100644 (file)
@@ -90,6 +90,8 @@
   - ScienceExplosives # sec gets everything for modular grenade making that sci does
   id: SecurityExplosives
   recipes:
+  - CableDetStack1
+  - EmptyDetonator
   - ExplosivePayload
   - GrenadeBlast
   - GrenadeEMP
index 62a61223426b21c32e9c784ad56f9ce71062bd55..b703aa124041744c497ba648efb3542c1af815c3 100644 (file)
     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
index bb12a2c25f18af793ebd41ef1dc4de410e72583e..846eef1452feaa1fa50de8b4da11980bcdd12206 100644 (file)
   - FlashPayload
   - ExplosivePayload
   - ChemicalPayload
+  - CableDetStack1
+  - EmptyDetonator
 
 - type: technology
   id: SpecialMeans
index 305c85943da785fcdc95910797906939ed7ddf50..40782d382cf16cf51687fa8a00cde3202c81a22d 100644 (file)
   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
+
index 14dfa9499e7bd61e8f5a9dadb8b18a080946a0ff..fde9057d6424a22be854494b26b6beedeb9d65f3 100644 (file)
 - type: Tag
   id: Enzyme
 
+- type: Tag
+  id: ExCable
+
 - type: Tag
   id: ExplosivePassable
 
index ea483851b7d7ddb77d578d53e83971e17c4d60db..64c3fc85c1ebfad1f829a7dbcf505a70c7c2988d 100644 (file)
@@ -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
         {
             "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 (file)
index 0000000..5be60b4
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 (file)
index 0000000..474a751
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 (file)
index 0000000..b9f4c45
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 (file)
index 0000000..1d04573
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 (file)
index 0000000..0ebbd08
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 (file)
index 0000000..00ba405
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 (file)
index 0000000..86ce3a5
Binary files /dev/null and b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-inhand-right.png differ
index d1fcdea7f4b02d9bf3a489d5112360c75447c0c4..95b59f691dec32a1edb843966fd1252b137c1535 100644 (file)
       "name": "coillv-inhand-right",
       "directions": 4
     },
+    {
+      "name": "coilex-inhand-left",
+      "directions": 4
+    },
+    {
+      "name": "coilex-inhand-right",
+      "directions": 4
+    },
     {
       "name": "coil-30"
     },
     {
       "name": "coilall-30"
     },
+    {
+      "name": "coilex-30"
+    },
+    {
+      "name": "coilex-20"
+    },
+    {
+      "name": "coilex-10"
+    },
     {
       "name": "coil-equipped-BELT",
       "directions": 4
     {
       "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 (file)
index 0000000..77e4b57
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 (file)
index 0000000..a6c4d89
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 (file)
index 0000000..f5e5d3b
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 (file)
index 0000000..4b39b7a
--- /dev/null
@@ -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 (file)
index 0000000..56a28ec
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 (file)
index 0000000..c74ea20
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 (file)
index 0000000..dadf77b
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 (file)
index 0000000..c2cbf12
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 (file)
index 0000000..c4335bd
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 (file)
index 0000000..83d0678
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 (file)
index 0000000..9590e82
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 (file)
index 0000000..b1a67c5
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 (file)
index 0000000..61ef8cd
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 (file)
index 0000000..01ce8b4
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 (file)
index 0000000..05a9a89
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 (file)
index 0000000..d204626
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 (file)
index 0000000..d1edbc5
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 (file)
index 0000000..bb9da73
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 (file)
index 0000000..0736f7b
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 (file)
index 0000000..c606f14
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 (file)
index 0000000..d4cfcb3
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 (file)
index 0000000..49abe32
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 (file)
index 0000000..58fb0e4
--- /dev/null
@@ -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"
+
+        }
+    ]
+}