diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3f2ae5b7f61..865ea301800 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1675,10 +1675,109 @@ message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)]'s Centcom message with: \"[input]\"") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. [input]. Message ends.\"") + else if(href_list["EvilFax"]) + if(!check_rights(R_ADMIN)) + return + var/mob/living/carbon/human/H = locate(href_list["EvilFax"]) + if(!istype(H)) + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return + var/etypes = list("borging","corgifying","firedeath","braindeath","honktumor","demotion") + var/eviltype = input(src.owner, "Which type of evil fax do you wish to send [H]?","Its good to be baaaad...", "") as null|anything in etypes + if(!(eviltype in etypes)) + return + var/customname = input(src.owner, "Pick a title for the evil fax.", "Fax Title") as text|null + if(!customname) + customname = "paper" + var/obj/item/weapon/paper/evilfax/P = new /obj/item/weapon/paper/evilfax(null) + var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) + + P.name = "Central Command - [customname]" + P.info = "A reminder: per the terms of your contract, stupid faxes will get you demoted, or worse." + P.myeffect = eviltype + P.mytarget = H + if(alert("Do you want the Evil Fax to activate automatically if [H] tries to ignore it?",,"Yes", "No") == "Yes") + P.activate_on_timeout = 1 + P.x = rand(-2, 0) + P.y = rand(-1, 2) + P.offset_x += P.x + P.offset_y += P.y + P.update_icon() + var/stampvalue = "cent" + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-[stampvalue]" + stampoverlay.pixel_x = P.x + stampoverlay.pixel_y = P.y + P.stamped = list() + P.stamped += /obj/item/weapon/stamp/centcom + if(!P.ico) + P.ico = new + P.ico += "paper_stamp-[stampvalue]" + P.overlays += stampoverlay + P.stamps += "
" + P.update_icon() + //fax.receivefax(P) // this does not work, it does not preserve the type, we have to physically teleport the fax paper instead + P.loc = fax.loc + if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset))) + to_chat(H, "Your headset pings, notifying you that a reply to your fax has arrived.") + to_chat(src.owner, "You sent a [eviltype] fax to [H]") + log_admin("[key_name(src.owner)] sent [key_name(H)] a [eviltype] fax") + message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)] with a [eviltype] fax") + else if(href_list["FaxReplyTemplate"]) + if(!check_rights(R_ADMIN)) + return + var/mob/living/carbon/human/H = locate(href_list["FaxReplyTemplate"]) + if(!istype(H)) + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(null) + var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) + P.name = "Central Command - paper" + var/stypes = list("handle it yourself","illegible","not signed","sorry, not right now","stop wasting our time") + var/stype = input(src.owner, "Which type of standard reply do you wish to send to [H]?","Choose your paperwork", "") as null|anything in stypes + var/tmsg = "



NanoTrasen Science Station Cyberiad


NAS Trurl Communications Department Report


" + if(stype == "handle it yourself") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention." + else if(stype == "illegible") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax was too poorly written for our system to interpret." + else if(stype == "not signed") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

Your fax was not properly signed and/or stamped." + else if(stype == "sorry, not right now") + tmsg += "Greetings, esteemed crewmember. Unfortunately, we are unable to spare the resources to assist you at this time." + else if(stype == "stop wasting our time") + tmsg += "Stop wasting our time." + else + return + tmsg += "
" + P.info = tmsg + P.x = rand(-2, 0) + P.y = rand(-1, 2) + P.offset_x += P.x + P.offset_y += P.y + P.update_icon() + var/stampvalue = "cent" + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + stampoverlay.icon_state = "paper_stamp-[stampvalue]" + stampoverlay.pixel_x = P.x + stampoverlay.pixel_y = P.y + P.stamped = list() + P.stamped += /obj/item/weapon/stamp/centcom + if(!P.ico) + P.ico = new + P.ico += "paper_stamp-[stampvalue]" + P.overlays += stampoverlay + P.stamps += "
" + P.update_icon() + fax.receivefax(P) + if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/device/radio/headset) || istype(H.r_ear, /obj/item/device/radio/headset))) + to_chat(H, "Your headset pings, notifying you that a reply to your fax has arrived.") + to_chat(src.owner, "You sent a standard '[stype]' fax to [H]") + log_admin("[key_name(src.owner)] sent [key_name(H)] a standard '[stype]' fax") + message_admins("[key_name_admin(src.owner)] replied to [key_name_admin(H)] with a standard '[stype]' fax") + else if(href_list["SyndicateReply"]) if(!check_rights(R_ADMIN)) return - var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"]) if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") @@ -1689,10 +1788,9 @@ if(!istype(H.l_ear, /obj/item/device/radio/headset) && !istype(H.r_ear, /obj/item/device/radio/headset)) to_chat(usr, "The person you are trying to contact is not wearing a headset") return - var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from The Syndicate", "") - if(!input) return - + if(!input) + return to_chat(src.owner, "You sent [input] to [H] via a secure channel.") log_admin("[src.owner] replied to [key_name(H)]'s Syndicate message with the message [input].") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. [input]. Message ends.\"") diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 0ef6a64373f..170d96754ea 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -18,7 +18,6 @@ for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) - to_chat(usr, "Your prayers have been received by the gods.") feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -27,41 +26,46 @@ /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue CENTCOMM: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" - for(var/client/X in admins) if(R_EVENT & X.holder.rights) to_chat(X, msg) + if(X.prefs.sound & SOUND_ADMINHELP) + X << 'sound/effects/adminhelp.ogg' /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue SYNDICATE: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" - for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) + if(X.prefs.sound & SOUND_ADMINHELP) + X << 'sound/effects/adminhelp.ogg' /proc/HONK_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue HONK: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" - for(var/client/X in admins) if(R_EVENT & X.holder.rights) to_chat(X, msg) + if(X.prefs.sound & SOUND_ADMINHELP) + X << 'sound/effects/adminhelp.ogg' /proc/ERT_Announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "\blue ERT REQUEST: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" - for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) + if(X.prefs.sound & SOUND_ADMINHELP) + X << 'sound/effects/adminhelp.ogg' /proc/Nuke_request(text , mob/Sender) var/nuke_code = get_nuke_code() var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "NUKE CODE REQUEST: [key_name(Sender)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" - for(var/client/X in admins) if(check_rights(R_EVENT,0,X.mob)) to_chat(X, msg) to_chat(X, "The nuke code is [nuke_code].") + if(X.prefs.sound & SOUND_ADMINHELP) + X << 'sound/effects/adminhelp.ogg' \ No newline at end of file diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 23a0f3eec7e..c0e7a2bc468 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -260,9 +260,10 @@ var/list/alldepartments = list() visible_message("[src] beeps, \"Message transmitted successfully.\"") -/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#006100") - var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) ([admin_jump_link(sender, "holder")]) (CA) (BSA) (REPLY): Receiving '[sent.name]' via secure connection... view message" - +/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#9A04D1") + var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (CA) ([admin_jump_link(sender, "holder")]) | REPLY: (RADIO) (FAX) (SM) | REJECT: (TEMPLATE) (BSA) (EVILFAX) : Receiving '[sent.name]' via secure connection... view message" for(var/client/C in admins) if(R_EVENT & C.holder.rights) to_chat(C, msg) + if(C.prefs.sound & SOUND_ADMINHELP) + C << 'sound/effects/adminhelp.ogg' diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 4ebd93adc07..11f864451b7 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -620,3 +620,85 @@ /obj/item/weapon/paper/crumpled/bloody icon_state = "scrap_bloodied" + +/obj/item/weapon/paper/evilfax + name = "Centcomm Reply" + info = "" + var/mytarget = null + var/myeffect = null + var/used = 0 + var/countdown = 60 + var/activate_on_timeout = 0 + +/obj/item/weapon/paper/evilfax/show_content(var/mob/user, var/forceshow = 0, var/forcestars = 0, var/infolinks = 0, var/view = 1) + if(user == mytarget) + if(istype(user, /mob/living/carbon)) + var/mob/living/carbon/C = user + evilpaper_specialaction(C) + ..() + else + // This should never happen, but just in case someone is adminbussing + evilpaper_selfdestruct() + else + if(mytarget) + to_chat(user,"This page appears to be covered in some sort of bizzare code. The only bit you recognize is the name of [mytarget]. Perhaps [mytarget] can make sense of it?") + else + evilpaper_selfdestruct() + + +/obj/item/weapon/paper/evilfax/New() + ..() + processing_objects.Add(src) + + +/obj/item/weapon/paper/evilfax/Destroy() + processing_objects.Remove(src) + if(mytarget && !used) + var/mob/living/carbon/target = mytarget + target.ForceContractDisease(new /datum/disease/transformation/corgi(0)) + return ..() + + +/obj/item/weapon/paper/evilfax/process() + if(!countdown) + if(mytarget) + if(activate_on_timeout) + evilpaper_specialaction(mytarget) + else + message_admins("[mytarget] ignored an evil fax until it timed out.") + else + message_admins("Evil paper '[src]' timed out, after not being assigned a target.") + used = 1 + evilpaper_selfdestruct() + else + countdown-- + +/obj/item/weapon/paper/evilfax/proc/evilpaper_specialaction(var/mob/living/carbon/target) + spawn(30) + if(istype(target,/mob/living/carbon)) + if(myeffect == "borging") + target.ForceContractDisease(new /datum/disease/transformation/robot(0)) + else if(myeffect == "corgifying") + target.ForceContractDisease(new /datum/disease/transformation/corgi(0)) + else if(myeffect == "firedeath") + var/turf/simulated/T = get_turf(target) + new /obj/effect/hotspot(T) + target.adjustFireLoss(150) // hard crit, the burning takes care of the rest. + else if(myeffect == "braindeath") + to_chat(target,"A series of bright lights flash across your vision: COGNITOHAZARD YHWH-3 ACTIVATED") + target.mutations.Add(NOCLONE) + target.adjustBrainLoss(125) + else if(myeffect == "honktumor") + if(!target.get_int_organ(/obj/item/organ/internal/honktumor)) + var/obj/item/organ/internal/organ = new /obj/item/organ/internal/honktumor + organ.insert(target) + else if(myeffect == "demotion") + command_announcement.Announce("[mytarget] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") + else + message_admins("Evil paper [src] was activated without a proper effect set! This is a bug.") + used = 1 + evilpaper_selfdestruct() + +/obj/item/weapon/paper/evilfax/proc/evilpaper_selfdestruct() + visible_message("[src] spontaneously catches fire, and burns up!") + qdel(src)