Main part works. but we still got a long way to go

This commit is contained in:
AffectedArc07
2020-05-14 22:46:26 +01:00
parent f93146f6f5
commit 64dc83846e
35 changed files with 607 additions and 2828 deletions
@@ -21,6 +21,7 @@
var/ks1type = null
var/ks2type = null
dog_fashion = null
requires_tcomms = TRUE
/obj/item/radio/headset/New()
..()
+62 -153
View File
@@ -58,6 +58,8 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
var/datum/radio_frequency/radio_connection
var/list/datum/radio_frequency/secure_radio_connections = new
var/requires_tcomms = FALSE // Does this device require tcomms to work.If TRUE it wont function at all without tcomms. If FALSE, it will work without tcomms, just slowly
/obj/item/radio/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
@@ -258,10 +260,24 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
if(jammed)
message = Gibberish(message, 100)
var/list/message_pieces = message_to_multilingual(message)
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message_pieces, from, "Automated Announcement", from, "synthesized voice",
4, 0, zlevel, connection.frequency, follow_target = follow_target)
// Make us a message datum!
var/datum/tcomms_message/tcm = new
tcm.connection = connection
tcm.sender = A
tcm.radio = src
tcm.sender_name = from
tcm.message_pieces = message_pieces
tcm.sender_job = "Automated Announcement"
tcm.vname = "synthesized voice"
tcm.data = SIGNALTYPE_AINOTRACK
tcm.source_level = zlevel
tcm.freq = connection.frequency
tcm.follow_target = follow_target
// Now put that through the stuff
for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
INVOKE_ASYNC(C, /obj/machinery/tcomms/core.proc/handle_message, tcm)
qdel(A)
// Just a dummy mob used for making announcements, so we don't create AIs to do this
@@ -318,48 +334,31 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
if(!M.IsVocal())
return 0
/* Quick introduction:
This new radio system uses a very robust FTL signaling technology unoriginally
dubbed "subspace" which is somewhat similar to 'blue-space' but can't
actually transmit large mass. Headsets are the only radio devices capable
of sending subspace transmissions to the Communications Satellite.
A headset sends a signal to a subspace listener/receiver elsewhere in space,
the signal gets processed and logged, and an audible transmission gets sent
to each individual headset.
*/
//#### Grab the connection datum ####//
var/message_mode = handle_message_mode(M, message_pieces, channel)
switch(message_mode) //special cases
if(RADIO_CONNECTION_FAIL)
return 0
if(RADIO_CONNECTION_NON_SUBSPACE)
return 1
if(!istype(message_mode, /datum/radio_frequency)) //if not a special case, it should be returning a radio connection
return 0
var/datum/radio_frequency/connection = message_mode
var/turf/position = get_turf(src)
var/jammed = FALSE
var/turf/position = get_turf(src)
for(var/obj/item/jammer/jammer in GLOB.active_jammers)
if(get_dist(position, get_turf(jammer)) < jammer.range)
jammed = TRUE
break
//#### Tagging the signal with all appropriate identity values ####//
var/message_mode = handle_message_mode(M, message_pieces, channel)
switch(message_mode) //special cases
// This is if the connection fails
if(RADIO_CONNECTION_FAIL)
return 0
// This is if were using either a binary key, or a hivemind through a headset somehow. Dont ask.
if(RADIO_CONNECTION_NON_SUBSPACE)
return 1
if(!istype(message_mode, /datum/radio_frequency)) //if not a special case, it should be returning a radio connection
return
var/datum/radio_frequency/connection = message_mode
// ||-- The mob's name identity --||
var/displayname = M.name // grab the display name (name you get when you hover over someone's icon)
var/real_name = M.real_name // mob's real name
var/mobkey = "none" // player key associated with mob
var/voicemask = 0 // the speaker is wearing a voice mask
if(M.client)
mobkey = M.key // assign the mob's key
var/jobname // the mob's "job"
if(jammed)
@@ -397,7 +396,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
if(ishuman(M))
var/mob/living/carbon/human/H = M
displayname = H.voice
if(H.voice != real_name)
if(H.voice != M.real_name)
voicemask = TRUE
if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ)
@@ -405,124 +404,34 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
jobname = "Unknown"
voicemask = TRUE
// Make us a message datum!
var/datum/tcomms_message/tcm = new
tcm.sender_name = displayname
tcm.sender_job = jobname
tcm.message_pieces = message_pieces
tcm.source_level = position.z
tcm.freq = connection.frequency
tcm.vmask = voicemask
tcm.needs_tcomms = requires_tcomms
tcm.connection = connection
tcm.vname = M.voice_name
// Now put that through the stuff
var/handled = FALSE
if(connection)
for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
if(C.handle_message(tcm))
handled = TRUE
return TRUE
/* ###### Radio headsets can only broadcast through subspace ###### */
// If we dont need tcomms and we have no connection
if(!requires_tcomms && !handled)
tcm.zlevels = list(position.z)
// Simulate two seconds of lag
addtimer(CALLBACK(GLOBAL_PROC, .proc/broadcast_message, tcm), 20)
return TRUE
if(subspace_transmission)
// First, we want to generate a new radio signal
var/datum/signal/signal = new
signal.transmission_method = 2 // 2 would be a subspace transmission.
// transmission_method could probably be enumerated through #define. Would be neater.
// --- Finally, tag the actual signal with the appropriate values ---
signal.data = list(
// Identity-associated tags:
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"race" = signal.get_race(M),
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
"key" = mobkey, // the mob's key
"vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mask
// We store things that would otherwise be kept in the actual mob
// so that they can be logged even AFTER the mob is deleted or something
// Other tags:
"compression" = rand(45,50), // compressed radio signal
"message" = message_pieces, // the actual sent message
"connection" = connection, // the radio connection to use
"radio" = src, // stores the radio used for transmission
"slow" = 0, // how much to sleep() before broadcasting - simulates net lag
"traffic" = 0, // dictates the total traffic sum that the signal went through
"type" = 0, // determines what type of radio input it is: normal broadcast
"server" = null, // the last server to log this signal
"reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
"level" = position.z, // The source's z level
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list)
spawn(0)
R.receive_signal(signal)
// Allinone can act as receivers.
for(var/obj/machinery/telecomms/allinone/R in GLOB.telecomms_list)
spawn(0)
R.receive_signal(signal)
// Receiving code can be located in Telecommunications.dm
return signal.data["done"] && (position.z in signal.data["level"])
/* ###### Intercoms and station-bounced radios ###### */
var/filter_type = 2
/* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */
if(istype(src, /obj/item/radio/intercom))
filter_type = 1
var/datum/signal/signal = new
signal.transmission_method = 2
/* --- Try to send a normal subspace broadcast first */
signal.data = list(
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"race" = signal.get_race(M), // text to show next to mob in comms log console
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
"key" = mobkey, // the mob's key
"vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mas
"compression" = 0, // uncompressed radio signal
"message" = message_pieces, // the actual sent message
"connection" = connection, // the radio connection to use
"radio" = src, // stores the radio used for transmission
"slow" = 0,
"traffic" = 0,
"type" = 0,
"server" = null,
"reject" = 0,
"level" = position.z,
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list)
spawn(0)
R.receive_signal(signal)
sleep(rand(10,25)) // wait a little...
if(signal.data["done"] && (position.z in signal.data["level"]))
// we're done here.
return 1
// Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
// Send a mundane broadcast with limited targets:
//THIS IS TEMPORARY. YEAH RIGHT
if(!connection) return 0 //~Carn
return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message_pieces, displayname, jobname, real_name, M.voice_name,
filter_type, signal.data["compression"], list(position.z), connection.frequency,verb)
// If we didnt get here, oh fuck
return FALSE
/obj/item/radio/hear_talk(mob/M as mob, list/message_pieces, var/verb = "says")
@@ -235,57 +235,6 @@
rating = 4
materials = list(MAT_METAL=80)
// Subspace stock parts
/obj/item/stock_parts/subspace/ansible
name = "subspace ansible"
icon_state = "subspace_ansible"
desc = "A compact module capable of sensing extradimensional activity."
origin_tech = "programming=2;magnets=2;materials=2;bluespace=1"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/filter
name = "hyperwave filter"
icon_state = "hyperwave_filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
origin_tech = "programming=2;magnets=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/amplifier
name = "subspace amplifier"
icon_state = "subspace_amplifier"
desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/treatment
name = "subspace treatment disk"
icon_state = "treatment_disk"
desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/analyzer
name = "subspace wavelength analyzer"
icon_state = "wavelength_analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/crystal
name = "ansible crystal"
icon_state = "ansible_crystal"
desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
origin_tech = "magnets=2;materials=2;bluespace=2;plasmatech=2"
materials = list(MAT_GLASS=50)
/obj/item/stock_parts/subspace/transmitter
name = "subspace transmitter"
icon_state = "subspace_transmitter"
desc = "A large piece of equipment used to open a window into the subspace dimension."
origin_tech = "magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=50)
/obj/item/research//Makes testing much less of a pain -Sieve
name = "research"
icon = 'icons/obj/stock_parts.dmi'