From e2d2964546134c6e7dfeac67ad0f6ad254a86d5f Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Fri, 10 Apr 2020 20:24:19 -0400 Subject: [PATCH] Refactor telecomms to send messages to logically adjacent zlevels --- code/_helpers/game.dm | 2 +- code/game/machinery/cryopod.dm | 3 +- code/game/machinery/telecomms/broadcaster.dm | 198 +++++++++++--- .../telecomms/machine_interactions.dm | 32 +++ .../machinery/telecomms/telecomunications.dm | 51 +++- .../game/objects/items/devices/radio/radio.dm | 255 +++++++++--------- .../objects/items/devices/radio/radiopack.dm | 153 +++++++++++ code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/mob/new_player/new_player.dm | 9 +- .../hardware/network_card.dm | 31 ++- icons/mob/back.dmi | Bin 102906 -> 103579 bytes icons/obj/radio.dmi | Bin 19757 -> 20967 bytes maps/~map_system/maps.dm | 44 ++- vorestation.dme | 1 + 14 files changed, 577 insertions(+), 204 deletions(-) create mode 100644 code/game/objects/items/devices/radio/radiopack.dm diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 6b924ef082..17a2544850 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -246,7 +246,7 @@ var/turf/speaker = get_turf(R) if(speaker) for(var/turf/T in hear(R.canhear_range,speaker)) - speaker_coverage[T] = T + speaker_coverage[T] = R // Try to find all the players who can hear the message diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index d62d53a551..bdd2b05fc6 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -219,6 +219,7 @@ var/on_enter_occupant_message = "You feel cool air surround you. You go numb as your senses turn inward." var/on_store_visible_message_1 = "hums and hisses as it moves" //We need two variables because byond doesn't let us have variables inside strings at compile-time. var/on_store_visible_message_2 = "into storage." + var/announce_channel = "Common" var/allow_occupant_types = list(/mob/living/carbon/human) var/disallow_occupant_types = list() @@ -519,7 +520,7 @@ control_computer._admin_logs += "[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) at [stationtime2text()]" log_and_message_admins("[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) entered cryostorage.") - announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]") + announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE)) //visible_message("\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.", 3) visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].", 3) diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 057a8fd5c1..f392eb5218 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -23,6 +23,12 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept produces_heat = 0 delay = 7 circuit = /obj/item/weapon/circuitboard/telecomms/broadcaster + //Vars only used if you're using the overmap + 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/processor/Initialize() . = ..() @@ -34,6 +40,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(src) component_parts += new /obj/item/stack/cable_coil(src, 1) +/obj/machinery/telecomms/broadcaster/proc/link_radio(var/obj/item/device/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"]) @@ -58,46 +69,51 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(signal.data["slow"] > 0) sleep(signal.data["slow"]) // simulate the network lag if necessary - signal.data["level"] |= listening_level + 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/device/radio/R = wr.resolve() + if(istype(R)) + LAZYDISTINCTADD(forced_radios, R) /** #### - Normal Broadcast - #### **/ - - if(signal.data["type"] == 0) - + 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"],, + signal.data["realname"], signal.data["vname"], DATA_NORMAL, signal.data["compression"], signal.data["level"], signal.frequency, - signal.data["verb"], signal.data["language"] ) + signal.data["verb"], signal.data["language"], forced_radios) /** #### - Simple Broadcast - #### **/ - if(signal.data["type"] == 1) + if(signal.data["type"] == SIGNAL_SIMPLE) /* ###### Broadcast a message using signal.data ###### */ Broadcast_SimpleMessage(signal.data["name"], signal.frequency, - signal.data["message"],null, null, - signal.data["compression"], listening_level) + signal.data["message"], DATA_NORMAL, null, + signal.data["compression"], listening_level, forced_radios) /** #### - Artificial Broadcast - #### **/ // (Imitates a mob) - if(signal.data["type"] == 2) + if(signal.data["type"] == SIGNAL_FAKE) /* ###### Broadcast a message using signal.data ###### */ - // Parameter "data" as 4: AI can't track this person/mob + // 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"], 4, signal.data["compression"], signal.data["level"], signal.frequency, - signal.data["verb"], signal.data["language"]) + signal.data["realname"], signal.data["vname"], DATA_FAKE, + signal.data["compression"], signal.data["level"], signal.frequency, + signal.data["verb"], signal.data["language"], forced_radios) if(!message_delay) message_delay = 1 @@ -118,6 +134,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /* 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 @@ -126,15 +143,98 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept icon_state = "comm_server" desc = "A compact machine used for portable subspace telecommuniations processing." density = 1 + use_power = USE_POWER_IDLE + idle_power_usage = 20 anchored = 1 - use_power = USE_POWER_OFF - idle_power_usage = 0 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/device/radio/R) + if(!istype(R)) + return + linked_radios_weakrefs |= weakref(R) /obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal) + // Has to be on to receive messages + if(!on) + return + + // Why did you use this subtype? + if(!using_map.use_overmap) + return + + // Someone else handling it? + if(signal.data["done"]) + 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/device/radio/R = wr.resolve() + if(istype(R)) + LAZYDISTINCTADD(forced_radios, R) + + 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 + ) + +//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 @@ -159,23 +259,29 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/datum/radio_frequency/connection = signal.data["connection"] + var/list/forced_radios + for(var/weakref/wr in linked_radios_weakrefs) + var/obj/item/device/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"],, signal.data["compression"], list(0), connection.frequency, - signal.data["verb"], signal.data["language"]) + signal.data["realname"], signal.data["vname"], DATA_NORMAL, + signal.data["compression"], list(0), connection.frequency, + signal.data["verb"], signal.data["language"], 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"], 3, signal.data["compression"], list(0), connection.frequency, - signal.data["verb"], signal.data["language"]) - - + signal.data["realname"], signal.data["vname"], DATA_ANTAG, + signal.data["compression"], list(0), connection.frequency, + signal.data["verb"], signal.data["language"], forced_radios) /** @@ -237,7 +343,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M, var/vmask, var/vmessage, var/obj/item/device/radio/radio, var/message, var/name, var/job, var/realname, var/vname, - var/data, var/compression, var/list/level, var/freq, var/verbage = "says", var/datum/language/speaking = null) + var/data, var/compression, var/list/level, var/freq, var/verbage = "says", + var/datum/language/speaking = null, var/list/forced_radios) /* ###### Prepare the radio connection ###### */ @@ -246,17 +353,22 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/list/obj/item/device/radio/radios = list() + for(var/obj/item/device/radio/R in forced_radios) + //Cursory check to ensure they are 'on' and stuff + if(R.receive_range(display_freq, list(0))) + radios |= R + // --- Broadcast only to intercom devices --- - if(data == 1) + if(data == DATA_INTERCOM) for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) if(R.receive_range(display_freq, level) > -1) - radios += R + radios |= R // --- Broadcast only to intercoms and station-bounced radios --- - else if(data == 2) + else if(data == DATA_LOCAL) for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) @@ -264,16 +376,16 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept continue if(R.receive_range(display_freq, level) > -1) - radios += R + radios |= R // --- Broadcast to antag radios! --- - else if(data == 3) + 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/device/radio/R in antag_connection.devices["[RADIO_CHAT]"]) if(R.receive_range(antag_freq, level) > -1) - radios += R + radios |= R // --- Broadcast to ALL radio devices --- @@ -281,7 +393,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) if(R.receive_range(display_freq, level) > -1) - radios += R + radios |= R // Get a list of mobs who can hear from the radios we collected. var/list/receive = get_mobs_in_radio_ranges(radios) @@ -307,7 +419,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept continue // Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates - if(data == 3 && istype(R, /mob/observer/dead) && R.is_preference_enabled(/datum/client_preference/ghost_radio)) + if(data == DATA_ANTAG && istype(R, /mob/observer/dead) && R.is_preference_enabled(/datum/client_preference/ghost_radio)) continue // --- Check for compression --- @@ -346,7 +458,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/freq_text = get_frequency_name(display_freq) var/part_b_extra = "" - if(data == 3) // intercepted radio message + if(data == DATA_ANTAG) // intercepted radio message part_b_extra = " (Intercepted)" var/part_a = "[bicon(radio)]\[[freq_text]\][part_b_extra] " // goes in the actual output @@ -438,7 +550,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept return 1 -/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) +/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level, var/list/forced_radios) /* ###### Prepare the radio connection ###### */ @@ -452,10 +564,12 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/list/receive = list() + for(var/obj/item/device/radio/R in forced_radios) + receive |= R.send_hear(display_freq) // --- Broadcast only to intercom devices --- - if(data == 1) + if(data == DATA_INTERCOM) for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) var/turf/position = get_turf(R) if(position && position.z == level) @@ -464,7 +578,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // --- Broadcast only to intercoms and station-bounced radios --- - else if(data == 2) + else if(data == DATA_LOCAL) for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) if(istype(R, /obj/item/device/radio/headset)) @@ -476,7 +590,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // --- Broadcast to antag radios! --- - else if(data == 3) + 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/device/radio/R in antag_connection.devices["[RADIO_CHAT]"]) @@ -541,7 +655,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept // --- Some more pre-message formatting --- var/part_b_extra = "" - if(data == 3) // intercepted radio message + if(data == DATA_ANTAG) // intercepted radio message part_b_extra = " (Intercepted)" // Create a radio headset for the sole purpose of using its icon @@ -617,15 +731,15 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /atom/proc/test_telecomms() var/datum/signal/signal = src.telecomms_process() - var/turf/position = get_turf(src) - return (position.z in signal.data["level"] && signal.data["done"]) + 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 = 2 // 2 would be a subspace transmission. - var/turf/pos = get_turf(src) + signal.transmission_method = TRANSMISSION_SUBSPACE + var/pos_z = get_z(src) // --- Finally, tag the actual signal with the appropriate values --- signal.data = list( @@ -633,10 +747,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept "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" = 4, // determines what type of radio input it is: test broadcast + "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. + "level" = pos_z // The level it is being broadcasted at. ) signal.frequency = PUB_FREQ// Common channel diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 3e3d89643a..802c75bb42 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -219,6 +219,38 @@ temp = "-% Frequency changing deactivated %-" +// BROADCASTER +/obj/machinery/telecomms/broadcaster/Options_Menu() + // Note the machine 'displays' 1 higher than overmap_range to save users from the abstraction that range '0' is valid and everything on the same turf. + var/dat = "
Broadcast Range (affects power usage)
- [overmap_range+1] gigameter\s +" + return dat + +/obj/machinery/telecomms/broadcaster/Options_Topic(href, href_list) + if(href_list["range_down"]) + if(overmap_range > overmap_range_min) + overmap_range-- + idle_power_usage = initial(idle_power_usage)**(overmap_range+1) + if(href_list["range_up"]) + if(overmap_range < overmap_range_max) + overmap_range++ + idle_power_usage = initial(idle_power_usage)**(overmap_range+1) + +// RECEIVER +/obj/machinery/telecomms/receiver/Options_Menu() + // Note the machine 'displays' 1 higher than overmap_range to save users from the abstraction that range '0' is valid and everything on the same turf. + var/dat = "
Receive Range (affects power usage)
- [overmap_range+1] gigameter\s +" + return dat + +/obj/machinery/telecomms/receiver/Options_Topic(href, href_list) + if(href_list["range_down"]) + if(overmap_range > overmap_range_min) + overmap_range-- + idle_power_usage = initial(idle_power_usage)**(overmap_range+1) + if(href_list["range_up"]) + if(overmap_range < overmap_range_max) + overmap_range++ + idle_power_usage = initial(idle_power_usage)**(overmap_range+1) + /obj/machinery/telecomms/Topic(href, href_list) if(!issilicon(usr)) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index c2e9126fc1..38f1adbdfc 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -68,7 +68,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() var/datum/signal/copy if(copysig) copy = new - copy.transmission_method = 2 + copy.transmission_method = TRANSMISSION_SUBSPACE copy.frequency = signal.frequency copy.data = signal.data.Copy() @@ -141,9 +141,9 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() // Used in auto linking /obj/machinery/telecomms/proc/add_link(var/obj/machinery/telecomms/T) - var/turf/position = get_turf(src) - var/turf/T_position = get_turf(T) - if((position.z == T_position.z) || (src.long_range_link && T.long_range_link)) + 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) @@ -256,6 +256,12 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() machinetype = 1 produces_heat = 0 circuit = /obj/item/weapon/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/Initialize() . = ..() @@ -267,8 +273,12 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) RefreshParts() -/obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal) +/obj/machinery/telecomms/receiver/proc/link_radio(var/obj/item/device/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) @@ -276,7 +286,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(!check_receive_level(signal)) return - if(signal.transmission_method == 2) + if(signal.transmission_method == TRANSMISSION_SUBSPACE) if(is_freq_listening(signal)) // detect subspace signals @@ -288,14 +298,31 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() 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/device/radio/R = signal.data["radio"] - if(signal.data["level"] != listening_level) + //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/connected_levels = list() + var/list/relayed_levels = list() for(var/obj/machinery/telecomms/relay/R in H.links) if(R.can_receive(signal)) - connected_levels |= R.listening_level - if(signal.data["level"] in connected_levels) + relayed_levels |= R.listening_level + if(signal.data["level"] in relayed_levels) return 1 return 0 return 1 @@ -405,7 +432,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() // Add our level and send it back if(can_send(signal)) - signal.data["level"] |= listening_level + signal.data["level"] |= using_map.get_map_levels(listening_level) // Checks to see if it can send/receive. @@ -602,7 +629,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() totaltraffic += traffic // add current traffic to total traffic //Is this a test signal? Bypass logging - if(signal.data["type"] != 4) + if(signal.data["type"] != SIGNAL_TEST) // If signal has a message and appropriate frequency diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 278d911f0e..69b5192abb 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -52,6 +52,13 @@ var/global/list/default_medbay_channels = list( w_class = ITEMSIZE_SMALL show_messages = 1 + // Bluespace radios talk directly to telecomms equipment + var/bluespace_radio = FALSE + var/weakref/bs_tx_weakref //Maybe misleading, this is the device to TRANSMIT TO + // For mappers or subtypes, to start them prelinked to these devices + var/bs_tx_preload_id + var/bs_rx_preload_id + matter = list("glass" = 25,DEFAULT_WALL_MATERIAL = 75) var/const/FREQ_LISTENING = 1 var/list/internal_channels @@ -90,6 +97,43 @@ var/global/list/default_medbay_channels = list( for (var/ch_name in channels) secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + if(bluespace_radio) + if(bs_tx_preload_id) + //Try to find a receiver + for(var/obj/machinery/telecomms/receiver/RX in telecomms_list) + if(RX.id == bs_tx_preload_id) //Again, bs_tx is the thing to TRANSMIT TO, so a receiver. + bs_tx_weakref = weakref(RX) + RX.link_radio(src) + break + //Hmm, howabout an AIO machine + if(!bs_tx_weakref) + for(var/obj/machinery/telecomms/allinone/AIO in telecomms_list) + if(AIO.id == bs_tx_preload_id) + bs_tx_weakref = weakref(AIO) + AIO.link_radio(src) + break + if(!bs_tx_weakref) + testing("A radio [src] at [x],[y],[z] specified bluespace prelink IDs, but the machines with corresponding IDs ([bs_tx_preload_id], [bs_rx_preload_id]) couldn't be found.") + + if(bs_rx_preload_id) + var/found = 0 + //Try to find a transmitter + for(var/obj/machinery/telecomms/broadcaster/TX in telecomms_list) + if(TX.id == bs_rx_preload_id) //Again, bs_rx is the thing to RECEIVE FROM, so a transmitter. + TX.link_radio(src) + found = 1 + break + //Hmm, howabout an AIO machine + if(!found) + for(var/obj/machinery/telecomms/allinone/AIO in telecomms_list) + if(AIO.id == bs_rx_preload_id) + AIO.link_radio(src) + found = 1 + break + if(!found) + testing("A radio [src] at [x],[y],[z] specified bluespace prelink IDs, but the machines with corresponding IDs ([bs_tx_preload_id], [bs_rx_preload_id]) couldn't be found.") + + /obj/item/device/radio/attack_self(mob/user as mob) user.set_machine(src) interact(user) @@ -240,11 +284,10 @@ var/global/list/default_medbay_channels = list( if(.) SSnanoui.update_uis(src) -/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT +/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels) //BS12 EDIT var/datum/radio_frequency/connection = null if(channel && channels && channels.len > 0) if (channel == "department") - //to_world("DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"") channel = channels[1] connection = secure_radio_connections[channel] else @@ -253,12 +296,15 @@ var/global/list/default_medbay_channels = list( if (!istype(connection)) return + if(!LAZYLEN(zlevels)) + zlevels = list(0) + var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1) A.SetName(from) Broadcast_Message(connection, A, 0, "*garbled automated announcement*", src, message, from, "Automated Announcement", from, "synthesized voice", - 4, 0, list(0), connection.frequency, "states") + 4, 0, zlevels, connection.frequency, "states") // Interprets the message mode when talking into a radio, possibly returning a connection datum /obj/item/device/radio/proc/handle_message_mode(mob/living/M as mob, message, message_mode) @@ -310,7 +356,7 @@ var/global/list/default_medbay_channels = list( if (!istype(connection)) return FALSE - var/turf/position = get_turf(src) + var/pos_z = get_z(src) //#### Tagging the signal with all appropriate identity values ####// @@ -359,10 +405,63 @@ var/global/list/default_medbay_channels = list( jobname = "Unknown" voicemask = 1 + // First, we want to generate a new radio signal + var/datum/signal/signal = new + // --- 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 + "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 - /* ###### Radio headsets can only broadcast through subspace ###### */ - if(subspace_transmission) + // 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, // 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" = SIGNAL_NORMAL, // 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" = pos_z, // The source's z level + "language" = speaking, + "verb" = verb + ) + signal.frequency = connection.frequency // Quick frequency set + + var/filter_type = DATA_LOCAL //If we end up having to send it the old fashioned way, it's with this data var. + + /* ###### Bluespace radios talk directly to receivers (and only directly to receivers) ###### */ + if(bluespace_radio) + //Nothing to transmit to + if(!bs_tx_weakref) + to_chat(loc, "\The [src] buzzes to inform you of the lack of a functioning connection.") + return FALSE + + var/obj/machinery/telecomms/tx_to = bs_tx_weakref.resolve() + //Was linked, now destroyed or something + if(!tx_to) + bs_tx_weakref = null + to_chat(loc, "\The [src] buzzes to inform you of the lack of a functioning connection.") + return FALSE + + //Transmitted in the blind. If we get a message back, cool. If not, oh well. + signal.transmission_method = TRANSMISSION_BLUESPACE + return tx_to.receive_signal(signal) + + /* ###### Radios with subspace_transmission can only broadcast through subspace (unless they have adhoc_fallback) ###### */ + else if(subspace_transmission) var/list/jamming = is_jammed(src) if(jamming) var/distance = jamming["distance"] @@ -370,43 +469,9 @@ var/global/list/default_medbay_channels = list( return FALSE // 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. + signal.transmission_method = TRANSMISSION_SUBSPACE - // --- 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 - "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, // 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 - "language" = speaking, - "verb" = verb - ) - signal.frequency = connection.frequency // Quick frequency set - - //#### Sending the signal to all subspace receivers ####// + //#### Sending the signal to all subspace receivers ####// for(var/obj/machinery/telecomms/receiver/R in telecomms_list) R.receive_signal(signal) @@ -416,84 +481,47 @@ var/global/list/default_medbay_channels = list( R.receive_signal(signal) // Receiving code can be located in Telecommunications.dm - if(signal.data["done"] && position.z in signal.data["level"]) + if(signal.data["done"] && (pos_z in signal.data["level"])) return TRUE //Huzzah, sent via subspace else if(adhoc_fallback) //Less huzzah, we have to fallback to_chat(loc, "\The [src] pings as it falls back to local radio transmission.") subspace_transmission = FALSE - return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote), - src, message, displayname, jobname, real_name, M.voice_name, - signal.transmission_method, signal.data["compression"], GetConnectedZlevels(position.z), connection.frequency,verb,speaking) - /* ###### Intercoms and station-bounced radios ###### */ + else //Oh well + return FALSE - var/filter_type = 2 + /* ###### Intercoms and station-bounced radios ###### */ + else + /* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */ + if(istype(src, /obj/item/device/radio/intercom)) + filter_type = DATA_INTERCOM - /* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */ - if(istype(src, /obj/item/device/radio/intercom)) - filter_type = 1 + /* --- Try to send a normal subspace broadcast first */ + signal.transmission_method = TRANSMISSION_SUBSPACE + signal.data["compression"] = 0 + for(var/obj/machinery/telecomms/receiver/R in telecomms_list) + R.receive_signal(signal) - 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 - "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, // 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, - "language" = speaking, - "verb" = verb - ) - signal.frequency = connection.frequency // Quick frequency set + // Allinone can act as receivers. + for(var/obj/machinery/telecomms/allinone/R in telecomms_list) + R.receive_signal(signal) for(var/obj/machinery/telecomms/receiver/R in telecomms_list) R.receive_signal(signal) - if(signal.data["done"] && position.z in signal.data["level"]) - if(adhoc_fallback) - to_chat(loc, "\The [src] pings as it reestablishes subspace communications.") - subspace_transmission = TRUE - // we're done here. - return TRUE - - // 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 FALSE //~Carn - -//VOREStation Add Start - if(bluespace_radio) - return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote), - src, message, displayname, jobname, real_name, M.voice_name, - 0, signal.data["compression"], list(0), connection.frequency,verb,speaking) -//VOREStation Add End + if(signal.data["done"] && pos_z in signal.data["level"]) + if(adhoc_fallback) + to_chat(loc, "\The [src] pings as it reestablishes subspace communications.") + subspace_transmission = TRUE + // we're done here. + return TRUE + //Nothing handled any sort of remote radio-ing and returned before now, just squawk on this zlevel. return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote), - src, message, displayname, jobname, real_name, M.voice_name, - filter_type, signal.data["compression"], GetConnectedZlevels(position.z), connection.frequency,verb,speaking) + src, message, displayname, jobname, real_name, M.voice_name, + filter_type, signal.data["compression"], using_map.get_map_levels(pos_z), connection.frequency, verb, speaking) /obj/item/device/radio/hear_talk(mob/M as mob, msg, var/verb = "says", var/datum/language/speaking = null) @@ -502,33 +530,20 @@ var/global/list/default_medbay_channels = list( talk_into(M, msg,null,verb,speaking) -/* -/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message) - - if ((R.frequency == frequency && message)) - return TRUE - else if - - else - return null - return -*/ - /obj/item/device/radio/proc/receive_range(freq, level) // check if this radio can receive on the given frequency, and if so, // what the range is in which mobs will hear the radio // returns: -1 if can't receive, range otherwise - - if (wires.IsIndexCut(WIRE_RECEIVE)) + if(wires.IsIndexCut(WIRE_RECEIVE)) return -1 if(!listening) return -1 if(is_jammed(src)) return -1 if(!(0 in level)) - var/turf/position = get_turf(src) - if((!position || !(position.z in level)) && !bluespace_radio) //VOREStation Edit + var/pos_z = get_z(src) + if(!(pos_z in level)) return -1 if(freq in ANTAG_FREQS) if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys diff --git a/code/game/objects/items/devices/radio/radiopack.dm b/code/game/objects/items/devices/radio/radiopack.dm new file mode 100644 index 0000000000..c2ba25ecc2 --- /dev/null +++ b/code/game/objects/items/devices/radio/radiopack.dm @@ -0,0 +1,153 @@ +/obj/item/device/bluespaceradio + name = "bluespace radio" + desc = "A powerful radio that uses a tiny bluespace wormhole to send signals directly to subspace receivers and transmitters, bypassing the limitations of subspace." + icon = 'icons/obj/radio.dmi' + icon_state = "radiopack" + item_state = "radiopack" + slot_flags = SLOT_BACK + force = 5 + throwforce = 6 + preserve_item = 1 + w_class = ITEMSIZE_LARGE + action_button_name = "Remove/Replace Handset" + + var/obj/item/device/radio/bluespacehandset/linked/handset = /obj/item/device/radio/bluespacehandset/linked + +/obj/item/device/bluespaceradio/Initialize() + . = ..() + if(ispath(handset)) + handset = new handset(src, src) + +/obj/item/device/bluespaceradio/Destroy() + . = ..() + QDEL_NULL(handset) + +/obj/item/device/bluespaceradio/ui_action_click() + toggle_handset() + +/obj/item/device/bluespaceradio/attack_hand(var/mob/user) + if(loc == user) + toggle_handset() + else + ..() + +/obj/item/device/bluespaceradio/MouseDrop() + if(ismob(loc)) + if(!CanMouseDrop(src)) + return + var/mob/M = loc + if(!M.unEquip(src)) + return + add_fingerprint(usr) + M.put_in_any_hand_if_possible(src) + +/obj/item/device/bluespaceradio/attackby(var/obj/item/weapon/W, var/mob/user, var/params) + if(W == handset) + reattach_handset(user) + else + return ..() + +/obj/item/device/bluespaceradio/verb/toggle_handset() + set name = "Toggle Handset" + set category = "Object" + + var/mob/living/carbon/human/user = usr + if(!handset) + to_chat(user, "The handset is missing!") + return + + if(handset.loc != src) + reattach_handset(user) //Remove from their hands and back onto the defib unit + return + + if(!slot_check()) + to_chat(user, "You need to equip [src] before taking out [handset].") + else + if(!usr.put_in_hands(handset)) //Detach the handset into the user's hands + to_chat(user, "You need a free hand to hold the handset!") + update_icon() //success + +//checks that the base unit is in the correct slot to be used +/obj/item/device/bluespaceradio/proc/slot_check() + var/mob/M = loc + if(!istype(M)) + return 0 //not equipped + + if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src) + return 1 + if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_s_store) == src) + return 1 + + return 0 + +/obj/item/device/bluespaceradio/dropped(var/mob/user) + ..() + reattach_handset(user) //handset attached to a base unit should never exist outside of their base unit or the mob equipping the base unit + +/obj/item/device/bluespaceradio/proc/reattach_handset(var/mob/user) + if(!handset) return + + if(ismob(handset.loc)) + var/mob/M = handset.loc + if(M.drop_from_inventory(handset, src)) + to_chat(user, "\The [handset] snaps back into the main unit.") + else + handset.forceMove(src) + +//Subspace Radio Handset +/obj/item/device/radio/bluespacehandset + name = "bluespace radio handset" + desc = "A large walkie talkie attached to the bluespace radio by a retractable cord. It sits comfortably on a slot in the radio when not in use." + bluespace_radio = TRUE + icon_state = "signaller" + slot_flags = null + w_class = ITEMSIZE_LARGE + canhear_range = 1 + +/obj/item/device/radio/bluespacehandset/linked + var/obj/item/device/bluespaceradio/base_unit + +/obj/item/device/radio/bluespacehandset/linked/Initialize(mapload, var/obj/item/device/bluespaceradio/radio) + base_unit = radio + . = ..() + +/obj/item/device/radio/bluespacehandset/linked/Destroy() + if(base_unit) + //ensure the base unit's icon updates + if(base_unit.handset == src) + base_unit.handset = null + base_unit = null + return ..() + +/obj/item/device/radio/bluespacehandset/linked/dropped(var/mob/user) + ..() //update twohanding + if(base_unit) + base_unit.reattach_handset(user) //handset attached to a base unit should never exist outside of their base unit or the mob equipping the base unit + +/obj/item/device/radio/bluespacehandset/linked/receive_range(var/freq, var/list/level) + //Only care about megabroadcasts or things that are targeted at us + if(!(0 in level)) + return -1 + if(wires.IsIndexCut(WIRE_RECEIVE)) + return -1 + if(!listening) + return -1 + if(is_jammed(src)) + return -1 + if (!on) + return -1 + if (!freq) //recieved on main frequency + if (!listening) + return -1 + else + var/accept = (freq==frequency && listening) + if (!accept) + for (var/ch_name in channels) + var/datum/radio_frequency/RF = secure_radio_connections[ch_name] + if (RF && RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING)) + accept = 1 + break + if (!accept) + return -1 + + return canhear_range diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 73a8e7bc5b..ace7d48e91 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -525,7 +525,7 @@ Traitors and the like can also be revived with the previous role mostly intact. //If we're announcing their arrival if(announce) - AnnounceArrival(new_character, new_character.mind.assigned_role) + AnnounceArrival(new_character, new_character.mind.assigned_role, "Common", new_character.z) log_admin("[admin] has spawned [player_key]'s character [new_character.real_name].") message_admins("[admin] has spawned [player_key]'s character [new_character.real_name].", 1) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 209516ec88..799e177304 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -419,18 +419,19 @@ //Grab some data from the character prefs for use in random news procs. - AnnounceArrival(character, rank, join_message) + AnnounceArrival(character, rank, join_message, announce_channel, character.z) else - AnnounceCyborg(character, rank, join_message) + AnnounceCyborg(character, rank, join_message, announce_channel, character.z) qdel(src) -/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) +/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message, var/channel, var/zlevel) if (ticker.current_state == GAME_STATE_PLAYING) + var/list/zlevels = zlevel ? using_map.get_map_levels(zlevel, TRUE) : null if(character.mind.role_alt_title) rank = character.mind.role_alt_title // can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc. - global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") + global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer", channel, zlevels) /mob/new_player/proc/LateChoices() var/name = client.prefs.be_random_name ? "friend" : client.prefs.real_name diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 69f4a8bb64..2f382e0f4d 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -79,20 +79,25 @@ var/global/ntnet_card_uid = 1 return 0 if(holder2) - var/turf/T = get_turf(holder2) - if(!istype(T)) //no reception in nullspace + var/holderz = get_z(holder2) + if(!holderz) //no reception in nullspace return 0 - if(T.z in using_map.station_levels) - // Computer is on station. Low/High signal depending on what type of network card you have - if(long_range) - return 2 - else - return 1 - if(T.z in using_map.contact_levels) //not on station, but close enough for radio signal to travel - if(long_range) // Computer is not on station, but it has upgraded network card. Low signal. - return 1 - - return 0 // Computer is not on station and does not have upgraded network card. No signal. + var/list/zlevels_in_range = using_map.get_map_levels(holderz, long_range) + var/best = 0 + for(var/relay in ntnet_global.relays) + var/obj/machinery/ntnet_relay/R = relay + //Relay is down + if(!R.operable()) + continue + //We're on the same z + if(R.z == holderz) + best = 2 + break // No point in going further + //Not on the same z but within range anyway + if(R.z in zlevels_in_range) + best = 1 + return best + return 0 // No computer! /obj/item/weapon/computer_hardware/network_card/Destroy() if(holder2 && (holder2.network_card == src)) diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index f3e7e10b85e15938ba61a7455a0bcca7df0b8fc7..63958e93a406103408adababfc11b63914b90ad1 100644 GIT binary patch delta 17330 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 delta 16652 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 F{tr|>ls*6e diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index 98871c1a0291fa7bd446838bb7ee21df483eb5d0..c56548359910093cf38df066e025687f784b357f 100644 GIT binary patch literal 20967 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