diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 718915bd87b..b8825a56162 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -14,6 +14,7 @@
var/state = STATE_DEFAULT
var/aistate = STATE_DEFAULT
var/message_cooldown = 0
+ var/centcomm_message_cooldown = 0
var/tmp_alertlevel = 0
var/const
STATE_DEFAULT = 1
@@ -31,6 +32,7 @@
var/stat_msg2
+
/obj/machinery/computer/communications/process()
..()
if(state != STATE_STATUSDISPLAY)
@@ -82,7 +84,7 @@
switch(get_security_level())
if(SEC_LEVEL_GREEN)
feedback_inc("alert_comms_green",1)
- if(SEC_LEVEL_GREEN)
+ if(SEC_LEVEL_BLUE)
feedback_inc("alert_comms_blue",1)
tmp_alertlevel = 0
else:
@@ -168,6 +170,46 @@
stat_msg2 = input("Line 2", "Enter Message Text", stat_msg2) as text|null
src.updateDialog()
+ // OMG CENTCOMM LETTERHEAD
+ if("MessageCentcomm")
+ if(src.authenticated==2)
+ if(centcomm_message_cooldown)
+ usr << "Arrays recycling. Please stand by."
+ return
+ var/input = input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "")
+ if(!input || !(usr in view(1,src)))
+ return
+ Centcomm_announce(input, usr)
+ usr << "Message transmitted."
+ log_say("[key_name(usr)] has sent Centcomm a message: [input]")
+ centcomm_message_cooldown = 1
+ spawn(600)//One minute cooldown
+ message_cooldown = 0
+
+
+ // OMG SYNDICATE ...LETTERHEAD
+ if("MessageSyndicate")
+ if((src.authenticated==2) && (src.emagged))
+ if(centcomm_message_cooldown)
+ usr << "Arrays recycling. Please stand by."
+ return
+ var/input = input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "")
+ if(!input || !(usr in view(1,src)))
+ return
+ Syndicate_announce(input, usr)
+ usr << "Message transmitted."
+ log_say("[key_name(usr)] has sent the Syndicate a message: [input]")
+ centcomm_message_cooldown = 1
+ spawn(600)//One minute cooldown
+ message_cooldown = 0
+
+ if("RestoreBackup")
+ usr << "Backup routing data restored!"
+ src.emagged = 0
+ src.updateDialog()
+
+
+
// AI interface
if("ai-main")
src.aicurrmsg = 0
@@ -214,6 +256,11 @@
src.updateUsrDialog()
+/obj/machinery/computer/communications/attackby(var/obj/I as obj, var/mob/user as mob)
+ if(istype(I,/obj/item/weapon/card/emag/))
+ src.emagged = 1
+ user << "You scramble the communication routing circuits!"
+ ..()
/obj/machinery/computer/communications/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
@@ -247,6 +294,12 @@
dat += "
\[ Log Out \]"
if (src.authenticated==2)
dat += "
\[ Make An Announcement \]"
+ if(src.emagged == 0)
+ dat += "
\[ Send an emergency message to Centcomm \]"
+ else
+ dat += "
\[ Send an emergency message to \[UNKNOWN\] \]"
+ dat += "
\[ Restore Backup Routing Data \]"
+
dat += "
\[ Change alert level \]"
if(emergency_shuttle.location==0)
if (emergency_shuttle.online)
@@ -303,12 +356,15 @@
if(STATE_CONFIRM_LEVEL)
dat += "Current alert level: [get_security_level()]
"
dat += "Confirm the change to: [num2seclevel(tmp_alertlevel)]
"
- dat += "Swipt ID to confirm change.
"
+ dat += "Swipe ID to confirm change.
"
dat += "
\[ [(src.state != STATE_DEFAULT) ? "Main Menu | " : ""]Close \]"
user << browse(dat, "window=communications;size=400x500")
onclose(user, "communications")
+
+
+
/obj/machinery/computer/communications/proc/interact_ai(var/mob/living/silicon/ai/user as mob)
var/dat = ""
switch(src.aistate)
@@ -361,6 +417,10 @@
if(usr.stat == 2)
usr << "You can't call the shuttle because you are dead!"
return
+
+ var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
+ if(confirm != "Yes") return
+
call_shuttle_proc(src)
// hack to display shuttle timer
@@ -388,11 +448,15 @@
return
if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE
- user << "The emergency shuttle is refueling. Please wait another [(6000-world.time)/10] seconds before trying again."
+ user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minutes before trying again."
return
if(emergency_shuttle.direction == -1)
- user << "Shuttle may not be called while returning to CentCom."
+ user << "The emergency shuttle may not be called while returning to CentCom."
+ return
+
+ if(emergency_shuttle.online)
+ user << "The emergency shuttle is already on its way."
return
if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "sandbox")
@@ -426,7 +490,7 @@
/obj/machinery/computer/communications/proc/post_status(var/command, var/data1, var/data2)
- var/datum/radio_frequency/frequency = radio_controller.return_frequency(status_display_freq)
+ var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435)
if(!frequency) return
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index e236922d377..bab9a374b25 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1,4 +1,7 @@
+var/global/BSACooldown = 0
+
+
////////////////////////////////
/proc/message_admins(var/text, var/admin_ref = 0)
var/rendered = "ADMIN LOG: [text]"
@@ -904,6 +907,92 @@
cl.jumptomob(M)
+
+
+
+ if (href_list["BlueSpaceArtillery"])
+ var/mob/M = locate(href_list["BlueSpaceArtillery"])
+ if(!M)
+ return
+
+ var/choice = alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No")
+ if (choice == "No")
+ return
+
+ if(BSACooldown)
+ src.owner << "Standby! Reload cycle in progress! Gunnary crews ready in five seconds!"
+ return
+
+ BSACooldown = 1
+ spawn(50)
+ BSACooldown = 0
+
+
+ M << "You've been hit by bluespace artillery!"
+ log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
+ message_admins("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
+ var/obj/effect/stop/S
+ S = new /obj/effect/stop
+ S.victim = M
+ S.loc = M.loc
+ spawn(20)
+ del(S)
+
+ var/turf/T = get_turf(M)
+ if(T && (istype(T,/turf/simulated/floor/)))
+ if(prob(80))
+ T:break_tile_to_plating()
+ else
+ T:break_tile()
+
+ if(M.health == 1)
+ M.gib()
+ else
+ M.adjustBruteLoss( min( 99 , (M.health - 1) ) )
+ M.Stun(20)
+ M.Weaken(20)
+ M.stuttering = 20
+
+ if (href_list["CentcommReply"])
+ var/mob/M = locate(href_list["CentcommReply"])
+ if(!M)
+ return
+ if(!istype(M, /mob/living/carbon/human))
+ alert("Centcomm cannot transmit to non-humans.")
+ return
+ if((!istype(M:l_ear, /obj/item/device/radio/headset)) && (!istype(M:r_ear, /obj/item/device/radio/headset)))
+ alert("The person you're trying to reply to doesn't have a headset! Centcomm cannot transmit directly to them.")
+ return
+ var/input = input(src.owner, "Please enter a message to reply to [key_name(M)] via their headset.","Outgoing message from Centcomm", "")
+ if(!input)
+ return
+
+ src.owner << "You sent [input] to [M] via a secure channel."
+ log_admin("[src.owner] replied to [key_name(M)]'s Centcomm message with the message [input].")
+ M << "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.\""
+
+ return
+
+ if (href_list["SyndicateReply"])
+ var/mob/M = locate(href_list["SyndicateReply"])
+ if(!M)
+ return
+ if(!istype(M, /mob/living/carbon/human))
+ alert("The Syndicate cannot transmit to non-humans.")
+ return
+ if((!istype(M:l_ear, /obj/item/device/radio/headset)) && (!istype(M:r_ear, /obj/item/device/radio/headset)))
+ alert("The person you're trying to reply to doesn't have a headset! Centcomm cannot transmit directly to them.")
+ return
+ var/input = input(src.owner, "Please enter a message to reply to [key_name(M)] via their headset.","Outgoing message from The Syndicate", "")
+ if(!input)
+ return
+
+ src.owner << "You sent [input] to [M] via a secure channel."
+ log_admin("[src.owner] replied to [key_name(M)]'s Syndicate message with the message [input].")
+ M << "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.\""
+
+ return
+
if (href_list["jumpto"])
if(rank in list("Badmin", "Game Admin", "Game Master"))
var/mob/M = locate(href_list["jumpto"])
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index a75c2fa9298..69ffc12b836 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -18,3 +18,25 @@
usr << "Your prayers have been received by the gods."
//log_admin("HELP: [key_name(src)]: [msg]")
+
+
+/proc/Centcomm_announce(var/text , var/mob/Sender)
+
+ var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
+
+// log_admin("[key_name(Sender)] sent a message to Centcomm! The message was [msg]") // Handled somewhere else
+
+ for (var/mob/M in world)
+ if (M.client && M.client.holder)
+ M << "\blue CENTCOMM:[key_name(Sender, M)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ //
+/proc/Syndicate_announce(var/text , var/mob/Sender)
+
+ var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
+
+// log_admin("[key_name(Sender)] sent a message to the Syndicate! The message was [msg]") // Handled somewhere else
+
+ for (var/mob/M in world)
+ if (M.client && M.client.holder)
+ M << "\blue SYNDICATE:[key_name(Sender, M)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ //