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 = "
"
+ 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)