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:
rastaf.zero@gmail.com
2011-02-12 00:08:42 +00:00
parent 098a5b73e2
commit 785eb9dcc6
11 changed files with 429 additions and 254 deletions
+2 -2
View File
@@ -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))
+2
View File
@@ -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
View File
@@ -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
..()
+1
View File
@@ -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"