From 449610bee27ddd94840ea65d1a94427f10b0a2e4 Mon Sep 17 00:00:00 2001 From: "vageyenaman@gmail.com" Date: Sat, 16 Jun 2012 06:11:14 +0000 Subject: [PATCH] Committing a patch for Giacom. See details here: http://nanotrasen.com/phpBB3/viewtopic.php?f=16&t=9018 Also some very small metroid changes to make them more balanced and less KILL KILL KILL. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3839 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/mob/living/carbon/metroid.dm | 4 +- .../machinery/computer/HolodeckControl.dm | 4 +- code/game/machinery/computer/message.dm | 416 +++++++++++++++--- code/game/machinery/requests_console.dm | 75 ++-- code/game/magic/musician.dm | 83 ++-- code/game/objects/devices/PDA/PDA.dm | 9 +- .../modules/mob/living/carbon/metroid/life.dm | 19 +- .../mob/living/carbon/metroid/powers.dm | 6 +- code/modules/paperwork/paper.dm | 18 +- code/modules/research/message_server.dm | 11 +- icons/obj/computer.dmi | Bin 65791 -> 66236 bytes 11 files changed, 478 insertions(+), 167 deletions(-) diff --git a/code/defines/mob/living/carbon/metroid.dm b/code/defines/mob/living/carbon/metroid.dm index 48fd4fea5c1..296cb7ef0c7 100644 --- a/code/defines/mob/living/carbon/metroid.dm +++ b/code/defines/mob/living/carbon/metroid.dm @@ -15,7 +15,7 @@ gender = NEUTER update_icon = 0 - nutrition = 800 // 1000 = max + nutrition = 900 // 1000 = max see_in_dark = 8 @@ -54,5 +54,5 @@ gender = NEUTER update_icon = 0 - nutrition = 1000 // 1200 = max + nutrition = 1100 // 1200 = max diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 9769dfff0ce..ae14642a5ad 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -42,6 +42,8 @@ dat += "(Begin Wildlife Simulation)
" dat += "Ensure the holodeck is empty before testing.
" dat += "
" + if(issilicon(user)) + dat += "(Re-Enable Safety Protocols?)
" dat += "Safety Protocols are DISABLED
" else if(issilicon(user)) @@ -101,7 +103,7 @@ else if(href_list["AIoverride"]) if(!issilicon(usr)) return - emagged = 1 + emagged = !emagged src.add_fingerprint(usr) src.updateUsrDialog() diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index e8c557cea23..a21b4bdc344 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -1,24 +1,62 @@ // Allows you to monitor messages that passes the server. + + + /obj/machinery/computer/message_monitor name = "Message Monitor Console" - desc = "Used to Monitor the crew's messages, that are sent via PDA." - icon_state = "comm_monitor" + desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages." + icon_state = "comm_logs" + var/hack_icon = "comm_logsc" + var/normal_icon = "comm_logs" circuit = "/obj/item/weapon/circuitboard/message_monitor" + //Server linked to. var/obj/machinery/message_server/linkedServer = null - var/screen = 0 // 0 = Main menu, 1 = Message Logs + //Sparks effect - For emag + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread + //Messages - Saves me time if I want to change something. + var/noserver = "ALERT: No server detected." + var/incorrectkey = "ALERT: Incorrect decryption key!" + var/defaultmsg = "Welcome. Please select an option." + var/rebootmsg = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" + //Computer properties + var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message var/hacking = 0 // Is it being hacked into by the AI/Cyborg + var/emag = 0 // When it is emagged. + var/message = "System bootup complete. Please select an option." // The message that shows on the main menu. + // Custom Message Properties + var/customsender = "System Administrator" + var/obj/item/device/pda/customrecepient = null + var/customjob = "Admin" + var/custommessage = "This is a test, please ignore." /obj/machinery/computer/message_monitor/attackby(obj/item/weapon/O as obj, mob/user as mob) + if(stat & (NOPOWER|BROKEN)) + return + if(!istype(user, /mob/living)) + return if(istype(O,/obj/item/weapon/card/emag/)) - //Just brings up the Message Log without having to know the passcode. - if(!hacking) - usr << "BZZT.. The console beeps and brings up the Message Logs." - screen = 1 - else - usr << "It looks like the console is already being hacked into." + // Will create sparks and print out the console's password. You will then have to wait a while for the console to be back online. + // It'll take more time if there's more characters in the password.. + if(!emag) + icon_state = hack_icon // An error screen I made in the computers.dmi + emag = 1 + screen = 2 + spark_system.set_up(5, 0, src) + src.spark_system.start() + var/obj/item/weapon/paper/monitorkey/MK = new/obj/item/weapon/paper/monitorkey + MK.loc = src.loc + // Will help make emagging the console not so easy to get away with. + MK.info += "

£%@%(*$%&(£&?*(%&£/{}" + spawn(100*length(src.linkedServer.decryptkey)) UnmagConsole() + message = rebootmsg + if(isscrewdriver(O) && emag) + //Stops people from just unscrewing the monitor and putting it back to get the console working again. + user << "It is too hot to mess with!" + return + ..() return @@ -34,33 +72,42 @@ return if(!istype(user, /mob/living)) return + //If the computer is being hacked or is emagged, display the reboot message. + if(hacking || emag) + message = rebootmsg var/dat = "Message Monitor Console" dat += "

Message Monitor Console


" + dat += "

" switch(screen) //Main menu if(0) - if(hacking) + if(hacking || emag) screen = 2 return src.attack_hand(user) + // = TAB if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) - dat += "1. ERROR: Server not found
" + dat += "
ERROR: Server not found
" else - dat += "1. Toggle Power: [src.linkedServer.active ? "\[On\]":"\[Off\]"]
" - dat += "2. Link To A Server
" - dat += "3. Clear Message Logs
" - dat += " KEY REQUIRED
" - dat += "4. View Message Logs
" - dat += "5. Set Custom Key

" + dat += "
1. Toggle Power: [src.linkedServer.active ? "\[On\]":"\[Off\]"]
" + dat += "
2. Link To A Server
" + dat += "
KEY REQUIRED

" + dat += "
3. View Message Logs
" + dat += "
4. View Request Console Logs
" + dat += "
5. Clear Message Logs
" + dat += "
6. Clear Request Console Logs
" + dat += "
7. Set Custom Key
" + dat += "
8. Send Admin Message

" //Malf/Traitor AIs can bruteforce into the system to gain the Key. if((istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot)) && (user.mind.special_role && user.mind.original == user)) - dat += "*&@. Bruteforce Key

" + dat += "
*&@#. Bruteforce Key
" + //Message Logs if(1) - if(hacking) + if(hacking || emag) screen = 2 return src.attack_hand(user) if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) - usr << "No server detected." + message = noserver screen = 0 return src.attack_hand(user) @@ -68,50 +115,120 @@ //var/recipient = "Unspecified" //name of the person //var/sender = "Unspecified" //name of the sender //var/message = "Blank" //transferred message - dat += "
Return - Refresh

" - dat += "" - for(var/list/datum/data_pda_msg/pda in src.linkedServer.pda_msgs) + dat += "
Back - Refresh

" + dat += "
SenderRecipientMessage
" + for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs) index++ if(index > 3000) break - dat += "" + // Del - Sender - Recepient - Message + // X - Al Green - Your Mom - WHAT UP!? + dat += "" dat += "
XSenderRecipientMessage
[pda.sender][pda.recipient][pda.message]
X
[pda.sender][pda.recipient][pda.message]
" //Hacking screen. if(2) - if(!hacking) + if(!hacking && !emag) screen = 0 return src.attack_hand(user) if(istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot)) - dat += "Brute-forcing for server key.
This will take anywhere from two to five minutes." + dat += "Brute-forcing for server key.
It will take 20 seconds for every character that the password has." dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time." else //It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever. - dat += {"010101000110100001101001011100110010000001110111011010010110110 - 0011011000010000001110100011000010110101101100101001000000110000101101110 - 01111001011101110110100001100101011100100110010100100000011001100111001001 - 10111101101101001000000111010001110111011011110010000001110100011011110010 - 00000110011001101001011101100110010100100000011011010110100101101110011101 - 01011101000110010101110011001011100010000001001001011011100010000001110100 - 01101000011001010010000001101101011001010110000101101110001011010111010001 - 10100101101101011001010010110000100000011101000110100001101001011100110010 - 00000110001101101111011011100111001101101111011011000110010100100000011000 - 11011000010110111000100000011100100110010101110110011001010110000101101100 - 00100000011110010110111101110101011100100010000001110100011100100111010101 - 10010100100000011010010110111001110100011001010110111001110100011010010110 - 11110110111001110011001000000110100101100110001000000111100101101111011101 - 01001000000110110001100101011101000010000001110011011011110110110101100101 - 01101111011011100110010100100000011000010110001101100011011001010111001101 - 11001100100000011010010111010000101110001000000100110101100001011010110110 - 01010010000001110011011101010111001001100101001000000110111001101111001000 - 00011010000111010101101101011000010110111001110011001000000110010101101110 - 01110100011001010111001000100000011101000110100001100101001000000111001001 - 10111101101111011011010010000001100100011101010111001001101001011011100110 - 01110010000001110100011010000110000101110100001000000111010001101001011011 - 010110010100101110"} + dat += {"01000010011100100111010101110100011001010010110
+ 10110011001101111011100100110001101101001011011100110011
+ 10010000001100110011011110111001000100000011100110110010
+ 10111001001110110011001010111001000100000011010110110010
+ 10111100100101110001000000100100101110100001000000111011
+ 10110100101101100011011000010000001110100011000010110101
+ 10110010100100000001100100011000000100000011100110110010
+ 10110001101101111011011100110010001110011001000000110011
+ 00110111101110010001000000110010101110110011001010111001
+ 00111100100100000011000110110100001100001011100100110000
+ 10110001101110100011001010111001000100000011101000110100
+ 00110000101110100001000000111010001101000011001010010000
+ 00111000001100001011100110111001101110111011011110111001
+ 00110010000100000011010000110000101110011001011100010000
+ 00100100101101110001000000111010001101000011001010010000
+ 00110110101100101011000010110111001110100011010010110110
+ 10110010100101100001000000111010001101000011010010111001
+ 10010000001100011011011110110111001110011011011110110110
+ 00110010100100000011000110110000101101110001000000111001
+ 00110010101110110011001010110000101101100001000000111100
+ 10110111101110101011100100010000001110100011100100111010
+ 10110010100100000011010010110111001110100011001010110111
+ 00111010001101001011011110110111001110011001000000110100
+ 10110011000100000011110010110111101110101001000000110110
+ 00110010101110100001000000111001101101111011011010110010
+ 10110111101101110011001010010000001100001011000110110001
+ 10110010101110011011100110010000001101001011101000010111
+ 00010000001001101011000010110101101100101001000000111001
+ 10111010101110010011001010010000001101110011011110010000
+ 00110100001110101011011010110000101101110011100110010000
+ 00110010101101110011101000110010101110010001000000111010
+ 00110100001100101001000000111001001101111011011110110110
+ 10010000001100100011101010111001001101001011011100110011
+ 10010000001110100011010000110000101110100001000000111010
+ 001101001011011010110010100101110"} + + //Fake messages + if(3) + if(hacking || emag) + screen = 2 + return src.attack_hand(user) + dat += "
Back - Reset

" + + dat += {" + + + + "} + //Sender - Recepient - Message + //Al Green - Your Mom - WHAT UP!? + + dat += {" + + + "} + dat += "
SenderRecipientRecepient JobMessage
[customsender][customrecepient ? customrecepient.owner : "NONE"][customjob][custommessage]

Send" + + //Request Console Logs + if(4) + if(hacking || emag) + screen = 2 + return src.attack_hand(user) + if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + screen = 0 + return src.attack_hand(user) + + var/index = 0 + /* data_rc_msg + X - 5% + var/rec_dpt = "Unspecified" //name of the person - 15% + var/send_dpt = "Unspecified" //name of the sender- 15% + var/message = "Blank" //transferred message - 300px + var/stamp = "Unstamped" - 15% + var/id_auth = "Unauthenticated" - 15% + var/priority = "Normal" - 10% + */ + dat += "
Back - Refresh

" + dat += {" + "} + for(var/datum/data_rc_msg/rc in src.linkedServer.rc_msgs) + index++ + if(index > 3000) + break + // Del - Sender - Recepient - Message + // X - Al Green - Your Mom - WHAT UP!? + dat += {" + "} + dat += "
XSending Dep.Receiving Dep.MessageStampID Auth.Priority.
X
[rc.send_dpt][rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]
" dat += "" - user << browse(dat, "window=message;size=500x700") + message = defaultmsg + user << browse(dat, "window=message;size=700x700") onclose(user, "message") return @@ -122,8 +239,19 @@ var/currentKey = src.linkedServer.decryptkey user << "Brute-force completed! The key is '[currentKey]'." src.hacking = 0 + src.icon_state = normal_icon src.screen = 0 // Return the screen back to normal +/obj/machinery/computer/message_monitor/proc/UnmagConsole() + src.icon_state = normal_icon + src.emag = 0 + +/obj/machinery/computer/message_monitor/proc/ResetMessage() + customsender = "System Administrator" + customrecepient = null + custommessage = "This is a test, please ignore." + customjob = "Admin" + /obj/machinery/computer/message_monitor/Topic(href, href_list) if(..()) return @@ -132,62 +260,210 @@ if(!istype(usr, /mob/living)) return if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - + //Turn the server on/off. if (href_list["active"]) linkedServer.active = !linkedServer.active - + //Find a server if (href_list["find"]) if(message_servers && message_servers.len > 1) src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers - usr << "Server selected." + message = "NOTICE: Server selected." else if(message_servers && message_servers.len > 0) linkedServer = message_servers[1] - usr << "Single Server Detected - Server selected." + message = "NOTICE: Only Single Server Detected - Server selected." else - usr << "No server detected." + message = noserver + //View the logs - KEY REQUIRED if (href_list["view"]) if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) - usr << "No server detected." + message = noserver else var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) src.screen = 1 else - usr << "ALERT: Incorrect password!" - + message = incorrectkey + //Clears the logs - KEY REQUIRED if (href_list["clear"]) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - usr << "No server detected." + message = noserver else - src.linkedServer.pda_msgs = list() - usr << "Logs cleared." - + var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + if(dkey && dkey != "") + if(src.linkedServer.decryptkey == dkey) + src.linkedServer.pda_msgs = list() + message = "NOTICE: Logs cleared." + else + message = incorrectkey + //Clears the request console logs - KEY REQUIRED + if (href_list["clearr"]) + if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + if(dkey && dkey != "") + if(src.linkedServer.decryptkey == dkey) + src.linkedServer.rc_msgs = list() + message = "NOTICE: Logs cleared." + else + message = incorrectkey + //Change the password - KEY REQUIRED if (href_list["pass"]) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) - usr << "No server detected." + message = noserver else - var/dkey = trim(input(usr,"Please enter the decryption key.") as text|null) + var/dkey = trim(input(usr,"Please enter the decryption key:") as text|null) if(dkey && dkey != "") if(dkey == src.linkedServer.decryptkey) - var/newkey = trim(input(usr,"Please enter the new key.")) - if(newkey && newkey != "") + var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) + if(length(newkey) <= 3) + message = "NOTICE: Decryption key too short!" + else if(length(newkey) > 16) + message = "NOTICE: Decryption key too long!" + else if(newkey && newkey != "") src.linkedServer.decryptkey = newkey - usr << "Password set." - else - usr << "ALERT: Incorrect password!" + message = "NOTICE: Decryption key set." + else + message = incorrectkey + //Hack the Console to get the password if (href_list["hack"]) if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr)) src.hacking = 1 src.screen = 2 - //usr << "[src.linkedServer.decryptkey]" - spawn((100*6)*rand(2, 4)) + src.icon_state = hack_icon + //Time it takes to bruteforce is dependant on the password length. + spawn(100*length(src.linkedServer.decryptkey)) if(src && src.linkedServer && usr) BruteForce(usr) + //Delete the log. + if (href_list["delete"]) + //Are they on the view logs screen? + if(screen == 1) + if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else //if(istype(href_list["delete"], /datum/data_pda_msg)) + src.linkedServer.pda_msgs -= locate(href_list["delete"]) + message = "NOTICE: Log Deleted!" + //Delete the request console log. + if (href_list["deleter"]) + //Are they on the view logs screen? + if(screen == 4) + if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else //if(istype(href_list["delete"], /datum/data_pda_msg)) + src.linkedServer.rc_msgs -= locate(href_list["deleter"]) + message = "NOTICE: Log Deleted!" + //Create a custom message + if (href_list["msg"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + if(dkey && dkey != "") + if(src.linkedServer.decryptkey == dkey) + src.screen = 3 + else + message = incorrectkey + //Fake messaging selection - KEY REQUIRED + if (href_list["select"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + screen = 0 + else + switch(href_list["select"]) + //Reset + if("Reset") + ResetMessage() + + //Select Your Name + if("Sender") + customsender = input(usr, "Please enter the sender's name.") as text|null + + //Select Receiver + if("Recepient") + //Get out list of viable PDAs + if(PDAs && PDAs.len > 0) + customrecepient = input(usr, "Select a PDA from the list.") as null|anything in PDAs + else + customrecepient = null + + //Enter custom job + if("RecJob") + customjob = input(usr, "Please enter the sender's job.") as text|null + + //Enter message + if("Message") + custommessage = input(usr, "Please enter your message.") as text|null + custommessage = copytext(sanitize(custommessage), 1, MAX_MESSAGE_LEN) + + //Send message + if("Send") + + if(isnull(customsender) || customsender == "") + customsender = "UNKNOWN" + + if(isnull(customrecepient)) + message = "NOTICE: No recepient selected!" + return src.attack_hand(usr) + + if(isnull(custommessage) || custommessage == "") + message = "NOTICE: No message entered!" + return src.attack_hand(usr) + + var/obj/item/device/pda/PDARec = null + for (var/obj/item/device/pda/P in PDAs) + if (!P.owner||P.toff) continue + if(P.owner == customsender) + PDARec = P + //Sender isn't faking as someone who exists + if(isnull(PDARec)) + src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]") + customrecepient.tnote += "← From
[customsender] ([customjob]):
[custommessage]
" + if (!customrecepient.silent) + playsound(customrecepient.loc, 'twobeep.ogg', 50, 1) + for (var/mob/O in hearers(3, customrecepient.loc)) + O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*")) + if( customrecepient.loc && ishuman(customrecepient.loc) ) + var/mob/living/carbon/human/H = customrecepient.loc + H << "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)" + log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") + customrecepient.overlays = null + customrecepient.overlays += image('pda.dmi', "pda-r") + //Sender is faking as someone who exists + else + src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]") + customrecepient.tnote += "← From [PDARec.owner] ([customjob]):
[custommessage]
" + if (!customrecepient.silent) + playsound(customrecepient.loc, 'twobeep.ogg', 50, 1) + for (var/mob/O in hearers(3, customrecepient.loc)) + O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*")) + if( customrecepient.loc && ishuman(customrecepient.loc) ) + var/mob/living/carbon/human/H = customrecepient.loc + H << "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)" + log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") + customrecepient.overlays = null + customrecepient.overlays += image('pda.dmi', "pda-r") + //Finally.. + ResetMessage() + + //Request Console Logs - KEY REQUIRED + if(href_list["viewr"]) + if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) + message = noserver + else + var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + if(dkey && dkey != "") + if(src.linkedServer.decryptkey == dkey) + src.screen = 4 + else + message = incorrectkey + + //usr << href_list["select"] if (href_list["back"]) src.screen = 0 diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 19390cfb4a8..d36270da666 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -248,46 +248,55 @@ var/list/obj/machinery/requests_console/allConsoles = list() sending += "
" screen = 7 //if it's successful, this will get overrwritten (7 = unsufccessfull, 6 = successfull) if (sending) + var/pass = 0 for (var/obj/machinery/message_server/MS in world) + if(!MS.active) continue MS.send_rc_message(href_list["department"],department,log_msg,msgStamped,msgVerified,priority) + pass = 1 - for (var/obj/machinery/requests_console/Console in allConsoles) - if (ckey(Console.department) == ckey(href_list["department"])) + if(pass) - switch(priority) - if("2") //High priority - if(Console.newmessagepriority < 2) - Console.newmessagepriority = 2 - Console.icon_state = "req_comp2" - if(!Console.silent) - playsound(Console.loc, 'twobeep.ogg', 50, 1) - for (var/mob/O in hearers(5, Console.loc)) - O.show_message(text("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [department]'")) - Console.messages += "High Priority message from [department]
[sending]" + for (var/obj/machinery/requests_console/Console in allConsoles) + if (ckey(Console.department) == ckey(href_list["department"])) - // if("3") //Not implemanted, but will be //Removed as it doesn't look like anybody intends on implimenting it ~Carn - // if(Console.newmessagepriority < 3) - // Console.newmessagepriority = 3 - // Console.icon_state = "req_comp3" - // if(!Console.silent) - // playsound(Console.loc, 'twobeep.ogg', 50, 1) - // for (var/mob/O in hearers(7, Console.loc)) - // O.show_message(text("\icon[Console] *The Requests Console yells: 'EXTREME PRIORITY alert in [department]'")) - // Console.messages += "Extreme Priority message from [ckey(department)]
[message]" + switch(priority) + if("2") //High priority + if(Console.newmessagepriority < 2) + Console.newmessagepriority = 2 + Console.icon_state = "req_comp2" + if(!Console.silent) + playsound(Console.loc, 'twobeep.ogg', 50, 1) + for (var/mob/O in hearers(5, Console.loc)) + O.show_message(text("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [department]'")) + Console.messages += "High Priority message from [department]
[sending]" - else // Normal priority - if(Console.newmessagepriority < 1) - Console.newmessagepriority = 1 - Console.icon_state = "req_comp1" - if(!Console.silent) - playsound(Console.loc, 'twobeep.ogg', 50, 1) - for (var/mob/O in hearers(4, Console.loc)) - O.show_message(text("\icon[Console] *The Requests Console beeps: 'Message from [department]'")) - Console.messages += "Message from [department]
[message]" + // if("3") //Not implemanted, but will be //Removed as it doesn't look like anybody intends on implimenting it ~Carn + // if(Console.newmessagepriority < 3) + // Console.newmessagepriority = 3 + // Console.icon_state = "req_comp3" + // if(!Console.silent) + // playsound(Console.loc, 'twobeep.ogg', 50, 1) + // for (var/mob/O in hearers(7, Console.loc)) + // O.show_message(text("\icon[Console] *The Requests Console yells: 'EXTREME PRIORITY alert in [department]'")) + // Console.messages += "Extreme Priority message from [ckey(department)]
[message]" + + else // Normal priority + if(Console.newmessagepriority < 1) + Console.newmessagepriority = 1 + Console.icon_state = "req_comp1" + if(!Console.silent) + playsound(Console.loc, 'twobeep.ogg', 50, 1) + for (var/mob/O in hearers(4, Console.loc)) + O.show_message(text("\icon[Console] *The Requests Console beeps: 'Message from [department]'")) + Console.messages += "Message from [department]
[message]" + + screen = 6 + Console.luminosity = 2 + messages += "Message sent to [dpt]
[message]" + else + for (var/mob/O in hearers(4, src.loc)) + O.show_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'")) - screen = 6 - Console.luminosity = 2 - messages += "Message sent to [dpt]
[message]" //Handle screen switching switch(text2num(href_list["setScreen"])) diff --git a/code/game/magic/musician.dm b/code/game/magic/musician.dm index caf0cc6266d..239a87b122b 100644 --- a/code/game/magic/musician.dm +++ b/code/game/magic/musician.dm @@ -15,6 +15,7 @@ var/playing = 0 var/help = 0 var/edit = 1 + var/repeat = 0 proc playnote(var/note as text) @@ -368,42 +369,44 @@ M << sound(soundfile) playsong() - var/cur_oct[7] - var/cur_acc[7] - for(var/i = 1 to 7) - cur_oct[i] = "3" - cur_acc[i] = "n" + do + var/cur_oct[7] + var/cur_acc[7] + for(var/i = 1 to 7) + cur_oct[i] = "3" + cur_acc[i] = "n" - for(var/line in song.lines) - //world << line - for(var/beat in dd_text2list(lowertext(line), ",")) - //world << "beat: [beat]" - var/list/notes = dd_text2list(beat, "/") - for(var/note in dd_text2list(notes[1], "-")) - //world << "note: [note]" - if(!playing || !anchored)//If the piano is playing, or is loose - playing = 0 - return - if(lentext(note) == 0) - continue - //world << "Parse: [copytext(note,1,2)]" - var/cur_note = text2ascii(note) - 96 - if(cur_note < 1 || cur_note > 7) - continue - for(var/i=2 to lentext(note)) - var/ni = copytext(note,i,i+1) - if(!text2num(ni)) - if(ni == "#" || ni == "b" || ni == "n") - cur_acc[cur_note] = ni - else if(ni == "s") - cur_acc[cur_note] = "#" // so shift is never required - else - cur_oct[cur_note] = ni - playnote(uppertext(copytext(note,1,2)) + cur_acc[cur_note] + cur_oct[cur_note]) - if(notes.len >= 2 && text2num(notes[2])) - sleep(song.tempo / text2num(notes[2])) - else - sleep(song.tempo) + for(var/line in song.lines) + //world << line + for(var/beat in dd_text2list(lowertext(line), ",")) + //world << "beat: [beat]" + var/list/notes = dd_text2list(beat, "/") + for(var/note in dd_text2list(notes[1], "-")) + //world << "note: [note]" + if(!playing || !anchored)//If the piano is playing, or is loose + playing = 0 + return + if(lentext(note) == 0) + continue + //world << "Parse: [copytext(note,1,2)]" + var/cur_note = text2ascii(note) - 96 + if(cur_note < 1 || cur_note > 7) + continue + for(var/i=2 to lentext(note)) + var/ni = copytext(note,i,i+1) + if(!text2num(ni)) + if(ni == "#" || ni == "b" || ni == "n") + cur_acc[cur_note] = ni + else if(ni == "s") + cur_acc[cur_note] = "#" // so shift is never required + else + cur_oct[cur_note] = ni + playnote(uppertext(copytext(note,1,2)) + cur_acc[cur_note] + cur_oct[cur_note]) + if(notes.len >= 2 && text2num(notes[2])) + sleep(song.tempo / text2num(notes[2])) + else + sleep(song.tempo) + while(repeat) playing = 0 updateUsrDialog() @@ -417,9 +420,10 @@ if(song) if(song.lines.len > 0 && !(playing)) dat += "Play Song

" + dat += "Repeat Song: [repeat ? "Yes" : "No"]

" if(playing) - dat += "Stop Playing

" - + dat += "Stop Playing
" + dat += "Repeat Song: [repeat ? "Yes" : "No"]

" if(!edit) dat += "Show Editor

" else @@ -460,7 +464,11 @@ onclose(user, "piano") Topic(href, href_list) + if(in_range(src, usr) && !issilicon(usr) && anchored) + if(href_list["repeat"]) + repeat = !repeat + if(href_list["tempo"]) song.tempo += text2num(href_list["tempo"]) if(song.tempo < 1) @@ -531,6 +539,7 @@ song.lines = lines song.tempo = tempo updateUsrDialog() + add_fingerprint(usr) updateUsrDialog() return diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm index 1741daad358..a9c44b25154 100644 --- a/code/game/objects/devices/PDA/PDA.dm +++ b/code/game/objects/devices/PDA/PDA.dm @@ -1,6 +1,9 @@ //The advanced pea-green monochrome lcd of tomorrow. +var/global/list/obj/item/device/pda/PDAs = list() + + /obj/item/device/pda name = "PDA" desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge." @@ -182,6 +185,7 @@ /obj/item/device/pda/New() ..() + PDAs += src spawn(3) if (default_cartridge) cartridge = new default_cartridge(src) @@ -331,7 +335,7 @@ var/count = 0 if (!toff) - for (var/obj/item/device/pda/P in world) + for (var/obj/item/device/pda/P in PDAs) if (!P.owner||P.toff||P == src) continue dat += "
  • [P]" if (istype(cartridge, /obj/item/weapon/cartridge/syndicate)) @@ -1008,6 +1012,7 @@ return /obj/item/device/pda/Del() + PDAs -= src if (src.id) src.id.loc = get_turf(src.loc) ..() @@ -1042,7 +1047,7 @@ usr << "You can't send PDA messages because you are dead!" return - for (var/obj/item/device/pda/P in world) + for (var/obj/item/device/pda/P in PDAs) if (!P.owner) continue else if (P == src) diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 58562fb5aa9..42d78f72ea6 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -87,20 +87,20 @@ var/hungry = 0 // determines if the metroid is hungry var/starving = 0 // determines if the metroid is starving-hungry - if(istype(src, /mob/living/carbon/metroid/adult)) + if(istype(src, /mob/living/carbon/metroid/adult)) // 1200 max nutrition switch(nutrition) - if(400 to 1100) hungry = 1 - if(0 to 399) + if(301 to 600) hungry = 1 + if(0 to 300) starving = 1 else - switch(nutrition) - if(150 to 800) hungry = 1 - if(0 to 149) starving = 1 + switch(nutrition) // 1000 max nutrition + if(201 to 500) hungry = 1 + if(0 to 200) starving = 1 if(starving && !client) // if a metroid is starving, it starts losing its friends - if(prob(15) && Friends.len > 0) + if(prob(1) && Friends.len > 0) var/friendnum = 0 for(var/mob/M in Friends) friendnum++ @@ -504,8 +504,8 @@ var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4) for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring) var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc) - M.nutrition = round(nutrition/number) - M.powerlevel = round(powerlevel / number) + M.nutrition = round(nutrition * 0.9) + M.powerlevel = round(powerlevel/number) M.Friends = Friends M.tame = tame M.rabid = rabid @@ -518,6 +518,7 @@ if(!client) var/mob/living/carbon/metroid/adult/A = new/mob/living/carbon/metroid/adult(src.loc) A.nutrition = nutrition + A.nutrition += 100 A.powerlevel = max(0, powerlevel-1) A.Friends = Friends A.tame = tame diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index 63169dedad6..d42a6f3cd09 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -76,6 +76,7 @@ if(Victim.health <= 0) Victim.adjustToxLoss(rand(2,4)) + // Heal yourself adjustToxLoss(-10) adjustOxyLoss(-10) adjustBruteLoss(-10) @@ -136,7 +137,8 @@ if(Victim && !rabid && !attacked) if(Victim.LAssailant && Victim.LAssailant != Victim) if(prob(50)) - Friends |= Victim.LAssailant + if(!(Victim.LAssailant in Friends)) + Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator if(M.client && istype(src, /mob/living/carbon/human)) if(prob(85)) @@ -205,7 +207,7 @@ var/list/babies = list() for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring) var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc) - M.nutrition = round(nutrition/number) + M.nutrition = round(nutrition * 0.9) M.powerlevel = round(powerlevel / number) if(i != 1) step_away(M,src) babies += M diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d6a96e50a69..8d0b6fb83a0 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -45,12 +45,17 @@ set src in oview(1) // ..() //We don't want them to see the dumb "this is a paper" thing every time. - if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon))) - usr << browse("[name][stars(info)][stamps]", "window=[name]") - onclose(usr, "[name]") + // I didn't like the idea that people can read tiny pieces of paper from across the room. + // Now you need to be next to the paper in order to read it. + if(in_range(usr, src)) + if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/dead/observer) || istype(usr, /mob/living/silicon))) + usr << browse("[name][stars(info)][stamps]", "window=[name]") + onclose(usr, "[name]") + else + usr << browse("[name][info][stamps]", "window=[name]") + onclose(usr, "[name]") else - usr << browse("[name][info][stamps]", "window=[name]") - onclose(usr, "[name]") + usr << "It is too far away." return /obj/item/weapon/paper/verb/rename() @@ -155,7 +160,7 @@ t = dd_replacetext(t, "\[/i\]", "") t = dd_replacetext(t, "\[u\]", "") t = dd_replacetext(t, "\[/u\]", "") - t = dd_replacetext(t, "\[large\]", "") + t = dd_replacetext(t, "\[large\]", "") t = dd_replacetext(t, "\[/large\]", "") t = dd_replacetext(t, "\[sign\]", "[user.real_name]") t = dd_replacetext(t, "\[field\]", "") @@ -190,6 +195,7 @@ return t + /obj/item/weapon/paper/proc/openhelp(mob/user as mob) user << browse({"Pen Help diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 42496f73c96..d9e41f1b25a 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -1,4 +1,4 @@ -var/global/list/message_servers = list() +var/global/list/obj/machinery/message_server/message_servers = list() /datum/data_pda_msg var/recipient = "Unspecified" //name of the person @@ -6,6 +6,7 @@ var/global/list/message_servers = list() var/message = "Blank" //transferred message /datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "") + if(param_rec) recipient = param_rec if(param_sender) @@ -56,11 +57,11 @@ var/global/list/message_servers = list() var/list/datum/data_pda_msg/pda_msgs = list() var/list/datum/data_rc_msg/rc_msgs = list() var/active = 1 - var/decryptkey = "password"; + var/decryptkey = "password" /obj/machinery/message_server/New() message_servers += src - decryptkey = generateKey() + decryptkey = GenerateKey() send_pda_message("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.") ..() return @@ -70,10 +71,10 @@ var/global/list/message_servers = list() ..() return -/obj/machinery/message_server/proc/generateKey() +/obj/machinery/message_server/proc/GenerateKey() //Feel free to move to Helpers. var/newKey - newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rose") + newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le") newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai") newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") return newKey diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index d5c8368af4d41e0608e2489ad2e6fa74536a7016..1682c1fabc4746379c65825f9c1876eba2ee1303 100644 GIT binary patch delta 21015 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 SmMllXz$ch+Fp#@HzWCon#+vN_ delta 20291 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