diff --git a/baystation12.dme b/baystation12.dme index 361118cb4b..7aadf41ef0 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -167,8 +167,8 @@ #include "code\datums\spells\wizard.dm" #include "code\defines\obj.dm" #include "code\defines\obj\weapon.dm" +#include "code\defines\procs\announce.dm" #include "code\defines\procs\AStar.dm" -#include "code\defines\procs\captain_announce.dm" #include "code\defines\procs\command_alert.dm" #include "code\defines\procs\dbcore.dm" #include "code\defines\procs\sd_Alert.dm" diff --git a/code/WorkInProgress/computer3/computers/communications.dm b/code/WorkInProgress/computer3/computers/communications.dm index 20c29aaec4..16123e42e7 100644 --- a/code/WorkInProgress/computer3/computers/communications.dm +++ b/code/WorkInProgress/computer3/computers/communications.dm @@ -43,6 +43,12 @@ var/stat_msg1 var/stat_msg2 + var/datum/announcement/priority/crew_announcement = new + + New() + ..() + crew_announcement.newscast = 1 + Reset() ..() authenticated = 0 @@ -68,11 +74,13 @@ authenticated = 1 if(access_captain in I.GetAccess()) authenticated = 2 + crew_announcement.announcer = GetNameAndAssignmentFromId(I) if(istype(I,/obj/item/weapon/card/emag)) authenticated = 2 computer.emagged = 1 if("logout" in href_list) authenticated = 0 + crew_announcement.announcer = "" if("swipeidseclevel" in href_list) var/mob/M = usr @@ -104,13 +112,13 @@ usr << "You need to swipe your ID." if("announce" in href_list) if(authenticated==2) - if(message_cooldown) return - var/input = stripped_input(usr, "Please choose a message to announce to the station crew.", "What?") + if(message_cooldown) + usr << "Please allow at least one minute to pass between announcements" + return + var/input = stripped_input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") if(!input || !interactable()) return - captain_announce(input)//This should really tell who is, IE HoP, CE, HoS, RD, Captain - log_say("[key_name(usr)] has made a captain announcement: [input]") - message_admins("[key_name_admin(usr)] has made a captain announcement.", 1) + crew_announcement.Announce(input) message_cooldown = 1 spawn(600)//One minute cooldown message_cooldown = 0 diff --git a/code/WorkInProgress/periodic_news.dm b/code/WorkInProgress/periodic_news.dm index 90eb2e3742..22335e4a67 100644 --- a/code/WorkInProgress/periodic_news.dm +++ b/code/WorkInProgress/periodic_news.dm @@ -8,6 +8,7 @@ author = "NanoTrasen Editor" channel_name = "Nyx Daily" can_be_redacted = 0 + message_type = "Story" revolution_inciting_event @@ -128,13 +129,6 @@ proc/check_for_newscaster_updates(type) announce_newscaster_news(news) proc/announce_newscaster_news(datum/news_announcement/news) - - var/datum/feed_message/newMsg = new /datum/feed_message - newMsg.author = news.author - newMsg.is_admin_message = !news.can_be_redacted - - newMsg.body = news.message - var/datum/feed_channel/sendto for(var/datum/feed_channel/FC in news_network.network_channels) if(FC.channel_name == news.channel_name) @@ -149,6 +143,12 @@ proc/announce_newscaster_news(datum/news_announcement/news) sendto.is_admin_channel = 1 news_network.network_channels += sendto + var/datum/feed_message/newMsg = new /datum/feed_message + newMsg.author = news.author ? news.author : sendto.author + newMsg.is_admin_message = !news.can_be_redacted + newMsg.body = news.message + newMsg.message_type = news.message_type + sendto.messages += newMsg for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 5ed7a675d5..bc1afd8778 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -330,13 +330,7 @@ Turf and target are seperate in case you want to teleport some distance from a t //world << "[newname] is the AI!" //world << sound('sound/AI/newAI.ogg') // Set eyeobj name - if(A.eyeobj) - A.eyeobj.name = "[newname] (AI Eye)" - - // Set ai pda name - if(A.aiPDA) - A.aiPDA.owner = newname - A.aiPDA.name = newname + " (" + A.aiPDA.ownjob + ")" + A.SetName(newname) fully_replace_character_name(oldname,newname) diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 51a063057c..aae9cd5829 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -7,17 +7,20 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle /datum/emergency_shuttle_controller var/datum/shuttle/ferry/emergency/shuttle var/list/escape_pods - + var/launch_time //the time at which the shuttle will be launched var/auto_recall = 0 //if set, the shuttle will be auto-recalled var/auto_recall_time //the time at which the shuttle will be auto-recalled var/evac = 0 //1 = emergency evacuation, 0 = crew transfer var/wait_for_launch = 0 //if the shuttle is waiting to launch var/autopilot = 1 //set to 0 to disable the shuttle automatically launching - + var/deny_shuttle = 0 //allows admins to prevent the shuttle from being called var/departed = 0 //if the shuttle has left the station at least once + var/datum/announcement/priority/emergency_shuttle_docked = new(0, new_sound = sound('sound/AI/shuttledock.ogg')) + var/datum/announcement/priority/emergency_shuttle_called = new(0, new_sound = sound('sound/AI/shuttlecalled.ogg')) + var/datum/announcement/priority/emergency_shuttle_recalled = new(0, new_sound = sound('sound/AI/shuttlerecalled.ogg')) /datum/emergency_shuttle_controller/proc/process() if (wait_for_launch) @@ -25,28 +28,28 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle recall() if (world.time >= launch_time) //time to launch the shuttle stop_launch_countdown() - + if (!shuttle.location) //leaving from the station //launch the pods! for (var/datum/shuttle/ferry/escape_pod/pod in escape_pods) if (!pod.arming_controller || pod.arming_controller.armed) pod.launch(src) - + if (autopilot) shuttle.launch(src) //called when the shuttle has arrived. + /datum/emergency_shuttle_controller/proc/shuttle_arrived() if (!shuttle.location) //at station if (autopilot) set_launch_countdown(SHUTTLE_LEAVETIME) //get ready to return - + if (evac) - captain_announce("The Emergency Shuttle has docked with the station. You have approximately [round(estimate_launch_time()/60,1)] minutes to board the Emergency Shuttle.") - world << sound('sound/AI/shuttledock.ogg') + emergency_shuttle_docked.Announce("The Emergency Shuttle has docked with the station. You have approximately [round(estimate_launch_time()/60,1)] minutes to board the Emergency Shuttle.") else - captain_announce("The scheduled Crew Transfer Shuttle has docked with the station. It will depart in approximately [round(emergency_shuttle.estimate_launch_time()/60,1)] minutes.") - + priority_announcement.Announce("The scheduled Crew Transfer Shuttle has docked with the station. It will depart in approximately [round(emergency_shuttle.estimate_launch_time()/60,1)] minutes.") + //arm the escape pods if (evac) for (var/datum/shuttle/ferry/escape_pod/pod in escape_pods) @@ -64,18 +67,17 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle //calls the shuttle for an emergency evacuation /datum/emergency_shuttle_controller/proc/call_evac() if(!can_call()) return - + //set the launch timer autopilot = 1 set_launch_countdown(get_shuttle_prep_time()) auto_recall_time = rand(world.time + 300, launch_time - 300) - + //reset the shuttle transit time if we need to shuttle.move_time = SHUTTLE_TRANSIT_DURATION - + evac = 1 - captain_announce("An emergency evacuation shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.") - world << sound('sound/AI/shuttlecalled.ogg') + emergency_shuttle_called.Announce("An emergency evacuation shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.") for(var/area/A in world) if(istype(A, /area/hallway)) A.readyalert() @@ -88,11 +90,11 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle autopilot = 1 set_launch_countdown(get_shuttle_prep_time()) auto_recall_time = rand(world.time + 300, launch_time - 300) - + //reset the shuttle transit time if we need to shuttle.move_time = SHUTTLE_TRANSIT_DURATION - - captain_announce("A crew transfer has been scheduled. The shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.") + + priority_announcement.Announce("A crew transfer has been scheduled. The shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.") //recalls the shuttle /datum/emergency_shuttle_controller/proc/recall() @@ -102,15 +104,14 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle shuttle.cancel_launch(src) if (evac) - captain_announce("The emergency shuttle has been recalled.") - world << sound('sound/AI/shuttlerecalled.ogg') - + emergency_shuttle_recalled.Announce("The emergency shuttle has been recalled.") + for(var/area/A in world) if(istype(A, /area/hallway)) A.readyreset() evac = 0 else - captain_announce("The scheduled crew transfer has been cancelled.") + priority_announcement.Announce("The scheduled crew transfer has been cancelled.") /datum/emergency_shuttle_controller/proc/can_call() if (deny_shuttle) @@ -203,14 +204,14 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle if (shuttle.has_arrive_time()) var/timeleft = emergency_shuttle.estimate_arrival_time() return "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]" - + if (waiting_to_leave()) if (shuttle.moving_status == SHUTTLE_WARMUP) return "Departing..." - + var/timeleft = emergency_shuttle.estimate_launch_time() return "ETD-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]" - + return "" /* Some slapped-together star effects for maximum spess immershuns. Basically consists of a diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm new file mode 100644 index 0000000000..cc58307c9d --- /dev/null +++ b/code/defines/procs/announce.dm @@ -0,0 +1,117 @@ +/var/datum/announcement/priority/priority_announcement = new(do_log = 0) +/var/datum/announcement/priority/command/command_announcement = new(do_log = 0, do_newscast = 1) +/var/datum/announcement/priority/security/security_announcement = new(do_log = 0, do_newscast = 1) + +/datum/announcement + var/title = "Attention" + var/announcer = "" + var/log = 0 + var/sound + var/newscast = 0 + var/channel_name = "Public Station Announcements" + var/announcement_type = "Announcement" + +/datum/announcement/New(var/do_log = 0, var/new_sound = null, var/do_newscast = 0) + sound = new_sound + log = do_log + newscast = do_newscast + +/datum/announcement/priority/New(var/do_log = 1, var/new_sound = sound('sound/items/AirHorn.ogg'), var/do_newscast = 0) + ..(do_log, new_sound, do_newscast) + title = "Priority Announcement" + announcement_type = "Priority Announcement" + +/datum/announcement/priority/command/New(var/do_log = 1, var/new_sound = sound('sound/items/AirHorn.ogg'), var/do_newscast = 0) + ..(do_log, new_sound, do_newscast) + title = "[command_name()] Update" + announcement_type = "[command_name()] Update" + +/datum/announcement/priority/security/New(var/do_log = 1, var/new_sound = sound('sound/items/AirHorn.ogg'), var/do_newscast = 0) + ..(do_log, new_sound, do_newscast) + title = "Security Announcement" + announcement_type = "Security Announcement" + +/datum/announcement/proc/Announce(var/message as text, var/new_title = "") + if(!message) + return + var/tmp/message_title = new_title ? new_title : title + + message = html_encode(message) + message_title = html_encode(message_title) + + Message(message, message_title) + NewsCast(message, message_title) + Sound() + Log(message, message_title) + +datum/announcement/proc/Message(message as text, message_title as text) + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player) && !isdeaf(M)) + M << "

[title]

" + M << "[message]" + if (announcer) + M << " -[html_encode(announcer)]" + +datum/announcement/minor/Message(message as text, message_title as text) + world << "[message]" + +datum/announcement/priority/Message(message as text, message_title as text) + world << "

[message_title]

" + world << "[message]" + if(announcer) + world << " -[html_encode(announcer)]" + world << "
" + +datum/announcement/priority/command/Message(message as text, message_title as text) + var/command + command += "

[command_name()] Update

" + if (message_title) + command += "

[message_title]

" + + command += "
[message]
" + command += "
" + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player) && !isdeaf(M)) + M << command + +datum/announcement/priority/security/Message(message as text, message_title as text) + world << "[message_title]" + world << "[message]" + +datum/announcement/proc/NewsCast(message as text, message_title as text) + if(!newscast) + return + + var/datum/news_announcement/news = new + news.channel_name = channel_name + news.author = announcer + news.message = message + news.message_type = announcement_type + news.can_be_redacted = 0 + announce_newscaster_news(news) + +datum/announcement/proc/PlaySound() + if(!sound) + return + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player) && !isdeaf(M)) + M << sound + +datum/announcement/proc/Sound() + PlaySound() + +datum/announcement/priority/Sound() + if(sound) + world << sound + +datum/announcement/priority/command/Sound() + PlaySound() + +datum/announcement/proc/Log(message as text, message_title as text) + if(log) + log_say("[key_name(usr)] has made a(n) [announcement_type]: [message_title] - [message] - [announcer]") + message_admins("[key_name_admin(usr)] has made a(n) [announcement_type].", 1) + +/proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I) + // Format currently matches that of newscaster feeds: Registered Name (Assigned Rank) + return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name diff --git a/code/defines/procs/captain_announce.dm b/code/defines/procs/captain_announce.dm deleted file mode 100644 index 092d297a2d..0000000000 --- a/code/defines/procs/captain_announce.dm +++ /dev/null @@ -1,6 +0,0 @@ -/proc/captain_announce(message as text, title = "Priority Announcement", announcer = "") - world << "

[html_encode(title)]

" - world << "[html_encode(message)]" - if(announcer) - world << " -[html_encode(announcer)]" - world << "
" \ No newline at end of file diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 3f141f2156..c75a2a759a 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -1,3 +1,5 @@ +var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) + /datum/job/captain title = "Captain" flag = CAPTAIN @@ -32,7 +34,7 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) - world << "[H.real_name] is the captain!" + captain_announcement.Announce("All hands, captain [H.real_name] on deck!") H.implant_loyalty(src) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 71d3c25a8c..ad18204a2a 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -33,7 +33,11 @@ var/stat_msg1 var/stat_msg2 + var/datum/announcement/priority/crew_announcement = new +/obj/machinery/computer/communications/New() + ..() + crew_announcement.newscast = 1 /obj/machinery/computer/communications/process() if(..()) @@ -64,10 +68,12 @@ if (I && istype(I)) if(src.check_access(I)) authenticated = 1 - if(20 in I.access) + if(access_captain in I.access) authenticated = 2 + crew_announcement.announcer = GetNameAndAssignmentFromId(I) if("logout") authenticated = 0 + crew_announcement.announcer = "" if("swipeidseclevel") var/mob/M = usr @@ -101,13 +107,13 @@ if("announce") if(src.authenticated==2) - if(message_cooldown) return - var/input = stripped_input(usr, "Please choose a message to announce to the station crew.", "What?") + if(message_cooldown) + usr << "Please allow at least one minute to pass between announcements" + return + var/input = stripped_input(usr, "Please write a message to announce to the station crew.", "Priority Announcement") if(!input || !(usr in view(1,src))) return - captain_announce(input)//This should really tell who is, IE HoP, CE, HoS, RD, Captain - log_say("[key_name(usr)] has made a captain announcement: [input]") - message_admins("[key_name_admin(usr)] has made a captain announcement.", 1) + crew_announcement.Announce(input) message_cooldown = 1 spawn(600)//One minute cooldown message_cooldown = 0 diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 114d24e57b..18b8e96186 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -5,6 +5,7 @@ /datum/feed_message var/author ="" var/body ="" + var/message_type ="Story" //var/parent_channel var/backup_body ="" var/backup_author ="" @@ -218,7 +219,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="No feed messages found in channel...

" else for(var/datum/feed_message/MESSAGE in CHANNEL.messages) - dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
"*/ + dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
"*/ dat+="

Refresh" dat+="
Back" @@ -304,7 +305,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(MESSAGE.img) usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") dat+="

" - dat+="\[Story by [MESSAGE.author]\]
" + dat+="\[[MESSAGE.message_type] by [MESSAGE.author]\]
" dat+="

Refresh" dat+="
Back" if(10) @@ -339,7 +340,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="No feed messages found in channel...
" else for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) - dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
" + dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
" dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
" dat+="
Back" if(13) @@ -353,7 +354,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="No feed messages found in channel...
" else for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) - dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
" + dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
" dat+="
Back" if(14) @@ -840,7 +841,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) if(MESSAGE.img) user << browse_rsc(MESSAGE.img, "tmp_photo[i].png") dat+="
" - dat+="\[Story by [MESSAGE.author]\]

" + dat+="\[[MESSAGE.message_type] by [MESSAGE.author]\]

" dat+="" if(scribble_page==curr_page) dat+="
There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 8364a5a666..f9dd2216df 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -55,6 +55,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() var/dpt = ""; //the department which will be receiving the message var/priority = -1 ; //Priority of the message being sent luminosity = 0 + var/datum/announcement/announcement = new /obj/machinery/requests_console/power_change() ..() @@ -70,6 +71,10 @@ var/list/obj/machinery/requests_console/allConsoles = list() /obj/machinery/requests_console/New() ..() + + announcement.title = "[department] announcement" + announcement.newscast = 1 + name = "[department] Requests Console" allConsoles += src //req_console_departments += department @@ -189,7 +194,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() else //main menu screen = 0 - announceAuth = 0 + reset_announce() if (newmessagepriority == 1) dat += text("There are new messages
") if (newmessagepriority == 2) @@ -240,17 +245,13 @@ var/list/obj/machinery/requests_console/allConsoles = list() if("2") priority = 2 else priority = -1 else - message = "" - announceAuth = 0 + reset_announce() screen = 0 if(href_list["sendAnnouncement"]) if(!announcementConsole) return - for(var/mob/M in player_list) - if(!istype(M,/mob/new_player)) - M << "[department] announcement: [message]" - announceAuth = 0 - message = "" + announcement.Announce(message) + reset_announce() screen = 0 if( href_list["department"] && message ) @@ -389,8 +390,9 @@ var/list/obj/machinery/requests_console/allConsoles = list() var/obj/item/weapon/card/id/ID = O if (access_RC_announce in ID.GetAccess()) announceAuth = 1 + announcement.announcer = ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name else - announceAuth = 0 + reset_announce() user << "\red You are not authorized to send announcements." updateUsrDialog() if (istype(O, /obj/item/weapon/stamp)) @@ -399,3 +401,8 @@ var/list/obj/machinery/requests_console/allConsoles = list() msgStamped = text("Stamped with the [T.name]") updateUsrDialog() return + +/obj/machinery/requests_console/proc/reset_announce() + announceAuth = 0 + message = "" + announcement.announcer = "" diff --git a/code/game/response_team.dm b/code/game/response_team.dm index ce719f6c68..24fd31ed7d 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -133,11 +133,11 @@ proc/trigger_armed_response_team(var/force = 0) // there's only a certain chance a team will be sent if(!prob(send_team_chance)) - command_alert("It would appear that an emergency response team was requested for [station_name()]. Unfortunately, we were unable to send one at this time.", "Central Command") + command_announcement.Announce("It would appear that an emergency response team was requested for [station_name()]. Unfortunately, we were unable to send one at this time.", "Central Command") can_call_ert = 0 // Only one call per round, ladies. return - command_alert("It would appear that an emergency response team was requested for [station_name()]. We will prepare and send one as soon as possible.", "Central Command") + command_announcement.Announce("It would appear that an emergency response team was requested for [station_name()]. We will prepare and send one as soon as possible.", "Central Command") can_call_ert = 0 // Only one call per round, gentleman. send_emergency_team = 1 diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index 4c9cfeb534..02d3a4e0e2 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -78,6 +78,13 @@ var/global/economy_init = 0 return 2 var/datum/feed_channel/newChannel = new /datum/feed_channel + newChannel.channel_name = "Public Station Announcements" + newChannel.author = "Automated Announcement Listing" + newChannel.locked = 1 + newChannel.is_admin_channel = 1 + news_network.network_channels += newChannel + + newChannel = new /datum/feed_channel newChannel.channel_name = "Nyx Daily" newChannel.author = "CentComm Minister of Information" newChannel.locked = 1 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 792ef9296f..bf0c3f4b45 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -76,6 +76,7 @@ var/list/ai_verbs_default = list( var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through. var/datum/trackable/track = null var/last_announcement = "" + var/datum/announcement/priority/announcement /mob/living/silicon/ai/proc/add_ai_verbs() src.verbs += ai_verbs_default @@ -85,6 +86,11 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0) + announcement = new() + announcement.title = "A.I. Announcement" + announcement.announcement_type = "A.I. Announcement" + announcement.newscast = 1 + var/list/possibleNames = ai_names var/pickedName = null @@ -95,8 +101,8 @@ var/list/ai_verbs_default = list( possibleNames -= pickedName pickedName = null - real_name = pickedName - name = real_name + aiPDA = new/obj/item/device/pda/ai(src) + SetName(pickedName) anchored = 1 canmove = 0 density = 1 @@ -112,11 +118,6 @@ var/list/ai_verbs_default = list( else laws = new base_law_type - aiPDA = new/obj/item/device/pda/ai(src) - aiPDA.owner = name - aiPDA.ownjob = "AI" - aiPDA.name = name + " (" + aiPDA.ownjob + ")" - aiMulti = new(src) aiRadio = new(src) aiRadio.myAi = src @@ -167,7 +168,6 @@ var/list/ai_verbs_default = list( hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") - ai_list += src ..() return @@ -176,6 +176,18 @@ var/list/ai_verbs_default = list( ai_list -= src ..() +/mob/living/silicon/ai/proc/SetName(pickedName as text) + real_name = pickedName + name = pickedName + announcement.announcer = pickedName + if(eyeobj) + eyeobj.name = "[pickedName] (AI Eye)" + + // Set ai pda name + if(aiPDA) + aiPDA.ownjob = "AI" + aiPDA.owner = pickedName + aiPDA.name = pickedName + " (" + aiPDA.ownjob + ")" /* The AI Power supply is a dummy object used for powering the AI since only machinery should be using power. @@ -321,9 +333,7 @@ var/list/ai_verbs_default = list( if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO)) return - captain_announce(input, "A.I. Announcement", src.name) - log_say("[key_name(usr)] has made an AI announcement: [input]") - message_admins("[key_name_admin(usr)] has made an AI announcement.", 1) + announcement.Announce(input) message_cooldown = 1 spawn(600)//One minute cooldown message_cooldown = 0 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 388f2bf7a4..6b9f0f2d8f 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -115,6 +115,12 @@ proc/isorgan(A) return 1 return 0 +proc/isdeaf(A) + if(istype(A, /mob)) + var/mob/M = A + return (M.sdisabilities & DEAF) || M.ear_deaf + return 0 + proc/hasorgans(A) return ishuman(A) @@ -317,11 +323,11 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /proc/shake_camera(mob/M, duration, strength=1) - if(!M || !M.client || M.shakecamera) + if(!M || !M.client || M.shakecamera) return M.shakecamera = 1 spawn(1) - + var/atom/oldeye=M.client.eye var/aiEyeFlag = 0 if(istype(oldeye, /mob/aiEye)) diff --git a/code/modules/security levels/security levels.dm b/code/modules/security levels/security levels.dm index b0cc3d1c92..2037ef78e5 100644 --- a/code/modules/security levels/security levels.dm +++ b/code/modules/security levels/security levels.dm @@ -21,8 +21,7 @@ if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level) switch(level) if(SEC_LEVEL_GREEN) - world << "Attention! Security level lowered to green" - world << "[config.alert_desc_green]" + security_announcement.Announce("[config.alert_desc_green]", "Attention! Security level lowered to green") security_level = SEC_LEVEL_GREEN for(var/obj/machinery/firealarm/FA in machines) if(FA.z == 1 || FA.z == 5) @@ -30,11 +29,9 @@ FA.overlays += image('icons/obj/monitors.dmi', "overlay_green") if(SEC_LEVEL_BLUE) if(security_level < SEC_LEVEL_BLUE) - world << "Attention! Security level elevated to blue" - world << "[config.alert_desc_blue_upto]" + security_announcement.Announce("[config.alert_desc_blue_upto]", "Attention! Security level elevated to blue") else - world << "Attention! Security level lowered to blue" - world << "[config.alert_desc_blue_downto]" + security_announcement.Announce("[config.alert_desc_blue_downto]", "Attention! Security level lowered to blue") security_level = SEC_LEVEL_BLUE for(var/obj/machinery/firealarm/FA in machines) if(FA.z == 1 || FA.z == 5) @@ -42,11 +39,9 @@ FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue") if(SEC_LEVEL_RED) if(security_level < SEC_LEVEL_RED) - world << "Attention! Code red!" - world << "[config.alert_desc_red_upto]" + security_announcement.Announce("[config.alert_desc_red_upto]", "Attention! Code red!") else - world << "Attention! Code red!" - world << "[config.alert_desc_red_downto]" + security_announcement.Announce("[config.alert_desc_red_downto]", "Attention! Code red!") security_level = SEC_LEVEL_RED /* - At the time of commit, setting status displays didn't work properly @@ -60,8 +55,7 @@ FA.overlays += image('icons/obj/monitors.dmi', "overlay_red") if(SEC_LEVEL_DELTA) - world << "Attention! Delta security level reached!" - world << "[config.alert_desc_delta]" + security_announcement.Announce("[config.alert_desc_delta]", "Attention! Delta security level reached!") security_level = SEC_LEVEL_DELTA for(var/obj/machinery/firealarm/FA in machines) if(FA.z == 1 || FA.z == 5) diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index c7fff897e6..30dbacecaa 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -6,7 +6,7 @@ if (istype(in_use, /obj/machinery/computer/shuttle_control/emergency)) var/obj/machinery/computer/shuttle_control/emergency/C = in_use C.reset_authorization() - + emergency_shuttle.shuttle_arrived() /datum/shuttle/ferry/emergency/long_jump(var/area/departing, var/area/destination, var/area/interim, var/travel_time, var/direction) @@ -26,9 +26,9 @@ emergency_shuttle.departed = 1 if (emergency_shuttle.evac) - captain_announce("The Emergency Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at Central Command.") + priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at Central Command.") else - captain_announce("The Crew Transfer Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at Central Command.") + priority_announcement.Announce("The Crew Transfer Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at Central Command.") ..(origin, destination) @@ -42,7 +42,7 @@ /datum/shuttle/ferry/emergency/can_force(var/user) if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) var/obj/machinery/computer/shuttle_control/emergency/C = user - + //initiating or cancelling a launch ALWAYS requires authorization, but if we are already set to launch anyways than forcing does not. //this is so that people can force launch if the docking controller cannot safely undock without needing X heads to swipe. if (process_state != WAIT_LAUNCH && !C.has_authorization()) @@ -226,7 +226,7 @@ if(href_list["removeid"]) var/dna_hash = href_list["removeid"] authorized -= dna_hash - + if(!emagged && href_list["scanid"]) //They selected an empty entry. Try to scan their id. if (ishuman(usr))