diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 2a74785cc98..f447a13be77 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -1097,3 +1097,6 @@
#define COMSIG_AQUARIUM_BEFORE_INSERT_CHECK "aquarium_about_to_be_inserted"
#define COMSIG_AQUARIUM_SURFACE_CHANGED "aquarium_surface_changed"
#define COMSIG_AQUARIUM_FLUID_CHANGED "aquarium_fluid_changed"
+
+///from /obj/item/assembly/proc/pulsed()
+#define COMSIG_ASSEMBLY_PULSED "assembly_pulsed"
diff --git a/code/__DEFINES/electrified_buckle.dm b/code/__DEFINES/electrified_buckle.dm
new file mode 100644
index 00000000000..59fab13ccba
--- /dev/null
+++ b/code/__DEFINES/electrified_buckle.dm
@@ -0,0 +1,14 @@
+///electrified_buckle requires a shock kit attached to it in order to shock
+#define SHOCK_REQUIREMENT_ITEM (1<<0)
+///electrified_buckle requires a live cable to work, and draws power from it
+#define SHOCK_REQUIREMENT_LIVE_CABLE (1<<1)
+///electrified_buckle requires to be turned on with a signal in order to shock the buckled mob
+#define SHOCK_REQUIREMENT_ON_SIGNAL_RECEIVED (1<<2)
+///electrified_buckle requires the parent to be alive in order to shock (if parent is a mob)
+#define SHOCK_REQUIREMENT_PARENT_MOB_ISALIVE (1<<3)
+///a signal can toggle the ability to shock on a timer
+#define SHOCK_REQUIREMENT_SIGNAL_RECEIVED_TOGGLE (1<<4)
+
+
+///This trait signifies that the object can be used to electrify things buckled to it
+#define TRAIT_ELECTRIFIED_BUCKLE "electrified buckle"
diff --git a/code/datums/components/electrified_buckle.dm b/code/datums/components/electrified_buckle.dm
new file mode 100644
index 00000000000..8a3ed0f9fd8
--- /dev/null
+++ b/code/datums/components/electrified_buckle.dm
@@ -0,0 +1,203 @@
+///divide the power in the cable net under parent by this to determine the shock damage
+#define ELECTRIC_BUCKLE_SHOCK_STRENGTH_DIVISOR 5000
+///it will not shock the mob buckled to parent if its required to use a cable to shock and the cable has less than this power availaible
+#define ELECTRIC_BUCKLE_MINUMUM_POWERNET_STRENGTH 10
+
+
+/**
+ * # electrified_buckle component:
+ * attach it to any atom/movable that can be buckled to in order to have it shock mobs buckled to it. by default it shocks mobs buckled to parent every shock_loop_time.
+ * the parent is supposed to define its behavior with arguments in AddComponent
+*/
+/datum/component/electrified_buckle
+ ///if usage_flags has SHOCK_REQUIREMENT_ITEM, this is the item required to be inside parent in order for it to shock buckled mobs
+ var/obj/item/required_object
+ ///this is casted to the overlay we put on parent_chair
+ var/list/requested_overlays
+ ///it will only shock once every shock_loop_time
+ COOLDOWN_DECLARE(electric_buckle_cooldown)
+ ///these flags tells this instance what is required in order to allow shocking
+ var/usage_flags
+ ///if true, this will shock the buckled mob every shock_loop_time in process()
+ var/shock_on_loop = TRUE
+ ///how long the component waits before shocking the mob buckled to parent again
+ var/shock_loop_time = 5 SECONDS
+ ///how much damage is done per shock iff usage_flags doesnt have SHOCK_REQUIREMENT_LIVE_CABLE
+ var/shock_damage = 50
+ ///this signal was given as an argument to register for parent to emit, if its emitted to parent then shock_on_demand is called. var is so it can be unregistered
+ var/requested_signal_parent_emits = null
+
+/**
+ * Initialize args:
+ *
+ * * input_requirements - bitflag that defines how the component is supposed to act, see __DEFINES/electrified_buckle.dm for the options. sets usage_flags
+ * * input_item - if set to an item and input_requirements has SHOCK_REQUIREMENT_ITEM, moves that item inside parent and the component will delete itself if input_item no longer exists/moves out of parent. sets required_object
+ * * overlays_to_add - pass in a list of images and the component will add them to parent as well as remove them in UnregisterFromParent(). sets requested_overlays
+ * * override_buckle - if TRUE, sets parent.can_buckle = TRUE and resets it on UnregisterFromParent(), usually objects that have need to be overridden will look janky on buckle
+ * * damage_on_shock - if SHOCK_REQUIREMENT_LIVE_CABLE is not set in input_requirements, then this is how much damage each shock does. sets shock_damage
+ * * signal_to_register_from_parent - if set, the component registers to listen for this signal targeting parent to manually shock. sets requested_signal_parent_emits
+*/
+/datum/component/electrified_buckle/Initialize(input_requirements, obj/item/input_item, list/overlays_to_add, override_buckle, damage_on_shock = 50, signal_to_register_from_parent, loop_length)
+ var/atom/movable/parent_as_movable = parent
+ if(!istype(parent_as_movable))
+ return COMPONENT_INCOMPATIBLE
+
+ usage_flags = input_requirements
+
+ if(!parent_as_movable.can_buckle && !override_buckle)
+ return COMPONENT_INCOMPATIBLE
+ else if (override_buckle)
+ parent_as_movable.can_buckle = TRUE
+
+ if((usage_flags & SHOCK_REQUIREMENT_ITEM) && QDELETED(input_item))
+ return COMPONENT_INCOMPATIBLE
+
+ if(HAS_TRAIT(parent_as_movable, TRAIT_ELECTRIFIED_BUCKLE))
+ return COMPONENT_INCOMPATIBLE
+
+ if(usage_flags & SHOCK_REQUIREMENT_ITEM)
+ required_object = input_item
+ required_object.Move(parent_as_movable)
+ RegisterSignal(required_object, COMSIG_PARENT_PREQDELETED, .proc/delete_self)
+ RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), .proc/move_required_object_from_contents)
+
+ if(usage_flags & SHOCK_REQUIREMENT_ON_SIGNAL_RECEIVED)
+ shock_on_loop = FALSE
+ RegisterSignal(required_object, COMSIG_ASSEMBLY_PULSED, .proc/shock_on_demand)
+ else if(usage_flags & SHOCK_REQUIREMENT_SIGNAL_RECEIVED_TOGGLE)
+ RegisterSignal(required_object, COMSIG_ASSEMBLY_PULSED, .proc/toggle_shock_loop)
+
+ if((usage_flags & SHOCK_REQUIREMENT_PARENT_MOB_ISALIVE) && ismob(parent))
+ RegisterSignal(parent, COMSIG_LIVING_DEATH, .proc/delete_self)
+
+ RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/on_buckle)
+
+ ADD_TRAIT(parent_as_movable, TRAIT_ELECTRIFIED_BUCKLE, INNATE_TRAIT)
+
+ //if parent wants us to manually shock on some specified action
+ if(signal_to_register_from_parent)
+ RegisterSignal(parent, signal_to_register_from_parent, .proc/shock_on_demand)
+ requested_signal_parent_emits = signal_to_register_from_parent
+
+ if(overlays_to_add)
+ requested_overlays = overlays_to_add
+ parent_as_movable.add_overlay(requested_overlays)
+
+ parent_as_movable.name = "electrified [initial(parent_as_movable.name)]"
+
+ shock_damage = damage_on_shock
+
+ if(loop_length)
+ shock_loop_time = loop_length
+
+ if(parent_as_movable.has_buckled_mobs())
+ for(var/mob/living/possible_guinea_pig as anything in parent_as_movable.buckled_mobs)
+ if(on_buckle(src, possible_guinea_pig))
+ break
+
+/datum/component/electrified_buckle/UnregisterFromParent()
+ var/atom/movable/parent_as_movable = parent
+
+ parent_as_movable.cut_overlay(requested_overlays)
+ parent_as_movable.name = initial(parent_as_movable.name)
+ parent_as_movable.can_buckle = initial(parent_as_movable.can_buckle)
+
+ if(parent)
+ REMOVE_TRAIT(parent_as_movable, TRAIT_ELECTRIFIED_BUCKLE, INNATE_TRAIT)
+ UnregisterSignal(parent, list(COMSIG_MOVABLE_BUCKLE, COMSIG_MOVABLE_UNBUCKLE, COMSIG_ATOM_EXIT, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER)))
+ if(requested_signal_parent_emits)
+ UnregisterSignal(parent, requested_signal_parent_emits)
+
+ if(required_object)
+ UnregisterSignal(required_object, list(COMSIG_PARENT_PREQDELETED, COMSIG_ASSEMBLY_PULSED))
+ if(parent_as_movable && (required_object in parent_as_movable.contents))
+ required_object.Move(parent_as_movable.loc)
+
+ required_object = null
+ STOP_PROCESSING(SSprocessing, src)
+
+/datum/component/electrified_buckle/proc/delete_self()
+ SIGNAL_HANDLER
+ qdel(src)
+
+/datum/component/electrified_buckle/proc/move_required_object_from_contents(datum/source, mob/living/user, obj/item/tool, tool_type)
+ SIGNAL_HANDLER
+ var/atom/movable/parent_as_movable = parent
+ if(!QDELETED(parent_as_movable))
+ tool.play_tool_sound(parent_as_movable)
+ required_object.Move(parent_as_movable.loc)
+ qdel(src)
+
+/datum/component/electrified_buckle/proc/on_buckle(datum/source, mob/living/mob_to_buckle, _force)
+ SIGNAL_HANDLER
+ if(!istype(mob_to_buckle))
+ return FALSE
+
+ COOLDOWN_START(src, electric_buckle_cooldown, shock_loop_time)
+ if(!(usage_flags & SHOCK_REQUIREMENT_ON_SIGNAL_RECEIVED) && shock_on_loop)
+ START_PROCESSING(SSprocessing, src)
+ return TRUE
+
+///where the guinea pig is actually shocked if possible
+/datum/component/electrified_buckle/process(delta_time)
+ var/atom/movable/parent_as_movable = parent
+ if(QDELETED(parent_as_movable) || !parent_as_movable.has_buckled_mobs())
+ return PROCESS_KILL
+
+ if(!shock_on_loop)
+ return PROCESS_KILL
+
+ if(!COOLDOWN_FINISHED(src, electric_buckle_cooldown))
+ return
+
+ COOLDOWN_START(src, electric_buckle_cooldown, shock_loop_time)
+
+ var/turf/our_turf = get_turf(parent_as_movable)
+ var/obj/structure/cable/live_cable = our_turf.get_cable_node()
+
+ if(usage_flags & SHOCK_REQUIREMENT_LIVE_CABLE)
+ if((!live_cable || !live_cable.powernet || live_cable.powernet.avail < ELECTRIC_BUCKLE_MINUMUM_POWERNET_STRENGTH))
+ return
+
+ for(var/mob/living/guinea_pig as anything in parent_as_movable.buckled_mobs)
+ guinea_pig.electrocute_act(round(live_cable.powernet.avail / ELECTRIC_BUCKLE_SHOCK_STRENGTH_DIVISOR), parent_as_movable)
+ break
+ else
+ for(var/mob/living/guinea_pig as anything in parent_as_movable.buckled_mobs)
+ guinea_pig.electrocute_act(shock_damage, parent_as_movable)
+ break
+
+ parent_as_movable.visible_message("The electric chair went off!", "You hear a deep sharp shock!")
+
+///a shock that is toggled manually
+/datum/component/electrified_buckle/proc/shock_on_demand()
+ SIGNAL_HANDLER
+ if((usage_flags & SHOCK_REQUIREMENT_ITEM) && QDELETED(required_object))
+ return
+
+ var/atom/movable/parent_as_movable = parent
+ if(usage_flags & SHOCK_REQUIREMENT_LIVE_CABLE)
+ var/turf/our_turf = get_turf(parent_as_movable)
+ var/obj/structure/cable/live_cable = our_turf.get_cable_node()
+ if(!live_cable || !live_cable.powernet || live_cable.powernet.avail < ELECTRIC_BUCKLE_MINUMUM_POWERNET_STRENGTH)
+ return
+
+ for(var/mob/living/guinea_pig as anything in parent_as_movable.buckled_mobs)
+ var/shock_damage = round(live_cable.powernet.avail / ELECTRIC_BUCKLE_SHOCK_STRENGTH_DIVISOR)
+ guinea_pig.electrocute_act(shock_damage, parent_as_movable)
+ break
+
+/datum/component/electrified_buckle/proc/toggle_shock_loop()
+ SIGNAL_HANDLER
+ var/atom/movable/parent_as_movable = parent
+ if(shock_on_loop)
+ shock_on_loop = FALSE
+ STOP_PROCESSING(SSprocessing, src)
+ parent_as_movable.visible_message("The electric chair emits a snap as its circuit opens, making it safe for now.")
+ else
+ shock_on_loop = TRUE
+ START_PROCESSING(SSprocessing, src)
+ parent_as_movable.visible_message("You hear the sound of an electric circuit closing coming from the electric chair!")
+
+#undef ELECTRIC_BUCKLE_SHOCK_STRENGTH_DIVISOR
+#undef ELECTRIC_BUCKLE_MINUMUM_POWERNET_STRENGTH
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index 78fc87585d9..f83cb762557 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -46,11 +46,11 @@
to_chat(user, "[W] is stuck to your hand, you cannot attach it to [src]!")
return
W.master = A
- A.part1 = W
+ A.helmet_part = W
user.transferItemToLoc(src, A, TRUE)
master = A
- A.part2 = src
+ A.electropack_part = src
user.put_in_hands(A)
A.add_fingerprint(user)
@@ -60,7 +60,6 @@
/obj/item/electropack/receive_signal(datum/signal/signal)
if(!signal || signal.data["code"] != code)
return
-
if(isliving(loc) && on)
if(shock_cooldown)
return
@@ -77,6 +76,9 @@
L.Paralyze(100)
if(master)
+ if(isassembly(master))
+ var/obj/item/assembly/master_as_assembly = master
+ master_as_assembly.pulsed()
master.receive_signal()
/obj/item/electropack/proc/set_frequency(new_frequency)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 2868b5028ea..7fa485b097b 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -75,23 +75,35 @@
qdel(src)
/obj/structure/chair/attackby(obj/item/W, mob/user, params)
- if(W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1))
- W.play_tool_sound(src)
- deconstruct()
- else if(istype(W, /obj/item/assembly/shock_kit))
- if(!user.temporarilyRemoveItemFromInventory(W))
- return
- var/obj/item/assembly/shock_kit/SK = W
- var/obj/structure/chair/e_chair/E = new /obj/structure/chair/e_chair(src.loc)
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE)
- E.setDir(dir)
- E.part = SK
- SK.forceMove(E)
- SK.master = E
- qdel(src)
- else
- return ..()
+ if(flags_1 & NODECONSTRUCT_1)
+ return . = ..()
+ if(istype(W, /obj/item/assembly/shock_kit) && !HAS_TRAIT(src, TRAIT_ELECTRIFIED_BUCKLE))
+ electrify_self(W, user)
+ return
+ . = ..()
+///allows each chair to request the electrified_buckle component with overlays that dont look ridiculous
+/obj/structure/chair/proc/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs)
+ SHOULD_CALL_PARENT(TRUE)
+ if(!user.temporarilyRemoveItemFromInventory(input_shock_kit))
+ return
+ if(!overlays_from_child_procs || overlays_from_child_procs.len == 0)
+ var/image/echair_over_overlay = image('icons/obj/chairs.dmi', loc, "echair_over")
+ AddComponent(/datum/component/electrified_buckle, (SHOCK_REQUIREMENT_ITEM | SHOCK_REQUIREMENT_LIVE_CABLE | SHOCK_REQUIREMENT_SIGNAL_RECEIVED_TOGGLE), input_shock_kit, list(echair_over_overlay), FALSE)
+ else
+ AddComponent(/datum/component/electrified_buckle, (SHOCK_REQUIREMENT_ITEM | SHOCK_REQUIREMENT_LIVE_CABLE | SHOCK_REQUIREMENT_SIGNAL_RECEIVED_TOGGLE), input_shock_kit, overlays_from_child_procs, FALSE)
+
+ if(HAS_TRAIT(src, TRAIT_ELECTRIFIED_BUCKLE))
+ to_chat(user, "You connect the shock kit to the [name], electrifying it ")
+ else
+ user.put_in_active_hand(input_shock_kit)
+ to_chat(user, " You cannot fit the shock kit onto the [name]!")
+
+
+/obj/structure/chair/wrench_act(mob/living/user, obj/item/I)
+ . = ..()
+ I.play_tool_sound(src)
+ deconstruct()
/obj/structure/chair/attack_tk(mob/user)
if(!anchored || has_buckled_mobs() || !isturf(user.loc))
@@ -212,6 +224,11 @@
/obj/structure/chair/comfy/shuttle/GetArmrest()
return mutable_appearance('icons/obj/chairs.dmi', "shuttle_chair_armrest")
+/obj/structure/chair/comfy/shuttle/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs)
+ if(!overlays_from_child_procs)
+ overlays_from_child_procs = list(image('icons/obj/chairs.dmi', loc, "echair_over", pixel_x = -1))
+ . = ..()
+
/obj/structure/chair/office
anchored = FALSE
buildstackamount = 5
@@ -224,6 +241,11 @@
if(has_gravity())
playsound(src, 'sound/effects/roll.ogg', 100, TRUE)
+/obj/structure/chair/office/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs)
+ if(!overlays_from_child_procs)
+ overlays_from_child_procs = list(image('icons/obj/chairs.dmi', loc, "echair_over", pixel_x = -1))
+ . = ..()
+
/obj/structure/chair/office/light
icon_state = "officechair_white"
diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm
index 4a0b1e2b32e..51b6168c526 100644
--- a/code/game/objects/structures/beds_chairs/sofa.dm
+++ b/code/game/objects/structures/beds_chairs/sofa.dm
@@ -10,6 +10,11 @@
armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER)
return ..()
+/obj/structure/chair/sofa/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs)
+ if(!overlays_from_child_procs)
+ overlays_from_child_procs = list(image('icons/obj/chairs.dmi', loc, "echair_over", pixel_x = -1))
+ . = ..()
+
/obj/structure/chair/sofa/post_buckle_mob(mob/living/M)
. = ..()
update_armrest()
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index a5235f461a4..13b838b28f6 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -1,52 +1,22 @@
+
/obj/structure/chair/e_chair
name = "electric chair"
desc = "Looks absolutely SHOCKING!"
icon_state = "echair0"
- var/obj/item/assembly/shock_kit/part = null
var/last_time = 1
item_chair = null
/obj/structure/chair/e_chair/Initialize()
. = ..()
- add_overlay(mutable_appearance('icons/obj/chairs.dmi', "echair_over", MOB_LAYER + 1))
+ var/obj/item/assembly/shock_kit/stored_kit = new(contents)
+ var/image/export_to_component = image('icons/obj/chairs.dmi', loc, "echair_over")
+ AddComponent(/datum/component/electrified_buckle, (SHOCK_REQUIREMENT_ITEM | SHOCK_REQUIREMENT_LIVE_CABLE | SHOCK_REQUIREMENT_SIGNAL_RECEIVED_TOGGLE), stored_kit, list(export_to_component))
/obj/structure/chair/e_chair/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour == TOOL_WRENCH)
var/obj/structure/chair/C = new /obj/structure/chair(loc)
W.play_tool_sound(src)
C.setDir(dir)
- part.forceMove(loc)
- part.master = null
- part = null
qdel(src)
-
-/obj/structure/chair/e_chair/proc/shock()
- if(last_time + 50 > world.time)
return
- last_time = world.time
-
- // special power handling
- var/area/A = get_area(src)
- if(!isarea(A))
- return
- if(!A.powered(AREA_USAGE_EQUIP))
- return
- A.use_power(AREA_USAGE_EQUIP, 5000)
-
- flick("echair_shock", src)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(12, 1, src)
- s.start()
- if(has_buckled_mobs())
- for(var/m in buckled_mobs)
- var/mob/living/buckled_mob = m
- buckled_mob.electrocute_act(85, src, 1)
- to_chat(buckled_mob, "You feel a deep shock course through your body!")
- addtimer(CALLBACK(buckled_mob, /mob/living.proc/electrocute_act, 85, src, 1), 1)
- visible_message("The electric chair went off!", "You hear a deep sharp shock!")
-
-/obj/structure/chair/e_chair/post_buckle_mob(mob/living/L)
- SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "dying", /datum/mood_event/deaths_door)
-
-/obj/structure/chair/e_chair/post_unbuckle_mob(mob/living/L)
- SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "dying")
+ . = ..()
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 02e01450a8a..9c9a608ca2c 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -127,8 +127,7 @@
var/obj/item/reagent_containers/RG = I
RG.reagents.add_reagent(/datum/reagent/water, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
to_chat(user, "You fill [RG] from [src]. Gross.")
- else
- return ..()
+ . = ..()
/obj/structure/toilet/secret
var/obj/item/secret
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 559868960c6..06ffd620cd2 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -58,15 +58,16 @@
return FALSE
return TRUE
-//Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
+///Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs
/obj/item/assembly/proc/pulsed(radio = FALSE)
if(wire_type & WIRE_RECEIVE)
INVOKE_ASYNC(src, .proc/activate)
if(radio && (wire_type & WIRE_RADIO_RECEIVE))
INVOKE_ASYNC(src, .proc/activate)
+ SEND_SIGNAL(src, COMSIG_ASSEMBLY_PULSED)
return TRUE
-//Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
+///Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct
/obj/item/assembly/proc/pulse(radio = FALSE)
if(connected && wire_type)
connected.pulse_assembly(src)
@@ -77,7 +78,7 @@
holder.process_activation(src, 0, 1)
return TRUE
-// What the device does when turned on
+/// What the device does when turned on
/obj/item/assembly/proc/activate()
if(QDELETED(src) || !secured || (next_activate > world.time))
return FALSE
diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm
index dbca939b86e..d105b79e57b 100644
--- a/code/modules/assembly/shock_kit.dm
+++ b/code/modules/assembly/shock_kit.dm
@@ -3,38 +3,41 @@
desc = "This appears to be made from both an electropack and a helmet."
icon = 'icons/obj/assemblies.dmi'
icon_state = "shock_kit"
- var/obj/item/clothing/head/helmet/part1 = null
- var/obj/item/electropack/part2 = null
+ var/obj/item/clothing/head/helmet/helmet_part = null
+ var/obj/item/electropack/electropack_part = null
w_class = WEIGHT_CLASS_HUGE
flags_1 = CONDUCT_1
/obj/item/assembly/shock_kit/Destroy()
- qdel(part1)
- qdel(part2)
+ QDEL_NULL(helmet_part)
+ QDEL_NULL(electropack_part)
return ..()
+/obj/item/assembly/shock_kit/Initialize()
+ . = ..()
+ if(!helmet_part)
+ helmet_part = new(src)
+ helmet_part.master = src
+ if(!electropack_part)
+ electropack_part = new(src)
+ electropack_part.master = src
+
/obj/item/assembly/shock_kit/wrench_act(mob/living/user, obj/item/I)
..()
to_chat(user, "You disassemble [src].")
- if(part1)
- part1.forceMove(drop_location())
- part1.master = null
- part1 = null
- if(part2)
- part2.forceMove(drop_location())
- part2.master = null
- part2 = null
+ if(helmet_part)
+ helmet_part.forceMove(drop_location())
+ helmet_part.master = null
+ helmet_part = null
+ if(electropack_part)
+ electropack_part.forceMove(drop_location())
+ electropack_part.master = null
+ electropack_part = null
qdel(src)
return TRUE
/obj/item/assembly/shock_kit/attack_self(mob/user)
- part1.attack_self(user)
- part2.attack_self(user)
+ helmet_part.attack_self(user)
+ electropack_part.attack_self(user)
add_fingerprint(user)
return
-
-/obj/item/assembly/shock_kit/receive_signal()
- if(istype(loc, /obj/structure/chair/e_chair))
- var/obj/structure/chair/e_chair/C = loc
- C.shock()
- return
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index 2b19a92cc4d..2565c3262c8 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 6a7cdec1564..241e09aaf50 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -53,6 +53,7 @@
#include "code\__DEFINES\dye_keys.dm"
#include "code\__DEFINES\dynamic.dm"
#include "code\__DEFINES\economy.dm"
+#include "code\__DEFINES\electrified_buckle.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\exosuit_fab.dm"
#include "code\__DEFINES\experisci.dm"
@@ -487,6 +488,7 @@
#include "code\datums\components\dejavu.dm"
#include "code\datums\components\earprotection.dm"
#include "code\datums\components\edit_complainer.dm"
+#include "code\datums\components\electrified_buckle.dm"
#include "code\datums\components\embedded.dm"
#include "code\datums\components\explodable.dm"
#include "code\datums\components\footstep.dm"