mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-11 02:31:38 +00:00
assorted tcomms housekeeping
split some files, merged some files, cleaned some code removed spurious listening level toggle from relays
This commit is contained in:
@@ -1,91 +0,0 @@
|
||||
#define TELECOMMS_RECEPTION_NONE 0
|
||||
#define TELECOMMS_RECEPTION_SENDER 1
|
||||
#define TELECOMMS_RECEPTION_RECEIVER 2
|
||||
#define TELECOMMS_RECEPTION_BOTH 3
|
||||
|
||||
/proc/register_radio(source, old_frequency, new_frequency, radio_filter)
|
||||
if(old_frequency)
|
||||
radio_controller.remove_object(source, old_frequency)
|
||||
if(new_frequency)
|
||||
return radio_controller.add_object(source, new_frequency, radio_filter)
|
||||
|
||||
/proc/unregister_radio(source, frequency)
|
||||
if(radio_controller)
|
||||
radio_controller.remove_object(source, frequency)
|
||||
|
||||
/proc/get_frequency_name(var/display_freq)
|
||||
var/freq_text
|
||||
|
||||
// the name of the channel
|
||||
if(display_freq in ANTAG_FREQS)
|
||||
freq_text = "#unkn"
|
||||
else
|
||||
for(var/channel in radiochannels)
|
||||
if(radiochannels[channel] == display_freq)
|
||||
freq_text = channel
|
||||
break
|
||||
|
||||
// --- If the frequency has not been assigned a name, just use the frequency as the name ---
|
||||
if(!freq_text)
|
||||
freq_text = format_frequency(display_freq)
|
||||
|
||||
return freq_text
|
||||
|
||||
/datum/reception
|
||||
var/obj/machinery/message_server/message_server = null
|
||||
var/telecomms_reception = TELECOMMS_RECEPTION_NONE
|
||||
var/message = ""
|
||||
|
||||
/datum/receptions
|
||||
var/obj/machinery/message_server/message_server = null
|
||||
var/sender_reception = TELECOMMS_RECEPTION_NONE
|
||||
var/list/receiver_reception = new
|
||||
|
||||
/proc/get_message_server()
|
||||
if(message_servers)
|
||||
for (var/obj/machinery/message_server/MS in message_servers)
|
||||
if(MS.active)
|
||||
return MS
|
||||
return null
|
||||
|
||||
/proc/check_signal(var/datum/signal/signal)
|
||||
return signal && signal.data["done"]
|
||||
|
||||
/proc/get_sender_reception(var/atom/sender, var/datum/signal/signal)
|
||||
return check_signal(signal) ? TELECOMMS_RECEPTION_SENDER : TELECOMMS_RECEPTION_NONE
|
||||
|
||||
/proc/get_receiver_reception(var/receiver, var/datum/signal/signal)
|
||||
if(receiver && check_signal(signal))
|
||||
var/turf/pos = get_turf(receiver)
|
||||
if(pos && (pos.z in signal.data["level"]))
|
||||
return TELECOMMS_RECEPTION_RECEIVER
|
||||
return TELECOMMS_RECEPTION_NONE
|
||||
|
||||
/proc/get_reception(var/atom/sender, var/receiver, var/message = "", var/do_sleep = 1)
|
||||
var/datum/reception/reception = new
|
||||
|
||||
// check if telecomms I/O route 1459 is stable
|
||||
reception.message_server = get_message_server()
|
||||
|
||||
var/datum/signal/signal = sender.telecomms_process(do_sleep) // Be aware that this proc calls sleep, to simulate transmition delays
|
||||
reception.telecomms_reception |= get_sender_reception(sender, signal)
|
||||
reception.telecomms_reception |= get_receiver_reception(receiver, signal)
|
||||
reception.message = signal && signal.data["compression"] > 0 ? Gibberish(message, signal.data["compression"] + 50) : message
|
||||
|
||||
return reception
|
||||
|
||||
/proc/get_receptions(var/atom/sender, var/list/atom/receivers, var/do_sleep = 1)
|
||||
var/datum/receptions/receptions = new
|
||||
receptions.message_server = get_message_server()
|
||||
|
||||
var/datum/signal/signal
|
||||
if(sender)
|
||||
signal = sender.telecomms_process(do_sleep)
|
||||
receptions.sender_reception = get_sender_reception(sender, signal)
|
||||
|
||||
for(var/atom/receiver in receivers)
|
||||
if(!signal)
|
||||
signal = receiver.telecomms_process()
|
||||
receptions.receiver_reception[receiver] = get_receiver_reception(receiver, signal)
|
||||
|
||||
return receptions
|
||||
@@ -540,3 +540,16 @@ Class Procs:
|
||||
// Stub for above proc. Implemented on exosuit fabricators and prosthetics fabricators.
|
||||
/obj/machinery/proc/refresh_queue()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/proc/get_multitool(mob/user)
|
||||
var/obj/item/multitool/P = null
|
||||
if (!issilicon(user) && istype(user.get_active_hand(), /obj/item/multitool))
|
||||
P = user.get_active_hand()
|
||||
else if (isAI(user))
|
||||
var/mob/living/silicon/ai/U = user
|
||||
P = U.aiMulti
|
||||
else if (isrobot(user) && in_range(user, src))
|
||||
if (istype(user.get_active_hand(), /obj/item/multitool))
|
||||
P = user.get_active_hand()
|
||||
return P
|
||||
|
||||
@@ -103,22 +103,6 @@
|
||||
NEWSCASTER.newsAlert(annoncement)
|
||||
NEWSCASTER.update_icon()
|
||||
|
||||
// var/list/receiving_pdas = new
|
||||
// for (var/obj/item/pda/P in PDAs)
|
||||
// if(!P.owner)
|
||||
// continue
|
||||
// if(P.toff)
|
||||
// continue
|
||||
// receiving_pdas += P
|
||||
|
||||
// spawn(0) // get_receptions sleeps further down the line, spawn of elsewhere
|
||||
// var/datum/receptions/receptions = get_receptions(null, receiving_pdas) // datums are not atoms, thus we have to assume the newscast network always has reception
|
||||
|
||||
// for(var/obj/item/pda/PDA in receiving_pdas)
|
||||
// if(!(receptions.receiver_reception[PDA] & TELECOMMS_RECEPTION_RECEIVER))
|
||||
// continue
|
||||
|
||||
// PDA.new_news(annoncement)
|
||||
|
||||
var/global/datum/feed_network/news_network = new /datum/feed_network //The global news-network, which is coincidentally a global list.
|
||||
|
||||
|
||||
122
code/game/machinery/telecomms/allinone.dm
Normal file
122
code/game/machinery/telecomms/allinone.dm
Normal file
@@ -0,0 +1,122 @@
|
||||
/* All In One Telecomms Machine
|
||||
* Basically just an empty shell for receiving and broadcasting radio messages. Not
|
||||
* very flexible, but it gets the job done. Listens on *every* zlevel unless subtyped.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/allinone
|
||||
name = "Telecommunications Mainframe"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "allinone"
|
||||
desc = "A compact machine used for portable subspace telecommuniations processing."
|
||||
density = TRUE
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 20
|
||||
anchored = TRUE
|
||||
machinetype = 6
|
||||
produces_heat = FALSE
|
||||
var/list/linked_radios_weakrefs = list()
|
||||
var/intercept = FALSE // if nonzero, broadcasts all messages to syndicate channel
|
||||
var/overmap_range = 0
|
||||
|
||||
|
||||
/obj/machinery/telecomms/allinone/proc/link_radio(obj/item/radio/radio)
|
||||
if (!istype(radio))
|
||||
return
|
||||
linked_radios_weakrefs |= weakref(radio)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal)
|
||||
if (!on)
|
||||
return
|
||||
if (!using_map.use_overmap)
|
||||
return
|
||||
if (signal.data["done"])
|
||||
return
|
||||
var/map_levels = using_map.get_map_levels(z, TRUE, overmap_range)
|
||||
if (signal.transmission_method != TRANSMISSION_BLUESPACE)
|
||||
var/list/signal_levels = list()
|
||||
signal_levels += signal.data["level"]
|
||||
var/list/overlap = map_levels & signal_levels
|
||||
if (!length(overlap))
|
||||
return
|
||||
if(!is_freq_listening(signal))
|
||||
return
|
||||
signal.data["done"] = TRUE
|
||||
signal.data["compression"] = 0
|
||||
var/datum/signal/original = signal.data["original"]
|
||||
if (original)
|
||||
original.data["done"] = TRUE
|
||||
signal.data["level"] = map_levels
|
||||
if (signal.data["slow"] > 0)
|
||||
sleep(signal.data["slow"])
|
||||
var/datum/radio_frequency/connection = signal.data["connection"]
|
||||
var/list/forced_radios
|
||||
for (var/weakref/wr in linked_radios_weakrefs)
|
||||
var/obj/item/radio/radio = wr.resolve()
|
||||
if (istype(radio))
|
||||
LAZYDISTINCTADD(forced_radios, radio)
|
||||
Broadcast_Message(
|
||||
signal.data["connection"],
|
||||
signal.data["mob"],
|
||||
signal.data["vmask"],
|
||||
signal.data["vmessage"],
|
||||
signal.data["radio"],
|
||||
signal.data["message"],
|
||||
signal.data["name"],
|
||||
signal.data["job"],
|
||||
signal.data["realname"],
|
||||
signal.data["vname"],
|
||||
DATA_NORMAL,
|
||||
signal.data["compression"],
|
||||
signal.data["level"],
|
||||
connection.frequency,
|
||||
signal.data["verb"],
|
||||
signal.data["language"],
|
||||
forced_radios
|
||||
)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/allinone/antag
|
||||
use_power = USE_POWER_OFF
|
||||
idle_power_usage = 0
|
||||
|
||||
|
||||
/obj/machinery/telecomms/allinone/antag/receive_signal(datum/signal/signal)
|
||||
if (!on)
|
||||
return
|
||||
if (!is_freq_listening(signal))
|
||||
return
|
||||
signal.data["done"] = TRUE
|
||||
signal.data["compression"] = 0
|
||||
var/datum/signal/original = signal.data["original"]
|
||||
if (original)
|
||||
original.data["done"] = TRUE
|
||||
signal.data["level"] = using_map.contact_levels.Copy()
|
||||
if (signal.data["slow"] > 0)
|
||||
sleep(signal.data["slow"])
|
||||
var/datum/radio_frequency/connection = signal.data["connection"]
|
||||
var/list/forced_radios
|
||||
for (var/weakref/wr in linked_radios_weakrefs)
|
||||
var/obj/item/radio/radio = wr.resolve()
|
||||
if (istype(radio))
|
||||
LAZYDISTINCTADD(forced_radios, radio)
|
||||
if (connection.frequency in ANTAG_FREQS)
|
||||
Broadcast_Message(
|
||||
signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_NORMAL,
|
||||
signal.data["compression"], list(0), connection.frequency,
|
||||
signal.data["verb"], forced_radios
|
||||
)
|
||||
else if(intercept)
|
||||
Broadcast_Message(
|
||||
signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_ANTAG,
|
||||
signal.data["compression"], list(0), connection.frequency,
|
||||
signal.data["verb"], forced_radios
|
||||
)
|
||||
@@ -1,748 +1,112 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
/*
|
||||
The broadcaster sends processed messages to all radio devices in the game. They
|
||||
do not have to be headsets; intercoms and station-bounced radios suffice.
|
||||
|
||||
They receive their message from a server after the message has been logged.
|
||||
/* Telecomms Broadcaster
|
||||
* The broadcaster sends processed messages to all radio devices in the game. They
|
||||
* do not have to be headsets; intercoms and station-bounced radios suffice. They
|
||||
* receive their message from a server after the message has been logged.
|
||||
*/
|
||||
|
||||
var/global/list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam
|
||||
var/global/message_delay = 0 // To make sure restarting the recentmessages list is kept in sync
|
||||
|
||||
/obj/machinery/telecomms/broadcaster
|
||||
name = "Subspace Broadcaster"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "broadcaster"
|
||||
desc = "A dish-shaped machine used to broadcast processed subspace signals."
|
||||
density = 1
|
||||
anchored = 1
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 25
|
||||
machinetype = 5
|
||||
produces_heat = 0
|
||||
produces_heat = FALSE
|
||||
delay = 7
|
||||
circuit = /obj/item/circuitboard/telecomms/broadcaster
|
||||
//Vars only used if you're using the overmap
|
||||
interact_offline = TRUE
|
||||
var/list/linked_radios_weakrefs = list()
|
||||
var/overmap_range = 0
|
||||
var/overmap_range_min = 0
|
||||
var/overmap_range_max = 5
|
||||
//Linked bluespace radios
|
||||
var/list/linked_radios_weakrefs = list()
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/proc/link_radio(var/obj/item/radio/R)
|
||||
if(!istype(R))
|
||||
return
|
||||
linked_radios_weakrefs |= weakref(R)
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
|
||||
// Don't broadcast rejected signals
|
||||
if(signal.data["reject"])
|
||||
return
|
||||
|
||||
if(signal.data["message"])
|
||||
|
||||
// Prevents massive radio spam
|
||||
signal.data["done"] = 1 // mark the signal as being broadcasted
|
||||
// Search for the original signal and mark it as done as well
|
||||
var/datum/signal/original = signal.data["original"]
|
||||
if(original)
|
||||
original.data["done"] = 1
|
||||
original.data["compression"] = signal.data["compression"]
|
||||
original.data["level"] = signal.data["level"]
|
||||
|
||||
var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["realname"]]"
|
||||
if(signal_message in recentmessages)
|
||||
return
|
||||
recentmessages.Add(signal_message)
|
||||
|
||||
if(signal.data["slow"] > 0)
|
||||
sleep(signal.data["slow"]) // simulate the network lag if necessary
|
||||
|
||||
signal.data["level"] |= using_map.get_map_levels(listening_level, TRUE, overmap_range)
|
||||
|
||||
var/list/forced_radios
|
||||
for(var/weakref/wr in linked_radios_weakrefs)
|
||||
var/obj/item/radio/R = wr.resolve()
|
||||
if(istype(R))
|
||||
LAZYDISTINCTADD(forced_radios, R)
|
||||
|
||||
/** #### - Normal Broadcast - #### **/
|
||||
if(signal.data["type"] == SIGNAL_NORMAL)
|
||||
/* ###### Broadcast a message using signal.data ###### */
|
||||
Broadcast_Message(signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_NORMAL,
|
||||
signal.data["compression"], signal.data["level"], signal.frequency,
|
||||
signal.data["verb"], forced_radios)
|
||||
|
||||
/** #### - Simple Broadcast - #### **/
|
||||
|
||||
if(signal.data["type"] == SIGNAL_SIMPLE)
|
||||
|
||||
/* ###### Broadcast a message using signal.data ###### */
|
||||
Broadcast_SimpleMessage(signal.data["name"], signal.frequency,
|
||||
signal.data["message"], DATA_NORMAL, null,
|
||||
signal.data["compression"], listening_level, forced_radios)
|
||||
|
||||
|
||||
/** #### - Artificial Broadcast - #### **/
|
||||
// (Imitates a mob)
|
||||
|
||||
if(signal.data["type"] == SIGNAL_FAKE)
|
||||
|
||||
/* ###### Broadcast a message using signal.data ###### */
|
||||
// Parameter "data" as DATA_FAKE: AI can't track this person/mob
|
||||
|
||||
Broadcast_Message(signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_FAKE,
|
||||
signal.data["compression"], signal.data["level"], signal.frequency,
|
||||
signal.data["verb"], forced_radios)
|
||||
|
||||
if(!message_delay)
|
||||
message_delay = 1
|
||||
spawn(10)
|
||||
message_delay = 0
|
||||
recentmessages = list()
|
||||
|
||||
/* --- Do a snazzy animation! --- */
|
||||
flick("broadcaster_send", src)
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/Destroy()
|
||||
// In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore.
|
||||
if(message_delay)
|
||||
if (message_delay)
|
||||
message_delay = 0
|
||||
..()
|
||||
return ..()
|
||||
|
||||
|
||||
/*
|
||||
Basically just an empty shell for receiving and broadcasting radio messages. Not
|
||||
very flexible, but it gets the job done.
|
||||
NOTE: This AIO device listens on *every* zlevel (it does not even check)
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/allinone
|
||||
name = "Telecommunications Mainframe"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "allinone"
|
||||
desc = "A compact machine used for portable subspace telecommuniations processing."
|
||||
density = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 20
|
||||
anchored = 1
|
||||
machinetype = 6
|
||||
produces_heat = 0
|
||||
var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel
|
||||
var/overmap_range = 0 //Same turf
|
||||
|
||||
var/list/linked_radios_weakrefs = list()
|
||||
|
||||
/obj/machinery/telecomms/allinone/proc/link_radio(var/obj/item/radio/R)
|
||||
if(!istype(R))
|
||||
/obj/machinery/telecomms/broadcaster/proc/link_radio(obj/item/radio/radio)
|
||||
if (!istype(radio))
|
||||
return
|
||||
linked_radios_weakrefs |= weakref(R)
|
||||
linked_radios_weakrefs |= weakref(radio)
|
||||
|
||||
/obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal)
|
||||
|
||||
// Has to be on to receive messages
|
||||
if(!on)
|
||||
/obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/sender)
|
||||
if (signal.data["reject"])
|
||||
return
|
||||
|
||||
// Why did you use this subtype?
|
||||
if(!using_map.use_overmap)
|
||||
if (!signal.data["message"])
|
||||
return
|
||||
|
||||
// Someone else handling it?
|
||||
if(signal.data["done"])
|
||||
signal.data["done"] = TRUE
|
||||
var/datum/signal/original = signal.data["original"]
|
||||
if (original)
|
||||
original.data["done"] = TRUE
|
||||
original.data["compression"] = signal.data["compression"]
|
||||
original.data["level"] = signal.data["level"]
|
||||
var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["realname"]]"
|
||||
if (signal_message in recentmessages)
|
||||
return
|
||||
|
||||
// Where are we able to hear from (and talk to, since we're AIO) anyway?
|
||||
var/map_levels = using_map.get_map_levels(z, TRUE, overmap_range)
|
||||
|
||||
//Bluespace can skip this check
|
||||
if(signal.transmission_method != TRANSMISSION_BLUESPACE)
|
||||
var/list/signal_levels = list()
|
||||
signal_levels += signal.data["level"] //If it's text/number, it'll be the only entry, if it's a list, it'll get combined
|
||||
var/list/overlap = map_levels & signal_levels //Returns a list of similar levels
|
||||
if(!overlap.len)
|
||||
return
|
||||
|
||||
if(is_freq_listening(signal)) // detect subspace signals
|
||||
|
||||
signal.data["done"] = 1 // mark the signal as being broadcasted since we're a broadcaster
|
||||
signal.data["compression"] = 0 // decompress since we're a processor
|
||||
|
||||
// Search for the original signal and mark it as done as well
|
||||
var/datum/signal/original = signal.data["original"]
|
||||
if(original)
|
||||
original.data["done"] = 1
|
||||
|
||||
// For some reason level is both used as a list and not a list, and now it needs to be a list.
|
||||
signal.data["level"] = map_levels
|
||||
|
||||
if(signal.data["slow"] > 0)
|
||||
sleep(signal.data["slow"]) // simulate the network lag if necessary
|
||||
|
||||
/* ###### Broadcast a message using signal.data ###### */
|
||||
|
||||
var/datum/radio_frequency/connection = signal.data["connection"]
|
||||
|
||||
var/list/forced_radios
|
||||
for(var/weakref/wr in linked_radios_weakrefs)
|
||||
var/obj/item/radio/R = wr.resolve()
|
||||
if(istype(R))
|
||||
LAZYDISTINCTADD(forced_radios, R)
|
||||
|
||||
recentmessages += signal_message
|
||||
if (signal.data["slow"] > 0)
|
||||
sleep(signal.data["slow"])
|
||||
signal.data["level"] |= using_map.get_map_levels(listening_level, TRUE, overmap_range)
|
||||
var/list/forced_radios
|
||||
for (var/weakref/wr in linked_radios_weakrefs)
|
||||
var/obj/item/radio/R = wr.resolve()
|
||||
if (istype(R))
|
||||
LAZYDISTINCTADD(forced_radios, R)
|
||||
if (signal.data["type"] == SIGNAL_NORMAL)
|
||||
Broadcast_Message(
|
||||
signal.data["connection"],
|
||||
signal.data["mob"],
|
||||
signal.data["vmask"],
|
||||
signal.data["vmessage"],
|
||||
signal.data["radio"],
|
||||
signal.data["message"],
|
||||
signal.data["name"],
|
||||
signal.data["job"],
|
||||
signal.data["realname"],
|
||||
signal.data["vname"],
|
||||
DATA_NORMAL,
|
||||
signal.data["compression"],
|
||||
signal.data["level"],
|
||||
connection.frequency,
|
||||
signal.data["verb"],
|
||||
signal.data["language"],
|
||||
forced_radios
|
||||
signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_NORMAL,
|
||||
signal.data["compression"], signal.data["level"], signal.frequency,
|
||||
signal.data["verb"], forced_radios
|
||||
)
|
||||
|
||||
//Antag version with unlimited range (doesn't even check) and uses no power, to enable antag comms to work anywhere.
|
||||
/obj/machinery/telecomms/allinone/antag
|
||||
use_power = USE_POWER_OFF
|
||||
idle_power_usage = 0
|
||||
|
||||
/obj/machinery/telecomms/allinone/antag/receive_signal(datum/signal/signal)
|
||||
if(!on) // has to be on to receive messages
|
||||
return
|
||||
|
||||
if(is_freq_listening(signal)) // detect subspace signals
|
||||
|
||||
signal.data["done"] = 1 // mark the signal as being broadcasted
|
||||
signal.data["compression"] = 0
|
||||
|
||||
// Search for the original signal and mark it as done as well
|
||||
var/datum/signal/original = signal.data["original"]
|
||||
if(original)
|
||||
original.data["done"] = 1
|
||||
|
||||
// For some reason level is both used as a list and not a list, and now it needs to be a list.
|
||||
// Because this is a 'all in one' machine, we're gonna just cheat.
|
||||
signal.data["level"] = using_map.contact_levels.Copy()
|
||||
|
||||
if(signal.data["slow"] > 0)
|
||||
sleep(signal.data["slow"]) // simulate the network lag if necessary
|
||||
|
||||
/* ###### Broadcast a message using signal.data ###### */
|
||||
|
||||
var/datum/radio_frequency/connection = signal.data["connection"]
|
||||
|
||||
var/list/forced_radios
|
||||
for(var/weakref/wr in linked_radios_weakrefs)
|
||||
var/obj/item/radio/R = wr.resolve()
|
||||
if(istype(R))
|
||||
LAZYDISTINCTADD(forced_radios, R)
|
||||
|
||||
if(connection.frequency in ANTAG_FREQS) // if antag broadcast, just
|
||||
Broadcast_Message(signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_NORMAL,
|
||||
signal.data["compression"], list(0), connection.frequency,
|
||||
signal.data["verb"], forced_radios)
|
||||
else
|
||||
if(intercept)
|
||||
Broadcast_Message(signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_ANTAG,
|
||||
signal.data["compression"], list(0), connection.frequency,
|
||||
signal.data["verb"], forced_radios)
|
||||
|
||||
/**
|
||||
|
||||
Here is the big, bad function that broadcasts a message given the appropriate
|
||||
parameters.
|
||||
|
||||
@param connection:
|
||||
The datum generated in radio.dm, stored in signal.data["connection"].
|
||||
|
||||
@param M:
|
||||
Reference to the mob/speaker, stored in signal.data["mob"]
|
||||
|
||||
@param vmask:
|
||||
Boolean value if the mob is "hiding" its identity via voice mask, stored in
|
||||
signal.data["vmask"]
|
||||
|
||||
@param vmessage:
|
||||
If specified, will display this as the message; such as "chimpering"
|
||||
for monkies if the mob is not understood. Stored in signal.data["vmessage"].
|
||||
|
||||
@param radio:
|
||||
Reference to the radio broadcasting the message, stored in signal.data["radio"]
|
||||
|
||||
@param message:
|
||||
The actual string message to display to mobs who understood mob M. Stored in
|
||||
signal.data["message"]
|
||||
|
||||
@param name:
|
||||
The name to display when a mob receives the message. signal.data["name"]
|
||||
|
||||
@param job:
|
||||
The name job to display for the AI when it receives the message. signal.data["job"]
|
||||
|
||||
@param realname:
|
||||
The "real" name associated with the mob. signal.data["realname"]
|
||||
|
||||
@param vname:
|
||||
If specified, will use this name when mob M is not understood. signal.data["vname"]
|
||||
|
||||
@param data:
|
||||
If specified:
|
||||
1 -- Will only broadcast to intercoms
|
||||
2 -- Will only broadcast to intercoms and station-bounced radios
|
||||
3 -- Broadcast to syndicate frequency
|
||||
4 -- AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob
|
||||
|
||||
@param compression:
|
||||
If 0, the signal is audible
|
||||
If nonzero, the signal may be partially inaudible or just complete gibberish.
|
||||
|
||||
@param level:
|
||||
The list of Z levels that the sending radio is broadcasting to. Having 0 in the list broadcasts on all levels
|
||||
|
||||
@param freq
|
||||
The frequency of the signal
|
||||
|
||||
**/
|
||||
|
||||
/proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M,
|
||||
var/vmask, var/list/vmessage_pieces, var/obj/item/radio/radio,
|
||||
var/list/message_pieces, var/name, var/job, var/realname, var/vname,
|
||||
var/data, var/compression, var/list/level, var/freq, var/verbage = "says",
|
||||
var/list/forced_radios)
|
||||
|
||||
/* ###### Prepare the radio connection ###### */
|
||||
|
||||
var/display_freq = freq
|
||||
|
||||
var/list/obj/item/radio/radios = list()
|
||||
|
||||
for(var/obj/item/radio/R in forced_radios)
|
||||
//Cursory check to ensure they are 'on' and stuff
|
||||
if(R.receive_range(display_freq, list(0)) > -1)
|
||||
radios |= R
|
||||
|
||||
// --- Broadcast only to intercom devices ---
|
||||
|
||||
if(data == DATA_INTERCOM)
|
||||
|
||||
for (var/obj/item/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
|
||||
if(R.receive_range(display_freq, level) > -1)
|
||||
radios |= R
|
||||
|
||||
// --- Broadcast only to intercoms and station-bounced radios ---
|
||||
|
||||
else if(data == DATA_LOCAL)
|
||||
|
||||
for (var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||
|
||||
if(istype(R, /obj/item/radio/headset) && !R.adhoc_fallback)
|
||||
continue
|
||||
|
||||
if(R.receive_range(display_freq, level) > -1)
|
||||
radios |= R
|
||||
|
||||
// --- Broadcast to antag radios! ---
|
||||
|
||||
else if(data == DATA_ANTAG)
|
||||
for(var/antag_freq in ANTAG_FREQS)
|
||||
var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(antag_freq)
|
||||
for (var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"])
|
||||
if(R.receive_range(antag_freq, level) > -1)
|
||||
radios |= R
|
||||
|
||||
// --- Broadcast to ALL radio devices ---
|
||||
|
||||
else
|
||||
|
||||
for (var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||
if(R.receive_range(display_freq, level) > -1)
|
||||
radios |= R
|
||||
|
||||
// Get a list of mobs who can hear from the radios we collected.
|
||||
var/list/receive = get_mobs_in_radio_ranges(radios)
|
||||
|
||||
/* ###### Organize the receivers into categories for displaying the message ###### */
|
||||
|
||||
// Understood the message:
|
||||
var/list/heard_masked = list() // masked name or no real name
|
||||
var/list/heard_normal = list() // normal message
|
||||
|
||||
// Did not understand the message:
|
||||
var/list/heard_voice = list() // voice message (ie "chimpers")
|
||||
var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
|
||||
var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
|
||||
|
||||
for (var/mob/R in receive)
|
||||
|
||||
/* --- Loop through the receivers and categorize them --- */
|
||||
if(!R.is_preference_enabled(/datum/client_preference/holder/hear_radio))
|
||||
continue
|
||||
|
||||
if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
|
||||
continue
|
||||
|
||||
// Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates
|
||||
if(data == DATA_ANTAG && istype(R, /mob/observer/dead) && R.is_preference_enabled(/datum/client_preference/ghost_radio))
|
||||
continue
|
||||
|
||||
// --- Check for compression ---
|
||||
if(compression > 0)
|
||||
heard_gibberish += R
|
||||
continue
|
||||
|
||||
// --- Can understand the speech ---
|
||||
|
||||
if(!M || R.say_understands(M))
|
||||
|
||||
// - Not human or wearing a voice mask -
|
||||
if(!M || !ishuman(M) || vmask)
|
||||
heard_masked += R
|
||||
|
||||
// - Human and not wearing voice mask -
|
||||
else
|
||||
heard_normal += R
|
||||
|
||||
// --- Can't understand the speech ---
|
||||
|
||||
else
|
||||
// - The speaker has a prespecified "voice message" to display if not understood -
|
||||
if(vmessage_pieces)
|
||||
heard_voice += R
|
||||
|
||||
// - Just display a garbled message -
|
||||
else
|
||||
heard_garbled += R
|
||||
|
||||
|
||||
/* ###### Begin formatting and sending the message ###### */
|
||||
if(length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
|
||||
|
||||
/* --- Some miscellaneous variables to format the string output --- */
|
||||
var/freq_text = get_frequency_name(display_freq)
|
||||
|
||||
var/part_b_extra = ""
|
||||
if(data == DATA_ANTAG) // intercepted radio message
|
||||
part_b_extra = " <i>(Intercepted)</i>"
|
||||
var/part_a = "<span class='[frequency_span_class(display_freq)]'>"
|
||||
var/part_b = "[bicon(radio)]<b>\[[freq_text]\][part_b_extra]</b> <span class='name'>" // goes in the actual output
|
||||
|
||||
// --- Some more pre-message formatting ---
|
||||
var/part_c = "</span> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/part_d = "</span>"
|
||||
var/part_e = "</span>"
|
||||
|
||||
|
||||
// --- Filter the message; place it in quotes apply a verb ---
|
||||
var/quotedmsg = null
|
||||
if(M)
|
||||
quotedmsg = "[M.say_quote(multilingual_to_message(message_pieces))], \"[multilingual_to_message(message_pieces)]\""
|
||||
else
|
||||
quotedmsg = "says, \"[multilingual_to_message(message_pieces)]\""
|
||||
|
||||
// --- This following recording is intended for research and feedback in the use of department radio channels ---
|
||||
|
||||
var/part_blackbox_c = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/blackbox_msg = "[part_a][part_b][name][part_blackbox_c][quotedmsg][part_d][part_e]"
|
||||
//var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
|
||||
|
||||
//BR.messages_admin += blackbox_admin_msg
|
||||
if(istype(blackbox))
|
||||
switch(display_freq)
|
||||
if(PUB_FREQ)
|
||||
blackbox.msg_common += blackbox_msg
|
||||
if(SCI_FREQ)
|
||||
blackbox.msg_science += blackbox_msg
|
||||
if(COMM_FREQ)
|
||||
blackbox.msg_command += blackbox_msg
|
||||
if(MED_FREQ)
|
||||
blackbox.msg_medical += blackbox_msg
|
||||
if(ENG_FREQ)
|
||||
blackbox.msg_engineering += blackbox_msg
|
||||
if(SEC_FREQ)
|
||||
blackbox.msg_security += blackbox_msg
|
||||
if(DTH_FREQ)
|
||||
blackbox.msg_deathsquad += blackbox_msg
|
||||
if(SYND_FREQ)
|
||||
blackbox.msg_syndicate += blackbox_msg
|
||||
if(RAID_FREQ)
|
||||
blackbox.msg_raider += blackbox_msg
|
||||
if(SUP_FREQ)
|
||||
blackbox.msg_cargo += blackbox_msg
|
||||
if(SRV_FREQ)
|
||||
blackbox.msg_service += blackbox_msg
|
||||
if(EXP_FREQ)
|
||||
blackbox.msg_explorer += blackbox_msg
|
||||
else
|
||||
blackbox.messages += blackbox_msg
|
||||
|
||||
//End of research and feedback code.
|
||||
|
||||
/* ###### Send the message ###### */
|
||||
/* --- Process all the mobs that heard a masked voice (understood) --- */
|
||||
if(length(heard_masked))
|
||||
for (var/mob/R in heard_masked)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 0, name)
|
||||
|
||||
/* --- Process all the mobs that heard the voice normally (understood) --- */
|
||||
if(length(heard_normal))
|
||||
for (var/mob/R in heard_normal)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 0, realname)
|
||||
|
||||
/* --- Process all the mobs that heard the voice normally (did not understand) --- */
|
||||
if(length(heard_voice))
|
||||
for (var/mob/R in heard_voice)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M,0, vname)
|
||||
|
||||
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
|
||||
// Displays garbled message (ie "f*c* **u, **i*er!")
|
||||
if(length(heard_garbled))
|
||||
for (var/mob/R in heard_garbled)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 1, vname)
|
||||
|
||||
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
|
||||
if(length(heard_gibberish))
|
||||
for (var/mob/R in heard_gibberish)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 1)
|
||||
|
||||
return 1
|
||||
|
||||
/proc/Broadcast_SimpleMessage(var/source, var/frequency, list/message_pieces, var/data, var/mob/M, var/compression, var/level, var/list/forced_radios)
|
||||
var/text = multilingual_to_message(message_pieces)
|
||||
/* ###### Prepare the radio connection ###### */
|
||||
|
||||
if(!M)
|
||||
var/mob/living/carbon/human/H = new
|
||||
M = H
|
||||
|
||||
var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency)
|
||||
|
||||
var/display_freq = connection.frequency
|
||||
|
||||
var/list/receive = list()
|
||||
|
||||
for(var/obj/item/radio/R in forced_radios)
|
||||
receive |= R.send_hear(display_freq)
|
||||
|
||||
// --- Broadcast only to intercom devices ---
|
||||
|
||||
if(data == DATA_INTERCOM)
|
||||
for (var/obj/item/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
|
||||
var/turf/position = get_turf(R)
|
||||
if(position && position.z == level)
|
||||
receive |= R.send_hear(display_freq, level)
|
||||
|
||||
|
||||
// --- Broadcast only to intercoms and station-bounced radios ---
|
||||
|
||||
else if(data == DATA_LOCAL)
|
||||
for (var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||
|
||||
if(istype(R, /obj/item/radio/headset))
|
||||
continue
|
||||
var/turf/position = get_turf(R)
|
||||
if(position && position.z == level)
|
||||
receive |= R.send_hear(display_freq)
|
||||
|
||||
|
||||
// --- Broadcast to antag radios! ---
|
||||
|
||||
else if(data == DATA_ANTAG)
|
||||
for(var/freq in ANTAG_FREQS)
|
||||
var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(freq)
|
||||
for (var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"])
|
||||
var/turf/position = get_turf(R)
|
||||
if(position && position.z == level)
|
||||
receive |= R.send_hear(freq)
|
||||
|
||||
|
||||
// --- Broadcast to ALL radio devices ---
|
||||
|
||||
else
|
||||
for (var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||
var/turf/position = get_turf(R)
|
||||
if(position && position.z == level)
|
||||
receive |= R.send_hear(display_freq)
|
||||
|
||||
|
||||
/* ###### Organize the receivers into categories for displaying the message ###### */
|
||||
|
||||
// Understood the message:
|
||||
var/list/heard_normal = list() // normal message
|
||||
|
||||
// Did not understand the message:
|
||||
var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
|
||||
var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
|
||||
|
||||
for (var/mob/R in receive)
|
||||
|
||||
/* --- Loop through the receivers and categorize them --- */
|
||||
|
||||
if(!R.is_preference_enabled(/datum/client_preference/holder/hear_radio)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
|
||||
continue
|
||||
|
||||
|
||||
// --- Check for compression ---
|
||||
if(compression > 0)
|
||||
|
||||
heard_gibberish += R
|
||||
continue
|
||||
|
||||
// --- Can understand the speech ---
|
||||
|
||||
if(R.say_understands(M))
|
||||
|
||||
heard_normal += R
|
||||
|
||||
// --- Can't understand the speech ---
|
||||
|
||||
else
|
||||
// - Just display a garbled message -
|
||||
|
||||
heard_garbled += R
|
||||
|
||||
|
||||
/* ###### Begin formatting and sending the message ###### */
|
||||
if(length(heard_normal) || length(heard_garbled) || length(heard_gibberish))
|
||||
|
||||
/* --- Some miscellaneous variables to format the string output --- */
|
||||
var/part_a = "<span class='[frequency_span_class(display_freq)]'><span class='name'>" // goes in the actual output
|
||||
var/freq_text = get_frequency_name(display_freq)
|
||||
|
||||
// --- Some more pre-message formatting ---
|
||||
|
||||
var/part_b_extra = ""
|
||||
if(data == DATA_ANTAG) // intercepted radio message
|
||||
part_b_extra = " <i>(Intercepted)</i>"
|
||||
|
||||
// Create a radio headset for the sole purpose of using its icon
|
||||
var/obj/item/radio/headset/radio = new
|
||||
|
||||
var/part_b = "</span><b> [bicon(radio)]\[[freq_text]\][part_b_extra]</b> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/part_c = "</span></span>"
|
||||
|
||||
var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]"
|
||||
|
||||
//BR.messages_admin += blackbox_admin_msg
|
||||
if(istype(blackbox))
|
||||
switch(display_freq)
|
||||
if(PUB_FREQ)
|
||||
blackbox.msg_common += blackbox_msg
|
||||
if(SCI_FREQ)
|
||||
blackbox.msg_science += blackbox_msg
|
||||
if(COMM_FREQ)
|
||||
blackbox.msg_command += blackbox_msg
|
||||
if(MED_FREQ)
|
||||
blackbox.msg_medical += blackbox_msg
|
||||
if(ENG_FREQ)
|
||||
blackbox.msg_engineering += blackbox_msg
|
||||
if(SEC_FREQ)
|
||||
blackbox.msg_security += blackbox_msg
|
||||
if(DTH_FREQ)
|
||||
blackbox.msg_deathsquad += blackbox_msg
|
||||
if(SYND_FREQ)
|
||||
blackbox.msg_syndicate += blackbox_msg
|
||||
if(RAID_FREQ)
|
||||
blackbox.msg_raider += blackbox_msg
|
||||
if(SUP_FREQ)
|
||||
blackbox.msg_cargo += blackbox_msg
|
||||
if(SRV_FREQ)
|
||||
blackbox.msg_service += blackbox_msg
|
||||
else
|
||||
blackbox.messages += blackbox_msg
|
||||
|
||||
//End of research and feedback code.
|
||||
|
||||
/* ###### Send the message ###### */
|
||||
|
||||
/* --- Process all the mobs that heard the voice normally (understood) --- */
|
||||
|
||||
if(length(heard_normal))
|
||||
var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]"
|
||||
|
||||
for (var/mob/R in heard_normal)
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
|
||||
// Displays garbled message (ie "f*c* **u, **i*er!")
|
||||
|
||||
if(length(heard_garbled))
|
||||
var/quotedmsg = "\"[stars(text)]\""
|
||||
var/rendered = "[part_a][source][part_b][quotedmsg][part_c]"
|
||||
|
||||
for (var/mob/R in heard_garbled)
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
|
||||
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
|
||||
|
||||
if(length(heard_gibberish))
|
||||
var/quotedmsg = "\"[Gibberish(text, compression + 50)]\""
|
||||
var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]"
|
||||
|
||||
for (var/mob/R in heard_gibberish)
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
//Use this to test if an obj can communicate with a Telecommunications Network
|
||||
|
||||
/atom/proc/test_telecomms()
|
||||
var/datum/signal/signal = src.telecomms_process()
|
||||
var/pos_z = get_z(src)
|
||||
return (pos_z in signal.data["level"] && signal.data["done"])
|
||||
|
||||
/atom/proc/telecomms_process(var/do_sleep = 1)
|
||||
|
||||
// First, we want to generate a new radio signal
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = TRANSMISSION_SUBSPACE
|
||||
var/pos_z = get_z(src)
|
||||
|
||||
// --- Finally, tag the actual signal with the appropriate values ---
|
||||
signal.data = list(
|
||||
"slow" = 0, // how much to sleep() before broadcasting - simulates net lag
|
||||
"message" = "TEST",
|
||||
"compression" = rand(45, 50), // If the signal is compressed, compress our message too.
|
||||
"traffic" = 0, // dictates the total traffic sum that the signal went through
|
||||
"type" = SIGNAL_TEST, // determines what type of radio input it is: test broadcast
|
||||
"reject" = 0,
|
||||
"done" = 0,
|
||||
"level" = pos_z // The level it is being broadcasted at.
|
||||
)
|
||||
signal.frequency = PUB_FREQ// Common channel
|
||||
|
||||
//#### Sending the signal to all subspace receivers ####//
|
||||
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
|
||||
R.receive_signal(signal)
|
||||
|
||||
if(do_sleep)
|
||||
sleep(rand(10,25))
|
||||
|
||||
//to_world_log("Level: [signal.data["level"]] - Done: [signal.data["done"]]")
|
||||
|
||||
return signal
|
||||
|
||||
if (signal.data["type"] == SIGNAL_SIMPLE)
|
||||
Broadcast_SimpleMessage(
|
||||
signal.data["name"], signal.frequency,
|
||||
signal.data["message"], DATA_NORMAL, null,
|
||||
signal.data["compression"], listening_level, forced_radios
|
||||
)
|
||||
if (signal.data["type"] == SIGNAL_FAKE)
|
||||
Broadcast_Message( // Uses DATA_FAKE to prevent AI from tracking the source
|
||||
signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_FAKE,
|
||||
signal.data["compression"], signal.data["level"], signal.frequency,
|
||||
signal.data["verb"], forced_radios
|
||||
)
|
||||
if (!message_delay)
|
||||
message_delay = TRUE
|
||||
spawn(10)
|
||||
message_delay = FALSE
|
||||
recentmessages = list()
|
||||
flick("broadcaster_send", src)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/OptionsMenu()
|
||||
var/list/data = ..()
|
||||
data["use_broadcast_range"] = TRUE
|
||||
data["range"] = overmap_range
|
||||
data["minRange"] = overmap_range_min
|
||||
data["maxRange"] = overmap_range_max
|
||||
return data
|
||||
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/OptionsHandler(action, params)
|
||||
if (..())
|
||||
return TRUE
|
||||
switch (action)
|
||||
if ("range")
|
||||
var/new_range = params["range"]
|
||||
overmap_range = clamp(new_range, overmap_range_min, overmap_range_max)
|
||||
update_idle_power_usage(initial(idle_power_usage)**(overmap_range+1))
|
||||
|
||||
71
code/game/machinery/telecomms/bus.dm
Normal file
71
code/game/machinery/telecomms/bus.dm
Normal file
@@ -0,0 +1,71 @@
|
||||
/* Telecomms Bus
|
||||
* The bus mainframe idles and waits for hubs to relay them signals. They act
|
||||
* as junctions for the network. They transfer uncompressed subspace packets
|
||||
* to processor units, and then take the processed packet to a server for
|
||||
* logging. Link to a subspace hub if it can't send to a server.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/bus
|
||||
name = "Bus Mainframe"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "bus"
|
||||
desc = "A mighty piece of hardware used to send massive amounts of data quickly."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 1000
|
||||
machinetype = 2
|
||||
circuit = /obj/item/circuitboard/telecomms/bus
|
||||
netspeed = 40
|
||||
var/change_frequency = 0
|
||||
|
||||
|
||||
/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/sender)
|
||||
if (!is_freq_listening(signal))
|
||||
return
|
||||
if (change_frequency)
|
||||
signal.frequency = change_frequency
|
||||
if (sender != src && !istype(sender, /obj/machinery/telecomms/processor))
|
||||
var/send_success = relay_information(signal, /obj/machinery/telecomms/processor)
|
||||
if (send_success)
|
||||
return
|
||||
signal.data["slow"] += rand(1, 5)
|
||||
receive_information(signal, src)
|
||||
var/list/attempt_types = list(
|
||||
/obj/machinery/telecomms/server,
|
||||
/obj/machinery/telecomms/hub,
|
||||
/obj/machinery/telecomms/broadcaster,
|
||||
/obj/machinery/telecomms/bus
|
||||
)
|
||||
for (var/i = 1 to length(attempt_types))
|
||||
var/send_success = relay_information(signal, attempt_types[i])
|
||||
if (send_success)
|
||||
return
|
||||
signal.data["slow"] += rand(0, 1)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/bus/OptionsMenu()
|
||||
var/list/data = ..()
|
||||
data["use_change_freq"] = TRUE
|
||||
data["change_freq"] = change_frequency
|
||||
return data
|
||||
|
||||
|
||||
/obj/machinery/telecomms/bus/OptionsHandler(action, params)
|
||||
if (..())
|
||||
return TRUE
|
||||
switch (action)
|
||||
if ("change_freq")
|
||||
. = TRUE
|
||||
var/newfreq = input(usr, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null | num
|
||||
if (!canAccess(usr))
|
||||
return
|
||||
if (newfreq)
|
||||
if (findtext(num2text(newfreq), "."))
|
||||
newfreq *= 10
|
||||
if (newfreq < 10000)
|
||||
change_frequency = newfreq
|
||||
set_temp("-% New frequency to change to assigned: \"[newfreq] GHz\" %-", "average")
|
||||
else
|
||||
change_frequency = 0
|
||||
set_temp("-% Frequency changing deactivated %-", "average")
|
||||
32
code/game/machinery/telecomms/hub.dm
Normal file
32
code/game/machinery/telecomms/hub.dm
Normal file
@@ -0,0 +1,32 @@
|
||||
/* Telecomms Hub
|
||||
* The hub idles until it receives information. It then passes on that information
|
||||
* depending on where it came from. This is the heart of the Telecommunications
|
||||
* Network, sending information where it is needed. It mainly receives information
|
||||
* from long-distance Relays and then sends that information to be processed.
|
||||
* Afterwards it gets the uncompressed information from Servers/Buses and sends
|
||||
* that back to the relay, to then be broadcasted.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/hub
|
||||
name = "Telecommunication Hub"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "hub"
|
||||
desc = "A mighty piece of hardware used to send/receive massive amounts of data."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 1600
|
||||
machinetype = 7
|
||||
circuit = /obj/item/circuitboard/telecomms/hub
|
||||
long_range_link = TRUE
|
||||
netspeed = 40
|
||||
|
||||
|
||||
/obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/sender)
|
||||
if (!is_freq_listening(signal))
|
||||
return
|
||||
if (istype(sender, /obj/machinery/telecomms/receiver))
|
||||
relay_information(signal, /obj/machinery/telecomms/bus, TRUE)
|
||||
return
|
||||
relay_information(signal, /obj/machinery/telecomms/relay, TRUE)
|
||||
relay_information(signal, /obj/machinery/telecomms/broadcaster, TRUE)
|
||||
@@ -1,156 +1,131 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
/obj/machinery/computer/telecomms
|
||||
icon_keyboard = "tech_key"
|
||||
|
||||
/obj/machinery/computer/telecomms/server
|
||||
name = "Telecommunications Server Monitor"
|
||||
desc = "View communication logs here. Translation not guaranteed."
|
||||
icon_screen = "comm_logs"
|
||||
|
||||
var/list/servers = list() // the servers located by the computer
|
||||
var/obj/machinery/telecomms/server/SelectedServer
|
||||
icon_keyboard = "tech_key"
|
||||
circuit = /obj/item/circuitboard/comm_server
|
||||
|
||||
var/network = "NULL" // the network to probe
|
||||
var/list/temp = null // temporary feedback messages
|
||||
|
||||
var/universal_translate = 0 // set to 1 if it can translate nonhuman speech
|
||||
|
||||
req_access = list(access_tcomsat)
|
||||
var/list/servers = list() // the servers located by the computer
|
||||
var/obj/machinery/telecomms/server/SelectedServer
|
||||
var/network = "NULL" // the network to probe
|
||||
var/list/temp // temporary feedback messages
|
||||
var/universal_translate = FALSE // set to 1 if it can translate nonhuman speech
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/server/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["universal_translate"] = universal_translate
|
||||
data["network"] = network
|
||||
data["temp"] = temp
|
||||
|
||||
var/list/servers = list()
|
||||
for(var/obj/machinery/telecomms/T in src.servers)
|
||||
servers.Add(list(list(
|
||||
"id" = T.id,
|
||||
"name" = T.name,
|
||||
)))
|
||||
for(var/obj/machinery/telecomms/machine in servers)
|
||||
servers += list(list(
|
||||
"id" = machine.id,
|
||||
"name" = machine.name,
|
||||
))
|
||||
data["servers"] = servers
|
||||
|
||||
data["selectedServer"] = null
|
||||
if(SelectedServer)
|
||||
if (SelectedServer)
|
||||
data["selectedServer"] = list(
|
||||
"id" = SelectedServer.id,
|
||||
"totalTraffic" = SelectedServer.totaltraffic,
|
||||
)
|
||||
|
||||
var/list/logs = list()
|
||||
var/i = 0
|
||||
for(var/c in SelectedServer.log_entries)
|
||||
i++
|
||||
var/datum/comm_log_entry/C = c
|
||||
|
||||
// This is necessary to prevent leaking information to the clientside
|
||||
var/list/logs = list()
|
||||
for (var/datum/comm_log_entry/log as anything in SelectedServer.log_entries)
|
||||
var/static/list/acceptable_params = list("uspeech", "intelligible", "message", "name", "race", "job", "timecode")
|
||||
var/list/parameters = list()
|
||||
for(var/log_param in acceptable_params)
|
||||
parameters["[log_param]"] = C.parameters["[log_param]"]
|
||||
|
||||
logs.Add(list(list(
|
||||
"name" = C.name,
|
||||
"input_type" = C.input_type,
|
||||
"id" = i,
|
||||
for (var/log_param in acceptable_params)
|
||||
parameters["[log_param]"] = log.parameters["[log_param]"]
|
||||
logs += list(list(
|
||||
"name" = log.name,
|
||||
"input_type" = log.input_type,
|
||||
"id" = ++i,
|
||||
"parameters" = parameters,
|
||||
)))
|
||||
|
||||
))
|
||||
data["selectedServer"]["logs"] = logs
|
||||
|
||||
return data
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/server/attack_hand(mob/user)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
if (stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
tgui_interact(user)
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/server/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "TelecommsLogBrowser", name)
|
||||
if (!ui)
|
||||
ui = new (user, src, "TelecommsLogBrowser", name)
|
||||
ui.open()
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/server/tgui_act(action, params)
|
||||
if(..())
|
||||
if (..())
|
||||
return TRUE
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
switch(action)
|
||||
if("view")
|
||||
for(var/obj/machinery/telecomms/T in servers)
|
||||
if(T.id == params["id"])
|
||||
SelectedServer = T
|
||||
if ("view")
|
||||
for (var/obj/machinery/telecomms/machine in servers)
|
||||
if (machine.id == params["id"])
|
||||
SelectedServer = machine
|
||||
break
|
||||
. = TRUE
|
||||
|
||||
if("mainmenu")
|
||||
if ("mainmenu")
|
||||
SelectedServer = null
|
||||
. = TRUE
|
||||
|
||||
if("release")
|
||||
if ("release")
|
||||
servers = list()
|
||||
SelectedServer = null
|
||||
. = TRUE
|
||||
|
||||
if("scan")
|
||||
if(servers.len > 0)
|
||||
if ("scan")
|
||||
if (length(servers))
|
||||
set_temp("FAILED: CANNOT PROBE WHEN BUFFER FULL", "bad")
|
||||
return TRUE
|
||||
|
||||
for(var/obj/machinery/telecomms/server/T in range(25, src))
|
||||
if(T.network == network)
|
||||
servers.Add(T)
|
||||
|
||||
if(!servers.len)
|
||||
set_temp("FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\]", "bad")
|
||||
else
|
||||
for (var/obj/machinery/telecomms/server/server in range(25, src))
|
||||
if (server.network == network)
|
||||
servers += server
|
||||
if (length(servers))
|
||||
set_temp("[servers.len] SERVERS PROBED & BUFFERED", "good")
|
||||
else
|
||||
set_temp("FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\]", "bad")
|
||||
. = TRUE
|
||||
|
||||
if("delete")
|
||||
if(!allowed(usr) && !emagged)
|
||||
if ("delete")
|
||||
if (!allowed(usr) && !emagged)
|
||||
to_chat(usr, "<span class='warning'>ACCESS DENIED.</span>")
|
||||
return
|
||||
|
||||
if(SelectedServer)
|
||||
var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(params["id"])]
|
||||
set_temp("DELETED ENTRY: [D.name]", "bad")
|
||||
SelectedServer.log_entries.Remove(D)
|
||||
qdel(D)
|
||||
if (SelectedServer)
|
||||
var/datum/comm_log_entry/log = SelectedServer.log_entries[text2num(params["id"])]
|
||||
set_temp("DELETED ENTRY: [log.name]", "bad")
|
||||
SelectedServer.log_entries -= log
|
||||
qdel(log)
|
||||
else
|
||||
set_temp("FAILED: NO SELECTED MACHINE", "bad")
|
||||
. = TRUE
|
||||
|
||||
if("network")
|
||||
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
|
||||
|
||||
if(newnet && ((usr in range(1, src) || issilicon(usr))))
|
||||
if(length(newnet) > 15)
|
||||
if ("network")
|
||||
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null | text
|
||||
if (newnet && (issilicon(usr) || (usr in range(1, src))))
|
||||
if (length(newnet) > 15)
|
||||
set_temp("FAILED: NETWORK TAG STRING TOO LENGTHY", "bad")
|
||||
return TRUE
|
||||
network = newnet
|
||||
servers = list()
|
||||
set_temp("NEW NETWORK TAG SET IN ADDRESS \[[network]\]", "good")
|
||||
|
||||
. = TRUE
|
||||
|
||||
if("cleartemp")
|
||||
if ("cleartemp")
|
||||
temp = null
|
||||
. = TRUE
|
||||
|
||||
/obj/machinery/computer/telecomms/server/emag_act(var/remaining_charges, var/mob/user)
|
||||
if(!emagged)
|
||||
playsound(src, 'sound/effects/sparks4.ogg', 75, 1)
|
||||
emagged = 1
|
||||
to_chat(user, "<span class='notice'>You you disable the security protocols</span>")
|
||||
src.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/telecomms/server/proc/set_temp(var/text, var/color = "average")
|
||||
/obj/machinery/computer/telecomms/server/emag_act(remaining_charges, mob/user)
|
||||
if (emagged)
|
||||
return
|
||||
playsound(src, 'sound/effects/sparks4.ogg', 75, TRUE)
|
||||
emagged = TRUE
|
||||
to_chat(user, SPAN_NOTICE("You you disable the security protocols"))
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/server/proc/set_temp(text, color = "average")
|
||||
temp = list("color" = color, "text" = text)
|
||||
|
||||
@@ -1,386 +0,0 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
|
||||
/*
|
||||
|
||||
All telecommunications interactions:
|
||||
|
||||
*/
|
||||
|
||||
#define STATION_Z 1
|
||||
#define TELECOMM_Z 3
|
||||
|
||||
/obj/machinery/telecomms
|
||||
var/list/temp = null // output message
|
||||
|
||||
/obj/machinery/telecomms/attackby(obj/item/P as obj, mob/user as mob)
|
||||
|
||||
// Using a multitool lets you access the receiver's interface
|
||||
if(istype(P, /obj/item/multitool))
|
||||
attack_hand(user)
|
||||
|
||||
// REPAIRING: Use Nanopaste to repair 10-20 integrity points.
|
||||
if(istype(P, /obj/item/stack/nanopaste))
|
||||
var/obj/item/stack/nanopaste/T = P
|
||||
if (integrity < 100) //Damaged, let's repair!
|
||||
if (T.use(1))
|
||||
integrity = between(0, integrity + rand(10,20), 100)
|
||||
to_chat(usr, "You apply the Nanopaste to [src], repairing some of the damage.")
|
||||
else
|
||||
to_chat(usr, "This machine is already in perfect condition.")
|
||||
return
|
||||
|
||||
|
||||
if(default_deconstruction_screwdriver(user, P))
|
||||
return
|
||||
if(default_deconstruction_crowbar(user, P))
|
||||
return
|
||||
|
||||
/obj/machinery/telecomms/attack_ai(var/mob/user as mob)
|
||||
attack_hand(user)
|
||||
|
||||
/obj/machinery/telecomms/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["temp"] = temp
|
||||
data["on"] = on
|
||||
|
||||
data["id"] = null
|
||||
data["network"] = null
|
||||
data["autolinkers"] = FALSE
|
||||
data["shadowlink"] = FALSE
|
||||
data["options"] = list()
|
||||
data["linked"] = list()
|
||||
data["filter"] = list()
|
||||
data["multitool"] = FALSE
|
||||
data["multitool_buffer"] = null
|
||||
|
||||
if(on || interact_offline)
|
||||
data["id"] = id
|
||||
data["network"] = network
|
||||
data["autolinkers"] = !!LAZYLEN(autolinkers)
|
||||
data["shadowlink"] = !!hide
|
||||
|
||||
data["options"] = Options_Menu()
|
||||
|
||||
var/obj/item/multitool/P = get_multitool(user)
|
||||
data["multitool"] = !!P
|
||||
data["multitool_buffer"] = null
|
||||
if(P && P.buffer)
|
||||
P.update_icon()
|
||||
data["multitool_buffer"] = list("name" = "[P.buffer]", "id" = "[P.buffer.id]")
|
||||
|
||||
var/i = 0
|
||||
var/list/linked = list()
|
||||
for(var/obj/machinery/telecomms/T in links)
|
||||
i++
|
||||
linked.Add(list(list(
|
||||
"ref" = "\ref[T]",
|
||||
"name" = "[T]",
|
||||
"id" = T.id,
|
||||
"index" = i,
|
||||
)))
|
||||
data["linked"] = linked
|
||||
|
||||
var/list/filter = list()
|
||||
if(LAZYLEN(freq_listening))
|
||||
for(var/x in freq_listening)
|
||||
filter.Add(list(list(
|
||||
"name" = "[format_frequency(x)]",
|
||||
"freq" = x,
|
||||
)))
|
||||
data["filter"] = filter
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/telecomms/tgui_status(mob/user)
|
||||
if(!issilicon(user))
|
||||
if(!istype(user.get_active_hand(), /obj/item/multitool))
|
||||
return STATUS_CLOSE
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/telecomms/attack_hand(var/mob/user as mob)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/telecomms/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "TelecommsMultitoolMenu", name)
|
||||
ui.open()
|
||||
|
||||
// Off-Site Relays
|
||||
//
|
||||
// You are able to send/receive signals from the station's z level (changeable in the STATION_Z #define) if
|
||||
// the relay is on the telecomm satellite (changable in the TELECOMM_Z #define)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/proc/toggle_level()
|
||||
|
||||
var/turf/position = get_turf(src)
|
||||
|
||||
// Toggle on/off getting signals from the station or the current Z level
|
||||
if(src.listening_level == STATION_Z) // equals the station
|
||||
src.listening_level = position.z
|
||||
return 1
|
||||
else if(position.z == TELECOMM_Z)
|
||||
src.listening_level = STATION_Z
|
||||
return 1
|
||||
return 0
|
||||
|
||||
// Returns a multitool from a user depending on their mobtype.
|
||||
|
||||
/obj/machinery/proc/get_multitool(mob/user as mob) //No need to have this being a telecomms specific proc.
|
||||
|
||||
var/obj/item/multitool/P = null
|
||||
// Let's double check
|
||||
if(!issilicon(user) && istype(user.get_active_hand(), /obj/item/multitool))
|
||||
P = user.get_active_hand()
|
||||
else if(isAI(user))
|
||||
var/mob/living/silicon/ai/U = user
|
||||
P = U.aiMulti
|
||||
else if(isrobot(user) && in_range(user, src))
|
||||
if(istype(user.get_active_hand(), /obj/item/multitool))
|
||||
P = user.get_active_hand()
|
||||
return P
|
||||
|
||||
// Additional Options for certain machines. Use this when you want to add an option to a specific machine.
|
||||
// Example of how to use below.
|
||||
|
||||
/obj/machinery/telecomms/proc/Options_Menu()
|
||||
return list()
|
||||
|
||||
/*
|
||||
// Add an option to the processor to switch processing mode. (COMPRESS -> UNCOMPRESS or UNCOMPRESS -> COMPRESS)
|
||||
/obj/machinery/telecomms/processor/Options_Menu()
|
||||
var/dat = "<br>Processing Mode: <A href='?src=\ref[src];process=1'>[process_mode ? "UNCOMPRESS" : "COMPRESS"]</a>"
|
||||
return dat
|
||||
*/
|
||||
// The topic for Additional Options. Use this for checking href links for your specific option.
|
||||
// Example of how to use below.
|
||||
/obj/machinery/telecomms/proc/Options_Act(action, params)
|
||||
return
|
||||
|
||||
/*
|
||||
/obj/machinery/telecomms/processor/Options_Act(action, params)
|
||||
|
||||
if(href_list["process"])
|
||||
set_temp("-% Processing mode changed. %-", "average")
|
||||
src.process_mode = !src.process_mode
|
||||
*/
|
||||
|
||||
// RELAY
|
||||
|
||||
/obj/machinery/telecomms/relay/Options_Menu()
|
||||
var/list/data = ..()
|
||||
data["use_listening_level"] = TRUE
|
||||
data["use_broadcasting"] = TRUE
|
||||
data["use_receiving"] = TRUE
|
||||
data["listening_level"] = (listening_level == STATION_Z)
|
||||
data["broadcasting"] = broadcasting
|
||||
data["receiving"] = receiving
|
||||
return data
|
||||
|
||||
/obj/machinery/telecomms/relay/Options_Act(action, params)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
switch(action)
|
||||
if("receive")
|
||||
. = TRUE
|
||||
receiving = !receiving
|
||||
set_temp("-% Receiving mode changed. %-", "average")
|
||||
if("broadcast")
|
||||
. = TRUE
|
||||
broadcasting = !broadcasting
|
||||
set_temp("-% Broadcasting mode changed. %-", "average")
|
||||
if("change_listening")
|
||||
. = TRUE
|
||||
//Lock to the station OR lock to the current position!
|
||||
//You need at least two receivers and two broadcasters for this to work, this includes the machine.
|
||||
var/result = toggle_level()
|
||||
if(result)
|
||||
set_temp("-% [src]'s signal has been successfully changed.", "average")
|
||||
else
|
||||
set_temp("-% [src] could not lock it's signal onto the station. Two broadcasters or receivers required.", "average")
|
||||
|
||||
// BUS
|
||||
|
||||
/obj/machinery/telecomms/bus/Options_Menu()
|
||||
var/list/data = ..()
|
||||
data["use_change_freq"] = TRUE
|
||||
data["change_freq"] = change_frequency
|
||||
return data
|
||||
|
||||
/obj/machinery/telecomms/bus/Options_Act(action, params)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
switch(action)
|
||||
if("change_freq")
|
||||
. = TRUE
|
||||
var/newfreq = input(usr, "Specify a new frequency for new signals to change to. Enter null to turn off frequency changing. Decimals assigned automatically.", src, network) as null|num
|
||||
if(canAccess(usr))
|
||||
if(newfreq)
|
||||
if(findtext(num2text(newfreq), "."))
|
||||
newfreq *= 10 // shift the decimal one place
|
||||
if(newfreq < 10000)
|
||||
change_frequency = newfreq
|
||||
set_temp("-% New frequency to change to assigned: \"[newfreq] GHz\" %-", "average")
|
||||
else
|
||||
change_frequency = 0
|
||||
set_temp("-% Frequency changing deactivated %-", "average")
|
||||
|
||||
|
||||
// BROADCASTER
|
||||
/obj/machinery/telecomms/broadcaster/Options_Menu()
|
||||
var/list/data = ..()
|
||||
data["use_broadcast_range"] = TRUE
|
||||
data["range"] = overmap_range
|
||||
data["minRange"] = overmap_range_min
|
||||
data["maxRange"] = overmap_range_max
|
||||
return data
|
||||
|
||||
/obj/machinery/telecomms/broadcaster
|
||||
interact_offline = TRUE // because you can accidentally nuke power grids with these, need to be able to fix mistake
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/Options_Act(action, params)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
switch(action)
|
||||
if("range")
|
||||
var/new_range = params["range"]
|
||||
overmap_range = clamp(new_range, overmap_range_min, overmap_range_max)
|
||||
update_idle_power_usage(initial(idle_power_usage)**(overmap_range+1))
|
||||
|
||||
// RECEIVER
|
||||
/obj/machinery/telecomms/receiver/Options_Menu()
|
||||
var/list/data = ..()
|
||||
data["use_receive_range"] = TRUE
|
||||
data["range"] = overmap_range
|
||||
data["minRange"] = overmap_range_min
|
||||
data["maxRange"] = overmap_range_max
|
||||
return data
|
||||
|
||||
/obj/machinery/telecomms/receiver
|
||||
interact_offline = TRUE // because you can accidentally nuke power grids with these, need to be able to fix mistake
|
||||
|
||||
/obj/machinery/telecomms/receiver/Options_Act(action, params)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
switch(action)
|
||||
if("range")
|
||||
var/new_range = params["range"]
|
||||
overmap_range = clamp(new_range, overmap_range_min, overmap_range_max)
|
||||
update_idle_power_usage(initial(idle_power_usage)**(overmap_range+1))
|
||||
|
||||
/obj/machinery/telecomms/tgui_act(action, params)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
var/obj/item/multitool/P = get_multitool(usr)
|
||||
|
||||
switch(action)
|
||||
if("toggle")
|
||||
src.toggled = !src.toggled
|
||||
set_temp("-% [src] has been [src.toggled ? "activated" : "deactivated"].", "average")
|
||||
update_power()
|
||||
. = TRUE
|
||||
|
||||
if("id")
|
||||
var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID for this machine", src, id) as null|text),1,MAX_MESSAGE_LEN)
|
||||
if(newid && canAccess(usr))
|
||||
id = newid
|
||||
set_temp("-% New ID assigned: \"[id]\" %-", "average")
|
||||
. = TRUE
|
||||
|
||||
if("network")
|
||||
var/newnet = input(usr, "Specify the new network for this machine. This will break all current links.", src, network) as null|text
|
||||
if(newnet && canAccess(usr))
|
||||
|
||||
if(length(newnet) > 15)
|
||||
set_temp("-% Too many characters in new network tag %-", "average")
|
||||
|
||||
else
|
||||
for(var/obj/machinery/telecomms/T in links)
|
||||
T.links.Remove(src)
|
||||
|
||||
network = newnet
|
||||
links = list()
|
||||
set_temp("-% New network tag assigned: \"[network]\" %-", "average")
|
||||
. = TRUE
|
||||
|
||||
|
||||
if("freq")
|
||||
var/newfreq = input(usr, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, network) as null|num
|
||||
if(newfreq && canAccess(usr))
|
||||
if(findtext(num2text(newfreq), "."))
|
||||
newfreq *= 10 // shift the decimal one place
|
||||
if(!(newfreq in freq_listening) && newfreq < 10000)
|
||||
freq_listening.Add(newfreq)
|
||||
set_temp("-% New frequency filter assigned: \"[newfreq] GHz\" %-", "average")
|
||||
. = TRUE
|
||||
|
||||
if("delete")
|
||||
var/x = text2num(params["delete"])
|
||||
set_temp("-% Removed frequency filter [x] %-", "average")
|
||||
freq_listening.Remove(x)
|
||||
. = TRUE
|
||||
|
||||
if("unlink")
|
||||
if(text2num(params["unlink"]) <= length(links))
|
||||
var/obj/machinery/telecomms/T = links[text2num(params["unlink"])]
|
||||
set_temp("-% Removed \ref[T] [T.name] from linked entities. %-", "average")
|
||||
|
||||
// Remove link entries from both T and src.
|
||||
|
||||
if(src in T.links)
|
||||
T.links.Remove(src)
|
||||
links.Remove(T)
|
||||
. = TRUE
|
||||
|
||||
if("link")
|
||||
if(P)
|
||||
if(P.buffer && P.buffer != src)
|
||||
if(!(src in P.buffer.links))
|
||||
P.buffer.links.Add(src)
|
||||
|
||||
if(!(P.buffer in src.links))
|
||||
src.links.Add(P.buffer)
|
||||
|
||||
set_temp("-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-", "average")
|
||||
|
||||
else
|
||||
set_temp("-% Unable to acquire buffer %-", "average")
|
||||
. = TRUE
|
||||
|
||||
if("buffer")
|
||||
P.buffer = src
|
||||
set_temp("-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-", "average")
|
||||
. = TRUE
|
||||
|
||||
if("flush")
|
||||
set_temp("-% Buffer successfully flushed. %-", "average")
|
||||
P.buffer = null
|
||||
. = TRUE
|
||||
|
||||
if("cleartemp")
|
||||
temp = null
|
||||
. = TRUE
|
||||
|
||||
if(Options_Act(action, params))
|
||||
. = TRUE
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/machinery/telecomms/proc/canAccess(var/mob/user)
|
||||
if(issilicon(user) || in_range(user, src))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/telecomms/proc/set_temp(var/text, var/color = "average")
|
||||
temp = list("color" = color, "text" = text)
|
||||
|
||||
#undef TELECOMM_Z
|
||||
#undef STATION_Z
|
||||
567
code/game/machinery/telecomms/misc.dm
Normal file
567
code/game/machinery/telecomms/misc.dm
Normal file
@@ -0,0 +1,567 @@
|
||||
#define TELECOMMS_RECEPTION_NONE 0
|
||||
#define TELECOMMS_RECEPTION_SENDER 1
|
||||
#define TELECOMMS_RECEPTION_RECEIVER 2
|
||||
#define TELECOMMS_RECEPTION_BOTH 3
|
||||
|
||||
/// The list of all telecomms machines
|
||||
var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
|
||||
/// global list of recent messages broadcasted : used to circumvent massive radio spam
|
||||
var/global/list/recentmessages = list()
|
||||
|
||||
/// To make sure restarting the recentmessages list is kept in sync
|
||||
var/global/message_delay = 0
|
||||
|
||||
|
||||
/datum/comm_log_entry
|
||||
var/name = "data packet (#)"
|
||||
var/input_type = "Speech File"
|
||||
var/parameters = list()
|
||||
|
||||
|
||||
/datum/reception
|
||||
var/obj/machinery/message_server/message_server
|
||||
var/telecomms_reception = TELECOMMS_RECEPTION_NONE
|
||||
var/message = ""
|
||||
|
||||
|
||||
/datum/receptions
|
||||
var/obj/machinery/message_server/message_server
|
||||
var/sender_reception = TELECOMMS_RECEPTION_NONE
|
||||
var/list/receiver_reception = new
|
||||
|
||||
|
||||
/atom/proc/telecomms_process(skip_sleep)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = TRANSMISSION_SUBSPACE
|
||||
var/pos_z = get_z(src)
|
||||
signal.data = list(
|
||||
"slow" = 0, // how much to sleep() before broadcasting - simulates net lag
|
||||
"message" = "TEST",
|
||||
"compression" = rand(45, 50), // If the signal is compressed, compress our message too.
|
||||
"traffic" = 0, // dictates the total traffic sum that the signal went through
|
||||
"type" = SIGNAL_TEST, // determines what type of radio input it is: test broadcast
|
||||
"reject" = 0,
|
||||
"done" = 0,
|
||||
"level" = pos_z // The level it is being broadcasted at.
|
||||
)
|
||||
signal.frequency = PUB_FREQ
|
||||
for(var/obj/machinery/telecomms/receiver/receiver in telecomms_list)
|
||||
receiver.receive_signal(signal)
|
||||
if(!skip_sleep)
|
||||
sleep(rand(10, 25))
|
||||
return signal
|
||||
|
||||
|
||||
/proc/register_radio(source, old_frequency, new_frequency, radio_filter)
|
||||
if(old_frequency)
|
||||
radio_controller.remove_object(source, old_frequency)
|
||||
if(new_frequency)
|
||||
return radio_controller.add_object(source, new_frequency, radio_filter)
|
||||
|
||||
|
||||
/proc/unregister_radio(source, frequency)
|
||||
if(radio_controller)
|
||||
radio_controller.remove_object(source, frequency)
|
||||
|
||||
|
||||
/proc/get_frequency_name(var/display_freq)
|
||||
var/freq_text
|
||||
if (display_freq in ANTAG_FREQS)
|
||||
freq_text = "#unkn"
|
||||
else
|
||||
for (var/channel in radiochannels)
|
||||
if (radiochannels[channel] == display_freq)
|
||||
freq_text = channel
|
||||
break
|
||||
if (!freq_text)
|
||||
freq_text = format_frequency(display_freq)
|
||||
return freq_text
|
||||
|
||||
|
||||
/proc/get_message_server()
|
||||
if(message_servers)
|
||||
for (var/obj/machinery/message_server/MS in message_servers)
|
||||
if(MS.active)
|
||||
return MS
|
||||
return null
|
||||
|
||||
|
||||
/proc/get_sender_reception(atom/sender, datum/signal/signal)
|
||||
if (signal?.data["done"])
|
||||
return TELECOMMS_RECEPTION_SENDER
|
||||
return TELECOMMS_RECEPTION_NONE
|
||||
|
||||
|
||||
/proc/get_receiver_reception(receiver, datum/signal/signal)
|
||||
if (receiver && signal?.data["done"])
|
||||
var/turf/pos = get_turf(receiver)
|
||||
if (pos?.z in signal.data["level"])
|
||||
return TELECOMMS_RECEPTION_RECEIVER
|
||||
return TELECOMMS_RECEPTION_NONE
|
||||
|
||||
|
||||
/proc/get_reception(atom/sender, receiver, message = "", skip_sleep)
|
||||
var/datum/reception/reception = new
|
||||
reception.message_server = get_message_server()
|
||||
var/datum/signal/signal = sender.telecomms_process(skip_sleep)
|
||||
reception.telecomms_reception |= get_sender_reception(sender, signal)
|
||||
reception.telecomms_reception |= get_receiver_reception(receiver, signal)
|
||||
reception.message = signal && signal.data["compression"] > 0 ? Gibberish(message, signal.data["compression"] + 50) : message
|
||||
return reception
|
||||
|
||||
|
||||
/proc/get_receptions(atom/sender, list/atom/receivers, skip_sleep)
|
||||
var/datum/receptions/receptions = new
|
||||
receptions.message_server = get_message_server()
|
||||
var/datum/signal/signal
|
||||
if (sender)
|
||||
signal = sender.telecomms_process(skip_sleep)
|
||||
receptions.sender_reception = get_sender_reception(sender, signal)
|
||||
for (var/atom/receiver in receivers)
|
||||
if (!signal)
|
||||
signal = receiver.telecomms_process()
|
||||
receptions.receiver_reception[receiver] = get_receiver_reception(receiver, signal)
|
||||
return receptions
|
||||
|
||||
|
||||
/**
|
||||
Here is the big, bad function that broadcasts a message given the appropriate
|
||||
parameters.
|
||||
|
||||
@param connection:
|
||||
The datum generated in radio.dm, stored in signal.data["connection"].
|
||||
|
||||
@param M:
|
||||
Reference to the mob/speaker, stored in signal.data["mob"]
|
||||
|
||||
@param vmask:
|
||||
Boolean value if the mob is "hiding" its identity via voice mask, stored in
|
||||
signal.data["vmask"]
|
||||
|
||||
@param vmessage:
|
||||
If specified, will display this as the message; such as "chimpering"
|
||||
for monkies if the mob is not understood. Stored in signal.data["vmessage"].
|
||||
|
||||
@param radio:
|
||||
Reference to the radio broadcasting the message, stored in signal.data["radio"]
|
||||
|
||||
@param message:
|
||||
The actual string message to display to mobs who understood mob M. Stored in
|
||||
signal.data["message"]
|
||||
|
||||
@param name:
|
||||
The name to display when a mob receives the message. signal.data["name"]
|
||||
|
||||
@param job:
|
||||
The name job to display for the AI when it receives the message. signal.data["job"]
|
||||
|
||||
@param realname:
|
||||
The "real" name associated with the mob. signal.data["realname"]
|
||||
|
||||
@param vname:
|
||||
If specified, will use this name when mob M is not understood. signal.data["vname"]
|
||||
|
||||
@param data:
|
||||
If specified:
|
||||
1 -- Will only broadcast to intercoms
|
||||
2 -- Will only broadcast to intercoms and station-bounced radios
|
||||
3 -- Broadcast to syndicate frequency
|
||||
4 -- AI can't track down this person. Useful for imitation broadcasts where you can't find the actual mob
|
||||
|
||||
@param compression:
|
||||
If 0, the signal is audible
|
||||
If nonzero, the signal may be partially inaudible or just complete gibberish.
|
||||
|
||||
@param level:
|
||||
The list of Z levels that the sending radio is broadcasting to. Having 0 in the list broadcasts on all levels
|
||||
|
||||
@param freq
|
||||
The frequency of the signal
|
||||
*/
|
||||
|
||||
/proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M,
|
||||
var/vmask, var/list/vmessage_pieces, var/obj/item/radio/radio,
|
||||
var/list/message_pieces, var/name, var/job, var/realname, var/vname,
|
||||
var/data, var/compression, var/list/level, var/freq, var/verbage = "says",
|
||||
var/list/forced_radios)
|
||||
|
||||
/* ###### Prepare the radio connection ###### */
|
||||
|
||||
var/display_freq = freq
|
||||
|
||||
var/list/obj/item/radio/radios = list()
|
||||
|
||||
for(var/obj/item/radio/R in forced_radios)
|
||||
//Cursory check to ensure they are 'on' and stuff
|
||||
if(R.receive_range(display_freq, list(0)) > -1)
|
||||
radios |= R
|
||||
|
||||
// --- Broadcast only to intercom devices ---
|
||||
|
||||
if(data == DATA_INTERCOM)
|
||||
|
||||
for (var/obj/item/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
|
||||
if(R.receive_range(display_freq, level) > -1)
|
||||
radios |= R
|
||||
|
||||
// --- Broadcast only to intercoms and station-bounced radios ---
|
||||
|
||||
else if(data == DATA_LOCAL)
|
||||
|
||||
for (var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||
|
||||
if(istype(R, /obj/item/radio/headset) && !R.adhoc_fallback)
|
||||
continue
|
||||
|
||||
if(R.receive_range(display_freq, level) > -1)
|
||||
radios |= R
|
||||
|
||||
// --- Broadcast to antag radios! ---
|
||||
|
||||
else if(data == DATA_ANTAG)
|
||||
for(var/antag_freq in ANTAG_FREQS)
|
||||
var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(antag_freq)
|
||||
for (var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"])
|
||||
if(R.receive_range(antag_freq, level) > -1)
|
||||
radios |= R
|
||||
|
||||
// --- Broadcast to ALL radio devices ---
|
||||
|
||||
else
|
||||
|
||||
for (var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||
if(R.receive_range(display_freq, level) > -1)
|
||||
radios |= R
|
||||
|
||||
// Get a list of mobs who can hear from the radios we collected.
|
||||
var/list/receive = get_mobs_in_radio_ranges(radios)
|
||||
|
||||
/* ###### Organize the receivers into categories for displaying the message ###### */
|
||||
|
||||
// Understood the message:
|
||||
var/list/heard_masked = list() // masked name or no real name
|
||||
var/list/heard_normal = list() // normal message
|
||||
|
||||
// Did not understand the message:
|
||||
var/list/heard_voice = list() // voice message (ie "chimpers")
|
||||
var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
|
||||
var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
|
||||
|
||||
for (var/mob/R in receive)
|
||||
|
||||
/* --- Loop through the receivers and categorize them --- */
|
||||
if(!R.is_preference_enabled(/datum/client_preference/holder/hear_radio))
|
||||
continue
|
||||
|
||||
if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
|
||||
continue
|
||||
|
||||
// Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates
|
||||
if(data == DATA_ANTAG && istype(R, /mob/observer/dead) && R.is_preference_enabled(/datum/client_preference/ghost_radio))
|
||||
continue
|
||||
|
||||
// --- Check for compression ---
|
||||
if(compression > 0)
|
||||
heard_gibberish += R
|
||||
continue
|
||||
|
||||
// --- Can understand the speech ---
|
||||
|
||||
if(!M || R.say_understands(M))
|
||||
|
||||
// - Not human or wearing a voice mask -
|
||||
if(!M || !ishuman(M) || vmask)
|
||||
heard_masked += R
|
||||
|
||||
// - Human and not wearing voice mask -
|
||||
else
|
||||
heard_normal += R
|
||||
|
||||
// --- Can't understand the speech ---
|
||||
|
||||
else
|
||||
// - The speaker has a prespecified "voice message" to display if not understood -
|
||||
if(vmessage_pieces)
|
||||
heard_voice += R
|
||||
|
||||
// - Just display a garbled message -
|
||||
else
|
||||
heard_garbled += R
|
||||
|
||||
|
||||
/* ###### Begin formatting and sending the message ###### */
|
||||
if(length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
|
||||
|
||||
/* --- Some miscellaneous variables to format the string output --- */
|
||||
var/freq_text = get_frequency_name(display_freq)
|
||||
|
||||
var/part_b_extra = ""
|
||||
if(data == DATA_ANTAG) // intercepted radio message
|
||||
part_b_extra = " <i>(Intercepted)</i>"
|
||||
var/part_a = "<span class='[frequency_span_class(display_freq)]'>"
|
||||
var/part_b = "[bicon(radio)]<b>\[[freq_text]\][part_b_extra]</b> <span class='name'>" // goes in the actual output
|
||||
|
||||
// --- Some more pre-message formatting ---
|
||||
var/part_c = "</span> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/part_d = "</span>"
|
||||
var/part_e = "</span>"
|
||||
|
||||
|
||||
// --- Filter the message; place it in quotes apply a verb ---
|
||||
var/quotedmsg = null
|
||||
if(M)
|
||||
quotedmsg = "[M.say_quote(multilingual_to_message(message_pieces))], \"[multilingual_to_message(message_pieces)]\""
|
||||
else
|
||||
quotedmsg = "says, \"[multilingual_to_message(message_pieces)]\""
|
||||
|
||||
// --- This following recording is intended for research and feedback in the use of department radio channels ---
|
||||
|
||||
var/part_blackbox_c = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/blackbox_msg = "[part_a][part_b][name][part_blackbox_c][quotedmsg][part_d][part_e]"
|
||||
//var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
|
||||
|
||||
//BR.messages_admin += blackbox_admin_msg
|
||||
if(istype(blackbox))
|
||||
switch(display_freq)
|
||||
if(PUB_FREQ)
|
||||
blackbox.msg_common += blackbox_msg
|
||||
if(SCI_FREQ)
|
||||
blackbox.msg_science += blackbox_msg
|
||||
if(COMM_FREQ)
|
||||
blackbox.msg_command += blackbox_msg
|
||||
if(MED_FREQ)
|
||||
blackbox.msg_medical += blackbox_msg
|
||||
if(ENG_FREQ)
|
||||
blackbox.msg_engineering += blackbox_msg
|
||||
if(SEC_FREQ)
|
||||
blackbox.msg_security += blackbox_msg
|
||||
if(DTH_FREQ)
|
||||
blackbox.msg_deathsquad += blackbox_msg
|
||||
if(SYND_FREQ)
|
||||
blackbox.msg_syndicate += blackbox_msg
|
||||
if(RAID_FREQ)
|
||||
blackbox.msg_raider += blackbox_msg
|
||||
if(SUP_FREQ)
|
||||
blackbox.msg_cargo += blackbox_msg
|
||||
if(SRV_FREQ)
|
||||
blackbox.msg_service += blackbox_msg
|
||||
if(EXP_FREQ)
|
||||
blackbox.msg_explorer += blackbox_msg
|
||||
else
|
||||
blackbox.messages += blackbox_msg
|
||||
|
||||
//End of research and feedback code.
|
||||
|
||||
/* ###### Send the message ###### */
|
||||
/* --- Process all the mobs that heard a masked voice (understood) --- */
|
||||
if(length(heard_masked))
|
||||
for (var/mob/R in heard_masked)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 0, name)
|
||||
|
||||
/* --- Process all the mobs that heard the voice normally (understood) --- */
|
||||
if(length(heard_normal))
|
||||
for (var/mob/R in heard_normal)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 0, realname)
|
||||
|
||||
/* --- Process all the mobs that heard the voice normally (did not understand) --- */
|
||||
if(length(heard_voice))
|
||||
for (var/mob/R in heard_voice)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M,0, vname)
|
||||
|
||||
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
|
||||
// Displays garbled message (ie "f*c* **u, **i*er!")
|
||||
if(length(heard_garbled))
|
||||
for (var/mob/R in heard_garbled)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 1, vname)
|
||||
|
||||
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
|
||||
if(length(heard_gibberish))
|
||||
for (var/mob/R in heard_gibberish)
|
||||
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, part_d, part_e, M, 1)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/proc/Broadcast_SimpleMessage(var/source, var/frequency, list/message_pieces, var/data, var/mob/M, var/compression, var/level, var/list/forced_radios)
|
||||
var/text = multilingual_to_message(message_pieces)
|
||||
/* ###### Prepare the radio connection ###### */
|
||||
|
||||
if(!M)
|
||||
var/mob/living/carbon/human/H = new
|
||||
M = H
|
||||
|
||||
var/datum/radio_frequency/connection = radio_controller.return_frequency(frequency)
|
||||
|
||||
var/display_freq = connection.frequency
|
||||
|
||||
var/list/receive = list()
|
||||
|
||||
for(var/obj/item/radio/R in forced_radios)
|
||||
receive |= R.send_hear(display_freq)
|
||||
|
||||
// --- Broadcast only to intercom devices ---
|
||||
|
||||
if(data == DATA_INTERCOM)
|
||||
for (var/obj/item/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
|
||||
var/turf/position = get_turf(R)
|
||||
if(position && position.z == level)
|
||||
receive |= R.send_hear(display_freq, level)
|
||||
|
||||
|
||||
// --- Broadcast only to intercoms and station-bounced radios ---
|
||||
|
||||
else if(data == DATA_LOCAL)
|
||||
for (var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||
|
||||
if(istype(R, /obj/item/radio/headset))
|
||||
continue
|
||||
var/turf/position = get_turf(R)
|
||||
if(position && position.z == level)
|
||||
receive |= R.send_hear(display_freq)
|
||||
|
||||
|
||||
// --- Broadcast to antag radios! ---
|
||||
|
||||
else if(data == DATA_ANTAG)
|
||||
for(var/freq in ANTAG_FREQS)
|
||||
var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(freq)
|
||||
for (var/obj/item/radio/R in antag_connection.devices["[RADIO_CHAT]"])
|
||||
var/turf/position = get_turf(R)
|
||||
if(position && position.z == level)
|
||||
receive |= R.send_hear(freq)
|
||||
|
||||
|
||||
// --- Broadcast to ALL radio devices ---
|
||||
|
||||
else
|
||||
for (var/obj/item/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||
var/turf/position = get_turf(R)
|
||||
if(position && position.z == level)
|
||||
receive |= R.send_hear(display_freq)
|
||||
|
||||
|
||||
/* ###### Organize the receivers into categories for displaying the message ###### */
|
||||
|
||||
// Understood the message:
|
||||
var/list/heard_normal = list() // normal message
|
||||
|
||||
// Did not understand the message:
|
||||
var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
|
||||
var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
|
||||
|
||||
for (var/mob/R in receive)
|
||||
|
||||
/* --- Loop through the receivers and categorize them --- */
|
||||
|
||||
if(!R.is_preference_enabled(/datum/client_preference/holder/hear_radio)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
|
||||
continue
|
||||
|
||||
|
||||
// --- Check for compression ---
|
||||
if(compression > 0)
|
||||
|
||||
heard_gibberish += R
|
||||
continue
|
||||
|
||||
// --- Can understand the speech ---
|
||||
|
||||
if(R.say_understands(M))
|
||||
|
||||
heard_normal += R
|
||||
|
||||
// --- Can't understand the speech ---
|
||||
|
||||
else
|
||||
// - Just display a garbled message -
|
||||
|
||||
heard_garbled += R
|
||||
|
||||
|
||||
/* ###### Begin formatting and sending the message ###### */
|
||||
if(length(heard_normal) || length(heard_garbled) || length(heard_gibberish))
|
||||
|
||||
/* --- Some miscellaneous variables to format the string output --- */
|
||||
var/part_a = "<span class='[frequency_span_class(display_freq)]'><span class='name'>" // goes in the actual output
|
||||
var/freq_text = get_frequency_name(display_freq)
|
||||
|
||||
// --- Some more pre-message formatting ---
|
||||
|
||||
var/part_b_extra = ""
|
||||
if(data == DATA_ANTAG) // intercepted radio message
|
||||
part_b_extra = " <i>(Intercepted)</i>"
|
||||
|
||||
// Create a radio headset for the sole purpose of using its icon
|
||||
var/obj/item/radio/headset/radio = new
|
||||
|
||||
var/part_b = "</span><b> [bicon(radio)]\[[freq_text]\][part_b_extra]</b> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
|
||||
var/part_c = "</span></span>"
|
||||
|
||||
var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]"
|
||||
|
||||
//BR.messages_admin += blackbox_admin_msg
|
||||
if(istype(blackbox))
|
||||
switch(display_freq)
|
||||
if(PUB_FREQ)
|
||||
blackbox.msg_common += blackbox_msg
|
||||
if(SCI_FREQ)
|
||||
blackbox.msg_science += blackbox_msg
|
||||
if(COMM_FREQ)
|
||||
blackbox.msg_command += blackbox_msg
|
||||
if(MED_FREQ)
|
||||
blackbox.msg_medical += blackbox_msg
|
||||
if(ENG_FREQ)
|
||||
blackbox.msg_engineering += blackbox_msg
|
||||
if(SEC_FREQ)
|
||||
blackbox.msg_security += blackbox_msg
|
||||
if(DTH_FREQ)
|
||||
blackbox.msg_deathsquad += blackbox_msg
|
||||
if(SYND_FREQ)
|
||||
blackbox.msg_syndicate += blackbox_msg
|
||||
if(RAID_FREQ)
|
||||
blackbox.msg_raider += blackbox_msg
|
||||
if(SUP_FREQ)
|
||||
blackbox.msg_cargo += blackbox_msg
|
||||
if(SRV_FREQ)
|
||||
blackbox.msg_service += blackbox_msg
|
||||
else
|
||||
blackbox.messages += blackbox_msg
|
||||
|
||||
//End of research and feedback code.
|
||||
|
||||
/* ###### Send the message ###### */
|
||||
|
||||
/* --- Process all the mobs that heard the voice normally (understood) --- */
|
||||
|
||||
if(length(heard_normal))
|
||||
var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]"
|
||||
|
||||
for (var/mob/R in heard_normal)
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
|
||||
// Displays garbled message (ie "f*c* **u, **i*er!")
|
||||
|
||||
if(length(heard_garbled))
|
||||
var/quotedmsg = "\"[stars(text)]\""
|
||||
var/rendered = "[part_a][source][part_b][quotedmsg][part_c]"
|
||||
|
||||
for (var/mob/R in heard_garbled)
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
|
||||
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
|
||||
|
||||
if(length(heard_gibberish))
|
||||
var/quotedmsg = "\"[Gibberish(text, compression + 50)]\""
|
||||
var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]"
|
||||
|
||||
for (var/mob/R in heard_gibberish)
|
||||
R.show_message(rendered, 2)
|
||||
|
||||
|
||||
#undef TELECOMMS_RECEPTION_NONE
|
||||
#undef TELECOMMS_RECEPTION_SENDER
|
||||
#undef TELECOMMS_RECEPTION_RECEIVER
|
||||
#undef TELECOMMS_RECEPTION_BOTH
|
||||
@@ -1,40 +1,37 @@
|
||||
// ### Preset machines ###
|
||||
|
||||
//Relay
|
||||
|
||||
/obj/machinery/telecomms/relay/preset
|
||||
network = "tcommsat"
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/preset/station
|
||||
id = "Station Relay"
|
||||
listening_level = 1
|
||||
autolinkers = list("s_relay")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/preset/telecomms
|
||||
id = "Telecomms Relay"
|
||||
autolinkers = list("relay")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/preset/mining
|
||||
id = "Mining Relay"
|
||||
autolinkers = list("m_relay")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/preset/ruskie
|
||||
id = "Ruskie Relay"
|
||||
hide = 1
|
||||
toggled = 0
|
||||
hide = TRUE
|
||||
toggled = FALSE
|
||||
autolinkers = list("r_relay")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/preset/centcom
|
||||
id = "CentCom Relay"
|
||||
hide = 1
|
||||
toggled = 1
|
||||
//anchored = 1
|
||||
//use_power = 0
|
||||
//idle_power_usage = 0
|
||||
produces_heat = 0
|
||||
hide = TRUE
|
||||
toggled = TRUE
|
||||
produces_heat = FALSE
|
||||
autolinkers = list("c_relay")
|
||||
|
||||
//HUB
|
||||
|
||||
/obj/machinery/telecomms/hub/preset
|
||||
id = "Hub"
|
||||
@@ -43,14 +40,14 @@
|
||||
"supply", "service", "common", "command", "engineering", "security", "unused",
|
||||
"receiverA", "broadcasterA")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/hub/preset_cent
|
||||
id = "CentCom Hub"
|
||||
network = "tcommsat"
|
||||
produces_heat = 0
|
||||
produces_heat = FALSE
|
||||
autolinkers = list("hub_cent", "c_relay", "s_relay", "m_relay", "r_relay",
|
||||
"centcom", "receiverCent", "broadcasterCent")
|
||||
|
||||
//Receivers
|
||||
|
||||
/obj/machinery/telecomms/receiver/preset_right
|
||||
id = "Receiver A"
|
||||
@@ -58,40 +55,42 @@
|
||||
autolinkers = list("receiverA") // link to relay
|
||||
freq_listening = list(AI_FREQ, SCI_FREQ, MED_FREQ, SUP_FREQ, SRV_FREQ, COMM_FREQ, ENG_FREQ, SEC_FREQ, ENT_FREQ)
|
||||
|
||||
//Common and other radio frequencies for people to freely use
|
||||
|
||||
/obj/machinery/telecomms/receiver/preset_right/Initialize()
|
||||
for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
|
||||
for(var/i = PUBLIC_LOW_FREQ to PUBLIC_HIGH_FREQ step 2)
|
||||
freq_listening |= i
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/receiver/preset_cent
|
||||
id = "CentCom Receiver"
|
||||
network = "tcommsat"
|
||||
produces_heat = 0
|
||||
produces_heat = FALSE
|
||||
autolinkers = list("receiverCent")
|
||||
freq_listening = list(ERT_FREQ, DTH_FREQ, SYND_FREQ)
|
||||
|
||||
|
||||
//Buses
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_one
|
||||
id = "Bus 1"
|
||||
network = "tcommsat"
|
||||
freq_listening = list(SCI_FREQ, MED_FREQ)
|
||||
autolinkers = list("processor1", "science", "medical")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_two
|
||||
id = "Bus 2"
|
||||
network = "tcommsat"
|
||||
freq_listening = list(SUP_FREQ, SRV_FREQ)
|
||||
autolinkers = list("processor2", "supply", "service", "unused")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_two/Initialize()
|
||||
for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
|
||||
if(i == PUB_FREQ)
|
||||
for(var/i = PUBLIC_LOW_FREQ to PUBLIC_HIGH_FREQ step 2)
|
||||
if (i == PUB_FREQ)
|
||||
continue
|
||||
freq_listening |= i
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_three
|
||||
id = "Bus 3"
|
||||
@@ -99,124 +98,134 @@
|
||||
freq_listening = list(SEC_FREQ, COMM_FREQ)
|
||||
autolinkers = list("processor3", "security", "command")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_four
|
||||
id = "Bus 4"
|
||||
network = "tcommsat"
|
||||
freq_listening = list(ENG_FREQ, AI_FREQ, PUB_FREQ, ENT_FREQ)
|
||||
autolinkers = list("processor4", "engineering", "common")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_cent
|
||||
id = "CentCom Bus"
|
||||
network = "tcommsat"
|
||||
freq_listening = list(ERT_FREQ, DTH_FREQ, SYND_FREQ)
|
||||
produces_heat = 0
|
||||
produces_heat = FALSE
|
||||
autolinkers = list("processorCent", "centcom")
|
||||
|
||||
//Processors
|
||||
|
||||
/obj/machinery/telecomms/processor/preset_one
|
||||
id = "Processor 1"
|
||||
network = "tcommsat"
|
||||
autolinkers = list("processor1") // processors are sort of isolated; they don't need backward links
|
||||
autolinkers = list("processor1")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/processor/preset_two
|
||||
id = "Processor 2"
|
||||
network = "tcommsat"
|
||||
autolinkers = list("processor2")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/processor/preset_three
|
||||
id = "Processor 3"
|
||||
network = "tcommsat"
|
||||
autolinkers = list("processor3")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/processor/preset_four
|
||||
id = "Processor 4"
|
||||
network = "tcommsat"
|
||||
autolinkers = list("processor4")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/processor/preset_cent
|
||||
id = "CentCom Processor"
|
||||
network = "tcommsat"
|
||||
produces_heat = 0
|
||||
produces_heat = FALSE
|
||||
autolinkers = list("processorCent")
|
||||
|
||||
//Servers
|
||||
|
||||
/obj/machinery/telecomms/server/presets
|
||||
|
||||
network = "tcommsat"
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/science
|
||||
id = "Science Server"
|
||||
freq_listening = list(SCI_FREQ)
|
||||
autolinkers = list("science")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/medical
|
||||
id = "Medical Server"
|
||||
freq_listening = list(MED_FREQ)
|
||||
autolinkers = list("medical")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/supply
|
||||
id = "Supply Server"
|
||||
freq_listening = list(SUP_FREQ)
|
||||
autolinkers = list("supply")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/service
|
||||
id = "Service Server"
|
||||
freq_listening = list(SRV_FREQ)
|
||||
autolinkers = list("service")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/common
|
||||
id = "Common Server"
|
||||
freq_listening = list(PUB_FREQ, AI_FREQ, ENT_FREQ) // AI Private and Common
|
||||
freq_listening = list(PUB_FREQ, AI_FREQ, ENT_FREQ)
|
||||
autolinkers = list("common")
|
||||
|
||||
// "Unused" channels, AKA all others.
|
||||
|
||||
/obj/machinery/telecomms/server/presets/unused
|
||||
id = "Unused Server"
|
||||
freq_listening = list()
|
||||
autolinkers = list("unused")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/unused/Initialize()
|
||||
for(var/i = PUBLIC_LOW_FREQ, i < PUBLIC_HIGH_FREQ, i += 2)
|
||||
if(i == AI_FREQ || i == PUB_FREQ)
|
||||
for(var/i = PUBLIC_LOW_FREQ to PUBLIC_HIGH_FREQ step 2)
|
||||
if (i == AI_FREQ || i == PUB_FREQ)
|
||||
continue
|
||||
freq_listening |= i
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/command
|
||||
id = "Command Server"
|
||||
freq_listening = list(COMM_FREQ)
|
||||
autolinkers = list("command")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/engineering
|
||||
id = "Engineering Server"
|
||||
freq_listening = list(ENG_FREQ)
|
||||
autolinkers = list("engineering")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/security
|
||||
id = "Security Server"
|
||||
freq_listening = list(SEC_FREQ)
|
||||
autolinkers = list("security")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/presets/centcomm
|
||||
id = "CentCom Server"
|
||||
freq_listening = list(ERT_FREQ, DTH_FREQ, SYND_FREQ)
|
||||
produces_heat = 0
|
||||
produces_heat = FALSE
|
||||
autolinkers = list("centcom")
|
||||
|
||||
|
||||
//Broadcasters
|
||||
|
||||
//--PRESET LEFT--//
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/preset_right
|
||||
id = "Broadcaster A"
|
||||
network = "tcommsat"
|
||||
autolinkers = list("broadcasterA")
|
||||
|
||||
|
||||
/obj/machinery/telecomms/broadcaster/preset_cent
|
||||
id = "CentCom Broadcaster"
|
||||
network = "tcommsat"
|
||||
produces_heat = 0
|
||||
autolinkers = list("broadcasterCent")
|
||||
produces_heat = FALSE
|
||||
autolinkers = list("broadcasterCent")
|
||||
|
||||
27
code/game/machinery/telecomms/processor.dm
Normal file
27
code/game/machinery/telecomms/processor.dm
Normal file
@@ -0,0 +1,27 @@
|
||||
/obj/machinery/telecomms/processor
|
||||
name = "Processor Unit"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "processor"
|
||||
desc = "This machine is used to process large quantities of information."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 600
|
||||
machinetype = 3
|
||||
delay = 5
|
||||
circuit = /obj/item/circuitboard/telecomms/processor
|
||||
var/uncompress = TRUE // When FALSE, compress signals instead
|
||||
|
||||
|
||||
/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/sender)
|
||||
if (!is_freq_listening(signal))
|
||||
return
|
||||
if (uncompress)
|
||||
signal.data["compression"] = 0
|
||||
else
|
||||
signal.data["compression"] = 100
|
||||
if (istype(sender, /obj/machinery/telecomms/bus))
|
||||
relay_direct_information(signal, sender)
|
||||
else
|
||||
signal.data["slow"] += rand(5, 10)
|
||||
relay_information(signal, /obj/machinery/telecomms/server)
|
||||
89
code/game/machinery/telecomms/receiver.dm
Normal file
89
code/game/machinery/telecomms/receiver.dm
Normal file
@@ -0,0 +1,89 @@
|
||||
/* Telecomms Receiver
|
||||
* The receiver idles and receives messages from subspace-compatible radio equipment;
|
||||
* primarily headsets. They then just relay this information to all linked devices,
|
||||
* which can would probably be network hubs. Link to Processor Units in case receiver
|
||||
* can't send to bus units.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/receiver
|
||||
name = "Subspace Receiver"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "broadcast receiver"
|
||||
desc = "This machine has a dish-like shape and green lights. It is designed to detect and process subspace radio activity."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 600
|
||||
machinetype = 1
|
||||
produces_heat = 0
|
||||
circuit = /obj/item/circuitboard/telecomms/receiver
|
||||
interact_offline = TRUE
|
||||
var/list/linked_radios_weakrefs = list()
|
||||
var/overmap_range = 0
|
||||
var/overmap_range_min = 0
|
||||
var/overmap_range_max = 5
|
||||
|
||||
|
||||
/obj/machinery/telecomms/receiver/proc/link_radio(obj/item/radio/radio)
|
||||
if (!istype(radio))
|
||||
return
|
||||
linked_radios_weakrefs |= weakref(radio)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal)
|
||||
if (!on)
|
||||
return
|
||||
if (!signal)
|
||||
return
|
||||
if (!check_receive_level(signal))
|
||||
return
|
||||
if (signal.transmission_method != TRANSMISSION_SUBSPACE)
|
||||
return
|
||||
if (!is_freq_listening(signal))
|
||||
return
|
||||
signal.data["level"] = list()
|
||||
var/send_succeeded = relay_information(signal, /obj/machinery/telecomms/hub)
|
||||
if (send_succeeded)
|
||||
return
|
||||
relay_information(signal, /obj/machinery/telecomms/bus)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/receiver/proc/check_receive_level(datum/signal/signal)
|
||||
if (signal.transmission_method == TRANSMISSION_BLUESPACE)
|
||||
var/obj/item/radio/radio = signal.data["radio"]
|
||||
if (!(weakref(radio) in linked_radios_weakrefs))
|
||||
signal.data["reject"] = TRUE
|
||||
return FALSE
|
||||
signal.data["level"] = z
|
||||
signal.transmission_method = TRANSMISSION_SUBSPACE
|
||||
return TRUE
|
||||
var/list/listening_levels = using_map.get_map_levels(listening_level, TRUE, overmap_range)
|
||||
if (signal.data["level"] in listening_levels)
|
||||
return TRUE
|
||||
for (var/obj/machinery/telecomms/hub/hub in links)
|
||||
var/list/relayed_levels = list()
|
||||
for (var/obj/machinery/telecomms/relay/relay in hub.links)
|
||||
if (relay.can_receive(signal))
|
||||
relayed_levels |= relay.listening_level
|
||||
if (signal.data["level"] in relayed_levels)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/machinery/telecomms/receiver/OptionsMenu()
|
||||
var/list/data = ..()
|
||||
data["use_receive_range"] = TRUE
|
||||
data["range"] = overmap_range
|
||||
data["minRange"] = overmap_range_min
|
||||
data["maxRange"] = overmap_range_max
|
||||
return data
|
||||
|
||||
|
||||
/obj/machinery/telecomms/receiver/OptionsHandler(action, params)
|
||||
if (..())
|
||||
return TRUE
|
||||
switch (action)
|
||||
if ("range")
|
||||
var/new_range = params["range"]
|
||||
overmap_range = clamp(new_range, overmap_range_min, overmap_range_max)
|
||||
update_idle_power_usage(initial(idle_power_usage) ** (overmap_range + 1))
|
||||
79
code/game/machinery/telecomms/relay.dm
Normal file
79
code/game/machinery/telecomms/relay.dm
Normal file
@@ -0,0 +1,79 @@
|
||||
/* Telecomms Relay
|
||||
* The relay idles until it receives information. It then passes on that information
|
||||
* depending on where it came from. The relay is needed in order to send information
|
||||
* pass Z levels. It must be linked with a HUB, the only other machine that can
|
||||
* send/receive pass Z levels.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/relay
|
||||
name = "Telecommunication Relay"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "relay"
|
||||
desc = "A mighty piece of hardware used to send massive amounts of data far away."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 600
|
||||
machinetype = 8
|
||||
produces_heat = TRUE
|
||||
circuit = /obj/item/circuitboard/telecomms/relay
|
||||
netspeed = 5
|
||||
long_range_link = TRUE
|
||||
var/broadcasting = TRUE
|
||||
var/receiving = TRUE
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/forceMove(newloc)
|
||||
. = ..(newloc)
|
||||
listening_level = z
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/receive_information(datum/signal/signal, obj/machinery/telecomms/sender)
|
||||
if (can_send(signal))
|
||||
signal.data["level"] |= using_map.get_map_levels(listening_level)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/OptionsMenu()
|
||||
var/list/data = ..()
|
||||
data["use_broadcasting"] = TRUE
|
||||
data["use_receiving"] = TRUE
|
||||
data["broadcasting"] = broadcasting
|
||||
data["receiving"] = receiving
|
||||
return data
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/OptionsHandler(action, params)
|
||||
if (..())
|
||||
return TRUE
|
||||
switch (action)
|
||||
if ("receive")
|
||||
. = TRUE
|
||||
receiving = !receiving
|
||||
set_temp("-% Receiving mode changed. %-", "average")
|
||||
if ("broadcast")
|
||||
. = TRUE
|
||||
broadcasting = !broadcasting
|
||||
set_temp("-% Broadcasting mode changed. %-", "average")
|
||||
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/proc/can(datum/signal/signal)
|
||||
if (!on)
|
||||
return FALSE
|
||||
if (!listening_level)
|
||||
return FALSE
|
||||
if (!is_freq_listening(signal))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/proc/can_send(datum/signal/signal)
|
||||
if (!can(signal))
|
||||
return FALSE
|
||||
return broadcasting
|
||||
|
||||
|
||||
/obj/machinery/telecomms/relay/proc/can_receive(datum/signal/signal)
|
||||
if (!can(signal))
|
||||
return FALSE
|
||||
return receiving
|
||||
127
code/game/machinery/telecomms/server.dm
Normal file
127
code/game/machinery/telecomms/server.dm
Normal file
@@ -0,0 +1,127 @@
|
||||
/obj/machinery/telecomms/server
|
||||
name = "Telecommunication Server"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "comm_server"
|
||||
desc = "A machine used to store data and network statistics."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 300
|
||||
machinetype = 4
|
||||
circuit = /obj/item/circuitboard/telecomms/server
|
||||
var/list/stored_names = list()
|
||||
var/list/TrafficActions = list()
|
||||
var/list/log_entries = list()
|
||||
var/logs = 0 // number of logs
|
||||
var/max_logs = 400 // maximum number of logs
|
||||
var/log_cull_count = 10 // number of logs to cull at a time
|
||||
var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes)
|
||||
var/list/memory = list() // stored memory
|
||||
var/rawcode = "" // the code to compile (raw text)
|
||||
var/datum/TCS_Compiler/Compiler // the compiler that compiles and runs the code
|
||||
var/autoruncode = FALSE // TRUE if the code is set to run every time a signal is picked up
|
||||
var/encryption = "null" // encryption key: ie "password"
|
||||
var/salt = "null" // encryption salt: ie "123comsat"
|
||||
var/obj/item/radio/headset/server_radio
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/Destroy()
|
||||
QDEL_NULL_LIST(log_entries)
|
||||
QDEL_NULL(Compiler)
|
||||
QDEL_NULL(server_radio)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/Initialize()
|
||||
Compiler = new
|
||||
Compiler.Holder = src
|
||||
server_radio = new
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/sender)
|
||||
if (!signal.data["message"])
|
||||
return
|
||||
if (is_freq_listening(signal))
|
||||
if (traffic > 0)
|
||||
totaltraffic += traffic
|
||||
if (signal.data["type"] != SIGNAL_TEST)
|
||||
update_logs()
|
||||
var/datum/comm_log_entry/log = new
|
||||
var/mob/M = signal.data["mob"]
|
||||
log.parameters["mobtype"] = signal.data["mobtype"]
|
||||
log.parameters["job"] = signal.data["job"]
|
||||
log.parameters["key"] = signal.data["key"]
|
||||
log.parameters["vmessage"] = multilingual_to_message(signal.data["message"])
|
||||
log.parameters["vname"] = signal.data["vname"]
|
||||
log.parameters["message"] = multilingual_to_message(signal.data["message"])
|
||||
log.parameters["name"] = signal.data["name"]
|
||||
log.parameters["realname"] = signal.data["realname"]
|
||||
log.parameters["timecode"] = worldtime2stationtime(world.time)
|
||||
var/race = "unknown"
|
||||
if (ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
race = "[H.species.name]"
|
||||
log.parameters["intelligible"] = TRUE
|
||||
else if (isbrain(M))
|
||||
race = "Brain"
|
||||
log.parameters["intelligible"] = TRUE
|
||||
else if (M.isMonkey())
|
||||
race = "Monkey"
|
||||
else if (issilicon(M))
|
||||
race = "Artificial Life"
|
||||
log.parameters["intelligible"] = TRUE
|
||||
else if (isslime(M))
|
||||
race = "Slime"
|
||||
else if (isanimal(M))
|
||||
race = "Domestic Animal"
|
||||
log.parameters["race"] = race
|
||||
if (M && !istype(M, /mob/new_player))
|
||||
log.parameters["uspeech"] = M.universal_speak
|
||||
else
|
||||
log.parameters["uspeech"] = FALSE
|
||||
if (signal.data["compression"] > 0) // If the signal is still compressed, make the log entry gibberish
|
||||
log.parameters["message"] = Gibberish(multilingual_to_message(signal.data["message"]), signal.data["compression"] + 50)
|
||||
log.parameters["job"] = Gibberish(signal.data["job"], signal.data["compression"] + 50)
|
||||
log.parameters["name"] = Gibberish(signal.data["name"], signal.data["compression"] + 50)
|
||||
log.parameters["realname"] = Gibberish(signal.data["realname"], signal.data["compression"] + 50)
|
||||
log.parameters["vname"] = Gibberish(signal.data["vname"], signal.data["compression"] + 50)
|
||||
log.input_type = "Corrupt File"
|
||||
log_entries += log
|
||||
if (!(signal.data["name"] in stored_names))
|
||||
stored_names += signal.data["name"]
|
||||
logs++
|
||||
signal.data["server"] = src
|
||||
var/identifier = num2text(rand(-1000, 1000) + world.time)
|
||||
log.name = "data packet ([sha1(identifier)])"
|
||||
if (autoruncode && Compiler)
|
||||
Compiler.Run(signal)
|
||||
var/send_success = relay_information(signal, /obj/machinery/telecomms/hub)
|
||||
if (!send_success)
|
||||
relay_information(signal, /obj/machinery/telecomms/broadcaster)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/proc/add_entry(content, input)
|
||||
var/datum/comm_log_entry/log = new
|
||||
var/identifier = num2text(rand(-1000, 1000) + world.time)
|
||||
log.name = "[input] ([sha1(identifier)])"
|
||||
log.input_type = input
|
||||
log.parameters["message"] = content
|
||||
log.parameters["timecode"] = stationtime2text()
|
||||
log_entries += log
|
||||
update_logs()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/proc/compile()
|
||||
return Compiler?.Compile(rawcode)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/proc/setcode(text)
|
||||
if (istext(text))
|
||||
rawcode = text
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/proc/update_logs()
|
||||
if (logs >= max_logs)
|
||||
log_entries.Cut(0, log_cull_count)
|
||||
logs -= log_cull_count
|
||||
380
code/game/machinery/telecomms/telecomms.dm
Normal file
380
code/game/machinery/telecomms/telecomms.dm
Normal file
@@ -0,0 +1,380 @@
|
||||
/obj/machinery/telecomms
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
var/list/links = list() // list of machines this machine is linked to
|
||||
var/traffic = 0 // value increases as traffic increases
|
||||
var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed)
|
||||
var/list/autolinkers = list() // list of text/number values to link with
|
||||
var/id = "NULL" // identification string
|
||||
var/network = "NULL" // the network of the machinery
|
||||
var/list/freq_listening = list() // list of frequencies to tune into: if none, will listen to all
|
||||
var/machinetype = 0 // just a hacky way of preventing alike machines from pairing
|
||||
var/toggled = TRUE // Is it toggled on
|
||||
var/on = TRUE
|
||||
var/integrity = 100 // basically HP, loses integrity by heat
|
||||
var/produces_heat = TRUE //whether the machine will produce heat when on.
|
||||
var/delay = 10 // how many process() ticks to delay per heat
|
||||
var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub)
|
||||
var/hide = FALSE // Is it a hidden machine?
|
||||
var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to.
|
||||
var/list/temp // output message for interactions
|
||||
|
||||
|
||||
/obj/machinery/telecomms/Destroy()
|
||||
telecomms_list -= src
|
||||
for(var/obj/machinery/telecomms/comm in telecomms_list)
|
||||
comm.links -= src
|
||||
links = list()
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/Initialize()
|
||||
telecomms_list += src
|
||||
..()
|
||||
default_apply_parts()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
|
||||
/obj/machinery/telecomms/LateInitialize()
|
||||
if (!listening_level)
|
||||
var/turf/position = get_turf(src)
|
||||
listening_level = position.z
|
||||
if (!length(autolinkers))
|
||||
return
|
||||
var/list/linkables = telecomms_list
|
||||
if (!long_range_link)
|
||||
linkables = orange(20, src)
|
||||
for (var/obj/machinery/telecomms/machine in linkables)
|
||||
add_link(machine)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/attackby(obj/item/P, mob/user)
|
||||
if (istype(P, /obj/item/multitool))
|
||||
attack_hand(user)
|
||||
if (istype(P, /obj/item/stack/nanopaste))
|
||||
var/obj/item/stack/nanopaste/T = P
|
||||
if (integrity < 100)
|
||||
if (T.use(1))
|
||||
integrity = between(0, integrity + rand(10, 20), 100)
|
||||
to_chat(usr, "You apply the Nanopaste to [src], repairing some of the damage.")
|
||||
else
|
||||
to_chat(usr, "This machine is already in perfect condition.")
|
||||
return
|
||||
if (default_deconstruction_screwdriver(user, P))
|
||||
return
|
||||
if (default_deconstruction_crowbar(user, P))
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/telecomms/attack_ai(mob/user)
|
||||
attack_hand(user)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/attack_hand(mob/user)
|
||||
tgui_interact(user)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/emp_act(severity)
|
||||
if (prob(100 / severity))
|
||||
if (!(stat & EMPED))
|
||||
stat |= EMPED
|
||||
var/duration = (300 * 10) / severity
|
||||
spawn(rand(duration - 20, duration + 20))
|
||||
stat &= ~EMPED
|
||||
..()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/process()
|
||||
update_power()
|
||||
checkheat()
|
||||
update_icon()
|
||||
if (traffic > 0)
|
||||
traffic -= netspeed
|
||||
|
||||
|
||||
/obj/machinery/telecomms/tgui_act(action, params)
|
||||
if (..())
|
||||
return TRUE
|
||||
var/obj/item/multitool/P = get_multitool(usr)
|
||||
switch (action)
|
||||
if ("toggle")
|
||||
toggled = !toggled
|
||||
set_temp("-% [src] has been [toggled ? "activated" : "deactivated"].", "average")
|
||||
update_power()
|
||||
. = TRUE
|
||||
if ("id")
|
||||
var/response = input(usr, "Specify the new ID for this machine", src, id) as null | text
|
||||
var/newid = copytext(reject_bad_text(response), 1, MAX_MESSAGE_LEN)
|
||||
if(newid && canAccess(usr))
|
||||
id = newid
|
||||
set_temp("-% New ID assigned: \"[id]\" %-", "average")
|
||||
. = TRUE
|
||||
if ("network")
|
||||
var/newnet = input(usr, "Specify the new network for this machine. This will break all current links.", src, network) as null | text
|
||||
if (newnet && canAccess(usr))
|
||||
if (length(newnet) > 15)
|
||||
set_temp("-% Too many characters in new network tag %-", "average")
|
||||
else
|
||||
for (var/obj/machinery/telecomms/T in links)
|
||||
T.links -= src
|
||||
network = newnet
|
||||
links = list()
|
||||
set_temp("-% New network tag assigned: \"[network]\" %-", "average")
|
||||
. = TRUE
|
||||
if ("freq")
|
||||
var/newfreq = input(usr, "Specify a new frequency to filter (GHz). Decimals assigned automatically.", src, network) as null | num
|
||||
if (newfreq && canAccess(usr))
|
||||
if (findtext(num2text(newfreq), "."))
|
||||
newfreq *= 10 // shift the decimal one place
|
||||
if (!(newfreq in freq_listening) && newfreq < 10000)
|
||||
freq_listening += newfreq
|
||||
set_temp("-% New frequency filter assigned: \"[newfreq] GHz\" %-", "average")
|
||||
. = TRUE
|
||||
if ("delete")
|
||||
var/x = text2num(params["delete"])
|
||||
set_temp("-% Removed frequency filter [x] %-", "average")
|
||||
freq_listening-= x
|
||||
. = TRUE
|
||||
if ("unlink")
|
||||
if (text2num(params["unlink"]) <= length(links))
|
||||
var/obj/machinery/telecomms/T = links[text2num(params["unlink"])]
|
||||
set_temp("-% Removed \ref[T] [T.name] from linked entities. %-", "average")
|
||||
if (src in T.links)
|
||||
T.links -= src
|
||||
links -= T
|
||||
. = TRUE
|
||||
if ("link")
|
||||
if (P)
|
||||
if (P.buffer && P.buffer != src)
|
||||
if (!(src in P.buffer.links))
|
||||
P.buffer.links += src
|
||||
if (!(P.buffer in links))
|
||||
links += P.buffer
|
||||
set_temp("-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-", "average")
|
||||
else
|
||||
set_temp("-% Unable to acquire buffer %-", "average")
|
||||
. = TRUE
|
||||
if ("buffer")
|
||||
P.buffer = src
|
||||
set_temp("-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-", "average")
|
||||
. = TRUE
|
||||
if ("flush")
|
||||
set_temp("-% Buffer successfully flushed. %-", "average")
|
||||
P.buffer = null
|
||||
. = TRUE
|
||||
if ("cleartemp")
|
||||
temp = null
|
||||
. = TRUE
|
||||
if (OptionsHandler(action, params))
|
||||
. = TRUE
|
||||
add_fingerprint(usr)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["temp"] = temp
|
||||
data["on"] = on
|
||||
data["id"] = null
|
||||
data["network"] = null
|
||||
data["autolinkers"] = FALSE
|
||||
data["shadowlink"] = FALSE
|
||||
data["options"] = list()
|
||||
data["linked"] = list()
|
||||
data["filter"] = list()
|
||||
data["multitool"] = FALSE
|
||||
data["multitool_buffer"] = null
|
||||
if (on || interact_offline)
|
||||
data["id"] = id
|
||||
data["network"] = network
|
||||
data["autolinkers"] = !!LAZYLEN(autolinkers)
|
||||
data["shadowlink"] = !!hide
|
||||
data["options"] = OptionsMenu()
|
||||
var/obj/item/multitool/P = get_multitool(user)
|
||||
data["multitool"] = !!P
|
||||
data["multitool_buffer"] = null
|
||||
if (P && P.buffer)
|
||||
P.update_icon()
|
||||
data["multitool_buffer"] = list("name" = "[P.buffer]", "id" = "[P.buffer.id]")
|
||||
var/i = 0
|
||||
var/list/linked = list()
|
||||
for (var/obj/machinery/telecomms/T in links)
|
||||
i++
|
||||
linked += list(list(
|
||||
"ref" = "\ref[T]",
|
||||
"name" = "[T]",
|
||||
"id" = T.id,
|
||||
"index" = i,
|
||||
))
|
||||
data["linked"] = linked
|
||||
var/list/filter = list()
|
||||
if (length(freq_listening))
|
||||
for (var/x in freq_listening)
|
||||
filter += list(list(
|
||||
"name" = "[format_frequency(x)]",
|
||||
"freq" = x,
|
||||
))
|
||||
data["filter"] = filter
|
||||
return data
|
||||
|
||||
|
||||
/obj/machinery/telecomms/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if (!ui)
|
||||
ui = new(user, src, "TelecommsMultitoolMenu", name)
|
||||
ui.open()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/tgui_status(mob/user)
|
||||
if (!issilicon(user))
|
||||
if (!istype(user.get_active_hand(), /obj/item/multitool))
|
||||
return STATUS_CLOSE
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/telecomms/update_icon()
|
||||
if (on)
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "[initial(icon_state)]_off"
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/add_link(obj/machinery/telecomms/machine)
|
||||
if (machine == src)
|
||||
return
|
||||
if (machine in links)
|
||||
return
|
||||
var/src_z = get_z(src)
|
||||
var/machine_z = get_z(machine)
|
||||
if (src_z != machine_z && !(long_range_link && machine.long_range_link))
|
||||
return
|
||||
for (var/entry in autolinkers)
|
||||
if (entry in machine.autolinkers)
|
||||
links |= machine
|
||||
break
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/canAccess(mob/user)
|
||||
return issilicon(user) || in_range(user, src)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/checkheat()
|
||||
var/turf/simulated/turf = get_turf(src)
|
||||
if (!istype(turf))
|
||||
return
|
||||
var/datum/gas_mixture/environment = turf.return_air()
|
||||
var/damage_chance = 0
|
||||
switch(environment.temperature)
|
||||
if ((T0C + 40) to (T0C + 70))
|
||||
damage_chance = 10
|
||||
if ((T0C + 70) to (T0C + 130))
|
||||
damage_chance = 25
|
||||
if ((T0C + 130) to (T0C + 200))
|
||||
damage_chance = 50
|
||||
if ((T0C + 200) to INFINITY)
|
||||
damage_chance = 100
|
||||
if (damage_chance && prob(damage_chance))
|
||||
integrity = between(0, integrity - 1, 100)
|
||||
if (delay > 0)
|
||||
delay--
|
||||
else if (on)
|
||||
produce_heat()
|
||||
delay = initial(delay)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/is_freq_listening(datum/signal/signal)
|
||||
if (!signal)
|
||||
return FALSE
|
||||
if (!length(freq_listening) || (signal.frequency in freq_listening))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/produce_heat()
|
||||
if (!produces_heat)
|
||||
return
|
||||
if (!use_power)
|
||||
return
|
||||
if (stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
var/turf/simulated/turf = get_turf(src)
|
||||
if (!istype(turf))
|
||||
return
|
||||
var/datum/gas_mixture/env = turf.return_air()
|
||||
var/transfer_moles = 0.25 * env.total_moles
|
||||
var/datum/gas_mixture/removed = env.remove(transfer_moles)
|
||||
if (removed)
|
||||
var/heat_produced = idle_power_usage
|
||||
if (traffic <= 0)
|
||||
heat_produced *= 0.30
|
||||
removed.add_thermal_energy(heat_produced)
|
||||
env.merge(removed)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/receive_information(datum/signal/signal, obj/machinery/telecomms/sender)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/relay_direct_information(datum/signal/signal, obj/machinery/telecomms/receiver)
|
||||
receiver.receive_information(signal, src)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/relay_information(datum/signal/signal, filter, copysig, amount = 20)
|
||||
if (!on)
|
||||
return
|
||||
var/send_count = 0
|
||||
signal.data["slow"] += rand(0, round(100 - integrity))
|
||||
for (var/obj/machinery/telecomms/machine in links)
|
||||
if (filter && !istype(machine, filter))
|
||||
continue
|
||||
if (!machine.on)
|
||||
continue
|
||||
if (amount && send_count >= amount)
|
||||
break
|
||||
if (machine.loc.z != listening_level)
|
||||
if (!long_range_link && !machine.long_range_link)
|
||||
continue
|
||||
var/datum/signal/copy
|
||||
if (copysig)
|
||||
copy = new
|
||||
copy.transmission_method = TRANSMISSION_SUBSPACE
|
||||
copy.frequency = signal.frequency
|
||||
copy.data = signal.data.Copy()
|
||||
if (!signal.data["original"])
|
||||
copy.data["original"] = signal
|
||||
else
|
||||
copy.data["original"] = signal.data["original"]
|
||||
send_count++
|
||||
if (machine.is_freq_listening(signal))
|
||||
machine.traffic++
|
||||
if (copysig && copy)
|
||||
machine.receive_information(copy, src)
|
||||
else
|
||||
machine.receive_information(signal, src)
|
||||
if (send_count > 0 && is_freq_listening(signal))
|
||||
traffic++
|
||||
return send_count
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/set_temp(text, color = "average")
|
||||
temp = list("color" = color, "text" = text)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/update_power()
|
||||
if (integrity < 1)
|
||||
on = FALSE
|
||||
else if (stat & (BROKEN|NOPOWER|EMPED))
|
||||
on = FALSE
|
||||
else
|
||||
on = toggled
|
||||
|
||||
|
||||
/* Additional interface options for certain machines. Eg:
|
||||
* /obj/machinery/telecomms/processor/OptionsMenu()
|
||||
* return "<br>Processing Mode: <A href='?src=\ref[src];process=1'>[uncompress ? "UNCOMPRESS" : "COMPRESS"]</a>"
|
||||
*/
|
||||
/obj/machinery/telecomms/proc/OptionsMenu()
|
||||
return list()
|
||||
|
||||
|
||||
/// Topic handler for OptionsMenu href links.
|
||||
/obj/machinery/telecomms/proc/OptionsHandler(action, params)
|
||||
return
|
||||
@@ -1,691 +0,0 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/*
|
||||
Hello, friends, this is Doohl from sexylands. You may be wondering what this
|
||||
monstrous code file is. Sit down, boys and girls, while I tell you the tale.
|
||||
|
||||
|
||||
The machines defined in this file were designed to be compatible with any radio
|
||||
signals, provided they use subspace transmission. Currently they are only used for
|
||||
headsets, but they can eventually be outfitted for real COMPUTER networks. This
|
||||
is just a skeleton, ladies and gentlemen.
|
||||
|
||||
Look at radio.dm for the prequel to this code.
|
||||
*/
|
||||
|
||||
var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
|
||||
/obj/machinery/telecomms
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
var/list/links = list() // list of machines this machine is linked to
|
||||
var/traffic = 0 // value increases as traffic increases
|
||||
var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed)
|
||||
var/list/autolinkers = list() // list of text/number values to link with
|
||||
var/id = "NULL" // identification string
|
||||
var/network = "NULL" // the network of the machinery
|
||||
|
||||
var/list/freq_listening = list() // list of frequencies to tune into: if none, will listen to all
|
||||
|
||||
var/machinetype = 0 // just a hacky way of preventing alike machines from pairing
|
||||
var/toggled = 1 // Is it toggled on
|
||||
var/on = 1
|
||||
var/integrity = 100 // basically HP, loses integrity by heat
|
||||
var/produces_heat = 1 //whether the machine will produce heat when on.
|
||||
var/delay = 10 // how many process() ticks to delay per heat
|
||||
var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub)
|
||||
var/hide = 0 // Is it a hidden machine?
|
||||
var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to.
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/relay_information(datum/signal/signal, filter, copysig, amount = 20)
|
||||
// relay signal to all linked machinery that are of type [filter]. If signal has been sent [amount] times, stop sending
|
||||
|
||||
if(!on)
|
||||
return
|
||||
//to_world("[src] ([src.id]) - [signal.debug_print()]")
|
||||
var/send_count = 0
|
||||
|
||||
signal.data["slow"] += rand(0, round((100-integrity))) // apply some lag based on integrity
|
||||
|
||||
/*
|
||||
// Edit by Atlantis: Commented out as emergency fix due to causing extreme delays in communications.
|
||||
// Apply some lag based on traffic rates
|
||||
var/netlag = round(traffic / 50)
|
||||
if(netlag > signal.data["slow"])
|
||||
signal.data["slow"] = netlag
|
||||
*/
|
||||
// Loop through all linked machines and send the signal or copy.
|
||||
for(var/obj/machinery/telecomms/machine in links)
|
||||
if(filter && !istype(machine, filter))
|
||||
continue
|
||||
if(!machine.on)
|
||||
continue
|
||||
if(amount && send_count >= amount)
|
||||
break
|
||||
if(machine.loc.z != listening_level)
|
||||
if(long_range_link == 0 && machine.long_range_link == 0)
|
||||
continue
|
||||
// If we're sending a copy, be sure to create the copy for EACH machine and paste the data
|
||||
var/datum/signal/copy
|
||||
if(copysig)
|
||||
copy = new
|
||||
copy.transmission_method = TRANSMISSION_SUBSPACE
|
||||
copy.frequency = signal.frequency
|
||||
copy.data = signal.data.Copy()
|
||||
|
||||
// Keep the "original" signal constant
|
||||
if(!signal.data["original"])
|
||||
copy.data["original"] = signal
|
||||
else
|
||||
copy.data["original"] = signal.data["original"]
|
||||
|
||||
send_count++
|
||||
if(machine.is_freq_listening(signal))
|
||||
machine.traffic++
|
||||
|
||||
if(copysig && copy)
|
||||
machine.receive_information(copy, src)
|
||||
else
|
||||
machine.receive_information(signal, src)
|
||||
|
||||
|
||||
if(send_count > 0 && is_freq_listening(signal))
|
||||
traffic++
|
||||
|
||||
return send_count
|
||||
|
||||
/obj/machinery/telecomms/proc/relay_direct_information(datum/signal/signal, obj/machinery/telecomms/machine)
|
||||
// send signal directly to a machine
|
||||
machine.receive_information(signal, src)
|
||||
|
||||
/obj/machinery/telecomms/proc/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
|
||||
// receive information from linked machinery
|
||||
return
|
||||
|
||||
/obj/machinery/telecomms/proc/is_freq_listening(datum/signal/signal)
|
||||
// return 1 if found, 0 if not found
|
||||
if(!signal)
|
||||
return 0
|
||||
if((signal.frequency in freq_listening) || (!freq_listening.len))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/machinery/telecomms/Initialize()
|
||||
telecomms_list += src
|
||||
..()
|
||||
default_apply_parts()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/machinery/telecomms/LateInitialize()
|
||||
. = ..()
|
||||
|
||||
//Set the listening_level if there's none.
|
||||
if(!listening_level)
|
||||
//Defaults to our Z level!
|
||||
var/turf/position = get_turf(src)
|
||||
listening_level = position.z
|
||||
|
||||
if(autolinkers.len)
|
||||
// Links nearby machines
|
||||
if(!long_range_link)
|
||||
for(var/obj/machinery/telecomms/T in orange(20, src))
|
||||
add_link(T)
|
||||
else
|
||||
for(var/obj/machinery/telecomms/T in telecomms_list)
|
||||
add_link(T)
|
||||
|
||||
/obj/machinery/telecomms/Destroy()
|
||||
telecomms_list -= src
|
||||
for(var/obj/machinery/telecomms/comm in telecomms_list)
|
||||
comm.links -= src
|
||||
links = list()
|
||||
..()
|
||||
|
||||
// Used in auto linking
|
||||
/obj/machinery/telecomms/proc/add_link(var/obj/machinery/telecomms/T)
|
||||
var/pos_z = get_z(src)
|
||||
var/tpos_z = get_z(T)
|
||||
if((pos_z == tpos_z) || (src.long_range_link && T.long_range_link))
|
||||
for(var/x in autolinkers)
|
||||
if(T.autolinkers.Find(x))
|
||||
if(src != T)
|
||||
links |= T
|
||||
|
||||
/obj/machinery/telecomms/update_icon()
|
||||
if(on)
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "[initial(icon_state)]_off"
|
||||
|
||||
/obj/machinery/telecomms/proc/update_power()
|
||||
|
||||
if(toggled)
|
||||
if(stat & (BROKEN|NOPOWER|EMPED) || integrity <= 0) // if powered, on. if not powered, off. if too damaged, off
|
||||
on = 0
|
||||
else
|
||||
on = 1
|
||||
else
|
||||
on = 0
|
||||
|
||||
/obj/machinery/telecomms/process()
|
||||
update_power()
|
||||
|
||||
// Check heat and generate some
|
||||
checkheat()
|
||||
|
||||
// Update the icon
|
||||
update_icon()
|
||||
|
||||
if(traffic > 0)
|
||||
traffic -= netspeed
|
||||
|
||||
/obj/machinery/telecomms/emp_act(severity)
|
||||
if(prob(100/severity))
|
||||
if(!(stat & EMPED))
|
||||
stat |= EMPED
|
||||
var/duration = (300 * 10)/severity
|
||||
spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot.
|
||||
stat &= ~EMPED
|
||||
..()
|
||||
|
||||
/obj/machinery/telecomms/proc/checkheat()
|
||||
// Checks heat from the environment and applies any integrity damage
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
var/damage_chance = 0 // Percent based chance of applying 1 integrity damage this tick
|
||||
switch(environment.temperature)
|
||||
if((T0C + 40) to (T0C + 70)) // 40C-70C, minor overheat, 10% chance of taking damage
|
||||
damage_chance = 10
|
||||
if((T0C + 70) to (T0C + 130)) // 70C-130C, major overheat, 25% chance of taking damage
|
||||
damage_chance = 25
|
||||
if((T0C + 130) to (T0C + 200)) // 130C-200C, dangerous overheat, 50% chance of taking damage
|
||||
damage_chance = 50
|
||||
if((T0C + 200) to INFINITY) // More than 200C, INFERNO. Takes damage every tick.
|
||||
damage_chance = 100
|
||||
if (damage_chance && prob(damage_chance))
|
||||
integrity = between(0, integrity - 1, 100)
|
||||
|
||||
|
||||
if(delay > 0)
|
||||
delay--
|
||||
else if(on)
|
||||
produce_heat()
|
||||
delay = initial(delay)
|
||||
|
||||
|
||||
|
||||
/obj/machinery/telecomms/proc/produce_heat()
|
||||
if (!produces_heat)
|
||||
return
|
||||
|
||||
if (!use_power)
|
||||
return
|
||||
|
||||
if(!(stat & (NOPOWER|BROKEN)))
|
||||
var/turf/simulated/L = loc
|
||||
if(istype(L))
|
||||
var/datum/gas_mixture/env = L.return_air()
|
||||
|
||||
var/transfer_moles = 0.25 * env.total_moles
|
||||
|
||||
var/datum/gas_mixture/removed = env.remove(transfer_moles)
|
||||
|
||||
if(removed)
|
||||
|
||||
var/heat_produced = idle_power_usage //obviously can't produce more heat than the machine draws from it's power source
|
||||
if (traffic <= 0)
|
||||
heat_produced *= 0.30 //if idle, produce less heat.
|
||||
|
||||
removed.add_thermal_energy(heat_produced)
|
||||
|
||||
env.merge(removed)
|
||||
/*
|
||||
The receiver idles and receives messages from subspace-compatible radio equipment;
|
||||
primarily headsets. They then just relay this information to all linked devices,
|
||||
which can would probably be network hubs.
|
||||
|
||||
Link to Processor Units in case receiver can't send to bus units.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/receiver
|
||||
name = "Subspace Receiver"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "broadcast receiver"
|
||||
desc = "This machine has a dish-like shape and green lights. It is designed to detect and process subspace radio activity."
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 600
|
||||
machinetype = 1
|
||||
produces_heat = 0
|
||||
circuit = /obj/item/circuitboard/telecomms/receiver
|
||||
//Vars only used if you're using the overmap
|
||||
var/overmap_range = 0
|
||||
var/overmap_range_min = 0
|
||||
var/overmap_range_max = 5
|
||||
|
||||
var/list/linked_radios_weakrefs = list()
|
||||
|
||||
/obj/machinery/telecomms/receiver/proc/link_radio(var/obj/item/radio/R)
|
||||
if(!istype(R))
|
||||
return
|
||||
linked_radios_weakrefs |= weakref(R)
|
||||
|
||||
/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal)
|
||||
if(!on) // has to be on to receive messages
|
||||
return
|
||||
if(!signal)
|
||||
return
|
||||
if(!check_receive_level(signal))
|
||||
return
|
||||
|
||||
if(signal.transmission_method == TRANSMISSION_SUBSPACE)
|
||||
|
||||
if(is_freq_listening(signal)) // detect subspace signals
|
||||
|
||||
//Remove the level and then start adding levels that it is being broadcasted in.
|
||||
signal.data["level"] = list()
|
||||
|
||||
var/can_send = relay_information(signal, /obj/machinery/telecomms/hub) // ideally relay the copied information to relays
|
||||
if(!can_send)
|
||||
relay_information(signal, /obj/machinery/telecomms/bus) // Send it to a bus instead, if it's linked to one
|
||||
|
||||
/obj/machinery/telecomms/receiver/proc/check_receive_level(datum/signal/signal)
|
||||
// If it's a direct message from a bluespace radio, we eat it and convert it into a subspace signal locally
|
||||
if(signal.transmission_method == TRANSMISSION_BLUESPACE)
|
||||
var/obj/item/radio/R = signal.data["radio"]
|
||||
|
||||
//Who're you?
|
||||
if(!(weakref(R) in linked_radios_weakrefs))
|
||||
signal.data["reject"] = 1
|
||||
return 0
|
||||
|
||||
//We'll resend this for you
|
||||
signal.data["level"] = z
|
||||
signal.transmission_method = TRANSMISSION_SUBSPACE
|
||||
return 1
|
||||
|
||||
//Where can we hear?
|
||||
var/list/listening_levels = using_map.get_map_levels(listening_level, TRUE, overmap_range)
|
||||
|
||||
// We couldn't 'hear' it, maybe a relay linked to our hub can 'hear' it
|
||||
if(!(signal.data["level"] in listening_levels))
|
||||
for(var/obj/machinery/telecomms/hub/H in links)
|
||||
var/list/relayed_levels = list()
|
||||
for(var/obj/machinery/telecomms/relay/R in H.links)
|
||||
if(R.can_receive(signal))
|
||||
relayed_levels |= R.listening_level
|
||||
if(signal.data["level"] in relayed_levels)
|
||||
return 1
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
/*
|
||||
The HUB idles until it receives information. It then passes on that information
|
||||
depending on where it came from.
|
||||
|
||||
This is the heart of the Telecommunications Network, sending information where it
|
||||
is needed. It mainly receives information from long-distance Relays and then sends
|
||||
that information to be processed. Afterwards it gets the uncompressed information
|
||||
from Servers/Buses and sends that back to the relay, to then be broadcasted.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/hub
|
||||
name = "Telecommunication Hub"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "hub"
|
||||
desc = "A mighty piece of hardware used to send/receive massive amounts of data."
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 1600
|
||||
machinetype = 7
|
||||
circuit = /obj/item/circuitboard/telecomms/hub
|
||||
long_range_link = 1
|
||||
netspeed = 40
|
||||
|
||||
/obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
|
||||
if(is_freq_listening(signal))
|
||||
if(istype(machine_from, /obj/machinery/telecomms/receiver))
|
||||
//If the signal is compressed, send it to the bus.
|
||||
relay_information(signal, /obj/machinery/telecomms/bus, 1) // ideally relay the copied information to bus units
|
||||
else
|
||||
// Get a list of relays that we're linked to, then send the signal to their levels.
|
||||
relay_information(signal, /obj/machinery/telecomms/relay, 1)
|
||||
relay_information(signal, /obj/machinery/telecomms/broadcaster, 1) // Send it to a broadcaster.
|
||||
|
||||
|
||||
/*
|
||||
The relay idles until it receives information. It then passes on that information
|
||||
depending on where it came from.
|
||||
|
||||
The relay is needed in order to send information pass Z levels. It must be linked
|
||||
with a HUB, the only other machine that can send/receive pass Z levels.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/relay
|
||||
name = "Telecommunication Relay"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "relay"
|
||||
desc = "A mighty piece of hardware used to send massive amounts of data far away."
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 600
|
||||
machinetype = 8
|
||||
produces_heat = 0
|
||||
circuit = /obj/item/circuitboard/telecomms/relay
|
||||
netspeed = 5
|
||||
long_range_link = 1
|
||||
var/broadcasting = 1
|
||||
var/receiving = 1
|
||||
|
||||
/obj/machinery/telecomms/relay/forceMove(var/newloc)
|
||||
. = ..(newloc)
|
||||
listening_level = z
|
||||
|
||||
/obj/machinery/telecomms/relay/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
|
||||
|
||||
// Add our level and send it back
|
||||
if(can_send(signal))
|
||||
signal.data["level"] |= using_map.get_map_levels(listening_level)
|
||||
|
||||
// Checks to see if it can send/receive.
|
||||
|
||||
/obj/machinery/telecomms/relay/proc/can(datum/signal/signal)
|
||||
if(!on)
|
||||
return 0
|
||||
if(!is_freq_listening(signal))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/telecomms/relay/proc/can_send(datum/signal/signal)
|
||||
if(!can(signal))
|
||||
return 0
|
||||
return broadcasting
|
||||
|
||||
/obj/machinery/telecomms/relay/proc/can_receive(datum/signal/signal)
|
||||
if(!can(signal))
|
||||
return 0
|
||||
return receiving
|
||||
|
||||
/*
|
||||
The bus mainframe idles and waits for hubs to relay them signals. They act
|
||||
as junctions for the network.
|
||||
|
||||
They transfer uncompressed subspace packets to processor units, and then take
|
||||
the processed packet to a server for logging.
|
||||
|
||||
Link to a subspace hub if it can't send to a server.
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/bus
|
||||
name = "Bus Mainframe"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "bus"
|
||||
desc = "A mighty piece of hardware used to send massive amounts of data quickly."
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 1000
|
||||
machinetype = 2
|
||||
circuit = /obj/item/circuitboard/telecomms/bus
|
||||
netspeed = 40
|
||||
var/change_frequency = 0
|
||||
|
||||
/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
|
||||
|
||||
if(is_freq_listening(signal))
|
||||
|
||||
if(change_frequency)
|
||||
signal.frequency = change_frequency
|
||||
|
||||
if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it
|
||||
// send to one linked processor unit
|
||||
var/send_to_processor = relay_information(signal, /obj/machinery/telecomms/processor)
|
||||
|
||||
if(send_to_processor)
|
||||
return
|
||||
// failed to send to a processor, relay information anyway
|
||||
signal.data["slow"] += rand(1, 5) // slow the signal down only slightly
|
||||
src.receive_information(signal, src)
|
||||
|
||||
// Try sending it!
|
||||
var/list/try_send = list(/obj/machinery/telecomms/server, /obj/machinery/telecomms/hub, /obj/machinery/telecomms/broadcaster, /obj/machinery/telecomms/bus)
|
||||
var/i = 0
|
||||
for(var/send in try_send)
|
||||
if(i)
|
||||
signal.data["slow"] += rand(0, 1) // slow the signal down only slightly
|
||||
i++
|
||||
var/can_send = relay_information(signal, send)
|
||||
if(can_send)
|
||||
break
|
||||
|
||||
|
||||
|
||||
/*
|
||||
The processor is a very simple machine that decompresses subspace signals and
|
||||
transfers them back to the original bus. It is essential in producing audible
|
||||
data.
|
||||
|
||||
Link to servers if bus is not present
|
||||
*/
|
||||
|
||||
/obj/machinery/telecomms/processor
|
||||
name = "Processor Unit"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "processor"
|
||||
desc = "This machine is used to process large quantities of information."
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 600
|
||||
machinetype = 3
|
||||
delay = 5
|
||||
circuit = /obj/item/circuitboard/telecomms/processor
|
||||
var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals
|
||||
|
||||
/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
|
||||
|
||||
if(is_freq_listening(signal))
|
||||
|
||||
if(process_mode)
|
||||
signal.data["compression"] = 0 // uncompress subspace signal
|
||||
else
|
||||
signal.data["compression"] = 100 // even more compressed signal
|
||||
|
||||
if(istype(machine_from, /obj/machinery/telecomms/bus))
|
||||
relay_direct_information(signal, machine_from) // send the signal back to the machine
|
||||
else // no bus detected - send the signal to servers instead
|
||||
signal.data["slow"] += rand(5, 10) // slow the signal down
|
||||
relay_information(signal, /obj/machinery/telecomms/server)
|
||||
|
||||
|
||||
/*
|
||||
The server logs all traffic and signal data. Once it records the signal, it sends
|
||||
it to the subspace broadcaster.
|
||||
|
||||
Store a maximum of 100 logs and then deletes them.
|
||||
*/
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server
|
||||
name = "Telecommunication Server"
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "comm_server"
|
||||
desc = "A machine used to store data and network statistics."
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = USE_POWER_IDLE
|
||||
idle_power_usage = 300
|
||||
machinetype = 4
|
||||
circuit = /obj/item/circuitboard/telecomms/server
|
||||
var/list/log_entries = list()
|
||||
var/list/stored_names = list()
|
||||
var/list/TrafficActions = list()
|
||||
var/logs = 0 // number of logs
|
||||
var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes)
|
||||
|
||||
var/list/memory = list() // stored memory
|
||||
var/rawcode = "" // the code to compile (raw text)
|
||||
var/datum/TCS_Compiler/Compiler // the compiler that compiles and runs the code
|
||||
var/autoruncode = 0 // 1 if the code is set to run every time a signal is picked up
|
||||
|
||||
var/encryption = "null" // encryption key: ie "password"
|
||||
var/salt = "null" // encryption salt: ie "123comsat"
|
||||
// would add up to md5("password123comsat")
|
||||
var/obj/item/radio/headset/server_radio = null
|
||||
|
||||
/obj/machinery/telecomms/server/Initialize()
|
||||
Compiler = new
|
||||
Compiler.Holder = src
|
||||
server_radio = new
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
|
||||
|
||||
if(signal.data["message"])
|
||||
|
||||
if(is_freq_listening(signal))
|
||||
|
||||
if(traffic > 0)
|
||||
totaltraffic += traffic // add current traffic to total traffic
|
||||
|
||||
//Is this a test signal? Bypass logging
|
||||
if(signal.data["type"] != SIGNAL_TEST)
|
||||
|
||||
// If signal has a message and appropriate frequency
|
||||
|
||||
update_logs()
|
||||
|
||||
var/datum/comm_log_entry/log = new
|
||||
var/mob/M = signal.data["mob"]
|
||||
|
||||
// Copy the signal.data entries we want
|
||||
log.parameters["mobtype"] = signal.data["mobtype"]
|
||||
log.parameters["job"] = signal.data["job"]
|
||||
log.parameters["key"] = signal.data["key"]
|
||||
log.parameters["vmessage"] = multilingual_to_message(signal.data["message"])
|
||||
log.parameters["vname"] = signal.data["vname"]
|
||||
log.parameters["message"] = multilingual_to_message(signal.data["message"])
|
||||
log.parameters["name"] = signal.data["name"]
|
||||
log.parameters["realname"] = signal.data["realname"]
|
||||
log.parameters["timecode"] = worldtime2stationtime(world.time)
|
||||
|
||||
var/race = "unknown"
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
race = "[H.species.name]"
|
||||
log.parameters["intelligible"] = 1
|
||||
else if(isbrain(M))
|
||||
race = "Brain"
|
||||
log.parameters["intelligible"] = 1
|
||||
else if(M.isMonkey())
|
||||
race = "Monkey"
|
||||
else if(issilicon(M))
|
||||
race = "Artificial Life"
|
||||
log.parameters["intelligible"] = 1
|
||||
else if(isslime(M))
|
||||
race = "Slime"
|
||||
else if(isanimal(M))
|
||||
race = "Domestic Animal"
|
||||
|
||||
log.parameters["race"] = race
|
||||
|
||||
if(!istype(M, /mob/new_player) && M)
|
||||
log.parameters["uspeech"] = M.universal_speak
|
||||
else
|
||||
log.parameters["uspeech"] = 0
|
||||
|
||||
// If the signal is still compressed, make the log entry gibberish
|
||||
if(signal.data["compression"] > 0)
|
||||
log.parameters["message"] = Gibberish(multilingual_to_message(signal.data["message"]), signal.data["compression"] + 50)
|
||||
log.parameters["job"] = Gibberish(signal.data["job"], signal.data["compression"] + 50)
|
||||
log.parameters["name"] = Gibberish(signal.data["name"], signal.data["compression"] + 50)
|
||||
log.parameters["realname"] = Gibberish(signal.data["realname"], signal.data["compression"] + 50)
|
||||
log.parameters["vname"] = Gibberish(signal.data["vname"], signal.data["compression"] + 50)
|
||||
log.input_type = "Corrupt File"
|
||||
|
||||
// Log and store everything that needs to be logged
|
||||
log_entries.Add(log)
|
||||
if(!(signal.data["name"] in stored_names))
|
||||
stored_names.Add(signal.data["name"])
|
||||
logs++
|
||||
signal.data["server"] = src
|
||||
|
||||
// Give the log a name
|
||||
var/identifier = num2text( rand(-1000,1000) + world.time )
|
||||
log.name = "data packet ([md5(identifier)])"
|
||||
|
||||
if(Compiler && autoruncode)
|
||||
Compiler.Run(signal) // execute the code
|
||||
|
||||
var/can_send = relay_information(signal, /obj/machinery/telecomms/hub)
|
||||
if(!can_send)
|
||||
relay_information(signal, /obj/machinery/telecomms/broadcaster)
|
||||
|
||||
|
||||
/obj/machinery/telecomms/server/proc/setcode(var/t)
|
||||
if(t)
|
||||
if(istext(t))
|
||||
rawcode = t
|
||||
|
||||
/obj/machinery/telecomms/server/proc/compile()
|
||||
if(Compiler)
|
||||
return Compiler.Compile(rawcode)
|
||||
|
||||
/obj/machinery/telecomms/server/proc/update_logs()
|
||||
// start deleting the very first log entry
|
||||
if(logs >= 400)
|
||||
for(var/i = 1, i <= logs, i++) // locate the first garbage collectable log entry and remove it
|
||||
var/datum/comm_log_entry/L = log_entries[i]
|
||||
if(L.garbage_collector)
|
||||
log_entries.Remove(L)
|
||||
logs--
|
||||
break
|
||||
|
||||
/obj/machinery/telecomms/server/proc/add_entry(var/content, var/input)
|
||||
var/datum/comm_log_entry/log = new
|
||||
var/identifier = num2text( rand(-1000,1000) + world.time )
|
||||
log.name = "[input] ([md5(identifier)])"
|
||||
log.input_type = input
|
||||
log.parameters["message"] = content
|
||||
log.parameters["timecode"] = stationtime2text()
|
||||
log_entries.Add(log)
|
||||
update_logs()
|
||||
|
||||
|
||||
|
||||
|
||||
// Simple log entry datum
|
||||
|
||||
/datum/comm_log_entry
|
||||
var/parameters = list() // carbon-copy to signal.data[]
|
||||
var/name = "data packet (#)"
|
||||
var/garbage_collector = 1 // if set to 0, will not be garbage collected
|
||||
var/input_type = "Speech File"
|
||||
|
||||
//Generic telecomm connectivity test proc
|
||||
/proc/can_telecomm(var/atom/A, var/atom/B, var/ad_hoc = FALSE)
|
||||
if(!A || !B)
|
||||
log_debug("can_telecomm(): Undefined endpoints!")
|
||||
return FALSE
|
||||
|
||||
//Can't in this case, obviously!
|
||||
if(is_jammed(A) || is_jammed(B))
|
||||
return FALSE
|
||||
|
||||
//Items don't have a Z when inside an object or mob
|
||||
var/turf/src_z = get_z(A)
|
||||
var/turf/dst_z = get_z(B)
|
||||
|
||||
//Nullspace, probably.
|
||||
if(!src_z || !dst_z)
|
||||
return FALSE
|
||||
|
||||
//We can do the simple check first, if you have ad_hoc radios.
|
||||
if(ad_hoc && src_z == dst_z)
|
||||
return TRUE
|
||||
|
||||
return src_z in using_map.get_map_levels(dst_z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)
|
||||
@@ -1,128 +1,124 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
|
||||
/*
|
||||
Telecomms monitor tracks the overall trafficing of a telecommunications network
|
||||
and displays a heirarchy of linked machines.
|
||||
/* Telecomms Monitor
|
||||
* Tracks the overall trafficing of a telecommunications network and
|
||||
* displays a heirarchy of linked machines.
|
||||
*/
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor
|
||||
name = "Telecommunications Monitor"
|
||||
desc = "Used to traverse a telecommunication network. Helpful for debugging connection issues."
|
||||
icon_screen = "comm_monitor"
|
||||
|
||||
var/screen = 0 // the screen number:
|
||||
var/list/machinelist = list() // the machines located by the computer
|
||||
var/obj/machinery/telecomms/SelectedMachine
|
||||
icon_keyboard = "tech_key"
|
||||
circuit = /obj/item/circuitboard/comm_monitor
|
||||
var/screen = 0 // the screen number
|
||||
var/obj/machinery/telecomms/SelectedMachine
|
||||
var/list/machinelist = list() // the machines located by the computer
|
||||
var/network = "NULL" // the network to probe
|
||||
var/list/temp // temporary feedback messages
|
||||
|
||||
var/network = "NULL" // the network to probe
|
||||
|
||||
var/list/temp = null // temporary feedback messages
|
||||
/obj/machinery/computer/telecomms/monitor/Destroy()
|
||||
LAZYCLEARLIST(machinelist)
|
||||
SelectedMachine = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["network"] = network
|
||||
data["temp"] = temp
|
||||
|
||||
var/list/machinelist = list()
|
||||
for(var/obj/machinery/telecomms/T in src.machinelist)
|
||||
machinelist.Add(list(list(
|
||||
"id" = T.id,
|
||||
"name" = T.name,
|
||||
)))
|
||||
data["machinelist"] = machinelist
|
||||
|
||||
data["selectedMachine"] = null
|
||||
if(SelectedMachine)
|
||||
data["selectedMachine"] = list(
|
||||
"id" = SelectedMachine.id,
|
||||
"name" = SelectedMachine.name,
|
||||
)
|
||||
var/list/links = list()
|
||||
for(var/obj/machinery/telecomms/T in SelectedMachine.links)
|
||||
if(!T.hide)
|
||||
links.Add(list(list(
|
||||
"id" = T.id,
|
||||
"name" = T.name
|
||||
)))
|
||||
data["selectedMachine"]["links"] = links
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
if (stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "TelecommsMachineBrowser", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/emag_act(remaining_charges, mob/user)
|
||||
if (emagged)
|
||||
return
|
||||
playsound(src, 'sound/effects/sparks4.ogg', 75, TRUE)
|
||||
emagged = TRUE
|
||||
to_chat(user, SPAN_NOTICE("You you disable the security protocols"))
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/tgui_act(action, params)
|
||||
if(..())
|
||||
if (..())
|
||||
return TRUE
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
switch(action)
|
||||
if("view")
|
||||
for(var/obj/machinery/telecomms/T in machinelist)
|
||||
if(T.id == params["id"])
|
||||
SelectedMachine = T
|
||||
switch (action)
|
||||
if ("view")
|
||||
for (var/obj/machinery/telecomms/machine in machinelist)
|
||||
if (machine.id == params["id"])
|
||||
SelectedMachine = machine
|
||||
break
|
||||
. = TRUE
|
||||
|
||||
if("mainmenu")
|
||||
if ("mainmenu")
|
||||
SelectedMachine = null
|
||||
. = TRUE
|
||||
|
||||
if("release")
|
||||
if ("release")
|
||||
machinelist = list()
|
||||
SelectedMachine = null
|
||||
. = TRUE
|
||||
|
||||
if("scan")
|
||||
if(machinelist.len > 0)
|
||||
if ("scan")
|
||||
if (length(machinelist))
|
||||
set_temp("FAILED: CANNOT PROBE WHEN BUFFER FULL", "bad")
|
||||
return TRUE
|
||||
|
||||
for(var/obj/machinery/telecomms/T in range(25, src))
|
||||
if(T.network == network)
|
||||
machinelist.Add(T)
|
||||
|
||||
if(!machinelist.len)
|
||||
set_temp("FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\]", "bad")
|
||||
else
|
||||
for (var/obj/machinery/telecomms/machine in range(25, src))
|
||||
if (machine.network == network)
|
||||
machinelist += machine
|
||||
if(length(machinelist))
|
||||
set_temp("[machinelist.len] ENTITIES LOCATED & BUFFERED", "good")
|
||||
else
|
||||
set_temp("FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\]", "bad")
|
||||
. = TRUE
|
||||
|
||||
if("network")
|
||||
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
|
||||
if(newnet && ((usr in range(1, src) || issilicon(usr))))
|
||||
if(length(newnet) > 15)
|
||||
if ("network")
|
||||
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null | text
|
||||
if (newnet && (issilicon(usr) || (usr in range(1, src))))
|
||||
if (length(newnet) > 15)
|
||||
set_temp("FAILED: NETWORK TAG STRING TOO LENGTHY", "bad")
|
||||
return TRUE
|
||||
network = newnet
|
||||
machinelist = list()
|
||||
set_temp("NEW NETWORK TAG SET IN ADDRESS \[[network]\]", "good")
|
||||
|
||||
. = TRUE
|
||||
|
||||
if("cleartemp")
|
||||
if ("cleartemp")
|
||||
temp = null
|
||||
. = TRUE
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/emag_act(var/remaining_charges, var/mob/user)
|
||||
if(!emagged)
|
||||
playsound(src, 'sound/effects/sparks4.ogg', 75, 1)
|
||||
emagged = 1
|
||||
to_chat(user, "<span class='notice'>You you disable the security protocols</span>")
|
||||
src.updateUsrDialog()
|
||||
return 1
|
||||
/obj/machinery/computer/telecomms/monitor/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["network"] = network
|
||||
data["temp"] = temp
|
||||
var/list/machinelist = list()
|
||||
for (var/obj/machinery/telecomms/machine in machinelist)
|
||||
machinelist += list(list(
|
||||
"id" = machine.id,
|
||||
"name" = machine.name,
|
||||
))
|
||||
data["machinelist"] = machinelist
|
||||
data["selectedMachine"] = null
|
||||
if (!SelectedMachine)
|
||||
return data
|
||||
data["selectedMachine"] = list(
|
||||
"id" = SelectedMachine.id,
|
||||
"name" = SelectedMachine.name,
|
||||
)
|
||||
var/list/links = list()
|
||||
for (var/obj/machinery/telecomms/machine in SelectedMachine.links)
|
||||
if (machine.hide)
|
||||
continue
|
||||
links += list(list(
|
||||
"id" = machine.id,
|
||||
"name" = machine.name
|
||||
))
|
||||
data["selectedMachine"]["links"] = links
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/proc/set_temp(var/text, var/color = "average")
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/tgui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if (!ui)
|
||||
ui = new(user, src, "TelecommsMachineBrowser", name)
|
||||
ui.open()
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/monitor/proc/set_temp(text, color = "average")
|
||||
temp = list("color" = color, "text" = text)
|
||||
|
||||
@@ -1,176 +1,122 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/traffic
|
||||
name = "Telecommunications Traffic Control"
|
||||
desc = "Used to upload code to telecommunication consoles for execution."
|
||||
icon_screen = "generic"
|
||||
|
||||
var/screen = 0 // the screen number:
|
||||
icon_keyboard = "tech_key"
|
||||
circuit = /obj/item/circuitboard/comm_traffic
|
||||
req_access = list(access_tcomsat)
|
||||
var/const/SCREEN_MAIN_MENU = 0
|
||||
var/const/SCREEN_VIEW_SERVER = 1
|
||||
var/screen = SCREEN_MAIN_MENU
|
||||
var/list/servers = list() // the servers located by the computer
|
||||
var/mob/editingcode
|
||||
var/mob/lasteditor
|
||||
var/list/viewingcode = list()
|
||||
var/obj/machinery/telecomms/server/SelectedServer
|
||||
circuit = /obj/item/circuitboard/comm_traffic
|
||||
req_access = list(access_tcomsat)
|
||||
|
||||
var/network = "NULL" // the network to probe
|
||||
var/temp = "" // temporary feedback messages
|
||||
|
||||
var/storedcode = "" // code stored
|
||||
var/network = "NULL" // the network to probe
|
||||
var/temp = "" // temporary feedback messages
|
||||
var/storedcode = "" // code stored
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/traffic/proc/update_ide()
|
||||
|
||||
// loop if there's someone manning the keyboard
|
||||
while(editingcode)
|
||||
if(!editingcode.client)
|
||||
editingcode = null
|
||||
break
|
||||
|
||||
// For the typer, the input is enabled. Buffer the typed text
|
||||
if(editingcode)
|
||||
storedcode = "[winget(editingcode, "tcscode", "text")]"
|
||||
if(editingcode) // double if's to work around a runtime error
|
||||
winset(editingcode, "tcscode", "is-disabled=false")
|
||||
|
||||
// If the player's not manning the keyboard anymore, adjust everything
|
||||
if( (!(editingcode in range(1, src)) && !issilicon(editingcode)) || (editingcode.machine != src && !issilicon(editingcode)))
|
||||
if(editingcode)
|
||||
winshow(editingcode, "Telecomms IDE", 0) // hide the window!
|
||||
editingcode = null
|
||||
break
|
||||
|
||||
// For other people viewing the typer type code, the input is disabled and they can only view the code
|
||||
// (this is put in place so that there's not any magical shenanigans with 50 people inputting different code all at once)
|
||||
|
||||
if(length(viewingcode))
|
||||
// This piece of code is very important - it escapes quotation marks so string aren't cut off by the input element
|
||||
var/showcode = replacetext(storedcode, "\\\"", "\\\\\"")
|
||||
showcode = replacetext(storedcode, "\"", "\\\"")
|
||||
|
||||
for(var/mob/M in viewingcode)
|
||||
|
||||
if( (M.machine == src && (M in view(1, src)) ) || issilicon(M))
|
||||
winset(M, "tcscode", "is-disabled=true")
|
||||
winset(M, "tcscode", "text=\"[showcode]\"")
|
||||
else
|
||||
viewingcode.Remove(M)
|
||||
winshow(M, "Telecomms IDE", 0) // hide the window!
|
||||
|
||||
sleep(5)
|
||||
|
||||
if(length(viewingcode) > 0)
|
||||
editingcode = pick(viewingcode)
|
||||
viewingcode.Remove(editingcode)
|
||||
update_ide()
|
||||
/obj/machinery/computer/telecomms/traffic/Destroy()
|
||||
if (editingcode)
|
||||
winshow(editingcode, "Telecomms IDE", FALSE)
|
||||
editingcode.unset_machine()
|
||||
editingcode = null
|
||||
for (var/mob/viewer in viewingcode)
|
||||
winshow(viewer, "Telecomms IDE", FALSE)
|
||||
viewer.unset_machine()
|
||||
LAZYCLEARLIST(viewingcode)
|
||||
SelectedServer = null
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user as mob)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user)
|
||||
if (stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<TITLE>Telecommunication Traffic Control</TITLE><center><b>Telecommunications Traffic Control</b></center>"
|
||||
|
||||
switch(screen)
|
||||
|
||||
|
||||
// --- Main Menu ---
|
||||
|
||||
if(0)
|
||||
if (SCREEN_MAIN_MENU) // Main Menu
|
||||
dat += "<br>[temp]<br>"
|
||||
dat += "<br>Current Network: <a href='?src=\ref[src];network=1'>[network]</a><br>"
|
||||
if(servers.len)
|
||||
if(length(servers))
|
||||
dat += "<br>Detected Telecommunication Servers:<ul>"
|
||||
for(var/obj/machinery/telecomms/T in servers)
|
||||
dat += "<li><a href='?src=\ref[src];viewserver=[T.id]'>\ref[T] [T.name]</a> ([T.id])</li>"
|
||||
for(var/obj/machinery/telecomms/machine in servers)
|
||||
dat += "<li><a href='?src=\ref[src];viewserver=[machine.id]'>\ref[machine] [machine.name]</a> ([machine.id])</li>"
|
||||
dat += "</ul>"
|
||||
dat += "<br><a href='?src=\ref[src];operation=release'>\[Flush Buffer\]</a>"
|
||||
|
||||
else
|
||||
dat += "<br>No servers detected. Scan for servers: <a href='?src=\ref[src];operation=scan'>\[Scan\]</a>"
|
||||
|
||||
|
||||
// --- Viewing Server ---
|
||||
|
||||
if(1)
|
||||
if (SCREEN_VIEW_SERVER) // Viewing Server
|
||||
dat += "<br>[temp]<br>"
|
||||
dat += "<center><a href='?src=\ref[src];operation=mainmenu'>\[Main Menu\]</a> <a href='?src=\ref[src];operation=refresh'>\[Refresh\]</a></center>"
|
||||
dat += "<br>Current Network: [network]"
|
||||
dat += "<br>Selected Server: [SelectedServer.id]<br><br>"
|
||||
dat += "<br><a href='?src=\ref[src];operation=editcode'>\[Edit Code\]</a>"
|
||||
dat += "<br>Signal Execution: "
|
||||
if(SelectedServer.autoruncode)
|
||||
if (SelectedServer.autoruncode)
|
||||
dat += "<a href='?src=\ref[src];operation=togglerun'>ALWAYS</a>"
|
||||
else
|
||||
dat += "<a href='?src=\ref[src];operation=togglerun'>NEVER</a>"
|
||||
|
||||
|
||||
user << browse(dat, "window=traffic_control;size=575x400")
|
||||
onclose(user, "server_control")
|
||||
|
||||
temp = ""
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/traffic/Topic(href, href_list)
|
||||
if(..())
|
||||
/obj/machinery/computer/telecomms/traffic/emag_act(remaining_charges, mob/user)
|
||||
if (emagged)
|
||||
return
|
||||
playsound(src, 'sound/effects/sparks4.ogg', 75, TRUE)
|
||||
emagged = TRUE
|
||||
to_chat(user, SPAN_NOTICE("You you disable the security protocols"))
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/computer/telecomms/traffic/Topic(href, href_list)
|
||||
if (..())
|
||||
return
|
||||
add_fingerprint(usr)
|
||||
usr.set_machine(src)
|
||||
if(!src.allowed(usr) && !emagged)
|
||||
if (!emagged && !allowed(usr))
|
||||
to_chat(usr, "<span class='warning'>ACCESS DENIED.</span>")
|
||||
return
|
||||
|
||||
if(href_list["viewserver"])
|
||||
screen = 1
|
||||
for(var/obj/machinery/telecomms/T in servers)
|
||||
if(T.id == href_list["viewserver"])
|
||||
SelectedServer = T
|
||||
if (href_list["viewserver"])
|
||||
screen = SCREEN_VIEW_SERVER
|
||||
for (var/obj/machinery/telecomms/machine in servers)
|
||||
if(machine.id == href_list["viewserver"])
|
||||
SelectedServer = machine
|
||||
break
|
||||
|
||||
if(href_list["operation"])
|
||||
switch(href_list["operation"])
|
||||
|
||||
if("release")
|
||||
if (href_list["operation"])
|
||||
switch (href_list["operation"])
|
||||
if ("release")
|
||||
servers = list()
|
||||
screen = 0
|
||||
|
||||
if("mainmenu")
|
||||
screen = 0
|
||||
|
||||
if("scan")
|
||||
if(servers.len > 0)
|
||||
screen = SCREEN_MAIN_MENU
|
||||
if ("mainmenu")
|
||||
screen = SCREEN_MAIN_MENU
|
||||
if ("scan")
|
||||
if(length(servers))
|
||||
temp = "<font color = #D70B00>- FAILED: CANNOT PROBE WHEN BUFFER FULL -</font>"
|
||||
|
||||
else
|
||||
for(var/obj/machinery/telecomms/server/T in range(25, src))
|
||||
if(T.network == network)
|
||||
servers.Add(T)
|
||||
|
||||
if(!servers.len)
|
||||
temp = "<font color = #D70B00>- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -</font>"
|
||||
for (var/obj/machinery/telecomms/server/server in range(25, src))
|
||||
if (server.network == network)
|
||||
servers += server
|
||||
if(!length(servers))
|
||||
temp = "<font color = #336699>- 0 SERVERS PROBED & BUFFERED -</font>"
|
||||
else
|
||||
temp = "<font color = #336699>- [servers.len] SERVERS PROBED & BUFFERED -</font>"
|
||||
|
||||
screen = 0
|
||||
|
||||
if("editcode")
|
||||
if(editingcode == usr) return
|
||||
if(usr in viewingcode) return
|
||||
|
||||
if(!editingcode)
|
||||
temp = "<font color = #D70B00>- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -</font>"
|
||||
screen = SCREEN_MAIN_MENU
|
||||
if ("editcode")
|
||||
if (editingcode == usr)
|
||||
return
|
||||
if (usr in viewingcode)
|
||||
return
|
||||
if (!editingcode)
|
||||
lasteditor = usr
|
||||
editingcode = usr
|
||||
winshow(editingcode, "Telecomms IDE", 1) // show the IDE
|
||||
winshow(editingcode, "Telecomms IDE", TRUE)
|
||||
winset(editingcode, "tcscode", "is-disabled=false")
|
||||
winset(editingcode, "tcscode", "text=\"\"")
|
||||
var/showcode = replacetext(storedcode, "\\\"", "\\\\\"")
|
||||
@@ -178,40 +124,54 @@
|
||||
winset(editingcode, "tcscode", "text=\"[showcode]\"")
|
||||
spawn()
|
||||
update_ide()
|
||||
|
||||
else
|
||||
viewingcode.Add(usr)
|
||||
winshow(usr, "Telecomms IDE", 1) // show the IDE
|
||||
viewingcode += usr
|
||||
winshow(usr, "Telecomms IDE", TRUE)
|
||||
winset(usr, "tcscode", "is-disabled=true")
|
||||
winset(editingcode, "tcscode", "text=\"\"")
|
||||
var/showcode = replacetext(storedcode, "\"", "\\\"")
|
||||
winset(usr, "tcscode", "text=\"[showcode]\"")
|
||||
|
||||
if("togglerun")
|
||||
if ("togglerun")
|
||||
SelectedServer.autoruncode = !(SelectedServer.autoruncode)
|
||||
|
||||
if(href_list["network"])
|
||||
|
||||
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
|
||||
|
||||
if(newnet && ((usr in range(1, src) || issilicon(usr))))
|
||||
if (href_list["network"])
|
||||
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null | text
|
||||
if(newnet && (issilicon(usr) || (usr in range(1, src))))
|
||||
if(length(newnet) > 15)
|
||||
temp = "<font color = #D70B00>- FAILED: NETWORK TAG STRING TOO LENGHTLY -</font>"
|
||||
|
||||
temp = "<font color = #D70B00>- FAILED: NETWORK TAG STRING TOO LENGHTY -</font>"
|
||||
else
|
||||
|
||||
network = newnet
|
||||
screen = 0
|
||||
screen = SCREEN_MAIN_MENU
|
||||
servers = list()
|
||||
temp = "<font color = #336699>- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -</font>"
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/telecomms/traffic/emag_act(var/remaining_charges, var/mob/user)
|
||||
if(!emagged)
|
||||
playsound(src, 'sound/effects/sparks4.ogg', 75, 1)
|
||||
emagged = 1
|
||||
to_chat(user, "<span class='notice'>You you disable the security protocols</span>")
|
||||
src.updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/telecomms/traffic/proc/update_ide()
|
||||
while (editingcode)
|
||||
if (!editingcode.client)
|
||||
editingcode = null
|
||||
break
|
||||
if (editingcode)
|
||||
storedcode = "[winget(editingcode, "tcscode", "text")]"
|
||||
if (editingcode)
|
||||
winset(editingcode, "tcscode", "is-disabled=false")
|
||||
if (!issilicon(editingcode) && (editingcode.machine != src || !(editingcode in range(1, src))))
|
||||
if (editingcode)
|
||||
winshow(editingcode, "Telecomms IDE", FALSE)
|
||||
editingcode = null
|
||||
break
|
||||
if (length(viewingcode))
|
||||
var/showcode = replacetext(storedcode, "\\\"", "\\\\\"")
|
||||
showcode = replacetext(storedcode, "\"", "\\\"")
|
||||
for (var/mob/viewer in viewingcode)
|
||||
if (issilicon(viewer) || (viewer.machine == src && (viewer in view(1, src))))
|
||||
winset(viewer, "tcscode", "is-disabled=true")
|
||||
winset(viewer, "tcscode", "text=\"[showcode]\"")
|
||||
else
|
||||
viewingcode -= viewer
|
||||
winshow(viewer, "Telecomms IDE", FALSE)
|
||||
sleep(5)
|
||||
if (length(viewingcode))
|
||||
editingcode = pick(viewingcode)
|
||||
viewingcode -= editingcode
|
||||
update_ide()
|
||||
|
||||
@@ -193,9 +193,17 @@ var/global/list/obj/item/communicator/all_communicators = list()
|
||||
// Parameters: None
|
||||
// Description: Simple check to see if the exonet node is active.
|
||||
/obj/item/communicator/proc/get_connection_to_tcomms()
|
||||
if(node && node.on && node.allow_external_communicators)
|
||||
return can_telecomm(src,node)
|
||||
return 0
|
||||
if (!node?.on || !node.allow_external_communicators)
|
||||
return FALSE
|
||||
if (is_jammed(src) || is_jammed(node))
|
||||
return FALSE
|
||||
var/sender_z = get_z(src)
|
||||
var/receiver_z = get_z(node)
|
||||
if (!sender_z || !receiver_z)
|
||||
return FALSE
|
||||
if (sender_z == receiver_z)
|
||||
return TRUE
|
||||
return sender_z in using_map.get_map_levels(receiver_z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)
|
||||
|
||||
// Proc: process()
|
||||
// Parameters: None
|
||||
@@ -371,4 +379,4 @@ var/global/list/obj/item/communicator/all_communicators = list()
|
||||
/obj/item/communicator/rugged
|
||||
desc = "The RB-65, voted most robust communicator 2566!"
|
||||
icon_state = "commrugged"
|
||||
note = "Thank you for choosing the RB-65 Communicator, this is your notepad!" //Current note in the notepad function
|
||||
note = "Thank you for choosing the RB-65 Communicator, this is your notepad!" //Current note in the notepad function
|
||||
|
||||
@@ -144,8 +144,6 @@
|
||||
return
|
||||
|
||||
last_text = world.time
|
||||
// check if telecomms I/O route 1459 is stable
|
||||
//var/telecomms_intact = telecomms_process(P.owner, owner, t)
|
||||
var/obj/machinery/message_server/useMS = null
|
||||
if(message_servers)
|
||||
for(var/A in message_servers)
|
||||
@@ -244,4 +242,4 @@
|
||||
for(var/obj/item/pda/target in targets)
|
||||
var/datum/data/pda/app/messenger/P = target.find_program(/datum/data/pda/app/messenger)
|
||||
if(P)
|
||||
P.receive_message(modified_message, "\ref[M]")
|
||||
P.receive_message(modified_message, "\ref[M]")
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
/n_Interpreter/TCS_Interpreter
|
||||
var/datum/TCS_Compiler/Compiler
|
||||
|
||||
/n_Interpreter/TCS_Interpreter/Destroy()
|
||||
QDEL_NULL(Compiler)
|
||||
return ..()
|
||||
|
||||
/n_Interpreter/TCS_Interpreter/HandleError(runtimeError/e)
|
||||
Compiler.Holder.add_entry(e.ToString(), "Execution Error")
|
||||
|
||||
@@ -15,6 +19,11 @@
|
||||
var/obj/machinery/telecomms/server/Holder // the server that is running the code
|
||||
var/ready = 1 // 1 if ready to run code
|
||||
|
||||
/datum/TCS_Compiler/Destroy()
|
||||
QDEL_NULL(interpreter)
|
||||
Holder = null
|
||||
return ..()
|
||||
|
||||
/** Proc: Compile
|
||||
* Compile a raw block of text into a program
|
||||
* Returns: List of errors
|
||||
@@ -278,4 +287,3 @@
|
||||
var/pass = S.relay_information(newsign, /obj/machinery/telecomms/hub)
|
||||
if(!pass)
|
||||
S.relay_information(newsign, /obj/machinery/telecomms/broadcaster) // send this simple message to broadcasters
|
||||
|
||||
|
||||
12
polaris.dme
12
polaris.dme
@@ -456,7 +456,6 @@
|
||||
#include "code\defines\procs\announce.dm"
|
||||
#include "code\defines\procs\AStar.dm"
|
||||
#include "code\defines\procs\dbcore.dm"
|
||||
#include "code\defines\procs\radio.dm"
|
||||
#include "code\defines\procs\statistics.dm"
|
||||
#include "code\game\atoms.dm"
|
||||
#include "code\game\atoms_movable.dm"
|
||||
@@ -804,11 +803,18 @@
|
||||
#include "code\game\machinery\pipe\pipe_dispenser.dm"
|
||||
#include "code\game\machinery\pipe\pipe_recipes.dm"
|
||||
#include "code\game\machinery\pipe\pipelayer.dm"
|
||||
#include "code\game\machinery\telecomms\allinone.dm"
|
||||
#include "code\game\machinery\telecomms\broadcaster.dm"
|
||||
#include "code\game\machinery\telecomms\bus.dm"
|
||||
#include "code\game\machinery\telecomms\hub.dm"
|
||||
#include "code\game\machinery\telecomms\logbrowser.dm"
|
||||
#include "code\game\machinery\telecomms\machine_interactions.dm"
|
||||
#include "code\game\machinery\telecomms\misc.dm"
|
||||
#include "code\game\machinery\telecomms\presets.dm"
|
||||
#include "code\game\machinery\telecomms\telecommunications.dm"
|
||||
#include "code\game\machinery\telecomms\processor.dm"
|
||||
#include "code\game\machinery\telecomms\receiver.dm"
|
||||
#include "code\game\machinery\telecomms\relay.dm"
|
||||
#include "code\game\machinery\telecomms\server.dm"
|
||||
#include "code\game\machinery\telecomms\telecomms.dm"
|
||||
#include "code\game\machinery\telecomms\telemonitor.dm"
|
||||
#include "code\game\machinery\telecomms\traffic_control.dm"
|
||||
#include "code\game\machinery\virtual_reality\ar_console.dm"
|
||||
|
||||
@@ -142,10 +142,8 @@ const TelecommsMultitoolMenuPolymorphicOptions = (props, context) => {
|
||||
|
||||
const {
|
||||
// Relay
|
||||
use_listening_level,
|
||||
use_broadcasting,
|
||||
use_receiving,
|
||||
listening_level,
|
||||
broadcasting,
|
||||
receiving,
|
||||
// Bus
|
||||
@@ -160,22 +158,13 @@ const TelecommsMultitoolMenuPolymorphicOptions = (props, context) => {
|
||||
} = props.options;
|
||||
|
||||
// If absolutely nothing is active, we tell the user there ain't no shit here.
|
||||
if (!use_listening_level && !use_broadcasting && !use_receiving
|
||||
&& !use_change_freq && !use_broadcast_range && !use_receive_range) {
|
||||
if (!use_broadcasting && !use_receiving && !use_change_freq && !use_broadcast_range && !use_receive_range) {
|
||||
return <Section title="No Options Found" />;
|
||||
}
|
||||
|
||||
return (
|
||||
<Section title="Options">
|
||||
<LabeledList>
|
||||
{use_listening_level ? (
|
||||
<LabeledList.Item label="Signal Locked to Station">
|
||||
<Button
|
||||
icon={listening_level ? "lock-closed" : "lock-open"}
|
||||
content={listening_level ? "Yes" : "No"}
|
||||
onClick={() => act("change_listening")} />
|
||||
</LabeledList.Item>
|
||||
) : null}
|
||||
{use_broadcasting ? (
|
||||
<LabeledList.Item label="Broadcasting">
|
||||
<Button
|
||||
@@ -219,4 +208,4 @@ const TelecommsMultitoolMenuPolymorphicOptions = (props, context) => {
|
||||
</LabeledList>
|
||||
</Section>
|
||||
);
|
||||
};
|
||||
};
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user