mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
RADIO HEADSET update by Barhandar and me:
Three new channels and new :h-like shortcuts for each channel.
shortcuts now are:
":r" = "right hand" (unchanged)
":l" = "left hand" (unchanged)
":i" = "intercom" (unchanged)
":h" = "department" (unchanged for everyone except captain)
":w" = "whisper" (NEW shortcut)
":b" = "binary" (CHANGED)
":a" = "alientalk" (unchanged)
":t" = "Syndicate" (NEW channel)
":c" = "Command" (NEW shortcut)
":n" = "Science" (NEW channel) ("n" because all other letters are occupied)
":m" = "Medical" (NEW shortcut)
":e" = "Engineering" (NEW shortcut)
":s" = "Security" (NEW shortcut)
Note:
":h" works as before, i.e. sends on engineering channel for engineers and CE, on medical channel for MD, CMO,etc and so on.
All heads have command channel in their headsets along with department channel.
Warden and QM aren't heads.
Captain have almost all channels in his/her headset, but some are switched off by default. The default channel for captain is "Command" now.
Bugs fixed:
If headset is tuned to other frequency dept channel don't work.
A receive wire in intercoms can be cut.
Some others bugs.
git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1020 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -96,14 +96,14 @@
|
||||
usr << browse(null, "window=radio")
|
||||
return
|
||||
return
|
||||
|
||||
/*
|
||||
/obj/item/device/radio/electropack/accept_rad(obj/item/device/radio/signaler/R as obj, message)
|
||||
|
||||
if ((istype(R, /obj/item/device/radio/signaler) && R.frequency == src.frequency && R.code == src.code))
|
||||
return 1
|
||||
else
|
||||
return null
|
||||
return
|
||||
return*/
|
||||
|
||||
/obj/item/device/radio/electropack/receive_signal(datum/signal/signal)
|
||||
if(!signal || (signal.encryption != code))
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
attack_self(user)
|
||||
|
||||
/obj/item/device/radio/intercom/send_hear()
|
||||
if (!(src.wires & WIRE_RECEIVE))
|
||||
return
|
||||
if (src.listening)
|
||||
return hearers(7, src.loc)
|
||||
|
||||
|
||||
+190
-124
@@ -12,12 +12,35 @@
|
||||
src.frequency = sanitize_frequency(src.frequency)
|
||||
|
||||
set_frequency(frequency)
|
||||
|
||||
for (var/ch_name in channels)
|
||||
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
|
||||
/*
|
||||
if(src.secure_frequency)
|
||||
secure_radio_connection = radio_controller.add_object(src, secure_frequency, RADIO_CHAT)
|
||||
if(src.channels.Find("Medical"))
|
||||
med_connection = radio_controller.add_object(src, med_freq, RADIO_CHAT)
|
||||
if(src.channels.Find("Science"))
|
||||
sci_connection = radio_controller.add_object(src, sci_freq, RADIO_CHAT)
|
||||
if(src.channels.Find("Security"))
|
||||
sec_connection = radio_controller.add_object(src, sec_freq, RADIO_CHAT)
|
||||
if(src.channels.Find("Command"))
|
||||
com_connection = radio_controller.add_object(src, com_freq, RADIO_CHAT)
|
||||
if(src.channels.Find("Engineer"))
|
||||
eng_connection = radio_controller.add_object(src, eng_freq, RADIO_CHAT)*/
|
||||
|
||||
/obj/item/device/radio
|
||||
var/datum/radio_frequency/radio_connection
|
||||
var/datum/radio_frequency/secure_radio_connection // Shared by Mport2004 for the security headsets -- TLE
|
||||
var
|
||||
datum/radio_frequency/radio_connection
|
||||
|
||||
list/datum/radio_frequency/secure_radio_connections = new
|
||||
/*
|
||||
datum/radio_frequency/secure_radio_connection // Shared by Mport2004 for the security headsets -- TLE
|
||||
datum/radio_frequency/med_connection
|
||||
datum/radio_frequency/sci_connection
|
||||
datum/radio_frequency/com_connection
|
||||
datum/radio_frequency/eng_connection
|
||||
datum/radio_frequency/sec_connection*/
|
||||
|
||||
proc
|
||||
set_frequency(new_frequency)
|
||||
@@ -27,17 +50,11 @@
|
||||
|
||||
/obj/item/device/radio/attack_self(mob/user as mob)
|
||||
user.machine = src
|
||||
var/t1
|
||||
if (src.b_stat)
|
||||
t1 = {"
|
||||
-------<BR>
|
||||
Green Wire: <A href='byond://?src=\ref[src];wires=4'>[src.wires & 4 ? "Cut" : "Mend"] Wire</A><BR>
|
||||
Red Wire: <A href='byond://?src=\ref[src];wires=2'>[src.wires & 2 ? "Cut" : "Mend"] Wire</A><BR>
|
||||
Blue Wire: <A href='byond://?src=\ref[src];wires=1'>[src.wires & 1 ? "Cut" : "Mend"] Wire</A><BR>"}
|
||||
else
|
||||
t1 = "-------"
|
||||
interact(user)
|
||||
|
||||
/obj/item/device/radio/proc/interact(mob/user as mob)
|
||||
var/dat = {"
|
||||
<TT>
|
||||
<html><head><title>[src]</title></head><body><TT>
|
||||
Microphone: [src.broadcasting ? "<A href='byond://?src=\ref[src];talk=0'>Engaged</A>" : "<A href='byond://?src=\ref[src];talk=1'>Disengaged</A>"]<BR>
|
||||
Speaker: [src.listening ? "<A href='byond://?src=\ref[src];listen=0'>Engaged</A>" : "<A href='byond://?src=\ref[src];listen=1'>Disengaged</A>"]<BR>
|
||||
Frequency:
|
||||
@@ -45,103 +62,130 @@ Frequency:
|
||||
<A href='byond://?src=\ref[src];freq=-2'>-</A>
|
||||
[format_frequency(src.frequency)]
|
||||
<A href='byond://?src=\ref[src];freq=2'>+</A>
|
||||
<A href='byond://?src=\ref[src];freq=10'>+</A><BR>
|
||||
[t1]
|
||||
</TT>"}
|
||||
<A href='byond://?src=\ref[src];freq=10'>+</A><BR>"}
|
||||
|
||||
for (var/ch_name in channels)
|
||||
dat+=text_sec_channel(ch_name, channels[ch_name])
|
||||
dat+={"[text_wires()]</TT></body></html>"}
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
/obj/item/device/radio/proc/text_wires()
|
||||
if (!src.b_stat)
|
||||
return ""
|
||||
return {"
|
||||
<hr>
|
||||
Green Wire: <A href='byond://?src=\ref[src];wires=4'>[(src.wires & 4) ? "Cut" : "Mend"] Wire</A><BR>
|
||||
Red Wire: <A href='byond://?src=\ref[src];wires=2'>[(src.wires & 2) ? "Cut" : "Mend"] Wire</A><BR>
|
||||
Blue Wire: <A href='byond://?src=\ref[src];wires=1'>[(src.wires & 1) ? "Cut" : "Mend"] Wire</A><BR>"}
|
||||
|
||||
|
||||
/obj/item/device/radio/proc/text_sec_channel(var/chan_name, var/chan_stat)
|
||||
//var/broad = (chan_stat&FREQ_BROADCASTING)!=0
|
||||
var/list = !!(chan_stat&FREQ_LISTENING)!=0
|
||||
/*
|
||||
Microphone:"<A href='byond://?src=\ref[src];ch_name=[chan_name];talk=[!broad]'> [broad ? "Engaged" : "Disengaged"]</A>"
|
||||
*/
|
||||
return {"
|
||||
<B>[chan_name]</B><br>
|
||||
Speaker: <A href='byond://?src=\ref[src];ch_name=[chan_name];listen=[!list]'>[list ? "Engaged" : "Disengaged"]</A><BR>"}
|
||||
|
||||
/obj/item/device/radio/Topic(href, href_list)
|
||||
//..()
|
||||
if (usr.stat)
|
||||
return
|
||||
if ((usr.contents.Find(src) || in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))
|
||||
usr.machine = src
|
||||
if (href_list["track"])
|
||||
var/mob/target = locate(href_list["track"])
|
||||
var/mob/living/silicon/ai/A = locate(href_list["track2"])
|
||||
A.ai_actual_track(target)
|
||||
return
|
||||
if (href_list["freq"])
|
||||
var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"]))
|
||||
set_frequency(new_frequency)
|
||||
|
||||
if (src.traitor_frequency && src.frequency == src.traitor_frequency)
|
||||
usr.machine = null
|
||||
usr << browse(null, "window=radio")
|
||||
onclose(usr, "radio")
|
||||
// now transform the regular radio, into a (disguised)syndicate uplink!
|
||||
var/obj/item/weapon/syndicate_uplink/T = src.traitorradio
|
||||
var/obj/item/device/radio/R = src
|
||||
R.loc = T
|
||||
T.loc = usr
|
||||
R.layer = 0
|
||||
if (usr.client)
|
||||
usr.client.screen -= R
|
||||
if (usr.r_hand == R)
|
||||
usr.u_equip(R)
|
||||
usr.r_hand = T
|
||||
else
|
||||
usr.u_equip(R)
|
||||
usr.l_hand = T
|
||||
R.loc = T
|
||||
T.layer = 20
|
||||
T.attack_self(usr)
|
||||
return
|
||||
else
|
||||
if (href_list["talk"])
|
||||
src.broadcasting = text2num(href_list["talk"])
|
||||
else
|
||||
if (href_list["listen"])
|
||||
src.listening = text2num(href_list["listen"])
|
||||
else
|
||||
if (href_list["wires"])
|
||||
var/t1 = text2num(href_list["wires"])
|
||||
if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
|
||||
return
|
||||
if (t1 & 1)
|
||||
if (src.wires & 1)
|
||||
src.wires &= 65534
|
||||
else
|
||||
src.wires |= 1
|
||||
else
|
||||
if (t1 & 2)
|
||||
if (src.wires & 2)
|
||||
src.wires &= 65533
|
||||
else
|
||||
src.wires |= 2
|
||||
else
|
||||
if (t1 & 4)
|
||||
if (src.wires & 4)
|
||||
src.wires &= 65531
|
||||
else
|
||||
src.wires |= 4
|
||||
if (!( src.master ))
|
||||
if (istype(src.loc, /mob))
|
||||
attack_self(src.loc)
|
||||
else
|
||||
src.updateDialog()
|
||||
else
|
||||
if (istype(src.master.loc, /mob))
|
||||
src.attack_self(src.master.loc)
|
||||
else
|
||||
src.updateDialog()
|
||||
src.add_fingerprint(usr)
|
||||
else
|
||||
if (\
|
||||
!(\
|
||||
istype(usr, /mob/living/silicon) || \
|
||||
(\
|
||||
usr.contents.Find(src) || \
|
||||
( in_range(src, usr) && istype(src.loc, /turf) )\
|
||||
)\
|
||||
)\
|
||||
)
|
||||
usr << browse(null, "window=radio")
|
||||
return
|
||||
usr.machine = src
|
||||
if (href_list["track"])
|
||||
var/mob/target = locate(href_list["track"])
|
||||
var/mob/living/silicon/ai/A = locate(href_list["track2"])
|
||||
A.ai_actual_track(target)
|
||||
return
|
||||
else if (href_list["freq"])
|
||||
var/new_frequency = (frequency + text2num(href_list["freq"]))
|
||||
if (!src.freerange || (src.frequency < 1200 || src.frequency > 1600))
|
||||
new_frequency = sanitize_frequency(new_frequency)
|
||||
set_frequency(new_frequency)
|
||||
|
||||
/obj/item/device/radio/talk_into(mob/M as mob, message, secure)
|
||||
if (src.traitor_frequency && src.frequency == src.traitor_frequency)
|
||||
usr.machine = null
|
||||
usr << browse(null, "window=radio")
|
||||
// now transform the regular radio, into a (disguised)syndicate uplink!
|
||||
var/obj/item/weapon/syndicate_uplink/T = src.traitorradio
|
||||
var/obj/item/device/radio/R = src
|
||||
R.loc = T
|
||||
T.loc = usr
|
||||
R.layer = 0
|
||||
if (usr.client)
|
||||
usr.client.screen -= R
|
||||
if (usr.r_hand == R)
|
||||
usr.u_equip(R)
|
||||
usr.r_hand = T
|
||||
else
|
||||
usr.u_equip(R)
|
||||
usr.l_hand = T
|
||||
R.loc = T
|
||||
T.layer = 20
|
||||
T.attack_self(usr)
|
||||
return
|
||||
else if (href_list["talk"])
|
||||
src.broadcasting = text2num(href_list["talk"])
|
||||
else if (href_list["listen"])
|
||||
var/chan_name = href_list["ch_name"]
|
||||
if (!chan_name)
|
||||
src.listening = text2num(href_list["listen"])
|
||||
else
|
||||
if (channels[chan_name] & FREQ_LISTENING)
|
||||
channels[chan_name] &= ~FREQ_LISTENING
|
||||
else
|
||||
channels[chan_name] |= FREQ_LISTENING
|
||||
else if (href_list["wires"])
|
||||
var/t1 = text2num(href_list["wires"])
|
||||
if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
|
||||
return
|
||||
if (src.wires & t1)
|
||||
src.wires &= ~t1
|
||||
else
|
||||
src.wires |= t1
|
||||
if (!( src.master ))
|
||||
if (istype(src.loc, /mob))
|
||||
interact(src.loc)
|
||||
else
|
||||
src.updateDialog()
|
||||
else
|
||||
if (istype(src.master.loc, /mob))
|
||||
interact(src.master.loc)
|
||||
else
|
||||
src.updateDialog()
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
/obj/item/device/radio/talk_into(mob/M as mob, message, channel)
|
||||
|
||||
var/datum/radio_frequency/connection = null // Code shared by Mport2004 for Security Headsets -- TLE
|
||||
var/datum/display_freq = src.frequency
|
||||
if(secure && src.secure_radio_connection)
|
||||
connection = src.secure_radio_connection
|
||||
display_freq = src.secure_frequency
|
||||
if(channel && src.channels && src.channels.len > 0)
|
||||
if (channel == "department")
|
||||
//world << "DEBUG: channel=\"[channel]\" switching to \"[src.channels[1]]\""
|
||||
channel = src.channels[1]
|
||||
connection = secure_radio_connections[channel]
|
||||
else
|
||||
connection = src.radio_connection
|
||||
secure = 0
|
||||
channel = null
|
||||
if (!istype(connection))
|
||||
return
|
||||
var/display_freq = connection.frequency
|
||||
|
||||
//world << "DEBUG: used channel=\"[channel]\" frequency= \"[display_freq]\" connection.devices.len = [connection.devices.len]"
|
||||
|
||||
var/eqjobname
|
||||
|
||||
@@ -157,18 +201,19 @@ Frequency:
|
||||
else
|
||||
eqjobname = "Unknown"
|
||||
|
||||
if (!(src.wires & 4))
|
||||
if (!(src.wires & WIRE_TRANSMIT))
|
||||
return
|
||||
|
||||
var/list/receive = list()
|
||||
|
||||
//for (var/obj/item/device/radio/R in radio_connection.devices)
|
||||
for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) // Modified for security headset code -- TLE
|
||||
if(R.accept_rad(src, message))
|
||||
for (var/i in R.send_hear())
|
||||
if (!(i in receive))
|
||||
receive += i
|
||||
//if(R.accept_rad(src, message))
|
||||
for (var/i in R.send_hear(display_freq))
|
||||
if (!(i in receive))
|
||||
receive += i
|
||||
|
||||
//world << "DEBUG: receive.len=[receive.len]"
|
||||
var/list/heard_masked = list() // masked name or no real name
|
||||
var/list/heard_normal = list() // normal message
|
||||
var/list/heard_voice = list() // voice message
|
||||
@@ -187,29 +232,35 @@ Frequency:
|
||||
heard_garbled += R
|
||||
|
||||
if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled))
|
||||
var/part_a = "<span class='game radio'><span class='name'>"
|
||||
var/part_a = "<span class='radio'><span class='name'>"
|
||||
//var/part_b = "</span><b> \icon[src]\[[format_frequency(src.frequency)]\]</b> <span class='message'>"
|
||||
var/part_b = "</span><b> \icon[src]\[[format_frequency(display_freq)]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/freq_text = (display_freq!=SYND_FREQ) ? format_frequency(display_freq) : "#unkn"
|
||||
var/part_b = "</span><b> \icon[src]\[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/part_c = "</span></span>"
|
||||
|
||||
if(findtext(part_b, "135.3") || findtext(part_b, "135.5") || findtext(part_b, "135.7") || findtext(part_b, "135.9"))
|
||||
if (display_freq==SYND_FREQ)
|
||||
part_a = "<span class='syndradio'><span class='name'>"
|
||||
else if (display_freq==COMM_FREQ)
|
||||
part_a = "<span class='comradio'><span class='name'>"
|
||||
else if (display_freq in DEPT_FREQS)
|
||||
part_a = "<span class='deptradio'><span class='name'>"
|
||||
|
||||
var/quotedmsg = M.say_quote(message)
|
||||
if (length(heard_masked))
|
||||
var/rendered = "[part_a][M.name][part_b][M.say_quote(message)][part_c]"
|
||||
var/rendered = "[part_a][M.name][part_b][quotedmsg][part_c]"
|
||||
|
||||
for (var/mob/R in heard_masked)
|
||||
if(istype(R, /mob/living/silicon/ai))
|
||||
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.name] ([eqjobname]) </a>[part_b][M.say_quote(message)][part_c]", 2)
|
||||
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.name] ([eqjobname]) </a>[part_b][quotedmsg][part_c]", 2)
|
||||
else
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
if (length(heard_normal))
|
||||
var/rendered = "[part_a][M.real_name][part_b][M.say_quote(message)][part_c]"
|
||||
var/rendered = "[part_a][M.real_name][part_b][quotedmsg][part_c]"
|
||||
|
||||
for (var/mob/R in heard_normal)
|
||||
if(istype(R, /mob/living/silicon/ai))
|
||||
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.real_name] ([eqjobname]) </a>[part_b][M.say_quote(message)][part_c]", 2)
|
||||
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.real_name] ([eqjobname]) </a>[part_b][quotedmsg][part_c]", 2)
|
||||
else
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
@@ -223,41 +274,56 @@ Frequency:
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
if (length(heard_garbled))
|
||||
var/rendered = "[part_a][M.voice_name][part_b][M.say_quote(stars(message))][part_c]"
|
||||
quotedmsg = M.say_quote(stars(message))
|
||||
var/rendered = "[part_a][M.voice_name][part_b][quotedmsg][part_c]"
|
||||
|
||||
for (var/mob/R in heard_voice)
|
||||
if(istype(R, /mob/living/silicon/ai))
|
||||
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name]</a>[part_b][M.say_quote(stars(message))][part_c]", 2)
|
||||
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name]</a>[part_b][quotedmsg][part_c]", 2)
|
||||
else
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
/obj/item/device/radio/hear_talk(mob/M as mob, msg)
|
||||
if (src.broadcasting)
|
||||
talk_into(M, msg)
|
||||
|
||||
/*
|
||||
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
|
||||
|
||||
if ((R.frequency == src.frequency && message))
|
||||
return 1
|
||||
else if
|
||||
|
||||
else
|
||||
return null
|
||||
return
|
||||
|
||||
/obj/item/device/radio/proc/send_hear()
|
||||
*/
|
||||
/obj/item/device/radio/proc/send_hear(freq)
|
||||
if(last_transmission && world.time < (last_transmission + TRANSMISSION_DELAY))
|
||||
return
|
||||
last_transmission = world.time
|
||||
if ((src.listening && src.wires & 2))
|
||||
var/list/hear = hearers(1, src.loc)
|
||||
if (!(src.wires & WIRE_RECEIVE))
|
||||
return
|
||||
if (!freq) //recieved on main frequency
|
||||
if (!src.listening)
|
||||
return
|
||||
else
|
||||
var/accept = (freq==frequency && src.listening)
|
||||
if (!accept)
|
||||
for (var/ch_name in channels)
|
||||
var/datum/radio_frequency/RF = secure_radio_connections[ch_name]
|
||||
if (RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING))
|
||||
accept = 1
|
||||
break
|
||||
if (!accept)
|
||||
return
|
||||
var/list/hear = hearers(1, src.loc)
|
||||
|
||||
// modified so that a mob holding the radio is always a hearer of it
|
||||
// this fixes radio problems when inside something (e.g. mulebot)
|
||||
|
||||
if(ismob(loc))
|
||||
if(! hear.Find(loc) )
|
||||
hear += loc
|
||||
return hear
|
||||
return
|
||||
// modified so that a mob holding the radio is always a hearer of it
|
||||
// this fixes radio problems when inside something (e.g. mulebot)
|
||||
if(ismob(loc))
|
||||
if(! (loc in hear) )
|
||||
hear += loc
|
||||
return hear
|
||||
|
||||
/obj/item/device/radio/examine()
|
||||
set src in view()
|
||||
@@ -279,9 +345,7 @@ Frequency:
|
||||
user.show_message("\blue The radio can now be attached and modified!")
|
||||
else
|
||||
user.show_message("\blue The radio can no longer be modified or attached!")
|
||||
for(var/mob/M in viewers(1, src))
|
||||
if (M.client)
|
||||
src.attack_self(M)
|
||||
src.updateDialog()
|
||||
//Foreach goto(83)
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
@@ -289,4 +353,6 @@ Frequency:
|
||||
/obj/item/device/radio/emp_act(severity)
|
||||
broadcasting = 0
|
||||
listening = 0
|
||||
for (var/ch_name in channels)
|
||||
channels[ch_name] = 0
|
||||
..()
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
src.fingerprints = from.fingerprints
|
||||
src.fingerprintshidden = from.fingerprintshidden
|
||||
src.fingerprintslast = from.fingerprintslast
|
||||
//TODO bloody overlay
|
||||
|
||||
/datum/stack_recipe
|
||||
var/title = "ERROR"
|
||||
|
||||
Reference in New Issue
Block a user