// 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"]) */