From 68bf885e6b0afbbb325cca56038d21989002e0d8 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Wed, 20 Aug 2014 23:07:21 +0200 Subject: [PATCH 1/2] Announcement system refactoring. Turns announcements into a datum based system to allow a variety of configurations. Current configuration options include: Admin logging Which sound that should play when announced, if any If the announcement should be stored as a newscast Request console/standard announcements currently match priority announcements, but have a smaller style/footprint. Player announcements now include the assignment and name of the person (or the id rather) who made it. Have currently only updated the request console and all announcements which previously used captain_announce(). Affected automated announcements, such as shuttle messages, should be exactly the same as before. --- baystation12.dme | 2 +- .../computer3/computers/communications.dm | 18 +++-- code/WorkInProgress/periodic_news.dm | 2 + .../emergency_shuttle_controller.dm | 49 ++++++------ code/defines/procs/announce.dm | 75 +++++++++++++++++++ code/defines/procs/captain_announce.dm | 6 -- .../game/machinery/computer/communications.dm | 18 +++-- code/game/machinery/newscaster.dm | 11 +-- code/game/machinery/requests_console.dm | 25 ++++--- code/modules/economy/economy_misc.dm | 7 ++ code/modules/mob/living/silicon/ai/ai.dm | 6 +- code/modules/mob/mob_helpers.dm | 10 ++- code/modules/shuttles/shuttle_emergency.dm | 10 +-- 13 files changed, 175 insertions(+), 64 deletions(-) create mode 100644 code/defines/procs/announce.dm delete mode 100644 code/defines/procs/captain_announce.dm diff --git a/baystation12.dme b/baystation12.dme index bf43bcf22a..f06661917a 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..f4dd9f322e 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 @@ -134,6 +135,7 @@ proc/announce_newscaster_news(datum/news_announcement/news) newMsg.is_admin_message = !news.can_be_redacted newMsg.body = news.message + newMsg.message_type = news.message_type var/datum/feed_channel/sendto for(var/datum/feed_channel/FC in news_network.network_channels) 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..14a96516ea --- /dev/null +++ b/code/defines/procs/announce.dm @@ -0,0 +1,75 @@ +// A default priority announcement which doesn't log +var/global/datum/announcement/priority/priority_announcement = new(0) + +/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/new_sound = null) + sound = new_sound + +/datum/announcement/priority/New(var/do_log = 1, var/new_sound = sound('sound/items/AirHorn.ogg')) + title = "Priority Announcement" + announcement_type = "Priority Announcement" + log = do_log + sound = new_sound + +/datum/announcement/proc/Announce(message as text) + if (!message) + return + Message(message) + NewsCast(message) + Sound() + Log(message) + +/datum/announcement/proc/Message(message as text) + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player) && !isdeaf(M)) + M << "

[title]

" + M << "[html_encode(message)]" + if (announcer) + M << " -[html_encode(announcer)]" + +/datum/announcement/proc/NewsCast(message 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/Sound() + if(!sound) + return + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player) && !isdeaf(M)) + M << sound + +/datum/announcement/proc/Log(message as text) + if(log) + log_say("[key_name(usr)] has made a(n) [announcement_type]: [title] - [message] - [announcer]") + message_admins("[key_name_admin(usr)] has made a(n) [announcement_type].", 1) + +/datum/announcement/priority/Message(message as text) + world << "

[title]

" + world << "[html_encode(message)]" + if(announcer) + world << " -[html_encode(announcer)]" + world << "
" + +/datum/announcement/priority/Sound() + if(sound) + world << sound + +/proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I) + // Formant currently matches that of newscaster feeds. + return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name \ No newline at end of file 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/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/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 758883dfff..ffde99ea19 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 @@ -167,6 +168,9 @@ 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") + announcement = new() + announcement.announcer = name + announcement.title = "A.I. announcement" ai_list += src ..() @@ -321,7 +325,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) + announcement.Announce(input) log_say("[key_name(usr)] has made an AI announcement: [input]") message_admins("[key_name_admin(usr)] has made an AI announcement.", 1) message_cooldown = 1 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/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)) From f9df93fad03bf397689ce2d5776aef606e670db0 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 21 Aug 2014 11:17:18 +0200 Subject: [PATCH 2/2] Expands the use of the new announcement system. Code Green/Blue/Red/Delta, ERT, and captain annoncements now use the new announcement system. These announcements are stored as newscasts. --- code/WorkInProgress/periodic_news.dm | 14 ++- code/__HELPERS/unsorted.dm | 8 +- code/defines/procs/announce.dm | 102 ++++++++++++------ code/game/jobs/job/captain.dm | 4 +- code/game/response_team.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 32 +++--- .../security levels/security levels.dm | 18 ++-- 7 files changed, 109 insertions(+), 73 deletions(-) diff --git a/code/WorkInProgress/periodic_news.dm b/code/WorkInProgress/periodic_news.dm index f4dd9f322e..22335e4a67 100644 --- a/code/WorkInProgress/periodic_news.dm +++ b/code/WorkInProgress/periodic_news.dm @@ -129,14 +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 - newMsg.message_type = news.message_type - var/datum/feed_channel/sendto for(var/datum/feed_channel/FC in news_network.network_channels) if(FC.channel_name == news.channel_name) @@ -151,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/defines/procs/announce.dm b/code/defines/procs/announce.dm index 14a96516ea..cc58307c9d 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -1,5 +1,6 @@ -// A default priority announcement which doesn't log -var/global/datum/announcement/priority/priority_announcement = new(0) +/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" @@ -10,32 +11,74 @@ var/global/datum/announcement/priority/priority_announcement = new(0) var/channel_name = "Public Station Announcements" var/announcement_type = "Announcement" -/datum/announcement/New(var/new_sound = null) +/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')) +/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" - log = do_log - sound = new_sound -/datum/announcement/proc/Announce(message as text) - if (!message) +/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 - Message(message) - NewsCast(message) - Sound() - Log(message) + var/tmp/message_title = new_title ? new_title : title -/datum/announcement/proc/Message(message as text) + 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 << "[html_encode(message)]" + M << "[message]" if (announcer) M << " -[html_encode(announcer)]" -/datum/announcement/proc/NewsCast(message as text) +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 @@ -47,29 +90,28 @@ var/global/datum/announcement/priority/priority_announcement = new(0) news.can_be_redacted = 0 announce_newscaster_news(news) -/datum/announcement/proc/Sound() +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/Log(message as text) - if(log) - log_say("[key_name(usr)] has made a(n) [announcement_type]: [title] - [message] - [announcer]") - message_admins("[key_name_admin(usr)] has made a(n) [announcement_type].", 1) +datum/announcement/proc/Sound() + PlaySound() -/datum/announcement/priority/Message(message as text) - world << "

[title]

" - world << "[html_encode(message)]" - if(announcer) - world << " -[html_encode(announcer)]" - world << "
" - -/datum/announcement/priority/Sound() +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) - // Formant currently matches that of newscaster feeds. - return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name \ No newline at end of file + // 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/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/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/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ffde99ea19..356ac165fb 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -86,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 @@ -96,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 @@ -113,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 @@ -168,10 +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") - announcement = new() - announcement.announcer = name - announcement.title = "A.I. announcement" - ai_list += src ..() return @@ -180,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. @@ -326,8 +334,6 @@ var/list/ai_verbs_default = list( return announcement.Announce(input) - log_say("[key_name(usr)] has made an AI announcement: [input]") - message_admins("[key_name_admin(usr)] has made an AI announcement.", 1) message_cooldown = 1 spawn(600)//One minute cooldown message_cooldown = 0 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)