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 226c17371bd..f954776bd4f 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 fa30bd7ab54..f56dd8c2826 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" @@ -462,6 +463,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"