From b5f8eaf8a9769697d4d4c517a17c23cbdcf0cb1d Mon Sep 17 00:00:00 2001 From: "vageyenaman@gmail.com" Date: Sat, 25 Feb 2012 22:51:31 +0000 Subject: [PATCH] More work done on Telecomms: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ▫ Signals can now be rejected by Subspace broadcasters through a specific data[] parameter. ▫ Improved the log browser. ▫ Log browsers and telecommunication monitors no longer require access to use. You do need access to delete logs, however. ▫ Intercoms need power to work. They don't drain power, they just need a constant flow of equipment power. As such, that offline intercom sprite's now finally being put to use. Scripting language: ▫ Sorry about all the files; they're all necessary! It's important to notice that the basic structure of the scripting language code is not mine; I cannibalized the base structure from some obscure BYOND project. It's pretty well documented, and I'd say easier to browse through than atmos. Here's the basic deal: A compiler datum manages the relationships between the three main subsystems of a scripting language: the Scanner, the Parser, and the Interpreter. The Scanner splits raw text into token datums that the Parser can read. The Parser transforms the otherwise random bits and strings into ordered AST Trees and nodes for the Interpreter to read. The interpreter actually executes the code and handles scope/functions/code blocks. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3193 316c924e-a436-60f5-8080-3fe189b3f50e --- code/game/machinery/telecomms/broadcaster.dm | 299 +- code/game/machinery/telecomms/logbrowser.dm | 94 +- .../telecomms/machine_interactions.dm | 4 +- .../machinery/telecomms/telecomunications.dm | 86 +- code/game/machinery/telecomms/telemonitor.dm | 11 +- code/game/objects/radio/electropack.dm | 1 - code/game/objects/radio/radio.dm | 69 +- code/modules/mob/mob_movement.dm | 1 + code/modules/scripting/AST/AST Nodes.dm | 139 + code/modules/scripting/AST/Blocks.dm | 48 + .../AST/Operators/Binary Operators.dm | 173 + .../AST/Operators/Unary Operators.dm | 51 + code/modules/scripting/AST/Statements.dm | 122 + code/modules/scripting/Errors.dm | 124 + code/modules/scripting/IDE.dm | 182 + .../scripting/Implementations/Telecomms.dm | 256 ++ .../scripting/Implementations/_Logic.dm | 114 + .../scripting/Interpreter/Evaluation.dm | 169 + .../scripting/Interpreter/Interaction.dm | 140 + .../scripting/Interpreter/Interpreter.dm | 291 ++ code/modules/scripting/Interpreter/Scope.dm | 18 + code/modules/scripting/Options.dm | 82 + code/modules/scripting/Parser/Expressions.dm | 308 ++ code/modules/scripting/Parser/Keywords.dm | 166 + code/modules/scripting/Parser/Parser.dm | 184 + code/modules/scripting/Scanner/Scanner.dm | 231 + code/modules/scripting/Scanner/Tokens.dm | 38 + code/modules/scripting/stack.dm | 23 + html/changelog.html | 12 + icons/obj/projectiles.dmi | Bin 21207 -> 24325 bytes icons/obj/stationobjs.dmi | Bin 94928 -> 91102 bytes interface/skin.dmf | 205 + maps/tgstation.2.0.8.dmm | 3771 +++++++++-------- tgstation.dme | 28 + 34 files changed, 5461 insertions(+), 1979 deletions(-) create mode 100644 code/modules/scripting/AST/AST Nodes.dm create mode 100644 code/modules/scripting/AST/Blocks.dm create mode 100644 code/modules/scripting/AST/Operators/Binary Operators.dm create mode 100644 code/modules/scripting/AST/Operators/Unary Operators.dm create mode 100644 code/modules/scripting/AST/Statements.dm create mode 100644 code/modules/scripting/Errors.dm create mode 100644 code/modules/scripting/IDE.dm create mode 100644 code/modules/scripting/Implementations/Telecomms.dm create mode 100644 code/modules/scripting/Implementations/_Logic.dm create mode 100644 code/modules/scripting/Interpreter/Evaluation.dm create mode 100644 code/modules/scripting/Interpreter/Interaction.dm create mode 100644 code/modules/scripting/Interpreter/Interpreter.dm create mode 100644 code/modules/scripting/Interpreter/Scope.dm create mode 100644 code/modules/scripting/Options.dm create mode 100644 code/modules/scripting/Parser/Expressions.dm create mode 100644 code/modules/scripting/Parser/Keywords.dm create mode 100644 code/modules/scripting/Parser/Parser.dm create mode 100644 code/modules/scripting/Scanner/Scanner.dm create mode 100644 code/modules/scripting/Scanner/Tokens.dm create mode 100644 code/modules/scripting/stack.dm diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 658ea97ce6..389236b0c9 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -25,9 +25,13 @@ var receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) + // Don't broadcast rejected signals + if(signal.data["reject"]) + return + if(signal.data["message"]) - // Kind of lame way to prevent MASSIVE RADIO SPAM but it works + // Prevents massive radio spam if("[signal.data["message"]]:[signal.data["realname"]]" in recentmessages) return recentmessages.Add( "[signal.data["message"]]:[signal.data["realname"]]" ) @@ -43,19 +47,48 @@ var if(signal.data["slow"] > 0) sleep(signal.data["slow"]) // simulate the network lag if necessary - /* ###### Broadcast a message using signal.data ###### */ - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"]) - /* --- Do a snazzy animation! --- */ - flick("broadcaster_send", src) + /** #### - Normal Broadcast - #### **/ + + if(signal.data["type"] == 0) + + /* ###### Broadcast a message using signal.data ###### */ + Broadcast_Message(signal.data["connection"], signal.data["mob"], + signal.data["vmask"], signal.data["vmessage"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"], signal.data["vname"],, signal.data["compression"]) + + + /** #### - Simple Broadcast - #### **/ + + if(signal.data["type"] == 1) + + /* ###### Broadcast a message using signal.data ###### */ + Broadcast_SimpleMessage(signal.data["source"], signal.data["frequency"], + signal.data["message"],null, null, + signal.data["compression"]) + + + /** #### - 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["connection"], signal.data["mob"], + signal.data["vmask"], signal.data["vmessage"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"], signal.data["vname"], 4, signal.data["compression"]) spawn(1) recentmessages = list() + /* --- Do a snazzy animation! --- */ + flick("broadcaster_send", src) /* Basically just an empty shell for receiving and broadcasting radio messages. Not @@ -105,7 +138,7 @@ var signal.data["realname"], signal.data["vname"],, signal.data["compression"]) else if(intercept) - Broadcast_Message(signal.data["connection"], signal.data["mob"], + Broadcast_Message(signal.data["source"], signal.frequency, signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], @@ -156,6 +189,7 @@ var 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 @@ -348,6 +382,8 @@ var //End of research and feedback code. + var/aitrack = "" + /* ###### Send the message ###### */ @@ -358,19 +394,27 @@ var var/J = job var/rendered = "[part_a][N][part_b][quotedmsg][part_c]" for (var/mob/R in heard_masked) + aitrack = "" + if(data == 4) + aitrack = "" + if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][N] ([J]) [part_b][quotedmsg][part_c]", 2) + R.show_message("[part_a][aitrack][N] ([J]) [part_b][quotedmsg][part_c]", 2) else R.show_message(rendered, 2) /* --- Process all the mobs that heard the voice normally (understood) --- */ if (length(heard_normal)) - var/rendered = "[part_a][M.real_name][part_b][quotedmsg][part_c]" + var/rendered = "[part_a][realname][part_b][quotedmsg][part_c]" for (var/mob/R in heard_normal) + aitrack = "" + if(data == 4) + aitrack = "" + if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][realname] ([job]) [part_b][quotedmsg][part_c]", 2) + R.show_message("[part_a][aitrack][realname] ([job]) [part_b][quotedmsg][part_c]", 2) else R.show_message(rendered, 2) @@ -381,8 +425,13 @@ var var/rendered = "[part_a][vname][part_b][M.voice_message][part_c]" for (var/mob/R in heard_voice) + aitrack = "" + if(data == 4) + aitrack = "" + + if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][vname] ([job]) [part_b][vmessage]][part_c]", 2) + R.show_message("[part_a][aitrack][vname] ([job]) [part_b][vmessage]][part_c]", 2) else R.show_message(rendered, 2) @@ -394,8 +443,13 @@ var var/rendered = "[part_a][vname][part_b][quotedmsg][part_c]" for (var/mob/R in heard_garbled) + aitrack = "" + if(data == 4) + aitrack = "" + + if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][vname][part_b][quotedmsg][part_c]", 2) + R.show_message("[part_a][aitrack][vname][part_b][quotedmsg][part_c]", 2) else R.show_message(rendered, 2) @@ -407,10 +461,223 @@ var var/rendered = "[part_a][Gibberish(M.real_name, compression + 50)][part_b][quotedmsg][part_c]" for (var/mob/R in heard_gibberish) + aitrack = "" + if(data == 4) + aitrack = "" + + if(istype(R, /mob/living/silicon/ai)) - R.show_message("[part_a][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) [part_b][quotedmsg][part_c]", 2) + R.show_message("[part_a][aitrack][Gibberish(realname, compression + 50)] ([Gibberish(job, compression + 50)]) [part_b][quotedmsg][part_c]", 2) else R.show_message(rendered, 2) +/proc/Broadcast_SimpleMessage(var/source, var/frequency, var/text, var/data, var/mob/M, var/compression) + + + /* ###### 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]"]) + + receive |= R.send_hear(display_freq) + + + // --- 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(istype(R, /obj/item/device/radio/headset)) + continue + + 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]"]) + + receive |= R.send_hear(SYND_FREQ) + + + // --- Broadcast to ALL radio devices --- + + else + for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) + + 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.STFU_radio) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. + continue + + + // --- Check for compression --- + if(compression > 0) + + heard_gibberish += R + continue + + // --- Can understand the speech --- + + if (R.say_understands(M)) + + heard_normal += R + + // --- Can't understand the speech --- + + else + // - Just display a garbled message - + + heard_garbled += R + + + /* ###### Begin formatting and sending the message ###### */ + if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish)) + + /* --- Some miscellaneous variables to format the string output --- */ + var/part_a = "" // 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(1351) + freq_text = "Science" + if(1355) + freq_text = "Medical" + if(1357) + freq_text = "Engineering" + if(1359) + freq_text = "Security" + if(1349) + freq_text = "Mining" + if(1347) + freq_text = "Cargo" + //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] " // Tweaked for security headsets -- TLE + var/part_c = "" + + if (display_freq==SYND_FREQ) + part_a = "" + else if (display_freq==COMM_FREQ) + part_a = "" + else if (display_freq in DEPT_FREQS) + part_a = "" + + // --- This following recording is intended for research and feedback in the use of department radio channels --- + + var/part_blackbox_b = " \[[freq_text]\] " // Tweaked for security headsets -- TLE + 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]" + for (var/obj/machinery/blackbox_recorder/BR in world) + //BR.messages_admin += blackbox_admin_msg + switch(display_freq) + if(1459) + BR.msg_common += blackbox_msg + if(1351) + BR.msg_science += blackbox_msg + if(1353) + BR.msg_command += blackbox_msg + if(1355) + BR.msg_medical += blackbox_msg + if(1357) + BR.msg_engineering += blackbox_msg + if(1359) + BR.msg_security += blackbox_msg + if(1441) + BR.msg_deathsquad += blackbox_msg + if(1213) + BR.msg_syndicate += blackbox_msg + if(1349) + BR.msg_mining += blackbox_msg + if(1347) + BR.msg_cargo += blackbox_msg + else + BR.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) + + + diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 87d6ac1280..eb6d6368bb 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -27,7 +27,7 @@ if(0) dat += "
[temp]
" - dat += "
Current Network: [network]
" + dat += "
Current Network: [network]
" if(servers.len) dat += "
Detected Telecommunication Servers: