// The communications computer
/obj/machinery/computer/communications
name = "Communications Console"
icon_state = "comm"
req_access = list(access_heads)
var/prints_intercept = 1
var/authenticated = 0
var/list/messagetitle = list()
var/list/messagetext = list()
var/currmsg = 0
var/aicurrmsg = 0
var/state = STATE_DEFAULT
var/aistate = STATE_DEFAULT
var/const
STATE_DEFAULT = 1
STATE_CALLSHUTTLE = 2
STATE_CANCELSHUTTLE = 3
STATE_MESSAGELIST = 4
STATE_VIEWMESSAGE = 5
STATE_DELMESSAGE = 6
STATE_STATUSDISPLAY = 7
var/status_display_freq = "1435"
var/stat_msg1
var/stat_msg2
desc = "A computer that allows one to call and recall the emergency shuttle, as well as recieve messages from Centcom."
/obj/machinery/computer/communications/process()
..()
if(state != STATE_STATUSDISPLAY)
src.updateDialog()
/obj/machinery/computer/communications/Topic(href, href_list)
if(..())
return
usr.machine = src
if(!href_list["operation"] || (dd_hasprefix(href_list["operation"], "ai-") && !issilicon(usr)))
return
switch(href_list["operation"])
// main interface
if("main")
src.state = STATE_DEFAULT
if("login")
var/mob/M = usr
var/obj/item/card/id/I = M.equipped()
if (I && istype(I))
if(src.check_access(I))
authenticated = 1
if("logout")
authenticated = 0
if("nolockdown")
disablelockdown(usr)
post_status("alert", "default")
if("call-prison")
call_prison_shuttle(usr)
if("callshuttle")
src.state = STATE_DEFAULT
if(src.authenticated)
src.state = STATE_CALLSHUTTLE
if("callshuttle2")
if(src.authenticated)
call_shuttle_proc(usr)
if(emergency_shuttle.online)
post_status("shuttle")
src.state = STATE_DEFAULT
if("cancelshuttle")
src.state = STATE_DEFAULT
if(src.authenticated)
src.state = STATE_CANCELSHUTTLE
if("cancelshuttle2")
if(src.authenticated)
cancel_call_proc(usr)
src.state = STATE_DEFAULT
if("messagelist")
src.currmsg = 0
src.state = STATE_MESSAGELIST
if("viewmessage")
src.state = STATE_VIEWMESSAGE
if (!src.currmsg)
if(href_list["message-num"])
src.currmsg = text2num(href_list["message-num"])
else
src.state = STATE_MESSAGELIST
if("delmessage")
src.state = (src.currmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
if("delmessage2")
if(src.authenticated)
if(src.currmsg)
var/title = src.messagetitle[src.currmsg]
var/text = src.messagetext[src.currmsg]
src.messagetitle.Remove(title)
src.messagetext.Remove(text)
if(src.currmsg == src.aicurrmsg)
src.aicurrmsg = 0
src.currmsg = 0
src.state = STATE_MESSAGELIST
else
src.state = STATE_VIEWMESSAGE
if("status")
src.state = STATE_STATUSDISPLAY
// Status display stuff
if("setstat")
switch(href_list["statdisp"])
if("message")
post_status("message", stat_msg1, stat_msg2)
if("alert")
post_status("alert", href_list["alert"])
else
post_status(href_list["statdisp"])
if("setmsg1")
stat_msg1 = input("Line 1", "Enter Message Text", stat_msg1) as text|null
stat_msg1 = copytext(adminscrub(stat_msg1), 1, MAX_MESSAGE_LEN)
src.updateDialog()
if("setmsg2")
stat_msg2 = input("Line 2", "Enter Message Text", stat_msg2) as text|null
stat_msg2 = copytext(adminscrub(stat_msg2), 1, MAX_MESSAGE_LEN)
src.updateDialog()
// AI interface
if("ai-main")
src.aicurrmsg = 0
src.aistate = STATE_DEFAULT
if("ai-callshuttle")
src.aistate = STATE_CALLSHUTTLE
if("ai-callshuttle2")
call_shuttle_proc(usr)
src.aistate = STATE_DEFAULT
if("ai-messagelist")
src.aicurrmsg = 0
src.aistate = STATE_MESSAGELIST
if("ai-viewmessage")
src.aistate = STATE_VIEWMESSAGE
if (!src.aicurrmsg)
if(href_list["message-num"])
src.aicurrmsg = text2num(href_list["message-num"])
else
src.aistate = STATE_MESSAGELIST
if("ai-delmessage")
src.aistate = (src.aicurrmsg) ? STATE_DELMESSAGE : STATE_MESSAGELIST
if("ai-delmessage2")
if(src.aicurrmsg)
var/title = src.messagetitle[src.aicurrmsg]
var/text = src.messagetext[src.aicurrmsg]
src.messagetitle.Remove(title)
src.messagetext.Remove(text)
if(src.currmsg == src.aicurrmsg)
src.currmsg = 0
src.aicurrmsg = 0
src.aistate = STATE_MESSAGELIST
if("ai-status")
src.aistate = STATE_STATUSDISPLAY
src.updateUsrDialog()
/proc/disablelockdown(var/mob/usr)
boutput(world, "Lockdown cancelled by [usr.name]!")
for(var/obj/machinery/firealarm/FA in machines) //deactivate firealarms
spawn( 0 )
if(FA.lockdownbyai == 1)
FA.lockdownbyai = 0
FA.reset()
for(var/obj/machinery/door/airlock/AL) //open airlocks
spawn ( 0 )
if(AL.canAIControl() && AL.lockdownbyai == 1)
AL.open()
AL.lockdownbyai = 0
/obj/machinery/computer/communications/attackby(I as obj, user as mob)
if(istype(I, /obj/item/screwdriver))
playsound(src.loc, "sound/items/Screwdriver.ogg", 50, 1)
if(do_after(user, 20))
if (src.stat & BROKEN)
boutput(user, "The broken glass falls out.")
var/obj/computerframe/A = new /obj/computerframe( src.loc )
if(src.material) A.setMaterial(src.material)
new /obj/item/raw_material/shard/glass( src.loc )
var/obj/item/circuitboard/communications/M = new /obj/item/circuitboard/communications( A )
for (var/obj/C in src)
C.set_loc(src.loc)
A.circuit = M
A.state = 3
A.icon_state = "3"
A.anchored = 1
logTheThing("station", user, null, "disassembles [src] (broken) [log_loc(src)]")
qdel(src)
else
boutput(user, "You disconnect the monitor.")
var/obj/computerframe/A = new /obj/computerframe( src.loc )
if(src.material) A.setMaterial(src.material)
var/obj/item/circuitboard/communications/M = new /obj/item/circuitboard/communications( A )
for (var/obj/C in src)
C.set_loc(src.loc)
A.circuit = M
A.state = 4
A.icon_state = "4"
A.anchored = 1
logTheThing("station", user, null, "disassembles [src] [log_loc(src)]")
qdel(src)
else
src.attack_hand(user)
return
/obj/machinery/computer/communications/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/computer/communications/attack_hand(var/mob/user as mob)
if(..())
return
user.machine = src
var/dat = "
Communications Console"
if (emergency_shuttle.online && emergency_shuttle.location==0)
var/timeleft = emergency_shuttle.timeleft()
dat += "Emergency shuttle
ETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
if (istype(user, /mob/living/silicon))
var/dat2 = src.interact_ai(user) // give the AI a different interact proc to limit its access
if(dat2)
dat += dat2
user << browse(dat, "window=communications;size=400x500")
onclose(user, "communications")
return
switch(src.state)
if(STATE_DEFAULT)
if (src.authenticated)
dat += "
\[ Log Out \]"
// dat += "
\[ Send Prison Shutle \]"
dat += "
\[ Disable Lockdown \]"
if(emergency_shuttle.location==0)
if (emergency_shuttle.online)
dat += "
\[ Cancel Shuttle Call \]"
else
dat += "
\[ Call Emergency Shuttle \]"
dat += "
\[ Set Status Display \]"
else
dat += "
\[ Log In \]"
dat += "
\[ Message List \]"
if(STATE_CALLSHUTTLE)
dat += "Are you sure you want to call the shuttle? \[ OK | Cancel \]"
if(STATE_CANCELSHUTTLE)
dat += "Are you sure you want to cancel the shuttle? \[ OK | Cancel \]"
if(STATE_MESSAGELIST)
dat += "Messages:"
for(var/i = 1; i<=src.messagetitle.len; i++)
dat += "
[src.messagetitle[i]]"
if(STATE_VIEWMESSAGE)
if (src.currmsg)
dat += "[src.messagetitle[src.currmsg]]
[src.messagetext[src.currmsg]]"
if (src.authenticated)
dat += "
\[ Delete \]"
else
src.state = STATE_MESSAGELIST
src.attack_hand(user)
return
if(STATE_DELMESSAGE)
if (src.currmsg)
dat += "Are you sure you want to delete this message? \[ OK | Cancel \]"
else
src.state = STATE_MESSAGELIST
src.attack_hand(user)
return
if(STATE_STATUSDISPLAY)
dat += "Set Status Displays
"
dat += "\[ Clear \]
"
dat += "\[ Shuttle ETA \]
"
dat += "\[ Message \]"
dat += "
"
dat += "\[ Alert: None |"
dat += " Red Alert |"
dat += " Lockdown |"
dat += " Biohazard \]
"
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)
if(STATE_DEFAULT)
if(emergency_shuttle.location==0 && !emergency_shuttle.online)
dat += "
\[ Call Emergency Shuttle \]"
// dat += "
\[ Send Prison Shutle \]"
dat += "
\[ Message List \]"
dat += "
\[ Disable Lockdown \]"
dat += "
\[ Set Status Display \]"
if(STATE_CALLSHUTTLE)
dat += "Are you sure you want to call the shuttle? \[ OK | Cancel \]"
if(STATE_MESSAGELIST)
dat += "Messages:"
for(var/i = 1; i<=src.messagetitle.len; i++)
dat += "
[src.messagetitle[i]]"
if(STATE_VIEWMESSAGE)
if (src.aicurrmsg)
dat += "[src.messagetitle[src.aicurrmsg]]
[src.messagetext[src.aicurrmsg]]"
dat += "
\[ Delete \]"
else
src.aistate = STATE_MESSAGELIST
src.attack_hand(user)
return null
if(STATE_DELMESSAGE)
if(src.aicurrmsg)
dat += "Are you sure you want to delete this message? \[ OK | Cancel \]"
else
src.aistate = STATE_MESSAGELIST
src.attack_hand(user)
return
if(STATE_STATUSDISPLAY)
dat += "Set Status Displays
"
dat += "\[ Clear \]
"
dat += "\[ Shuttle ETA \]
"
dat += "\[ Message \]"
dat += "
"
dat += "\[ Alert: None |"
dat += " Red Alert |"
dat += " Lockdown |"
dat += " Biohazard \]
"
dat += "
\[ [(src.aistate != STATE_DEFAULT) ? "Main Menu | " : ""]Close \]"
return dat
/mob/living/silicon/ai/proc/ai_call_shuttle()
set category = "AI Commands"
set name = "Call Emergency Shuttle"
if (usr == src)
if((alert(usr, "Are you sure?",,"Yes","No") != "Yes"))
return
if(usr.stat == 2)
boutput(usr, "You can't call the shuttle because you are dead!")
return
logTheThing("admin", usr, null, "called the Emergency Shuttle")
logTheThing("diary", usr, null, "called the Emergency Shuttle", "admin")
message_admins("[key_name(usr)] called the Emergency Shuttle to the station")
call_shuttle_proc(src)
// hack to display shuttle timer
if(emergency_shuttle.online)
var/obj/machinery/computer/communications/C = locate() in world
if(C)
C.post_status("shuttle")
return
/proc/call_prison_shuttle(var/mob/usr)
if ((!(ticker && ticker.mode) || emergency_shuttle.location == 1))
return
/*if(istype(ticker.mode, /datum/game_mode/sandbox))
boutput(usr, "Under directive 7-10, [station_name()] is quarantined until further notice.")
return*/
if(istype(ticker.mode, /datum/game_mode/revolution))
boutput(usr, "Centcom will not allow the shuttle to be called.")
return
return
/proc/enable_prison_shuttle(var/mob/user)
return
/proc/call_shuttle_proc(var/mob/user)
if ((!( ticker ) || emergency_shuttle.location))
return 1
if(world.time/10 < 600)
boutput(user, "Centcom will not allow the shuttle to be called.")
return 1
/*if(istype(ticker.mode, /datum/game_mode/sandbox))
boutput(user, "Under directive 7-10, [station_name()] is quarantined until further notice.")
return 1*/
if(emergency_shuttle.disabled)
boutput(user, "Centcom will not allow the shuttle to be called.")
return 1
if (solar_flare)
boutput(user, "Solar Flare activity is preventing contact with the Emergency Shuttle.")
return 1
emergency_shuttle.incall()
boutput(world, "Alert: The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
return 0
/proc/cancel_call_proc(var/mob/user)
if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0 || emergency_shuttle.timeleft() < 300))
return 1
if (solar_flare)
boutput(user, "Solar Flare activity is preventing contact with the Emergency Shuttle.")
return 1
boutput(world, "Alert: The shuttle is going back!") //marker4
emergency_shuttle.recall()
return 0
/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)
if(!frequency) return
var/datum/signal/status_signal = get_free_signal()
status_signal.source = src
status_signal.transmission_method = 1
status_signal.data["command"] = command
switch(command)
if("message")
status_signal.data["msg1"] = data1
status_signal.data["msg2"] = data2
if("alert")
status_signal.data["picture_state"] = data1
frequency.post_signal(src, status_signal)
/*
receive_signal(datum/signal/signal)
switch(signal.data["command"])
if("blank")
mode = 0
if("shuttle")
mode = 1
if("message")
set_message(signal.data["msg1"], signal.data["msg2"])
if("alert")
set_picture(signal.data["picture_state"])
*/