Refactors signallers, assemblies, electropacks (#18689)

* Refactors signalers, assemblies, electropacks

* Update code/game/objects/items/devices/radio/electropack.dm

Co-authored-by: Sirryan2002 <80364400+Sirryan2002@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Charlie <69320440+hal9000PR@users.noreply.github.com>

Co-authored-by: Sirryan2002 <80364400+Sirryan2002@users.noreply.github.com>
Co-authored-by: Charlie <69320440+hal9000PR@users.noreply.github.com>
This commit is contained in:
AffectedArc07
2022-08-15 16:36:34 +01:00
committed by GitHub
co-authored by Sirryan2002 Charlie
parent 98a143afb6
commit aba452f785
27 changed files with 413 additions and 422 deletions
-3
View File
@@ -48,9 +48,6 @@
/obj/item/assembly/proc/holder_movement() //Called when the holder is moved
return
/obj/item/assembly/proc/describe() // Called by grenades to describe the state of the trigger (time left, etc)
return "The trigger assembly looks broken!"
/obj/item/assembly/interact(mob/user) //Called when attack_self is called
return
+14 -9
View File
@@ -4,10 +4,11 @@
icon_state = "igniter"
materials = list(MAT_METAL=500, MAT_GLASS=50)
origin_tech = "magnets=1"
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
var/datum/effect_system/spark_spread/sparks
/obj/item/assembly/igniter/New()
..()
/obj/item/assembly/igniter/Initialize(mapload)
. = ..()
sparks = new /datum/effect_system/spark_spread
sparks.set_up(2, 0, src)
sparks.attach(src)
@@ -15,32 +16,36 @@
QDEL_NULL(sparks)
return ..()
/obj/item/assembly/igniter/describe()
return "The igniter is [secured ? "secured." : "unsecured."]"
/obj/item/assembly/igniter/examine(mob/user)
. = ..()
. += "The igniter is [secured ? "secured." : "unsecured."]"
/obj/item/assembly/igniter/activate()
if(!..())
return FALSE//Cooldown check
return FALSE //Cooldown check
var/turf/location = get_turf(loc)
if(location)
location.hotspot_expose(1000,1000)
location.hotspot_expose(1000, 1000)
sparks.start()
if(istype(loc, /obj/item/assembly_holder))
var/locloc = loc.loc
if(istype(locloc, /obj/structure/reagent_dispensers/fueltank))
var/obj/structure/reagent_dispensers/fueltank/tank = locloc
if(tank)
tank.boom(TRUE) // this qdel's `src`
else if(istype(locloc, /obj/item/reagent_containers/glass/beaker))
var/obj/item/reagent_containers/glass/beaker/beakerbomb = locloc
if(beakerbomb)
beakerbomb.heat_beaker()
return TRUE
/obj/item/assembly/igniter/attack_self(mob/user)
activate()
add_fingerprint(user)
return
+1 -4
View File
@@ -25,12 +25,9 @@
fire_location = null
return ..()
/obj/item/assembly/infra/describe()
return "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]."
/obj/item/assembly/infra/examine(mob/user)
. = ..()
. += describe()
. += "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]."
/obj/item/assembly/infra/activate()
if(!..())
+36 -26
View File
@@ -14,32 +14,32 @@
. += "It looks like it's armed."
/obj/item/assembly/mousetrap/activate()
if(..())
armed = !armed
if(!armed)
if(ishuman(usr))
var/mob/living/carbon/human/user = usr
if((user.getBrainLoss() >= 60 || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, "Your hand slips, setting off the trigger.")
pulse(0)
update_icon()
if(usr)
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
if(!..())
return
armed = !armed
if(!armed)
if(ishuman(usr))
var/mob/living/carbon/human/user = usr
if((user.getBrainLoss() >= 60 || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, "Your hand slips, setting off the trigger.")
pulse(0)
update_icon()
if(usr)
playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
/obj/item/assembly/mousetrap/describe()
return "The pressure switch is [armed ? "primed" : "safe"]."
/obj/item/assembly/mousetrap/update_icon_state()
if(armed)
icon_state = "mousetraparmed"
else
icon_state = "mousetrap"
icon_state = "mousetrap[armed ? "armed": ""]"
if(holder)
holder.update_icon()
/obj/item/assembly/mousetrap/proc/triggered(mob/target, type = "feet")
if(!armed)
return
var/obj/item/organ/external/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
@@ -49,22 +49,27 @@
update_icon()
pulse(FALSE)
return FALSE
switch(type)
if("feet")
if(!H.shoes)
affecting = H.get_organ(pick("l_leg", "r_leg"))
H.Weaken(6 SECONDS)
if("l_hand", "r_hand")
if(!H.gloves)
affecting = H.get_organ(type)
H.Stun(6 SECONDS)
if(affecting)
affecting.receive_damage(1, 0)
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
visible_message("<span class='danger'>SPLAT!</span>")
M.death()
M.splat()
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
layer = MOB_LAYER - 0.2
armed = FALSE
@@ -79,11 +84,13 @@
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", "<span class='warning'>You accidentally trigger [src]!</span>")
return
to_chat(user, "<span class='notice'>You disarm [src].</span>")
armed = !armed
update_icon()
playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
@@ -94,9 +101,9 @@
var/which_hand = "l_hand"
if(!user.hand)
which_hand = "r_hand"
triggered(user, which_hand)
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
user.visible_message("<span class='warning'>[user] accidentally sets off [src], breaking [user.p_their()] fingers.</span>", "<span class='warning'>You accidentally trigger [src]!</span>")
return
..()
@@ -106,25 +113,28 @@
var/mob/living/carbon/H = AM
if(H.m_intent == MOVE_INTENT_RUN)
triggered(H)
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
"<span class='warning'>You accidentally step on [src]</span>")
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", "<span class='warning'>You accidentally step on [src]</span>")
else if(ismouse(AM))
triggered(AM)
else if(AM.density) // For mousetrap grenades, set off by anything heavy
triggered(AM)
..()
/obj/item/assembly/mousetrap/on_found(mob/finder)
if(armed)
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking [finder.p_their()] fingers.</span>", \
"<span class='warning'>You accidentally trigger [src]!</span>")
finder.visible_message("<span class='warning'>[finder] accidentally sets off [src], breaking [finder.p_their()] fingers.</span>", "<span class='warning'>You accidentally trigger [src]!</span>")
triggered(finder, finder.hand ? "l_hand" : "r_hand")
return TRUE //end the search!
return FALSE
/obj/item/assembly/mousetrap/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
if(!armed)
return ..()
visible_message("<span class='warning'>[src] is triggered by [AM].</span>")
triggered(null)
@@ -141,5 +151,5 @@
if(usr.stat)
return
layer = TURF_LAYER+0.2
layer = TURF_LAYER + 0.2
to_chat(usr, "<span class='notice'>You hide [src].</span>")
+5 -3
View File
@@ -17,10 +17,12 @@
. = ..()
AddComponent(/datum/component/proximity_monitor, _always_active = TRUE)
/obj/item/assembly/prox_sensor/describe()
/obj/item/assembly/prox_sensor/examine(mob/user)
. = ..()
if(timing)
return "<span class='notice'>The proximity sensor is arming.</span>"
return "The proximity sensor is [scanning ? "armed" : "disarmed"]."
. += "<span class='notice'>The proximity sensor is arming.</span>"
else
. += "The proximity sensor is [scanning ? "armed" : "disarmed"]."
/obj/item/assembly/prox_sensor/activate()
if(!..())
+2 -3
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "shock_kit"
var/obj/item/clothing/head/helmet/part1 = null
var/obj/item/radio/electropack/part2 = null
var/obj/item/electropack/part2 = null
var/status = FALSE
w_class = WEIGHT_CLASS_HUGE
flags = CONDUCT
@@ -39,8 +39,7 @@
add_fingerprint(user)
return
/obj/item/assembly/shock_kit/receive_signal()
/obj/item/assembly/shock_kit/proc/shock_invoke()
if(istype(loc, /obj/structure/chair/e_chair))
var/obj/structure/chair/e_chair/C = loc
C.shock()
return
+60 -113
View File
@@ -1,3 +1,5 @@
GLOBAL_LIST_EMPTY(remote_signalers)
/obj/item/assembly/signaler
name = "remote signaling device"
desc = "Used to remotely activate devices."
@@ -6,147 +8,92 @@
materials = list(MAT_METAL=400, MAT_GLASS=120)
origin_tech = "magnets=1;bluespace=1"
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
secured = TRUE
var/receiving = FALSE
bomb_name = "remote-control bomb"
/// Are we set to receieve a signal?
var/receiving = FALSE
/// Signal code
var/code = 30
/// Signal freqency itself
var/frequency = RSD_FREQ
var/delay = 0
var/datum/radio_frequency/radio_connection
var/airlock_wire = null
/obj/item/assembly/signaler/New()
..()
if(SSradio)
set_frequency(frequency)
/obj/item/assembly/signaler/Initialize()
..()
if(SSradio)
set_frequency(frequency)
. = ..()
GLOB.remote_signalers |= src
/obj/item/assembly/signaler/Destroy()
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
GLOB.remote_signalers -= src
return ..()
/obj/item/assembly/signaler/describe()
return "[src]'s power light is [receiving ? "on" : "off"]"
/obj/item/assembly/signaler/examine(mob/user)
. = ..()
. += "The power light is [receiving ? "on" : "off"]"
/// Called from activate(), actually invokes the signal on other signallers in the world
/obj/item/assembly/signaler/proc/signal()
for(var/obj/item/assembly/signaler/S as anything in GLOB.remote_signalers)
if(S == src)
continue
if(S.receiving && (S.code == code) && (S.frequency == frequency))
S.signal_callback()
var/turf/T = get_turf(src)
GLOB.lastsignalers.Add("[SQLtime()] <B>:</B> [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) <B>:</B> [format_frequency(frequency)]/[code]")
/obj/item/assembly/signaler/proc/signal_callback()
pulse(1)
visible_message("[bicon(src)] *beep* *beep*")
// Activation pre-runner, handles cooldown and calls signal(), invoked from ui_act()
/obj/item/assembly/signaler/activate()
if(cooldown > 0)
return FALSE
return
cooldown = 2
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
addtimer(CALLBACK(src, .proc/process_cooldown), 1 SECONDS)
signal()
return TRUE
/obj/item/assembly/signaler/update_icon_state()
if(holder)
holder.update_icon()
/obj/item/assembly/signaler/interact(mob/user, flag1)
var/t1 = "-------"
var/dat = {"
<TT>
"}
if(!flag1)
dat += {"
<A href='byond://?src=[UID()];send=1'>Send Signal</A><BR>
Receiver is <A href='byond://?src=[UID()];receive=1'>[receiving?"on":"off"]</A><BR>
"}
dat += {"
<B>Frequency/Code</B> for signaler:<BR>
Frequency:
<A href='byond://?src=[UID()];freq=-10'>-</A>
<A href='byond://?src=[UID()];freq=-2'>-</A>
[format_frequency(frequency)]
<A href='byond://?src=[UID()];freq=2'>+</A>
<A href='byond://?src=[UID()];freq=10'>+</A><BR>
// UI STUFF //
Code:
<A href='byond://?src=[UID()];code=-5'>-</A>
<A href='byond://?src=[UID()];code=-1'>-</A>
[code]
<A href='byond://?src=[UID()];code=1'>+</A>
<A href='byond://?src=[UID()];code=5'>+</A><BR>
[t1]
</TT>
"}
var/datum/browser/popup = new(user, "radio", name, 400, 400)
popup.set_content(dat)
popup.open(0)
onclose(user, "radio")
/obj/item/assembly/signaler/attack_self(mob/user)
ui_interact(user)
/obj/item/assembly/signaler/Topic(href, href_list)
..()
/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.deep_inventory_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "RemoteSignaler", name, 300, 200, master_ui, state)
ui.open()
if(HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED)|| usr.stat || usr.restrained() || !in_range(loc, usr))
usr << browse(null, "window=radio")
onclose(usr, "radio")
/obj/item/assembly/signaler/ui_data(mob/user)
var/list/data = list()
data["on"] = receiving
data["frequency"] = frequency
data["code"] = code
data["minFrequency"] = PUBLIC_LOW_FREQ
data["maxFrequency"] = PUBLIC_HIGH_FREQ
return data
/obj/item/assembly/signaler/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
if(..())
return
if(href_list["freq"])
var/new_frequency = (frequency + text2num(href_list["freq"]))
if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ)
new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
set_frequency(new_frequency)
. = TRUE
if(href_list["code"])
code += text2num(href_list["code"])
code = round(code)
code = min(100, code)
code = max(1, code)
if(href_list["receive"])
receiving = !receiving
switch(action)
if("recv_power")
receiving = !receiving
if(href_list["send"])
spawn( 0 )
signal()
if("signal")
activate()
if(usr)
attack_self(usr)
if("freq")
frequency = sanitize_frequency(text2num(params["freq"]) * 10)
/obj/item/assembly/signaler/proc/signal()
if(!radio_connection)
return
if("code")
code = clamp(text2num(params["code"]), 1, 100)
var/datum/signal/signal = new
signal.source = src
signal.encryption = code
signal.data["message"] = "ACTIVATE"
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] <B>:</B> [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) <B>:</B> [format_frequency(frequency)]/[code]")
/obj/item/assembly/signaler/receive_signal(datum/signal/signal)
if(!receiving || !signal)
return FALSE
if(signal.encryption != code)
return FALSE
if(!(wires & WIRE_RADIO_RECEIVE))
return FALSE
pulse(1)
for(var/mob/O in hearers(1, loc))
O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
return TRUE
/obj/item/assembly/signaler/proc/set_frequency(new_frequency)
if(!SSradio)
sleep(20)
if(!SSradio)
return
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT)
+5 -3
View File
@@ -14,10 +14,12 @@
var/repeat = FALSE
var/set_time = 10
/obj/item/assembly/timer/describe()
/obj/item/assembly/timer/examine(mob/user)
. = ..()
if(timing)
return "The timer is counting down from [time]!"
return "The timer is set for [time] seconds."
. += "The timer is counting down from [time]!"
else
. += "The timer is set for [time] seconds."
/obj/item/assembly/timer/activate()
if(!..())
+9 -5
View File
@@ -10,11 +10,12 @@
bomb_name = "voice-activated bomb"
/obj/item/assembly/voice/describe()
/obj/item/assembly/voice/examine(mob/user)
. = ..()
if(recorded || listening)
return "A meter on [src] flickers with every nearby sound."
. += "A meter on it flickers with every nearby sound."
else
return "[src] is deactivated."
. += "It is is deactivated."
/obj/item/assembly/voice/hear_talk(mob/living/M as mob, list/message_pieces)
hear_input(M, multilingual_to_message(message_pieces), 0)
@@ -25,12 +26,14 @@
/obj/item/assembly/voice/proc/hear_input(mob/living/M as mob, msg, type)
if(!istype(M,/mob/living))
return
if(listening)
recorded = msg
recorded_type = type
listening = FALSE
var/turf/T = get_turf(src) //otherwise it won't work in hand
T.visible_message("[bicon(src)] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"")
else if(findtext(msg, recorded) && type == recorded_type)
var/turf/T = get_turf(src) //otherwise it won't work in hand
T.visible_message("<span class='warning'>[bicon(src)] beeps!</span>")
@@ -65,8 +68,9 @@
/obj/item/assembly/voice/noise/attack_self(mob/user)
return
/obj/item/assembly/voice/noise/describe()
return "[src] does not appear to have any controls."
/obj/item/assembly/voice/noise/examine(mob/user)
. = ..()
. += "It does not appear to have any controls."
/obj/item/assembly/voice/noise/hear_talk(mob/living/M as mob, list/message_pieces)
return