/obj/item/assembly/signaler name = "remote signaling device" desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another." icon_state = "signaller" inhand_icon_state = "signaler" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' custom_materials = list(/datum/material/iron=400, /datum/material/glass=120) wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE attachable = TRUE drop_sound = 'sound/items/handling/component_drop.ogg' pickup_sound = 'sound/items/handling/component_pickup.ogg' var/ui_x = 280 var/ui_y = 132 var/code = DEFAULT_SIGNALER_CODE var/frequency = FREQ_SIGNALER var/datum/radio_frequency/radio_connection ///Holds the mind that commited suicide. var/datum/mind/suicider ///Holds a reference string to the mob, decides how much of a gamer you are. var/suicide_mob var/hearing_range = 1 /obj/item/assembly/signaler/suicide_act(mob/living/carbon/user) user.visible_message("[user] eats \the [src]! If it is signaled, [user.p_they()] will die!") playsound(src, 'sound/items/eatfood.ogg', 50, TRUE) moveToNullspace() suicider = user.mind suicide_mob = REF(user) return MANUAL_SUICIDE_NONLETHAL /obj/item/assembly/signaler/proc/manual_suicide(datum/mind/suicidee) var/mob/living/user = suicidee.current if(!istype(user)) return if(suicide_mob == REF(user)) user.visible_message("[user]'s [src] receives a signal, killing [user.p_them()] instantly!") else user.visible_message("[user]'s [src] receives a signal and [user.p_they()] die[user.p_s()] like a gamer!") user.adjustOxyLoss(200)//it sends an electrical pulse to their heart, killing them. or something. user.death(0) user.set_suicide(TRUE) user.suicide_log() playsound(user, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) qdel(src) /obj/item/assembly/signaler/Initialize() . = ..() set_frequency(frequency) /obj/item/assembly/signaler/Destroy() SSradio.remove_object(src,frequency) suicider = null . = ..() /obj/item/assembly/signaler/activate() if(!..())//cooldown processing return FALSE signal() return TRUE /obj/item/assembly/signaler/update_icon() if(holder) holder.update_icon() return /obj/item/assembly/signaler/ui_status(mob/user) if(is_secured(user)) return ..() return UI_CLOSE /obj/item/assembly/signaler/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "Signaler", name, ui_x, ui_y, master_ui, state) ui.open() /obj/item/assembly/signaler/ui_data(mob/user) var/list/data = list() data["frequency"] = frequency data["code"] = code data["minFrequency"] = MIN_FREE_FREQ data["maxFrequency"] = MAX_FREE_FREQ return data /obj/item/assembly/signaler/ui_act(action, params) if(..()) return switch(action) if("signal") INVOKE_ASYNC(src, .proc/signal) . = TRUE if("freq") frequency = unformat_frequency(params["freq"]) frequency = sanitize_frequency(frequency, TRUE) set_frequency(frequency) . = TRUE if("code") code = text2num(params["code"]) code = round(code) . = TRUE if("reset") if(params["reset"] == "freq") frequency = initial(frequency) else code = initial(code) . = TRUE update_icon() /obj/item/assembly/signaler/attackby(obj/item/W, mob/user, params) if(issignaler(W)) var/obj/item/assembly/signaler/signaler2 = W if(secured && signaler2.secured) code = signaler2.code set_frequency(signaler2.frequency) to_chat(user, "You transfer the frequency and code of \the [signaler2.name] to \the [name]") ..() /obj/item/assembly/signaler/proc/signal() if(!radio_connection) return var/datum/signal/signal = new(list("code" = code)) radio_connection.post_signal(src, signal) var/time = time2text(world.realtime,"hh:mm:ss") var/turf/T = get_turf(src) if(usr) GLOB.lastsignalers.Add("[time] : [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) : [format_frequency(frequency)]/[code]") /obj/item/assembly/signaler/receive_signal(datum/signal/signal) . = FALSE if(!signal) return if(signal.data["code"] != code) return if(!(src.wires & WIRE_RADIO_RECEIVE)) return if(suicider) manual_suicide(suicider) return pulse(TRUE) audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*", null, hearing_range) for(var/CHM in get_hearers_in_view(hearing_range, src)) if(ismob(CHM)) var/mob/LM = CHM LM.playsound_local(get_turf(src), 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) return TRUE /obj/item/assembly/signaler/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_SIGNALER) return // Embedded signaller used in grenade construction. // It's necessary because the signaler doens't have an off state. // Generated during grenade construction. -Sayu /obj/item/assembly/signaler/receiver var/on = FALSE /obj/item/assembly/signaler/receiver/proc/toggle_safety() on = !on /obj/item/assembly/signaler/receiver/activate() toggle_safety() return TRUE /obj/item/assembly/signaler/receiver/examine(mob/user) . = ..() . += "The radio receiver is [on?"on":"off"]." /obj/item/assembly/signaler/receiver/receive_signal(datum/signal/signal) if(!on) return return ..(signal) // Embedded signaller used in anomalies. /obj/item/assembly/signaler/anomaly name = "anomaly core" desc = "The neutralized core of an anomaly. It'd probably be valuable for research." icon_state = "anomaly core" inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' resistance_flags = FIRE_PROOF var/anomaly_type = /obj/effect/anomaly /obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal) if(!signal) return FALSE if(signal.data["code"] != code) return FALSE if(suicider) manual_suicide(suicider) for(var/obj/effect/anomaly/A in get_turf(src)) A.anomalyNeutralize() return TRUE /obj/item/assembly/signaler/anomaly/manual_suicide(mob/living/carbon/user) user.visible_message("[user]'s [src] is reacting to the radio signal, warping [user.p_their()] body!") user.set_suicide(TRUE) user.suicide_log() user.gib() /obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_ANALYZER) to_chat(user, "Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code].") ..() //Anomaly cores /obj/item/assembly/signaler/anomaly/pyro name = "\improper pyroclastic anomaly core" desc = "The neutralized core of a pyroclastic anomaly. It feels warm to the touch. It'd probably be valuable for research." icon_state = "pyro core" anomaly_type = /obj/effect/anomaly/pyro /obj/item/assembly/signaler/anomaly/grav name = "\improper gravitational anomaly core" desc = "The neutralized core of a gravitational anomaly. It feels much heavier than it looks. It'd probably be valuable for research." icon_state = "grav core" anomaly_type = /obj/effect/anomaly/grav /obj/item/assembly/signaler/anomaly/flux name = "\improper flux anomaly core" desc = "The neutralized core of a flux anomaly. Touching it makes your skin tingle. It'd probably be valuable for research." icon_state = "flux core" anomaly_type = /obj/effect/anomaly/flux /obj/item/assembly/signaler/anomaly/bluespace name = "\improper bluespace anomaly core" desc = "The neutralized core of a bluespace anomaly. It keeps phasing in and out of view. It'd probably be valuable for research." icon_state = "anomaly core" anomaly_type = /obj/effect/anomaly/bluespace /obj/item/assembly/signaler/anomaly/vortex name = "\improper vortex anomaly core" desc = "The neutralized core of a vortex anomaly. It won't sit still, as if some invisible force is acting on it. It'd probably be valuable for research." icon_state = "vortex core" anomaly_type = /obj/effect/anomaly/bhole /obj/item/assembly/signaler/anomaly/attack_self() return /obj/item/assembly/signaler/cyborg /obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, params) return /obj/item/assembly/signaler/cyborg/screwdriver_act(mob/living/user, obj/item/I) return