Make the deadman´s switch great again (#4097)

Now its actually useful

It triggers with absolute certainty if you let go and dont deactivate it first.
Be that because you are knocked down, stunned, shot, intentionally let go, put it in a pocket, backpack, ...
This commit is contained in:
Werner
2018-02-24 14:51:39 +01:00
committed by Erki
parent 4a22ee2fd4
commit b368c0c97a
4 changed files with 184 additions and 120 deletions

View File

@@ -17,30 +17,30 @@
var/datum/radio_frequency/radio_connection
var/deadman = 0
Initialize()
. = ..()
set_frequency(frequency)
/obj/item/device/assembly/signaler/Initialize()
. = ..()
set_frequency(frequency)
activate()
if(cooldown > 0) return 0
cooldown = 2
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
/obj/item/device/assembly/signaler/activate()
if(cooldown > 0) return 0
cooldown = 2
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
signal()
return 1
signal()
return 1
update_icon()
if(holder)
holder.update_icon()
return
/obj/item/device/assembly/signaler/update_icon()
if(holder)
holder.update_icon()
return
interact(mob/user as mob, flag1)
var/t1 = "-------"
/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1)
var/t1 = "-------"
// if ((src.b_stat && !( flag1 )))
// t1 = text("-------<BR>\nGreen Wire: []<BR>\nRed Wire: []<BR>\nBlue Wire: []<BR>\n", (src.wires & 4 ? text("<A href='?src=\ref[];wires=4'>Cut Wire</A>", src) : text("<A href='?src=\ref[];wires=4'>Mend Wire</A>", src)), (src.wires & 2 ? text("<A href='?src=\ref[];wires=2'>Cut Wire</A>", src) : text("<A href='?src=\ref[];wires=2'>Mend Wire</A>", src)), (src.wires & 1 ? text("<A href='?src=\ref[];wires=1'>Cut Wire</A>", src) : text("<A href='?src=\ref[];wires=1'>Mend Wire</A>", src)))
// else
// t1 = "-------" Speaker: [src.listening ? "<A href='byond://?src=\ref[src];listen=0'>Engaged</A>" : "<A href='byond://?src=\ref[src];listen=1'>Disengaged</A>"]<BR>
var/dat = {"
var/dat = {"
<TT>
<A href='byond://?src=\ref[src];send=1'>Send Signal</A><BR>
@@ -60,128 +60,153 @@
<A href='byond://?src=\ref[src];code=5'>+</A><BR>
[t1]
</TT>"}
user << browse(dat, "window=radio")
onclose(user, "radio")
user << browse(dat, "window=radio")
onclose(user, "radio")
return
/obj/item/device/assembly/signaler/Topic(href, href_list)
..()
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
usr << browse(null, "window=radio")
onclose(usr, "radio")
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)
Topic(href, href_list)
..()
if(href_list["code"])
src.code += text2num(href_list["code"])
src.code = round(src.code)
src.code = min(100, src.code)
src.code = max(1, src.code)
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
usr << browse(null, "window=radio")
onclose(usr, "radio")
return
if(href_list["send"])
spawn( 0 )
signal()
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)
if(usr)
attack_self(usr)
if(href_list["code"])
src.code += text2num(href_list["code"])
src.code = round(src.code)
src.code = min(100, src.code)
src.code = max(1, src.code)
return
if(href_list["send"])
spawn( 0 )
signal()
if(usr)
attack_self(usr)
/obj/item/device/assembly/signaler/proc/signal()
if(!radio_connection)
return
proc/signal()
if(!radio_connection)
return
if(within_jamming_range(src))
return
var/datum/signal/signal = new
signal.source = src
signal.encryption = code
signal.data["message"] = "ACTIVATE"
radio_connection.post_signal(src, signal)
if(within_jamming_range(src))
return
/*
for(var/obj/item/device/assembly/signaler/S in world)
if(!S) continue
if(S == src) continue
if((S.frequency == src.frequency) && (S.code == src.code))
spawn(0)
if(S) S.pulse(0)
return 0*/
var/datum/signal/signal = new
signal.source = src
signal.encryption = code
signal.data["message"] = "ACTIVATE"
radio_connection.post_signal(src, signal)
return
pulse(var/radio = 0)
if(src.connected && src.wires)
connected.Pulse(src)
else if(holder)
holder.process_activation(src, 1, 0)
/obj/item/device/assembly/signaler/pulse(var/radio = 0)
if(src.connected && src.wires)
connected.Pulse(src)
else if(holder)
holder.process_activation(src, 1, 0)
else
..(radio)
return 1
/obj/item/device/assembly/signaler/receive_signal(datum/signal/signal)
if(!signal)
return 0
if(within_jamming_range(src))
return 0
if(signal.encryption != code)
return 0
if(!(src.wires & WIRE_RADIO_RECEIVE))
return 0
pulse(1)
if(!holder)
for(var/mob/O in hearers(1, src.loc))
O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
return
/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency)
if(!frequency)
return
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT)
return
//Triggers the deadmanswitch if its dropped or moved into ones backpack
/obj/item/device/assembly/signaler/dropped(var/mob/user)
. = ..()
if(deadman)
if(!user.client)
deadman_deactivate(user) //To deactivate the deadman if someone disconnects
else
..(radio)
return 1
deadman_trigger(user)
//Triggers the deadmanswitch if its moved between slots (i.e. from hand into the pocket)
/obj/item/device/assembly/signaler/on_slotmove(var/mob/user)
. = ..()
if(deadman)
deadman_trigger(user)
receive_signal(datum/signal/signal)
if(!signal)
return 0
if(within_jamming_range(src))
return 0
if(signal.encryption != code)
return 0
if(!(src.wires & WIRE_RADIO_RECEIVE))
return 0
pulse(1)
if(!holder)
for(var/mob/O in hearers(1, src.loc))
O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
/obj/item/device/assembly/signaler/process()
//If we have disabled the deadmanswitch. stop here
if(!deadman)
STOP_PROCESSING(SSprocessing, src)
return
//That there is just a fallback in case dropped is not being called
var/mob/M = src.loc
if(!ismob(M))
deadman_trigger()
else if(prob(20))
M.visible_message("[M]'s finger twitches a bit over [src]'s deadman switch!")
return
/obj/item/device/assembly/signaler/proc/deadman_trigger(var/mob/user)
if(deadman) //If its not activated, there is no point in triggering it
if(user)
src.visible_message("<span class='warning'>[user] releases [src]'s deadman switch!</span>")
else
src.visible_message("<span class='warning'>[src]'s deadman switch is released!</span>")
signal()
deadman = 0
STOP_PROCESSING(SSprocessing, src)
/obj/item/device/assembly/signaler/verb/deadman_it()
set src in usr
set name = "Hold the deadman switch!"
set desc = "Sends a signal if dropped or moved into a container."
if(!deadman)
deadman_activate(usr)
else
deadman_deactivate(usr)
proc/set_frequency(new_frequency)
if(!frequency)
return
if(!SSradio)
sleep(20)
if(!SSradio)
return
SSradio.remove_object(src, frequency)
frequency = new_frequency
radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT)
return
/obj/item/device/assembly/signaler/proc/deadman_activate(var/mob/user)
deadman = 1
START_PROCESSING(SSprocessing, src)
log_and_message_admins("is threatening to trigger a signaler deadman's switch")
user.visible_message("<span class='warning'>[user] presses and holds [src]'s deadman switch...</span>")
to_chat(user,"<span class='warning'>Your are now holding [src]'s deadman switch. Dropping, putting the device away, or being hit will activate the signaller.</span>")
to_chat(user,"<span class='critical'>To deactivate it, make sure to press the verb again.</span>")
process()
if(!deadman)
STOP_PROCESSING(SSprocessing, src)
var/mob/M = src.loc
if(!M || !ismob(M))
if(prob(5))
signal()
deadman = 0
STOP_PROCESSING(SSprocessing, src)
else if(prob(5))
M.visible_message("[M]'s finger twitches a bit over [src]'s signal button!")
return
verb/deadman_it()
set src in usr
set name = "Threaten to push the button!"
set desc = "BOOOOM!"
deadman = 1
START_PROCESSING(SSprocessing, src)
log_and_message_admins("is threatening to trigger a signaler deadman's switch")
usr.visible_message("<span class='warning'>[usr] moves their finger over [src]'s signal button...</span>")
/obj/item/device/assembly/signaler/proc/deadman_deactivate(var/mob/user)
deadman = 0
STOP_PROCESSING(SSprocessing, src)
user.visible_message("<span class='warning'>[user] secures [user]'s deadman switch...</span>")
/obj/item/device/assembly/signaler/Destroy()
if(SSradio)

View File

@@ -38,6 +38,7 @@
//This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't eqip need to be done before! Use mob_can_equip() for that task.
//In most cases you will want to use equip_to_slot_if_possible()
/mob/proc/equip_to_slot(obj/item/W as obj, slot)
W.on_slotmove(src)
return
//This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such.

View File

@@ -185,7 +185,7 @@ This saves us from having to call add_fingerprint() any time something is put in
//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible()
//set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc.
/mob/living/carbon/human/equip_to_slot(obj/item/W as obj, slot, redraw_mob = 1)
..()
if(!slot) return
if(!istype(W)) return
if(!has_organ_for_slot(slot)) return