diff --git a/code/__DEFINES/dcs/signals/signals_assembly.dm b/code/__DEFINES/dcs/signals/signals_assembly.dm new file mode 100644 index 00000000000..a1330c0965e --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_assembly.dm @@ -0,0 +1,2 @@ +//called when an igniter activates +#define COMSIG_IGNITER_ACTIVATE "igniter_activate" diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 44f2e71acb8..fc193a82c41 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -36,6 +36,9 @@ var/turf/location = get_turf(loc) if(location) location.hotspot_expose(heat, EXPOSED_VOLUME) + SEND_SIGNAL(holder.loc, COMSIG_IGNITER_ACTIVATE) + if(QDELETED(src)) + return TRUE sparks.start() return TRUE diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index c741f4c3a9f..374106cf878 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -117,6 +117,14 @@ icon_state = "fuel" reagent_id = /datum/reagent/fuel openable = TRUE + //an assembly attached to the tank + var/obj/item/assembly_holder/rig = null + //whether it accepts assemblies or not + var/accepts_rig = TRUE + //overlay of attached assemblies + var/mutable_appearance/assembliesoverlay + /// The last person to rig this fuel tank - Stored with the object. Only the last person matters for investigation + var/last_rigger = "" /obj/structure/reagent_dispensers/fueltank/Initialize(mapload) . = ..() @@ -124,10 +132,46 @@ if(SSevents.holidays?[APRIL_FOOLS]) icon_state = "fuel_fools" +/obj/structure/reagent_dispensers/fueltank/Destroy() + QDEL_NULL(rig) + return ..() + +/obj/structure/reagent_dispensers/fueltank/Exited(atom/movable/gone, direction) + . = ..() + if(gone == rig) + rig = null + +/obj/structure/reagent_dispensers/fueltank/examine(mob/user) + . = ..() + if(get_dist(user, src) <= 2 && rig) + . += span_notice("There is some kind of device rigged to the tank.") + +/obj/structure/reagent_dispensers/fueltank/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + if(!rig) + return + user.balloon_alert_to_viewers("detaching rig...") + if(!do_after(user, 2 SECONDS, target = src)) + return + user.balloon_alert_to_viewers("detached rig") + log_message("[key_name(user)] detached [rig] from [src]", LOG_GAME) + if(!user.put_in_hands(rig)) + rig.forceMove(get_turf(user)) + rig = null + last_rigger = null + cut_overlays(assembliesoverlay) + UnregisterSignal(src, COMSIG_IGNITER_ACTIVATE) + /obj/structure/reagent_dispensers/fueltank/boom() explosion(src, heavy_impact_range = 1, light_impact_range = 5, flame_range = 5) qdel(src) +/obj/structure/reagent_dispensers/fueltank/proc/rig_boom() + log_bomber(last_rigger, "rigged fuel tank exploded", src) + boom() + /obj/structure/reagent_dispensers/fueltank/blob_act(obj/structure/blob/B) boom() @@ -168,6 +212,27 @@ log_bomber(user, "detonated a", src, "via welding tool") boom() return + if(istype(I, /obj/item/assembly_holder) && accepts_rig) + if(rig) + user.balloon_alert("another device is in the way!") + return ..() + user.balloon_alert_to_viewers("attaching rig...") + if(!do_after(user, 2 SECONDS, target = src)) + return + user.balloon_alert_to_viewers("attached rig") + var/obj/item/assembly_holder/holder = I + if(locate(/obj/item/assembly/igniter) in holder.assemblies) + rig = holder + if(!user.transferItemToLoc(holder, src)) + return + log_bomber(user, "rigged [name] with [holder.name] for explosion", src) + last_rigger = user + assembliesoverlay = holder + assembliesoverlay.pixel_x += 6 + assembliesoverlay.pixel_y += 1 + add_overlay(assembliesoverlay) + RegisterSignal(src, COMSIG_IGNITER_ACTIVATE, .proc/rig_boom) + return return ..() /obj/structure/reagent_dispensers/fueltank/large diff --git a/tgstation.dme b/tgstation.dme index 5db2ec100cc..fd38dbad702 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -204,6 +204,7 @@ #include "code\__DEFINES\dcs\signals\signals_admin.dm" #include "code\__DEFINES\dcs\signals\signals_adventure.dm" #include "code\__DEFINES\dcs\signals\signals_area.dm" +#include "code\__DEFINES\dcs\signals\signals_assembly.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" #include "code\__DEFINES\dcs\signals\signals_changeling.dm" #include "code\__DEFINES\dcs\signals\signals_circuit.dm"