mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-30 15:37:36 +01:00
Main part works. but we still got a long way to go
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
var/ks1type = null
|
||||
var/ks2type = null
|
||||
dog_fashion = null
|
||||
requires_tcomms = TRUE
|
||||
|
||||
/obj/item/radio/headset/New()
|
||||
..()
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user