From 8f86c9a178b886718f48781f7e78dcfa16b8d57c Mon Sep 17 00:00:00 2001 From: phil235 Date: Tue, 21 Apr 2015 01:31:13 +0200 Subject: [PATCH] Reorganized the telecom machines files. Telecom machines are now deconstructed the same way as all other constructable machine. Adding new sprites for tcom machines with panel open. Moving telecom machines sprite to obj/machines/telecomms.dmi Fixes the effects of smoke/flash/sonic powder when stabilized and then triggered. Removing overdosing on nicotine. --- .../{broadcaster.dm => broadcasting.dm} | 1032 +++++++---------- .../telecomms/{ => computers}/logbrowser.dm | 462 ++++---- .../telecomms/{ => computers}/telemonitor.dm | 268 +++-- .../{ => computers}/traffic_control.dm | 574 +++++---- .../telecomms/machine_interactions.dm | 103 +- .../machinery/telecomms/machines/allinone.dm | 47 + .../telecomms/machines/broadcaster.dm | 131 +++ code/game/machinery/telecomms/machines/bus.dm | 97 ++ code/game/machinery/telecomms/machines/hub.dm | 61 + .../machinery/telecomms/machines/processor.dm | 80 ++ .../machinery/telecomms/machines/receiver.dm | 95 ++ .../machinery/telecomms/machines/relay.dm | 86 ++ .../machinery/telecomms/machines/server.dm | 224 ++++ code/game/machinery/telecomms/presets.dm | 187 --- .../machinery/telecomms/telecomunications.dm | 458 +------- .../Chemistry-Reagents/Drug-Reagents.dm | 20 +- .../Chemistry-Recipes/Pyrotechnics.dm | 3 + html/changelogs/phil235-BundleFix4.yml | 10 + icons/obj/machines/telecomms.dmi | Bin 0 -> 20864 bytes icons/obj/stationobjs.dmi | Bin 89362 -> 78397 bytes tgstation.dme | 17 +- 21 files changed, 1964 insertions(+), 1991 deletions(-) rename code/game/machinery/telecomms/{broadcaster.dm => broadcasting.dm} (70%) rename code/game/machinery/telecomms/{ => computers}/logbrowser.dm (96%) rename code/game/machinery/telecomms/{ => computers}/telemonitor.dm (94%) rename code/game/machinery/telecomms/{ => computers}/traffic_control.dm (95%) create mode 100644 code/game/machinery/telecomms/machines/allinone.dm create mode 100644 code/game/machinery/telecomms/machines/broadcaster.dm create mode 100644 code/game/machinery/telecomms/machines/bus.dm create mode 100644 code/game/machinery/telecomms/machines/hub.dm create mode 100644 code/game/machinery/telecomms/machines/processor.dm create mode 100644 code/game/machinery/telecomms/machines/receiver.dm create mode 100644 code/game/machinery/telecomms/machines/relay.dm create mode 100644 code/game/machinery/telecomms/machines/server.dm delete mode 100644 code/game/machinery/telecomms/presets.dm create mode 100644 html/changelogs/phil235-BundleFix4.yml create mode 100644 icons/obj/machines/telecomms.dmi diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcasting.dm similarity index 70% rename from code/game/machinery/telecomms/broadcaster.dm rename to code/game/machinery/telecomms/broadcasting.dm index 1fc7a5bf311..b6ab78b9fc1 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -1,591 +1,441 @@ -//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. -*/ - -var/list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam -var/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 - use_power = 1 - idle_power_usage = 25 - machinetype = 5 - /*heatgen = 0 - delay = 7*/ - circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster" - -/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"] |= listening_level - - /** #### - Normal Broadcast - #### **/ - - if(signal.data["type"] == 0) - - /* ###### Broadcast a message using signal.data ###### */ - Broadcast_Message(signal.data["mob"], - signal.data["vmask"], signal.data["radio"], - signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"], - 0, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - - /** #### - Simple Broadcast - #### **/ - - if(signal.data["type"] == 1) - - /* ###### Broadcast a message using signal.data ###### */ - Broadcast_SimpleMessage(signal.data["name"], signal.frequency, - signal.data["message"],null, null, - signal.data["compression"], listening_level) - - - /** #### - Artificial Broadcast - #### **/ - // (Imitates a mob) - - if(signal.data["type"] == 2) - - /* ###### Broadcast a message using signal.data ###### */ - // Parameter "data" as 4: AI can't track this person/mob - Broadcast_Message(signal.data["mob"], - signal.data["vmask"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - 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) - message_delay = 0 - ..() - - -/* - Basically just an empty shell for receiving and broadcasting radio messages. Not - very flexible, but it gets the job done. -*/ - -/obj/machinery/telecomms/allinone - name = "telecommunications mainframe" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "comm_server" - desc = "A compact machine used for portable subspace telecommuniations processing." - density = 1 - anchored = 1 - use_power = 0 - idle_power_usage = 0 - machinetype = 6 - //heatgen = 0 - var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel - -/obj/machinery/telecomms/allinone/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 - - if(signal.data["slow"] > 0) - sleep(signal.data["slow"]) // simulate the network lag if necessary - - /* ###### Broadcast a message using signal.data ###### */ - if(signal.frequency == SYND_FREQ) // if syndicate broadcast, just - Broadcast_Message(signal.data["mob"], - signal.data["vmask"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency, signal.data["spans"], - signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) - - -/** - - Here is the big, bad function that broadcasts a message given the appropriate - parameters. - - @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 monkeys 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/atom/movable/AM, - var/vmask, var/obj/item/device/radio/radio, - var/message, var/name, var/job, var/realname, - var/data, var/compression, var/list/level, var/freq, var/list/spans, - var/verb_say, var/verb_ask, var/verb_exclaim, var/verb_yell) - - message = copytext(message, 1, MAX_BROADCAST_LEN) - - if(!message) - return - - var/list/radios = list() - - var/atom/movable/virtualspeaker/virt = PoolOrNew(/atom/movable/virtualspeaker,null) - virt.name = name - virt.job = job - virt.languages = AM.languages - virt.source = AM - virt.faketrack = data == 4 ? 1 : 0 - virt.radio = radio - virt.verb_say = verb_say - virt.verb_ask = verb_ask - virt.verb_exclaim = verb_exclaim - virt.verb_yell = verb_yell - - if(compression > 0) - message = Gibberish(message, compression + 40) - - // --- Broadcast only to intercom devices --- - - if(data == 1) - for(var/obj/item/device/radio/intercom/R in all_radios["[freq]"]) - if(R.receive_range(freq, level) > -1) - radios += R - - // --- Broadcast only to intercoms and station-bounced radios --- - - else if(data == 2) - - for(var/obj/item/device/radio/R in all_radios["[freq]"]) - if(R.subspace_transmission) - continue - - if(R.receive_range(freq, level) > -1) - radios += R - - // --- This space left blank for Syndicate data --- - - // --- Centcom radio, yo. --- - - else if(data == 4) - - for(var/obj/item/device/radio/R in all_radios["[freq]"]) - if(!R.centcom) - continue - - if(R.receive_range(freq, level) > -1) - radios += R - - // --- Broadcast to ALL radio devices --- - - else - for(var/obj/item/device/radio/R in all_radios["[freq]"]) - if(R.receive_range(freq, level) > -1) - radios += R - - var/freqtext = num2text(freq) - for(var/obj/item/device/radio/R in all_radios["[SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. - if(R.receive_range(SYND_FREQ, list(R.z)) > -1 && freqtext in radiochannelsreverse) - radios |= R - - // Get a list of mobs who can hear from the radios we collected. - var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers. - - for(var/mob/R in receive) //Filter receiver list. - if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - receive -= R - - for(var/mob/M in player_list) - if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO)) - receive |= M - - var/rendered = virt.compose_message(virt, virt.languages, message, freq, spans) //Always call this on the virtualspeaker to advoid issues. - for(var/atom/movable/hearer in receive) - hearer.Hear(rendered, virt, AM.languages, message, freq, spans) - - if(length(receive)) - // --- This following recording is intended for research and feedback in the use of department radio channels --- - - var/blackbox_msg = "[AM] [AM.say_quote(message, spans)]" - if(istype(blackbox)) - switch(freq) - if(1459) - blackbox.msg_common += blackbox_msg - if(1351) - blackbox.msg_science += blackbox_msg - if(1353) - blackbox.msg_command += blackbox_msg - if(1355) - blackbox.msg_medical += blackbox_msg - if(1357) - blackbox.msg_engineering += blackbox_msg - if(1359) - blackbox.msg_security += blackbox_msg - if(1441) - blackbox.msg_deathsquad += blackbox_msg - if(1213) - blackbox.msg_syndicate += blackbox_msg - if(1349) - blackbox.msg_service += blackbox_msg - if(1347) - blackbox.msg_cargo += blackbox_msg - else - blackbox.messages += blackbox_msg - - spawn(50) - PlaceInPool(virt) - -/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) - - /* ###### 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() - - - // --- Broadcast only to intercom devices --- - - if(data == 1) - for (var/obj/item/device/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 == 2) - for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) - if(R.subspace_transmission) - continue - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(display_freq) - - - // --- Broadcast to syndicate radio! --- - - else if(data == 3) - var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ) - - for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) - var/turf/position = get_turf(R) - if(position && position.z == level) - receive |= R.send_hear(SYND_FREQ) - - // --- Centcom radio, yo. --- - - else if(data == 4) - - for(var/obj/item/device/radio/R in all_radios["[RADIO_CHAT]"]) - if(R.centcom) - receive |= R.send_hear(CENTCOM_FREQ) - - // --- Broadcast to ALL radio devices --- - - else - for (var/obj/item/device/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.client && !(R.client.prefs.chat_toggles & CHAT_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.languages & M.languages) - - 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 = "" // goes in the actual output - var/freq_text // the name of the channel - - // --- Set the name of the channel --- - switch(display_freq) - - if(SYND_FREQ) - freq_text = "#unkn" - if(COMM_FREQ) - freq_text = "Command" - if(SCI_FREQ) - freq_text = "Science" - if(MED_FREQ) - freq_text = "Medical" - if(ENG_FREQ) - freq_text = "Engineering" - if(SEC_FREQ) - freq_text = "Security" - if(SERV_FREQ) - freq_text = "Service" - if(SUPP_FREQ) - freq_text = "Supply" - if(AIPRIV_FREQ) - freq_text = "AI Private" - //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO - - - // --- 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) - - // --- Some more pre-message formatting --- - - var/part_b_extra = "" - if(data == 3) // intercepted radio message - part_b_extra = " (Intercepted)" - - // Create a radio headset for the sole purpose of using its icon - var/obj/item/device/radio/headset/radio = new - - var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " - var/part_c = "" - - if (display_freq==SYND_FREQ) - part_a = "" - else if (display_freq==COMM_FREQ) - part_a = "" - else if (display_freq==SCI_FREQ) - part_a = "" - else if (display_freq==MED_FREQ) - part_a = "" - else if (display_freq==ENG_FREQ) - part_a = "" - else if (display_freq==SEC_FREQ) - part_a = "" - else if (display_freq==SERV_FREQ) - part_a = "" - else if (display_freq==SUPP_FREQ) - part_a = "" - else if (display_freq==CENTCOM_FREQ) - part_a = "" - else if (display_freq==AIPRIV_FREQ) - part_a = "" - - // --- This following recording is intended for research and feedback in the use of department radio channels --- - - var/part_blackbox_b = " \[[freq_text]\] " - var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]" - //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(1459) - blackbox.msg_common += blackbox_msg - if(1351) - blackbox.msg_science += blackbox_msg - if(1353) - blackbox.msg_command += blackbox_msg - if(1355) - blackbox.msg_medical += blackbox_msg - if(1357) - blackbox.msg_engineering += blackbox_msg - if(1359) - blackbox.msg_security += blackbox_msg - if(1441) - blackbox.msg_deathsquad += blackbox_msg - if(1213) - blackbox.msg_syndicate += blackbox_msg - if(1349) - blackbox.msg_service += blackbox_msg - if(1347) - blackbox.msg_cargo += 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/turf/position = get_turf(src) - return (position.z in signal.data["level"] && signal.data["done"]) - -/atom/proc/telecomms_process() - - // 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) - - // --- 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" = 4, // 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 = 1459// Common channel - - //#### Sending the signal to all subspace receivers ####// - for(var/obj/machinery/telecomms/receiver/R in telecomms_list) - R.receive_signal(signal) - - sleep(rand(10,25)) - - return signal - + +/** + + Here is the big, bad function that broadcasts a message given the appropriate + parameters. + + @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 monkeys 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/atom/movable/AM, + var/vmask, var/obj/item/device/radio/radio, + var/message, var/name, var/job, var/realname, + var/data, var/compression, var/list/level, var/freq, var/list/spans, + var/verb_say, var/verb_ask, var/verb_exclaim, var/verb_yell) + + message = copytext(message, 1, MAX_BROADCAST_LEN) + + if(!message) + return + + var/list/radios = list() + + var/atom/movable/virtualspeaker/virt = PoolOrNew(/atom/movable/virtualspeaker,null) + virt.name = name + virt.job = job + virt.languages = AM.languages + virt.source = AM + virt.faketrack = data == 4 ? 1 : 0 + virt.radio = radio + virt.verb_say = verb_say + virt.verb_ask = verb_ask + virt.verb_exclaim = verb_exclaim + virt.verb_yell = verb_yell + + if(compression > 0) + message = Gibberish(message, compression + 40) + + // --- Broadcast only to intercom devices --- + + if(data == 1) + for(var/obj/item/device/radio/intercom/R in all_radios["[freq]"]) + if(R.receive_range(freq, level) > -1) + radios += R + + // --- Broadcast only to intercoms and station-bounced radios --- + + else if(data == 2) + + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(R.subspace_transmission) + continue + + if(R.receive_range(freq, level) > -1) + radios += R + + // --- This space left blank for Syndicate data --- + + // --- Centcom radio, yo. --- + + else if(data == 4) + + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(!R.centcom) + continue + + if(R.receive_range(freq, level) > -1) + radios += R + + // --- Broadcast to ALL radio devices --- + + else + for(var/obj/item/device/radio/R in all_radios["[freq]"]) + if(R.receive_range(freq, level) > -1) + radios += R + + var/freqtext = num2text(freq) + for(var/obj/item/device/radio/R in all_radios["[SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving. + if(R.receive_range(SYND_FREQ, list(R.z)) > -1 && freqtext in radiochannelsreverse) + radios |= R + + // Get a list of mobs who can hear from the radios we collected. + var/list/receive = get_mobs_in_radio_ranges(radios) //this includes all hearers. + + for(var/mob/R in receive) //Filter receiver list. + if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. + receive -= R + + for(var/mob/M in player_list) + if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTRADIO)) + receive |= M + + var/rendered = virt.compose_message(virt, virt.languages, message, freq, spans) //Always call this on the virtualspeaker to advoid issues. + for(var/atom/movable/hearer in receive) + hearer.Hear(rendered, virt, AM.languages, message, freq, spans) + + if(length(receive)) + // --- This following recording is intended for research and feedback in the use of department radio channels --- + + var/blackbox_msg = "[AM] [AM.say_quote(message, spans)]" + if(istype(blackbox)) + switch(freq) + if(1459) + blackbox.msg_common += blackbox_msg + if(1351) + blackbox.msg_science += blackbox_msg + if(1353) + blackbox.msg_command += blackbox_msg + if(1355) + blackbox.msg_medical += blackbox_msg + if(1357) + blackbox.msg_engineering += blackbox_msg + if(1359) + blackbox.msg_security += blackbox_msg + if(1441) + blackbox.msg_deathsquad += blackbox_msg + if(1213) + blackbox.msg_syndicate += blackbox_msg + if(1349) + blackbox.msg_service += blackbox_msg + if(1347) + blackbox.msg_cargo += blackbox_msg + else + blackbox.messages += blackbox_msg + + spawn(50) + PlaceInPool(virt) + +/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression, var/level) + + /* ###### 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() + + + // --- Broadcast only to intercom devices --- + + if(data == 1) + for (var/obj/item/device/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 == 2) + for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) + if(R.subspace_transmission) + continue + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(display_freq) + + + // --- Broadcast to syndicate radio! --- + + else if(data == 3) + var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(SYND_FREQ) + + for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) + var/turf/position = get_turf(R) + if(position && position.z == level) + receive |= R.send_hear(SYND_FREQ) + + // --- Centcom radio, yo. --- + + else if(data == 4) + + for(var/obj/item/device/radio/R in all_radios["[RADIO_CHAT]"]) + if(R.centcom) + receive |= R.send_hear(CENTCOM_FREQ) + + // --- Broadcast to ALL radio devices --- + + else + for (var/obj/item/device/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.client && !(R.client.prefs.chat_toggles & CHAT_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.languages & M.languages) + + 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 = "" // goes in the actual output + var/freq_text // the name of the channel + + // --- Set the name of the channel --- + switch(display_freq) + + if(SYND_FREQ) + freq_text = "#unkn" + if(COMM_FREQ) + freq_text = "Command" + if(SCI_FREQ) + freq_text = "Science" + if(MED_FREQ) + freq_text = "Medical" + if(ENG_FREQ) + freq_text = "Engineering" + if(SEC_FREQ) + freq_text = "Security" + if(SERV_FREQ) + freq_text = "Service" + if(SUPP_FREQ) + freq_text = "Supply" + if(AIPRIV_FREQ) + freq_text = "AI Private" + //There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO + + + // --- 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) + + // --- Some more pre-message formatting --- + + var/part_b_extra = "" + if(data == 3) // intercepted radio message + part_b_extra = " (Intercepted)" + + // Create a radio headset for the sole purpose of using its icon + var/obj/item/device/radio/headset/radio = new + + var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " + var/part_c = "" + + if (display_freq==SYND_FREQ) + part_a = "" + else if (display_freq==COMM_FREQ) + part_a = "" + else if (display_freq==SCI_FREQ) + part_a = "" + else if (display_freq==MED_FREQ) + part_a = "" + else if (display_freq==ENG_FREQ) + part_a = "" + else if (display_freq==SEC_FREQ) + part_a = "" + else if (display_freq==SERV_FREQ) + part_a = "" + else if (display_freq==SUPP_FREQ) + part_a = "" + else if (display_freq==CENTCOM_FREQ) + part_a = "" + else if (display_freq==AIPRIV_FREQ) + part_a = "" + + // --- This following recording is intended for research and feedback in the use of department radio channels --- + + var/part_blackbox_b = " \[[freq_text]\] " + var/blackbox_msg = "[part_a][source][part_blackbox_b]\"[text]\"[part_c]" + //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(1459) + blackbox.msg_common += blackbox_msg + if(1351) + blackbox.msg_science += blackbox_msg + if(1353) + blackbox.msg_command += blackbox_msg + if(1355) + blackbox.msg_medical += blackbox_msg + if(1357) + blackbox.msg_engineering += blackbox_msg + if(1359) + blackbox.msg_security += blackbox_msg + if(1441) + blackbox.msg_deathsquad += blackbox_msg + if(1213) + blackbox.msg_syndicate += blackbox_msg + if(1349) + blackbox.msg_service += blackbox_msg + if(1347) + blackbox.msg_cargo += 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/turf/position = get_turf(src) + return (position.z in signal.data["level"] && signal.data["done"]) + +/atom/proc/telecomms_process() + + // 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) + + // --- 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" = 4, // 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 = 1459// Common channel + + //#### Sending the signal to all subspace receivers ####// + for(var/obj/machinery/telecomms/receiver/R in telecomms_list) + R.receive_signal(signal) + + sleep(rand(10,25)) + + return signal + diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm similarity index 96% rename from code/game/machinery/telecomms/logbrowser.dm rename to code/game/machinery/telecomms/computers/logbrowser.dm index b7ebd4314ac..8798f07c20c 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -1,232 +1,232 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/obj/machinery/computer/telecomms/server - name = "telecommunications server monitoring console" - icon_state = "comm_logs" - - var/screen = 0 // the screen number: - var/list/servers = list() // the servers located by the computer - var/obj/machinery/telecomms/server/SelectedServer - - var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages - - var/universal_translate = 0 // set to 1 if it can translate nonhuman speech - - req_access = list(access_tcomsat) - circuit = "/obj/item/weapon/circuitboard/comm_server" - -/obj/machinery/computer/telecomms/server/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunication Server Monitor
Telecommunications Server Monitor
" - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]
" - dat += "
Current Network: [network]
" - if(servers.len) - dat += "
Detected Telecommunication Servers:
    " - for(var/obj/machinery/telecomms/T in servers) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - - else - dat += "
No servers detected. Scan for servers: \[Scan\]" - - - // --- Viewing Server --- - - if(1) - dat += "
[temp]
" - dat += "
\[Main Menu\] \[Refresh\]
" - dat += "
Current Network: [network]" - dat += "
Selected Server: [SelectedServer.id]" - - if(SelectedServer.totaltraffic >= 1024) - dat += "
Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes

" - else - dat += "
Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes

" - - dat += "Stored Logs:
    " - - var/i = 0 - for(var/datum/comm_log_entry/C in SelectedServer.log_entries) - i++ - - - // If the log is a speech file - if(C.input_type == "Speech File") - - dat += "
  1. [C.name] \[X\]
    " - - // -- Determine race of orator -- - - var/race // The actual race of the mob - var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human - var/mobtype = C.parameters["mobtype"] - - var/list/humans = typesof(/mob/living/carbon/human, /mob/living/carbon/brain) - var/list/monkeys = typesof(/mob/living/carbon/monkey) - var/list/silicons = typesof(/mob/living/silicon) - var/list/slimes = typesof(/mob/living/simple_animal/slime) - var/list/animals = typesof(/mob/living/simple_animal) - - if(mobtype in humans) - race = "Human" - language = race - - else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes - race = "Slime" - language = race - - else if(mobtype in monkeys) - race = "Monkey" - language = race - - else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job - race = "Artificial Life" - language = race - - else if(istype(mobtype, /obj)) - race = "Machinery" - language = race - - else if(mobtype in animals) - race = "Domestic Animal" - language = race - - else - race = "Unidentifiable" - language = race - - // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- - - if(language == "Human" || universal_translate || C.parameters["uspeech"]) - dat += "Data type: [C.input_type]
    " - dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " - dat += "Class: [race]
    " - dat += "Contents: \"[C.parameters["message"]]\"
    " - - - // -- Orator is not human and universal translate not active -- - - else - dat += "Data type: Audio File
    " - dat += "Source: Unidentifiable
    " - dat += "Class: [race]
    " - dat += "Contents: Unintelligble
    " - - dat += "

  2. " - - else if(C.input_type == "Execution Error") - - dat += "
  3. [C.name] \[X\]
    " - dat += "Output: \"[C.parameters["message"]]\"
    " - dat += "

  4. " - - - dat += "
" - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - -/obj/machinery/computer/telecomms/server/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - servers = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - if(href_list["delete"]) - - if(!src.allowed(usr) && !emagged) - usr << "ACCESS DENIED." - return - - if(SelectedServer) - - var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] - - temp = "- DELETED ENTRY: [D.name] -" - - SelectedServer.log_entries.Remove(D) - del(D) - - else - temp = "- FAILED: NO SELECTED MACHINE -" - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/server/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/server/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/obj/machinery/computer/telecomms/server + name = "telecommunications server monitoring console" + icon_state = "comm_logs" + + var/screen = 0 // the screen number: + var/list/servers = list() // the servers located by the computer + var/obj/machinery/telecomms/server/SelectedServer + + var/network = "NULL" // the network to probe + var/temp = "" // temporary feedback messages + + var/universal_translate = 0 // set to 1 if it can translate nonhuman speech + + req_access = list(access_tcomsat) + circuit = "/obj/item/weapon/circuitboard/comm_server" + +/obj/machinery/computer/telecomms/server/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunication Server Monitor
Telecommunications Server Monitor
" + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]
" + dat += "
Current Network: [network]
" + if(servers.len) + dat += "
Detected Telecommunication Servers:
    " + for(var/obj/machinery/telecomms/T in servers) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + + else + dat += "
No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + dat += "
[temp]
" + dat += "
\[Main Menu\] \[Refresh\]
" + dat += "
Current Network: [network]" + dat += "
Selected Server: [SelectedServer.id]" + + if(SelectedServer.totaltraffic >= 1024) + dat += "
Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes

" + else + dat += "
Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes

" + + dat += "Stored Logs:
    " + + var/i = 0 + for(var/datum/comm_log_entry/C in SelectedServer.log_entries) + i++ + + + // If the log is a speech file + if(C.input_type == "Speech File") + + dat += "
  1. [C.name] \[X\]
    " + + // -- Determine race of orator -- + + var/race // The actual race of the mob + var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human + var/mobtype = C.parameters["mobtype"] + + var/list/humans = typesof(/mob/living/carbon/human, /mob/living/carbon/brain) + var/list/monkeys = typesof(/mob/living/carbon/monkey) + var/list/silicons = typesof(/mob/living/silicon) + var/list/slimes = typesof(/mob/living/simple_animal/slime) + var/list/animals = typesof(/mob/living/simple_animal) + + if(mobtype in humans) + race = "Human" + language = race + + else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes + race = "Slime" + language = race + + else if(mobtype in monkeys) + race = "Monkey" + language = race + + else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job + race = "Artificial Life" + language = race + + else if(istype(mobtype, /obj)) + race = "Machinery" + language = race + + else if(mobtype in animals) + race = "Domestic Animal" + language = race + + else + race = "Unidentifiable" + language = race + + // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- + + if(language == "Human" || universal_translate || C.parameters["uspeech"]) + dat += "Data type: [C.input_type]
    " + dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " + dat += "Class: [race]
    " + dat += "Contents: \"[C.parameters["message"]]\"
    " + + + // -- Orator is not human and universal translate not active -- + + else + dat += "Data type: Audio File
    " + dat += "Source: Unidentifiable
    " + dat += "Class: [race]
    " + dat += "Contents: Unintelligble
    " + + dat += "

  2. " + + else if(C.input_type == "Execution Error") + + dat += "
  3. [C.name] \[X\]
    " + dat += "Output: \"[C.parameters["message"]]\"
    " + dat += "

  4. " + + + dat += "
" + + + + user << browse(dat, "window=comm_monitor;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + +/obj/machinery/computer/telecomms/server/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + servers = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("scan") + if(servers.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + + if(!servers.len) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + + screen = 0 + + if(href_list["delete"]) + + if(!src.allowed(usr) && !emagged) + usr << "ACCESS DENIED." + return + + if(SelectedServer) + + var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] + + temp = "- DELETED ENTRY: [D.name] -" + + SelectedServer.log_entries.Remove(D) + del(D) + + else + temp = "- FAILED: NO SELECTED MACHINE -" + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/server/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/server/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 user << "You you disable the security protocols." \ No newline at end of file diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm similarity index 94% rename from code/game/machinery/telecomms/telemonitor.dm rename to code/game/machinery/telecomms/computers/telemonitor.dm index 4943a70429a..432604dc15e 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -1,136 +1,134 @@ -//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. -*/ - - -/obj/machinery/computer/telecomms/monitor - name = "telecommunications monitoring console" - icon_state = "comm_monitor" - - var/screen = 0 // the screen number: - var/list/machinelist = list() // the machines located by the computer - var/obj/machinery/telecomms/SelectedMachine - - var/network = "NULL" // the network to probe - - var/temp = "" // temporary feedback messages - circuit = "/obj/item/weapon/circuitboard/comm_monitor" - -/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunications Monitor
Telecommunications Monitor
" - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]

" - dat += "
Current Network: [network]
" - if(machinelist.len) - dat += "
Detected Network Entities:
    " - for(var/obj/machinery/telecomms/T in machinelist) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - else - dat += "\[Probe Network\]" - - - // --- Viewing Machine --- - - if(1) - dat += "
[temp]
" - dat += "
\[Main Menu\]
" - dat += "
Current Network: [network]
" - dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
" - dat += "Linked Entities:
    " - for(var/obj/machinery/telecomms/T in SelectedMachine.links) - if(!T.hide) - dat += "
  1. \ref[T.id] [T.name] ([T.id])
  2. " - dat += "
" - - - - user << browse(dat, "window=comm_monitor;size=575x400") - onclose(user, "server_control") - - temp = "" - return - - -/obj/machinery/computer/telecomms/monitor/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["viewmachine"]) - screen = 1 - for(var/obj/machinery/telecomms/T in machinelist) - if(T.id == href_list["viewmachine"]) - SelectedMachine = T - break - - if(href_list["operation"]) - switch(href_list["operation"]) - - if("release") - machinelist = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("probe") - if(machinelist.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/T in range(25, src)) - if(T.network == network) - machinelist.Add(T) - - if(!machinelist.len) - temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" - else - temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" - - screen = 0 - - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - if(newnet && ((usr in range(1, src) || issilicon(usr)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - network = newnet - screen = 0 - machinelist = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/monitor/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/monitor/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 + +/* + Telecomms monitor tracks the overall trafficing of a telecommunications network + and displays a heirarchy of linked machines. +*/ + + +/obj/machinery/computer/telecomms/monitor + name = "telecommunications monitoring console" + icon_state = "comm_monitor" + + var/screen = 0 // the screen number: + var/list/machinelist = list() // the machines located by the computer + var/obj/machinery/telecomms/SelectedMachine + + var/network = "NULL" // the network to probe + + var/temp = "" // temporary feedback messages + circuit = "/obj/item/weapon/circuitboard/comm_monitor" + +/obj/machinery/computer/telecomms/monitor/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunications Monitor
Telecommunications Monitor
" + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]

" + dat += "
Current Network: [network]
" + if(machinelist.len) + dat += "
Detected Network Entities:
    " + for(var/obj/machinery/telecomms/T in machinelist) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + else + dat += "\[Probe Network\]" + + + // --- Viewing Machine --- + + if(1) + dat += "
[temp]
" + dat += "
\[Main Menu\]
" + dat += "
Current Network: [network]
" + dat += "Selected Network Entity: [SelectedMachine.name] ([SelectedMachine.id])
" + dat += "Linked Entities:
    " + for(var/obj/machinery/telecomms/T in SelectedMachine.links) + if(!T.hide) + dat += "
  1. \ref[T.id] [T.name] ([T.id])
  2. " + dat += "
" + + + + user << browse(dat, "window=comm_monitor;size=575x400") + onclose(user, "server_control") + + temp = "" + return + + +/obj/machinery/computer/telecomms/monitor/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["viewmachine"]) + screen = 1 + for(var/obj/machinery/telecomms/T in machinelist) + if(T.id == href_list["viewmachine"]) + SelectedMachine = T + break + + if(href_list["operation"]) + switch(href_list["operation"]) + + if("release") + machinelist = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("probe") + if(machinelist.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/T in range(25, src)) + if(T.network == network) + machinelist.Add(T) + + if(!machinelist.len) + temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" + else + temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" + + screen = 0 + + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + if(newnet && ((usr in range(1, src) || issilicon(usr)))) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + network = newnet + screen = 0 + machinelist = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/monitor/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/monitor/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 user << "You you disable the security protocols." \ No newline at end of file diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/computers/traffic_control.dm similarity index 95% rename from code/game/machinery/telecomms/traffic_control.dm rename to code/game/machinery/telecomms/computers/traffic_control.dm index d00a030350c..3edb25ff551 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/computers/traffic_control.dm @@ -1,290 +1,286 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - - - - - -/obj/machinery/computer/telecomms/traffic - name = "telecommunications traffic control console" - icon_state = "computer_generic" - - var/screen = 0 // the screen number: - 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 - - var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages - - var/storedcode = "" // code stored - var/obj/item/weapon/card/id/auth = null - var/list/access_log = list() - var/process = 0 - circuit = "/obj/item/weapon/circuitboard/comm_traffic" - - req_access = list(access_tcomsat) - -/obj/machinery/computer/telecomms/traffic/proc/stop_editing() - if(editingcode) - if(editingcode.client) - winshow(editingcode, "Telecomms IDE", 0) // hide the window! - editingcode.unset_machine() - editingcode = null - -/obj/machinery/computer/telecomms/traffic/process() - - if(stat & (NOPOWER|BROKEN)) - stop_editing() - return - - if(editingcode && editingcode.machine != src) - stop_editing() - return - - if(!editingcode) - if(length(viewingcode) > 0) - editingcode = pick(viewingcode) - viewingcode.Remove(editingcode) - return - - process = !process - if(!process) - return - - // loop if there's someone manning the keyboard - if(!editingcode.client) - stop_editing() - return - - // For the typer, the input is enabled. Buffer the typed text - storedcode = "[winget(editingcode, "tcscode", "text")]" - winset(editingcode, "tcscode", "is-disabled=false") - - // If the player's not manning the keyboard anymore, adjust everything - if(!in_range(editingcode, src) && !issilicon(editingcode) || editingcode.machine != src) - winshow(editingcode, "Telecomms IDE", 0) // hide the window! - editingcode = null - return - - // 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 && in_range(M, 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 windows - - -/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" - dat += "
[(auth ? "AUTHED" : "NOT AUTHED")]: [(!auth ? "Insert ID" : auth)]
" - dat += "View System Log
" - - if(issilicon(user) || auth) - - switch(screen) - - - // --- Main Menu --- - - if(0) - dat += "
[temp]
" - dat += "
Current Network: [network]
" - if(servers.len) - dat += "
Detected Telecommunication Servers:
    " - for(var/obj/machinery/telecomms/T in servers) - dat += "
  • \ref[T] [T.name] ([T.id])
  • " - dat += "
" - dat += "
\[Flush Buffer\]" - - else - dat += "
No servers detected. Scan for servers: \[Scan\]" - - - // --- Viewing Server --- - - if(1) - if(SelectedServer) - dat += "
[temp]
" - dat += "
\[Main Menu\] \[Refresh\]
" - dat += "
Current Network: [network]" - dat += "
Selected Server: [SelectedServer.id]

" - dat += "
\[Edit Code\]" - dat += "
Signal Execution: " - if(SelectedServer.autoruncode) - dat += "ALWAYS" - else - dat += "NEVER" - else - screen = 0 - return - - - user << browse(dat, "window=traffic_control;size=575x400") - onclose(user, "server_control") - - temp = "" - return - -/obj/machinery/computer/telecomms/traffic/proc/create_log(var/entry, var/mob/user) - var/id = null - if(issilicon(user)) - id = "System Administrator" - else - if(auth) - id = "[auth.registered_name] ([auth.assignment])" - else - ERROR("There is a null auth while the user isn't a silicon! ([user.name], [user.type])") - return - access_log += "\[[get_timestamp()]\] [id] [entry]" - -/obj/machinery/computer/telecomms/traffic/proc/print_logs() - . = "

Traffic Control Telecomms System Log


" - for(var/entry in access_log) - . += entry + "
" - return . - -/obj/machinery/computer/telecomms/traffic/Topic(href, href_list) - if(..()) - return - - - add_fingerprint(usr) - usr.set_machine(src) - - if(href_list["auth"]) - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!auth) - var/obj/item/weapon/card/id/I = C.get_active_hand() - if(istype(I)) - if(check_access(I)) - C.drop_item() - I.loc = src - auth = I - create_log("has logged in.", usr) - else - create_log("has logged out.", usr) - auth.loc = src.loc - C.put_in_hands(auth) - auth = null - updateUsrDialog() - return - - if(href_list["print"]) - usr << browse(print_logs(), "window=traffic_logs") - return - - if(!auth && !issilicon(usr) && !emagged) - usr << "ACCESS DENIED." - return - - if(href_list["viewserver"]) - screen = 1 - for(var/obj/machinery/telecomms/T in servers) - if(T.id == href_list["viewserver"]) - SelectedServer = T - create_log("selected server [T.name]", usr) - break - - - if(href_list["operation"]) - create_log("has performed action: [href_list["operation"]].", usr) - switch(href_list["operation"]) - - if("release") - servers = list() - screen = 0 - - if("mainmenu") - screen = 0 - - if("scan") - if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - - else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) - - if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" - - screen = 0 - - 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 - winset(editingcode, "tcscode", "is-disabled=false") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - winset(editingcode, "tcscode", "text=\"[showcode]\"") - - else - viewingcode.Add(usr) - winshow(usr, "Telecomms IDE", 1) // show the IDE - winset(usr, "tcscode", "is-disabled=true") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\"", "\\\"") - winset(usr, "tcscode", "text=\"[showcode]\"") - - if("togglerun") - SelectedServer.autoruncode = !(SelectedServer.autoruncode) - - if(href_list["network"]) - - var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) - - if(newnet && canAccess(usr)) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" - - else - - network = newnet - screen = 0 - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - create_log("has set the network to [network].", usr) - - updateUsrDialog() - return - -/obj/machinery/computer/telecomms/traffic/attackby() - ..() - src.updateUsrDialog() - return - -/obj/machinery/computer/telecomms/traffic/emag_act(mob/user as mob) - if(!emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "You you disable the security protocols." - -/obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user) - if(issilicon(user) || in_range(user, src)) - return 1 + + +/obj/machinery/computer/telecomms/traffic + name = "telecommunications traffic control console" + icon_state = "computer_generic" + + var/screen = 0 // the screen number: + 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 + + var/network = "NULL" // the network to probe + var/temp = "" // temporary feedback messages + + var/storedcode = "" // code stored + var/obj/item/weapon/card/id/auth = null + var/list/access_log = list() + var/process = 0 + circuit = "/obj/item/weapon/circuitboard/comm_traffic" + + req_access = list(access_tcomsat) + +/obj/machinery/computer/telecomms/traffic/proc/stop_editing() + if(editingcode) + if(editingcode.client) + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode.unset_machine() + editingcode = null + +/obj/machinery/computer/telecomms/traffic/process() + + if(stat & (NOPOWER|BROKEN)) + stop_editing() + return + + if(editingcode && editingcode.machine != src) + stop_editing() + return + + if(!editingcode) + if(length(viewingcode) > 0) + editingcode = pick(viewingcode) + viewingcode.Remove(editingcode) + return + + process = !process + if(!process) + return + + // loop if there's someone manning the keyboard + if(!editingcode.client) + stop_editing() + return + + // For the typer, the input is enabled. Buffer the typed text + storedcode = "[winget(editingcode, "tcscode", "text")]" + winset(editingcode, "tcscode", "is-disabled=false") + + // If the player's not manning the keyboard anymore, adjust everything + if(!in_range(editingcode, src) && !issilicon(editingcode) || editingcode.machine != src) + winshow(editingcode, "Telecomms IDE", 0) // hide the window! + editingcode = null + return + + // 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 && in_range(M, 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 windows + + +/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user as mob) + if(..()) + return + user.set_machine(src) + var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" + dat += "
[(auth ? "AUTHED" : "NOT AUTHED")]: [(!auth ? "Insert ID" : auth)]
" + dat += "View System Log
" + + if(issilicon(user) || auth) + + switch(screen) + + + // --- Main Menu --- + + if(0) + dat += "
[temp]
" + dat += "
Current Network: [network]
" + if(servers.len) + dat += "
Detected Telecommunication Servers:
    " + for(var/obj/machinery/telecomms/T in servers) + dat += "
  • \ref[T] [T.name] ([T.id])
  • " + dat += "
" + dat += "
\[Flush Buffer\]" + + else + dat += "
No servers detected. Scan for servers: \[Scan\]" + + + // --- Viewing Server --- + + if(1) + if(SelectedServer) + dat += "
[temp]
" + dat += "
\[Main Menu\] \[Refresh\]
" + dat += "
Current Network: [network]" + dat += "
Selected Server: [SelectedServer.id]

" + dat += "
\[Edit Code\]" + dat += "
Signal Execution: " + if(SelectedServer.autoruncode) + dat += "ALWAYS" + else + dat += "NEVER" + else + screen = 0 + return + + + user << browse(dat, "window=traffic_control;size=575x400") + onclose(user, "server_control") + + temp = "" + return + +/obj/machinery/computer/telecomms/traffic/proc/create_log(var/entry, var/mob/user) + var/id = null + if(issilicon(user)) + id = "System Administrator" + else + if(auth) + id = "[auth.registered_name] ([auth.assignment])" + else + ERROR("There is a null auth while the user isn't a silicon! ([user.name], [user.type])") + return + access_log += "\[[get_timestamp()]\] [id] [entry]" + +/obj/machinery/computer/telecomms/traffic/proc/print_logs() + . = "

Traffic Control Telecomms System Log


" + for(var/entry in access_log) + . += entry + "
" + return . + +/obj/machinery/computer/telecomms/traffic/Topic(href, href_list) + if(..()) + return + + + add_fingerprint(usr) + usr.set_machine(src) + + if(href_list["auth"]) + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + if(!auth) + var/obj/item/weapon/card/id/I = C.get_active_hand() + if(istype(I)) + if(check_access(I)) + C.drop_item() + I.loc = src + auth = I + create_log("has logged in.", usr) + else + create_log("has logged out.", usr) + auth.loc = src.loc + C.put_in_hands(auth) + auth = null + updateUsrDialog() + return + + if(href_list["print"]) + usr << browse(print_logs(), "window=traffic_logs") + return + + if(!auth && !issilicon(usr) && !emagged) + usr << "ACCESS DENIED." + return + + if(href_list["viewserver"]) + screen = 1 + for(var/obj/machinery/telecomms/T in servers) + if(T.id == href_list["viewserver"]) + SelectedServer = T + create_log("selected server [T.name]", usr) + break + + + if(href_list["operation"]) + create_log("has performed action: [href_list["operation"]].", usr) + switch(href_list["operation"]) + + if("release") + servers = list() + screen = 0 + + if("mainmenu") + screen = 0 + + if("scan") + if(servers.len > 0) + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) + + if(!servers.len) + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + else + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + + screen = 0 + + 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 + winset(editingcode, "tcscode", "is-disabled=false") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") + showcode = replacetext(storedcode, "\"", "\\\"") + winset(editingcode, "tcscode", "text=\"[showcode]\"") + + else + viewingcode.Add(usr) + winshow(usr, "Telecomms IDE", 1) // show the IDE + winset(usr, "tcscode", "is-disabled=true") + winset(editingcode, "tcscode", "text=\"\"") + var/showcode = replacetext(storedcode, "\"", "\\\"") + winset(usr, "tcscode", "text=\"[showcode]\"") + + if("togglerun") + SelectedServer.autoruncode = !(SelectedServer.autoruncode) + + if(href_list["network"]) + + var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network) + + if(newnet && canAccess(usr)) + if(length(newnet) > 15) + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + + else + + network = newnet + screen = 0 + servers = list() + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + create_log("has set the network to [network].", usr) + + updateUsrDialog() + return + +/obj/machinery/computer/telecomms/traffic/attackby() + ..() + src.updateUsrDialog() + return + +/obj/machinery/computer/telecomms/traffic/emag_act(mob/user as mob) + if(!emagged) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + emagged = 1 + user << "You you disable the security protocols." + +/obj/machinery/computer/telecomms/traffic/proc/canAccess(var/mob/user) + if(issilicon(user) || in_range(user, src)) + return 1 return 0 \ No newline at end of file diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index f1dd4b2acb2..4884051a16c 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 - /* @@ -12,87 +10,28 @@ /obj/machinery/telecomms var/temp = "" // output message - var/construct_op = 0 /obj/machinery/telecomms/attackby(obj/item/P as obj, mob/user as mob, params) + var/icon_closed = initial(icon_state) + var/icon_open = "[initial(icon_state)]_o" + if(!on) + icon_closed = "[initial(icon_state)]_off" + icon_open = "[initial(icon_state)]_o_off" + + if(default_deconstruction_screwdriver(user, icon_open, icon_closed, P)) + updateUsrDialog() + return + + if(exchange_parts(user, P)) + return + // Using a multitool lets you access the receiver's interface if(istype(P, /obj/item/device/multitool)) attack_hand(user) - switch(construct_op) - if(0) - if(istype(P, /obj/item/weapon/screwdriver)) - user << "You unfasten the bolts." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - construct_op ++ - if(1) - if(istype(P, /obj/item/weapon/screwdriver)) - user << "You fasten the bolts." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - construct_op -- - if(istype(P, /obj/item/weapon/wrench)) - user << "You dislodge the external plating." - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - construct_op ++ - if(2) - if(istype(P, /obj/item/weapon/wrench)) - user << "You secure the external plating." - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) - construct_op -- - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." - construct_op ++ - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) - A.amount = 5 - stat |= BROKEN // the machine's been borked! - if(3) - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = P - if(A.use(5)) - user << "You insert the cables." - construct_op -- - stat &= ~BROKEN // the machine's not borked anymore! - else - user << "You need five lengths of cable for this machine." - if(istype(P, /obj/item/weapon/crowbar)) - user << "You begin prying out the circuit board and components..." - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - if(do_after(user,60)) - user << "You finish prying out the components." - - // Drop all the component stuff - if(component_parts) - for(var/obj/item/I in component_parts) - if(I.reliability != 100 && crit_fail) - I.crit_fail = 1 - I.loc = src.loc - - else - - // If the machine wasn't made during runtime, probably doesn't have components: - // manually find the components and drop them! - var/newpath = text2path(circuitboard) - var/obj/item/weapon/circuitboard/C = new newpath - for(var/I in C.req_components) - for(var/i = 1, i <= C.req_components[I], i++) - newpath = text2path(I) - var/obj/item/s = new newpath - s.loc = src.loc - if(istype(s, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = s - A.amount = 1 - A.update_icon() - - // Drop a circuit board too - C.loc = src.loc - - // Create a machine frame and delete the current machine - var/obj/machinery/constructable_frame/machine_frame/F = new - F.loc = src.loc - qdel(src) + default_deconstruction_crowbar(P) /obj/machinery/telecomms/attack_ai(var/mob/user as mob) @@ -207,25 +146,11 @@ /obj/machinery/telecomms/proc/Options_Menu() return "" -/* -// Add an option to the processor to switch processing mode. (COMPRESS -> UNCOMPRESS or UNCOMPRESS -> COMPRESS) -/obj/machinery/telecomms/processor/Options_Menu() - var/dat = "
Processing Mode: [process_mode ? "UNCOMPRESS" : "COMPRESS"]" - 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_Topic(href, href_list) return -/* -/obj/machinery/telecomms/processor/Options_Topic(href, href_list) - - if(href_list["process"]) - temp = "-% Processing mode changed. %-" - src.process_mode = !src.process_mode -*/ - // RELAY /obj/machinery/telecomms/relay/Options_Menu() diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm new file mode 100644 index 00000000000..b592d1bf720 --- /dev/null +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -0,0 +1,47 @@ +/* + Basically just an empty shell for receiving and broadcasting radio messages. Not + very flexible, but it gets the job done. +*/ + +/obj/machinery/telecomms/allinone + name = "telecommunications mainframe" + icon_state = "comm_server" + desc = "A compact machine used for portable subspace telecommuniations processing." + density = 1 + anchored = 1 + use_power = 0 + idle_power_usage = 0 + machinetype = 6 + var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel + +/obj/machinery/telecomms/allinone/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 + + if(signal.data["slow"] > 0) + sleep(signal.data["slow"]) // simulate the network lag if necessary + + /* ###### Broadcast a message using signal.data ###### */ + if(signal.frequency == SYND_FREQ) // if syndicate broadcast, just + Broadcast_Message(signal.data["mob"], + signal.data["vmask"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"],, signal.data["compression"], list(0, z), signal.frequency, signal.data["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + +/obj/machinery/telecomms/allinone/attackby(obj/item/P as obj, mob/user as mob, params) + + if(istype(P, /obj/item/device/multitool)) + attack_hand(user) diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm new file mode 100644 index 00000000000..181d9a11bbf --- /dev/null +++ b/code/game/machinery/telecomms/machines/broadcaster.dm @@ -0,0 +1,131 @@ +/* + 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/list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam +var/message_delay = 0 // To make sure restarting the recentmessages list is kept in sync + +/obj/machinery/telecomms/broadcaster + name = "subspace broadcaster" + icon_state = "broadcaster" + desc = "A dish-shaped machine used to broadcast processed subspace signals." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 25 + machinetype = 5 + /*heatgen = 0 + delay = 7*/ + circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster" + +/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"] |= listening_level + + /** #### - Normal Broadcast - #### **/ + + if(signal.data["type"] == 0) + + /* ###### Broadcast a message using signal.data ###### */ + Broadcast_Message(signal.data["mob"], + signal.data["vmask"], signal.data["radio"], + signal.data["message"], signal.data["name"], signal.data["job"], signal.data["realname"], + 0, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + + + /** #### - Simple Broadcast - #### **/ + + if(signal.data["type"] == 1) + + /* ###### Broadcast a message using signal.data ###### */ + Broadcast_SimpleMessage(signal.data["name"], signal.frequency, + signal.data["message"],null, null, + signal.data["compression"], listening_level) + + + /** #### - Artificial Broadcast - #### **/ + // (Imitates a mob) + + if(signal.data["type"] == 2) + + /* ###### Broadcast a message using signal.data ###### */ + // Parameter "data" as 4: AI can't track this person/mob + Broadcast_Message(signal.data["mob"], + signal.data["vmask"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"], 4, signal.data["compression"], signal.data["level"], signal.frequency, signal.data["spans"], + signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"]) + + 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/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/broadcaster(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + +/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) + message_delay = 0 + ..() + + + +//Preset Broadcasters + +//--PRESET LEFT--// + +/obj/machinery/telecomms/broadcaster/preset_left + id = "Broadcaster A" + network = "tcommsat" + autolinkers = list("broadcasterA") + +//--PRESET RIGHT--// + +/obj/machinery/telecomms/broadcaster/preset_right + id = "Broadcaster B" + network = "tcommsat" + autolinkers = list("broadcasterB") \ No newline at end of file diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm new file mode 100644 index 00000000000..c81ecec4b32 --- /dev/null +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -0,0 +1,97 @@ +/* + 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_state = "bus" + desc = "A mighty piece of hardware used to send massive amounts of data quickly." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 50 + machinetype = 2 + //heatgen = 20 + circuitboard = "/obj/item/weapon/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 + +/obj/machinery/telecomms/bus/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/bus(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + + + + + + +//Preset 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(SUPP_FREQ,SERV_FREQ) + autolinkers = list("processor2", "supply", "service") + +/obj/machinery/telecomms/bus/preset_three + id = "Bus 3" + network = "tcommsat" + 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) + autolinkers = list("processor4", "engineering", "common") + +/obj/machinery/telecomms/bus/preset_four/New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm new file mode 100644 index 00000000000..b52adc8cb8d --- /dev/null +++ b/code/game/machinery/telecomms/machines/hub.dm @@ -0,0 +1,61 @@ + +/* + 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_state = "hub" + desc = "A mighty piece of hardware used to send/receive massive amounts of data." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 80 + machinetype = 7 + //heatgen = 40 + circuitboard = "/obj/item/weapon/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. + +/obj/machinery/telecomms/hub/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/hub(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + RefreshParts() + + + + + + +//Preset HUB + +/obj/machinery/telecomms/hub/preset + id = "Hub" + network = "tcommsat" + autolinkers = list("hub", "relay", "s_relay", "m_relay", "r_relay", "science", "medical", + "supply", "service", "common", "command", "engineering", "security", + "receiverA", "receiverB", "broadcasterA", "broadcasterB") + diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm new file mode 100644 index 00000000000..18f8ee4d3e0 --- /dev/null +++ b/code/game/machinery/telecomms/machines/processor.dm @@ -0,0 +1,80 @@ + +/* + 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_state = "processor" + desc = "This machine is used to process large quantities of information." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 30 + machinetype = 3 + //heatgen = 100 + //delay = 5 + circuitboard = "/obj/item/weapon/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") + +/obj/machinery/telecomms/processor/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/processor(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/analyzer(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/amplifier(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + RefreshParts() + + + + + + +//Preset 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 + +/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") + diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm new file mode 100644 index 00000000000..071828fced2 --- /dev/null +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -0,0 +1,95 @@ + +/* + 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_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 = 1 + idle_power_usage = 30 + machinetype = 1 + //heatgen = 0 + circuitboard = "/obj/item/weapon/circuitboard/telecomms/receiver" + +/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 == 2) + + 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(signal.data["level"] != listening_level) + for(var/obj/machinery/telecomms/hub/H in links) + var/list/connected_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) + return 1 + return 0 + return 1 + + +/obj/machinery/telecomms/receiver/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/receiver(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + + + + + + +//Preset Receivers + +//--PRESET LEFT--// + +/obj/machinery/telecomms/receiver/preset_left + id = "Receiver A" + network = "tcommsat" + autolinkers = list("receiverA") // link to relay + freq_listening = list(SCI_FREQ, MED_FREQ, SUPP_FREQ, SERV_FREQ) // science, medical, supply, service + + +//--PRESET RIGHT--// + +/obj/machinery/telecomms/receiver/preset_right + id = "Receiver B" + network = "tcommsat" + autolinkers = list("receiverB") // link to relay + freq_listening = list(COMM_FREQ, ENG_FREQ, SEC_FREQ) //command, engineering, security + + //Common and other radio frequencies for people to freely use + New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm new file mode 100644 index 00000000000..51d76d47255 --- /dev/null +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -0,0 +1,86 @@ +/* + 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_state = "relay" + desc = "A mighty piece of hardware used to send massive amounts of data far away." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 30 + machinetype = 8 + //heatgen = 0 + circuitboard = "/obj/item/weapon/circuitboard/telecomms/relay" + netspeed = 5 + long_range_link = 1 + var/broadcasting = 1 + var/receiving = 1 + +/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"] |= 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 + +/obj/machinery/telecomms/relay/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/relay(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 2) + RefreshParts() + + + + + +//Preset 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 + autolinkers = list("r_relay") diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm new file mode 100644 index 00000000000..322b635e3ca --- /dev/null +++ b/code/game/machinery/telecomms/machines/server.dm @@ -0,0 +1,224 @@ + +/* + 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_state = "comm_server" + desc = "A machine used to store data and network statistics." + density = 1 + anchored = 1 + use_power = 1 + idle_power_usage = 15 + machinetype = 4 + //heatgen = 50 + circuitboard = "/obj/item/weapon/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/language = "human" + var/obj/item/device/radio/headset/server_radio = null + var/last_signal = 0 // Last time it sent a signal + +/obj/machinery/telecomms/server/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/server(null) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + RefreshParts() + Compiler = new() + Compiler.Holder = src + server_radio = new() + +/obj/machinery/telecomms/server/Destroy() + // Garbage collects all the NTSL datums. + if(Compiler) + Compiler.GC() + Compiler = null + ..() + +/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"] != 4) + + // If signal has a message and appropriate frequency + + update_logs() + + var/datum/comm_log_entry/log = new + + // 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["message"] = signal.data["message"] + log.parameters["name"] = signal.data["name"] + log.parameters["realname"] = signal.data["realname"] + + log.parameters["uspeech"] = signal.data["languages"] & HUMAN //good enough + + // If the signal is still compressed, make the log entry gibberish + if(signal.data["compression"] > 0) + log.parameters["message"] = Gibberish(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.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/admin_log(var/mob/mob) + + var/msg="[mob.real_name]/([mob.key]) has compiled a script to server [src]:" + diary << msg + diary << rawcode + src.investigate_log("[msg]
[rawcode]", "ntsl") + if(length(rawcode)) // Let's not bother the admins for empty code. + message_admins("[mob.real_name]/([mob.key]) has compiled and uploaded a NTSL script to [src.id] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) + +/obj/machinery/telecomms/server/proc/compile(var/mob/user) + + if(Compiler) + admin_log(user) + 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_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" + + + + +//Preset Servers + +/obj/machinery/telecomms/server/presets + network = "tcommsat" + +/obj/machinery/telecomms/server/presets/New() + ..() + name = id + + +/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(SUPP_FREQ) + autolinkers = list("supply") + +/obj/machinery/telecomms/server/presets/service + id = "Service Server" + freq_listening = list(SERV_FREQ) + autolinkers = list("service") + +/obj/machinery/telecomms/server/presets/common + id = "Common Server" + freq_listening = list() + autolinkers = list("common") + + //Common and other radio frequencies for people to freely use + // 1441 to 1489 +/obj/machinery/telecomms/server/presets/common/New() + for(var/i = 1441, i < 1489, i += 2) + freq_listening |= i + ..() + +/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") + + + diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm deleted file mode 100644 index fe48a7cb3f7..00000000000 --- a/code/game/machinery/telecomms/presets.dm +++ /dev/null @@ -1,187 +0,0 @@ -// ### 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 - autolinkers = list("r_relay") - -//HUB - -/obj/machinery/telecomms/hub/preset - id = "Hub" - network = "tcommsat" - autolinkers = list("hub", "relay", "s_relay", "m_relay", "r_relay", "science", "medical", - "supply", "service", "common", "command", "engineering", "security", - "receiverA", "receiverB", "broadcasterA", "broadcasterB") - -//Receivers - -//--PRESET LEFT--// - -/obj/machinery/telecomms/receiver/preset_left - id = "Receiver A" - network = "tcommsat" - autolinkers = list("receiverA") // link to relay - freq_listening = list(SCI_FREQ, MED_FREQ, SUPP_FREQ, SERV_FREQ) // science, medical, supply, service - - -//--PRESET RIGHT--// - -/obj/machinery/telecomms/receiver/preset_right - id = "Receiver B" - network = "tcommsat" - autolinkers = list("receiverB") // link to relay - freq_listening = list(COMM_FREQ, ENG_FREQ, SEC_FREQ) //command, engineering, security - - //Common and other radio frequencies for people to freely use - New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - - -//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(SUPP_FREQ,SERV_FREQ) - autolinkers = list("processor2", "supply", "service") - -/obj/machinery/telecomms/bus/preset_three - id = "Bus 3" - network = "tcommsat" - 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) - autolinkers = list("processor4", "engineering", "common") - -/obj/machinery/telecomms/bus/preset_four/New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - -//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 - -/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") - -//Servers - -/obj/machinery/telecomms/server/presets - network = "tcommsat" - -/obj/machinery/telecomms/server/presets/New() - ..() - name = id - - -/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(SUPP_FREQ) - autolinkers = list("supply") - -/obj/machinery/telecomms/server/presets/service - id = "Service Server" - freq_listening = list(SERV_FREQ) - autolinkers = list("service") - -/obj/machinery/telecomms/server/presets/common - id = "Common Server" - freq_listening = list() - autolinkers = list("common") - - //Common and other radio frequencies for people to freely use - // 1441 to 1489 -/obj/machinery/telecomms/server/presets/common/New() - for(var/i = 1441, i < 1489, i += 2) - freq_listening |= i - ..() - -/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") - - -//Broadcasters - -//--PRESET LEFT--// - -/obj/machinery/telecomms/broadcaster/preset_left - id = "Broadcaster A" - network = "tcommsat" - autolinkers = list("broadcasterA") - -//--PRESET RIGHT--// - -/obj/machinery/telecomms/broadcaster/preset_right - id = "Broadcaster B" - network = "tcommsat" - autolinkers = list("broadcasterB") diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index c0c8d3abbf9..71a042441d8 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -1,11 +1,10 @@ -//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 + The telecom machines 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. @@ -16,6 +15,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms + icon = 'icons/obj/machines/telecomms.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) @@ -28,10 +28,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() 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/heatgen = 20 // how much heat to transfer to the environment - var/delay = 10 // how many process() ticks to delay per heat - var/heating_power = 40000*/ var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub) var/circuitboard = null // string pointing to a circuitboard type var/hide = 0 // Is it a hidden machine? @@ -45,8 +41,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() return var/send_count = 0 - //signal.data["slow"] == 0 // apply some lag based on integrity - // Apply some lag based on traffic rates var/netlag = round(traffic / 50) if(netlag > signal.data["slow"]) @@ -179,9 +173,15 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/update_icon() if(on) - icon_state = initial(icon_state) + if(panel_open) + icon_state = "[initial(icon_state)]_o" + else + icon_state = initial(icon_state) else - icon_state = "[initial(icon_state)]_off" + if(panel_open) + icon_state = "[initial(icon_state)]_o_off" + else + icon_state = "[initial(icon_state)]_off" /obj/machinery/telecomms/proc/update_power() @@ -196,9 +196,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/process() update_power() - // Check heat and generate some - //checkheat() - // Update the icon update_icon() @@ -213,438 +210,3 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() 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() - switch(environment.temperature) - if(T0C to (T20C + 20)) - integrity = Clamp(integrity, 0, 100) - if((T20C + 20) to (T0C + 70)) - integrity = max(0, integrity - 1) - if(delay) - delay-- - else - // If the machine is on, ready to produce heat, and has positive traffic, genn some heat - if(on && traffic > 0) - produce_heat(heatgen) - delay = initial(delay) - -/obj/machinery/telecomms/proc/produce_heat(heat_amt) - if(heatgen == 0) - return - - if(!(stat & (NOPOWER|BROKEN))) //Blatently stolen from space heater. - var/turf/simulated/L = loc - if(istype(L)) - var/datum/gas_mixture/env = L.return_air() - if(env.temperature < (heat_amt+T0C)) - - var/transfer_moles = 0.25 * env.total_moles() - - var/datum/gas_mixture/removed = env.remove(transfer_moles) - - if(removed) - - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) - - 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 = 1 - idle_power_usage = 30 - machinetype = 1 - //heatgen = 0 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/receiver" - -/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 == 2) - - 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(signal.data["level"] != listening_level) - for(var/obj/machinery/telecomms/hub/H in links) - var/list/connected_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) - 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 = 1 - idle_power_usage = 80 - machinetype = 7 - //heatgen = 40 - circuitboard = "/obj/item/weapon/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 = 1 - idle_power_usage = 30 - machinetype = 8 - //heatgen = 0 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/relay" - netspeed = 5 - long_range_link = 1 - var/broadcasting = 1 - var/receiving = 1 - -/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"] |= 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 = 1 - idle_power_usage = 50 - machinetype = 2 - //heatgen = 20 - circuitboard = "/obj/item/weapon/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 = 1 - idle_power_usage = 30 - machinetype = 3 - //heatgen = 100 - //delay = 5 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/processor" - var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals - - 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 = 1 - idle_power_usage = 15 - machinetype = 4 - //heatgen = 50 - circuitboard = "/obj/item/weapon/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/language = "human" - var/obj/item/device/radio/headset/server_radio = null - var/last_signal = 0 // Last time it sent a signal - -/obj/machinery/telecomms/server/New() - ..() - Compiler = new() - Compiler.Holder = src - server_radio = new() - -/obj/machinery/telecomms/server/Destroy() - // Garbage collects all the NTSL datums. - if(Compiler) - Compiler.GC() - Compiler = null - ..() - -/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"] != 4) - - // If signal has a message and appropriate frequency - - update_logs() - - var/datum/comm_log_entry/log = new - - // 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["message"] = signal.data["message"] - log.parameters["name"] = signal.data["name"] - log.parameters["realname"] = signal.data["realname"] - - log.parameters["uspeech"] = signal.data["languages"] & HUMAN //good enough - - // If the signal is still compressed, make the log entry gibberish - if(signal.data["compression"] > 0) - log.parameters["message"] = Gibberish(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.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/admin_log(var/mob/mob) - - var/msg="[mob.real_name]/([mob.key]) has compiled a script to server [src]:" - diary << msg - diary << rawcode - src.investigate_log("[msg]
[rawcode]", "ntsl") - if(length(rawcode)) // Let's not bother the admins for empty code. - message_admins("[mob.real_name]/([mob.key]) has compiled and uploaded a NTSL script to [src.id] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) - -/obj/machinery/telecomms/server/proc/compile(var/mob/user) - - if(Compiler) - admin_log(user) - 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_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" - - - - - - - diff --git a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm index 4992c8cfb14..4407845113b 100644 --- a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm @@ -38,7 +38,6 @@ datum/reagent/drug/nicotine description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 - overdose_threshold = 35 addiction_threshold = 30 datum/reagent/drug/nicotine/on_mob_life(var/mob/living/M as mob) @@ -48,15 +47,6 @@ datum/reagent/drug/nicotine/on_mob_life(var/mob/living/M as mob) M.AdjustStunned(-1) M.adjustStaminaLoss(-0.5*REM) ..() - return - -datum/reagent/drug/nicotine/overdose_process(var/mob/living/M as mob) - if(prob(20)) - M << "You feel like you smoked too much." - M.adjustToxLoss(0.5*REM) - M.adjustOxyLoss(0.5*REM) - ..() - return datum/reagent/drug/crank name = "Crank" @@ -75,32 +65,30 @@ datum/reagent/drug/crank/on_mob_life(var/mob/living/M as mob) M.AdjustStunned(-1) M.AdjustWeakened(-1) ..() - return + datum/reagent/drug/crank/overdose_process(var/mob/living/M as mob) M.adjustBrainLoss(2*REM) M.adjustToxLoss(2*REM) M.adjustBruteLoss(2*REM) ..() - return datum/reagent/drug/crank/addiction_act_stage1(var/mob/living/M as mob) M.adjustBrainLoss(5*REM) ..() - return + datum/reagent/drug/crank/addiction_act_stage2(var/mob/living/M as mob) M.adjustToxLoss(5*REM) ..() - return + datum/reagent/drug/crank/addiction_act_stage3(var/mob/living/M as mob) M.adjustBruteLoss(5*REM) ..() - return + datum/reagent/drug/crank/addiction_act_stage4(var/mob/living/M as mob) M.adjustBrainLoss(5*REM) M.adjustToxLoss(5*REM) M.adjustBruteLoss(5*REM) ..() - return /datum/reagent/drug/krokodil name = "Krokodil" diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm index d53162d2a96..737f9bb5e92 100644 --- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm @@ -190,6 +190,7 @@ id = "flash_powder_flash" result = null required_reagents = list("flash_powder" = 1) + result_amount = 1 required_temp = 374 /datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume) @@ -235,6 +236,7 @@ result = null required_reagents = list("smoke_powder" = 1) required_temp = 374 + result_amount = 1 secondary = 1 mob_react = 1 @@ -285,6 +287,7 @@ result = null required_reagents = list("sonic_powder" = 1) required_temp = 374 + result_amount = 1 /datum/chemical_reaction/sonic_powder_deafen/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) diff --git a/html/changelogs/phil235-BundleFix4.yml b/html/changelogs/phil235-BundleFix4.yml new file mode 100644 index 00000000000..dcaed92231a --- /dev/null +++ b/html/changelogs/phil235-BundleFix4.yml @@ -0,0 +1,10 @@ + +author: phil235 + +delete-after: True + +changes: + - tweak: "Telecom machines are now deconstructed the same way as all other constructable machines." + - tweak: "You can no longer overdose on nicotine but you can get addicted (very mild effects)." + + diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f47fcc63f870ca74a01f3876c2ce20aee4fc8277 GIT binary patch literal 20864 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 z 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 HP6