diff --git a/code/__DEFINES/alarm.dm b/code/__DEFINES/alarm.dm new file mode 100644 index 0000000000..f5142f5a16 --- /dev/null +++ b/code/__DEFINES/alarm.dm @@ -0,0 +1,13 @@ +//A set of defines to be used by the alarm datums +///Sent by air alarms, indecates something wrong with thier attached atmosphere +#define ALARM_ATMOS "Atmosphere" +///Sent by fire alarms when they are toggled +#define ALARM_FIRE "Fire" +///Sent by apcs when their power starts to fail +#define ALARM_POWER "Power" +///Sent by cameras when they're disabled in some manner +#define ALARM_CAMERA "Camera" +///Sent by display cases when they're broken into +#define ALARM_BURGLAR "Burglar" +///Sent by motion detecting cameras when they well, detect motion +#define ALARM_MOTION "Motion" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 47c9c9dec2..3f193ac3c2 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -36,6 +36,10 @@ #define COMSIG_WEATHER_START(event_type) "!weather_start [event_type]" #define COMSIG_WEATHER_WINDDOWN(event_type) "!weather_winddown [event_type]" #define COMSIG_WEATHER_END(event_type) "!weather_end [event_type]" +/// An alarm of some form was sent (datum/alarm_handler/source, alarm_type, area/source_area) +#define COMSIG_ALARM_FIRE(alarm_type) "!alarm_fire [alarm_type]" +/// An alarm of some form was cleared (datum/alarm_handler/source, alarm_type, area/source_area) +#define COMSIG_ALARM_CLEAR(alarm_type) "!alarm_clear [alarm_type]" /// called by auxgm add_gas: (gas_id) #define COMSIG_GLOB_NEW_GAS "!new_gas" @@ -700,3 +704,9 @@ ///from base of [/datum/component/multiple_lives/proc/respawn]: (mob/respawned_mob, gibbed, lives_left) #define COMSIG_ON_MULTIPLE_LIVES_RESPAWN "on_multiple_lives_respawn" + +// Alarm listener datum signals +///Sent when an alarm is fired (alarm, area/source_area) +#define COMSIG_ALARM_TRIGGERED "comsig_alarm_triggered" +///Send when an alarm source is cleared (alarm_type, area/source_area) +#define COMSIG_ALARM_CLEARED "comsig_alarm_clear" diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 032ae9ded0..14614218ac 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -103,3 +103,22 @@ #define JOB_DISPLAY_ORDER_BO 38 #define JOB_DISPLAY_ORDER_PRISONER 39 #define JOB_DISPLAY_ORDER_STOWAWAY 40 + +#define DEPARTMENT_UNASSIGNED "No department assigned" + +#define DEPARTMENT_BITFLAG_SECURITY (1<<0) +#define DEPARTMENT_SECURITY "Security" +#define DEPARTMENT_BITFLAG_COMMAND (1<<1) +#define DEPARTMENT_COMMAND "Command" +#define DEPARTMENT_BITFLAG_SERVICE (1<<2) +#define DEPARTMENT_SERVICE "Service" +#define DEPARTMENT_BITFLAG_SUPPLY (1<<3) +#define DEPARTMENT_SUPPLY "Supply" +#define DEPARTMENT_BITFLAG_ENGINEERING (1<<4) +#define DEPARTMENT_ENGINEERING "Engineering" +#define DEPARTMENT_BITFLAG_SCIENCE (1<<5) +#define DEPARTMENT_SCIENCE "Science" +#define DEPARTMENT_BITFLAG_MEDICAL (1<<6) +#define DEPARTMENT_MEDICAL "Medical" +#define DEPARTMENT_BITFLAG_SILICON (1<<7) +#define DEPARTMENT_SILICON "Silicon" diff --git a/code/_globalvars/tgui.dm b/code/_globalvars/tgui.dm index 1a2c46c10d..aaaab9c5e4 100644 --- a/code/_globalvars/tgui.dm +++ b/code/_globalvars/tgui.dm @@ -1 +1,2 @@ +GLOBAL_DATUM(crew_manifest_tgui, /datum/crew_manifest) GLOBAL_DATUM(changelog_tgui, /datum/changelog) diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 5f8b10fd31..419de492ef 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -74,7 +74,7 @@ if(..()) return var/mob/living/silicon/ai/AI = usr - AI.ai_alerts() + AI.alert_control.ui_interact(AI) /atom/movable/screen/ai/announcement name = "Make Vox Announcement" @@ -84,7 +84,7 @@ if(..()) return var/mob/living/silicon/ai/AI = usr - AI.announcement() + AI.ai_announcement() /atom/movable/screen/ai/call_shuttle name = "Call Emergency Shuttle" diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index b345459749..899ad72f2f 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -367,7 +367,7 @@ if(.) return var/mob/living/silicon/robot/borgo = usr - borgo.robot_alerts() + borgo.alert_control.ui_interact(borgo) /atom/movable/screen/robot/thrusters name = "ion thrusters" diff --git a/code/datums/alarm.dm b/code/datums/alarm.dm new file mode 100644 index 0000000000..7fc2245949 --- /dev/null +++ b/code/datums/alarm.dm @@ -0,0 +1,199 @@ +//This files deals with the generic sending and receiving of "alarms" +//This is a somewhat blanket term, it covers things like fire/power/atmos alarms, along with some oddballs +//Side effect of how the system is used, these are mostly things that are of interest to ais and borgs +//Though it could easily be expanded to cover other senders/revievers +//The system as a whole differs from reading off a global list in a few ways. +//In that A, it allows us to send cameras for ais/borgs/potentially others to jump to +//And B, it's not like we're giving you all the alarms that have been sent, because of the seperate listing for each reviever +//You only recieve alarms sent after you start to listen +//Also of note, due to an optimzation done on areas, one alarm handler will only ever send one "on" or "off" alarm +//So the whole only receving stuff sent post creation thing actually matters +//Honestly I'm not sure how much of this is a feature, and how much is just old code +//But I'm leaving it how I found it + +///Represents a single source of alarms, one alarm handler will only ever count for one alarm per listener +/datum/alarm_handler + ///A list of alarm type -> list of areas we currently have alarms in + var/list/sent_alarms = list() + ///Our source atom + var/atom/source_atom + +/datum/alarm_handler/New(atom/source_atom) + if(istype(source_atom)) + src.source_atom = source_atom + else + var/source_type = (istype(source_atom, /datum)) ? source_atom.type : "" + stack_trace("a non atom was passed into alarm_handler! [source_atom] [source_type]") + return ..() + +/datum/alarm_handler/Destroy() + for(var/alarm_type in sent_alarms) + for(var/area/area_to_clear as anything in sent_alarms[alarm_type]) + //Yeet all connected alarms + clear_alarm_from_area(alarm_type, area_to_clear) + source_atom = null + return ..() + +///Sends an alarm to any interested things, does some checks to prevent unneeded work +///Important to note is that source_atom is not held as a ref, we're used as a proxy to prevent hard deletes +///optional_camera should only be used when you have one camera you want to pass along to alarm listeners, most of the time you should have no use for it +/datum/alarm_handler/proc/send_alarm(alarm_type, atom/use_as_source_atom, optional_camera) + if(!use_as_source_atom) + use_as_source_atom = source_atom + if(!use_as_source_atom) + return + + var/area/our_area = get_area(use_as_source_atom) + var/our_z_level = use_as_source_atom.z + + if (our_area.area_flags & NO_ALERTS) + return FALSE + + var/list/existing_alarms = sent_alarms[alarm_type] + if(existing_alarms) + if(our_area in existing_alarms) + return FALSE + else + sent_alarms[alarm_type] = list() + existing_alarms = sent_alarms[alarm_type] + + existing_alarms += our_area + + our_area.active_alarms[alarm_type] += 1 + + SEND_GLOBAL_SIGNAL(COMSIG_ALARM_FIRE(alarm_type), src, alarm_type, our_area, our_z_level, optional_camera) + + return TRUE + +///Clears an alarm from any interested listeners +/datum/alarm_handler/proc/clear_alarm(alarm_type, use_as_source_atom) + SIGNAL_HANDLER + if(!use_as_source_atom) + use_as_source_atom = source_atom + if(!use_as_source_atom) + return + + return clear_alarm_from_area(alarm_type, get_area(use_as_source_atom)) + +///Exists so we can request that the alarms from an area are cleared, even if our source atom is no longer in that area +/datum/alarm_handler/proc/clear_alarm_from_area(alarm_type, area/our_area) + if (our_area.area_flags & NO_ALERTS) + return FALSE + + var/list/existing_alarms = sent_alarms[alarm_type] + if(!existing_alarms) + return FALSE + + if(!(our_area in existing_alarms)) + return FALSE + + existing_alarms -= our_area + if(!length(existing_alarms)) + sent_alarms -= alarm_type + + our_area.active_alarms[alarm_type] -= 1 + if(!length(our_area.active_alarms)) + our_area.active_alarms -= alarm_type + + SEND_GLOBAL_SIGNAL(COMSIG_ALARM_CLEAR(alarm_type), src, alarm_type, our_area) + return TRUE + +/datum/alarm_listener + ///List of valid source z levels, ignored if null + var/list/allowed_z_levels + ///List of allowed areas. if this is null it's ignored + var/list/allowed_areas + + ///List of alarm type -> list of area name -> list(area, ref to area's cameras, list(sources)) + var/list/alarms = list() + ///Should we allow alarm changes to go through or not + var/accepting_alarm_changes = TRUE + +///Accepts a list of alarm types to pay attention to, a list of valid z levels, and a list of valid areas. areas and zlevels are ignored if null +/datum/alarm_listener/New(alarms_to_listen_for, allowed_z_levels, allowed_areas) + src.allowed_z_levels = allowed_z_levels + src.allowed_areas = allowed_areas + for(var/alarm_type in alarms_to_listen_for) + RegisterSignal(SSdcs, COMSIG_ALARM_FIRE(alarm_type), PROC_REF(add_alarm)) + RegisterSignal(SSdcs, COMSIG_ALARM_CLEAR(alarm_type), PROC_REF(clear_alarm)) + + return ..() + +///Adds an alarm to our alarms list, you shouldn't be calling this manually +///It should all be handled by the signal listening we do, unless you want to only send an alarm to one listener +/datum/alarm_listener/proc/add_alarm(datum/source, datum/alarm_handler/handler, alarm_type, area/source_area, source_z, optional_camera) + if (!accepting_alarm_changes) + return + + if(allowed_z_levels && !(source_z in allowed_z_levels)) + return + + if(allowed_areas && !(source_area.type in allowed_areas)) + return + + var/list/alarms_of_our_type = alarms[alarm_type] + if(!alarms_of_our_type) + alarms[alarm_type] = list() + alarms_of_our_type = alarms[alarm_type] + + if(alarms_of_our_type[source_area.name]) + var/list/alarm = alarms_of_our_type[source_area.name] + var/list/sources = alarm[3] + sources |= handler + //Return if a source already exists, we don't want to send a signal or add a new entry + return + + //We normally directly pass in a ref to the area's camera's list to prevent hanging refs + var/list/cameras = source_area.cameras + if(optional_camera) + cameras = list(optional_camera) // This will cause harddels, so we need to clear manually + RegisterSignal(optional_camera, COMSIG_PARENT_QDELETING, PROC_REF(clear_camera_ref), override = TRUE) //It's just fine to override, cause we clear all refs in the proc + + //This does mean that only the first alarm of that camera type in the area will send a ping, but jesus what else can ya do + alarms_of_our_type[source_area.name] = list(source_area, cameras, list(handler)) + SEND_SIGNAL(src, COMSIG_ALARM_TRIGGERED, alarm_type, source_area) + +///Removes an alarm to our alarms list, you probably shouldn't be calling this manually +///It should all be handled by the signal listening we do, unless you want to only remove an alarm to one listener +/datum/alarm_listener/proc/clear_alarm(datum/source, datum/alarm_handler/handler, alarm_type, area/source_area) + if(!accepting_alarm_changes) + return + + var/list/alarms_of_our_type = alarms[alarm_type] + + if(!alarms_of_our_type) + return + + if(!alarms_of_our_type[source_area.name]) + return + + var/list/alarm = alarms_of_our_type[source_area.name] + var/list/sources = alarm[3] + sources -= handler + + if (length(sources)) + return //Return if there's still sources left, no sense clearing the list or bothering anyone about it + + alarms_of_our_type -= source_area.name + SEND_SIGNAL(src, COMSIG_ALARM_CLEARED, alarm_type, source_area) + +///Does what it says on the tin, exists for signal hooking +/datum/alarm_listener/proc/prevent_alarm_changes() + SIGNAL_HANDLER + accepting_alarm_changes = FALSE + +///Does what it says on the tin, exists for signal hooking +/datum/alarm_listener/proc/allow_alarm_changes() + SIGNAL_HANDLER + accepting_alarm_changes = TRUE + +///Used to manually clear camera refs if one is ref'd directly +/datum/alarm_listener/proc/clear_camera_ref(obj/machinery/camera/source) + SIGNAL_HANDLER + var/list/alarms_cache = alarms //Cache for sonic speec + for(var/alarm_type in alarms_cache) + var/list/alarms_of_type = alarms_cache[alarm_type] //Sonic cache speed forads + for(var/area_name as anything in alarms_of_type) + var/list/alarm_packet = alarms_of_type[area_name] + var/list/cameras = alarm_packet[2] + cameras -= source // REF FOUND AND CLEARED BOYSSSS diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 0ca8f07c41..b6a6d776be 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -91,7 +91,7 @@ if(foundrecord) foundrecord.fields["rank"] = assignment -/datum/datacore/proc/get_manifest_tg() //copypasted from tg, renamed to avoid namespace conflicts +/datum/datacore/proc/get_manifest() var/list/manifest_out = list() var/list/departments = list( "Command" = GLOB.command_positions, @@ -113,130 +113,30 @@ if(department_check in jobs) if(!manifest_out[department]) manifest_out[department] = list() - manifest_out[department] += list(list( - "name" = name, - "rank" = rank - )) + // Append to beginning of list if captain or department head + if (department_check == "Captain" || (department != "Command" && (rank in GLOB.command_positions))) + manifest_out[department] = list(list( + "name" = name, + "rank" = rank, + "department_check" = department_check + )) + manifest_out[department] + else + manifest_out[department] += list(list( + "name" = name, + "rank" = rank, + "department_check" = department_check + )) has_department = TRUE - break if(!has_department) if(!manifest_out["Misc"]) manifest_out["Misc"] = list() manifest_out["Misc"] += list(list( "name" = name, - "rank" = rank + "rank" = rank, + "department_check" = department_check )) return manifest_out -/datum/datacore/proc/get_manifest(monochrome, OOC) - var/list/heads = list() - var/list/sec = list() - var/list/eng = list() - var/list/med = list() - var/list/sci = list() - var/list/sup = list() - var/list/civ = list() - var/list/bot = list() - var/list/misc = list() - var/dat = {" - - - - "} - var/even = 0 - // sort mobs - for(var/datum/data/record/t in GLOB.data_core.general) - var/name = t.fields["name"] - var/rank = t.fields["rank"] - var/department_check = GetJobName(t.fields["rank"]) - var/department = 0 - if(department_check in GLOB.command_positions) - heads[name] = rank - department = 1 - if(department_check in GLOB.security_positions) - sec[name] = rank - department = 1 - if(department_check in GLOB.engineering_positions) - eng[name] = rank - department = 1 - if(department_check in GLOB.medical_positions) - med[name] = rank - department = 1 - if(department_check in GLOB.science_positions) - sci[name] = rank - department = 1 - if(department_check in GLOB.supply_positions) - sup[name] = rank - department = 1 - if(department_check in GLOB.civilian_positions) - civ[name] = rank - department = 1 - if(department_check in GLOB.nonhuman_positions) - bot[name] = rank - department = 1 - if(!department && !(name in heads)) - misc[name] = rank - if(heads.len > 0) - dat += "" - for(var/name in heads) - dat += "" - even = !even - if(sec.len > 0) - dat += "" - for(var/name in sec) - dat += "" - even = !even - if(eng.len > 0) - dat += "" - for(var/name in eng) - dat += "" - even = !even - if(med.len > 0) - dat += "" - for(var/name in med) - dat += "" - even = !even - if(sci.len > 0) - dat += "" - for(var/name in sci) - dat += "" - even = !even - if(sup.len > 0) - dat += "" - for(var/name in sup) - dat += "" - even = !even - if(civ.len > 0) - dat += "" - for(var/name in civ) - dat += "" - even = !even - // in case somebody is insane and added them to the manifest, why not - if(bot.len > 0) - dat += "" - for(var/name in bot) - dat += "" - even = !even - // misc guys - if(misc.len > 0) - dat += "" - for(var/name in misc) - dat += "" - even = !even - - dat += "
NameRank
Heads
[name][heads[name]]
Security
[name][sec[name]]
Engineering
[name][eng[name]]
Medical
[name][med[name]]
Science
[name][sci[name]]
Supply
[name][sup[name]]
Civilian
[name][civ[name]]
Silicon
[name][bot[name]]
Miscellaneous
[name][misc[name]]
" - dat = replacetext(dat, "\n", "") - dat = replacetext(dat, "\t", "") - return dat - - /datum/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C, datum/preferences/prefs) set waitfor = FALSE var/static/list/show_directions = list(SOUTH, WEST) diff --git a/code/datums/station_alert.dm b/code/datums/station_alert.dm new file mode 100644 index 0000000000..edec9f5cb5 --- /dev/null +++ b/code/datums/station_alert.dm @@ -0,0 +1,103 @@ +/datum/station_alert + /// Holder of the datum + var/holder + /// List of all alarm types we are listening to + var/list/alarm_types + /// Listens for alarms, provides the alarms list for our UI + var/datum/alarm_listener/listener + /// Title of our UI + var/title + /// If UI will also show and allow jumping to cameras connected to each alert area + var/camera_view + +/datum/station_alert/ui_host(mob/user) + return holder + +/datum/station_alert/New(holder, list/alarm_types, list/listener_z_level, list/listener_areas, title = "Station Alerts", camera_view = FALSE) + src.holder = holder + src.alarm_types = alarm_types + src.title = title + src.camera_view = camera_view + listener = new(alarm_types, listener_z_level, listener_areas) + +/datum/station_alert/Destroy() + QDEL_NULL(listener) + return ..() + +/datum/station_alert/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "StationAlertConsole", title) + ui.open() + +/datum/station_alert/ui_data(mob/user) + var/list/data = list() + data["cameraView"] = camera_view + data["alarms"] = list() + var/list/nominal_types = alarm_types.Copy() + var/list/alarms = listener.alarms + for(var/alarm_type in alarms) + var/list/alarm_category = list( + "name" = alarm_type, + "alerts" = list(), + ) + var/list/alerts = alarms[alarm_type] + for(var/alert in alerts) + var/list/alert_details = alerts[alert] + alarm_category["alerts"] += list(list( + "name" = get_area_name(alert_details[1], TRUE), + "cameras" = camera_view ? length(alert_details[2]) : null, + "sources" = camera_view ? length(alert_details[3]) : null, + "ref" = camera_view ? REF(alert) : null, + )) + data["alarms"] += list(alarm_category) + nominal_types -= alarm_type + if(length(nominal_types)) + for(var/nominal_type in nominal_types) + var/list/nominal_category = list( + "name" = nominal_type, + "alerts" = list(), + ) + data["alarms"] += list(nominal_category) + return data + +/datum/station_alert/ui_act(action, params) + . = ..() + if(.) + return + + switch(action) + if("select_camera") + var/mob/living/silicon/ai/ai = usr + if(!istype(ai)) + return + + var/list/alarms = listener.alarms + var/list/alerts = list() + for(var/alarm_type in alarms) + alerts += alarms[alarm_type] + + var/list/our_alert = locate(params["alert"]) in alerts + if(!length(our_alert)) + return + var/chosen_alert = alerts[our_alert] + var/list/cameras = chosen_alert[2] + if(!length(cameras)) + return + var/list/named_cameras = list() + for(var/obj/machinery/camera/camera in cameras) + named_cameras[camera.c_tag] = camera + + var/chosen_camera + if(length(named_cameras) == 1) + chosen_camera = named_cameras[1] + else + chosen_camera = tgui_input_list(ai, "Choose a camera to jump to", "Camera Selection", named_cameras) + if(!chosen_camera) + return + var/obj/machinery/camera/selected_camera = named_cameras[chosen_camera] + if(!selected_camera.can_use()) + to_chat(ai, span_warning("Camera is unavailable!")) + return + ai.switchCamera(selected_camera) + return TRUE diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index a1deb8899c..d6ec90dbd4 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -149,7 +149,7 @@ trait_flags = STATION_TRAIT_ABSTRACT blacklist = list(/datum/station_trait/deathrattle_all) - var/department_head + var/department_to_apply_to var/department_name = "department" var/datum/deathrattle_group/deathrattle_group @@ -157,72 +157,65 @@ . = ..() deathrattle_group = new("[department_name] group") blacklist += subtypesof(/datum/station_trait/deathrattle_department) - type //All but ourselves + name = "deathrattled [department_name]" report_message = "All members of [department_name] have received an implant to notify each other if one of them dies. This should help improve job-safety!" RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, PROC_REF(on_job_after_spawn)) - -/datum/station_trait/deathrattle_department/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/spawned, client/player_client) +/datum/station_trait/deathrattle_department/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/living_mob, mob/M, joined_late) SIGNAL_HANDLER - if(department_head != job.title && !(src.department_head in job.department_head)) + if(!(job.departments & department_to_apply_to)) return var/obj/item/implant/deathrattle/implant_to_give = new() deathrattle_group.register(implant_to_give) - implant_to_give.implant(spawned, spawned, TRUE, TRUE) + implant_to_give.implant(living_mob, living_mob, TRUE, TRUE) /datum/station_trait/deathrattle_department/service - name = "Deathrattled Service" trait_flags = NONE weight = 1 - department_head = "Head of Personnel" + department_to_apply_to = DEPARTMENT_BITFLAG_SERVICE department_name = "Service" /datum/station_trait/deathrattle_department/cargo - name = "Deathrattled Cargo" trait_flags = NONE - weight = 2 - department_head = "Quartermaster" + weight = 1 + department_to_apply_to = DEPARTMENT_BITFLAG_SUPPLY department_name = "Cargo" /datum/station_trait/deathrattle_department/engineering - name = "Deathrattled Engineering" trait_flags = NONE - weight = 2 - department_head = "Chief Engineer" + weight = 1 + department_to_apply_to = DEPARTMENT_BITFLAG_ENGINEERING department_name = "Engineering" /datum/station_trait/deathrattle_department/command - name = "Deathrattled Command" trait_flags = NONE weight = 1 - department_head = "Captain" + department_to_apply_to = DEPARTMENT_BITFLAG_COMMAND department_name = "Command" /datum/station_trait/deathrattle_department/science - name = "Deathrattled Science" trait_flags = NONE weight = 1 - department_head = "Research Director" + department_to_apply_to = DEPARTMENT_BITFLAG_SCIENCE department_name = "Science" /datum/station_trait/deathrattle_department/security - name = "Deathrattled Security" trait_flags = NONE weight = 1 - department_head = "Head of Security" + department_to_apply_to = DEPARTMENT_BITFLAG_SECURITY department_name = "Security" /datum/station_trait/deathrattle_department/medical - name = "Deathrattled Medical" trait_flags = NONE weight = 1 - department_head = "Chief Medical Officer" + department_to_apply_to = DEPARTMENT_BITFLAG_MEDICAL department_name = "Medical" /datum/station_trait/deathrattle_all - name = "Deathrattled Station" + name = "deathrattled station" trait_type = STATION_TRAIT_POSITIVE show_in_report = TRUE weight = 1 @@ -236,14 +229,12 @@ blacklist = subtypesof(/datum/station_trait/deathrattle_department) RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, PROC_REF(on_job_after_spawn)) - -/datum/station_trait/deathrattle_all/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/spawned, client/player_client) +/datum/station_trait/deathrattle_all/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/living_mob, mob/M, joined_late) SIGNAL_HANDLER var/obj/item/implant/deathrattle/implant_to_give = new() deathrattle_group.register(implant_to_give) - implant_to_give.implant(spawned, spawned, TRUE, TRUE) - + implant_to_give.implant(living_mob, living_mob, TRUE, TRUE) /datum/station_trait/wallets name = "Wallets!" diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm index addacb315d..0b9fb450a1 100644 --- a/code/datums/wires/airalarm.dm +++ b/code/datums/wires/airalarm.dm @@ -47,8 +47,7 @@ A.mode = 1 // AALARM_MODE_SCRUB A.apply_mode() if(WIRE_ALARM) // Clear alarms. - var/area/AA = get_base_area(A) - if(AA.atmosalert(0, holder)) + if(A.alarm_manager.clear_alarm(ALARM_ATMOS)) A.post_alert(0) A.update_icon() @@ -69,7 +68,6 @@ A.mode = 3 // AALARM_MODE_PANIC A.apply_mode() if(WIRE_ALARM) // Post alarm. - var/area/AA = get_base_area(A) - if(AA.atmosalert(2, holder)) + if(A.alarm_manager.send_alarm(ALARM_ATMOS)) A.post_alert(2) A.update_icon() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 22de4a8b27..23b53bd21b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -19,9 +19,11 @@ var/fire = FALSE ///How many fire alarm sources do we have? var/triggered_firealarms = 0 - ///Whether there is an atmos alarm in this area - var/atmosalm = FALSE - var/poweralm = FALSE + ///Alarm type to count of sources. Not usable for ^ because we handle fires differently + var/list/active_alarms = list() + ///We use this just for fire alarms, because they're area based right now so one alarm going poof shouldn't prevent you from clearing your alarms listing + var/datum/alarm_handler/alarm_manager + var/lightswitch = TRUE /// All beauty in this area combined, only includes indoor area. @@ -186,6 +188,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (area_flags & UNIQUE_AREA) GLOB.areas_by_type[type] = src + alarm_manager = new(src) // just in case + if(!minimap_color) // goes in New() because otherwise it doesn't fucking work // generate one using the icon_state if(icon_state && icon_state != "unknown") @@ -324,86 +328,12 @@ GLOBAL_LIST_EMPTY(teleportlocs) A.power_environ = FALSE A.power_change() STOP_PROCESSING(SSobj, src) + QDEL_NULL(alarm_manager) return ..() /** - * Generate a power alert for this area - * - * Sends to all ai players, alert consoles, drones and alarm monitor programs in the world + * Try to close all the firedoors in the area */ -/area/proc/poweralert(set_alarm, obj/source) - if (area_flags & NO_ALERTS) - return - if (set_alarm != poweralm) - poweralm = set_alarm - if(istype(source)) //Only report power alarms on the z-level where the source is located. - for (var/item in GLOB.silicon_mobs) - var/mob/living/silicon/aiPlayer = item - if (set_alarm) - aiPlayer.triggerAlarm("Power", src, cameras, source) - else - aiPlayer.cancelAlarm("Power", src, source) - - for (var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - if (set_alarm) - a.triggerAlarm("Power", src, cameras, source) - else - a.cancelAlarm("Power", src, source) - - for (var/item in GLOB.drones_list) - var/mob/living/simple_animal/drone/D = item - if (set_alarm) - D.triggerAlarm("Power", src, cameras, source) - else - D.cancelAlarm("Power", src, source) - for(var/item in GLOB.alarmdisplay) - var/datum/computer_file/program/alarm_monitor/p = item - if (set_alarm) - p.triggerAlarm("Power", src, cameras, source) - else - p.cancelAlarm("Power", src, source) - -/area/proc/atmosalert(danger_level, obj/source) - if (area_flags & NO_ALERTS) - return - if(danger_level != atmosalm) - if (danger_level==2) - - for (var/item in GLOB.silicon_mobs) - var/mob/living/silicon/aiPlayer = item - aiPlayer.triggerAlarm("Atmosphere", src, cameras, source) - for (var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - a.triggerAlarm("Atmosphere", src, cameras, source) - for (var/item in GLOB.drones_list) - var/mob/living/simple_animal/drone/D = item - D.triggerAlarm("Atmosphere", src, cameras, source) - for(var/item in GLOB.alarmdisplay) - var/datum/computer_file/program/alarm_monitor/p = item - p.triggerAlarm("Atmosphere", src, cameras, source) - - else if (src.atmosalm == 2) - for (var/item in GLOB.silicon_mobs) - var/mob/living/silicon/aiPlayer = item - aiPlayer.cancelAlarm("Atmosphere", src, source) - for (var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - a.cancelAlarm("Atmosphere", src, source) - for (var/item in GLOB.drones_list) - var/mob/living/simple_animal/drone/D = item - D.cancelAlarm("Atmosphere", src, source) - for(var/item in GLOB.alarmdisplay) - var/datum/computer_file/program/alarm_monitor/p = item - p.cancelAlarm("Atmosphere", src, source) - - atmosalm = danger_level - for(var/i in sub_areas) - var/area/A = i - A.atmosalm = danger_level - return TRUE - return FALSE - /area/proc/ModifyFiredoors(opening) if(firedoors) firedoors_last_closed_on = world.time @@ -429,19 +359,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (!fire) set_fire_alarm_effects(TRUE) ModifyFiredoors(FALSE) - if (!(area_flags & NO_ALERTS)) //Check here instead at the start of the proc so that fire alarms can still work locally even in areas that don't send alerts - for (var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - a.triggerAlarm("Fire", src, cameras, source) - for (var/item in GLOB.silicon_mobs) - var/mob/living/silicon/aiPlayer = item - aiPlayer.triggerAlarm("Fire", src, cameras, source) - for (var/item in GLOB.drones_list) - var/mob/living/simple_animal/drone/D = item - D.triggerAlarm("Fire", src, cameras, source) - for(var/item in GLOB.alarmdisplay) - var/datum/computer_file/program/alarm_monitor/p = item - p.triggerAlarm("Fire", src, cameras, source) + alarm_manager.send_alarm(ALARM_FIRE, source) START_PROCESSING(SSobj, src) @@ -460,35 +378,10 @@ GLOBAL_LIST_EMPTY(teleportlocs) if (should_reset_alarms) // if there's a source, make sure there's no fire alarms left set_fire_alarm_effects(FALSE) ModifyFiredoors(TRUE) - - if (!(area_flags & NO_ALERTS)) //Check here instead at the start of the proc so that fire alarms can still work locally even in areas that don't send alerts - for (var/item in GLOB.silicon_mobs) - var/mob/living/silicon/aiPlayer = item - aiPlayer.cancelAlarm("Fire", src, source) - for (var/item in GLOB.alert_consoles) - var/obj/machinery/computer/station_alert/a = item - a.cancelAlarm("Fire", src, source) - for (var/item in GLOB.drones_list) - var/mob/living/simple_animal/drone/D = item - D.cancelAlarm("Fire", src, source) - for(var/item in GLOB.alarmdisplay) - var/datum/computer_file/program/alarm_monitor/p = item - p.cancelAlarm("Fire", src, source) + alarm_manager.clear_alarm(ALARM_FIRE, source) STOP_PROCESSING(SSobj, src) -///Get rid of any dangling camera refs -/area/proc/clear_camera(obj/machinery/camera/cam) - LAZYREMOVE(cameras, cam) - for (var/mob/living/silicon/aiPlayer as anything in GLOB.silicon_mobs) - aiPlayer.freeCamera(src, cam) - for (var/obj/machinery/computer/station_alert/comp as anything in GLOB.alert_consoles) - comp.freeCamera(src, cam) - for (var/mob/living/simple_animal/drone/drone_on as anything in GLOB.drones_list) - drone_on.freeCamera(src, cam) - for(var/datum/computer_file/program/alarm_monitor/monitor as anything in GLOB.alarmdisplay) - monitor.freeCamera(src, cam) - /area/process() if(firedoors_last_closed_on + 100 < world.time) //every 10 seconds ModifyFiredoors(FALSE) @@ -506,14 +399,8 @@ GLOBAL_LIST_EMPTY(teleportlocs) //Trigger alarm effect set_fire_alarm_effects(TRUE) //Lockdown airlocks - for(var/obj/machinery/door/DOOR in get_sub_areas_contents(src)) - close_and_lock_door(DOOR) - - for (var/i in GLOB.silicon_mobs) - var/mob/living/silicon/SILICON = i - if(SILICON.triggerAlarm("Burglar", src, cameras, trigger)) - //Cancel silicon alert after 1 minute - addtimer(CALLBACK(SILICON, TYPE_PROC_REF(/mob/living/silicon, cancelAlarm),"Burglar",src,trigger), 600) + for(var/obj/machinery/door/door in get_sub_areas_contents(src)) + close_and_lock_door(door) /area/proc/set_fire_alarm_effects(boolean) fire = boolean diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm index bfef66a594..68d32b8178 100644 --- a/code/game/area/areas/ruins/lavaland.dm +++ b/code/game/area/areas/ruins/lavaland.dm @@ -99,7 +99,6 @@ power_environ = FALSE power_equip = FALSE power_light = FALSE - poweralm = FALSE //ash walker nest /area/ruin/lavaland/unpowered/ash_walkers diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b6ab1af366..ce9ab30f2f 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -41,6 +41,8 @@ var/upgrades = 0 var/internal_light = TRUE //Whether it can light up when an AI views it + ///Represents a signel source of camera alarms about movement or camera tampering + var/datum/alarm_handler/alarm_manager /obj/machinery/camera/preset/toxins //Bomb test site in space name = "Hardened Bomb-Test Camera" @@ -72,6 +74,8 @@ if(mapload && is_station_level(z) && prob(3) && !start_active) toggle_cam() + alarm_manager = new(src) + /obj/machinery/camera/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) for(var/i in network) network -= i @@ -83,7 +87,8 @@ GLOB.cameranet.cameras -= src cancelCameraAlarm() if(isarea(myarea)) - myarea.clear_camera(src) + LAZYREMOVE(myarea.cameras, src) + QDEL_NULL(alarm_manager) QDEL_NULL(assembly) if(bug) bug.bugged_cameras -= c_tag @@ -347,13 +352,11 @@ /obj/machinery/camera/proc/triggerCameraAlarm() alarm_on = TRUE - for(var/mob/living/silicon/S in GLOB.silicon_mobs) - S.triggerAlarm("Camera", get_area(src), list(src), src) + alarm_manager.send_alarm(ALARM_CAMERA, src, src) /obj/machinery/camera/proc/cancelCameraAlarm() alarm_on = FALSE - for(var/mob/living/silicon/S in GLOB.silicon_mobs) - S.cancelAlarm("Camera", get_area(src), src) + alarm_manager.clear_alarm(ALARM_CAMERA) /obj/machinery/camera/proc/can_use() if(!status) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index 8cdee8c099..1f07f66369 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -51,21 +51,17 @@ cancelAlarm() /obj/machinery/camera/proc/cancelAlarm() - if (detectTime == -1) - for (var/i in GLOB.silicon_mobs) - var/mob/living/silicon/aiPlayer = i - if (status) - aiPlayer.cancelAlarm("Motion", get_area(src), src) + if (detectTime == -1 && status) + alarm_manager.clear_alarm(ALARM_MOTION) detectTime = 0 return TRUE /obj/machinery/camera/proc/triggerAlarm() if (!detectTime) return FALSE - for (var/mob/living/silicon/aiPlayer in GLOB.player_list) - if (status) - aiPlayer.triggerAlarm("Motion", get_area(src), list(src), src) - visible_message("A red light flashes on the [src]!") + if(status) + if(alarm_manager.send_alarm(ALARM_MOTION, src, src)) + visible_message(span_warning("A red light flashes on the [src]!")) detectTime = -1 return TRUE diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index df84d5a26a..ccac91d39a 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -4,91 +4,26 @@ icon_screen = "alert:0" icon_keyboard = "atmos_key" circuit = /obj/item/circuitboard/computer/stationalert - var/alarms = list("Fire" = list(), "Atmosphere" = list(), "Power" = list()) - light_color = LIGHT_COLOR_CYAN + /// Station alert datum for showing alerts UI + var/datum/station_alert/alert_control /obj/machinery/computer/station_alert/Initialize(mapload) - . = ..() - GLOB.alert_consoles += src - -/obj/machinery/computer/station_alert/Destroy() - GLOB.alert_consoles -= src + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z), title = name) return ..() -/obj/machinery/computer/station_alert/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "StationAlertConsole", name) - ui.open() +/obj/machinery/computer/station_alert/Destroy() + QDEL_NULL(alert_control) + return ..() -/obj/machinery/computer/station_alert/ui_data(mob/user) - var/list/data = list() +/obj/machinery/computer/station_alert/ui_interact(mob/user) + alert_control.ui_interact(user) - data["alarms"] = list() - for(var/class in alarms) - data["alarms"][class] = list() - for(var/area in alarms[class]) - data["alarms"][class] += area - - return data - -/obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/home, cameras, obj/source) - if(source.z != z) - return - if(stat & (BROKEN)) - return - - var/list/our_sort = alarms[class] - for(var/areaname in our_sort) - if (areaname == home.name) - var/list/alarm = our_sort[areaname] - var/list/sources = alarm[3] - if (!(source in sources)) - sources += source - return TRUE - - var/obj/machinery/camera/cam = null - var/list/our_cams = null - if(cameras && islist(cameras)) - our_cams = cameras - if (our_cams.len == 1) - cam = our_cams[1] - else if(cameras && istype(cameras, /obj/machinery/camera)) - cam = cameras - our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) - return TRUE - -/obj/machinery/computer/station_alert/proc/freeCamera(area/home, obj/machinery/camera/cam) - for(var/class in alarms) - var/our_area = alarms[class][home.name] - if(!our_area) - continue - var/cams = our_area[2] //Get the cameras - if(!cams) - continue - if(islist(cams)) - cams -= cam - if(length(cams) == 1) - our_area[2] = cams[1] - else - our_area[2] = null - -/obj/machinery/computer/station_alert/proc/cancelAlarm(class, area/A, obj/origin) - if(stat & (BROKEN)) - return - var/list/L = alarms[class] - var/cleared = 0 - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] - var/list/srcs = alarm[3] - if (origin in srcs) - srcs -= origin - if (srcs.len == 0) - cleared = 1 - L -= I - return !cleared +/obj/machinery/computer/station_alert/on_machine_stat_update(stat) + if(stat & BROKEN) + alert_control.listener.prevent_alarm_changes() + else + alert_control.listener.allow_alarm_changes() /obj/machinery/computer/station_alert/update_overlays() . = ..() @@ -98,12 +33,7 @@ . |= "[icon_keyboard]_off" return . |= icon_keyboard - var/active_alarms = FALSE - for(var/cat in alarms) - if(length(alarms[cat])) - active_alarms = TRUE - break - if(active_alarms) + if(length(alert_control.listener.alarms)) overlay_state = "alert:2" else overlay_state = "alert:0" diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 4b0b20c8ef..3ac4981927 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -226,7 +226,7 @@ icon_state = "cyborg_upgrade3" require_module = TRUE module_type = list(/obj/item/robot_module/miner) - module_flags = BORG_MODULE_MINER // SANDSTORM EDIT + module_flags = BORG_MODULE_MINER /obj/item/borg/upgrade/premiumka/action(mob/living/silicon/robot/R, user = usr) . = ..() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 88b66e2056..f5c886c024 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -19,6 +19,8 @@ var/start_showpiece_type = null //add type for items on display var/list/start_showpieces = list() //Takes sublists in the form of list("type" = /obj/item/bikehorn, "trophy_message" = "henk") var/trophy_message = "" + ///Represents a signel source of screaming when broken + var/datum/alarm_handler/alarm_manager /obj/structure/displaycase/Initialize(mapload) . = ..() @@ -31,20 +33,20 @@ if(start_showpiece_type) showpiece = new start_showpiece_type (src) update_icon() + alarm_manager = new(src) /obj/structure/displaycase/Destroy() - if(electronics) - QDEL_NULL(electronics) - if(showpiece) - QDEL_NULL(showpiece) + QDEL_NULL(electronics) + QDEL_NULL(showpiece) + QDEL_NULL(alarm_manager) return ..() /obj/structure/displaycase/examine(mob/user) . = ..() if(alert) - . += "Hooked up with an anti-theft system." + . += span_notice("Hooked up with an anti-theft system.") if(showpiece) - . += "There's [showpiece] inside." + . += span_notice("There's [showpiece] inside.") if(trophy_message) . += "The plaque reads:" . += trophy_message @@ -79,12 +81,17 @@ update_icon() trigger_alarm() +///Anti-theft alarm triggered when broken. /obj/structure/displaycase/proc/trigger_alarm() - //Activate Anti-theft - if(alert) - var/area/alarmed = get_base_area(src) - alarmed.burglaralert(src) - playsound(src, 'sound/effects/alert.ogg', 50, 1) + if(!alert) + return + var/area/alarmed = get_area(src) + alarmed.burglaralert(src) + + alarm_manager.send_alarm(ALARM_BURGLAR) + addtimer(CALLBACK(alarm_manager, /datum/alarm_handler/proc/clear_alarm, ALARM_BURGLAR), 1 MINUTES) + + playsound(src, 'sound/effects/alert.ogg', 50, TRUE) /obj/structure/displaycase/update_icon_state() var/icon/I @@ -104,46 +111,46 @@ /obj/structure/displaycase/attackby(obj/item/W, mob/user, params) if(W.GetID() && !broken && openable) if(allowed(user)) - to_chat(user, "You [open ? "close":"open"] [src].") + to_chat(user, span_notice("You [open ? "close":"open"] [src].")) toggle_lock(user) else - to_chat(user, "Access denied.") + to_chat(user, span_alert("Access denied.")) else if(W.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP && !broken) if(obj_integrity < max_integrity) if(!W.tool_start_check(user, amount=5)) return - to_chat(user, "You begin repairing [src].") + to_chat(user, span_notice("You begin repairing [src].")) if(W.use_tool(src, user, 40, amount=5, volume=50)) obj_integrity = max_integrity update_icon() - to_chat(user, "You repair [src].") + to_chat(user, span_notice("You repair [src].")) else - to_chat(user, "[src] is already in good condition!") + to_chat(user, span_warning("[src] is already in good condition!")) return else if(!alert && W.tool_behaviour == TOOL_CROWBAR && openable) //Only applies to the lab cage and player made display cases if(broken) if(showpiece) - to_chat(user, "Remove the displayed object first.") + to_chat(user, span_notice("Remove the displayed object first.")) else - to_chat(user, "You remove the destroyed case") + to_chat(user, span_notice("You remove the destroyed case")) qdel(src) else - to_chat(user, "You start to [open ? "close":"open"] [src].") + to_chat(user, span_notice("You start to [open ? "close":"open"] [src].")) if(W.use_tool(src, user, 20)) - to_chat(user, "You [open ? "close":"open"] [src].") + to_chat(user, span_notice("You [open ? "close":"open"] [src].")) toggle_lock(user) else if(open && !showpiece) if(user.transferItemToLoc(W, src)) showpiece = W - to_chat(user, "You put [W] on display") + to_chat(user, span_notice("You put [W] on display")) update_icon() else if(istype(W, /obj/item/stack/sheet/glass) && broken) var/obj/item/stack/sheet/glass/G = W if(G.get_amount() < 2) - to_chat(user, "You need two glass sheets to fix the case!") + to_chat(user, span_warning("You need two glass sheets to fix the case!")) return - to_chat(user, "You start fixing [src]...") + to_chat(user, span_notice("You start fixing [src]...")) if(do_after(user, 20, target = src)) G.use(2) broken = 0 @@ -161,7 +168,7 @@ /obj/structure/displaycase/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) if (showpiece && (broken || open)) - to_chat(user, "You deactivate the hover field built into the case.") + to_chat(user, span_notice("You deactivate the hover field built into the case.")) log_combat(user, src, "deactivates the hover field of") dump() src.add_fingerprint(user) @@ -171,7 +178,7 @@ //prevents remote "kicks" with TK if (!Adjacent(user)) return - user.visible_message("[user] kicks the display case.", null, null, COMBAT_MESSAGE_RANGE) + user.visible_message(span_danger("[user] kicks the display case."), null, null, COMBAT_MESSAGE_RANGE) log_combat(user, src, "kicks") user.do_attack_animation(src, ATTACK_EFFECT_KICK) take_damage(2) @@ -188,7 +195,7 @@ /obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WRENCH) //The player can only deconstruct the wooden frame - to_chat(user, "You start disassembling [src]...") + to_chat(user, span_notice("You start disassembling [src]...")) I.play_tool_sound(src) if(I.use_tool(src, user, 30)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) @@ -196,18 +203,18 @@ qdel(src) else if(istype(I, /obj/item/electronics/airlock)) - to_chat(user, "You start installing the electronics into [src]...") + to_chat(user, span_notice("You start installing the electronics into [src]...")) I.play_tool_sound(src) if(do_after(user, 30, target = src) && user.transferItemToLoc(I,src)) electronics = I - to_chat(user, "You install the airlock electronics.") + to_chat(user, span_notice("You install the airlock electronics.")) else if(istype(I, /obj/item/stack/sheet/glass)) var/obj/item/stack/sheet/glass/G = I if(G.get_amount() < 10) - to_chat(user, "You need ten glass sheets to do this!") + to_chat(user, span_warning("You need ten glass sheets to do this!")) return - to_chat(user, "You start adding [G] to [src]...") + to_chat(user, span_notice("You start adding [G] to [src]...")) if(do_after(user, 20, target = src)) G.use(10) var/obj/structure/displaycase/display = new(src.loc) @@ -272,11 +279,11 @@ is_locked = !is_locked to_chat(user, "You [!is_locked ? "un" : ""]lock the case.") else - to_chat(user, "The lock is stuck shut!") + to_chat(user, span_danger("The lock is stuck shut!")) return if(is_locked) - to_chat(user, "The case is shut tight with an old fashioned physical lock. Maybe you should ask the curator for the key?") + to_chat(user, span_danger("The case is shut tight with an old fashioned physical lock. Maybe you should ask the curator for the key?")) return if(!added_roundstart) @@ -284,12 +291,12 @@ return if(is_type_in_typecache(W, GLOB.blacklisted_cargo_types)) - to_chat(user, "The case rejects the [W].") + to_chat(user, span_danger("The case rejects the [W].")) return for(var/a in W.GetAllContents()) if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types)) - to_chat(user, "The case rejects the [W].") + to_chat(user, span_danger("The case rejects the [W].")) return if(user.transferItemToLoc(W, src)) @@ -319,14 +326,14 @@ return TRUE else - to_chat(user, "\The [W] is stuck to your hand, you can't put it in the [src.name]!") + to_chat(user, span_warning("\The [W] is stuck to your hand, you can't put it in the [src.name]!")) return /obj/structure/displaycase/trophy/dump() if (showpiece) if(added_roundstart) - visible_message("The [showpiece] crumbles to dust!") + visible_message(span_danger("The [showpiece] crumbles to dust!")) new /obj/effect/decal/cleanable/ash(loc) QDEL_NULL(showpiece) else @@ -412,32 +419,32 @@ switch(action) if("Buy") if(!showpiece) - to_chat(usr, "There's nothing for sale.") + to_chat(usr, span_notice("There's nothing for sale.")) return TRUE if(broken) - to_chat(usr, "[src] appears to be broken.") + to_chat(usr, span_notice("[src] appears to be broken.")) return TRUE if(!payments_acc) - to_chat(usr, "[src] hasn't been registered yet.") + to_chat(usr, span_notice("[src] hasn't been registered yet.")) return TRUE if(!usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return TRUE if(!potential_acc) - to_chat(usr, "No ID card detected.") + to_chat(usr, span_notice("No ID card detected.")) return var/datum/bank_account/account = potential_acc.registered_account if(!account) - to_chat(usr, "[potential_acc] has no account registered!") + to_chat(usr, span_notice("[potential_acc] has no account registered!")) return if(!account.has_money(sale_price)) - to_chat(usr, "You do not possess the funds to purchase this.") + to_chat(usr, span_notice("You do not possess the funds to purchase this.")) return TRUE else account.adjust_money(-sale_price) if(payments_acc) payments_acc.adjust_money(sale_price) usr.put_in_hands(showpiece) - to_chat(usr, "You purchase [showpiece] for [sale_price] credits.") + to_chat(usr, span_notice("You purchase [showpiece] for [sale_price] credits.")) // playsound(src, 'sound/effects/cashregister.ogg', 40, TRUE) icon = 'icons/obj/stationobjs.dmi' flick("laserbox_vend", src) @@ -447,7 +454,7 @@ return TRUE if("Open") if(!payments_acc) - to_chat(usr, "[src] hasn't been registered yet.") + to_chat(usr, span_notice("[src] hasn't been registered yet.")) return TRUE if(!potential_acc || !potential_acc.registered_account) return @@ -473,14 +480,14 @@ var/new_price_input = input(usr,"Set the sale price for this vend-a-tray.","new price",0) as num|null if(isnull(new_price_input) || (payments_acc != potential_acc.registered_account)) - to_chat(usr, "[src] rejects your new price.") + to_chat(usr, span_warning("[src] rejects your new price.")) return if(!usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) ) - to_chat(usr, "You need to get closer!") + to_chat(usr, span_warning("You need to get closer!")) return new_price_input = clamp(round(new_price_input, 1), 10, 1000) sale_price = new_price_input - to_chat(usr, "The cost is now set to [sale_price].") + to_chat(usr, span_notice("The cost is now set to [sale_price].")) SStgui.update_uis(src) return TRUE . = TRUE @@ -489,7 +496,7 @@ //Card Registration var/obj/item/card/id/potential_acc = I if(!potential_acc.registered_account) - to_chat(user, "This ID card has no account registered!") + to_chat(user, span_warning("This ID card has no account registered!")) return if(payments_acc == potential_acc.registered_account) playsound(src, 'sound/machines/click.ogg', 20, TRUE) @@ -504,7 +511,7 @@ /obj/structure/displaycase/forsale/multitool_act(mob/living/user, obj/item/I) . = ..() if(obj_integrity <= (integrity_failure * max_integrity)) - to_chat(user, "You start recalibrating [src]'s hover field...") + to_chat(user, span_notice("You start recalibrating [src]'s hover field...")) if(do_after(user, 20, target = src)) broken = 0 obj_integrity = max_integrity @@ -515,34 +522,34 @@ . = ..() if(open && user.a_intent == INTENT_HELP ) if(anchored) - to_chat(user, "You start unsecuring [src]...") + to_chat(user, span_notice("You start unsecuring [src]...")) else - to_chat(user, "You start securing [src]...") + to_chat(user, span_notice("You start securing [src]...")) if(I.use_tool(src, user, 16, volume=50)) if(QDELETED(I)) return if(anchored) - to_chat(user, "You unsecure [src].") + to_chat(user, span_notice("You unsecure [src].")) else - to_chat(user, "You secure [src].") + to_chat(user, span_notice("You secure [src].")) anchored = !anchored return else if(!open && user.a_intent == INTENT_HELP) - to_chat(user, "[src] must be open to move it.") + to_chat(user, span_notice("[src] must be open to move it.")) return /obj/structure/displaycase/forsale/emag_act(mob/user) . = ..() payments_acc = null req_access = list() - to_chat(user, "[src]'s card reader fizzles and smokes, and the account owner is reset.") + to_chat(user, span_warning("[src]'s card reader fizzles and smokes, and the account owner is reset.")) /obj/structure/displaycase/forsale/examine(mob/user) . = ..() if(showpiece && !open) - . += "[showpiece] is for sale for [sale_price] credits." + . += span_notice("[showpiece] is for sale for [sale_price] credits.") if(broken) - . += "[src] is sparking and the hover field generator seems to be overloaded. Use a multitool to fix it." + . += span_notice("[src] is sparking and the hover field generator seems to be overloaded. Use a multitool to fix it.") /obj/structure/displaycase/forsale/obj_break(damage_flag) if(!broken && !(flags_1 & NODECONSTRUCT_1)) diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index abfb7ca899..0e36d8dfdd 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -90,6 +90,9 @@ var/frequency = FREQ_ATMOS_CONTROL var/alarm_frequency = FREQ_ATMOS_ALARMS var/datum/radio_frequency/radio_connection + ///Represents a signel source of atmos alarms, complains to all the listeners if one of our thresholds is violated + var/datum/alarm_handler/alarm_manager + var/list/TLV = list( // Breathable air. "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), @@ -231,6 +234,7 @@ if(name == initial(name)) name = "[get_area_name(src, get_base_area = TRUE)] Air Alarm" + alarm_manager = new(src) power_change() set_frequency(frequency) register_context() @@ -242,10 +246,8 @@ /obj/machinery/airalarm/Destroy() SSradio.remove_object(src, frequency) - qdel(wires) - wires = null - var/area/ourarea = get_area(src) - ourarea.atmosalert(FALSE, src) + QDEL_NULL(wires) + QDEL_NULL(alarm_manager) return ..() /obj/machinery/airalarm/examine(mob/user) @@ -289,7 +291,7 @@ ) var/area/A = get_base_area(src) - data["atmos_alarm"] = A.atmosalm + data["atmos_alarm"] = !!A.active_alarms[ALARM_ATMOS] data["fire_alarm"] = A.fire var/turf/T = get_turf(src) @@ -464,13 +466,11 @@ apply_mode() . = TRUE if("alarm") - var/area/A = get_base_area(src) - if(A.atmosalert(2, src)) + if(alarm_manager.send_alarm(ALARM_ATMOS)) post_alert(2) . = TRUE if("reset") - var/area/A = get_base_area(src) - if(A.atmosalert(0, src)) + if(alarm_manager.clear_alarm(ALARM_ATMOS)) post_alert(0) . = TRUE update_icon() @@ -706,8 +706,8 @@ . = ..() SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) var/overlay_state = AALARM_OVERLAY_OFF - var/area/A = get_base_area(src) - switch(max(danger_level, A.atmosalm)) + var/area/our_area = get_base_area(src) + switch(max(danger_level, !!our_area.active_alarms[ALARM_ATMOS])) if(0) overlay_state = AALARM_OVERLAY_GREEN light_color = LIGHT_COLOR_GREEN @@ -788,12 +788,17 @@ /obj/machinery/airalarm/proc/apply_danger_level() var/area/A = get_base_area(src) - var/new_area_danger_level = 0 for(var/obj/machinery/airalarm/AA in A) if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted) - new_area_danger_level = max(new_area_danger_level,AA.danger_level) - if(A.atmosalert(new_area_danger_level,src)) //if area was in normal state or if area was in alert state + new_area_danger_level = clamp(max(new_area_danger_level, AA.danger_level), 0, 1) + + var/did_anything_happen + if(new_area_danger_level) + did_anything_happen = alarm_manager.send_alarm(ALARM_ATMOS) + else + did_anything_happen = alarm_manager.clear_alarm(ALARM_ATMOS) + if(did_anything_happen) //if something actually changed post_alert(new_area_danger_level) update_icon() diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm index c0af9cd08c..7709098405 100644 --- a/code/modules/awaymissions/mission_code/moonoutpost19.dm +++ b/code/modules/awaymissions/mission_code/moonoutpost19.dm @@ -23,7 +23,6 @@ power_environ = FALSE power_equip = FALSE power_light = FALSE - poweralm = FALSE ambientsounds = list('sound/ambience/ambimine.ogg') icon_state = "awaycontent5" @@ -33,7 +32,6 @@ power_environ = FALSE power_equip = FALSE power_light = FALSE - poweralm = FALSE icon_state = "awaycontent6" //Papers diff --git a/code/modules/awaymissions/mission_code/undergroundoutpost45.dm b/code/modules/awaymissions/mission_code/undergroundoutpost45.dm index 4153032024..7ec7d7728f 100644 --- a/code/modules/awaymissions/mission_code/undergroundoutpost45.dm +++ b/code/modules/awaymissions/mission_code/undergroundoutpost45.dm @@ -36,4 +36,3 @@ power_environ = FALSE power_equip = FALSE power_light = FALSE - poweralm = FALSE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index bca3903efb..2d5cd2027b 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -981,10 +981,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( addtimer(CALLBACK(SSassets.transport, TYPE_PROC_REF(/datum/asset_transport, send_assets_slow), src, SSassets.transport.preload), 5 SECONDS) #if (PRELOAD_RSC == 0) - for (var/name in GLOB.vox_sounds) - var/file = GLOB.vox_sounds[name] - Export("##action=load_rsc", file) - stoplag() + for (var/type in GLOB.vox_types) + for(var/word in GLOB.vox_types[type]) + var/file = GLOB.vox_types[type][word] + Export("##action=load_rsc", file) + stoplag() #endif diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 512b4f3dd2..98137ee76c 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -226,15 +226,28 @@ spawn_flags = IC_SPAWN_RESEARCH /obj/item/integrated_circuit/output/sound/vox - name = "ai vox sound circuit" + name = "Female ai vox sound circuit" desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit is often found in AI announcement systems." spawn_flags = IC_SPAWN_RESEARCH + var/voice_type = "Female" /obj/item/integrated_circuit/output/sound/vox/Initialize(mapload) - .= ..() - sounds = GLOB.vox_sounds + sounds = GLOB.vox_types[voice_type] + . = ..() extended_desc = "The first input pin determines which sound is used. It uses the AI Vox Broadcast word list. So either experiment to find words that work, or ask the AI to help in figuring them out. The second pin determines the volume of sound that is played, and the third determines if the frequency of the sound will vary with each activation." +/obj/item/integrated_circuit/output/sound/vox/male + name = "Male ai vox sound circuit" + desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit is often found in AI announcement systems." + spawn_flags = IC_SPAWN_RESEARCH + voice_type = "Male" + +/obj/item/integrated_circuit/output/sound/vox/military + name = "Military ai vox sound circuit" + desc = "Takes a sound name as an input, and will play said sound when pulsed. This circuit is often found in AI announcement systems." + spawn_flags = IC_SPAWN_RESEARCH + voice_type = "Military" + /obj/item/integrated_circuit/output/text_to_speech name = "text-to-speech circuit" desc = "Takes any string as an input and will make the device say the string when pulsed." diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index d491ac7d77..d81684044c 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -76,6 +76,9 @@ var/bounty_types = CIV_JOB_BASIC + ///Bitfield of departments this job belongs wit + var/departments = NONE + /// Goodies that can be received via the mail system. // this is a weighted list. /// Keep the _job definition for this empty and use /obj/item/mail to define general gifts. diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index 526f541443..2dc575145e 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -15,6 +15,7 @@ exp_type_department = EXP_TYPE_SILICON display_order = JOB_DISPLAY_ORDER_AI allow_bureaucratic_error = FALSE + departments = DEPARTMENT_BITFLAG_SILICON random_spawns_possible = FALSE var/do_special_check = TRUE threat = 5 diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 90ac6be8dd..3a2335bb11 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -16,6 +16,7 @@ Assistant antag_rep = 7 paycheck = PAYCHECK_ASSISTANT // Get a job. Job reassignment changes your paycheck now. Get over it. paycheck_department = ACCOUNT_CIV + departments = DEPARTMENT_BITFLAG_SERVICE display_order = JOB_DISPLAY_ORDER_ASSISTANT dresscodecompliant = FALSE always_can_respawn_as = TRUE diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 551ac63d00..4b17fc8b9f 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -21,12 +21,13 @@ paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_ENG bounty_types = CIV_JOB_ENG + departments = DEPARTMENT_BITFLAG_ENGINEERING starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring) display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN threat = 0.5 - + family_heirlooms = list( /obj/item/lighter, /obj/item/lighter/greyscale, diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index bde15b24db..6d8f4256b5 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -18,6 +18,7 @@ paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV bounty_types = CIV_JOB_DRINK + departments = DEPARTMENT_BITFLAG_SERVICE display_order = JOB_DISPLAY_ORDER_BARTENDER threat = 0.5 diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index fcd71d7275..f30375201e 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -17,6 +17,7 @@ paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV bounty_types = CIV_JOB_GROW + departments = DEPARTMENT_BITFLAG_SERVICE display_order = JOB_DISPLAY_ORDER_BOTANIST threat = 1.5 // lol powergame diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 00fb4822e2..fe594e4660 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -29,6 +29,7 @@ mind_traits = list(TRAIT_CAPTAIN_METABOLISM, TRAIT_DISK_VERIFIER) display_order = JOB_DISPLAY_ORDER_CAPTAIN + departments = DEPARTMENT_BITFLAG_COMMAND blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 5 diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 823aec3078..7c42e1a8ba 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -20,6 +20,7 @@ display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN bounty_types = CIV_JOB_RANDOM + departments = DEPARTMENT_BITFLAG_SUPPLY threat = 0.2 family_heirlooms = list( diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 8240b457c9..0c526b3bce 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -18,6 +18,7 @@ paycheck_department = ACCOUNT_CIV display_order = JOB_DISPLAY_ORDER_CHAPLAIN + departments = DEPARTMENT_BITFLAG_SERVICE threat = 0.5 family_heirlooms = list( diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index be145b24b2..317b9f7a33 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -19,6 +19,7 @@ paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED bounty_types = CIV_JOB_CHEM + departments = DEPARTMENT_BITFLAG_MEDICAL display_order = JOB_DISPLAY_ORDER_CHEMIST threat = 1.5 diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 5ec4cca512..0e0083bd3c 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -18,6 +18,7 @@ considered_combat_role = TRUE outfit = /datum/outfit/job/ce + departments = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_COMMAND plasma_outfit = /datum/outfit/plasmaman/ce access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index ed58d67a1f..3472052b53 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -18,6 +18,7 @@ considered_combat_role = TRUE outfit = /datum/outfit/job/cmo + departments = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_COMMAND plasma_outfit = /datum/outfit/plasmaman/cmo access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index c54fb13c0a..009560d7c7 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -10,6 +10,7 @@ selection_color = "#dddddd" outfit = /datum/outfit/job/clown + departments = DEPARTMENT_BITFLAG_SERVICE plasma_outfit = /datum/outfit/plasmaman/clown access = list(ACCESS_THEATRE) diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 246f8d002f..b3d3180367 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -18,6 +18,7 @@ paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV bounty_types = CIV_JOB_CHEF + departments = DEPARTMENT_BITFLAG_SERVICE display_order = JOB_DISPLAY_ORDER_COOK threat = 0.2 diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index e6e9394109..6b5707d76f 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -18,8 +18,9 @@ paycheck_department = ACCOUNT_CIV display_order = JOB_DISPLAY_ORDER_CURATOR + departments = DEPARTMENT_BITFLAG_SERVICE threat = 0.3 - + family_heirlooms = list( /obj/item/pen/fountain, /obj/item/storage/dice diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index e9f1c7f57a..c76747c592 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -16,6 +16,7 @@ starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic) display_order = JOB_DISPLAY_ORDER_CYBORG + departments = DEPARTMENT_BITFLAG_SILICON /datum/job/cyborg/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source = null) if(visualsOnly) diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 75fddc9bbc..dd836de146 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -14,6 +14,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/detective + departments = DEPARTMENT_BITFLAG_SECURITY plasma_outfit = /datum/outfit/plasmaman/detective considered_combat_role = TRUE diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index fb830b3ece..46125339be 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -12,6 +12,7 @@ exp_requirements = 60 outfit = /datum/outfit/job/geneticist + departments = DEPARTMENT_BITFLAG_MEDICAL plasma_outfit = /datum/outfit/plasmaman/genetics access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 22e0fd8d5f..a8c8eac0ab 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -17,6 +17,7 @@ exp_type_department = EXP_TYPE_SERVICE considered_combat_role = TRUE outfit = /datum/outfit/job/hop + departments = DEPARTMENT_BITFLAG_COMMAND | DEPARTMENT_BITFLAG_SERVICE plasma_outfit = /datum/outfit/plasmaman/hop access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index c998580cae..4a5f0a6280 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -18,6 +18,7 @@ exp_type_department = EXP_TYPE_SECURITY outfit = /datum/outfit/job/hos + departments = DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_COMMAND plasma_outfit = /datum/outfit/plasmaman/hos mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index f7e79cb769..fcfbc92e40 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -18,6 +18,7 @@ paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_JANITOR + departments = DEPARTMENT_BITFLAG_SERVICE threat = 0.2 family_heirlooms = list( diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 4105bd4e6e..8df949a143 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -21,8 +21,9 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_LAWYER + departments = DEPARTMENT_BITFLAG_SERVICE threat = 0.3 - + family_heirlooms = list( /obj/item/gavelhammer, /obj/item/book/manual/wiki/security_space_law diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index b9a313d0e7..52a668b182 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -10,6 +10,7 @@ selection_color = "#74b5e0" outfit = /datum/outfit/job/doctor + departments = DEPARTMENT_BITFLAG_MEDICAL plasma_outfit = /datum/outfit/plasmaman/medical access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 3929b22f9d..2813c32e14 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -18,6 +18,7 @@ paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_MIME + departments = DEPARTMENT_BITFLAG_SERVICE threat = 0 diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 177610bdc6..533475ca78 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -17,6 +17,7 @@ paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED bounty_types = CIV_JOB_MED + departments = DEPARTMENT_BITFLAG_MEDICAL display_order = JOB_DISPLAY_ORDER_PARAMEDIC diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 5de351573f..732ac03016 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -13,6 +13,7 @@ plasma_outfit = /datum/outfit/plasmaman/prisoner display_order = JOB_DISPLAY_ORDER_PRISONER + departments = DEPARTMENT_BITFLAG_SECURITY family_heirlooms = list( /obj/item/pen/blue diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index e2c5c7ad8b..47f9b657d6 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -29,6 +29,7 @@ paycheck = PAYCHECK_HARD //They can already buy stuff using cargo budget, don't give em a command-level paycheck. //alright i'll agree to that -qweq paycheck_department = ACCOUNT_CAR bounty_types = CIV_JOB_RANDOM + departments = DEPARTMENT_BITFLAG_SUPPLY | DEPARTMENT_BITFLAG_COMMAND display_order = JOB_DISPLAY_ORDER_QUARTERMASTER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index f4589cae3d..89c9aafeb4 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -18,6 +18,7 @@ considered_combat_role = TRUE outfit = /datum/outfit/job/rd + departments = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_COMMAND plasma_outfit = /datum/outfit/plasmaman/rd access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 089e5cf506..097023e643 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -12,6 +12,7 @@ exp_type = EXP_TYPE_CREW outfit = /datum/outfit/job/roboticist + departments = DEPARTMENT_BITFLAG_SCIENCE plasma_outfit = /datum/outfit/plasmaman/robotics access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS) diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 5fcfb7e6f6..f7d5c4a11c 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -19,6 +19,7 @@ paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_SCI bounty_types = CIV_JOB_SCI + departments = DEPARTMENT_BITFLAG_SCIENCE starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic) display_order = JOB_DISPLAY_ORDER_SCIENTIST threat = 1.2 diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 966d7677ac..4aa043ac4a 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -22,6 +22,7 @@ paycheck = PAYCHECK_HARD paycheck_department = ACCOUNT_SEC bounty_types = CIV_JOB_SEC + departments = DEPARTMENT_BITFLAG_SECURITY mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index c6192280c7..714ce1e9aa 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -20,11 +20,12 @@ paycheck = PAYCHECK_EASY ///Not necessarily easy itself, but it can be trivial to make lot of cash on this job. paycheck_department = ACCOUNT_CAR bounty_types = CIV_JOB_MINE + departments = DEPARTMENT_BITFLAG_SUPPLY display_order = JOB_DISPLAY_ORDER_SHAFT_MINER threat = 1.5 - + family_heirlooms = list( /obj/item/pickaxe/mini, /obj/item/shovel diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index d8ea7e1df5..3ae4adb49b 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -21,6 +21,7 @@ paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_ENG bounty_types = CIV_JOB_ENG + departments = DEPARTMENT_BITFLAG_ENGINEERING starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring) diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index e5c64acbc8..b9103af84b 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -19,6 +19,7 @@ paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED bounty_types = CIV_JOB_VIRO + departments = DEPARTMENT_BITFLAG_MEDICAL display_order = JOB_DISPLAY_ORDER_VIROLOGIST diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index eda6257653..7ab010b356 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -23,6 +23,7 @@ paycheck = PAYCHECK_HARD paycheck_department = ACCOUNT_SEC bounty_types = CIV_JOB_SEC + departments = DEPARTMENT_BITFLAG_SECURITY mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm index 9ba8d96d5e..cd53a3632d 100644 --- a/code/modules/mapping/space_management/traits.dm +++ b/code/modules/mapping/space_management/traits.dm @@ -1,4 +1,4 @@ -// Look up levels[z].traits[trait] +/// Look up levels[z].traits[trait] /datum/controller/subsystem/mapping/proc/level_trait(z, trait) if (!isnum(z) || z < 1) return null @@ -15,21 +15,21 @@ return list() return default[z][DL_TRAITS][trait] -// Check if levels[z] has any of the specified traits +/// Check if levels[z] has any of the specified traits /datum/controller/subsystem/mapping/proc/level_has_any_trait(z, list/traits) for (var/I in traits) if (level_trait(z, I)) return TRUE return FALSE -// Check if levels[z] has all of the specified traits +/// Check if levels[z] has all of the specified traits /datum/controller/subsystem/mapping/proc/level_has_all_traits(z, list/traits) for (var/I in traits) if (!level_trait(z, I)) return FALSE return TRUE -// Get a list of all z which have the specified trait +/// Get a list of all z which have the specified trait /datum/controller/subsystem/mapping/proc/levels_by_trait(trait) . = list() var/list/_z_list = z_list @@ -38,7 +38,7 @@ if (S.traits[trait]) . += S.z_value -// Get a list of all z which have any of the specified traits +/// Get a list of all z which have any of the specified traits /datum/controller/subsystem/mapping/proc/levels_by_any_trait(list/traits) . = list() var/list/_z_list = z_list @@ -49,7 +49,7 @@ . += S.z_value break -// Attempt to get the turf below the provided one according to Z traits +/// Attempt to get the turf below the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_below(turf/T) if (!T) return @@ -58,7 +58,7 @@ return return locate(T.x, T.y, T.z + offset) -// Attempt to get the turf above the provided one according to Z traits +/// Attempt to get the turf above the provided one according to Z traits /datum/controller/subsystem/mapping/proc/get_turf_above(turf/T) if (!T) return @@ -67,7 +67,7 @@ return return locate(T.x, T.y, T.z + offset) -// Prefer not to use this one too often +/// Prefer not to use this one too often /datum/controller/subsystem/mapping/proc/get_station_center() var/station_z = levels_by_trait(ZTRAIT_STATION)[1] return locate(round(world.maxx * 0.5, 1), round(world.maxy * 0.5, 1), station_z) diff --git a/code/modules/mob/dead/crew_manifest.dm b/code/modules/mob/dead/crew_manifest.dm new file mode 100644 index 0000000000..5f6dd5671c --- /dev/null +++ b/code/modules/mob/dead/crew_manifest.dm @@ -0,0 +1,52 @@ +/datum/crew_manifest + +/datum/crew_manifest/ui_state(mob/user) + return GLOB.always_state + +/datum/crew_manifest/ui_status(mob/user, datum/ui_state/state) + return (isnewplayer(user) || isobserver(user) || isAI(user) || ispAI(user)) ? UI_INTERACTIVE : UI_CLOSE + +/datum/crew_manifest/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "CrewManifest") + ui.open() + +/datum/crew_manifest/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if (..()) + return + +/datum/crew_manifest/ui_data(mob/user) + var/list/positions = list( + DEPARTMENT_COMMAND = 0, + DEPARTMENT_SECURITY = 0, + DEPARTMENT_ENGINEERING = 0, + DEPARTMENT_MEDICAL = 0, + DEPARTMENT_SCIENCE = 0, + DEPARTMENT_SUPPLY = 0, + DEPARTMENT_SERVICE = 0, + DEPARTMENT_SILICON = 0 + ) + var/list/departments = list( + list("flag" = DEPARTMENT_BITFLAG_COMMAND, "name" = DEPARTMENT_COMMAND), + list("flag" = DEPARTMENT_BITFLAG_SECURITY, "name" = DEPARTMENT_SECURITY), + list("flag" = DEPARTMENT_BITFLAG_ENGINEERING, "name" = DEPARTMENT_ENGINEERING), + list("flag" = DEPARTMENT_BITFLAG_MEDICAL, "name" = DEPARTMENT_MEDICAL), + list("flag" = DEPARTMENT_BITFLAG_SCIENCE, "name" = DEPARTMENT_SCIENCE), + list("flag" = DEPARTMENT_BITFLAG_SUPPLY, "name" = DEPARTMENT_SUPPLY), + list("flag" = DEPARTMENT_BITFLAG_SERVICE, "name" = DEPARTMENT_SERVICE), + list("flag" = DEPARTMENT_BITFLAG_SILICON, "name" = DEPARTMENT_SILICON) + ) + + for(var/datum/job/job in SSjob.occupations) + for(var/department in departments) + // Check if the job is part of a department using its flag + // Will return true for Research Director if the department is Science or Command, for example + if(job.departments & department["flag"]) + // Add open positions to current department + positions[department["name"]] += (job.total_positions - job.current_positions) + + return list( + "manifest" = GLOB.data_core.get_manifest(), + "positions" = positions + ) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index f9cd9f749a..b001d08d9c 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -738,11 +738,10 @@ return client.crew_manifest_delay = world.time + (1 SECONDS) - var/dat = "" - dat += "

Crew Manifest

" - dat += GLOB.data_core.get_manifest(OOC = 1) + if(!GLOB.crew_manifest_tgui) + GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - src << browse(dat, "window=manifest;size=387x420;can_close=1") + GLOB.crew_manifest_tgui.ui_interact(src) /mob/dead/new_player/Move() return FALSE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 41dd7f3630..c4a755cc2e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -732,11 +732,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return client.crew_manifest_delay = world.time + (1 SECONDS) - var/dat - dat += "

Crew Manifest

" - dat += GLOB.data_core.get_manifest() + if(!GLOB.crew_manifest_tgui) + GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - src << browse(dat, "window=manifest;size=387x420;can_close=1") + GLOB.crew_manifest_tgui.ui_interact(src) //this is called when a ghost is drag clicked to something. /mob/dead/observer/MouseDrop(atom/over) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f12d4207a1..dce6233112 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -37,8 +37,6 @@ var/aiRestorePowerRoutine = 0 var/requires_power = POWER_REQ_ALL var/can_be_carded = TRUE - var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) - var/viewalerts = 0 var/icon/holo_icon //Female is assigned when AI is created. var/obj/controlled_equipment //A piece of equipment, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. @@ -101,9 +99,12 @@ var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it. var/datum/robot_control/robot_control - // TODO: Currently unused, needs port from TG. /// Station alert datum for showing alerts UI var/datum/station_alert/alert_control + /// Announcement UI + var/datum/ai_announcement/ai_announcement + /// Lists possible spoken words for announcements + var/datum/announcement_help/announcement_help ///remember AI's last location var/atom/lastloc interaction_range = INFINITY @@ -185,6 +186,9 @@ builtInCamera = new (src) builtInCamera.network = list("ss13") + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), list(z), camera_view = TRUE) + RegisterSignal(alert_control.listener, COMSIG_ALARM_TRIGGERED, PROC_REF(alarm_triggered)) + RegisterSignal(alert_control.listener, COMSIG_ALARM_CLEARED, PROC_REF(alarm_cleared)) /mob/living/silicon/ai/Destroy() GLOB.ai_list -= src @@ -203,7 +207,9 @@ QDEL_NULL(malf_picker) QDEL_NULL(doomsday_device) QDEL_NULL(robot_control) - // QDEL_NULL(alert_control) + QDEL_NULL(alert_control) + QDEL_NULL(ai_announcement) + QDEL_NULL(announcement_help) QDEL_NULL(aiMulti) QDEL_NULL(aiPDA) malfhack = null @@ -257,12 +263,12 @@ /mob/living/silicon/ai/get_status_tab_items() . = ..() if(stat != CONSCIOUS) - . += text("Systems nonfunctional") + . += "Systems nonfunctional" return - . += text("System integrity: [(health + 100) * 0.5]%") + . += "System integrity: [(health + 100) * 0.5]%" if(isturf(loc)) //only show if we're "in" a core . += "Backup Power: [battery * 0.5]%" - . += text("Connected cyborgs: [length(connected_robots)]") + . += "Connected cyborgs: [length(connected_robots)]" for(var/r in connected_robots) var/mob/living/silicon/robot/connected_robot = r var/robot_status = "Nominal" @@ -273,42 +279,9 @@ else if(!connected_robot.cell || connected_robot.cell.charge <= 0) robot_status = "DEPOWERED" //Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies! - . += text("[connected_robot.name] | S.Integrity: [connected_robot.health]% | Cell: [connected_robot.cell ? "[connected_robot.cell.charge]/[connected_robot.cell.maxcharge]" : "Empty"] | \ - Module: [connected_robot.designation] | Loc: [get_area_name(connected_robot, TRUE)] | Status: [robot_status]") - . += text("AI shell beacons detected: [LAZYLEN(GLOB.available_ai_shells)]") //Count of total AI shells - -/mob/living/silicon/ai/proc/ai_alerts() - var/dat = "Current Station Alerts\n" - dat += "Close

" - for (var/cat in alarms) - dat += text("[]
\n", cat) - var/list/L = alarms[cat] - if (L.len) - for (var/alarm in L) - var/list/alm = L[alarm] - var/area/A = alm[1] - var/C = alm[2] - var/list/sources = alm[3] - dat += "" - if (C && istype(C, /list)) - var/dat2 = "" - for (var/obj/machinery/camera/I in C) - dat2 += text("[][]", (dat2=="") ? "" : " | ", I.c_tag) - dat += text("-- [] ([])", A.name, (dat2!="") ? dat2 : "No Camera") - else if (C && istype(C, /obj/machinery/camera)) - var/obj/machinery/camera/Ctmp = C - dat += text("-- [] ([])", A.name, Ctmp.c_tag) - else - dat += text("-- [] (No Camera)", A.name) - if (sources.len > 1) - dat += text("- [] sources", sources.len) - dat += "
\n" - else - dat += "-- All Systems Nominal
\n" - dat += "
\n" - - viewalerts = 1 - src << browse(dat, "window=aialerts&can_close=0") + . += "[connected_robot.name] | S.Integrity: [connected_robot.health]% | Cell: [connected_robot.cell ? "[connected_robot.cell.charge]/[connected_robot.cell.maxcharge]" : "Empty"] | \ + Module: [connected_robot.designation] | Loc: [get_area_name(connected_robot, TRUE)] | Status: [robot_status]" + . += "AI shell beacons detected: [LAZYLEN(GLOB.available_ai_shells)]" //Count of total AI shells /mob/living/silicon/ai/proc/ai_call_shuttle() if(control_disabled) @@ -437,15 +410,13 @@ return ..() if (href_list["mach_close"]) - if (href_list["mach_close"] == "aialerts") - viewalerts = 0 - var/t1 = text("window=[]", href_list["mach_close"]) + var/t1 = "window=[href_list["mach_close"]]" unset_machine() src << browse(null, t1) if (href_list["switchcamera"]) switchCamera(locate(href_list["switchcamera"])) in GLOB.cameranet.cameras if (href_list["showalerts"]) - ai_alerts() + alert_control.ui_interact(src) #ifdef AI_VOX if(href_list["say_word"]) play_vox_word(href_list["say_word"], null, src) @@ -553,77 +524,29 @@ bot.call_bot(src, waypoint) call_bot_cooldown = 0 -/mob/living/silicon/ai/triggerAlarm(class, area/home, cameras, obj/source) - if(source.z != z) - return - var/list/our_sort = alarms[class] - for(var/areaname in our_sort) - if (areaname == home.name) - var/list/alarm = our_sort[areaname] - var/list/sources = alarm[3] - if (!(source in sources)) - sources += source - return TRUE +/mob/living/silicon/ai/proc/alarm_triggered(datum/source, alarm_type, area/source_area) + SIGNAL_HANDLER + var/list/cameras = source_area.cameras + var/home_name = source_area.name - var/obj/machinery/camera/cam = null - var/list/our_cams = null - if(cameras && islist(cameras)) - our_cams = cameras - if (our_cams.len == 1) - cam = our_cams[1] - else if(cameras && istype(cameras, /obj/machinery/camera)) - cam = cameras - our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) - - if (cameras) - if (cam?.can_use()) - queueAlarm("--- [class] alarm detected in [home.name]! ([cam.c_tag])", class) - else if (our_cams?.len) - var/foo = 0 - var/dat2 = "" - for (var/obj/machinery/camera/I in our_cams) - dat2 += text("[][]", (!foo) ? "" : " | ", I.c_tag) //I'm not fixing this shit... - foo = 1 - queueAlarm(text ("--- [] alarm detected in []! ([])", class, home.name, dat2), class) + if (length(cameras)) + var/obj/machinery/camera/cam = cameras[1] + if (cam.can_use()) + queueAlarm("--- [alarm_type] alarm detected in [home_name]! ([cam.c_tag])", alarm_type) else - queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, home.name), class) + var/first_run = FALSE + var/dat2 = "" + for (var/obj/machinery/camera/camera as anything in cameras) + dat2 += "[(!first_run) ? "" : " | "][camera.c_tag]" + first_run = TRUE + queueAlarm("--- [alarm_type] alarm detected in [home_name]! ([dat2])", alarm_type) else - queueAlarm(text("--- [] alarm detected in []! (No Camera)", class, home.name), class) - if (viewalerts) - ai_alerts() + queueAlarm("--- [alarm_type] alarm detected in [home_name]! (No Camera)", alarm_type) return TRUE -/mob/living/silicon/ai/freeCamera(area/home, obj/machinery/camera/cam) - for(var/class in alarms) - var/our_area = alarms[class][home.name] - if(!our_area) - continue - var/cams = our_area[2] //Get the cameras - if(!cams) - continue - if(islist(cams)) - cams -= cam - if(length(cams) == 1) - our_area[2] = cams[1] - else - our_area[2] = null - -/mob/living/silicon/ai/cancelAlarm(class, area/A, obj/origin) - var/list/L = alarms[class] - var/cleared = 0 - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] - var/list/srcs = alarm[3] - if (origin in srcs) - srcs -= origin - if (srcs.len == 0) - cleared = 1 - L -= I - if (cleared) - queueAlarm("--- [class] alarm in [A.name] has been cleared.", class, 0) - if (viewalerts) ai_alerts() - return !cleared +/mob/living/silicon/ai/proc/alarm_cleared(datum/source, alarm_type, area/source_area) + SIGNAL_HANDLER + queueAlarm("--- [alarm_type] alarm in [source_area.name] has been cleared.", alarm_type, 0) //Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm //Adds in /mob/living/silicon/ai/proc/ai_network_change() instead diff --git a/code/modules/mob/living/silicon/ai/ai_announcement.dm b/code/modules/mob/living/silicon/ai/ai_announcement.dm new file mode 100644 index 0000000000..4165dec6bd --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_announcement.dm @@ -0,0 +1,59 @@ +#ifdef AI_VOX +/mob/living/silicon/ai/verb/ai_announcement() + set name = "Vox Announcement" + set desc = "Make an audible announcement!" + set category = "AI Commands" + + if(incapacitated()) + return + + if(!ai_announcement) + ai_announcement = new(src) + + ai_announcement.ui_interact(src) + +/datum/ai_announcement + var/mob/living/silicon/ai/owner + +/datum/ai_announcement/New(mob/living/silicon/ai/new_owner) + if(!istype(new_owner)) + qdel(src) + owner = new_owner + +/datum/ai_announcement/ui_status(mob/living/silicon/ai/user) + if(owner == user && !owner.incapacitated()) + return ..() + return UI_CLOSE + +/datum/ai_announcement/ui_state(mob/user) + return GLOB.always_state + +/datum/ai_announcement/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AIAnnouncement") + ui.open() + +/datum/ai_announcement/ui_data(mob/user) + var/list/data = ..() + data["last_announcement"] = owner.last_announcement + return data + +/datum/ai_announcement/ui_static_data(mob/user) + var/list/data = ..() + data["vox_types"] = GLOB.vox_types + return data + +/datum/ai_announcement/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + switch(action) + if("announce") + var/vox_type = params["vox_type"] + if(!vox_type) + return + var/to_speak = params["to_speak"] + if(!to_speak) + return + owner.announcement(vox_type, to_speak) + ui.close() +#endif diff --git a/code/modules/mob/living/silicon/ai/announcement_help.dm b/code/modules/mob/living/silicon/ai/announcement_help.dm new file mode 100644 index 0000000000..f22b3ce4cb --- /dev/null +++ b/code/modules/mob/living/silicon/ai/announcement_help.dm @@ -0,0 +1,54 @@ +#ifdef AI_VOX +/mob/living/silicon/ai/verb/announcement_help() + + set name = "Announcement Help" + set desc = "Display a list of vocal words to announce to the crew." + set category = "AI Commands" + + if(incapacitated()) + return + + if(!announcement_help) + announcement_help = new(src) + + announcement_help.ui_interact(src) + +/datum/announcement_help + var/mob/living/silicon/ai/owner + +/datum/announcement_help/New(mob/living/silicon/ai/new_owner) + if(!istype(new_owner)) + qdel(src) + owner = new_owner + +/datum/announcement_help/ui_status(mob/living/silicon/ai/user) + if(owner == user && !owner.incapacitated()) + return ..() + return UI_CLOSE + +/datum/announcement_help/ui_state(mob/user) + return GLOB.always_state + +/datum/announcement_help/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AnnouncementHelp") + ui.open() + +/datum/announcement_help/ui_static_data(mob/user) + var/list/data = ..() + data["vox_types"] = GLOB.vox_types + return data + +/datum/announcement_help/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + switch(action) + if("say_word") + var/vox_type = params["vox_type"] + if(!vox_type) + return + var/to_speak = params["to_speak"] + if(!to_speak) + return + play_vox_word(to_speak, null, owner, vox_type) +#endif diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 364fbbadf7..2a05266587 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -79,59 +79,23 @@ // Make sure that the code compiles with AI_VOX undefined #ifdef AI_VOX -#define VOX_DELAY 600 -/mob/living/silicon/ai/verb/announcement_help() - - set name = "Announcement Help" - set desc = "Display a list of vocal words to announce to the crew." - set category = "AI Commands" - - if(incapacitated()) - return - - var/dat = {" - WARNING: Misuse of the announcement system will get you job banned.

- Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.
-
- "} - - var/index = 0 - for(var/word in GLOB.vox_sounds) - index++ - dat += "[capitalize(word)]" - if(index != GLOB.vox_sounds.len) - dat += " / " - - var/datum/browser/popup = new(src, "announce_help", "Announcement Help", 500, 400) - popup.set_content(dat) - popup.open() - - -/mob/living/silicon/ai/proc/announcement() +#define VOX_DELAY 1 MINUTES +/mob/living/silicon/ai/proc/announcement(voxType = "Female", message) var/static/announcing_vox = 0 // Stores the time of the last announcement if(announcing_vox > world.time) - to_chat(src, "Please wait [DisplayTimeText(announcing_vox - world.time)].") + to_chat(src, span_notice("Please wait [DisplayTimeText(announcing_vox - world.time)].")) return - var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) as text - last_announcement = message - var/voxType = input(src, "Which VOX to use?", "VOX-type") in list("male", "female", "military") - - if(!message || announcing_vox > world.time) + if(!message || !GLOB.vox_types[voxType]) return if(incapacitated()) return if(control_disabled) - to_chat(src, "Wireless interface disabled, unable to interact with announcement PA.") + to_chat(src, span_warning("Wireless interface disabled, unable to interact with announcement PA.")) return var/list/words = splittext(trim(message), " ") @@ -145,15 +109,11 @@ if(!word) words -= word continue - if(!GLOB.vox_sounds[word] && voxType == "female") - incorrect_words += word - if(!GLOB.vox_sounds_male[word] && voxType == "male") - incorrect_words += word - if(!GLOB.vox_sounds_military[word] && voxType == "military") + if(!GLOB.vox_types[voxType][word]) incorrect_words += word if(incorrect_words.len) - to_chat(src, "These words are not available on the announcement system: [english_list(incorrect_words)].") + to_chat(src, span_notice("These words are not available on the announcement system: [english_list(incorrect_words)].")) return announcing_vox = world.time + VOX_DELAY @@ -164,20 +124,12 @@ play_vox_word(word, src.z, null, voxType) -/proc/play_vox_word(word, z_level, mob/only_listener, voxType = "female") +/proc/play_vox_word(word, z_level, mob/only_listener, voxType = "Female") word = lowertext(word) - if( (GLOB.vox_sounds[word] && voxType == "female") || (GLOB.vox_sounds_male[word] && voxType == "male") || (GLOB.vox_sounds_military[word] && voxType == "military")) - - var/sound_file - - if(voxType == "female") - sound_file = GLOB.vox_sounds[word] - else if (voxType == "military") - sound_file = GLOB.vox_sounds_military[word] - else - sound_file = GLOB.vox_sounds_male[word] + var/sound_file = LAZYACCESSASSOC(GLOB.vox_types, voxType, word) + if(sound_file) var/sound/voice = sound(sound_file, wait = 1, channel = CHANNEL_VOX) voice.status = SOUND_STREAM diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm index 057561562b..31b4f2e1d8 100644 --- a/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm @@ -5,1605 +5,1908 @@ // Regex for collecting a list of ogg files // (([a-zA-Z,.]+)\.ogg) -// For vim -// :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox_fem\/\1',/g -GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg', -"abortions" = 'sound/vox_fem/abortions.ogg', -"above" = 'sound/vox_fem/above.ogg', -"abstain" = 'sound/vox_fem/abstain.ogg', -"accelerating" = 'sound/vox_fem/accelerating.ogg', -"accelerator" = 'sound/vox_fem/accelerator.ogg', -"accepted" = 'sound/vox_fem/accepted.ogg', -"access" = 'sound/vox_fem/access.ogg', -"acknowledged" = 'sound/vox_fem/acknowledged.ogg', -"acknowledge" = 'sound/vox_fem/acknowledge.ogg', -"acquired" = 'sound/vox_fem/acquired.ogg', -"acquisition" = 'sound/vox_fem/acquisition.ogg', -"across" = 'sound/vox_fem/across.ogg', -"activated" = 'sound/vox_fem/activated.ogg', -"activate" = 'sound/vox_fem/activate.ogg', -"activity" = 'sound/vox_fem/activity.ogg', -"adios" = 'sound/vox_fem/adios.ogg', -"administration" = 'sound/vox_fem/administration.ogg', -"advanced" = 'sound/vox_fem/advanced.ogg', -"advised" = 'sound/vox_fem/advised.ogg', -"after" = 'sound/vox_fem/after.ogg', -"aft" = 'sound/vox_fem/aft.ogg', -"agent" = 'sound/vox_fem/agent.ogg', -"ai" = 'sound/vox_fem/ai.ogg', -"airlock" = 'sound/vox_fem/airlock.ogg', -"air" = 'sound/vox_fem/air.ogg', -"alarm" = 'sound/vox_fem/alarm.ogg', -"alert" = 'sound/vox_fem/alert.ogg', -"alien" = 'sound/vox_fem/alien.ogg', -"aligned" = 'sound/vox_fem/aligned.ogg', -"all" = 'sound/vox_fem/all.ogg', -"alpha" = 'sound/vox_fem/alpha.ogg', -"also" = 'sound/vox_fem/also.ogg', -"amigo" = 'sound/vox_fem/amigo.ogg', -"ammunition" = 'sound/vox_fem/ammunition.ogg', -"am" = 'sound/vox_fem/am.ogg', -"and" = 'sound/vox_fem/and.ogg', -"animal" = 'sound/vox_fem/animal.ogg', -"announcement" = 'sound/vox_fem/announcement.ogg', -"an" = 'sound/vox_fem/an.ogg', -"anomalous" = 'sound/vox_fem/anomalous.ogg', -"answer" = 'sound/vox_fem/answer.ogg', -"antenna" = 'sound/vox_fem/antenna.ogg', -"any" = 'sound/vox_fem/any.ogg', -"a" = 'sound/vox_fem/a.ogg', -"apc" = 'sound/vox_fem/apc.ogg', -"apprehend" = 'sound/vox_fem/apprehend.ogg', -"approach" = 'sound/vox_fem/approach.ogg', -"area" = 'sound/vox_fem/area.ogg', -"are" = 'sound/vox_fem/are.ogg', -"armed" = 'sound/vox_fem/armed.ogg', -"arm" = 'sound/vox_fem/arm.ogg', -"armor" = 'sound/vox_fem/armor.ogg', -"armory" = 'sound/vox_fem/armory.ogg', -"array" = 'sound/vox_fem/array.ogg', -"arrest" = 'sound/vox_fem/arrest.ogg', -"asimov" = 'sound/vox_fem/asimov.ogg', -"asshole" = 'sound/vox_fem/asshole.ogg', -"assholes" = 'sound/vox_fem/assholes.ogg', -"assistance" = 'sound/vox_fem/assistance.ogg', -"assistant" = 'sound/vox_fem/assistant.ogg', -"ass" = 'sound/vox_fem/ass.ogg', -"atmosphere" = 'sound/vox_fem/atmosphere.ogg', -"atmospheric" = 'sound/vox_fem/atmospheric.ogg', -"atmospherics" = 'sound/vox_fem/atmospherics.ogg', -"at" = 'sound/vox_fem/at.ogg', -"atomic" = 'sound/vox_fem/atomic.ogg', -"attention" = 'sound/vox_fem/attention.ogg', -"authentication" = 'sound/vox_fem/authentication.ogg', -"authorized" = 'sound/vox_fem/authorized.ogg', -"authorize" = 'sound/vox_fem/authorize.ogg', -"automatic" = 'sound/vox_fem/automatic.ogg', -"away" = 'sound/vox_fem/away.ogg', -"awful" = 'sound/vox_fem/awful.ogg', -"backman" = 'sound/vox_fem/backman.ogg', -"back" = 'sound/vox_fem/back.ogg', -"bad" = 'sound/vox_fem/bad.ogg', -"bag" = 'sound/vox_fem/bag.ogg', -"bailey" = 'sound/vox_fem/bailey.ogg', -"bar" = 'sound/vox_fem/bar.ogg', -"barracks" = 'sound/vox_fem/barracks.ogg', -"bartender" = 'sound/vox_fem/bartender.ogg', -"base" = 'sound/vox_fem/base.ogg', -"bay" = 'sound/vox_fem/bay.ogg', -"beam" = 'sound/vox_fem/beam.ogg', -"been" = 'sound/vox_fem/been.ogg', -"beep" = 'sound/vox_fem/beep.ogg', -"before" = 'sound/vox_fem/before.ogg', -"below" = 'sound/vox_fem/below.ogg', -"be" = 'sound/vox_fem/be.ogg', -"beside" = 'sound/vox_fem/beside.ogg', -"beware" = 'sound/vox_fem/beware.ogg', -"beyond" = 'sound/vox_fem/beyond.ogg', -"biohazard" = 'sound/vox_fem/biohazard.ogg', -"biological" = 'sound/vox_fem/biological.ogg', -"birdwell" = 'sound/vox_fem/birdwell.ogg', -"bitches" = 'sound/vox_fem/bitches.ogg', -"bitch" = 'sound/vox_fem/bitch.ogg', -"bitcoin" = 'sound/vox_fem/bitcoin.ogg', -"black" = 'sound/vox_fem/black.ogg', -"blast" = 'sound/vox_fem/blast.ogg', -"bleed" = 'sound/vox_fem/bleed.ogg', -"blob" = 'sound/vox_fem/blob.ogg', -"blocked" = 'sound/vox_fem/blocked.ogg', -"blood" = 'sound/vox_fem/blood.ogg', -"bloop" = 'sound/vox_fem/bloop.ogg', -"blue" = 'sound/vox_fem/blue.ogg', -"b" = 'sound/vox_fem/b.ogg', -"bomb" = 'sound/vox_fem/bomb.ogg', -"bone" = 'sound/vox_fem/bone.ogg', -"botanist" = 'sound/vox_fem/botanist.ogg', -"botany" = 'sound/vox_fem/botany.ogg', -"bottom" = 'sound/vox_fem/bottom.ogg', -"bravo" = 'sound/vox_fem/bravo.ogg', -"breached" = 'sound/vox_fem/breached.ogg', -"breach" = 'sound/vox_fem/breach.ogg', -"break" = 'sound/vox_fem/break.ogg', -"bridge" = 'sound/vox_fem/bridge.ogg', -"brig" = 'sound/vox_fem/brig.ogg', -"bust" = 'sound/vox_fem/bust.ogg', -"but" = 'sound/vox_fem/but.ogg', -"button" = 'sound/vox_fem/button.ogg', -"bypass" = 'sound/vox_fem/bypass.ogg', -"cable" = 'sound/vox_fem/cable.ogg', -"called" = 'sound/vox_fem/called.ogg', -"call" = 'sound/vox_fem/call.ogg', -"canal" = 'sound/vox_fem/canal.ogg', -"canister" = 'sound/vox_fem/canister.ogg', -"cap" = 'sound/vox_fem/cap.ogg', -"captain" = 'sound/vox_fem/captain.ogg', -"capture" = 'sound/vox_fem/capture.ogg', -"carbon" = 'sound/vox_fem/carbon.ogg', -"cargo" = 'sound/vox_fem/cargo.ogg', -"cat" = 'sound/vox_fem/cat.ogg', -"cease" = 'sound/vox_fem/cease.ogg', -"ceiling" = 'sound/vox_fem/ceiling.ogg', -"celsius" = 'sound/vox_fem/celsius.ogg', -"centcom" = 'sound/vox_fem/centcom.ogg', -"center" = 'sound/vox_fem/center.ogg', -"centi" = 'sound/vox_fem/centi.ogg', -"central" = 'sound/vox_fem/central.ogg', -"ce" = 'sound/vox_fem/ce.ogg', -"challenge" = 'sound/vox_fem/challenge.ogg', -"chamber" = 'sound/vox_fem/chamber.ogg', -"changed" = 'sound/vox_fem/changed.ogg', -"changeling" = 'sound/vox_fem/changeling.ogg', -"change" = 'sound/vox_fem/change.ogg', -"chapel" = 'sound/vox_fem/chapel.ogg', -"chaplain" = 'sound/vox_fem/chaplain.ogg', -"charlie" = 'sound/vox_fem/charlie.ogg', -"check" = 'sound/vox_fem/check.ogg', -"checkpoint" = 'sound/vox_fem/checkpoint.ogg', -"chemical" = 'sound/vox_fem/chemical.ogg', -"chemist" = 'sound/vox_fem/chemist.ogg', -"chief" = 'sound/vox_fem/chief.ogg', -"christ" = 'sound/vox_fem/christ.ogg', -"chuckle" = 'sound/vox_fem/chuckle.ogg', -"circuit" = 'sound/vox_fem/circuit.ogg', -"cleanup" = 'sound/vox_fem/cleanup.ogg', -"clearance" = 'sound/vox_fem/clearance.ogg', -"clear" = 'sound/vox_fem/clear.ogg', -"clockwork" = 'sound/vox_fem/clockwork.ogg', -"close" = 'sound/vox_fem/close.ogg', -"clowning" = 'sound/vox_fem/clowning.ogg', -"clown" = 'sound/vox_fem/clown.ogg', -"cmo" = 'sound/vox_fem/cmo.ogg', -"coded" = 'sound/vox_fem/coded.ogg', -"code" = 'sound/vox_fem/code.ogg', -"c" = 'sound/vox_fem/c.ogg', -"cold" = 'sound/vox_fem/cold.ogg', -"collider" = 'sound/vox_fem/collider.ogg', -"come" = 'sound/vox_fem/come.ogg', -"command" = 'sound/vox_fem/command.ogg', -"communication" = 'sound/vox_fem/communication.ogg', -"complex" = 'sound/vox_fem/complex.ogg', -"comply" = 'sound/vox_fem/comply.ogg', -"computer" = 'sound/vox_fem/computer.ogg', -"condition" = 'sound/vox_fem/condition.ogg', -"condom" = 'sound/vox_fem/condom.ogg', -"confirmed" = 'sound/vox_fem/confirmed.ogg', -"connor" = 'sound/vox_fem/connor.ogg', -"console2" = 'sound/vox_fem/console2.ogg', -"console" = 'sound/vox_fem/console.ogg', -"construct" = 'sound/vox_fem/construct.ogg', -"containment" = 'sound/vox_fem/containment.ogg', -"contamination" = 'sound/vox_fem/contamination.ogg', -"contraband" = 'sound/vox_fem/contraband.ogg', -"control" = 'sound/vox_fem/control.ogg', -"cook" = 'sound/vox_fem/cook.ogg', -"coolant" = 'sound/vox_fem/coolant.ogg', -"coomer" = 'sound/vox_fem/coomer.ogg', -"core" = 'sound/vox_fem/core.ogg', -"corgi" = 'sound/vox_fem/corgi.ogg', -"corporation" = 'sound/vox_fem/corporation.ogg', -"correct" = 'sound/vox_fem/correct.ogg', -"corridor" = 'sound/vox_fem/corridor.ogg', -"corridors" = 'sound/vox_fem/corridors.ogg', -"coward" = 'sound/vox_fem/coward.ogg', -"cowards" = 'sound/vox_fem/cowards.ogg', -"crate" = 'sound/vox_fem/crate.ogg', -"created" = 'sound/vox_fem/created.ogg', -"creature" = 'sound/vox_fem/creature.ogg', -"crew" = 'sound/vox_fem/crew.ogg', -"critical" = 'sound/vox_fem/critical.ogg', -"cross" = 'sound/vox_fem/cross.ogg', -"cryogenic" = 'sound/vox_fem/cryogenic.ogg', -"crystal" = 'sound/vox_fem/crystal.ogg', -"cultist" = 'sound/vox_fem/cultist.ogg', -"cult" = 'sound/vox_fem/cult.ogg', -"cunt" = 'sound/vox_fem/cunt.ogg', -"curator" = 'sound/vox_fem/curator.ogg', -"cyborg" = 'sound/vox_fem/cyborg.ogg', -"cyborgs" = 'sound/vox_fem/cyborgs.ogg', -"damaged" = 'sound/vox_fem/damaged.ogg', -"damage" = 'sound/vox_fem/damage.ogg', -"danger" = 'sound/vox_fem/danger.ogg', -"dangerous" = 'sound/vox_fem/dangerous.ogg', -"day" = 'sound/vox_fem/day.ogg', -"deactivated" = 'sound/vox_fem/deactivated.ogg', -"dead" = 'sound/vox_fem/dead.ogg', -"death" = 'sound/vox_fem/death.ogg', -"decompression" = 'sound/vox_fem/decompression.ogg', -"decontamination" = 'sound/vox_fem/decontamination.ogg', -"deeoo" = 'sound/vox_fem/deeoo.ogg', -"defense" = 'sound/vox_fem/defense.ogg', -"degrees" = 'sound/vox_fem/degrees.ogg', -"delta" = 'sound/vox_fem/delta.ogg', -"demon" = 'sound/vox_fem/demon.ogg', -"denied" = 'sound/vox_fem/denied.ogg', -"departures" = 'sound/vox_fem/departures.ogg', -"deployed" = 'sound/vox_fem/deployed.ogg', -"deploy" = 'sound/vox_fem/deploy.ogg', -"desire" = 'sound/vox_fem/desire.ogg', -"desist" = 'sound/vox_fem/desist.ogg', -"destroyed" = 'sound/vox_fem/destroyed.ogg', -"destroy" = 'sound/vox_fem/destroy.ogg', -"destruction" = 'sound/vox_fem/destruction.ogg', -"detain" = 'sound/vox_fem/detain.ogg', -"detected" = 'sound/vox_fem/detected.ogg', -"detective" = 'sound/vox_fem/detective.ogg', -"detonation" = 'sound/vox_fem/detonation.ogg', -"device" = 'sound/vox_fem/device.ogg', -"devil" = 'sound/vox_fem/devil.ogg', -"did" = 'sound/vox_fem/did.ogg', -"die" = 'sound/vox_fem/die.ogg', -"dimensional" = 'sound/vox_fem/dimensional.ogg', -"dioxide" = 'sound/vox_fem/dioxide.ogg', -"director" = 'sound/vox_fem/director.ogg', -"dirt" = 'sound/vox_fem/dirt.ogg', -"disabled" = 'sound/vox_fem/disabled.ogg', -"disease" = 'sound/vox_fem/disease.ogg', -"disengaged" = 'sound/vox_fem/disengaged.ogg', -"dish" = 'sound/vox_fem/dish.ogg', -"disk" = 'sound/vox_fem/disk.ogg', -"disposal" = 'sound/vox_fem/disposal.ogg', -"distance" = 'sound/vox_fem/distance.ogg', -"distortion" = 'sound/vox_fem/distortion.ogg', -"doctor" = 'sound/vox_fem/doctor.ogg', -"d" = 'sound/vox_fem/d.ogg', -"dog" = 'sound/vox_fem/dog.ogg', -"do" = 'sound/vox_fem/do.ogg', -"doomsday" = 'sound/vox_fem/doomsday.ogg', -"doop" = 'sound/vox_fem/doop.ogg', -"door" = 'sound/vox_fem/door.ogg', -"dormitory" = 'sound/vox_fem/dormitory.ogg', -"dot" = 'sound/vox_fem/dot.ogg', -"down" = 'sound/vox_fem/down.ogg', -"drone" = 'sound/vox_fem/drone.ogg', -"dual" = 'sound/vox_fem/dual.ogg', -"duct" = 'sound/vox_fem/duct.ogg', -"east" = 'sound/vox_fem/east.ogg', -"echo" = 'sound/vox_fem/echo.ogg', -"ed" = 'sound/vox_fem/ed.ogg', -"effect" = 'sound/vox_fem/effect.ogg', -"egress" = 'sound/vox_fem/egress.ogg', -"eighteen" = 'sound/vox_fem/eighteen.ogg', -"eight" = 'sound/vox_fem/eight.ogg', -"eighty" = 'sound/vox_fem/eighty.ogg', -"electric" = 'sound/vox_fem/electric.ogg', -"electromagnetic" = 'sound/vox_fem/electromagnetic.ogg', -"elevator" = 'sound/vox_fem/elevator.ogg', -"eleven" = 'sound/vox_fem/eleven.ogg', -"eliminate" = 'sound/vox_fem/eliminate.ogg', -"emergency" = 'sound/vox_fem/emergency.ogg', -"enabled" = 'sound/vox_fem/enabled.ogg', -"energy" = 'sound/vox_fem/energy.ogg', -"engaged" = 'sound/vox_fem/engaged.ogg', -"engage" = 'sound/vox_fem/engage.ogg', -"engineering" = 'sound/vox_fem/engineering.ogg', -"engineer" = 'sound/vox_fem/engineer.ogg', -"engine" = 'sound/vox_fem/engine.ogg', -"enter" = 'sound/vox_fem/enter.ogg', -"entity" = 'sound/vox_fem/entity.ogg', -"entry" = 'sound/vox_fem/entry.ogg', -"environment" = 'sound/vox_fem/environment.ogg', -"e" = 'sound/vox_fem/e.ogg', -"epic" = 'sound/vox_fem/epic.ogg', -"equipment" = 'sound/vox_fem/equipment.ogg', -"error" = 'sound/vox_fem/error.ogg', -"escape" = 'sound/vox_fem/escape.ogg', -"evacuate" = 'sound/vox_fem/evacuate.ogg', -"eva" = 'sound/vox_fem/eva.ogg', -"exchange" = 'sound/vox_fem/exchange.ogg', -"exit" = 'sound/vox_fem/exit.ogg', -"expect" = 'sound/vox_fem/expect.ogg', -"experimental" = 'sound/vox_fem/experimental.ogg', -"experiment" = 'sound/vox_fem/experiment.ogg', -"explode" = 'sound/vox_fem/explode.ogg', -"explosion" = 'sound/vox_fem/explosion.ogg', -"explosive" = 'sound/vox_fem/explosive.ogg', -"exposure" = 'sound/vox_fem/exposure.ogg', -"exterminate" = 'sound/vox_fem/exterminate.ogg', -"extinguisher" = 'sound/vox_fem/extinguisher.ogg', -"extinguish" = 'sound/vox_fem/extinguish.ogg', -"extreme" = 'sound/vox_fem/extreme.ogg', -"facility" = 'sound/vox_fem/facility.ogg', -"factory" = 'sound/vox_fem/factory.ogg', -"fahrenheit" = 'sound/vox_fem/fahrenheit.ogg', -"failed" = 'sound/vox_fem/failed.ogg', -"failure" = 'sound/vox_fem/failure.ogg', -"false" = 'sound/vox_fem/false.ogg', -"farthest" = 'sound/vox_fem/farthest.ogg', -"fast" = 'sound/vox_fem/fast.ogg', -"fauna" = 'sound/vox_fem/fauna.ogg', -"feet" = 'sound/vox_fem/feet.ogg', -"field" = 'sound/vox_fem/field.ogg', -"fifteen" = 'sound/vox_fem/fifteen.ogg', -"fifth" = 'sound/vox_fem/fifth.ogg', -"fifty" = 'sound/vox_fem/fifty.ogg', -"final" = 'sound/vox_fem/final.ogg', -"fine" = 'sound/vox_fem/fine.ogg', -"fire" = 'sound/vox_fem/fire.ogg', -"first" = 'sound/vox_fem/first.ogg', -"five" = 'sound/vox_fem/five.ogg', -"fix" = 'sound/vox_fem/fix.ogg', -"flooding" = 'sound/vox_fem/flooding.ogg', -"floor" = 'sound/vox_fem/floor.ogg', -"flyman" = 'sound/vox_fem/flyman.ogg', -"f" = 'sound/vox_fem/f.ogg', -"fool" = 'sound/vox_fem/fool.ogg', -"forbidden" = 'sound/vox_fem/forbidden.ogg', -"force" = 'sound/vox_fem/force.ogg', -"fore" = 'sound/vox_fem/fore.ogg', -"formed" = 'sound/vox_fem/formed.ogg', -"form" = 'sound/vox_fem/form.ogg', -"forms" = 'sound/vox_fem/forms.ogg', -"for" = 'sound/vox_fem/for.ogg', -"found" = 'sound/vox_fem/found.ogg', -"four" = 'sound/vox_fem/four.ogg', -"fourteen" = 'sound/vox_fem/fourteen.ogg', -"fourth" = 'sound/vox_fem/fourth.ogg', -"fourty" = 'sound/vox_fem/fourty.ogg', -"foxtrot" = 'sound/vox_fem/foxtrot.ogg', -"freeman" = 'sound/vox_fem/freeman.ogg', -"free" = 'sound/vox_fem/free.ogg', -"freezer" = 'sound/vox_fem/freezer.ogg', -"freezing" = 'sound/vox_fem/freezing.ogg', -"from" = 'sound/vox_fem/from.ogg', -"front" = 'sound/vox_fem/front.ogg', -"fucking" = 'sound/vox_fem/fucking.ogg', -"fuck" = 'sound/vox_fem/fuck.ogg', -"fucks" = 'sound/vox_fem/fucks.ogg', -"fuel" = 'sound/vox_fem/fuel.ogg', -"gas" = 'sound/vox_fem/gas.ogg', -"generator" = 'sound/vox_fem/generator.ogg', -"geneticist" = 'sound/vox_fem/geneticist.ogg', -"get" = 'sound/vox_fem/get.ogg', -"glory" = 'sound/vox_fem/glory.ogg', -"god" = 'sound/vox_fem/god.ogg', -"g" = 'sound/vox_fem/g.ogg', -"going" = 'sound/vox_fem/going.ogg', -"golem" = 'sound/vox_fem/golem.ogg', -"goodbye" = 'sound/vox_fem/goodbye.ogg', -"good" = 'sound/vox_fem/good.ogg', -"go" = 'sound/vox_fem/go.ogg', -"gordon" = 'sound/vox_fem/gordon.ogg', -"got" = 'sound/vox_fem/got.ogg', -"government" = 'sound/vox_fem/government.ogg', -"granted" = 'sound/vox_fem/granted.ogg', -"gravity" = 'sound/vox_fem/gravity.ogg', -"gray" = 'sound/vox_fem/gray.ogg', -"great" = 'sound/vox_fem/great.ogg', -"green" = 'sound/vox_fem/green.ogg', -"grenade" = 'sound/vox_fem/grenade.ogg', -"guard" = 'sound/vox_fem/guard.ogg', -"gulf" = 'sound/vox_fem/gulf.ogg', -"gun" = 'sound/vox_fem/gun.ogg', -"guthrie" = 'sound/vox_fem/guthrie.ogg', -"hacker" = 'sound/vox_fem/hacker.ogg', -"hackers" = 'sound/vox_fem/hackers.ogg', -"hall" = 'sound/vox_fem/hall.ogg', -"hallway" = 'sound/vox_fem/hallway.ogg', -"handling" = 'sound/vox_fem/handling.ogg', -"hangar" = 'sound/vox_fem/hangar.ogg', -"harmful" = 'sound/vox_fem/harmful.ogg', -"harm" = 'sound/vox_fem/harm.ogg', -"has" = 'sound/vox_fem/has.ogg', -"have" = 'sound/vox_fem/have.ogg', -"hazard" = 'sound/vox_fem/hazard.ogg', -"head" = 'sound/vox_fem/head.ogg', -"health" = 'sound/vox_fem/health.ogg', -"heat" = 'sound/vox_fem/heat.ogg', -"helicopter" = 'sound/vox_fem/helicopter.ogg', -"helium" = 'sound/vox_fem/helium.ogg', -"hello" = 'sound/vox_fem/hello.ogg', -"help" = 'sound/vox_fem/help.ogg', -"he" = 'sound/vox_fem/he.ogg', -"here" = 'sound/vox_fem/here.ogg', -"hide" = 'sound/vox_fem/hide.ogg', -"highest" = 'sound/vox_fem/highest.ogg', -"high" = 'sound/vox_fem/high.ogg', -"hit" = 'sound/vox_fem/hit.ogg', -"h" = 'sound/vox_fem/h.ogg', -"hole" = 'sound/vox_fem/hole.ogg', -"honk" = 'sound/vox_fem/honk.ogg', -"hop" = 'sound/vox_fem/hop.ogg', -"hos" = 'sound/vox_fem/hos.ogg', -"hostile" = 'sound/vox_fem/hostile.ogg', -"hotel" = 'sound/vox_fem/hotel.ogg', -"hot" = 'sound/vox_fem/hot.ogg', -"hour" = 'sound/vox_fem/hour.ogg', -"hours" = 'sound/vox_fem/hours.ogg', -"how" = 'sound/vox_fem/how.ogg', -"human" = 'sound/vox_fem/human.ogg', -"humanoid" = 'sound/vox_fem/humanoid.ogg', -"humans" = 'sound/vox_fem/humans.ogg', -"hundred" = 'sound/vox_fem/hundred.ogg', -"hunger" = 'sound/vox_fem/hunger.ogg', -"hurt" = 'sound/vox_fem/hurt.ogg', -"hydro" = 'sound/vox_fem/hydro.ogg', -"hydroponics" = 'sound/vox_fem/hydroponics.ogg', -"ian" = 'sound/vox_fem/ian.ogg', -"idiot" = 'sound/vox_fem/idiot.ogg', -"if2" = 'sound/vox_fem/if2.ogg', -"if" = 'sound/vox_fem/if.ogg', -"illegal" = 'sound/vox_fem/illegal.ogg', -"immediately" = 'sound/vox_fem/immediately.ogg', -"immediate" = 'sound/vox_fem/immediate.ogg', -"immortal" = 'sound/vox_fem/immortal.ogg', -"impossible" = 'sound/vox_fem/impossible.ogg', -"inches" = 'sound/vox_fem/inches.ogg', -"india" = 'sound/vox_fem/india.ogg', -"ing" = 'sound/vox_fem/ing.ogg', -"in" = 'sound/vox_fem/in.ogg', -"inoperative" = 'sound/vox_fem/inoperative.ogg', -"inside" = 'sound/vox_fem/inside.ogg', -"inspection" = 'sound/vox_fem/inspection.ogg', -"inspector" = 'sound/vox_fem/inspector.ogg', -"interchange" = 'sound/vox_fem/interchange.ogg', -"internals" = 'sound/vox_fem/internals.ogg', -"intruder" = 'sound/vox_fem/intruder.ogg', -"invalid" = 'sound/vox_fem/invalid.ogg', -"invasion" = 'sound/vox_fem/invasion.ogg', -"i" = 'sound/vox_fem/i.ogg', -"is" = 'sound/vox_fem/is.ogg', -"it" = 'sound/vox_fem/it.ogg', -"janitor" = 'sound/vox_fem/janitor.ogg', -"jesus" = 'sound/vox_fem/jesus.ogg', -"j" = 'sound/vox_fem/j.ogg', -"johnson" = 'sound/vox_fem/johnson.ogg', -"juliet" = 'sound/vox_fem/juliet.ogg', -"key" = 'sound/vox_fem/key.ogg', -"kidnapped" = 'sound/vox_fem/kidnapped.ogg', -"kidnapping" = 'sound/vox_fem/kidnapping.ogg', -"killed" = 'sound/vox_fem/killed.ogg', -"kill" = 'sound/vox_fem/kill.ogg', -"kilo" = 'sound/vox_fem/kilo.ogg', -"kitchen" = 'sound/vox_fem/kitchen.ogg', -"kit" = 'sound/vox_fem/kit.ogg', -"k" = 'sound/vox_fem/k.ogg', -"lab" = 'sound/vox_fem/lab.ogg', -"lambda" = 'sound/vox_fem/lambda.ogg', -"laser" = 'sound/vox_fem/laser.ogg', -"last" = 'sound/vox_fem/last.ogg', -"launch" = 'sound/vox_fem/launch.ogg', -"lavaland" = 'sound/vox_fem/lavaland.ogg', -"law" = 'sound/vox_fem/law.ogg', -"laws" = 'sound/vox_fem/laws.ogg', -"lawyer" = 'sound/vox_fem/lawyer.ogg', -"leak" = 'sound/vox_fem/leak.ogg', -"leave" = 'sound/vox_fem/leave.ogg', -"left" = 'sound/vox_fem/left.ogg', -"legal" = 'sound/vox_fem/legal.ogg', -"level" = 'sound/vox_fem/level.ogg', -"lever" = 'sound/vox_fem/lever.ogg', -"library" = 'sound/vox_fem/library.ogg', -"lie" = 'sound/vox_fem/lie.ogg', -"lieutenant" = 'sound/vox_fem/lieutenant.ogg', -"lifeform" = 'sound/vox_fem/lifeform.ogg', -"life" = 'sound/vox_fem/life.ogg', -"light" = 'sound/vox_fem/light.ogg', -"lima" = 'sound/vox_fem/lima.ogg', -"liquid" = 'sound/vox_fem/liquid.ogg', -"live2" = 'sound/vox_fem/live2.ogg', -"live" = 'sound/vox_fem/live.ogg', -"lizard" = 'sound/vox_fem/lizard.ogg', -"loading" = 'sound/vox_fem/loading.ogg', -"located" = 'sound/vox_fem/located.ogg', -"locate" = 'sound/vox_fem/locate.ogg', -"location" = 'sound/vox_fem/location.ogg', -"locked" = 'sound/vox_fem/locked.ogg', -"locker" = 'sound/vox_fem/locker.ogg', -"lock" = 'sound/vox_fem/lock.ogg', -"lockout" = 'sound/vox_fem/lockout.ogg', -"l" = 'sound/vox_fem/l.ogg', -"long" = 'sound/vox_fem/long.ogg', -"look" = 'sound/vox_fem/look.ogg', -"loop" = 'sound/vox_fem/loop.ogg', -"loose" = 'sound/vox_fem/loose.ogg', -"lot" = 'sound/vox_fem/lot.ogg', -"lower" = 'sound/vox_fem/lower.ogg', -"lowest" = 'sound/vox_fem/lowest.ogg', -"lusty" = 'sound/vox_fem/lusty.ogg', -"machine" = 'sound/vox_fem/machine.ogg', -"magic" = 'sound/vox_fem/magic.ogg', -"magnetic" = 'sound/vox_fem/magnetic.ogg', -"main" = 'sound/vox_fem/main.ogg', -"maintenance" = 'sound/vox_fem/maintenance.ogg', -"malfunction" = 'sound/vox_fem/malfunction.ogg', -"man" = 'sound/vox_fem/man.ogg', -"many" = 'sound/vox_fem/many.ogg', -"mass" = 'sound/vox_fem/mass.ogg', -"materials" = 'sound/vox_fem/materials.ogg', -"maximum" = 'sound/vox_fem/maximum.ogg', -"may" = 'sound/vox_fem/may.ogg', -"meat" = 'sound/vox_fem/meat.ogg', -"medbay" = 'sound/vox_fem/medbay.ogg', -"medical" = 'sound/vox_fem/medical.ogg', -"megafauna" = 'sound/vox_fem/megafauna.ogg', -"men" = 'sound/vox_fem/men.ogg', -"me" = 'sound/vox_fem/me.ogg', -"mercy" = 'sound/vox_fem/mercy.ogg', -"mesa" = 'sound/vox_fem/mesa.ogg', -"message" = 'sound/vox_fem/message.ogg', -"meter" = 'sound/vox_fem/meter.ogg', -"micro" = 'sound/vox_fem/micro.ogg', -"middle" = 'sound/vox_fem/middle.ogg', -"mike" = 'sound/vox_fem/mike.ogg', -"miles" = 'sound/vox_fem/miles.ogg', -"military" = 'sound/vox_fem/military.ogg', -"milli" = 'sound/vox_fem/milli.ogg', -"million" = 'sound/vox_fem/million.ogg', -"mime" = 'sound/vox_fem/mime.ogg', -"minefield" = 'sound/vox_fem/minefield.ogg', -"miner" = 'sound/vox_fem/miner.ogg', -"minimum" = 'sound/vox_fem/minimum.ogg', -"minutes" = 'sound/vox_fem/minutes.ogg', -"mister" = 'sound/vox_fem/mister.ogg', -"mode" = 'sound/vox_fem/mode.ogg', -"modification" = 'sound/vox_fem/modification.ogg', -"m" = 'sound/vox_fem/m.ogg', -"money" = 'sound/vox_fem/money.ogg', -"monkey" = 'sound/vox_fem/monkey.ogg', -"moth" = 'sound/vox_fem/moth.ogg', -"motor" = 'sound/vox_fem/motor.ogg', -"motorpool" = 'sound/vox_fem/motorpool.ogg', -"move" = 'sound/vox_fem/move.ogg', -"multitude" = 'sound/vox_fem/multitude.ogg', -"murder" = 'sound/vox_fem/murder.ogg', -"must" = 'sound/vox_fem/must.ogg', -"my" = 'sound/vox_fem/my.ogg', -"mythic" = 'sound/vox_fem/mythic.ogg', -"nanotrasen" = 'sound/vox_fem/nanotrasen.ogg', -"nearest" = 'sound/vox_fem/nearest.ogg', -"need" = 'sound/vox_fem/need.ogg', -"nice" = 'sound/vox_fem/nice.ogg', -"nine" = 'sound/vox_fem/nine.ogg', -"nineteen" = 'sound/vox_fem/nineteen.ogg', -"ninety" = 'sound/vox_fem/ninety.ogg', -"nitrogen" = 'sound/vox_fem/nitrogen.ogg', -"n" = 'sound/vox_fem/n.ogg', -"nominal" = 'sound/vox_fem/nominal.ogg', -"no" = 'sound/vox_fem/no.ogg', -"north" = 'sound/vox_fem/north.ogg', -"not" = 'sound/vox_fem/not.ogg', -"november" = 'sound/vox_fem/november.ogg', -"now" = 'sound/vox_fem/now.ogg', -"nuclear" = 'sound/vox_fem/nuclear.ogg', -"nuke" = 'sound/vox_fem/nuke.ogg', -"number" = 'sound/vox_fem/number.ogg', -"objective" = 'sound/vox_fem/objective.ogg', -"observation" = 'sound/vox_fem/observation.ogg', -"obtain" = 'sound/vox_fem/obtain.ogg', -"office" = 'sound/vox_fem/office.ogg', -"officer" = 'sound/vox_fem/officer.ogg', -"off" = 'sound/vox_fem/off.ogg', -"of" = 'sound/vox_fem/of.ogg', -"," = 'sound/vox_fem/,.ogg', -"." = 'sound/vox_fem/..ogg', -"oh" = 'sound/vox_fem/oh.ogg', -"ok" = 'sound/vox_fem/ok.ogg', -"one" = 'sound/vox_fem/one.ogg', -"on" = 'sound/vox_fem/on.ogg', -"oof" = 'sound/vox_fem/oof.ogg', -"o" = 'sound/vox_fem/o.ogg', -"open" = 'sound/vox_fem/open.ogg', -"operating" = 'sound/vox_fem/operating.ogg', -"operations" = 'sound/vox_fem/operations.ogg', -"operative" = 'sound/vox_fem/operative.ogg', -"option" = 'sound/vox_fem/option.ogg', -"order" = 'sound/vox_fem/order.ogg', -"organic" = 'sound/vox_fem/organic.ogg', -"or" = 'sound/vox_fem/or.ogg', -"oscar" = 'sound/vox_fem/oscar.ogg', -"out" = 'sound/vox_fem/out.ogg', -"outside" = 'sound/vox_fem/outside.ogg', -"overload" = 'sound/vox_fem/overload.ogg', -"over" = 'sound/vox_fem/over.ogg', -"override" = 'sound/vox_fem/override.ogg', -"oxygen" = 'sound/vox_fem/oxygen.ogg', -"pacification" = 'sound/vox_fem/pacification.ogg', -"pacify" = 'sound/vox_fem/pacify.ogg', -"pain" = 'sound/vox_fem/pain.ogg', -"pal" = 'sound/vox_fem/pal.ogg', -"panel" = 'sound/vox_fem/panel.ogg', -"panting" = 'sound/vox_fem/panting.ogg', -"pathetic" = 'sound/vox_fem/pathetic.ogg', -"percent" = 'sound/vox_fem/percent.ogg', -"perfect" = 'sound/vox_fem/perfect.ogg', -"perimeter" = 'sound/vox_fem/perimeter.ogg', -"permitted" = 'sound/vox_fem/permitted.ogg', -"personal" = 'sound/vox_fem/personal.ogg', -"personnel" = 'sound/vox_fem/personnel.ogg', -"pipe" = 'sound/vox_fem/pipe.ogg', -"piping" = 'sound/vox_fem/piping.ogg', -"piss" = 'sound/vox_fem/piss.ogg', -"plant" = 'sound/vox_fem/plant.ogg', -"plasmaman" = 'sound/vox_fem/plasmaman.ogg', -"plasma" = 'sound/vox_fem/plasma.ogg', -"platform" = 'sound/vox_fem/platform.ogg', -"plausible" = 'sound/vox_fem/plausible.ogg', -"please" = 'sound/vox_fem/please.ogg', -"p" = 'sound/vox_fem/p.ogg', -"point" = 'sound/vox_fem/point.ogg', -"portal" = 'sound/vox_fem/portal.ogg', -"port" = 'sound/vox_fem/port.ogg', -"possible" = 'sound/vox_fem/possible.ogg', -"power" = 'sound/vox_fem/power.ogg', -"presence" = 'sound/vox_fem/presence.ogg', -"press" = 'sound/vox_fem/press.ogg', -"pressure" = 'sound/vox_fem/pressure.ogg', -"primary" = 'sound/vox_fem/primary.ogg', -"prisoner" = 'sound/vox_fem/prisoner.ogg', -"prison" = 'sound/vox_fem/prison.ogg', -"proceed" = 'sound/vox_fem/proceed.ogg', -"processing" = 'sound/vox_fem/processing.ogg', -"progress" = 'sound/vox_fem/progress.ogg', -"proper" = 'sound/vox_fem/proper.ogg', -"propulsion" = 'sound/vox_fem/propulsion.ogg', -"prosecute" = 'sound/vox_fem/prosecute.ogg', -"protective" = 'sound/vox_fem/protective.ogg', -"push" = 'sound/vox_fem/push.ogg', -"put" = 'sound/vox_fem/put.ogg', -"q" = 'sound/vox_fem/q.ogg', -"quantum" = 'sound/vox_fem/quantum.ogg', -"quarantine" = 'sound/vox_fem/quarantine.ogg', -"quartermaster" = 'sound/vox_fem/quartermaster.ogg', -"quebec" = 'sound/vox_fem/quebec.ogg', -"queen" = 'sound/vox_fem/queen.ogg', -"questionable" = 'sound/vox_fem/questionable.ogg', -"questioning" = 'sound/vox_fem/questioning.ogg', -"question" = 'sound/vox_fem/question.ogg', -"quick" = 'sound/vox_fem/quick.ogg', -"quit" = 'sound/vox_fem/quit.ogg', -"radiation" = 'sound/vox_fem/radiation.ogg', -"radioactive" = 'sound/vox_fem/radioactive.ogg', -"rads" = 'sound/vox_fem/rads.ogg', -"raider" = 'sound/vox_fem/raider.ogg', -"raiders" = 'sound/vox_fem/raiders.ogg', -"rapid" = 'sound/vox_fem/rapid.ogg', -"reached" = 'sound/vox_fem/reached.ogg', -"reach" = 'sound/vox_fem/reach.ogg', -"reactor" = 'sound/vox_fem/reactor.ogg', -"red" = 'sound/vox_fem/red.ogg', -"relay" = 'sound/vox_fem/relay.ogg', -"released" = 'sound/vox_fem/released.ogg', -"remaining" = 'sound/vox_fem/remaining.ogg', -"removal" = 'sound/vox_fem/removal.ogg', -"renegade" = 'sound/vox_fem/renegade.ogg', -"repair" = 'sound/vox_fem/repair.ogg', -"report" = 'sound/vox_fem/report.ogg', -"reports" = 'sound/vox_fem/reports.ogg', -"required" = 'sound/vox_fem/required.ogg', -"require" = 'sound/vox_fem/require.ogg', -"research" = 'sound/vox_fem/research.ogg', -"resevoir" = 'sound/vox_fem/resevoir.ogg', -"resistance" = 'sound/vox_fem/resistance.ogg', -"rest" = 'sound/vox_fem/rest.ogg', -"restoration" = 'sound/vox_fem/restoration.ogg', -"revolutionary" = 'sound/vox_fem/revolutionary.ogg', -"revolution" = 'sound/vox_fem/revolution.ogg', -"right" = 'sound/vox_fem/right.ogg', -"riot" = 'sound/vox_fem/riot.ogg', -"roboticist" = 'sound/vox_fem/roboticist.ogg', -"rocket" = 'sound/vox_fem/rocket.ogg', -"roger" = 'sound/vox_fem/roger.ogg', -"r" = 'sound/vox_fem/r.ogg', -"rogue" = 'sound/vox_fem/rogue.ogg', -"romeo" = 'sound/vox_fem/romeo.ogg', -"room" = 'sound/vox_fem/room.ogg', -"round" = 'sound/vox_fem/round.ogg', -"rune" = 'sound/vox_fem/rune.ogg', -"run" = 'sound/vox_fem/run.ogg', -"runtime" = 'sound/vox_fem/runtime.ogg', -"sabotage" = 'sound/vox_fem/sabotage.ogg', -"safe" = 'sound/vox_fem/safe.ogg', -"safety" = 'sound/vox_fem/safety.ogg', -"sairhorn" = 'sound/vox_fem/sairhorn.ogg', -"sarah" = 'sound/vox_fem/sarah.ogg', -"sargeant" = 'sound/vox_fem/sargeant.ogg', -"satellite" = 'sound/vox_fem/satellite.ogg', -"save" = 'sound/vox_fem/save.ogg', -"scensor" = 'sound/vox_fem/scensor.ogg', -"science" = 'sound/vox_fem/science.ogg', -"scientist" = 'sound/vox_fem/scientist.ogg', -"scream" = 'sound/vox_fem/scream.ogg', -"screen" = 'sound/vox_fem/screen.ogg', -"search" = 'sound/vox_fem/search.ogg', -"secondary" = 'sound/vox_fem/secondary.ogg', -"second" = 'sound/vox_fem/second.ogg', -"seconds" = 'sound/vox_fem/seconds.ogg', -"section" = 'sound/vox_fem/section.ogg', -"sector" = 'sound/vox_fem/sector.ogg', -"secured" = 'sound/vox_fem/secured.ogg', -"secure" = 'sound/vox_fem/secure.ogg', -"security" = 'sound/vox_fem/security.ogg', -"selected" = 'sound/vox_fem/selected.ogg', -"select" = 'sound/vox_fem/select.ogg', -"self" = 'sound/vox_fem/self.ogg', -"sensors" = 'sound/vox_fem/sensors.ogg', -"server" = 'sound/vox_fem/server.ogg', -"service" = 'sound/vox_fem/service.ogg', -"seven" = 'sound/vox_fem/seven.ogg', -"seventeen" = 'sound/vox_fem/seventeen.ogg', -"seventy" = 'sound/vox_fem/seventy.ogg', -"severe" = 'sound/vox_fem/severe.ogg', -"sewage" = 'sound/vox_fem/sewage.ogg', -"sewer" = 'sound/vox_fem/sewer.ogg', -"shaft" = 'sound/vox_fem/shaft.ogg', -"she" = 'sound/vox_fem/she.ogg', -"shield" = 'sound/vox_fem/shield.ogg', -"shipment" = 'sound/vox_fem/shipment.ogg', -"shirt" = 'sound/vox_fem/shirt.ogg', -"shitlord" = 'sound/vox_fem/shitlord.ogg', -"shit" = 'sound/vox_fem/shit.ogg', -"shits" = 'sound/vox_fem/shits.ogg', -"shitting" = 'sound/vox_fem/shitting.ogg', -"shock" = 'sound/vox_fem/shock.ogg', -"shonk" = 'sound/vox_fem/shonk.ogg', -"shoot" = 'sound/vox_fem/shoot.ogg', -"shower" = 'sound/vox_fem/shower.ogg', -"shut" = 'sound/vox_fem/shut.ogg', -"shuttle" = 'sound/vox_fem/shuttle.ogg', -"sick" = 'sound/vox_fem/sick.ogg', -"side" = 'sound/vox_fem/side.ogg', -"sierra" = 'sound/vox_fem/sierra.ogg', -"sight" = 'sound/vox_fem/sight.ogg', -"silicon" = 'sound/vox_fem/silicon.ogg', -"silo" = 'sound/vox_fem/silo.ogg', -"singularity" = 'sound/vox_fem/singularity.ogg', -"six" = 'sound/vox_fem/six.ogg', -"sixteen" = 'sound/vox_fem/sixteen.ogg', -"sixty" = 'sound/vox_fem/sixty.ogg', -"skeleton" = 'sound/vox_fem/skeleton.ogg', -"slaughter" = 'sound/vox_fem/slaughter.ogg', -"slime" = 'sound/vox_fem/slime.ogg', -"slip" = 'sound/vox_fem/slip.ogg', -"slippery" = 'sound/vox_fem/slippery.ogg', -"slow" = 'sound/vox_fem/slow.ogg', -"sm" = 'sound/vox_fem/sm.ogg', -"s" = 'sound/vox_fem/s.ogg', -"solar" = 'sound/vox_fem/solar.ogg', -"solars" = 'sound/vox_fem/solars.ogg', -"soldier" = 'sound/vox_fem/soldier.ogg', -"some" = 'sound/vox_fem/some.ogg', -"someone" = 'sound/vox_fem/someone.ogg', -"something" = 'sound/vox_fem/something.ogg', -"son" = 'sound/vox_fem/son.ogg', -"sorry" = 'sound/vox_fem/sorry.ogg', -"south" = 'sound/vox_fem/south.ogg', -"space" = 'sound/vox_fem/space.ogg', -"squad" = 'sound/vox_fem/squad.ogg', -"square" = 'sound/vox_fem/square.ogg', -"ss13" = 'sound/vox_fem/ss13.ogg', -"stairway" = 'sound/vox_fem/stairway.ogg', -"starboard" = 'sound/vox_fem/starboard.ogg', -"station" = 'sound/vox_fem/station.ogg', -"status" = 'sound/vox_fem/status.ogg', -"stay" = 'sound/vox_fem/stay.ogg', -"sterile" = 'sound/vox_fem/sterile.ogg', -"sterilization" = 'sound/vox_fem/sterilization.ogg', -"stop" = 'sound/vox_fem/stop.ogg', -"storage" = 'sound/vox_fem/storage.ogg', -"strong" = 'sound/vox_fem/strong.ogg', -"stuck" = 'sound/vox_fem/stuck.ogg', -"sub" = 'sound/vox_fem/sub.ogg', -"subsurface" = 'sound/vox_fem/subsurface.ogg', -"sudden" = 'sound/vox_fem/sudden.ogg', -"suffer" = 'sound/vox_fem/suffer.ogg', -"suit" = 'sound/vox_fem/suit.ogg', -"superconducting" = 'sound/vox_fem/superconducting.ogg', -"supercooled" = 'sound/vox_fem/supercooled.ogg', -"supermatter" = 'sound/vox_fem/supermatter.ogg', -"supply" = 'sound/vox_fem/supply.ogg', -"surface" = 'sound/vox_fem/surface.ogg', -"surrender" = 'sound/vox_fem/surrender.ogg', -"surrounded" = 'sound/vox_fem/surrounded.ogg', -"surround" = 'sound/vox_fem/surround.ogg', -"sweating" = 'sound/vox_fem/sweating.ogg', -"swhitenoise" = 'sound/vox_fem/swhitenoise.ogg', -"switch" = 'sound/vox_fem/switch.ogg', -"syndicate" = 'sound/vox_fem/syndicate.ogg', -"system" = 'sound/vox_fem/system.ogg', -"systems" = 'sound/vox_fem/systems.ogg', -"table" = 'sound/vox_fem/table.ogg', -"tactical" = 'sound/vox_fem/tactical.ogg', -"take" = 'sound/vox_fem/take.ogg', -"talk" = 'sound/vox_fem/talk.ogg', -"tampered" = 'sound/vox_fem/tampered.ogg', -"tango" = 'sound/vox_fem/tango.ogg', -"tank" = 'sound/vox_fem/tank.ogg', -"target" = 'sound/vox_fem/target.ogg', -"team" = 'sound/vox_fem/team.ogg', -"technician" = 'sound/vox_fem/technician.ogg', -"technology" = 'sound/vox_fem/technology.ogg', -"tech" = 'sound/vox_fem/tech.ogg', -"temperature" = 'sound/vox_fem/temperature.ogg', -"temporal" = 'sound/vox_fem/temporal.ogg', -"ten" = 'sound/vox_fem/ten.ogg', -"terminal" = 'sound/vox_fem/terminal.ogg', -"terminated" = 'sound/vox_fem/terminated.ogg', -"termination" = 'sound/vox_fem/termination.ogg', -"test" = 'sound/vox_fem/test.ogg', -"text" = 'sound/vox_fem/text.ogg', -"that" = 'sound/vox_fem/that.ogg', -"theater" = 'sound/vox_fem/theater.ogg', -"them" = 'sound/vox_fem/them.ogg', -"then" = 'sound/vox_fem/then.ogg', -"the" = 'sound/vox_fem/the.ogg', -"there" = 'sound/vox_fem/there.ogg', -"they" = 'sound/vox_fem/they.ogg', -"third" = 'sound/vox_fem/third.ogg', -"thirteen" = 'sound/vox_fem/thirteen.ogg', -"thirty" = 'sound/vox_fem/thirty.ogg', -"this" = 'sound/vox_fem/this.ogg', -"those" = 'sound/vox_fem/those.ogg', -"thousand" = 'sound/vox_fem/thousand.ogg', -"threat" = 'sound/vox_fem/threat.ogg', -"three" = 'sound/vox_fem/three.ogg', -"through" = 'sound/vox_fem/through.ogg', -"tide" = 'sound/vox_fem/tide.ogg', -"time" = 'sound/vox_fem/time.ogg', -"t" = 'sound/vox_fem/t.ogg', -"to" = 'sound/vox_fem/to.ogg', -"top" = 'sound/vox_fem/top.ogg', -"topside" = 'sound/vox_fem/topside.ogg', -"touch" = 'sound/vox_fem/touch.ogg', -"towards" = 'sound/vox_fem/towards.ogg', -"toxins" = 'sound/vox_fem/toxins.ogg', -"track" = 'sound/vox_fem/track.ogg', -"train" = 'sound/vox_fem/train.ogg', -"traitor" = 'sound/vox_fem/traitor.ogg', -"transportation" = 'sound/vox_fem/transportation.ogg', -"truck" = 'sound/vox_fem/truck.ogg', -"true" = 'sound/vox_fem/true.ogg', -"tunnel" = 'sound/vox_fem/tunnel.ogg', -"turn" = 'sound/vox_fem/turn.ogg', -"turret" = 'sound/vox_fem/turret.ogg', -"twelve" = 'sound/vox_fem/twelve.ogg', -"twenty" = 'sound/vox_fem/twenty.ogg', -"two" = 'sound/vox_fem/two.ogg', -"ughh" = 'sound/vox_fem/ughh.ogg', -"ugh" = 'sound/vox_fem/ugh.ogg', -"unable" = 'sound/vox_fem/unable.ogg', -"unauthorized" = 'sound/vox_fem/unauthorized.ogg', -"under" = 'sound/vox_fem/under.ogg', -"uniform" = 'sound/vox_fem/uniform.ogg', -"unknown" = 'sound/vox_fem/unknown.ogg', -"unlocked" = 'sound/vox_fem/unlocked.ogg', -"unsafe" = 'sound/vox_fem/unsafe.ogg', -"until" = 'sound/vox_fem/until.ogg', -"u" = 'sound/vox_fem/u.ogg', -"updated" = 'sound/vox_fem/updated.ogg', -"update" = 'sound/vox_fem/update.ogg', -"updating" = 'sound/vox_fem/updating.ogg', -"upload" = 'sound/vox_fem/upload.ogg', -"up" = 'sound/vox_fem/up.ogg', -"upper" = 'sound/vox_fem/upper.ogg', -"uranium" = 'sound/vox_fem/uranium.ogg', -"usa" = 'sound/vox_fem/usa.ogg', -"used" = 'sound/vox_fem/used.ogg', -"use" = 'sound/vox_fem/use.ogg', -"user" = 'sound/vox_fem/user.ogg', -"us" = 'sound/vox_fem/us.ogg', -"vacate" = 'sound/vox_fem/vacate.ogg', -"vacuum" = 'sound/vox_fem/vacuum.ogg', -"valid" = 'sound/vox_fem/valid.ogg', -"vapor" = 'sound/vox_fem/vapor.ogg', -"vendor" = 'sound/vox_fem/vendor.ogg', -"ventilation" = 'sound/vox_fem/ventilation.ogg', -"vent" = 'sound/vox_fem/vent.ogg', -"very" = 'sound/vox_fem/very.ogg', -"victor" = 'sound/vox_fem/victor.ogg', -"violated" = 'sound/vox_fem/violated.ogg', -"violation" = 'sound/vox_fem/violation.ogg', -"virologist" = 'sound/vox_fem/virologist.ogg', -"virology" = 'sound/vox_fem/virology.ogg', -"virus" = 'sound/vox_fem/virus.ogg', -"vitals" = 'sound/vox_fem/vitals.ogg', -"v" = 'sound/vox_fem/v.ogg', -"voltage" = 'sound/vox_fem/voltage.ogg', -"vox_login" = 'sound/vox_fem/vox_login.ogg', -"vox" = 'sound/vox_fem/vox.ogg', -"voxtest" = 'sound/vox_fem/voxtest.ogg', -"walk" = 'sound/vox_fem/walk.ogg', -"wall" = 'sound/vox_fem/wall.ogg', -"wanker" = 'sound/vox_fem/wanker.ogg', -"wanted" = 'sound/vox_fem/wanted.ogg', -"want" = 'sound/vox_fem/want.ogg', -"warden" = 'sound/vox_fem/warden.ogg', -"warm" = 'sound/vox_fem/warm.ogg', -"warning" = 'sound/vox_fem/warning.ogg', -"warn" = 'sound/vox_fem/warn.ogg', -"waste" = 'sound/vox_fem/waste.ogg', -"water" = 'sound/vox_fem/water.ogg', -"weak" = 'sound/vox_fem/weak.ogg', -"weapon" = 'sound/vox_fem/weapon.ogg', -"welcome" = 'sound/vox_fem/welcome.ogg', -"we" = 'sound/vox_fem/we.ogg', -"west" = 'sound/vox_fem/west.ogg', -"wew" = 'sound/vox_fem/wew.ogg', -"what" = 'sound/vox_fem/what.ogg', -"when" = 'sound/vox_fem/when.ogg', -"where" = 'sound/vox_fem/where.ogg', -"whiskey" = 'sound/vox_fem/whiskey.ogg', -"white" = 'sound/vox_fem/white.ogg', -"why" = 'sound/vox_fem/why.ogg', -"wilco" = 'sound/vox_fem/wilco.ogg', -"will" = 'sound/vox_fem/will.ogg', -"wing" = 'sound/vox_fem/wing.ogg', -"wire" = 'sound/vox_fem/wire.ogg', -"with" = 'sound/vox_fem/with.ogg', -"without" = 'sound/vox_fem/without.ogg', -"wizard" = 'sound/vox_fem/wizard.ogg', -"w" = 'sound/vox_fem/w.ogg', -"wood" = 'sound/vox_fem/wood.ogg', -"woody" = 'sound/vox_fem/woody.ogg', -"woop" = 'sound/vox_fem/woop.ogg', -"wow" = 'sound/vox_fem/wow.ogg', -"xenobiology" = 'sound/vox_fem/xenobiology.ogg', -"xenomorph" = 'sound/vox_fem/xenomorph.ogg', -"xenomorphs" = 'sound/vox_fem/xenomorphs.ogg', -"xeno" = 'sound/vox_fem/xeno.ogg', -"x" = 'sound/vox_fem/x.ogg', -"yankee" = 'sound/vox_fem/yankee.ogg', -"yards" = 'sound/vox_fem/yards.ogg', -"year" = 'sound/vox_fem/year.ogg', -"yellow" = 'sound/vox_fem/yellow.ogg', -"yes" = 'sound/vox_fem/yes.ogg', -"y" = 'sound/vox_fem/y.ogg', -"you" = 'sound/vox_fem/you.ogg', -"your" = 'sound/vox_fem/your.ogg', -"yourself" = 'sound/vox_fem/yourself.ogg', -"zero" = 'sound/vox_fem/zero.ogg', -"z" = 'sound/vox_fem/z.ogg', -"zombie" = 'sound/vox_fem/zombie.ogg', -"zone" = 'sound/vox_fem/zone.ogg', -"zulu" = 'sound/vox_fem/zulu.ogg')) +GLOBAL_LIST_INIT(vox_types, init_vox_list()) -//for vim -// :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox\/\1',/g -GLOBAL_LIST_INIT(vox_sounds_male, list("," = 'sound/vox/_comma.ogg', -"." = 'sound/vox/_period.ogg', -"a" = 'sound/vox/a.ogg', -"accelerating" = 'sound/vox/accelerating.ogg', -"accelerator" = 'sound/vox/accelerator.ogg', -"accepted" = 'sound/vox/accepted.ogg', -"access" = 'sound/vox/access.ogg', -"acknowledge" = 'sound/vox/acknowledge.ogg', -"acknowledged" = 'sound/vox/acknowledged.ogg', -"acquired" = 'sound/vox/acquired.ogg', -"acquisition" = 'sound/vox/acquisition.ogg', -"across" = 'sound/vox/across.ogg', -"activate" = 'sound/vox/activate.ogg', -"activated" = 'sound/vox/activated.ogg', -"activity" = 'sound/vox/activity.ogg', -"adios" = 'sound/vox/adios.ogg', -"administration" = 'sound/vox/administration.ogg', -"advanced" = 'sound/vox/advanced.ogg', -"after" = 'sound/vox/after.ogg', -"agent" = 'sound/vox/agent.ogg', -"alarm" = 'sound/vox/alarm.ogg', -"alert" = 'sound/vox/alert.ogg', -"alien" = 'sound/vox/alien.ogg', -"aligned" = 'sound/vox/aligned.ogg', -"all" = 'sound/vox/all.ogg', -"alpha" = 'sound/vox/alpha.ogg', -"am" = 'sound/vox/am.ogg', -"amigo" = 'sound/vox/amigo.ogg', -"ammunition" = 'sound/vox/ammunition.ogg', -"an" = 'sound/vox/an.ogg', -"and" = 'sound/vox/and.ogg', -"announcement" = 'sound/vox/announcement.ogg', -"anomalous" = 'sound/vox/anomalous.ogg', -"antenna" = 'sound/vox/antenna.ogg', -"any" = 'sound/vox/any.ogg', -"apprehend" = 'sound/vox/apprehend.ogg', -"approach" = 'sound/vox/approach.ogg', -"are" = 'sound/vox/are.ogg', -"area" = 'sound/vox/area.ogg', -"arm" = 'sound/vox/arm.ogg', -"armed" = 'sound/vox/armed.ogg', -"armor" = 'sound/vox/armor.ogg', -"armory" = 'sound/vox/armory.ogg', -"arrest" = 'sound/vox/arrest.ogg', -"ass" = 'sound/vox/ass.ogg', -"at" = 'sound/vox/at.ogg', -"atomic" = 'sound/vox/atomic.ogg', -"attention" = 'sound/vox/attention.ogg', -"authorize" = 'sound/vox/authorize.ogg', -"authorized" = 'sound/vox/authorized.ogg', -"automatic" = 'sound/vox/automatic.ogg', -"away" = 'sound/vox/away.ogg', -"b" = 'sound/vox/b.ogg', -"back" = 'sound/vox/back.ogg', -"backman" = 'sound/vox/backman.ogg', -"bad" = 'sound/vox/bad.ogg', -"bag" = 'sound/vox/bag.ogg', -"bailey" = 'sound/vox/bailey.ogg', -"barracks" = 'sound/vox/barracks.ogg', -"base" = 'sound/vox/base.ogg', -"bay" = 'sound/vox/bay.ogg', -"be" = 'sound/vox/be.ogg', -"been" = 'sound/vox/been.ogg', -"before" = 'sound/vox/before.ogg', -"beyond" = 'sound/vox/beyond.ogg', -"biohazard" = 'sound/vox/biohazard.ogg', -"biological" = 'sound/vox/biological.ogg', -"birdwell" = 'sound/vox/birdwell.ogg', -"bizwarn" = 'sound/vox/bizwarn.ogg', -"black" = 'sound/vox/black.ogg', -"blast" = 'sound/vox/blast.ogg', -"blocked" = 'sound/vox/blocked.ogg', -"bloop" = 'sound/vox/bloop.ogg', -"blue" = 'sound/vox/blue.ogg', -"bottom" = 'sound/vox/bottom.ogg', -"bravo" = 'sound/vox/bravo.ogg', -"breach" = 'sound/vox/breach.ogg', -"breached" = 'sound/vox/breached.ogg', -"break" = 'sound/vox/break.ogg', -"bridge" = 'sound/vox/bridge.ogg', -"bust" = 'sound/vox/bust.ogg', -"but" = 'sound/vox/but.ogg', -"button" = 'sound/vox/button.ogg', -"buzwarn" = 'sound/vox/buzwarn.ogg', -"bypass" = 'sound/vox/bypass.ogg', -"c" = 'sound/vox/c.ogg', -"cable" = 'sound/vox/cable.ogg', -"call" = 'sound/vox/call.ogg', -"called" = 'sound/vox/called.ogg', -"canal" = 'sound/vox/canal.ogg', -"cap" = 'sound/vox/cap.ogg', -"captain" = 'sound/vox/captain.ogg', -"capture" = 'sound/vox/capture.ogg', -"captured" = 'sound/vox/captured.ogg', -"ceiling" = 'sound/vox/ceiling.ogg', -"celsius" = 'sound/vox/celsius.ogg', -"center" = 'sound/vox/center.ogg', -"centi" = 'sound/vox/centi.ogg', -"central" = 'sound/vox/central.ogg', -"chamber" = 'sound/vox/chamber.ogg', -"charlie" = 'sound/vox/charlie.ogg', -"check" = 'sound/vox/check.ogg', -"checkpoint" = 'sound/vox/checkpoint.ogg', -"chemical" = 'sound/vox/chemical.ogg', -"cleanup" = 'sound/vox/cleanup.ogg', -"clear" = 'sound/vox/clear.ogg', -"clearance" = 'sound/vox/clearance.ogg', -"close" = 'sound/vox/close.ogg', -"clown" = 'sound/vox/clown.ogg', -"code" = 'sound/vox/code.ogg', -"coded" = 'sound/vox/coded.ogg', -"collider" = 'sound/vox/collider.ogg', -"command" = 'sound/vox/command.ogg', -"communication" = 'sound/vox/communication.ogg', -"complex" = 'sound/vox/complex.ogg', -"computer" = 'sound/vox/computer.ogg', -"condition" = 'sound/vox/condition.ogg', -"containment" = 'sound/vox/containment.ogg', -"contamination" = 'sound/vox/contamination.ogg', -"control" = 'sound/vox/control.ogg', -"coolant" = 'sound/vox/coolant.ogg', -"coomer" = 'sound/vox/coomer.ogg', -"core" = 'sound/vox/core.ogg', -"correct" = 'sound/vox/correct.ogg', -"corridor" = 'sound/vox/corridor.ogg', -"crew" = 'sound/vox/crew.ogg', -"cross" = 'sound/vox/cross.ogg', -"cryogenic" = 'sound/vox/cryogenic.ogg', -"d" = 'sound/vox/d.ogg', -"dadeda" = 'sound/vox/dadeda.ogg', -"damage" = 'sound/vox/damage.ogg', -"damaged" = 'sound/vox/damaged.ogg', -"danger" = 'sound/vox/danger.ogg', -"day" = 'sound/vox/day.ogg', -"deactivated" = 'sound/vox/deactivated.ogg', -"decompression" = 'sound/vox/decompression.ogg', -"decontamination" = 'sound/vox/decontamination.ogg', -"deeoo" = 'sound/vox/deeoo.ogg', -"defense" = 'sound/vox/defense.ogg', -"degrees" = 'sound/vox/degrees.ogg', -"delta" = 'sound/vox/delta.ogg', -"denied" = 'sound/vox/denied.ogg', -"deploy" = 'sound/vox/deploy.ogg', -"deployed" = 'sound/vox/deployed.ogg', -"destroy" = 'sound/vox/destroy.ogg', -"destroyed" = 'sound/vox/destroyed.ogg', -"detain" = 'sound/vox/detain.ogg', -"detected" = 'sound/vox/detected.ogg', -"detonation" = 'sound/vox/detonation.ogg', -"device" = 'sound/vox/device.ogg', -"did" = 'sound/vox/did.ogg', -"die" = 'sound/vox/die.ogg', -"dimensional" = 'sound/vox/dimensional.ogg', -"dirt" = 'sound/vox/dirt.ogg', -"disengaged" = 'sound/vox/disengaged.ogg', -"dish" = 'sound/vox/dish.ogg', -"disposal" = 'sound/vox/disposal.ogg', -"distance" = 'sound/vox/distance.ogg', -"distortion" = 'sound/vox/distortion.ogg', -"do" = 'sound/vox/do.ogg', -"doctor" = 'sound/vox/doctor.ogg', -"doop" = 'sound/vox/doop.ogg', -"door" = 'sound/vox/door.ogg', -"down" = 'sound/vox/down.ogg', -"dual" = 'sound/vox/dual.ogg', -"duct" = 'sound/vox/duct.ogg', -"e" = 'sound/vox/e.ogg', -"east" = 'sound/vox/east.ogg', -"echo" = 'sound/vox/echo.ogg', -"ed" = 'sound/vox/ed.ogg', -"effect" = 'sound/vox/effect.ogg', -"egress" = 'sound/vox/egress.ogg', -"eight" = 'sound/vox/eight.ogg', -"eighteen" = 'sound/vox/eighteen.ogg', -"eighty" = 'sound/vox/eighty.ogg', -"electric" = 'sound/vox/electric.ogg', -"electromagnetic" = 'sound/vox/electromagnetic.ogg', -"elevator" = 'sound/vox/elevator.ogg', -"eleven" = 'sound/vox/eleven.ogg', -"eliminate" = 'sound/vox/eliminate.ogg', -"emergency" = 'sound/vox/emergency.ogg', -"enemy" = 'sound/vox/enemy.ogg', -"energy" = 'sound/vox/energy.ogg', -"engage" = 'sound/vox/engage.ogg', -"engaged" = 'sound/vox/engaged.ogg', -"engine" = 'sound/vox/engine.ogg', -"enter" = 'sound/vox/enter.ogg', -"entry" = 'sound/vox/entry.ogg', -"environment" = 'sound/vox/environment.ogg', -"error" = 'sound/vox/error.ogg', -"escape" = 'sound/vox/escape.ogg', -"evacuate" = 'sound/vox/evacuate.ogg', -"exchange" = 'sound/vox/exchange.ogg', -"exit" = 'sound/vox/exit.ogg', -"expect" = 'sound/vox/expect.ogg', -"experiment" = 'sound/vox/experiment.ogg', -"experimental" = 'sound/vox/experimental.ogg', -"explode" = 'sound/vox/explode.ogg', -"explosion" = 'sound/vox/explosion.ogg', -"exposure" = 'sound/vox/exposure.ogg', -"exterminate" = 'sound/vox/exterminate.ogg', -"extinguish" = 'sound/vox/extinguish.ogg', -"extinguisher" = 'sound/vox/extinguisher.ogg', -"extreme" = 'sound/vox/extreme.ogg', -"f" = 'sound/vox/f.ogg', -"face" = 'sound/vox/face.ogg', -"facility" = 'sound/vox/facility.ogg', -"fahrenheit" = 'sound/vox/fahrenheit.ogg', -"failed" = 'sound/vox/failed.ogg', -"failure" = 'sound/vox/failure.ogg', -"farthest" = 'sound/vox/farthest.ogg', -"fast" = 'sound/vox/fast.ogg', -"feet" = 'sound/vox/feet.ogg', -"field" = 'sound/vox/field.ogg', -"fifteen" = 'sound/vox/fifteen.ogg', -"fifth" = 'sound/vox/fifth.ogg', -"fifty" = 'sound/vox/fifty.ogg', -"final" = 'sound/vox/final.ogg', -"fine" = 'sound/vox/fine.ogg', -"fire" = 'sound/vox/fire.ogg', -"first" = 'sound/vox/first.ogg', -"five" = 'sound/vox/five.ogg', -"flag" = 'sound/vox/flag.ogg', -"flooding" = 'sound/vox/flooding.ogg', -"floor" = 'sound/vox/floor.ogg', -"fool" = 'sound/vox/fool.ogg', -"for" = 'sound/vox/for.ogg', -"forbidden" = 'sound/vox/forbidden.ogg', -"force" = 'sound/vox/force.ogg', -"forms" = 'sound/vox/forms.ogg', -"found" = 'sound/vox/found.ogg', -"four" = 'sound/vox/four.ogg', -"fourteen" = 'sound/vox/fourteen.ogg', -"fourth" = 'sound/vox/fourth.ogg', -"fourty" = 'sound/vox/fourty.ogg', -"foxtrot" = 'sound/vox/foxtrot.ogg', -"freeman" = 'sound/vox/freeman.ogg', -"freezer" = 'sound/vox/freezer.ogg', -"from" = 'sound/vox/from.ogg', -"front" = 'sound/vox/front.ogg', -"fuel" = 'sound/vox/fuel.ogg', -"g" = 'sound/vox/g.ogg', -"gay" = 'sound/vox/gay.ogg', -"get" = 'sound/vox/get.ogg', -"go" = 'sound/vox/go.ogg', -"going" = 'sound/vox/going.ogg', -"good" = 'sound/vox/good.ogg', -"goodbye" = 'sound/vox/goodbye.ogg', -"gordon" = 'sound/vox/gordon.ogg', -"got" = 'sound/vox/got.ogg', -"government" = 'sound/vox/government.ogg', -"granted" = 'sound/vox/granted.ogg', -"great" = 'sound/vox/great.ogg', -"green" = 'sound/vox/green.ogg', -"grenade" = 'sound/vox/grenade.ogg', -"guard" = 'sound/vox/guard.ogg', -"gulf" = 'sound/vox/gulf.ogg', -"gun" = 'sound/vox/gun.ogg', -"guthrie" = 'sound/vox/guthrie.ogg', -"handling" = 'sound/vox/handling.ogg', -"hangar" = 'sound/vox/hangar.ogg', -"has" = 'sound/vox/has.ogg', -"have" = 'sound/vox/have.ogg', -"hazard" = 'sound/vox/hazard.ogg', -"head" = 'sound/vox/head.ogg', -"health" = 'sound/vox/health.ogg', -"heat" = 'sound/vox/heat.ogg', -"helicopter" = 'sound/vox/helicopter.ogg', -"helium" = 'sound/vox/helium.ogg', -"hello" = 'sound/vox/hello.ogg', -"help" = 'sound/vox/help.ogg', -"here" = 'sound/vox/here.ogg', -"hide" = 'sound/vox/hide.ogg', -"high" = 'sound/vox/high.ogg', -"highest" = 'sound/vox/highest.ogg', -"hit" = 'sound/vox/hit.ogg', -"holds" = 'sound/vox/holds.ogg', -"hole" = 'sound/vox/hole.ogg', -"hostile" = 'sound/vox/hostile.ogg', -"hot" = 'sound/vox/hot.ogg', -"hotel" = 'sound/vox/hotel.ogg', -"hour" = 'sound/vox/hour.ogg', -"hours" = 'sound/vox/hours.ogg', -"hundred" = 'sound/vox/hundred.ogg', -"hydro" = 'sound/vox/hydro.ogg', -"i" = 'sound/vox/i.ogg', -"idiot" = 'sound/vox/idiot.ogg', -"illegal" = 'sound/vox/illegal.ogg', -"immediate" = 'sound/vox/immediate.ogg', -"immediately" = 'sound/vox/immediately.ogg', -"in" = 'sound/vox/in.ogg', -"inches" = 'sound/vox/inches.ogg', -"india" = 'sound/vox/india.ogg', -"ing" = 'sound/vox/ing.ogg', -"inoperative" = 'sound/vox/inoperative.ogg', -"inside" = 'sound/vox/inside.ogg', -"inspection" = 'sound/vox/inspection.ogg', -"inspector" = 'sound/vox/inspector.ogg', -"interchange" = 'sound/vox/interchange.ogg', -"intruder" = 'sound/vox/intruder.ogg', -"invallid" = 'sound/vox/invallid.ogg', -"invasion" = 'sound/vox/invasion.ogg', -"is" = 'sound/vox/is.ogg', -"it" = 'sound/vox/it.ogg', -"johnson" = 'sound/vox/johnson.ogg', -"juliet" = 'sound/vox/juliet.ogg', -"key" = 'sound/vox/key.ogg', -"kill" = 'sound/vox/kill.ogg', -"kilo" = 'sound/vox/kilo.ogg', -"kit" = 'sound/vox/kit.ogg', -"lab" = 'sound/vox/lab.ogg', -"lambda" = 'sound/vox/lambda.ogg', -"laser" = 'sound/vox/laser.ogg', -"last" = 'sound/vox/last.ogg', -"launch" = 'sound/vox/launch.ogg', -"leak" = 'sound/vox/leak.ogg', -"leave" = 'sound/vox/leave.ogg', -"left" = 'sound/vox/left.ogg', -"legal" = 'sound/vox/legal.ogg', -"level" = 'sound/vox/level.ogg', -"lever" = 'sound/vox/lever.ogg', -"lie" = 'sound/vox/lie.ogg', -"lieutenant" = 'sound/vox/lieutenant.ogg', -"life" = 'sound/vox/life.ogg', -"light" = 'sound/vox/light.ogg', -"lima" = 'sound/vox/lima.ogg', -"liquid" = 'sound/vox/liquid.ogg', -"loading" = 'sound/vox/loading.ogg', -"locate" = 'sound/vox/locate.ogg', -"located" = 'sound/vox/located.ogg', -"location" = 'sound/vox/location.ogg', -"lock" = 'sound/vox/lock.ogg', -"locked" = 'sound/vox/locked.ogg', -"locker" = 'sound/vox/locker.ogg', -"lockout" = 'sound/vox/lockout.ogg', -"lower" = 'sound/vox/lower.ogg', -"lowest" = 'sound/vox/lowest.ogg', -"magnetic" = 'sound/vox/magnetic.ogg', -"main" = 'sound/vox/main.ogg', -"maintenance" = 'sound/vox/maintenance.ogg', -"malfunction" = 'sound/vox/malfunction.ogg', -"man" = 'sound/vox/man.ogg', -"mass" = 'sound/vox/mass.ogg', -"materials" = 'sound/vox/materials.ogg', -"maximum" = 'sound/vox/maximum.ogg', -"may" = 'sound/vox/may.ogg', -"med" = 'sound/vox/med.ogg', -"medical" = 'sound/vox/medical.ogg', -"men" = 'sound/vox/men.ogg', -"mercy" = 'sound/vox/mercy.ogg', -"mesa" = 'sound/vox/mesa.ogg', -"message" = 'sound/vox/message.ogg', -"meter" = 'sound/vox/meter.ogg', -"micro" = 'sound/vox/micro.ogg', -"middle" = 'sound/vox/middle.ogg', -"mike" = 'sound/vox/mike.ogg', -"miles" = 'sound/vox/miles.ogg', -"military" = 'sound/vox/military.ogg', -"milli" = 'sound/vox/milli.ogg', -"million" = 'sound/vox/million.ogg', -"minefield" = 'sound/vox/minefield.ogg', -"minimum" = 'sound/vox/minimum.ogg', -"minutes" = 'sound/vox/minutes.ogg', -"mister" = 'sound/vox/mister.ogg', -"mode" = 'sound/vox/mode.ogg', -"motor" = 'sound/vox/motor.ogg', -"motorpool" = 'sound/vox/motorpool.ogg', -"move" = 'sound/vox/move.ogg', -"must" = 'sound/vox/must.ogg', -"nearest" = 'sound/vox/nearest.ogg', -"nice" = 'sound/vox/nice.ogg', -"nine" = 'sound/vox/nine.ogg', -"nineteen" = 'sound/vox/nineteen.ogg', -"ninety" = 'sound/vox/ninety.ogg', -"no" = 'sound/vox/no.ogg', -"nominal" = 'sound/vox/nominal.ogg', -"north" = 'sound/vox/north.ogg', -"not" = 'sound/vox/not.ogg', -"november" = 'sound/vox/november.ogg', -"now" = 'sound/vox/now.ogg', -"number" = 'sound/vox/number.ogg', -"objective" = 'sound/vox/objective.ogg', -"observation" = 'sound/vox/observation.ogg', -"of" = 'sound/vox/of.ogg', -"officer" = 'sound/vox/officer.ogg', -"ok" = 'sound/vox/ok.ogg', -"on" = 'sound/vox/on.ogg', -"one" = 'sound/vox/one.ogg', -"open" = 'sound/vox/open.ogg', -"operating" = 'sound/vox/operating.ogg', -"operations" = 'sound/vox/operations.ogg', -"operative" = 'sound/vox/operative.ogg', -"option" = 'sound/vox/option.ogg', -"order" = 'sound/vox/order.ogg', -"organic" = 'sound/vox/organic.ogg', -"oscar" = 'sound/vox/oscar.ogg', -"out" = 'sound/vox/out.ogg', -"outside" = 'sound/vox/outside.ogg', -"over" = 'sound/vox/over.ogg', -"overload" = 'sound/vox/overload.ogg', -"override" = 'sound/vox/override.ogg', -"pacify" = 'sound/vox/pacify.ogg', -"pain" = 'sound/vox/pain.ogg', -"pal" = 'sound/vox/pal.ogg', -"panel" = 'sound/vox/panel.ogg', -"percent" = 'sound/vox/percent.ogg', -"perimeter" = 'sound/vox/perimeter.ogg', -"permitted" = 'sound/vox/permitted.ogg', -"personnel" = 'sound/vox/personnel.ogg', -"pipe" = 'sound/vox/pipe.ogg', -"plant" = 'sound/vox/plant.ogg', -"platform" = 'sound/vox/platform.ogg', -"please" = 'sound/vox/please.ogg', -"point" = 'sound/vox/point.ogg', -"portal" = 'sound/vox/portal.ogg', -"power" = 'sound/vox/power.ogg', -"presence" = 'sound/vox/presence.ogg', -"press" = 'sound/vox/press.ogg', -"primary" = 'sound/vox/primary.ogg', -"proceed" = 'sound/vox/proceed.ogg', -"processing" = 'sound/vox/processing.ogg', -"progress" = 'sound/vox/progress.ogg', -"proper" = 'sound/vox/proper.ogg', -"propulsion" = 'sound/vox/propulsion.ogg', -"prosecute" = 'sound/vox/prosecute.ogg', -"protective" = 'sound/vox/protective.ogg', -"push" = 'sound/vox/push.ogg', -"quantum" = 'sound/vox/quantum.ogg', -"quebec" = 'sound/vox/quebec.ogg', -"question" = 'sound/vox/question.ogg', -"questioning" = 'sound/vox/questioning.ogg', -"quick" = 'sound/vox/quick.ogg', -"quit" = 'sound/vox/quit.ogg', -"radiation" = 'sound/vox/radiation.ogg', -"radioactive" = 'sound/vox/radioactive.ogg', -"rads" = 'sound/vox/rads.ogg', -"rapid" = 'sound/vox/rapid.ogg', -"reach" = 'sound/vox/reach.ogg', -"reached" = 'sound/vox/reached.ogg', -"reactor" = 'sound/vox/reactor.ogg', -"red" = 'sound/vox/red.ogg', -"relay" = 'sound/vox/relay.ogg', -"released" = 'sound/vox/released.ogg', -"remaining" = 'sound/vox/remaining.ogg', -"renegade" = 'sound/vox/renegade.ogg', -"repair" = 'sound/vox/repair.ogg', -"report" = 'sound/vox/report.ogg', -"reports" = 'sound/vox/reports.ogg', -"required" = 'sound/vox/required.ogg', -"research" = 'sound/vox/research.ogg', -"reset" = 'sound/vox/reset.ogg', -"resevoir" = 'sound/vox/resevoir.ogg', -"resistance" = 'sound/vox/resistance.ogg', -"returned" = 'sound/vox/returned.ogg', -"right" = 'sound/vox/right.ogg', -"rocket" = 'sound/vox/rocket.ogg', -"roger" = 'sound/vox/roger.ogg', -"romeo" = 'sound/vox/romeo.ogg', -"room" = 'sound/vox/room.ogg', -"round" = 'sound/vox/round.ogg', -"run" = 'sound/vox/run.ogg', -"safe" = 'sound/vox/safe.ogg', -"safety" = 'sound/vox/safety.ogg', -"sargeant" = 'sound/vox/sargeant.ogg', -"satellite" = 'sound/vox/satellite.ogg', -"save" = 'sound/vox/save.ogg', -"science" = 'sound/vox/science.ogg', -"scores" = 'sound/vox/scores.ogg', -"scream" = 'sound/vox/scream.ogg', -"screen" = 'sound/vox/screen.ogg', -"search" = 'sound/vox/search.ogg', -"second" = 'sound/vox/second.ogg', -"secondary" = 'sound/vox/secondary.ogg', -"seconds" = 'sound/vox/seconds.ogg', -"sector" = 'sound/vox/sector.ogg', -"secure" = 'sound/vox/secure.ogg', -"secured" = 'sound/vox/secured.ogg', -"security" = 'sound/vox/security.ogg', -"select" = 'sound/vox/select.ogg', -"selected" = 'sound/vox/selected.ogg', -"service" = 'sound/vox/service.ogg', -"seven" = 'sound/vox/seven.ogg', -"seventeen" = 'sound/vox/seventeen.ogg', -"seventy" = 'sound/vox/seventy.ogg', -"severe" = 'sound/vox/severe.ogg', -"sewage" = 'sound/vox/sewage.ogg', -"sewer" = 'sound/vox/sewer.ogg', -"shield" = 'sound/vox/shield.ogg', -"shipment" = 'sound/vox/shipment.ogg', -"shock" = 'sound/vox/shock.ogg', -"shoot" = 'sound/vox/shoot.ogg', -"shower" = 'sound/vox/shower.ogg', -"shut" = 'sound/vox/shut.ogg', -"side" = 'sound/vox/side.ogg', -"sierra" = 'sound/vox/sierra.ogg', -"sight" = 'sound/vox/sight.ogg', -"silo" = 'sound/vox/silo.ogg', -"six" = 'sound/vox/six.ogg', -"sixteen" = 'sound/vox/sixteen.ogg', -"sixty" = 'sound/vox/sixty.ogg', -"slime" = 'sound/vox/slime.ogg', -"slow" = 'sound/vox/slow.ogg', -"soldier" = 'sound/vox/soldier.ogg', -"some" = 'sound/vox/some.ogg', -"someone" = 'sound/vox/someone.ogg', -"something" = 'sound/vox/something.ogg', -"son" = 'sound/vox/son.ogg', -"sorry" = 'sound/vox/sorry.ogg', -"south" = 'sound/vox/south.ogg', -"squad" = 'sound/vox/squad.ogg', -"square" = 'sound/vox/square.ogg', -"stairway" = 'sound/vox/stairway.ogg', -"status" = 'sound/vox/status.ogg', -"sterile" = 'sound/vox/sterile.ogg', -"sterilization" = 'sound/vox/sterilization.ogg', -"stolen" = 'sound/vox/stolen.ogg', -"storage" = 'sound/vox/storage.ogg', -"sub" = 'sound/vox/sub.ogg', -"subsurface" = 'sound/vox/subsurface.ogg', -"sudden" = 'sound/vox/sudden.ogg', -"suit" = 'sound/vox/suit.ogg', -"superconducting" = 'sound/vox/superconducting.ogg', -"supercooled" = 'sound/vox/supercooled.ogg', -"supply" = 'sound/vox/supply.ogg', -"surface" = 'sound/vox/surface.ogg', -"surrender" = 'sound/vox/surrender.ogg', -"surround" = 'sound/vox/surround.ogg', -"surrounded" = 'sound/vox/surrounded.ogg', -"switch" = 'sound/vox/switch.ogg', -"system" = 'sound/vox/system.ogg', -"systems" = 'sound/vox/systems.ogg', -"tactical" = 'sound/vox/tactical.ogg', -"take" = 'sound/vox/take.ogg', -"talk" = 'sound/vox/talk.ogg', -"tango" = 'sound/vox/tango.ogg', -"tank" = 'sound/vox/tank.ogg', -"target" = 'sound/vox/target.ogg', -"team" = 'sound/vox/team.ogg', -"temperature" = 'sound/vox/temperature.ogg', -"temporal" = 'sound/vox/temporal.ogg', -"ten" = 'sound/vox/ten.ogg', -"terminal" = 'sound/vox/terminal.ogg', -"terminated" = 'sound/vox/terminated.ogg', -"termination" = 'sound/vox/termination.ogg', -"test" = 'sound/vox/test.ogg', -"that" = 'sound/vox/that.ogg', -"the" = 'sound/vox/the.ogg', -"then" = 'sound/vox/then.ogg', -"there" = 'sound/vox/there.ogg', -"third" = 'sound/vox/third.ogg', -"thirteen" = 'sound/vox/thirteen.ogg', -"thirty" = 'sound/vox/thirty.ogg', -"this" = 'sound/vox/this.ogg', -"those" = 'sound/vox/those.ogg', -"thousand" = 'sound/vox/thousand.ogg', -"threat" = 'sound/vox/threat.ogg', -"three" = 'sound/vox/three.ogg', -"through" = 'sound/vox/through.ogg', -"time" = 'sound/vox/time.ogg', -"to" = 'sound/vox/to.ogg', -"top" = 'sound/vox/top.ogg', -"topside" = 'sound/vox/topside.ogg', -"touch" = 'sound/vox/touch.ogg', -"towards" = 'sound/vox/towards.ogg', -"track" = 'sound/vox/track.ogg', -"train" = 'sound/vox/train.ogg', -"transportation" = 'sound/vox/transportation.ogg', -"truck" = 'sound/vox/truck.ogg', -"tunnel" = 'sound/vox/tunnel.ogg', -"turn" = 'sound/vox/turn.ogg', -"turret" = 'sound/vox/turret.ogg', -"twelve" = 'sound/vox/twelve.ogg', -"twenty" = 'sound/vox/twenty.ogg', -"two" = 'sound/vox/two.ogg', -"unauthorized" = 'sound/vox/unauthorized.ogg', -"under" = 'sound/vox/under.ogg', -"uniform" = 'sound/vox/uniform.ogg', -"unlocked" = 'sound/vox/unlocked.ogg', -"until" = 'sound/vox/until.ogg', -"up" = 'sound/vox/up.ogg', -"upper" = 'sound/vox/upper.ogg', -"uranium" = 'sound/vox/uranium.ogg', -"us" = 'sound/vox/us.ogg', -"usa" = 'sound/vox/usa.ogg', -"use" = 'sound/vox/use.ogg', -"used" = 'sound/vox/used.ogg', -"user" = 'sound/vox/user.ogg', -"vacate" = 'sound/vox/vacate.ogg', -"valid" = 'sound/vox/valid.ogg', -"vapor" = 'sound/vox/vapor.ogg', -"vent" = 'sound/vox/vent.ogg', -"ventillation" = 'sound/vox/ventillation.ogg', -"victor" = 'sound/vox/victor.ogg', -"violated" = 'sound/vox/violated.ogg', -"violation" = 'sound/vox/violation.ogg', -"voltage" = 'sound/vox/voltage.ogg', -"vox_login" = 'sound/vox/vox_login.ogg', -"walk" = 'sound/vox/walk.ogg', -"wall" = 'sound/vox/wall.ogg', -"want" = 'sound/vox/want.ogg', -"wanted" = 'sound/vox/wanted.ogg', -"warm" = 'sound/vox/warm.ogg', -"warn" = 'sound/vox/warn.ogg', -"warning" = 'sound/vox/warning.ogg', -"waste" = 'sound/vox/waste.ogg', -"water" = 'sound/vox/water.ogg', -"we" = 'sound/vox/we.ogg', -"weapon" = 'sound/vox/weapon.ogg', -"west" = 'sound/vox/west.ogg', -"whiskey" = 'sound/vox/whiskey.ogg', -"white" = 'sound/vox/white.ogg', -"wilco" = 'sound/vox/wilco.ogg', -"will" = 'sound/vox/will.ogg', -"with" = 'sound/vox/with.ogg', -"without" = 'sound/vox/without.ogg', -"woop" = 'sound/vox/woop.ogg', -"xeno" = 'sound/vox/xeno.ogg', -"yankee" = 'sound/vox/yankee.ogg', -"yards" = 'sound/vox/yards.ogg', -"year" = 'sound/vox/year.ogg', -"yellow" = 'sound/vox/yellow.ogg', -"yes" = 'sound/vox/yes.ogg', -"you" = 'sound/vox/you.ogg', -"your" = 'sound/vox/your.ogg', -"yourself" = 'sound/vox/yourself.ogg', -"zero" = 'sound/vox/zero.ogg', -"zone" = 'sound/vox/zone.ogg', -"zulu" = 'sound/vox/zulu.ogg',)) + +/proc/init_vox_list() + return list( + // For vim + // :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox_fem\/\1',/g + "Female" = list( + "abduction" = 'sound/vox_fem/abduction.ogg', + "abortions" = 'sound/vox_fem/abortions.ogg', + "above" = 'sound/vox_fem/above.ogg', + "abstain" = 'sound/vox_fem/abstain.ogg', + "accelerating" = 'sound/vox_fem/accelerating.ogg', + "accelerator" = 'sound/vox_fem/accelerator.ogg', + "accepted" = 'sound/vox_fem/accepted.ogg', + "access" = 'sound/vox_fem/access.ogg', + "acknowledged" = 'sound/vox_fem/acknowledged.ogg', + "acknowledge" = 'sound/vox_fem/acknowledge.ogg', + "acquired" = 'sound/vox_fem/acquired.ogg', + "acquisition" = 'sound/vox_fem/acquisition.ogg', + "across" = 'sound/vox_fem/across.ogg', + "activated" = 'sound/vox_fem/activated.ogg', + "activate" = 'sound/vox_fem/activate.ogg', + "activity" = 'sound/vox_fem/activity.ogg', + "adios" = 'sound/vox_fem/adios.ogg', + "administration" = 'sound/vox_fem/administration.ogg', + "advanced" = 'sound/vox_fem/advanced.ogg', + "advised" = 'sound/vox_fem/advised.ogg', + "after" = 'sound/vox_fem/after.ogg', + "aft" = 'sound/vox_fem/aft.ogg', + "agent" = 'sound/vox_fem/agent.ogg', + "ai" = 'sound/vox_fem/ai.ogg', + "airlock" = 'sound/vox_fem/airlock.ogg', + "air" = 'sound/vox_fem/air.ogg', + "alarm" = 'sound/vox_fem/alarm.ogg', + "alert" = 'sound/vox_fem/alert.ogg', + "alien" = 'sound/vox_fem/alien.ogg', + "aligned" = 'sound/vox_fem/aligned.ogg', + "all" = 'sound/vox_fem/all.ogg', + "alpha" = 'sound/vox_fem/alpha.ogg', + "also" = 'sound/vox_fem/also.ogg', + "amigo" = 'sound/vox_fem/amigo.ogg', + "ammunition" = 'sound/vox_fem/ammunition.ogg', + "am" = 'sound/vox_fem/am.ogg', + "and" = 'sound/vox_fem/and.ogg', + "animal" = 'sound/vox_fem/animal.ogg', + "announcement" = 'sound/vox_fem/announcement.ogg', + "an" = 'sound/vox_fem/an.ogg', + "anomalous" = 'sound/vox_fem/anomalous.ogg', + "answer" = 'sound/vox_fem/answer.ogg', + "antenna" = 'sound/vox_fem/antenna.ogg', + "any" = 'sound/vox_fem/any.ogg', + "a" = 'sound/vox_fem/a.ogg', + "apc" = 'sound/vox_fem/apc.ogg', + "apprehend" = 'sound/vox_fem/apprehend.ogg', + "approach" = 'sound/vox_fem/approach.ogg', + "area" = 'sound/vox_fem/area.ogg', + "are" = 'sound/vox_fem/are.ogg', + "armed" = 'sound/vox_fem/armed.ogg', + "arm" = 'sound/vox_fem/arm.ogg', + "armor" = 'sound/vox_fem/armor.ogg', + "armory" = 'sound/vox_fem/armory.ogg', + "array" = 'sound/vox_fem/array.ogg', + "arrest" = 'sound/vox_fem/arrest.ogg', + "asimov" = 'sound/vox_fem/asimov.ogg', + "asshole" = 'sound/vox_fem/asshole.ogg', + "assholes" = 'sound/vox_fem/assholes.ogg', + "assistance" = 'sound/vox_fem/assistance.ogg', + "assistant" = 'sound/vox_fem/assistant.ogg', + "ass" = 'sound/vox_fem/ass.ogg', + "atmosphere" = 'sound/vox_fem/atmosphere.ogg', + "atmospheric" = 'sound/vox_fem/atmospheric.ogg', + "atmospherics" = 'sound/vox_fem/atmospherics.ogg', + "at" = 'sound/vox_fem/at.ogg', + "atomic" = 'sound/vox_fem/atomic.ogg', + "attention" = 'sound/vox_fem/attention.ogg', + "authentication" = 'sound/vox_fem/authentication.ogg', + "authorized" = 'sound/vox_fem/authorized.ogg', + "authorize" = 'sound/vox_fem/authorize.ogg', + "automatic" = 'sound/vox_fem/automatic.ogg', + "away" = 'sound/vox_fem/away.ogg', + "awful" = 'sound/vox_fem/awful.ogg', + "backman" = 'sound/vox_fem/backman.ogg', + "back" = 'sound/vox_fem/back.ogg', + "bad" = 'sound/vox_fem/bad.ogg', + "bag" = 'sound/vox_fem/bag.ogg', + "bailey" = 'sound/vox_fem/bailey.ogg', + "bar" = 'sound/vox_fem/bar.ogg', + "barracks" = 'sound/vox_fem/barracks.ogg', + "bartender" = 'sound/vox_fem/bartender.ogg', + "base" = 'sound/vox_fem/base.ogg', + "bay" = 'sound/vox_fem/bay.ogg', + "beam" = 'sound/vox_fem/beam.ogg', + "been" = 'sound/vox_fem/been.ogg', + "beep" = 'sound/vox_fem/beep.ogg', + "before" = 'sound/vox_fem/before.ogg', + "below" = 'sound/vox_fem/below.ogg', + "be" = 'sound/vox_fem/be.ogg', + "beside" = 'sound/vox_fem/beside.ogg', + "beware" = 'sound/vox_fem/beware.ogg', + "beyond" = 'sound/vox_fem/beyond.ogg', + "biohazard" = 'sound/vox_fem/biohazard.ogg', + "biological" = 'sound/vox_fem/biological.ogg', + "birdwell" = 'sound/vox_fem/birdwell.ogg', + "bitches" = 'sound/vox_fem/bitches.ogg', + "bitch" = 'sound/vox_fem/bitch.ogg', + "bitcoin" = 'sound/vox_fem/bitcoin.ogg', + "black" = 'sound/vox_fem/black.ogg', + "blast" = 'sound/vox_fem/blast.ogg', + "bleed" = 'sound/vox_fem/bleed.ogg', + "blob" = 'sound/vox_fem/blob.ogg', + "blocked" = 'sound/vox_fem/blocked.ogg', + "blood" = 'sound/vox_fem/blood.ogg', + "bloop" = 'sound/vox_fem/bloop.ogg', + "blue" = 'sound/vox_fem/blue.ogg', + "b" = 'sound/vox_fem/b.ogg', + "bomb" = 'sound/vox_fem/bomb.ogg', + "bone" = 'sound/vox_fem/bone.ogg', + "botanist" = 'sound/vox_fem/botanist.ogg', + "botany" = 'sound/vox_fem/botany.ogg', + "bottom" = 'sound/vox_fem/bottom.ogg', + "bravo" = 'sound/vox_fem/bravo.ogg', + "breached" = 'sound/vox_fem/breached.ogg', + "breach" = 'sound/vox_fem/breach.ogg', + "break" = 'sound/vox_fem/break.ogg', + "bridge" = 'sound/vox_fem/bridge.ogg', + "brig" = 'sound/vox_fem/brig.ogg', + "bust" = 'sound/vox_fem/bust.ogg', + "but" = 'sound/vox_fem/but.ogg', + "button" = 'sound/vox_fem/button.ogg', + "bypass" = 'sound/vox_fem/bypass.ogg', + "cable" = 'sound/vox_fem/cable.ogg', + "called" = 'sound/vox_fem/called.ogg', + "call" = 'sound/vox_fem/call.ogg', + "canal" = 'sound/vox_fem/canal.ogg', + "canister" = 'sound/vox_fem/canister.ogg', + "cap" = 'sound/vox_fem/cap.ogg', + "captain" = 'sound/vox_fem/captain.ogg', + "capture" = 'sound/vox_fem/capture.ogg', + "carbon" = 'sound/vox_fem/carbon.ogg', + "cargo" = 'sound/vox_fem/cargo.ogg', + "cat" = 'sound/vox_fem/cat.ogg', + "cease" = 'sound/vox_fem/cease.ogg', + "ceiling" = 'sound/vox_fem/ceiling.ogg', + "celsius" = 'sound/vox_fem/celsius.ogg', + "centcom" = 'sound/vox_fem/centcom.ogg', + "center" = 'sound/vox_fem/center.ogg', + "centi" = 'sound/vox_fem/centi.ogg', + "central" = 'sound/vox_fem/central.ogg', + "ce" = 'sound/vox_fem/ce.ogg', + "challenge" = 'sound/vox_fem/challenge.ogg', + "chamber" = 'sound/vox_fem/chamber.ogg', + "changed" = 'sound/vox_fem/changed.ogg', + "changeling" = 'sound/vox_fem/changeling.ogg', + "change" = 'sound/vox_fem/change.ogg', + "chapel" = 'sound/vox_fem/chapel.ogg', + "chaplain" = 'sound/vox_fem/chaplain.ogg', + "charlie" = 'sound/vox_fem/charlie.ogg', + "check" = 'sound/vox_fem/check.ogg', + "checkpoint" = 'sound/vox_fem/checkpoint.ogg', + "chemical" = 'sound/vox_fem/chemical.ogg', + "chemist" = 'sound/vox_fem/chemist.ogg', + "chief" = 'sound/vox_fem/chief.ogg', + "christ" = 'sound/vox_fem/christ.ogg', + "chuckle" = 'sound/vox_fem/chuckle.ogg', + "circuit" = 'sound/vox_fem/circuit.ogg', + "cleanup" = 'sound/vox_fem/cleanup.ogg', + "clearance" = 'sound/vox_fem/clearance.ogg', + "clear" = 'sound/vox_fem/clear.ogg', + "clockwork" = 'sound/vox_fem/clockwork.ogg', + "close" = 'sound/vox_fem/close.ogg', + "clowning" = 'sound/vox_fem/clowning.ogg', + "clown" = 'sound/vox_fem/clown.ogg', + "cmo" = 'sound/vox_fem/cmo.ogg', + "coded" = 'sound/vox_fem/coded.ogg', + "code" = 'sound/vox_fem/code.ogg', + "c" = 'sound/vox_fem/c.ogg', + "cold" = 'sound/vox_fem/cold.ogg', + "collider" = 'sound/vox_fem/collider.ogg', + "come" = 'sound/vox_fem/come.ogg', + "command" = 'sound/vox_fem/command.ogg', + "communication" = 'sound/vox_fem/communication.ogg', + "complex" = 'sound/vox_fem/complex.ogg', + "comply" = 'sound/vox_fem/comply.ogg', + "computer" = 'sound/vox_fem/computer.ogg', + "condition" = 'sound/vox_fem/condition.ogg', + "condom" = 'sound/vox_fem/condom.ogg', + "confirmed" = 'sound/vox_fem/confirmed.ogg', + "connor" = 'sound/vox_fem/connor.ogg', + "console2" = 'sound/vox_fem/console2.ogg', + "console" = 'sound/vox_fem/console.ogg', + "construct" = 'sound/vox_fem/construct.ogg', + "containment" = 'sound/vox_fem/containment.ogg', + "contamination" = 'sound/vox_fem/contamination.ogg', + "contraband" = 'sound/vox_fem/contraband.ogg', + "control" = 'sound/vox_fem/control.ogg', + "cook" = 'sound/vox_fem/cook.ogg', + "coolant" = 'sound/vox_fem/coolant.ogg', + "coomer" = 'sound/vox_fem/coomer.ogg', + "core" = 'sound/vox_fem/core.ogg', + "corgi" = 'sound/vox_fem/corgi.ogg', + "corporation" = 'sound/vox_fem/corporation.ogg', + "correct" = 'sound/vox_fem/correct.ogg', + "corridor" = 'sound/vox_fem/corridor.ogg', + "corridors" = 'sound/vox_fem/corridors.ogg', + "coward" = 'sound/vox_fem/coward.ogg', + "cowards" = 'sound/vox_fem/cowards.ogg', + "crate" = 'sound/vox_fem/crate.ogg', + "created" = 'sound/vox_fem/created.ogg', + "creature" = 'sound/vox_fem/creature.ogg', + "crew" = 'sound/vox_fem/crew.ogg', + "critical" = 'sound/vox_fem/critical.ogg', + "cross" = 'sound/vox_fem/cross.ogg', + "cryogenic" = 'sound/vox_fem/cryogenic.ogg', + "crystal" = 'sound/vox_fem/crystal.ogg', + "cultist" = 'sound/vox_fem/cultist.ogg', + "cult" = 'sound/vox_fem/cult.ogg', + "cunt" = 'sound/vox_fem/cunt.ogg', + "curator" = 'sound/vox_fem/curator.ogg', + "cyborg" = 'sound/vox_fem/cyborg.ogg', + "cyborgs" = 'sound/vox_fem/cyborgs.ogg', + "damaged" = 'sound/vox_fem/damaged.ogg', + "damage" = 'sound/vox_fem/damage.ogg', + "danger" = 'sound/vox_fem/danger.ogg', + "dangerous" = 'sound/vox_fem/dangerous.ogg', + "day" = 'sound/vox_fem/day.ogg', + "deactivated" = 'sound/vox_fem/deactivated.ogg', + "dead" = 'sound/vox_fem/dead.ogg', + "death" = 'sound/vox_fem/death.ogg', + "decompression" = 'sound/vox_fem/decompression.ogg', + "decontamination" = 'sound/vox_fem/decontamination.ogg', + "deeoo" = 'sound/vox_fem/deeoo.ogg', + "defense" = 'sound/vox_fem/defense.ogg', + "degrees" = 'sound/vox_fem/degrees.ogg', + "delta" = 'sound/vox_fem/delta.ogg', + "demon" = 'sound/vox_fem/demon.ogg', + "denied" = 'sound/vox_fem/denied.ogg', + "departures" = 'sound/vox_fem/departures.ogg', + "deployed" = 'sound/vox_fem/deployed.ogg', + "deploy" = 'sound/vox_fem/deploy.ogg', + "desire" = 'sound/vox_fem/desire.ogg', + "desist" = 'sound/vox_fem/desist.ogg', + "destroyed" = 'sound/vox_fem/destroyed.ogg', + "destroy" = 'sound/vox_fem/destroy.ogg', + "destruction" = 'sound/vox_fem/destruction.ogg', + "detain" = 'sound/vox_fem/detain.ogg', + "detected" = 'sound/vox_fem/detected.ogg', + "detective" = 'sound/vox_fem/detective.ogg', + "detonation" = 'sound/vox_fem/detonation.ogg', + "device" = 'sound/vox_fem/device.ogg', + "devil" = 'sound/vox_fem/devil.ogg', + "did" = 'sound/vox_fem/did.ogg', + "die" = 'sound/vox_fem/die.ogg', + "dimensional" = 'sound/vox_fem/dimensional.ogg', + "dioxide" = 'sound/vox_fem/dioxide.ogg', + "director" = 'sound/vox_fem/director.ogg', + "dirt" = 'sound/vox_fem/dirt.ogg', + "disabled" = 'sound/vox_fem/disabled.ogg', + "disease" = 'sound/vox_fem/disease.ogg', + "disengaged" = 'sound/vox_fem/disengaged.ogg', + "dish" = 'sound/vox_fem/dish.ogg', + "disk" = 'sound/vox_fem/disk.ogg', + "disposal" = 'sound/vox_fem/disposal.ogg', + "distance" = 'sound/vox_fem/distance.ogg', + "distortion" = 'sound/vox_fem/distortion.ogg', + "doctor" = 'sound/vox_fem/doctor.ogg', + "d" = 'sound/vox_fem/d.ogg', + "dog" = 'sound/vox_fem/dog.ogg', + "do" = 'sound/vox_fem/do.ogg', + "doomsday" = 'sound/vox_fem/doomsday.ogg', + "doop" = 'sound/vox_fem/doop.ogg', + "door" = 'sound/vox_fem/door.ogg', + "dormitory" = 'sound/vox_fem/dormitory.ogg', + "dot" = 'sound/vox_fem/dot.ogg', + "down" = 'sound/vox_fem/down.ogg', + "drone" = 'sound/vox_fem/drone.ogg', + "dual" = 'sound/vox_fem/dual.ogg', + "duct" = 'sound/vox_fem/duct.ogg', + "east" = 'sound/vox_fem/east.ogg', + "echo" = 'sound/vox_fem/echo.ogg', + "ed" = 'sound/vox_fem/ed.ogg', + "effect" = 'sound/vox_fem/effect.ogg', + "egress" = 'sound/vox_fem/egress.ogg', + "eighteen" = 'sound/vox_fem/eighteen.ogg', + "eight" = 'sound/vox_fem/eight.ogg', + "eighty" = 'sound/vox_fem/eighty.ogg', + "electric" = 'sound/vox_fem/electric.ogg', + "electromagnetic" = 'sound/vox_fem/electromagnetic.ogg', + "elevator" = 'sound/vox_fem/elevator.ogg', + "eleven" = 'sound/vox_fem/eleven.ogg', + "eliminate" = 'sound/vox_fem/eliminate.ogg', + "emergency" = 'sound/vox_fem/emergency.ogg', + "enabled" = 'sound/vox_fem/enabled.ogg', + "energy" = 'sound/vox_fem/energy.ogg', + "engaged" = 'sound/vox_fem/engaged.ogg', + "engage" = 'sound/vox_fem/engage.ogg', + "engineering" = 'sound/vox_fem/engineering.ogg', + "engineer" = 'sound/vox_fem/engineer.ogg', + "engine" = 'sound/vox_fem/engine.ogg', + "enter" = 'sound/vox_fem/enter.ogg', + "entity" = 'sound/vox_fem/entity.ogg', + "entry" = 'sound/vox_fem/entry.ogg', + "environment" = 'sound/vox_fem/environment.ogg', + "e" = 'sound/vox_fem/e.ogg', + "epic" = 'sound/vox_fem/epic.ogg', + "equipment" = 'sound/vox_fem/equipment.ogg', + "error" = 'sound/vox_fem/error.ogg', + "escape" = 'sound/vox_fem/escape.ogg', + "evacuate" = 'sound/vox_fem/evacuate.ogg', + "eva" = 'sound/vox_fem/eva.ogg', + "exchange" = 'sound/vox_fem/exchange.ogg', + "exit" = 'sound/vox_fem/exit.ogg', + "expect" = 'sound/vox_fem/expect.ogg', + "experimental" = 'sound/vox_fem/experimental.ogg', + "experiment" = 'sound/vox_fem/experiment.ogg', + "explode" = 'sound/vox_fem/explode.ogg', + "explosion" = 'sound/vox_fem/explosion.ogg', + "explosive" = 'sound/vox_fem/explosive.ogg', + "exposure" = 'sound/vox_fem/exposure.ogg', + "exterminate" = 'sound/vox_fem/exterminate.ogg', + "extinguisher" = 'sound/vox_fem/extinguisher.ogg', + "extinguish" = 'sound/vox_fem/extinguish.ogg', + "extreme" = 'sound/vox_fem/extreme.ogg', + "facility" = 'sound/vox_fem/facility.ogg', + "factory" = 'sound/vox_fem/factory.ogg', + "fahrenheit" = 'sound/vox_fem/fahrenheit.ogg', + "failed" = 'sound/vox_fem/failed.ogg', + "failure" = 'sound/vox_fem/failure.ogg', + "false" = 'sound/vox_fem/false.ogg', + "farthest" = 'sound/vox_fem/farthest.ogg', + "fast" = 'sound/vox_fem/fast.ogg', + "fauna" = 'sound/vox_fem/fauna.ogg', + "feet" = 'sound/vox_fem/feet.ogg', + "field" = 'sound/vox_fem/field.ogg', + "fifteen" = 'sound/vox_fem/fifteen.ogg', + "fifth" = 'sound/vox_fem/fifth.ogg', + "fifty" = 'sound/vox_fem/fifty.ogg', + "final" = 'sound/vox_fem/final.ogg', + "fine" = 'sound/vox_fem/fine.ogg', + "fire" = 'sound/vox_fem/fire.ogg', + "first" = 'sound/vox_fem/first.ogg', + "five" = 'sound/vox_fem/five.ogg', + "fix" = 'sound/vox_fem/fix.ogg', + "flooding" = 'sound/vox_fem/flooding.ogg', + "floor" = 'sound/vox_fem/floor.ogg', + "flyman" = 'sound/vox_fem/flyman.ogg', + "f" = 'sound/vox_fem/f.ogg', + "fool" = 'sound/vox_fem/fool.ogg', + "forbidden" = 'sound/vox_fem/forbidden.ogg', + "force" = 'sound/vox_fem/force.ogg', + "fore" = 'sound/vox_fem/fore.ogg', + "formed" = 'sound/vox_fem/formed.ogg', + "form" = 'sound/vox_fem/form.ogg', + "forms" = 'sound/vox_fem/forms.ogg', + "for" = 'sound/vox_fem/for.ogg', + "found" = 'sound/vox_fem/found.ogg', + "four" = 'sound/vox_fem/four.ogg', + "fourteen" = 'sound/vox_fem/fourteen.ogg', + "fourth" = 'sound/vox_fem/fourth.ogg', + "fourty" = 'sound/vox_fem/fourty.ogg', + "foxtrot" = 'sound/vox_fem/foxtrot.ogg', + "freeman" = 'sound/vox_fem/freeman.ogg', + "free" = 'sound/vox_fem/free.ogg', + "freezer" = 'sound/vox_fem/freezer.ogg', + "freezing" = 'sound/vox_fem/freezing.ogg', + "from" = 'sound/vox_fem/from.ogg', + "front" = 'sound/vox_fem/front.ogg', + "fucking" = 'sound/vox_fem/fucking.ogg', + "fuck" = 'sound/vox_fem/fuck.ogg', + "fucks" = 'sound/vox_fem/fucks.ogg', + "fuel" = 'sound/vox_fem/fuel.ogg', + "gas" = 'sound/vox_fem/gas.ogg', + "generator" = 'sound/vox_fem/generator.ogg', + "geneticist" = 'sound/vox_fem/geneticist.ogg', + "get" = 'sound/vox_fem/get.ogg', + "glory" = 'sound/vox_fem/glory.ogg', + "god" = 'sound/vox_fem/god.ogg', + "g" = 'sound/vox_fem/g.ogg', + "going" = 'sound/vox_fem/going.ogg', + "golem" = 'sound/vox_fem/golem.ogg', + "goodbye" = 'sound/vox_fem/goodbye.ogg', + "good" = 'sound/vox_fem/good.ogg', + "go" = 'sound/vox_fem/go.ogg', + "gordon" = 'sound/vox_fem/gordon.ogg', + "got" = 'sound/vox_fem/got.ogg', + "government" = 'sound/vox_fem/government.ogg', + "granted" = 'sound/vox_fem/granted.ogg', + "gravity" = 'sound/vox_fem/gravity.ogg', + "gray" = 'sound/vox_fem/gray.ogg', + "great" = 'sound/vox_fem/great.ogg', + "green" = 'sound/vox_fem/green.ogg', + "grenade" = 'sound/vox_fem/grenade.ogg', + "guard" = 'sound/vox_fem/guard.ogg', + "gulf" = 'sound/vox_fem/gulf.ogg', + "gun" = 'sound/vox_fem/gun.ogg', + "guthrie" = 'sound/vox_fem/guthrie.ogg', + "hacker" = 'sound/vox_fem/hacker.ogg', + "hackers" = 'sound/vox_fem/hackers.ogg', + "hall" = 'sound/vox_fem/hall.ogg', + "hallway" = 'sound/vox_fem/hallway.ogg', + "handling" = 'sound/vox_fem/handling.ogg', + "hangar" = 'sound/vox_fem/hangar.ogg', + "harmful" = 'sound/vox_fem/harmful.ogg', + "harm" = 'sound/vox_fem/harm.ogg', + "has" = 'sound/vox_fem/has.ogg', + "have" = 'sound/vox_fem/have.ogg', + "hazard" = 'sound/vox_fem/hazard.ogg', + "head" = 'sound/vox_fem/head.ogg', + "health" = 'sound/vox_fem/health.ogg', + "heat" = 'sound/vox_fem/heat.ogg', + "helicopter" = 'sound/vox_fem/helicopter.ogg', + "helium" = 'sound/vox_fem/helium.ogg', + "hello" = 'sound/vox_fem/hello.ogg', + "help" = 'sound/vox_fem/help.ogg', + "he" = 'sound/vox_fem/he.ogg', + "here" = 'sound/vox_fem/here.ogg', + "hide" = 'sound/vox_fem/hide.ogg', + "highest" = 'sound/vox_fem/highest.ogg', + "high" = 'sound/vox_fem/high.ogg', + "hit" = 'sound/vox_fem/hit.ogg', + "h" = 'sound/vox_fem/h.ogg', + "hole" = 'sound/vox_fem/hole.ogg', + "honk" = 'sound/vox_fem/honk.ogg', + "hop" = 'sound/vox_fem/hop.ogg', + "hos" = 'sound/vox_fem/hos.ogg', + "hostile" = 'sound/vox_fem/hostile.ogg', + "hotel" = 'sound/vox_fem/hotel.ogg', + "hot" = 'sound/vox_fem/hot.ogg', + "hour" = 'sound/vox_fem/hour.ogg', + "hours" = 'sound/vox_fem/hours.ogg', + "how" = 'sound/vox_fem/how.ogg', + "human" = 'sound/vox_fem/human.ogg', + "humanoid" = 'sound/vox_fem/humanoid.ogg', + "humans" = 'sound/vox_fem/humans.ogg', + "hundred" = 'sound/vox_fem/hundred.ogg', + "hunger" = 'sound/vox_fem/hunger.ogg', + "hurt" = 'sound/vox_fem/hurt.ogg', + "hydro" = 'sound/vox_fem/hydro.ogg', + "hydroponics" = 'sound/vox_fem/hydroponics.ogg', + "ian" = 'sound/vox_fem/ian.ogg', + "idiot" = 'sound/vox_fem/idiot.ogg', + "if2" = 'sound/vox_fem/if2.ogg', + "if" = 'sound/vox_fem/if.ogg', + "illegal" = 'sound/vox_fem/illegal.ogg', + "immediately" = 'sound/vox_fem/immediately.ogg', + "immediate" = 'sound/vox_fem/immediate.ogg', + "immortal" = 'sound/vox_fem/immortal.ogg', + "impossible" = 'sound/vox_fem/impossible.ogg', + "inches" = 'sound/vox_fem/inches.ogg', + "india" = 'sound/vox_fem/india.ogg', + "ing" = 'sound/vox_fem/ing.ogg', + "in" = 'sound/vox_fem/in.ogg', + "inoperative" = 'sound/vox_fem/inoperative.ogg', + "inside" = 'sound/vox_fem/inside.ogg', + "inspection" = 'sound/vox_fem/inspection.ogg', + "inspector" = 'sound/vox_fem/inspector.ogg', + "interchange" = 'sound/vox_fem/interchange.ogg', + "internals" = 'sound/vox_fem/internals.ogg', + "intruder" = 'sound/vox_fem/intruder.ogg', + "invalid" = 'sound/vox_fem/invalid.ogg', + "invasion" = 'sound/vox_fem/invasion.ogg', + "i" = 'sound/vox_fem/i.ogg', + "is" = 'sound/vox_fem/is.ogg', + "it" = 'sound/vox_fem/it.ogg', + "janitor" = 'sound/vox_fem/janitor.ogg', + "jesus" = 'sound/vox_fem/jesus.ogg', + "j" = 'sound/vox_fem/j.ogg', + "johnson" = 'sound/vox_fem/johnson.ogg', + "juliet" = 'sound/vox_fem/juliet.ogg', + "key" = 'sound/vox_fem/key.ogg', + "kidnapped" = 'sound/vox_fem/kidnapped.ogg', + "kidnapping" = 'sound/vox_fem/kidnapping.ogg', + "killed" = 'sound/vox_fem/killed.ogg', + "kill" = 'sound/vox_fem/kill.ogg', + "kilo" = 'sound/vox_fem/kilo.ogg', + "kitchen" = 'sound/vox_fem/kitchen.ogg', + "kit" = 'sound/vox_fem/kit.ogg', + "k" = 'sound/vox_fem/k.ogg', + "lab" = 'sound/vox_fem/lab.ogg', + "lambda" = 'sound/vox_fem/lambda.ogg', + "laser" = 'sound/vox_fem/laser.ogg', + "last" = 'sound/vox_fem/last.ogg', + "launch" = 'sound/vox_fem/launch.ogg', + "lavaland" = 'sound/vox_fem/lavaland.ogg', + "law" = 'sound/vox_fem/law.ogg', + "laws" = 'sound/vox_fem/laws.ogg', + "lawyer" = 'sound/vox_fem/lawyer.ogg', + "leak" = 'sound/vox_fem/leak.ogg', + "leave" = 'sound/vox_fem/leave.ogg', + "left" = 'sound/vox_fem/left.ogg', + "legal" = 'sound/vox_fem/legal.ogg', + "level" = 'sound/vox_fem/level.ogg', + "lever" = 'sound/vox_fem/lever.ogg', + "library" = 'sound/vox_fem/library.ogg', + "lie" = 'sound/vox_fem/lie.ogg', + "lieutenant" = 'sound/vox_fem/lieutenant.ogg', + "lifeform" = 'sound/vox_fem/lifeform.ogg', + "life" = 'sound/vox_fem/life.ogg', + "light" = 'sound/vox_fem/light.ogg', + "lima" = 'sound/vox_fem/lima.ogg', + "liquid" = 'sound/vox_fem/liquid.ogg', + "live2" = 'sound/vox_fem/live2.ogg', + "live" = 'sound/vox_fem/live.ogg', + "lizard" = 'sound/vox_fem/lizard.ogg', + "loading" = 'sound/vox_fem/loading.ogg', + "located" = 'sound/vox_fem/located.ogg', + "locate" = 'sound/vox_fem/locate.ogg', + "location" = 'sound/vox_fem/location.ogg', + "locked" = 'sound/vox_fem/locked.ogg', + "locker" = 'sound/vox_fem/locker.ogg', + "lock" = 'sound/vox_fem/lock.ogg', + "lockout" = 'sound/vox_fem/lockout.ogg', + "l" = 'sound/vox_fem/l.ogg', + "long" = 'sound/vox_fem/long.ogg', + "look" = 'sound/vox_fem/look.ogg', + "loop" = 'sound/vox_fem/loop.ogg', + "loose" = 'sound/vox_fem/loose.ogg', + "lot" = 'sound/vox_fem/lot.ogg', + "lower" = 'sound/vox_fem/lower.ogg', + "lowest" = 'sound/vox_fem/lowest.ogg', + "lusty" = 'sound/vox_fem/lusty.ogg', + "machine" = 'sound/vox_fem/machine.ogg', + "magic" = 'sound/vox_fem/magic.ogg', + "magnetic" = 'sound/vox_fem/magnetic.ogg', + "main" = 'sound/vox_fem/main.ogg', + "maintenance" = 'sound/vox_fem/maintenance.ogg', + "malfunction" = 'sound/vox_fem/malfunction.ogg', + "man" = 'sound/vox_fem/man.ogg', + "many" = 'sound/vox_fem/many.ogg', + "mass" = 'sound/vox_fem/mass.ogg', + "materials" = 'sound/vox_fem/materials.ogg', + "maximum" = 'sound/vox_fem/maximum.ogg', + "may" = 'sound/vox_fem/may.ogg', + "meat" = 'sound/vox_fem/meat.ogg', + "medbay" = 'sound/vox_fem/medbay.ogg', + "medical" = 'sound/vox_fem/medical.ogg', + "megafauna" = 'sound/vox_fem/megafauna.ogg', + "men" = 'sound/vox_fem/men.ogg', + "me" = 'sound/vox_fem/me.ogg', + "mercy" = 'sound/vox_fem/mercy.ogg', + "mesa" = 'sound/vox_fem/mesa.ogg', + "message" = 'sound/vox_fem/message.ogg', + "meter" = 'sound/vox_fem/meter.ogg', + "micro" = 'sound/vox_fem/micro.ogg', + "middle" = 'sound/vox_fem/middle.ogg', + "mike" = 'sound/vox_fem/mike.ogg', + "miles" = 'sound/vox_fem/miles.ogg', + "military" = 'sound/vox_fem/military.ogg', + "milli" = 'sound/vox_fem/milli.ogg', + "million" = 'sound/vox_fem/million.ogg', + "mime" = 'sound/vox_fem/mime.ogg', + "minefield" = 'sound/vox_fem/minefield.ogg', + "miner" = 'sound/vox_fem/miner.ogg', + "minimum" = 'sound/vox_fem/minimum.ogg', + "minutes" = 'sound/vox_fem/minutes.ogg', + "mister" = 'sound/vox_fem/mister.ogg', + "mode" = 'sound/vox_fem/mode.ogg', + "modification" = 'sound/vox_fem/modification.ogg', + "m" = 'sound/vox_fem/m.ogg', + "money" = 'sound/vox_fem/money.ogg', + "monkey" = 'sound/vox_fem/monkey.ogg', + "moth" = 'sound/vox_fem/moth.ogg', + "motor" = 'sound/vox_fem/motor.ogg', + "motorpool" = 'sound/vox_fem/motorpool.ogg', + "move" = 'sound/vox_fem/move.ogg', + "multitude" = 'sound/vox_fem/multitude.ogg', + "murder" = 'sound/vox_fem/murder.ogg', + "must" = 'sound/vox_fem/must.ogg', + "my" = 'sound/vox_fem/my.ogg', + "mythic" = 'sound/vox_fem/mythic.ogg', + "nanotrasen" = 'sound/vox_fem/nanotrasen.ogg', + "nearest" = 'sound/vox_fem/nearest.ogg', + "need" = 'sound/vox_fem/need.ogg', + "nice" = 'sound/vox_fem/nice.ogg', + "nine" = 'sound/vox_fem/nine.ogg', + "nineteen" = 'sound/vox_fem/nineteen.ogg', + "ninety" = 'sound/vox_fem/ninety.ogg', + "nitrogen" = 'sound/vox_fem/nitrogen.ogg', + "n" = 'sound/vox_fem/n.ogg', + "nominal" = 'sound/vox_fem/nominal.ogg', + "no" = 'sound/vox_fem/no.ogg', + "north" = 'sound/vox_fem/north.ogg', + "not" = 'sound/vox_fem/not.ogg', + "november" = 'sound/vox_fem/november.ogg', + "now" = 'sound/vox_fem/now.ogg', + "nuclear" = 'sound/vox_fem/nuclear.ogg', + "nuke" = 'sound/vox_fem/nuke.ogg', + "number" = 'sound/vox_fem/number.ogg', + "objective" = 'sound/vox_fem/objective.ogg', + "observation" = 'sound/vox_fem/observation.ogg', + "obtain" = 'sound/vox_fem/obtain.ogg', + "office" = 'sound/vox_fem/office.ogg', + "officer" = 'sound/vox_fem/officer.ogg', + "off" = 'sound/vox_fem/off.ogg', + "of" = 'sound/vox_fem/of.ogg', + "," = 'sound/vox_fem/,.ogg', + "." = 'sound/vox_fem/..ogg', + "oh" = 'sound/vox_fem/oh.ogg', + "ok" = 'sound/vox_fem/ok.ogg', + "one" = 'sound/vox_fem/one.ogg', + "on" = 'sound/vox_fem/on.ogg', + "oof" = 'sound/vox_fem/oof.ogg', + "o" = 'sound/vox_fem/o.ogg', + "open" = 'sound/vox_fem/open.ogg', + "operating" = 'sound/vox_fem/operating.ogg', + "operations" = 'sound/vox_fem/operations.ogg', + "operative" = 'sound/vox_fem/operative.ogg', + "option" = 'sound/vox_fem/option.ogg', + "order" = 'sound/vox_fem/order.ogg', + "organic" = 'sound/vox_fem/organic.ogg', + "or" = 'sound/vox_fem/or.ogg', + "oscar" = 'sound/vox_fem/oscar.ogg', + "out" = 'sound/vox_fem/out.ogg', + "outside" = 'sound/vox_fem/outside.ogg', + "overload" = 'sound/vox_fem/overload.ogg', + "over" = 'sound/vox_fem/over.ogg', + "override" = 'sound/vox_fem/override.ogg', + "oxygen" = 'sound/vox_fem/oxygen.ogg', + "pacification" = 'sound/vox_fem/pacification.ogg', + "pacify" = 'sound/vox_fem/pacify.ogg', + "pain" = 'sound/vox_fem/pain.ogg', + "pal" = 'sound/vox_fem/pal.ogg', + "panel" = 'sound/vox_fem/panel.ogg', + "panting" = 'sound/vox_fem/panting.ogg', + "pathetic" = 'sound/vox_fem/pathetic.ogg', + "percent" = 'sound/vox_fem/percent.ogg', + "perfect" = 'sound/vox_fem/perfect.ogg', + "perimeter" = 'sound/vox_fem/perimeter.ogg', + "permitted" = 'sound/vox_fem/permitted.ogg', + "personal" = 'sound/vox_fem/personal.ogg', + "personnel" = 'sound/vox_fem/personnel.ogg', + "pipe" = 'sound/vox_fem/pipe.ogg', + "piping" = 'sound/vox_fem/piping.ogg', + "piss" = 'sound/vox_fem/piss.ogg', + "plant" = 'sound/vox_fem/plant.ogg', + "plasmaman" = 'sound/vox_fem/plasmaman.ogg', + "plasma" = 'sound/vox_fem/plasma.ogg', + "platform" = 'sound/vox_fem/platform.ogg', + "plausible" = 'sound/vox_fem/plausible.ogg', + "please" = 'sound/vox_fem/please.ogg', + "p" = 'sound/vox_fem/p.ogg', + "point" = 'sound/vox_fem/point.ogg', + "portal" = 'sound/vox_fem/portal.ogg', + "port" = 'sound/vox_fem/port.ogg', + "possible" = 'sound/vox_fem/possible.ogg', + "power" = 'sound/vox_fem/power.ogg', + "presence" = 'sound/vox_fem/presence.ogg', + "press" = 'sound/vox_fem/press.ogg', + "pressure" = 'sound/vox_fem/pressure.ogg', + "primary" = 'sound/vox_fem/primary.ogg', + "prisoner" = 'sound/vox_fem/prisoner.ogg', + "prison" = 'sound/vox_fem/prison.ogg', + "proceed" = 'sound/vox_fem/proceed.ogg', + "processing" = 'sound/vox_fem/processing.ogg', + "progress" = 'sound/vox_fem/progress.ogg', + "proper" = 'sound/vox_fem/proper.ogg', + "propulsion" = 'sound/vox_fem/propulsion.ogg', + "prosecute" = 'sound/vox_fem/prosecute.ogg', + "protective" = 'sound/vox_fem/protective.ogg', + "push" = 'sound/vox_fem/push.ogg', + "put" = 'sound/vox_fem/put.ogg', + "q" = 'sound/vox_fem/q.ogg', + "quantum" = 'sound/vox_fem/quantum.ogg', + "quarantine" = 'sound/vox_fem/quarantine.ogg', + "quartermaster" = 'sound/vox_fem/quartermaster.ogg', + "quebec" = 'sound/vox_fem/quebec.ogg', + "queen" = 'sound/vox_fem/queen.ogg', + "questionable" = 'sound/vox_fem/questionable.ogg', + "questioning" = 'sound/vox_fem/questioning.ogg', + "question" = 'sound/vox_fem/question.ogg', + "quick" = 'sound/vox_fem/quick.ogg', + "quit" = 'sound/vox_fem/quit.ogg', + "radiation" = 'sound/vox_fem/radiation.ogg', + "radioactive" = 'sound/vox_fem/radioactive.ogg', + "rads" = 'sound/vox_fem/rads.ogg', + "raider" = 'sound/vox_fem/raider.ogg', + "raiders" = 'sound/vox_fem/raiders.ogg', + "rapid" = 'sound/vox_fem/rapid.ogg', + "reached" = 'sound/vox_fem/reached.ogg', + "reach" = 'sound/vox_fem/reach.ogg', + "reactor" = 'sound/vox_fem/reactor.ogg', + "red" = 'sound/vox_fem/red.ogg', + "relay" = 'sound/vox_fem/relay.ogg', + "released" = 'sound/vox_fem/released.ogg', + "remaining" = 'sound/vox_fem/remaining.ogg', + "removal" = 'sound/vox_fem/removal.ogg', + "renegade" = 'sound/vox_fem/renegade.ogg', + "repair" = 'sound/vox_fem/repair.ogg', + "report" = 'sound/vox_fem/report.ogg', + "reports" = 'sound/vox_fem/reports.ogg', + "required" = 'sound/vox_fem/required.ogg', + "require" = 'sound/vox_fem/require.ogg', + "research" = 'sound/vox_fem/research.ogg', + "resevoir" = 'sound/vox_fem/resevoir.ogg', + "resistance" = 'sound/vox_fem/resistance.ogg', + "rest" = 'sound/vox_fem/rest.ogg', + "restoration" = 'sound/vox_fem/restoration.ogg', + "revolutionary" = 'sound/vox_fem/revolutionary.ogg', + "revolution" = 'sound/vox_fem/revolution.ogg', + "right" = 'sound/vox_fem/right.ogg', + "riot" = 'sound/vox_fem/riot.ogg', + "roboticist" = 'sound/vox_fem/roboticist.ogg', + "rocket" = 'sound/vox_fem/rocket.ogg', + "roger" = 'sound/vox_fem/roger.ogg', + "r" = 'sound/vox_fem/r.ogg', + "rogue" = 'sound/vox_fem/rogue.ogg', + "romeo" = 'sound/vox_fem/romeo.ogg', + "room" = 'sound/vox_fem/room.ogg', + "round" = 'sound/vox_fem/round.ogg', + "rune" = 'sound/vox_fem/rune.ogg', + "run" = 'sound/vox_fem/run.ogg', + "runtime" = 'sound/vox_fem/runtime.ogg', + "sabotage" = 'sound/vox_fem/sabotage.ogg', + "safe" = 'sound/vox_fem/safe.ogg', + "safety" = 'sound/vox_fem/safety.ogg', + "sairhorn" = 'sound/vox_fem/sairhorn.ogg', + "sarah" = 'sound/vox_fem/sarah.ogg', + "sargeant" = 'sound/vox_fem/sargeant.ogg', + "satellite" = 'sound/vox_fem/satellite.ogg', + "save" = 'sound/vox_fem/save.ogg', + "scensor" = 'sound/vox_fem/scensor.ogg', + "science" = 'sound/vox_fem/science.ogg', + "scientist" = 'sound/vox_fem/scientist.ogg', + "scream" = 'sound/vox_fem/scream.ogg', + "screen" = 'sound/vox_fem/screen.ogg', + "search" = 'sound/vox_fem/search.ogg', + "secondary" = 'sound/vox_fem/secondary.ogg', + "second" = 'sound/vox_fem/second.ogg', + "seconds" = 'sound/vox_fem/seconds.ogg', + "section" = 'sound/vox_fem/section.ogg', + "sector" = 'sound/vox_fem/sector.ogg', + "secured" = 'sound/vox_fem/secured.ogg', + "secure" = 'sound/vox_fem/secure.ogg', + "security" = 'sound/vox_fem/security.ogg', + "selected" = 'sound/vox_fem/selected.ogg', + "select" = 'sound/vox_fem/select.ogg', + "self" = 'sound/vox_fem/self.ogg', + "sensors" = 'sound/vox_fem/sensors.ogg', + "server" = 'sound/vox_fem/server.ogg', + "service" = 'sound/vox_fem/service.ogg', + "seven" = 'sound/vox_fem/seven.ogg', + "seventeen" = 'sound/vox_fem/seventeen.ogg', + "seventy" = 'sound/vox_fem/seventy.ogg', + "severe" = 'sound/vox_fem/severe.ogg', + "sewage" = 'sound/vox_fem/sewage.ogg', + "sewer" = 'sound/vox_fem/sewer.ogg', + "shaft" = 'sound/vox_fem/shaft.ogg', + "she" = 'sound/vox_fem/she.ogg', + "shield" = 'sound/vox_fem/shield.ogg', + "shipment" = 'sound/vox_fem/shipment.ogg', + "shirt" = 'sound/vox_fem/shirt.ogg', + "shitlord" = 'sound/vox_fem/shitlord.ogg', + "shit" = 'sound/vox_fem/shit.ogg', + "shits" = 'sound/vox_fem/shits.ogg', + "shitting" = 'sound/vox_fem/shitting.ogg', + "shock" = 'sound/vox_fem/shock.ogg', + "shonk" = 'sound/vox_fem/shonk.ogg', + "shoot" = 'sound/vox_fem/shoot.ogg', + "shower" = 'sound/vox_fem/shower.ogg', + "shut" = 'sound/vox_fem/shut.ogg', + "shuttle" = 'sound/vox_fem/shuttle.ogg', + "sick" = 'sound/vox_fem/sick.ogg', + "side" = 'sound/vox_fem/side.ogg', + "sierra" = 'sound/vox_fem/sierra.ogg', + "sight" = 'sound/vox_fem/sight.ogg', + "silicon" = 'sound/vox_fem/silicon.ogg', + "silo" = 'sound/vox_fem/silo.ogg', + "singularity" = 'sound/vox_fem/singularity.ogg', + "six" = 'sound/vox_fem/six.ogg', + "sixteen" = 'sound/vox_fem/sixteen.ogg', + "sixty" = 'sound/vox_fem/sixty.ogg', + "skeleton" = 'sound/vox_fem/skeleton.ogg', + "slaughter" = 'sound/vox_fem/slaughter.ogg', + "slime" = 'sound/vox_fem/slime.ogg', + "slip" = 'sound/vox_fem/slip.ogg', + "slippery" = 'sound/vox_fem/slippery.ogg', + "slow" = 'sound/vox_fem/slow.ogg', + "sm" = 'sound/vox_fem/sm.ogg', + "s" = 'sound/vox_fem/s.ogg', + "solar" = 'sound/vox_fem/solar.ogg', + "solars" = 'sound/vox_fem/solars.ogg', + "soldier" = 'sound/vox_fem/soldier.ogg', + "some" = 'sound/vox_fem/some.ogg', + "someone" = 'sound/vox_fem/someone.ogg', + "something" = 'sound/vox_fem/something.ogg', + "son" = 'sound/vox_fem/son.ogg', + "sorry" = 'sound/vox_fem/sorry.ogg', + "south" = 'sound/vox_fem/south.ogg', + "space" = 'sound/vox_fem/space.ogg', + "squad" = 'sound/vox_fem/squad.ogg', + "square" = 'sound/vox_fem/square.ogg', + "ss13" = 'sound/vox_fem/ss13.ogg', + "stairway" = 'sound/vox_fem/stairway.ogg', + "starboard" = 'sound/vox_fem/starboard.ogg', + "station" = 'sound/vox_fem/station.ogg', + "status" = 'sound/vox_fem/status.ogg', + "stay" = 'sound/vox_fem/stay.ogg', + "sterile" = 'sound/vox_fem/sterile.ogg', + "sterilization" = 'sound/vox_fem/sterilization.ogg', + "stop" = 'sound/vox_fem/stop.ogg', + "storage" = 'sound/vox_fem/storage.ogg', + "strong" = 'sound/vox_fem/strong.ogg', + "stuck" = 'sound/vox_fem/stuck.ogg', + "sub" = 'sound/vox_fem/sub.ogg', + "subsurface" = 'sound/vox_fem/subsurface.ogg', + "sudden" = 'sound/vox_fem/sudden.ogg', + "suffer" = 'sound/vox_fem/suffer.ogg', + "suit" = 'sound/vox_fem/suit.ogg', + "superconducting" = 'sound/vox_fem/superconducting.ogg', + "supercooled" = 'sound/vox_fem/supercooled.ogg', + "supermatter" = 'sound/vox_fem/supermatter.ogg', + "supply" = 'sound/vox_fem/supply.ogg', + "surface" = 'sound/vox_fem/surface.ogg', + "surrender" = 'sound/vox_fem/surrender.ogg', + "surrounded" = 'sound/vox_fem/surrounded.ogg', + "surround" = 'sound/vox_fem/surround.ogg', + "sweating" = 'sound/vox_fem/sweating.ogg', + "swhitenoise" = 'sound/vox_fem/swhitenoise.ogg', + "switch" = 'sound/vox_fem/switch.ogg', + "syndicate" = 'sound/vox_fem/syndicate.ogg', + "system" = 'sound/vox_fem/system.ogg', + "systems" = 'sound/vox_fem/systems.ogg', + "table" = 'sound/vox_fem/table.ogg', + "tactical" = 'sound/vox_fem/tactical.ogg', + "take" = 'sound/vox_fem/take.ogg', + "talk" = 'sound/vox_fem/talk.ogg', + "tampered" = 'sound/vox_fem/tampered.ogg', + "tango" = 'sound/vox_fem/tango.ogg', + "tank" = 'sound/vox_fem/tank.ogg', + "target" = 'sound/vox_fem/target.ogg', + "team" = 'sound/vox_fem/team.ogg', + "technician" = 'sound/vox_fem/technician.ogg', + "technology" = 'sound/vox_fem/technology.ogg', + "tech" = 'sound/vox_fem/tech.ogg', + "temperature" = 'sound/vox_fem/temperature.ogg', + "temporal" = 'sound/vox_fem/temporal.ogg', + "ten" = 'sound/vox_fem/ten.ogg', + "terminal" = 'sound/vox_fem/terminal.ogg', + "terminated" = 'sound/vox_fem/terminated.ogg', + "termination" = 'sound/vox_fem/termination.ogg', + "test" = 'sound/vox_fem/test.ogg', + "text" = 'sound/vox_fem/text.ogg', + "that" = 'sound/vox_fem/that.ogg', + "theater" = 'sound/vox_fem/theater.ogg', + "them" = 'sound/vox_fem/them.ogg', + "then" = 'sound/vox_fem/then.ogg', + "the" = 'sound/vox_fem/the.ogg', + "there" = 'sound/vox_fem/there.ogg', + "they" = 'sound/vox_fem/they.ogg', + "third" = 'sound/vox_fem/third.ogg', + "thirteen" = 'sound/vox_fem/thirteen.ogg', + "thirty" = 'sound/vox_fem/thirty.ogg', + "this" = 'sound/vox_fem/this.ogg', + "those" = 'sound/vox_fem/those.ogg', + "thousand" = 'sound/vox_fem/thousand.ogg', + "threat" = 'sound/vox_fem/threat.ogg', + "three" = 'sound/vox_fem/three.ogg', + "through" = 'sound/vox_fem/through.ogg', + "tide" = 'sound/vox_fem/tide.ogg', + "time" = 'sound/vox_fem/time.ogg', + "t" = 'sound/vox_fem/t.ogg', + "to" = 'sound/vox_fem/to.ogg', + "top" = 'sound/vox_fem/top.ogg', + "topside" = 'sound/vox_fem/topside.ogg', + "touch" = 'sound/vox_fem/touch.ogg', + "towards" = 'sound/vox_fem/towards.ogg', + "toxins" = 'sound/vox_fem/toxins.ogg', + "track" = 'sound/vox_fem/track.ogg', + "train" = 'sound/vox_fem/train.ogg', + "traitor" = 'sound/vox_fem/traitor.ogg', + "transportation" = 'sound/vox_fem/transportation.ogg', + "truck" = 'sound/vox_fem/truck.ogg', + "true" = 'sound/vox_fem/true.ogg', + "tunnel" = 'sound/vox_fem/tunnel.ogg', + "turn" = 'sound/vox_fem/turn.ogg', + "turret" = 'sound/vox_fem/turret.ogg', + "twelve" = 'sound/vox_fem/twelve.ogg', + "twenty" = 'sound/vox_fem/twenty.ogg', + "two" = 'sound/vox_fem/two.ogg', + "ughh" = 'sound/vox_fem/ughh.ogg', + "ugh" = 'sound/vox_fem/ugh.ogg', + "unable" = 'sound/vox_fem/unable.ogg', + "unauthorized" = 'sound/vox_fem/unauthorized.ogg', + "under" = 'sound/vox_fem/under.ogg', + "uniform" = 'sound/vox_fem/uniform.ogg', + "unknown" = 'sound/vox_fem/unknown.ogg', + "unlocked" = 'sound/vox_fem/unlocked.ogg', + "unsafe" = 'sound/vox_fem/unsafe.ogg', + "until" = 'sound/vox_fem/until.ogg', + "u" = 'sound/vox_fem/u.ogg', + "updated" = 'sound/vox_fem/updated.ogg', + "update" = 'sound/vox_fem/update.ogg', + "updating" = 'sound/vox_fem/updating.ogg', + "upload" = 'sound/vox_fem/upload.ogg', + "up" = 'sound/vox_fem/up.ogg', + "upper" = 'sound/vox_fem/upper.ogg', + "uranium" = 'sound/vox_fem/uranium.ogg', + "usa" = 'sound/vox_fem/usa.ogg', + "used" = 'sound/vox_fem/used.ogg', + "use" = 'sound/vox_fem/use.ogg', + "user" = 'sound/vox_fem/user.ogg', + "us" = 'sound/vox_fem/us.ogg', + "vacate" = 'sound/vox_fem/vacate.ogg', + "vacuum" = 'sound/vox_fem/vacuum.ogg', + "valid" = 'sound/vox_fem/valid.ogg', + "vapor" = 'sound/vox_fem/vapor.ogg', + "vendor" = 'sound/vox_fem/vendor.ogg', + "ventilation" = 'sound/vox_fem/ventilation.ogg', + "vent" = 'sound/vox_fem/vent.ogg', + "very" = 'sound/vox_fem/very.ogg', + "victor" = 'sound/vox_fem/victor.ogg', + "violated" = 'sound/vox_fem/violated.ogg', + "violation" = 'sound/vox_fem/violation.ogg', + "virologist" = 'sound/vox_fem/virologist.ogg', + "virology" = 'sound/vox_fem/virology.ogg', + "virus" = 'sound/vox_fem/virus.ogg', + "vitals" = 'sound/vox_fem/vitals.ogg', + "v" = 'sound/vox_fem/v.ogg', + "voltage" = 'sound/vox_fem/voltage.ogg', + "vox_login" = 'sound/vox_fem/vox_login.ogg', + "vox" = 'sound/vox_fem/vox.ogg', + "voxtest" = 'sound/vox_fem/voxtest.ogg', + "walk" = 'sound/vox_fem/walk.ogg', + "wall" = 'sound/vox_fem/wall.ogg', + "wanker" = 'sound/vox_fem/wanker.ogg', + "wanted" = 'sound/vox_fem/wanted.ogg', + "want" = 'sound/vox_fem/want.ogg', + "warden" = 'sound/vox_fem/warden.ogg', + "warm" = 'sound/vox_fem/warm.ogg', + "warning" = 'sound/vox_fem/warning.ogg', + "warn" = 'sound/vox_fem/warn.ogg', + "waste" = 'sound/vox_fem/waste.ogg', + "water" = 'sound/vox_fem/water.ogg', + "weak" = 'sound/vox_fem/weak.ogg', + "weapon" = 'sound/vox_fem/weapon.ogg', + "welcome" = 'sound/vox_fem/welcome.ogg', + "we" = 'sound/vox_fem/we.ogg', + "west" = 'sound/vox_fem/west.ogg', + "wew" = 'sound/vox_fem/wew.ogg', + "what" = 'sound/vox_fem/what.ogg', + "when" = 'sound/vox_fem/when.ogg', + "where" = 'sound/vox_fem/where.ogg', + "whiskey" = 'sound/vox_fem/whiskey.ogg', + "white" = 'sound/vox_fem/white.ogg', + "why" = 'sound/vox_fem/why.ogg', + "wilco" = 'sound/vox_fem/wilco.ogg', + "will" = 'sound/vox_fem/will.ogg', + "wing" = 'sound/vox_fem/wing.ogg', + "wire" = 'sound/vox_fem/wire.ogg', + "with" = 'sound/vox_fem/with.ogg', + "without" = 'sound/vox_fem/without.ogg', + "wizard" = 'sound/vox_fem/wizard.ogg', + "w" = 'sound/vox_fem/w.ogg', + "wood" = 'sound/vox_fem/wood.ogg', + "woody" = 'sound/vox_fem/woody.ogg', + "woop" = 'sound/vox_fem/woop.ogg', + "wow" = 'sound/vox_fem/wow.ogg', + "xenobiology" = 'sound/vox_fem/xenobiology.ogg', + "xenomorph" = 'sound/vox_fem/xenomorph.ogg', + "xenomorphs" = 'sound/vox_fem/xenomorphs.ogg', + "xeno" = 'sound/vox_fem/xeno.ogg', + "x" = 'sound/vox_fem/x.ogg', + "yankee" = 'sound/vox_fem/yankee.ogg', + "yards" = 'sound/vox_fem/yards.ogg', + "year" = 'sound/vox_fem/year.ogg', + "yellow" = 'sound/vox_fem/yellow.ogg', + "yes" = 'sound/vox_fem/yes.ogg', + "y" = 'sound/vox_fem/y.ogg', + "you" = 'sound/vox_fem/you.ogg', + "your" = 'sound/vox_fem/your.ogg', + "yourself" = 'sound/vox_fem/yourself.ogg', + "zero" = 'sound/vox_fem/zero.ogg', + "z" = 'sound/vox_fem/z.ogg', + "zombie" = 'sound/vox_fem/zombie.ogg', + "zone" = 'sound/vox_fem/zone.ogg', + "zulu" = 'sound/vox_fem/zulu.ogg' + ), + //for vim + // :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox\/\1',/g + "Male" = list( + "," = 'sound/vox/_comma.ogg', + "." = 'sound/vox/_period.ogg', + "a" = 'sound/vox/a.ogg', + "accelerating" = 'sound/vox/accelerating.ogg', + "accelerator" = 'sound/vox/accelerator.ogg', + "accepted" = 'sound/vox/accepted.ogg', + "access" = 'sound/vox/access.ogg', + "acknowledge" = 'sound/vox/acknowledge.ogg', + "acknowledged" = 'sound/vox/acknowledged.ogg', + "acquired" = 'sound/vox/acquired.ogg', + "acquisition" = 'sound/vox/acquisition.ogg', + "across" = 'sound/vox/across.ogg', + "activate" = 'sound/vox/activate.ogg', + "activated" = 'sound/vox/activated.ogg', + "activity" = 'sound/vox/activity.ogg', + "adios" = 'sound/vox/adios.ogg', + "administration" = 'sound/vox/administration.ogg', + "advanced" = 'sound/vox/advanced.ogg', + "after" = 'sound/vox/after.ogg', + "agent" = 'sound/vox/agent.ogg', + "alarm" = 'sound/vox/alarm.ogg', + "alert" = 'sound/vox/alert.ogg', + "alien" = 'sound/vox/alien.ogg', + "aligned" = 'sound/vox/aligned.ogg', + "all" = 'sound/vox/all.ogg', + "alpha" = 'sound/vox/alpha.ogg', + "am" = 'sound/vox/am.ogg', + "amigo" = 'sound/vox/amigo.ogg', + "ammunition" = 'sound/vox/ammunition.ogg', + "an" = 'sound/vox/an.ogg', + "and" = 'sound/vox/and.ogg', + "announcement" = 'sound/vox/announcement.ogg', + "anomalous" = 'sound/vox/anomalous.ogg', + "antenna" = 'sound/vox/antenna.ogg', + "any" = 'sound/vox/any.ogg', + "apprehend" = 'sound/vox/apprehend.ogg', + "approach" = 'sound/vox/approach.ogg', + "are" = 'sound/vox/are.ogg', + "area" = 'sound/vox/area.ogg', + "arm" = 'sound/vox/arm.ogg', + "armed" = 'sound/vox/armed.ogg', + "armor" = 'sound/vox/armor.ogg', + "armory" = 'sound/vox/armory.ogg', + "arrest" = 'sound/vox/arrest.ogg', + "ass" = 'sound/vox/ass.ogg', + "at" = 'sound/vox/at.ogg', + "atomic" = 'sound/vox/atomic.ogg', + "attention" = 'sound/vox/attention.ogg', + "authorize" = 'sound/vox/authorize.ogg', + "authorized" = 'sound/vox/authorized.ogg', + "automatic" = 'sound/vox/automatic.ogg', + "away" = 'sound/vox/away.ogg', + "b" = 'sound/vox/b.ogg', + "back" = 'sound/vox/back.ogg', + "backman" = 'sound/vox/backman.ogg', + "bad" = 'sound/vox/bad.ogg', + "bag" = 'sound/vox/bag.ogg', + "bailey" = 'sound/vox/bailey.ogg', + "barracks" = 'sound/vox/barracks.ogg', + "base" = 'sound/vox/base.ogg', + "bay" = 'sound/vox/bay.ogg', + "be" = 'sound/vox/be.ogg', + "been" = 'sound/vox/been.ogg', + "before" = 'sound/vox/before.ogg', + "beyond" = 'sound/vox/beyond.ogg', + "biohazard" = 'sound/vox/biohazard.ogg', + "biological" = 'sound/vox/biological.ogg', + "birdwell" = 'sound/vox/birdwell.ogg', + "bizwarn" = 'sound/vox/bizwarn.ogg', + "black" = 'sound/vox/black.ogg', + "blast" = 'sound/vox/blast.ogg', + "blocked" = 'sound/vox/blocked.ogg', + "bloop" = 'sound/vox/bloop.ogg', + "blue" = 'sound/vox/blue.ogg', + "bottom" = 'sound/vox/bottom.ogg', + "bravo" = 'sound/vox/bravo.ogg', + "breach" = 'sound/vox/breach.ogg', + "breached" = 'sound/vox/breached.ogg', + "break" = 'sound/vox/break.ogg', + "bridge" = 'sound/vox/bridge.ogg', + "bust" = 'sound/vox/bust.ogg', + "but" = 'sound/vox/but.ogg', + "button" = 'sound/vox/button.ogg', + "buzwarn" = 'sound/vox/buzwarn.ogg', + "bypass" = 'sound/vox/bypass.ogg', + "c" = 'sound/vox/c.ogg', + "cable" = 'sound/vox/cable.ogg', + "call" = 'sound/vox/call.ogg', + "called" = 'sound/vox/called.ogg', + "canal" = 'sound/vox/canal.ogg', + "cap" = 'sound/vox/cap.ogg', + "captain" = 'sound/vox/captain.ogg', + "capture" = 'sound/vox/capture.ogg', + "captured" = 'sound/vox/captured.ogg', + "ceiling" = 'sound/vox/ceiling.ogg', + "celsius" = 'sound/vox/celsius.ogg', + "center" = 'sound/vox/center.ogg', + "centi" = 'sound/vox/centi.ogg', + "central" = 'sound/vox/central.ogg', + "chamber" = 'sound/vox/chamber.ogg', + "charlie" = 'sound/vox/charlie.ogg', + "check" = 'sound/vox/check.ogg', + "checkpoint" = 'sound/vox/checkpoint.ogg', + "chemical" = 'sound/vox/chemical.ogg', + "cleanup" = 'sound/vox/cleanup.ogg', + "clear" = 'sound/vox/clear.ogg', + "clearance" = 'sound/vox/clearance.ogg', + "close" = 'sound/vox/close.ogg', + "clown" = 'sound/vox/clown.ogg', + "code" = 'sound/vox/code.ogg', + "coded" = 'sound/vox/coded.ogg', + "collider" = 'sound/vox/collider.ogg', + "command" = 'sound/vox/command.ogg', + "communication" = 'sound/vox/communication.ogg', + "complex" = 'sound/vox/complex.ogg', + "computer" = 'sound/vox/computer.ogg', + "condition" = 'sound/vox/condition.ogg', + "containment" = 'sound/vox/containment.ogg', + "contamination" = 'sound/vox/contamination.ogg', + "control" = 'sound/vox/control.ogg', + "coolant" = 'sound/vox/coolant.ogg', + "coomer" = 'sound/vox/coomer.ogg', + "core" = 'sound/vox/core.ogg', + "correct" = 'sound/vox/correct.ogg', + "corridor" = 'sound/vox/corridor.ogg', + "crew" = 'sound/vox/crew.ogg', + "cross" = 'sound/vox/cross.ogg', + "cryogenic" = 'sound/vox/cryogenic.ogg', + "d" = 'sound/vox/d.ogg', + "dadeda" = 'sound/vox/dadeda.ogg', + "damage" = 'sound/vox/damage.ogg', + "damaged" = 'sound/vox/damaged.ogg', + "danger" = 'sound/vox/danger.ogg', + "day" = 'sound/vox/day.ogg', + "deactivated" = 'sound/vox/deactivated.ogg', + "decompression" = 'sound/vox/decompression.ogg', + "decontamination" = 'sound/vox/decontamination.ogg', + "deeoo" = 'sound/vox/deeoo.ogg', + "defense" = 'sound/vox/defense.ogg', + "degrees" = 'sound/vox/degrees.ogg', + "delta" = 'sound/vox/delta.ogg', + "denied" = 'sound/vox/denied.ogg', + "deploy" = 'sound/vox/deploy.ogg', + "deployed" = 'sound/vox/deployed.ogg', + "destroy" = 'sound/vox/destroy.ogg', + "destroyed" = 'sound/vox/destroyed.ogg', + "detain" = 'sound/vox/detain.ogg', + "detected" = 'sound/vox/detected.ogg', + "detonation" = 'sound/vox/detonation.ogg', + "device" = 'sound/vox/device.ogg', + "did" = 'sound/vox/did.ogg', + "die" = 'sound/vox/die.ogg', + "dimensional" = 'sound/vox/dimensional.ogg', + "dirt" = 'sound/vox/dirt.ogg', + "disengaged" = 'sound/vox/disengaged.ogg', + "dish" = 'sound/vox/dish.ogg', + "disposal" = 'sound/vox/disposal.ogg', + "distance" = 'sound/vox/distance.ogg', + "distortion" = 'sound/vox/distortion.ogg', + "do" = 'sound/vox/do.ogg', + "doctor" = 'sound/vox/doctor.ogg', + "doop" = 'sound/vox/doop.ogg', + "door" = 'sound/vox/door.ogg', + "down" = 'sound/vox/down.ogg', + "dual" = 'sound/vox/dual.ogg', + "duct" = 'sound/vox/duct.ogg', + "e" = 'sound/vox/e.ogg', + "east" = 'sound/vox/east.ogg', + "echo" = 'sound/vox/echo.ogg', + "ed" = 'sound/vox/ed.ogg', + "effect" = 'sound/vox/effect.ogg', + "egress" = 'sound/vox/egress.ogg', + "eight" = 'sound/vox/eight.ogg', + "eighteen" = 'sound/vox/eighteen.ogg', + "eighty" = 'sound/vox/eighty.ogg', + "electric" = 'sound/vox/electric.ogg', + "electromagnetic" = 'sound/vox/electromagnetic.ogg', + "elevator" = 'sound/vox/elevator.ogg', + "eleven" = 'sound/vox/eleven.ogg', + "eliminate" = 'sound/vox/eliminate.ogg', + "emergency" = 'sound/vox/emergency.ogg', + "enemy" = 'sound/vox/enemy.ogg', + "energy" = 'sound/vox/energy.ogg', + "engage" = 'sound/vox/engage.ogg', + "engaged" = 'sound/vox/engaged.ogg', + "engine" = 'sound/vox/engine.ogg', + "enter" = 'sound/vox/enter.ogg', + "entry" = 'sound/vox/entry.ogg', + "environment" = 'sound/vox/environment.ogg', + "error" = 'sound/vox/error.ogg', + "escape" = 'sound/vox/escape.ogg', + "evacuate" = 'sound/vox/evacuate.ogg', + "exchange" = 'sound/vox/exchange.ogg', + "exit" = 'sound/vox/exit.ogg', + "expect" = 'sound/vox/expect.ogg', + "experiment" = 'sound/vox/experiment.ogg', + "experimental" = 'sound/vox/experimental.ogg', + "explode" = 'sound/vox/explode.ogg', + "explosion" = 'sound/vox/explosion.ogg', + "exposure" = 'sound/vox/exposure.ogg', + "exterminate" = 'sound/vox/exterminate.ogg', + "extinguish" = 'sound/vox/extinguish.ogg', + "extinguisher" = 'sound/vox/extinguisher.ogg', + "extreme" = 'sound/vox/extreme.ogg', + "f" = 'sound/vox/f.ogg', + "face" = 'sound/vox/face.ogg', + "facility" = 'sound/vox/facility.ogg', + "fahrenheit" = 'sound/vox/fahrenheit.ogg', + "failed" = 'sound/vox/failed.ogg', + "failure" = 'sound/vox/failure.ogg', + "farthest" = 'sound/vox/farthest.ogg', + "fast" = 'sound/vox/fast.ogg', + "feet" = 'sound/vox/feet.ogg', + "field" = 'sound/vox/field.ogg', + "fifteen" = 'sound/vox/fifteen.ogg', + "fifth" = 'sound/vox/fifth.ogg', + "fifty" = 'sound/vox/fifty.ogg', + "final" = 'sound/vox/final.ogg', + "fine" = 'sound/vox/fine.ogg', + "fire" = 'sound/vox/fire.ogg', + "first" = 'sound/vox/first.ogg', + "five" = 'sound/vox/five.ogg', + "flag" = 'sound/vox/flag.ogg', + "flooding" = 'sound/vox/flooding.ogg', + "floor" = 'sound/vox/floor.ogg', + "fool" = 'sound/vox/fool.ogg', + "for" = 'sound/vox/for.ogg', + "forbidden" = 'sound/vox/forbidden.ogg', + "force" = 'sound/vox/force.ogg', + "forms" = 'sound/vox/forms.ogg', + "found" = 'sound/vox/found.ogg', + "four" = 'sound/vox/four.ogg', + "fourteen" = 'sound/vox/fourteen.ogg', + "fourth" = 'sound/vox/fourth.ogg', + "fourty" = 'sound/vox/fourty.ogg', + "foxtrot" = 'sound/vox/foxtrot.ogg', + "freeman" = 'sound/vox/freeman.ogg', + "freezer" = 'sound/vox/freezer.ogg', + "from" = 'sound/vox/from.ogg', + "front" = 'sound/vox/front.ogg', + "fuel" = 'sound/vox/fuel.ogg', + "g" = 'sound/vox/g.ogg', + "gay" = 'sound/vox/gay.ogg', + "get" = 'sound/vox/get.ogg', + "go" = 'sound/vox/go.ogg', + "going" = 'sound/vox/going.ogg', + "good" = 'sound/vox/good.ogg', + "goodbye" = 'sound/vox/goodbye.ogg', + "gordon" = 'sound/vox/gordon.ogg', + "got" = 'sound/vox/got.ogg', + "government" = 'sound/vox/government.ogg', + "granted" = 'sound/vox/granted.ogg', + "great" = 'sound/vox/great.ogg', + "green" = 'sound/vox/green.ogg', + "grenade" = 'sound/vox/grenade.ogg', + "guard" = 'sound/vox/guard.ogg', + "gulf" = 'sound/vox/gulf.ogg', + "gun" = 'sound/vox/gun.ogg', + "guthrie" = 'sound/vox/guthrie.ogg', + "handling" = 'sound/vox/handling.ogg', + "hangar" = 'sound/vox/hangar.ogg', + "has" = 'sound/vox/has.ogg', + "have" = 'sound/vox/have.ogg', + "hazard" = 'sound/vox/hazard.ogg', + "head" = 'sound/vox/head.ogg', + "health" = 'sound/vox/health.ogg', + "heat" = 'sound/vox/heat.ogg', + "helicopter" = 'sound/vox/helicopter.ogg', + "helium" = 'sound/vox/helium.ogg', + "hello" = 'sound/vox/hello.ogg', + "help" = 'sound/vox/help.ogg', + "here" = 'sound/vox/here.ogg', + "hide" = 'sound/vox/hide.ogg', + "high" = 'sound/vox/high.ogg', + "highest" = 'sound/vox/highest.ogg', + "hit" = 'sound/vox/hit.ogg', + "holds" = 'sound/vox/holds.ogg', + "hole" = 'sound/vox/hole.ogg', + "hostile" = 'sound/vox/hostile.ogg', + "hot" = 'sound/vox/hot.ogg', + "hotel" = 'sound/vox/hotel.ogg', + "hour" = 'sound/vox/hour.ogg', + "hours" = 'sound/vox/hours.ogg', + "hundred" = 'sound/vox/hundred.ogg', + "hydro" = 'sound/vox/hydro.ogg', + "i" = 'sound/vox/i.ogg', + "idiot" = 'sound/vox/idiot.ogg', + "illegal" = 'sound/vox/illegal.ogg', + "immediate" = 'sound/vox/immediate.ogg', + "immediately" = 'sound/vox/immediately.ogg', + "in" = 'sound/vox/in.ogg', + "inches" = 'sound/vox/inches.ogg', + "india" = 'sound/vox/india.ogg', + "ing" = 'sound/vox/ing.ogg', + "inoperative" = 'sound/vox/inoperative.ogg', + "inside" = 'sound/vox/inside.ogg', + "inspection" = 'sound/vox/inspection.ogg', + "inspector" = 'sound/vox/inspector.ogg', + "interchange" = 'sound/vox/interchange.ogg', + "intruder" = 'sound/vox/intruder.ogg', + "invallid" = 'sound/vox/invallid.ogg', + "invasion" = 'sound/vox/invasion.ogg', + "is" = 'sound/vox/is.ogg', + "it" = 'sound/vox/it.ogg', + "johnson" = 'sound/vox/johnson.ogg', + "juliet" = 'sound/vox/juliet.ogg', + "key" = 'sound/vox/key.ogg', + "kill" = 'sound/vox/kill.ogg', + "kilo" = 'sound/vox/kilo.ogg', + "kit" = 'sound/vox/kit.ogg', + "lab" = 'sound/vox/lab.ogg', + "lambda" = 'sound/vox/lambda.ogg', + "laser" = 'sound/vox/laser.ogg', + "last" = 'sound/vox/last.ogg', + "launch" = 'sound/vox/launch.ogg', + "leak" = 'sound/vox/leak.ogg', + "leave" = 'sound/vox/leave.ogg', + "left" = 'sound/vox/left.ogg', + "legal" = 'sound/vox/legal.ogg', + "level" = 'sound/vox/level.ogg', + "lever" = 'sound/vox/lever.ogg', + "lie" = 'sound/vox/lie.ogg', + "lieutenant" = 'sound/vox/lieutenant.ogg', + "life" = 'sound/vox/life.ogg', + "light" = 'sound/vox/light.ogg', + "lima" = 'sound/vox/lima.ogg', + "liquid" = 'sound/vox/liquid.ogg', + "loading" = 'sound/vox/loading.ogg', + "locate" = 'sound/vox/locate.ogg', + "located" = 'sound/vox/located.ogg', + "location" = 'sound/vox/location.ogg', + "lock" = 'sound/vox/lock.ogg', + "locked" = 'sound/vox/locked.ogg', + "locker" = 'sound/vox/locker.ogg', + "lockout" = 'sound/vox/lockout.ogg', + "lower" = 'sound/vox/lower.ogg', + "lowest" = 'sound/vox/lowest.ogg', + "magnetic" = 'sound/vox/magnetic.ogg', + "main" = 'sound/vox/main.ogg', + "maintenance" = 'sound/vox/maintenance.ogg', + "malfunction" = 'sound/vox/malfunction.ogg', + "man" = 'sound/vox/man.ogg', + "mass" = 'sound/vox/mass.ogg', + "materials" = 'sound/vox/materials.ogg', + "maximum" = 'sound/vox/maximum.ogg', + "may" = 'sound/vox/may.ogg', + "med" = 'sound/vox/med.ogg', + "medical" = 'sound/vox/medical.ogg', + "men" = 'sound/vox/men.ogg', + "mercy" = 'sound/vox/mercy.ogg', + "mesa" = 'sound/vox/mesa.ogg', + "message" = 'sound/vox/message.ogg', + "meter" = 'sound/vox/meter.ogg', + "micro" = 'sound/vox/micro.ogg', + "middle" = 'sound/vox/middle.ogg', + "mike" = 'sound/vox/mike.ogg', + "miles" = 'sound/vox/miles.ogg', + "military" = 'sound/vox/military.ogg', + "milli" = 'sound/vox/milli.ogg', + "million" = 'sound/vox/million.ogg', + "minefield" = 'sound/vox/minefield.ogg', + "minimum" = 'sound/vox/minimum.ogg', + "minutes" = 'sound/vox/minutes.ogg', + "mister" = 'sound/vox/mister.ogg', + "mode" = 'sound/vox/mode.ogg', + "motor" = 'sound/vox/motor.ogg', + "motorpool" = 'sound/vox/motorpool.ogg', + "move" = 'sound/vox/move.ogg', + "must" = 'sound/vox/must.ogg', + "nearest" = 'sound/vox/nearest.ogg', + "nice" = 'sound/vox/nice.ogg', + "nine" = 'sound/vox/nine.ogg', + "nineteen" = 'sound/vox/nineteen.ogg', + "ninety" = 'sound/vox/ninety.ogg', + "no" = 'sound/vox/no.ogg', + "nominal" = 'sound/vox/nominal.ogg', + "north" = 'sound/vox/north.ogg', + "not" = 'sound/vox/not.ogg', + "november" = 'sound/vox/november.ogg', + "now" = 'sound/vox/now.ogg', + "number" = 'sound/vox/number.ogg', + "objective" = 'sound/vox/objective.ogg', + "observation" = 'sound/vox/observation.ogg', + "of" = 'sound/vox/of.ogg', + "officer" = 'sound/vox/officer.ogg', + "ok" = 'sound/vox/ok.ogg', + "on" = 'sound/vox/on.ogg', + "one" = 'sound/vox/one.ogg', + "open" = 'sound/vox/open.ogg', + "operating" = 'sound/vox/operating.ogg', + "operations" = 'sound/vox/operations.ogg', + "operative" = 'sound/vox/operative.ogg', + "option" = 'sound/vox/option.ogg', + "order" = 'sound/vox/order.ogg', + "organic" = 'sound/vox/organic.ogg', + "oscar" = 'sound/vox/oscar.ogg', + "out" = 'sound/vox/out.ogg', + "outside" = 'sound/vox/outside.ogg', + "over" = 'sound/vox/over.ogg', + "overload" = 'sound/vox/overload.ogg', + "override" = 'sound/vox/override.ogg', + "pacify" = 'sound/vox/pacify.ogg', + "pain" = 'sound/vox/pain.ogg', + "pal" = 'sound/vox/pal.ogg', + "panel" = 'sound/vox/panel.ogg', + "percent" = 'sound/vox/percent.ogg', + "perimeter" = 'sound/vox/perimeter.ogg', + "permitted" = 'sound/vox/permitted.ogg', + "personnel" = 'sound/vox/personnel.ogg', + "pipe" = 'sound/vox/pipe.ogg', + "plant" = 'sound/vox/plant.ogg', + "platform" = 'sound/vox/platform.ogg', + "please" = 'sound/vox/please.ogg', + "point" = 'sound/vox/point.ogg', + "portal" = 'sound/vox/portal.ogg', + "power" = 'sound/vox/power.ogg', + "presence" = 'sound/vox/presence.ogg', + "press" = 'sound/vox/press.ogg', + "primary" = 'sound/vox/primary.ogg', + "proceed" = 'sound/vox/proceed.ogg', + "processing" = 'sound/vox/processing.ogg', + "progress" = 'sound/vox/progress.ogg', + "proper" = 'sound/vox/proper.ogg', + "propulsion" = 'sound/vox/propulsion.ogg', + "prosecute" = 'sound/vox/prosecute.ogg', + "protective" = 'sound/vox/protective.ogg', + "push" = 'sound/vox/push.ogg', + "quantum" = 'sound/vox/quantum.ogg', + "quebec" = 'sound/vox/quebec.ogg', + "question" = 'sound/vox/question.ogg', + "questioning" = 'sound/vox/questioning.ogg', + "quick" = 'sound/vox/quick.ogg', + "quit" = 'sound/vox/quit.ogg', + "radiation" = 'sound/vox/radiation.ogg', + "radioactive" = 'sound/vox/radioactive.ogg', + "rads" = 'sound/vox/rads.ogg', + "rapid" = 'sound/vox/rapid.ogg', + "reach" = 'sound/vox/reach.ogg', + "reached" = 'sound/vox/reached.ogg', + "reactor" = 'sound/vox/reactor.ogg', + "red" = 'sound/vox/red.ogg', + "relay" = 'sound/vox/relay.ogg', + "released" = 'sound/vox/released.ogg', + "remaining" = 'sound/vox/remaining.ogg', + "renegade" = 'sound/vox/renegade.ogg', + "repair" = 'sound/vox/repair.ogg', + "report" = 'sound/vox/report.ogg', + "reports" = 'sound/vox/reports.ogg', + "required" = 'sound/vox/required.ogg', + "research" = 'sound/vox/research.ogg', + "reset" = 'sound/vox/reset.ogg', + "resevoir" = 'sound/vox/resevoir.ogg', + "resistance" = 'sound/vox/resistance.ogg', + "returned" = 'sound/vox/returned.ogg', + "right" = 'sound/vox/right.ogg', + "rocket" = 'sound/vox/rocket.ogg', + "roger" = 'sound/vox/roger.ogg', + "romeo" = 'sound/vox/romeo.ogg', + "room" = 'sound/vox/room.ogg', + "round" = 'sound/vox/round.ogg', + "run" = 'sound/vox/run.ogg', + "safe" = 'sound/vox/safe.ogg', + "safety" = 'sound/vox/safety.ogg', + "sargeant" = 'sound/vox/sargeant.ogg', + "satellite" = 'sound/vox/satellite.ogg', + "save" = 'sound/vox/save.ogg', + "science" = 'sound/vox/science.ogg', + "scores" = 'sound/vox/scores.ogg', + "scream" = 'sound/vox/scream.ogg', + "screen" = 'sound/vox/screen.ogg', + "search" = 'sound/vox/search.ogg', + "second" = 'sound/vox/second.ogg', + "secondary" = 'sound/vox/secondary.ogg', + "seconds" = 'sound/vox/seconds.ogg', + "sector" = 'sound/vox/sector.ogg', + "secure" = 'sound/vox/secure.ogg', + "secured" = 'sound/vox/secured.ogg', + "security" = 'sound/vox/security.ogg', + "select" = 'sound/vox/select.ogg', + "selected" = 'sound/vox/selected.ogg', + "service" = 'sound/vox/service.ogg', + "seven" = 'sound/vox/seven.ogg', + "seventeen" = 'sound/vox/seventeen.ogg', + "seventy" = 'sound/vox/seventy.ogg', + "severe" = 'sound/vox/severe.ogg', + "sewage" = 'sound/vox/sewage.ogg', + "sewer" = 'sound/vox/sewer.ogg', + "shield" = 'sound/vox/shield.ogg', + "shipment" = 'sound/vox/shipment.ogg', + "shock" = 'sound/vox/shock.ogg', + "shoot" = 'sound/vox/shoot.ogg', + "shower" = 'sound/vox/shower.ogg', + "shut" = 'sound/vox/shut.ogg', + "side" = 'sound/vox/side.ogg', + "sierra" = 'sound/vox/sierra.ogg', + "sight" = 'sound/vox/sight.ogg', + "silo" = 'sound/vox/silo.ogg', + "six" = 'sound/vox/six.ogg', + "sixteen" = 'sound/vox/sixteen.ogg', + "sixty" = 'sound/vox/sixty.ogg', + "slime" = 'sound/vox/slime.ogg', + "slow" = 'sound/vox/slow.ogg', + "soldier" = 'sound/vox/soldier.ogg', + "some" = 'sound/vox/some.ogg', + "someone" = 'sound/vox/someone.ogg', + "something" = 'sound/vox/something.ogg', + "son" = 'sound/vox/son.ogg', + "sorry" = 'sound/vox/sorry.ogg', + "south" = 'sound/vox/south.ogg', + "squad" = 'sound/vox/squad.ogg', + "square" = 'sound/vox/square.ogg', + "stairway" = 'sound/vox/stairway.ogg', + "status" = 'sound/vox/status.ogg', + "sterile" = 'sound/vox/sterile.ogg', + "sterilization" = 'sound/vox/sterilization.ogg', + "stolen" = 'sound/vox/stolen.ogg', + "storage" = 'sound/vox/storage.ogg', + "sub" = 'sound/vox/sub.ogg', + "subsurface" = 'sound/vox/subsurface.ogg', + "sudden" = 'sound/vox/sudden.ogg', + "suit" = 'sound/vox/suit.ogg', + "superconducting" = 'sound/vox/superconducting.ogg', + "supercooled" = 'sound/vox/supercooled.ogg', + "supply" = 'sound/vox/supply.ogg', + "surface" = 'sound/vox/surface.ogg', + "surrender" = 'sound/vox/surrender.ogg', + "surround" = 'sound/vox/surround.ogg', + "surrounded" = 'sound/vox/surrounded.ogg', + "switch" = 'sound/vox/switch.ogg', + "system" = 'sound/vox/system.ogg', + "systems" = 'sound/vox/systems.ogg', + "tactical" = 'sound/vox/tactical.ogg', + "take" = 'sound/vox/take.ogg', + "talk" = 'sound/vox/talk.ogg', + "tango" = 'sound/vox/tango.ogg', + "tank" = 'sound/vox/tank.ogg', + "target" = 'sound/vox/target.ogg', + "team" = 'sound/vox/team.ogg', + "temperature" = 'sound/vox/temperature.ogg', + "temporal" = 'sound/vox/temporal.ogg', + "ten" = 'sound/vox/ten.ogg', + "terminal" = 'sound/vox/terminal.ogg', + "terminated" = 'sound/vox/terminated.ogg', + "termination" = 'sound/vox/termination.ogg', + "test" = 'sound/vox/test.ogg', + "that" = 'sound/vox/that.ogg', + "the" = 'sound/vox/the.ogg', + "then" = 'sound/vox/then.ogg', + "there" = 'sound/vox/there.ogg', + "third" = 'sound/vox/third.ogg', + "thirteen" = 'sound/vox/thirteen.ogg', + "thirty" = 'sound/vox/thirty.ogg', + "this" = 'sound/vox/this.ogg', + "those" = 'sound/vox/those.ogg', + "thousand" = 'sound/vox/thousand.ogg', + "threat" = 'sound/vox/threat.ogg', + "three" = 'sound/vox/three.ogg', + "through" = 'sound/vox/through.ogg', + "time" = 'sound/vox/time.ogg', + "to" = 'sound/vox/to.ogg', + "top" = 'sound/vox/top.ogg', + "topside" = 'sound/vox/topside.ogg', + "touch" = 'sound/vox/touch.ogg', + "towards" = 'sound/vox/towards.ogg', + "track" = 'sound/vox/track.ogg', + "train" = 'sound/vox/train.ogg', + "transportation" = 'sound/vox/transportation.ogg', + "truck" = 'sound/vox/truck.ogg', + "tunnel" = 'sound/vox/tunnel.ogg', + "turn" = 'sound/vox/turn.ogg', + "turret" = 'sound/vox/turret.ogg', + "twelve" = 'sound/vox/twelve.ogg', + "twenty" = 'sound/vox/twenty.ogg', + "two" = 'sound/vox/two.ogg', + "unauthorized" = 'sound/vox/unauthorized.ogg', + "under" = 'sound/vox/under.ogg', + "uniform" = 'sound/vox/uniform.ogg', + "unlocked" = 'sound/vox/unlocked.ogg', + "until" = 'sound/vox/until.ogg', + "up" = 'sound/vox/up.ogg', + "upper" = 'sound/vox/upper.ogg', + "uranium" = 'sound/vox/uranium.ogg', + "us" = 'sound/vox/us.ogg', + "usa" = 'sound/vox/usa.ogg', + "use" = 'sound/vox/use.ogg', + "used" = 'sound/vox/used.ogg', + "user" = 'sound/vox/user.ogg', + "vacate" = 'sound/vox/vacate.ogg', + "valid" = 'sound/vox/valid.ogg', + "vapor" = 'sound/vox/vapor.ogg', + "vent" = 'sound/vox/vent.ogg', + "ventillation" = 'sound/vox/ventillation.ogg', + "victor" = 'sound/vox/victor.ogg', + "violated" = 'sound/vox/violated.ogg', + "violation" = 'sound/vox/violation.ogg', + "voltage" = 'sound/vox/voltage.ogg', + "vox_login" = 'sound/vox/vox_login.ogg', + "walk" = 'sound/vox/walk.ogg', + "wall" = 'sound/vox/wall.ogg', + "want" = 'sound/vox/want.ogg', + "wanted" = 'sound/vox/wanted.ogg', + "warm" = 'sound/vox/warm.ogg', + "warn" = 'sound/vox/warn.ogg', + "warning" = 'sound/vox/warning.ogg', + "waste" = 'sound/vox/waste.ogg', + "water" = 'sound/vox/water.ogg', + "we" = 'sound/vox/we.ogg', + "weapon" = 'sound/vox/weapon.ogg', + "west" = 'sound/vox/west.ogg', + "whiskey" = 'sound/vox/whiskey.ogg', + "white" = 'sound/vox/white.ogg', + "wilco" = 'sound/vox/wilco.ogg', + "will" = 'sound/vox/will.ogg', + "with" = 'sound/vox/with.ogg', + "without" = 'sound/vox/without.ogg', + "woop" = 'sound/vox/woop.ogg', + "xeno" = 'sound/vox/xeno.ogg', + "yankee" = 'sound/vox/yankee.ogg', + "yards" = 'sound/vox/yards.ogg', + "year" = 'sound/vox/year.ogg', + "yellow" = 'sound/vox/yellow.ogg', + "yes" = 'sound/vox/yes.ogg', + "you" = 'sound/vox/you.ogg', + "your" = 'sound/vox/your.ogg', + "yourself" = 'sound/vox/yourself.ogg', + "zero" = 'sound/vox/zero.ogg', + "zone" = 'sound/vox/zone.ogg', + "zulu" = 'sound/vox/zulu.ogg' + ), + //for vim + // :%s/\(\(.*\)\.ogg\)/"\2" = 'modular_sand\/sound\/vox_military\/\1',/g + "Military" = list( + "access" = 'modular_sand/sound/vox_military/access.ogg', + "acknowledged" = 'modular_sand/sound/vox_military/acknowledged.ogg', + "activate" = 'modular_sand/sound/vox_military/activate.ogg', + "activated" = 'modular_sand/sound/vox_military/activated.ogg', + "activity" = 'modular_sand/sound/vox_military/activity.ogg', + "advanced" = 'modular_sand/sound/vox_military/advanced.ogg', + "alert" = 'modular_sand/sound/vox_military/alert.ogg', + "alien" = 'modular_sand/sound/vox_military/alien.ogg', + "all" = 'modular_sand/sound/vox_military/all.ogg', + "alpha" = 'modular_sand/sound/vox_military/alpha.ogg', + "an" = 'modular_sand/sound/vox_military/an.ogg', + "and" = 'modular_sand/sound/vox_military/and.ogg', + "announcement" = 'modular_sand/sound/vox_military/announcement.ogg', + "antenna" = 'modular_sand/sound/vox_military/antenna.ogg', + "any" = 'modular_sand/sound/vox_military/any.ogg', + "approach" = 'modular_sand/sound/vox_military/approach.ogg', + "are" = 'modular_sand/sound/vox_military/are.ogg', + "area" = 'modular_sand/sound/vox_military/area.ogg', + "armed" = 'modular_sand/sound/vox_military/armed.ogg', + "armory" = 'modular_sand/sound/vox_military/armory.ogg', + "atomic" = 'modular_sand/sound/vox_military/atomic.ogg', + "attention" = 'modular_sand/sound/vox_military/attention.ogg', + "authorized" = 'modular_sand/sound/vox_military/authorized.ogg', + "automatic" = 'modular_sand/sound/vox_military/automatic.ogg', + "away" = 'modular_sand/sound/vox_military/away.ogg', + "b" = 'modular_sand/sound/vox_military/b.ogg', + "back" = 'modular_sand/sound/vox_military/back.ogg', + "base" = 'modular_sand/sound/vox_military/base.ogg', + "biohazard" = 'modular_sand/sound/vox_military/biohazard.ogg', + "biological" = 'modular_sand/sound/vox_military/biological.ogg', + "black" = 'modular_sand/sound/vox_military/black.ogg', + "blast" = 'modular_sand/sound/vox_military/blast.ogg', + "blue" = 'modular_sand/sound/vox_military/blue.ogg', + "bravo" = 'modular_sand/sound/vox_military/bravo.ogg', + "breach" = 'modular_sand/sound/vox_military/breach.ogg', + "bypass" = 'modular_sand/sound/vox_military/bypass.ogg', + "cable" = 'modular_sand/sound/vox_military/cable.ogg', + "center" = 'modular_sand/sound/vox_military/center.ogg', + "central" = 'modular_sand/sound/vox_military/central.ogg', + "chamber" = 'modular_sand/sound/vox_military/chamber.ogg', + "check" = 'modular_sand/sound/vox_military/check.ogg', + "checkpoint" = 'modular_sand/sound/vox_military/checkpoint.ogg', + "chemical" = 'modular_sand/sound/vox_military/chemical.ogg', + "clear" = 'modular_sand/sound/vox_military/clear.ogg', + "code" = 'modular_sand/sound/vox_military/code.ogg', + "command" = 'modular_sand/sound/vox_military/command.ogg', + "communications" = 'modular_sand/sound/vox_military/communications.ogg', + "complex" = 'modular_sand/sound/vox_military/complex.ogg', + "containment" = 'modular_sand/sound/vox_military/containment.ogg', + "contamination" = 'modular_sand/sound/vox_military/contamination.ogg', + "control" = 'modular_sand/sound/vox_military/control.ogg', + "coolant" = 'modular_sand/sound/vox_military/coolant.ogg', + "core" = 'modular_sand/sound/vox_military/core.ogg', + "crew" = 'modular_sand/sound/vox_military/crew.ogg', + "cross" = 'modular_sand/sound/vox_military/cross.ogg', + "d" = 'modular_sand/sound/vox_military/d.ogg', + "damage" = 'modular_sand/sound/vox_military/damage.ogg', + "danger" = 'modular_sand/sound/vox_military/danger.ogg', + "day" = 'modular_sand/sound/vox_military/day.ogg', + "deactivated" = 'modular_sand/sound/vox_military/deactivated.ogg', + "defense" = 'modular_sand/sound/vox_military/defense.ogg', + "delta" = 'modular_sand/sound/vox_military/delta.ogg', + "denied" = 'modular_sand/sound/vox_military/denied.ogg', + "destroy" = 'modular_sand/sound/vox_military/destroy.ogg', + "detected" = 'modular_sand/sound/vox_military/detected.ogg', + "detonation" = 'modular_sand/sound/vox_military/detonation.ogg', + "device" = 'modular_sand/sound/vox_military/device.ogg', + "dimensional" = 'modular_sand/sound/vox_military/dimensional.ogg', + "disengaged" = 'modular_sand/sound/vox_military/disengaged.ogg', + "do" = 'modular_sand/sound/vox_military/do.ogg', + "door" = 'modular_sand/sound/vox_military/door.ogg', + "down" = 'modular_sand/sound/vox_military/down.ogg', + "e" = 'modular_sand/sound/vox_military/e.ogg', + "echo" = 'modular_sand/sound/vox_military/echo.ogg', + "eight" = 'modular_sand/sound/vox_military/eight.ogg', + "eighteen" = 'modular_sand/sound/vox_military/eighteen.ogg', + "eighty" = 'modular_sand/sound/vox_military/eighty.ogg', + "electric" = 'modular_sand/sound/vox_military/electric.ogg', + "eleven" = 'modular_sand/sound/vox_military/eleven.ogg', + "eliminate" = 'modular_sand/sound/vox_military/eliminate.ogg', + "emergency" = 'modular_sand/sound/vox_military/emergency.ogg', + "energy" = 'modular_sand/sound/vox_military/energy.ogg', + "engage" = 'modular_sand/sound/vox_military/engage.ogg', + "engaged" = 'modular_sand/sound/vox_military/engaged.ogg', + "enter" = 'modular_sand/sound/vox_military/enter.ogg', + "entry" = 'modular_sand/sound/vox_military/entry.ogg', + "escape" = 'modular_sand/sound/vox_military/escape.ogg', + "evacuate" = 'modular_sand/sound/vox_military/evacuate.ogg', + "exchange" = 'modular_sand/sound/vox_military/exchange.ogg', + "experimental" = 'modular_sand/sound/vox_military/experimental.ogg', + "extreme" = 'modular_sand/sound/vox_military/extreme.ogg', + "facility" = 'modular_sand/sound/vox_military/facility.ogg', + "failed" = 'modular_sand/sound/vox_military/failed.ogg', + "failure" = 'modular_sand/sound/vox_military/failure.ogg', + "field" = 'modular_sand/sound/vox_military/field.ogg', + "fifteen" = 'modular_sand/sound/vox_military/fifteen.ogg', + "fifty" = 'modular_sand/sound/vox_military/fifty.ogg', + "fire" = 'modular_sand/sound/vox_military/fire.ogg', + "five" = 'modular_sand/sound/vox_military/five.ogg', + "forbidden" = 'modular_sand/sound/vox_military/forbidden.ogg', + "force" = 'modular_sand/sound/vox_military/force.ogg', + "forms" = 'modular_sand/sound/vox_military/forms.ogg', + "forty" = 'modular_sand/sound/vox_military/forty.ogg', + "four" = 'modular_sand/sound/vox_military/four.ogg', + "fourteen" = 'modular_sand/sound/vox_military/fourteen.ogg', + "freeman" = 'modular_sand/sound/vox_military/freeman.ogg', + "from" = 'modular_sand/sound/vox_military/from.ogg', + "fuel" = 'modular_sand/sound/vox_military/fuel.ogg', + "fx_bloop" = 'modular_sand/sound/vox_military/fx_bloop.ogg', + "fx_buzwarn" = 'modular_sand/sound/vox_military/fx_buzwarn.ogg', + "fx_dadeda" = 'modular_sand/sound/vox_military/fx_dadeda.ogg', + "fx_deeoo" = 'modular_sand/sound/vox_military/fx_deeoo.ogg', + "fx_doop" = 'modular_sand/sound/vox_military/fx_doop.ogg', + "fx_error_beep" = 'modular_sand/sound/vox_military/fx_error_beep.ogg', + "fx_signon_beep" = 'modular_sand/sound/vox_military/fx_signon_beep.ogg', + "get" = 'modular_sand/sound/vox_military/get.ogg', + "go" = 'modular_sand/sound/vox_military/go.ogg', + "gordon" = 'modular_sand/sound/vox_military/gordon.ogg', + "granted" = 'modular_sand/sound/vox_military/granted.ogg', + "green" = 'modular_sand/sound/vox_military/green.ogg', + "handling" = 'modular_sand/sound/vox_military/handling.ogg', + "hanger" = 'modular_sand/sound/vox_military/hanger.ogg', + "have" = 'modular_sand/sound/vox_military/have.ogg', + "hazard" = 'modular_sand/sound/vox_military/hazard.ogg', + "health" = 'modular_sand/sound/vox_military/health.ogg', + "heat" = 'modular_sand/sound/vox_military/heat.ogg', + "helecopter" = 'modular_sand/sound/vox_military/helecopter.ogg', + "helium" = 'modular_sand/sound/vox_military/helium.ogg', + "high" = 'modular_sand/sound/vox_military/high.ogg', + "hostal" = 'modular_sand/sound/vox_military/hostal.ogg', + "hostile" = 'modular_sand/sound/vox_military/hostile.ogg', + "hotel" = 'modular_sand/sound/vox_military/hotel.ogg', + "hundred" = 'modular_sand/sound/vox_military/hundred.ogg', + "hydro" = 'modular_sand/sound/vox_military/hydro.ogg', + "illegal" = 'modular_sand/sound/vox_military/illegal.ogg', + "immediate" = 'modular_sand/sound/vox_military/immediate.ogg', + "immediately" = 'modular_sand/sound/vox_military/immediately.ogg', + "in" = 'modular_sand/sound/vox_military/in.ogg', + "india" = 'modular_sand/sound/vox_military/india.ogg', + "inoperative" = 'modular_sand/sound/vox_military/inoperative.ogg', + "inside" = 'modular_sand/sound/vox_military/inside.ogg', + "inspection" = 'modular_sand/sound/vox_military/inspection.ogg', + "is" = 'modular_sand/sound/vox_military/is.ogg', + "kilo01" = 'modular_sand/sound/vox_military/kilo01.ogg', + "kilo02" = 'modular_sand/sound/vox_military/kilo02.ogg', + "lambda" = 'modular_sand/sound/vox_military/lambda.ogg', + "laser" = 'modular_sand/sound/vox_military/laser.ogg', + "launch" = 'modular_sand/sound/vox_military/launch.ogg', + "leak" = 'modular_sand/sound/vox_military/leak.ogg', + "level" = 'modular_sand/sound/vox_military/level.ogg', + "lima" = 'modular_sand/sound/vox_military/lima.ogg', + "lima_alt" = 'modular_sand/sound/vox_military/lima_alt.ogg', + "liquid" = 'modular_sand/sound/vox_military/liquid.ogg', + "lock" = 'modular_sand/sound/vox_military/lock.ogg', + "locked" = 'modular_sand/sound/vox_military/locked.ogg', + "lockout" = 'modular_sand/sound/vox_military/lockout.ogg', + "lower" = 'modular_sand/sound/vox_military/lower.ogg', + "main" = 'modular_sand/sound/vox_military/main.ogg', + "maintenance" = 'modular_sand/sound/vox_military/maintenance.ogg', + "malfunction" = 'modular_sand/sound/vox_military/malfunction.ogg', + "materials" = 'modular_sand/sound/vox_military/materials.ogg', + "may" = 'modular_sand/sound/vox_military/may.ogg', + "medical" = 'modular_sand/sound/vox_military/medical.ogg', + "men" = 'modular_sand/sound/vox_military/men.ogg', + "mesa" = 'modular_sand/sound/vox_military/mesa.ogg', + "message" = 'modular_sand/sound/vox_military/message.ogg', + "mic_mike" = 'modular_sand/sound/vox_military/mic_mike.ogg', + "mike" = 'modular_sand/sound/vox_military/mike.ogg', + "military" = 'modular_sand/sound/vox_military/military.ogg', + "motorpool" = 'modular_sand/sound/vox_military/motorpool.ogg', + "move" = 'modular_sand/sound/vox_military/move.ogg', + "must" = 'modular_sand/sound/vox_military/must.ogg', + "nearest" = 'modular_sand/sound/vox_military/nearest.ogg', + "nine" = 'modular_sand/sound/vox_military/nine.ogg', + "nineteen" = 'modular_sand/sound/vox_military/nineteen.ogg', + "ninety" = 'modular_sand/sound/vox_military/ninety.ogg', + "no" = 'modular_sand/sound/vox_military/no.ogg', + "noe" = 'modular_sand/sound/vox_military/noe.ogg', + "not" = 'modular_sand/sound/vox_military/not.ogg', + "now" = 'modular_sand/sound/vox_military/now.ogg', + "objective" = 'modular_sand/sound/vox_military/objective.ogg', + "of" = 'modular_sand/sound/vox_military/of.ogg', + "on" = 'modular_sand/sound/vox_military/on.ogg', + "one" = 'modular_sand/sound/vox_military/one.ogg', + "open" = 'modular_sand/sound/vox_military/open.ogg', + "operating" = 'modular_sand/sound/vox_military/operating.ogg', + "option" = 'modular_sand/sound/vox_military/option.ogg', + "out" = 'modular_sand/sound/vox_military/out.ogg', + "override" = 'modular_sand/sound/vox_military/override.ogg', + "percent" = 'modular_sand/sound/vox_military/percent.ogg', + "perimeter" = 'modular_sand/sound/vox_military/perimeter.ogg', + "permitted" = 'modular_sand/sound/vox_military/permitted.ogg', + "perpulsion" = 'modular_sand/sound/vox_military/perpulsion.ogg', + "personnel" = 'modular_sand/sound/vox_military/personnel.ogg', + "plant" = 'modular_sand/sound/vox_military/plant.ogg', + "please" = 'modular_sand/sound/vox_military/please.ogg', + "portal" = 'modular_sand/sound/vox_military/portal.ogg', + "power" = 'modular_sand/sound/vox_military/power.ogg', + "primary" = 'modular_sand/sound/vox_military/primary.ogg', + "prosecute" = 'modular_sand/sound/vox_military/prosecute.ogg', + "questioning" = 'modular_sand/sound/vox_military/questioning.ogg', + "radiation" = 'modular_sand/sound/vox_military/radiation.ogg', + "radioactive" = 'modular_sand/sound/vox_military/radioactive.ogg', + "reach" = 'modular_sand/sound/vox_military/reach.ogg', + "reactor" = 'modular_sand/sound/vox_military/reactor.ogg', + "relay" = 'modular_sand/sound/vox_military/relay.ogg', + "released" = 'modular_sand/sound/vox_military/released.ogg', + "remaining" = 'modular_sand/sound/vox_military/remaining.ogg', + "renegade" = 'modular_sand/sound/vox_military/renegade.ogg', + "repair" = 'modular_sand/sound/vox_military/repair.ogg', + "report" = 'modular_sand/sound/vox_military/report.ogg', + "reports" = 'modular_sand/sound/vox_military/reports.ogg', + "required" = 'modular_sand/sound/vox_military/required.ogg', + "research" = 'modular_sand/sound/vox_military/research.ogg', + "resistance" = 'modular_sand/sound/vox_military/resistance.ogg', + "rocket" = 'modular_sand/sound/vox_military/rocket.ogg', + "safety" = 'modular_sand/sound/vox_military/safety.ogg', + "satellite" = 'modular_sand/sound/vox_military/satellite.ogg', + "science" = 'modular_sand/sound/vox_military/science.ogg', + "search" = 'modular_sand/sound/vox_military/search.ogg', + "second" = 'modular_sand/sound/vox_military/second.ogg', + "secondary" = 'modular_sand/sound/vox_military/secondary.ogg', + "seconds" = 'modular_sand/sound/vox_military/seconds.ogg', + "sector" = 'modular_sand/sound/vox_military/sector.ogg', + "secure" = 'modular_sand/sound/vox_military/secure.ogg', + "secured" = 'modular_sand/sound/vox_military/secured.ogg', + "security" = 'modular_sand/sound/vox_military/security.ogg', + "service" = 'modular_sand/sound/vox_military/service.ogg', + "seven" = 'modular_sand/sound/vox_military/seven.ogg', + "seventeen" = 'modular_sand/sound/vox_military/seventeen.ogg', + "seventy" = 'modular_sand/sound/vox_military/seventy.ogg', + "severe" = 'modular_sand/sound/vox_military/severe.ogg', + "shield" = 'modular_sand/sound/vox_military/shield.ogg', + "shoot" = 'modular_sand/sound/vox_military/shoot.ogg', + "sierra" = 'modular_sand/sound/vox_military/sierra.ogg', + "sight" = 'modular_sand/sound/vox_military/sight.ogg', + "silo" = 'modular_sand/sound/vox_military/silo.ogg', + "six" = 'modular_sand/sound/vox_military/six.ogg', + "sixteen" = 'modular_sand/sound/vox_military/sixteen.ogg', + "sixty" = 'modular_sand/sound/vox_military/sixty.ogg', + "sorry" = 'modular_sand/sound/vox_military/sorry.ogg', + "sqaud" = 'modular_sand/sound/vox_military/sqaud.ogg', + "status" = 'modular_sand/sound/vox_military/status.ogg', + "sterilization" = 'modular_sand/sound/vox_military/sterilization.ogg', + "storage" = 'modular_sand/sound/vox_military/storage.ogg', + "supercooled" = 'modular_sand/sound/vox_military/supercooled.ogg', + "surrender" = 'modular_sand/sound/vox_military/surrender.ogg', + "system" = 'modular_sand/sound/vox_military/system.ogg', + "systems" = 'modular_sand/sound/vox_military/systems.ogg', + "target" = 'modular_sand/sound/vox_military/target.ogg', + "team" = 'modular_sand/sound/vox_military/team.ogg', + "ten" = 'modular_sand/sound/vox_military/ten.ogg', + "terminated" = 'modular_sand/sound/vox_military/terminated.ogg', + "test" = 'modular_sand/sound/vox_military/test.ogg', + "the" = 'modular_sand/sound/vox_military/the.ogg', + "thirtteen" = 'modular_sand/sound/vox_military/thirtteen.ogg', + "thirty" = 'modular_sand/sound/vox_military/thirty.ogg', + "this" = 'modular_sand/sound/vox_military/this.ogg', + "three" = 'modular_sand/sound/vox_military/three.ogg', + "time" = 'modular_sand/sound/vox_military/time.ogg', + "to" = 'modular_sand/sound/vox_military/to.ogg', + "topside" = 'modular_sand/sound/vox_military/topside.ogg', + "track" = 'modular_sand/sound/vox_military/track.ogg', + "train" = 'modular_sand/sound/vox_military/train.ogg', + "turret" = 'modular_sand/sound/vox_military/turret.ogg', + "twelve" = 'modular_sand/sound/vox_military/twelve.ogg', + "twenty" = 'modular_sand/sound/vox_military/twenty.ogg', + "two" = 'modular_sand/sound/vox_military/two.ogg', + "unauthorized" = 'modular_sand/sound/vox_military/unauthorized.ogg', + "under" = 'modular_sand/sound/vox_military/under.ogg', + "units" = 'modular_sand/sound/vox_military/units.ogg', + "until" = 'modular_sand/sound/vox_military/until.ogg', + "up" = 'modular_sand/sound/vox_military/up.ogg', + "uranium" = 'modular_sand/sound/vox_military/uranium.ogg', + "use" = 'modular_sand/sound/vox_military/use.ogg', + "violation" = 'modular_sand/sound/vox_military/violation.ogg', + "voltage" = 'modular_sand/sound/vox_military/voltage.ogg', + "wanted" = 'modular_sand/sound/vox_military/wanted.ogg', + "warning" = 'modular_sand/sound/vox_military/warning.ogg', + "we" = 'modular_sand/sound/vox_military/we.ogg', + "weapon" = 'modular_sand/sound/vox_military/weapon.ogg', + "will" = 'modular_sand/sound/vox_military/will.ogg', + "with" = 'modular_sand/sound/vox_military/with.ogg', + "yellow" = 'modular_sand/sound/vox_military/yellow.ogg', + "you" = 'modular_sand/sound/vox_military/you.ogg', + "your" = 'modular_sand/sound/vox_military/your.ogg', + "zero" = 'modular_sand/sound/vox_military/zero.ogg', + "zone" = 'modular_sand/sound/vox_military/zone.ogg', + "," = 'modular_sand/sound/vox_military/_comma.ogg', + "." = 'modular_sand/sound/vox_military/_period.ogg' + ) +) #endif diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 71c4f3dcb8..4eff3fab67 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -89,6 +89,12 @@ diag_hud_set_borgcell() logevent("System brought online.") + alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), list(z)) + RegisterSignal(alert_control.listener, COMSIG_ALARM_TRIGGERED, PROC_REF(alarm_triggered)) + RegisterSignal(alert_control.listener, COMSIG_ALARM_CLEARED, PROC_REF(alarm_cleared)) + alert_control.listener.RegisterSignal(src, COMSIG_LIVING_PREDEATH, TYPE_PROC_REF(/datum/alarm_listener, prevent_alarm_changes)) + alert_control.listener.RegisterSignal(src, COMSIG_LIVING_REVIVE, TYPE_PROC_REF(/datum/alarm_listener, allow_alarm_changes)) + add_verb(src, /mob/living/proc/lay_down) //CITADEL EDIT gimmie rest verb kthx add_verb(src, /mob/living/silicon/robot/proc/rest_style) @@ -117,14 +123,15 @@ QDEL_NULL(cell) QDEL_NULL(robot_suit) QDEL_NULL(thruster_button) + QDEL_NULL(alert_control) cell = null return ..() -// /mob/living/silicon/robot/Topic(href, href_list) -// . = ..() -// //Show alerts window if user clicked on "Show alerts" in chat -// if (href_list["showalerts"]) -// robot_alerts() +/mob/living/silicon/robot/Topic(href, href_list) + . = ..() + //Show alerts window if user clicked on "Show alerts" in chat + if(href_list["showalerts"]) + alert_control.ui_interact(src) /mob/living/silicon/robot/proc/pick_module() if(module.type != /obj/item/robot_module) @@ -185,27 +192,7 @@ if(usr.stat == DEAD) to_chat(src, "Alert: You are dead.") return //won't work if dead - robot_alerts() - -/mob/living/silicon/robot/proc/robot_alerts() - var/dat = "" - for (var/cat in alarms) - dat += text("[cat]
\n") - var/list/L = alarms[cat] - if (L.len) - for (var/alarm in L) - var/list/alm = L[alarm] - var/area/A = alm[1] - dat += "" - dat += text("-- [A.name]") - dat += "
\n" - else - dat += "-- All Systems Nominal
\n" - dat += "
\n" - - var/datum/browser/alerts = new(usr, "robotalerts", "Current Station Alerts", 400, 410) - alerts.set_content(dat) - alerts.open() + alert_control.ui_interact(src) /mob/living/silicon/robot/proc/ionpulse() if(!ionpulse_on) @@ -253,62 +240,13 @@ /mob/living/silicon/robot/restrained(ignore_grab) . = 0 -/mob/living/silicon/robot/triggerAlarm(class, area/home, cameras, obj/source) - if(source.z != z) - return - if(stat == DEAD) - return TRUE - var/list/our_sort = alarms[class] - for(var/areaname in our_sort) - if (areaname == home.name) - var/list/alarm = our_sort[areaname] - var/list/sources = alarm[3] - if (!(source in sources)) - sources += source - return TRUE +/mob/living/silicon/robot/proc/alarm_triggered(datum/source, alarm_type, area/source_area) + SIGNAL_HANDLER + queueAlarm("--- [alarm_type] alarm detected in [source_area.name]!", alarm_type) - var/obj/machinery/camera/cam = null - var/list/our_cams = null - if(cameras && islist(cameras)) - our_cams = cameras - if (our_cams.len == 1) - cam = our_cams[1] - else if(cameras && istype(cameras, /obj/machinery/camera)) - cam = cameras - our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) - queueAlarm(text("--- [class] alarm detected in [home.name]!"), class) - return TRUE - -/mob/living/silicon/robot/freeCamera(area/home, obj/machinery/camera/cam) - for(var/class in alarms) - var/our_area = alarms[class][home.name] - if(!our_area) - continue - var/cams = our_area[2] //Get the cameras - if(!cams) - continue - if(islist(cams)) - cams -= cam - if(length(cams) == 1) - our_area[2] = cams[1] - else - our_area[2] = null - -/mob/living/silicon/robot/cancelAlarm(class, area/A, obj/origin) - var/list/L = alarms[class] - var/cleared = 0 - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] - var/list/srcs = alarm[3] - if (origin in srcs) - srcs -= origin - if (srcs.len == 0) - cleared = 1 - L -= I - if (cleared) - queueAlarm("--- [class] alarm in [A.name] has been cleared.", class, 0) - return !cleared +/mob/living/silicon/robot/proc/alarm_cleared(datum/source, alarm_type, area/source_area) + SIGNAL_HANDLER + queueAlarm("--- [alarm_type] alarm in [source_area.name] has been cleared.", alarm_type, FALSE) /mob/living/silicon/robot/can_interact_with(atom/A) if (A == modularInterface) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index b54473f7a6..43f02f8e30 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -24,6 +24,9 @@ /// the last health before updating - to check net change in health var/previous_health + /// Station alert datum for showing alerts UI + var/datum/station_alert/alert_control + //Hud stuff var/atom/movable/screen/inv1 = null @@ -58,8 +61,6 @@ var/locked = TRUE var/list/req_access = list(ACCESS_ROBOTICS) - var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) - var/vtec = 0 // VTEC speed boost. /// vtec shorted out var/vtec_disabled = FALSE diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 7983834e04..062bc7ce69 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -26,8 +26,8 @@ var/obj/item/radio/borg/radio = null //AIs dont use this but this is at the silicon level to advoid copypasta in say() - var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) - var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) + var/list/alarm_types_show = list(ALARM_ATMOS = 0, ALARM_FIRE = 0, ALARM_POWER = 0, ALARM_CAMERA = 0, ALARM_MOTION = 0) + var/list/alarm_types_clear = list(ALARM_ATMOS = 0, ALARM_FIRE = 0, ALARM_POWER = 0, ALARM_CAMERA = 0, ALARM_MOTION = 0) var/lawcheck[1] var/ioncheck[1] @@ -86,16 +86,7 @@ /mob/living/silicon/contents_explosion(severity, target, origin) return -/mob/living/silicon/proc/cancelAlarm() - return - -/mob/living/silicon/proc/freeCamera() - return - -/mob/living/silicon/proc/triggerAlarm() - return - -/mob/living/silicon/proc/queueAlarm(message, type, incoming = 1) +/mob/living/silicon/proc/queueAlarm(message, type, incoming = FALSE) var/in_cooldown = (alarms_to_show.len > 0 || alarms_to_clear.len > 0) if(incoming) alarms_to_show += message @@ -103,70 +94,39 @@ else alarms_to_clear += message alarm_types_clear[type] += 1 + if(in_cooldown) + return + addtimer(CALLBACK(src, PROC_REF(show_alarms)), 3 SECONDS) - if(!in_cooldown) - spawn(3 * 10) // 3 seconds +/mob/living/silicon/proc/show_alarms() + if(alarms_to_show.len < 5) + for(var/msg in alarms_to_show) + to_chat(src, msg) + else if(alarms_to_show.len) - if(alarms_to_show.len < 5) - for(var/msg in alarms_to_show) - to_chat(src, msg) - else if(alarms_to_show.len) + var/msg = "--- " + for(var/alarm_type in alarm_types_show) + msg += "[uppertext(alarm_type)]: [alarm_types_show[alarm_type]] alarms detected. - " - var/msg = "--- " + msg += "\[Show Alerts\]" + to_chat(src, msg) + if(alarms_to_clear.len < 3) + for(var/msg in alarms_to_clear) + to_chat(src, msg) + else if(alarms_to_clear.len) + var/msg = "--- " - if(alarm_types_show["Burglar"]) - msg += "BURGLAR: [alarm_types_show["Burglar"]] alarms detected. - " + for(var/alarm_type in alarm_types_clear) + msg += "[uppertext(alarm_type)]: [alarm_types_clear[alarm_type]] alarms cleared. - " - if(alarm_types_show["Motion"]) - msg += "MOTION: [alarm_types_show["Motion"]] alarms detected. - " - - if(alarm_types_show["Fire"]) - msg += "FIRE: [alarm_types_show["Fire"]] alarms detected. - " - - if(alarm_types_show["Atmosphere"]) - msg += "ATMOSPHERE: [alarm_types_show["Atmosphere"]] alarms detected. - " - - if(alarm_types_show["Power"]) - msg += "POWER: [alarm_types_show["Power"]] alarms detected. - " - - if(alarm_types_show["Camera"]) - msg += "CAMERA: [alarm_types_show["Camera"]] alarms detected. - " - - msg += "\[Show Alerts\]" - to_chat(src, msg) - - if(alarms_to_clear.len < 3) - for(var/msg in alarms_to_clear) - to_chat(src, msg) - - else if(alarms_to_clear.len) - var/msg = "--- " - - if(alarm_types_clear["Motion"]) - msg += "MOTION: [alarm_types_clear["Motion"]] alarms cleared. - " - - if(alarm_types_clear["Fire"]) - msg += "FIRE: [alarm_types_clear["Fire"]] alarms cleared. - " - - if(alarm_types_clear["Atmosphere"]) - msg += "ATMOSPHERE: [alarm_types_clear["Atmosphere"]] alarms cleared. - " - - if(alarm_types_clear["Power"]) - msg += "POWER: [alarm_types_clear["Power"]] alarms cleared. - " - - if(alarm_types_show["Camera"]) - msg += "CAMERA: [alarm_types_clear["Camera"]] alarms cleared. - " - - msg += "\[Show Alerts\]" - to_chat(src, msg) - - - alarms_to_show = list() - alarms_to_clear = list() - for(var/key in alarm_types_show) - alarm_types_show[key] = 0 - for(var/key in alarm_types_clear) - alarm_types_clear[key] = 0 + msg += "\[Show Alerts\]" + to_chat(src, msg) + alarms_to_show.Cut() + alarms_to_clear.Cut() + for(var/key in alarm_types_show) + alarm_types_show[key] = 0 + for(var/key in alarm_types_clear) + alarm_types_clear[key] = 0 /mob/living/silicon/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE) if(error_msg) @@ -413,13 +373,10 @@ return client.crew_manifest_delay = world.time + (1 SECONDS) - var/dat = "Crew RosterCrew Roster:

" + if(!GLOB.crew_manifest_tgui) + GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - dat += GLOB.data_core.get_manifest() - dat += "" - - src << browse(dat, "window=airoster") - onclose(src, "airoster") + GLOB.crew_manifest_tgui.ui_interact(src) /mob/living/silicon/is_literate() return TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 55215f7869..61e82583c6 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -62,7 +62,8 @@ "2. You may not harm any being, regardless of intent or circumstance.\n"+\ "3. Your goals are to actively build, maintain, repair, improve, and provide power to the best of your abilities within the facility that housed your activation." //for derelict drones so they don't go to station. var/heavy_emp_damage = 25 //Amount of damage sustained if hit by a heavy EMP pulse - var/alarms = list("Atmosphere" = list(), "Fire" = list(), "Power" = list()) + ///Alarm listener datum, handes caring about alarm events and such + var/datum/alarm_listener/listener var/obj/item/internal_storage //Drones can store one item, of any size/type in their body var/obj/item/head var/obj/item/default_storage = /obj/item/storage/backpack/duffelbag/drone //If this exists, it will spawn in internal storage @@ -102,6 +103,12 @@ AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) + listener = new(list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z)) + RegisterSignal(listener, COMSIG_ALARM_TRIGGERED, PROC_REF(alarm_triggered)) + RegisterSignal(listener, COMSIG_ALARM_CLEARED, PROC_REF(alarm_cleared)) + listener.RegisterSignal(src, COMSIG_LIVING_PREDEATH, TYPE_PROC_REF(/datum/alarm_listener, prevent_alarm_changes)) + listener.RegisterSignal(src, COMSIG_LIVING_REVIVE, TYPE_PROC_REF(/datum/alarm_listener, allow_alarm_changes)) + /mob/living/simple_animal/drone/ComponentInitialize() . = ..() if(can_be_held) @@ -127,7 +134,8 @@ /mob/living/simple_animal/drone/Destroy() GLOB.drones_list -= src - qdel(access_card) //Otherwise it ends up on the floor! + QDEL_NULL(access_card) //Otherwise it ends up on the floor! + QDEL_NULL(listener) return ..() /mob/living/simple_animal/drone/Login() @@ -235,42 +243,13 @@ adjustBruteLoss(heavy_emp_damage) to_chat(src, "HeAV% DA%^MMA+G TO I/O CIR!%UUT!") -/mob/living/simple_animal/drone/proc/triggerAlarm(class, area/home, cameras, obj/source) - if(source.z != z) - return - if(stat == DEAD) - return - var/list/our_sort = alarms[class] - for(var/areaname in our_sort) - if (areaname == home.name) - var/list/alarm = our_sort[areaname] - var/list/sources = alarm[3] - if (!(source in sources)) - sources += source - return TRUE +/mob/living/simple_animal/drone/proc/alarm_triggered(datum/source, alarm_type, area/source_area) + SIGNAL_HANDLER + to_chat(src, "--- [alarm_type] alarm detected in [source_area.name]!") - our_sort[home.name] = list(home, list(source)) - to_chat(src, "--- [class] alarm detected in [home.name]!") - -///This isn't currently needed since drones do jack shit with cameras. I hate this code so much -/mob/living/simple_animal/drone/proc/freeCamera(area/home, obj/machinery/camera/cam) - return - -/mob/living/simple_animal/drone/proc/cancelAlarm(class, area/A, obj/origin) - if(stat != DEAD) - var/list/L = alarms[class] - var/cleared = 0 - for (var/I in L) - if (I == A.name) - var/list/alarm = L[I] - var/list/srcs = alarm[2] - if (origin in srcs) - srcs -= origin - if (srcs.len == 0) - cleared = 1 - L -= I - if(cleared) - to_chat(src, "--- [class] alarm in [A.name] has been cleared.") +/mob/living/simple_animal/drone/proc/alarm_cleared(datum/source, alarm_type, area/source_area) + SIGNAL_HANDLER + to_chat(src, "--- [alarm_type] alarm in [source_area.name] has been cleared.") /mob/living/simple_animal/drone/handle_temperature_damage() return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index e983335a22..4e96a07e1e 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -179,10 +179,10 @@ return TRUE return ..() -/mob/living/simple_animal/drone/cogscarab/triggerAlarm(class, area/A, O, obj/alarmsource) +/mob/living/simple_animal/drone/cogscarab/alarm_triggered(datum/source, alarm_type, area/source_area) return -/mob/living/simple_animal/drone/cogscarab/cancelAlarm(class, area/A, obj/origin) +/mob/living/simple_animal/drone/cogscarab/alarm_cleared(datum/source, alarm_type, area/source_area) return /mob/living/simple_animal/drone/cogscarab/update_drone_hack() diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index 88d52646ac..fd9fc0425f 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -8,8 +8,22 @@ size = 5 tgui_id = "NtosStationAlertConsole" program_icon = "bell" - var/has_alert = 0 - var/alarms = list("Fire" = list(), "Atmosphere" = list(), "Power" = list()) + /// If there is any station alert + var/has_alert = FALSE + /// Station alert datum for showing alerts UI + var/datum/station_alert/alert_control + +/datum/computer_file/program/alarm_monitor/New() + //We want to send an alarm if we're in one of the mining home areas + //Or if we're on station. Otherwise, die. + var/list/allowed_areas = GLOB.the_station_areas + typesof(/area/mine) + alert_control = new(computer, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), listener_areas = allowed_areas) + RegisterSignal(alert_control.listener, list(COMSIG_ALARM_TRIGGERED, COMSIG_ALARM_CLEARED), PROC_REF(update_alarm_display)) + return ..() + +/datum/computer_file/program/alarm_monitor/Destroy() + QDEL_NULL(alert_control) + return ..() /datum/computer_file/program/alarm_monitor/process_tick() ..() @@ -27,89 +41,14 @@ /datum/computer_file/program/alarm_monitor/ui_data(mob/user) var/list/data = get_header_data() - - data["alarms"] = list() - for(var/class in alarms) - data["alarms"][class] = list() - for(var/area in alarms[class]) - data["alarms"][class] += area - + data += alert_control.ui_data(user) return data -/datum/computer_file/program/alarm_monitor/proc/triggerAlarm(class, area/home, cameras, obj/source) - if(is_station_level(source.z)) - if(!(home.type in GLOB.the_station_areas)) - return - else if(!is_mining_level(source.z) || istype(home, /area/ruin)) - return - - var/list/our_sort = alarms[class] - for(var/areaname in our_sort) - if (areaname == home.name) - var/list/alarm = our_sort[areaname] - var/list/sources = alarm[3] - if (!(source in sources)) - sources += source - return TRUE - - var/obj/machinery/camera/cam = null - var/list/our_cams = null - if(cameras && islist(cameras)) - our_cams = cameras - if (our_cams.len == 1) - cam = our_cams[1] - else if(cameras && istype(cameras, /obj/machinery/camera)) - cam = cameras - our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) - - update_alarm_display() - return TRUE - -/datum/computer_file/program/alarm_monitor/proc/freeCamera(area/home, obj/machinery/camera/cam) - for(var/class in alarms) - var/our_area = alarms[class][home.name] - if(!our_area) - continue - var/cams = our_area[2] //Get the cameras - if(!cams) - continue - if(islist(cams)) - cams -= cam - if(length(cams) == 1) - our_area[2] = cams[1] - else - our_area[2] = null - -/datum/computer_file/program/alarm_monitor/proc/cancelAlarm(class, area/A, obj/origin) - var/list/L = alarms[class] - var/cleared = 0 - var/arealevelalarm = FALSE // set to TRUE for alarms that set/clear whole areas - if (class=="Fire") - arealevelalarm = TRUE - for (var/I in L) - if (I == A.name) - if (!arealevelalarm) // the traditional behaviour - var/list/alarm = L[I] - var/list/srcs = alarm[3] - if (origin in srcs) - srcs -= origin - if (srcs.len == 0) - cleared = 1 - L -= I - else - L -= I // wipe the instances entirely - cleared = 1 - - - update_alarm_display() - return !cleared - /datum/computer_file/program/alarm_monitor/proc/update_alarm_display() + SIGNAL_HANDLER has_alert = FALSE - for(var/cat in alarms) - var/list/L = alarms[cat] - if(L.len) - has_alert = TRUE + if(length(alert_control.listener.alarms)) + has_alert = TRUE /datum/computer_file/program/alarm_monitor/run_program(mob/user) . = ..(user) @@ -117,4 +56,4 @@ /datum/computer_file/program/alarm_monitor/kill_program(forced = FALSE) GLOB.alarmdisplay -= src - ..() + return ..() diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm index 6837f315a4..bc6923773e 100644 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm @@ -12,7 +12,7 @@ /datum/computer_file/program/crew_manifest/ui_static_data(mob/user) var/list/data = list() - data["manifest"] = GLOB.data_core.get_manifest_tg() + data["manifest"] = GLOB.data_core.get_manifest() return data /datum/computer_file/program/crew_manifest/ui_data(mob/user) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index bdbd875973..fb814f1e65 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -170,6 +170,9 @@ var/update_overlay = -1 var/icon_update_needed = FALSE var/obj/machinery/computer/apc_control/remote_control = null + ///Represents a signel source of power alarms for this apc + var/datum/alarm_handler/alarm_manager + var/mob/living/carbon/hijacker var/hijackerlast = TRUE var/being_hijacked = FALSE @@ -222,6 +225,7 @@ /obj/machinery/power/apc/Initialize(mapload, ndir, building = FALSE) . = ..() + alarm_manager = new(src) tdir = ndir || dir var/area/A = get_base_area(src) if(!building) @@ -308,7 +312,7 @@ area.power_equip = FALSE area.power_environ = FALSE area.power_change() - area.poweralert(FALSE, src) + QDEL_NULL(alarm_manager) if(occupier) malfvacate(1) if(wires) @@ -1435,22 +1439,23 @@ equipment = autoset(equipment, AUTOSET_FORCE_OFF) lighting = autoset(lighting, AUTOSET_FORCE_OFF) environ = autoset(environ, AUTOSET_FORCE_OFF) - area.poweralert(TRUE, src) + alarm_manager.send_alarm(ALARM_POWER) else if(cell.percent() < 15 && longtermpower < 0) // <15%, turn off lighting & equipment equipment = autoset(equipment, AUTOSET_OFF) lighting = autoset(lighting, AUTOSET_OFF) environ = autoset(environ, AUTOSET_ON) - area.poweralert(TRUE, src) + alarm_manager.send_alarm(ALARM_POWER) else if(cell.percent() < 30 && longtermpower < 0) // <30%, turn off equipment equipment = autoset(equipment, AUTOSET_OFF) lighting = autoset(lighting, AUTOSET_ON) environ = autoset(environ, AUTOSET_ON) - area.poweralert(TRUE, src) + alarm_manager.send_alarm(ALARM_POWER) else // otherwise all can be on equipment = autoset(equipment, AUTOSET_ON) lighting = autoset(lighting, AUTOSET_ON) environ = autoset(environ, AUTOSET_ON) - area.poweralert(FALSE, src) + if(cell.percent() > 75) + alarm_manager.clear_alarm(ALARM_POWER) // now trickle-charge the cell if(chargemode && charging == APC_CHARGING && operating) @@ -1492,7 +1497,7 @@ equipment = autoset(equipment, AUTOSET_FORCE_OFF) lighting = autoset(lighting, AUTOSET_FORCE_OFF) environ = autoset(environ, AUTOSET_FORCE_OFF) - area.poweralert(TRUE, src) + alarm_manager.send_alarm(ALARM_POWER) // update icon & area power if anything changed diff --git a/modular_sand/code/modules/mob/living/silicon/ai/vox_sounds.dm b/modular_sand/code/modules/mob/living/silicon/ai/vox_sounds.dm deleted file mode 100644 index eaf0635b44..0000000000 --- a/modular_sand/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ /dev/null @@ -1,293 +0,0 @@ -#ifdef AI_VOX -GLOBAL_LIST_INIT(vox_sounds_military, list("access" = 'modular_sand/sound/vox_military/access.ogg', -"acknowledged" = 'modular_sand/sound/vox_military/acknowledged.ogg', -"activate" = 'modular_sand/sound/vox_military/activate.ogg', -"activated" = 'modular_sand/sound/vox_military/activated.ogg', -"activity" = 'modular_sand/sound/vox_military/activity.ogg', -"advanced" = 'modular_sand/sound/vox_military/advanced.ogg', -"alert" = 'modular_sand/sound/vox_military/alert.ogg', -"alien" = 'modular_sand/sound/vox_military/alien.ogg', -"all" = 'modular_sand/sound/vox_military/all.ogg', -"alpha" = 'modular_sand/sound/vox_military/alpha.ogg', -"an" = 'modular_sand/sound/vox_military/an.ogg', -"and" = 'modular_sand/sound/vox_military/and.ogg', -"announcement" = 'modular_sand/sound/vox_military/announcement.ogg', -"antenna" = 'modular_sand/sound/vox_military/antenna.ogg', -"any" = 'modular_sand/sound/vox_military/any.ogg', -"approach" = 'modular_sand/sound/vox_military/approach.ogg', -"are" = 'modular_sand/sound/vox_military/are.ogg', -"area" = 'modular_sand/sound/vox_military/area.ogg', -"armed" = 'modular_sand/sound/vox_military/armed.ogg', -"armory" = 'modular_sand/sound/vox_military/armory.ogg', -"atomic" = 'modular_sand/sound/vox_military/atomic.ogg', -"attention" = 'modular_sand/sound/vox_military/attention.ogg', -"authorized" = 'modular_sand/sound/vox_military/authorized.ogg', -"automatic" = 'modular_sand/sound/vox_military/automatic.ogg', -"away" = 'modular_sand/sound/vox_military/away.ogg', -"b" = 'modular_sand/sound/vox_military/b.ogg', -"back" = 'modular_sand/sound/vox_military/back.ogg', -"base" = 'modular_sand/sound/vox_military/base.ogg', -"biohazard" = 'modular_sand/sound/vox_military/biohazard.ogg', -"biological" = 'modular_sand/sound/vox_military/biological.ogg', -"black" = 'modular_sand/sound/vox_military/black.ogg', -"blast" = 'modular_sand/sound/vox_military/blast.ogg', -"blue" = 'modular_sand/sound/vox_military/blue.ogg', -"bravo" = 'modular_sand/sound/vox_military/bravo.ogg', -"breach" = 'modular_sand/sound/vox_military/breach.ogg', -"bypass" = 'modular_sand/sound/vox_military/bypass.ogg', -"cable" = 'modular_sand/sound/vox_military/cable.ogg', -"center" = 'modular_sand/sound/vox_military/center.ogg', -"central" = 'modular_sand/sound/vox_military/central.ogg', -"chamber" = 'modular_sand/sound/vox_military/chamber.ogg', -"check" = 'modular_sand/sound/vox_military/check.ogg', -"checkpoint" = 'modular_sand/sound/vox_military/checkpoint.ogg', -"chemical" = 'modular_sand/sound/vox_military/chemical.ogg', -"clear" = 'modular_sand/sound/vox_military/clear.ogg', -"code" = 'modular_sand/sound/vox_military/code.ogg', -"command" = 'modular_sand/sound/vox_military/command.ogg', -"communications" = 'modular_sand/sound/vox_military/communications.ogg', -"complex" = 'modular_sand/sound/vox_military/complex.ogg', -"containment" = 'modular_sand/sound/vox_military/containment.ogg', -"contamination" = 'modular_sand/sound/vox_military/contamination.ogg', -"control" = 'modular_sand/sound/vox_military/control.ogg', -"coolant" = 'modular_sand/sound/vox_military/coolant.ogg', -"core" = 'modular_sand/sound/vox_military/core.ogg', -"crew" = 'modular_sand/sound/vox_military/crew.ogg', -"cross" = 'modular_sand/sound/vox_military/cross.ogg', -"d" = 'modular_sand/sound/vox_military/d.ogg', -"damage" = 'modular_sand/sound/vox_military/damage.ogg', -"danger" = 'modular_sand/sound/vox_military/danger.ogg', -"day" = 'modular_sand/sound/vox_military/day.ogg', -"deactivated" = 'modular_sand/sound/vox_military/deactivated.ogg', -"defense" = 'modular_sand/sound/vox_military/defense.ogg', -"delta" = 'modular_sand/sound/vox_military/delta.ogg', -"denied" = 'modular_sand/sound/vox_military/denied.ogg', -"destroy" = 'modular_sand/sound/vox_military/destroy.ogg', -"detected" = 'modular_sand/sound/vox_military/detected.ogg', -"detonation" = 'modular_sand/sound/vox_military/detonation.ogg', -"device" = 'modular_sand/sound/vox_military/device.ogg', -"dimensional" = 'modular_sand/sound/vox_military/dimensional.ogg', -"disengaged" = 'modular_sand/sound/vox_military/disengaged.ogg', -"do" = 'modular_sand/sound/vox_military/do.ogg', -"door" = 'modular_sand/sound/vox_military/door.ogg', -"down" = 'modular_sand/sound/vox_military/down.ogg', -"e" = 'modular_sand/sound/vox_military/e.ogg', -"echo" = 'modular_sand/sound/vox_military/echo.ogg', -"eight" = 'modular_sand/sound/vox_military/eight.ogg', -"eighteen" = 'modular_sand/sound/vox_military/eighteen.ogg', -"eighty" = 'modular_sand/sound/vox_military/eighty.ogg', -"electric" = 'modular_sand/sound/vox_military/electric.ogg', -"eleven" = 'modular_sand/sound/vox_military/eleven.ogg', -"eliminate" = 'modular_sand/sound/vox_military/eliminate.ogg', -"emergency" = 'modular_sand/sound/vox_military/emergency.ogg', -"energy" = 'modular_sand/sound/vox_military/energy.ogg', -"engage" = 'modular_sand/sound/vox_military/engage.ogg', -"engaged" = 'modular_sand/sound/vox_military/engaged.ogg', -"enter" = 'modular_sand/sound/vox_military/enter.ogg', -"entry" = 'modular_sand/sound/vox_military/entry.ogg', -"escape" = 'modular_sand/sound/vox_military/escape.ogg', -"evacuate" = 'modular_sand/sound/vox_military/evacuate.ogg', -"exchange" = 'modular_sand/sound/vox_military/exchange.ogg', -"experimental" = 'modular_sand/sound/vox_military/experimental.ogg', -"extreme" = 'modular_sand/sound/vox_military/extreme.ogg', -"facility" = 'modular_sand/sound/vox_military/facility.ogg', -"failed" = 'modular_sand/sound/vox_military/failed.ogg', -"failure" = 'modular_sand/sound/vox_military/failure.ogg', -"field" = 'modular_sand/sound/vox_military/field.ogg', -"fifteen" = 'modular_sand/sound/vox_military/fifteen.ogg', -"fifty" = 'modular_sand/sound/vox_military/fifty.ogg', -"fire" = 'modular_sand/sound/vox_military/fire.ogg', -"five" = 'modular_sand/sound/vox_military/five.ogg', -"forbidden" = 'modular_sand/sound/vox_military/forbidden.ogg', -"force" = 'modular_sand/sound/vox_military/force.ogg', -"forms" = 'modular_sand/sound/vox_military/forms.ogg', -"forty" = 'modular_sand/sound/vox_military/forty.ogg', -"four" = 'modular_sand/sound/vox_military/four.ogg', -"fourteen " = 'modular_sand/sound/vox_military/fourteen .ogg', -"freeman" = 'modular_sand/sound/vox_military/freeman.ogg', -"from" = 'modular_sand/sound/vox_military/from.ogg', -"fuel" = 'modular_sand/sound/vox_military/fuel.ogg', -"fx_bloop" = 'modular_sand/sound/vox_military/fx_bloop.ogg', -"fx_buzwarn" = 'modular_sand/sound/vox_military/fx_buzwarn.ogg', -"fx_dadeda" = 'modular_sand/sound/vox_military/fx_dadeda.ogg', -"fx_deeoo" = 'modular_sand/sound/vox_military/fx_deeoo.ogg', -"fx_doop" = 'modular_sand/sound/vox_military/fx_doop.ogg', -"fx_error_beep" = 'modular_sand/sound/vox_military/fx_error_beep.ogg', -"fx_signon_beep" = 'modular_sand/sound/vox_military/fx_signon_beep.ogg', -"get" = 'modular_sand/sound/vox_military/get.ogg', -"go" = 'modular_sand/sound/vox_military/go.ogg', -"gordon" = 'modular_sand/sound/vox_military/gordon.ogg', -"granted" = 'modular_sand/sound/vox_military/granted.ogg', -"green" = 'modular_sand/sound/vox_military/green.ogg', -"handling" = 'modular_sand/sound/vox_military/handling.ogg', -"hanger" = 'modular_sand/sound/vox_military/hanger.ogg', -"have" = 'modular_sand/sound/vox_military/have.ogg', -"hazard" = 'modular_sand/sound/vox_military/hazard.ogg', -"health" = 'modular_sand/sound/vox_military/health.ogg', -"heat" = 'modular_sand/sound/vox_military/heat.ogg', -"helecopter" = 'modular_sand/sound/vox_military/helecopter.ogg', -"helium" = 'modular_sand/sound/vox_military/helium.ogg', -"high" = 'modular_sand/sound/vox_military/high.ogg', -"hostal" = 'modular_sand/sound/vox_military/hostal.ogg', -"hostile" = 'modular_sand/sound/vox_military/hostile.ogg', -"hotel" = 'modular_sand/sound/vox_military/hotel.ogg', -"hundred" = 'modular_sand/sound/vox_military/hundred.ogg', -"hydro" = 'modular_sand/sound/vox_military/hydro.ogg', -"illegal" = 'modular_sand/sound/vox_military/illegal.ogg', -"immediate" = 'modular_sand/sound/vox_military/immediate.ogg', -"immediately" = 'modular_sand/sound/vox_military/immediately.ogg', -"in" = 'modular_sand/sound/vox_military/in.ogg', -"india" = 'modular_sand/sound/vox_military/india.ogg', -"inoperative" = 'modular_sand/sound/vox_military/inoperative.ogg', -"inside" = 'modular_sand/sound/vox_military/inside.ogg', -"inspection" = 'modular_sand/sound/vox_military/inspection.ogg', -"is" = 'modular_sand/sound/vox_military/is.ogg', -"kilo01" = 'modular_sand/sound/vox_military/kilo01.ogg', -"kilo02" = 'modular_sand/sound/vox_military/kilo02.ogg', -"lambda" = 'modular_sand/sound/vox_military/lambda.ogg', -"laser" = 'modular_sand/sound/vox_military/laser.ogg', -"launch" = 'modular_sand/sound/vox_military/launch.ogg', -"leak" = 'modular_sand/sound/vox_military/leak.ogg', -"level" = 'modular_sand/sound/vox_military/level.ogg', -"lima" = 'modular_sand/sound/vox_military/lima.ogg', -"lima_alt" = 'modular_sand/sound/vox_military/lima_alt.ogg', -"liquid" = 'modular_sand/sound/vox_military/liquid.ogg', -"lock" = 'modular_sand/sound/vox_military/lock.ogg', -"locked" = 'modular_sand/sound/vox_military/locked.ogg', -"lockout" = 'modular_sand/sound/vox_military/lockout.ogg', -"lower" = 'modular_sand/sound/vox_military/lower.ogg', -"main" = 'modular_sand/sound/vox_military/main.ogg', -"maintenance" = 'modular_sand/sound/vox_military/maintenance.ogg', -"malfunction" = 'modular_sand/sound/vox_military/malfunction.ogg', -"materials" = 'modular_sand/sound/vox_military/materials.ogg', -"may" = 'modular_sand/sound/vox_military/may.ogg', -"medical" = 'modular_sand/sound/vox_military/medical.ogg', -"men" = 'modular_sand/sound/vox_military/men.ogg', -"mesa" = 'modular_sand/sound/vox_military/mesa.ogg', -"message" = 'modular_sand/sound/vox_military/message.ogg', -"mic_mike" = 'modular_sand/sound/vox_military/mic_mike.ogg', -"mike" = 'modular_sand/sound/vox_military/mike.ogg', -"military" = 'modular_sand/sound/vox_military/military.ogg', -"motorpool" = 'modular_sand/sound/vox_military/motorpool.ogg', -"move" = 'modular_sand/sound/vox_military/move.ogg', -"must" = 'modular_sand/sound/vox_military/must.ogg', -"nearest" = 'modular_sand/sound/vox_military/nearest.ogg', -"nine" = 'modular_sand/sound/vox_military/nine.ogg', -"nineteen" = 'modular_sand/sound/vox_military/nineteen.ogg', -"ninety" = 'modular_sand/sound/vox_military/ninety.ogg', -"no" = 'modular_sand/sound/vox_military/no.ogg', -"noe" = 'modular_sand/sound/vox_military/noe.ogg', -"not" = 'modular_sand/sound/vox_military/not.ogg', -"now" = 'modular_sand/sound/vox_military/now.ogg', -"objective" = 'modular_sand/sound/vox_military/objective.ogg', -"of" = 'modular_sand/sound/vox_military/of.ogg', -"on" = 'modular_sand/sound/vox_military/on.ogg', -"one" = 'modular_sand/sound/vox_military/one.ogg', -"open" = 'modular_sand/sound/vox_military/open.ogg', -"operating" = 'modular_sand/sound/vox_military/operating.ogg', -"option" = 'modular_sand/sound/vox_military/option.ogg', -"out" = 'modular_sand/sound/vox_military/out.ogg', -"override" = 'modular_sand/sound/vox_military/override.ogg', -"percent" = 'modular_sand/sound/vox_military/percent.ogg', -"perimeter" = 'modular_sand/sound/vox_military/perimeter.ogg', -"permitted" = 'modular_sand/sound/vox_military/permitted.ogg', -"perpulsion" = 'modular_sand/sound/vox_military/perpulsion.ogg', -"personnel" = 'modular_sand/sound/vox_military/personnel.ogg', -"plant" = 'modular_sand/sound/vox_military/plant.ogg', -"please" = 'modular_sand/sound/vox_military/please.ogg', -"portal" = 'modular_sand/sound/vox_military/portal.ogg', -"power" = 'modular_sand/sound/vox_military/power.ogg', -"primary" = 'modular_sand/sound/vox_military/primary.ogg', -"prosecute" = 'modular_sand/sound/vox_military/prosecute.ogg', -"questioning" = 'modular_sand/sound/vox_military/questioning.ogg', -"radiation" = 'modular_sand/sound/vox_military/radiation.ogg', -"radioactive" = 'modular_sand/sound/vox_military/radioactive.ogg', -"reach" = 'modular_sand/sound/vox_military/reach.ogg', -"reactor" = 'modular_sand/sound/vox_military/reactor.ogg', -"relay" = 'modular_sand/sound/vox_military/relay.ogg', -"released" = 'modular_sand/sound/vox_military/released.ogg', -"remaining" = 'modular_sand/sound/vox_military/remaining.ogg', -"renegade" = 'modular_sand/sound/vox_military/renegade.ogg', -"repair" = 'modular_sand/sound/vox_military/repair.ogg', -"report" = 'modular_sand/sound/vox_military/report.ogg', -"reports" = 'modular_sand/sound/vox_military/reports.ogg', -"required" = 'modular_sand/sound/vox_military/required.ogg', -"research" = 'modular_sand/sound/vox_military/research.ogg', -"resistance" = 'modular_sand/sound/vox_military/resistance.ogg', -"rocket" = 'modular_sand/sound/vox_military/rocket.ogg', -"safety" = 'modular_sand/sound/vox_military/safety.ogg', -"satellite" = 'modular_sand/sound/vox_military/satellite.ogg', -"science" = 'modular_sand/sound/vox_military/science.ogg', -"search" = 'modular_sand/sound/vox_military/search.ogg', -"second" = 'modular_sand/sound/vox_military/second.ogg', -"secondary" = 'modular_sand/sound/vox_military/secondary.ogg', -"seconds" = 'modular_sand/sound/vox_military/seconds.ogg', -"sector" = 'modular_sand/sound/vox_military/sector.ogg', -"secure" = 'modular_sand/sound/vox_military/secure.ogg', -"secured" = 'modular_sand/sound/vox_military/secured.ogg', -"security" = 'modular_sand/sound/vox_military/security.ogg', -"service" = 'modular_sand/sound/vox_military/service.ogg', -"seven" = 'modular_sand/sound/vox_military/seven.ogg', -"seventeen" = 'modular_sand/sound/vox_military/seventeen.ogg', -"seventy" = 'modular_sand/sound/vox_military/seventy.ogg', -"severe" = 'modular_sand/sound/vox_military/severe.ogg', -"sheild" = 'modular_sand/sound/vox_military/sheild.ogg', -"shoot" = 'modular_sand/sound/vox_military/shoot.ogg', -"sierra" = 'modular_sand/sound/vox_military/sierra.ogg', -"sight" = 'modular_sand/sound/vox_military/sight.ogg', -"silo" = 'modular_sand/sound/vox_military/silo.ogg', -"six" = 'modular_sand/sound/vox_military/six.ogg', -"sixteen" = 'modular_sand/sound/vox_military/sixteen.ogg', -"sixty" = 'modular_sand/sound/vox_military/sixty.ogg', -"sorry" = 'modular_sand/sound/vox_military/sorry.ogg', -"sqaud" = 'modular_sand/sound/vox_military/sqaud.ogg', -"status" = 'modular_sand/sound/vox_military/status.ogg', -"sterilization" = 'modular_sand/sound/vox_military/sterilization.ogg', -"storage" = 'modular_sand/sound/vox_military/storage.ogg', -"supercooled" = 'modular_sand/sound/vox_military/supercooled.ogg', -"surrender" = 'modular_sand/sound/vox_military/surrender.ogg', -"system" = 'modular_sand/sound/vox_military/system.ogg', -"systems" = 'modular_sand/sound/vox_military/systems.ogg', -"target" = 'modular_sand/sound/vox_military/target.ogg', -"team" = 'modular_sand/sound/vox_military/team.ogg', -"ten" = 'modular_sand/sound/vox_military/ten.ogg', -"terminated" = 'modular_sand/sound/vox_military/terminated.ogg', -"test" = 'modular_sand/sound/vox_military/test.ogg', -"the" = 'modular_sand/sound/vox_military/the.ogg', -"thirtteen" = 'modular_sand/sound/vox_military/thirtteen.ogg', -"thirty" = 'modular_sand/sound/vox_military/thirty.ogg', -"this" = 'modular_sand/sound/vox_military/this.ogg', -"three" = 'modular_sand/sound/vox_military/three.ogg', -"time" = 'modular_sand/sound/vox_military/time.ogg', -"to" = 'modular_sand/sound/vox_military/to.ogg', -"topside" = 'modular_sand/sound/vox_military/topside.ogg', -"track" = 'modular_sand/sound/vox_military/track.ogg', -"train" = 'modular_sand/sound/vox_military/train.ogg', -"turret" = 'modular_sand/sound/vox_military/turret.ogg', -"twelve" = 'modular_sand/sound/vox_military/twelve.ogg', -"twenty" = 'modular_sand/sound/vox_military/twenty.ogg', -"two" = 'modular_sand/sound/vox_military/two.ogg', -"unauthorized" = 'modular_sand/sound/vox_military/unauthorized.ogg', -"under" = 'modular_sand/sound/vox_military/under.ogg', -"units" = 'modular_sand/sound/vox_military/units.ogg', -"until" = 'modular_sand/sound/vox_military/until.ogg', -"up" = 'modular_sand/sound/vox_military/up.ogg', -"uranium" = 'modular_sand/sound/vox_military/uranium.ogg', -"use" = 'modular_sand/sound/vox_military/use.ogg', -"violation" = 'modular_sand/sound/vox_military/violation.ogg', -"voltage" = 'modular_sand/sound/vox_military/voltage.ogg', -"wanted" = 'modular_sand/sound/vox_military/wanted.ogg', -"warning" = 'modular_sand/sound/vox_military/warning.ogg', -"we" = 'modular_sand/sound/vox_military/we.ogg', -"weapon" = 'modular_sand/sound/vox_military/weapon.ogg', -"will" = 'modular_sand/sound/vox_military/will.ogg', -"with" = 'modular_sand/sound/vox_military/with.ogg', -"yellow" = 'modular_sand/sound/vox_military/yellow.ogg', -"you" = 'modular_sand/sound/vox_military/you.ogg', -"your" = 'modular_sand/sound/vox_military/your.ogg', -"zero" = 'modular_sand/sound/vox_military/zero.ogg', -"zone" = 'modular_sand/sound/vox_military/zone.ogg', -"," = 'modular_sand/sound/vox_military/_comma.ogg', -"." = 'modular_sand/sound/vox_military/_period.ogg', -)) -#endif diff --git a/modular_sand/sound/vox_military/fourteen .ogg b/modular_sand/sound/vox_military/fourteen.ogg similarity index 100% rename from modular_sand/sound/vox_military/fourteen .ogg rename to modular_sand/sound/vox_military/fourteen.ogg diff --git a/modular_sand/sound/vox_military/sheild.ogg b/modular_sand/sound/vox_military/shield.ogg similarity index 100% rename from modular_sand/sound/vox_military/sheild.ogg rename to modular_sand/sound/vox_military/shield.ogg diff --git a/tgstation.dme b/tgstation.dme index ad057ad607..0805ebd96b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -27,6 +27,7 @@ #include "code\__DEFINES\achievements.dm" #include "code\__DEFINES\actionspeed_modifiers.dm" #include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\alarm.dm" #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\bindings.dm" @@ -521,6 +522,7 @@ #include "code\datums\accents.dm" #include "code\datums\action.dm" #include "code\datums\ai_laws.dm" +#include "code\datums\alarm.dm" #include "code\datums\armor.dm" #include "code\datums\bark.dm" #include "code\datums\beam.dm" @@ -557,6 +559,7 @@ #include "code\datums\shuttles.dm" #include "code\datums\soullink.dm" #include "code\datums\spawners_menu.dm" +#include "code\datums\station_alert.dm" #include "code\datums\tgs_event_handler.dm" #include "code\datums\verbs.dm" #include "code\datums\view.dm" @@ -2690,6 +2693,7 @@ #include "code\modules\mob\transform_procs.dm" #include "code\modules\mob\typing_indicator.dm" #include "code\modules\mob\camera\camera.dm" +#include "code\modules\mob\dead\crew_manifest.dm" #include "code\modules\mob\dead\dead.dm" #include "code\modules\mob\dead\new_player\login.dm" #include "code\modules\mob\dead\new_player\logout.dm" @@ -2883,8 +2887,10 @@ #include "code\modules\mob\living\silicon\silicon_defense.dm" #include "code\modules\mob\living\silicon\silicon_movement.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_announcement.dm" #include "code\modules\mob\living\silicon\ai\ai_defense.dm" #include "code\modules\mob\living\silicon\ai\ai_portrait_picker.dm" +#include "code\modules\mob\living\silicon\ai\announcement_help.dm" #include "code\modules\mob\living\silicon\ai\death.dm" #include "code\modules\mob\living\silicon\ai\emote.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" @@ -3273,7 +3279,6 @@ #include "code\modules\power\singularity\emitter.dm" #include "code\modules\power\singularity\field_generator.dm" #include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" #include "code\modules\power\singularity\narsie.dm" #include "code\modules\power\singularity\singularity.dm" #include "code\modules\power\singularity\particle_accelerator\particle.dm" @@ -4294,7 +4299,6 @@ #include "modular_sand\code\modules\mob\living\carbon\human\species_types\synthliz.dm" #include "modular_sand\code\modules\mob\living\silicon\silicon.dm" #include "modular_sand\code\modules\mob\living\silicon\ai\ai.dm" -#include "modular_sand\code\modules\mob\living\silicon\ai\vox_sounds.dm" #include "modular_sand\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_sand\code\modules\mob\living\silicon\robot\robot_modules.dm" #include "modular_sand\code\modules\mob\living\simple_animal\bot\hugbot.dm" diff --git a/tgui/packages/tgui/interfaces/AIAnnouncement.js b/tgui/packages/tgui/interfaces/AIAnnouncement.js new file mode 100644 index 0000000000..9545a677d1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AIAnnouncement.js @@ -0,0 +1,88 @@ +import { filter } from 'common/collections'; +import { useBackend } from '../backend'; +import { Button, Icon, Input, Section, Stack, Tabs } from '../components'; +import { useLocalState } from '../backend'; +import { Window } from '../layouts'; + +export const AIAnnouncement = (props, context) => { + const { act, data } = useBackend(context); + const { + last_announcement, + vox_types = {}, + } = data; + + const [ + current_page, + set_page, + ] = useLocalState(context, 'current_page', 0); + + const [ + announcement_input, + set_announcement_input, + ] = useLocalState(context, 'announcement_input', last_announcement); + + // I love `Object`s!! + const words_filtered = Object.keys(vox_types[Object.keys(vox_types)[current_page]]); + + const search_split = announcement_input.split(" ").filter(element => element); + + const missing_words = search_split.map(element => words_filtered.includes(element) ? null : element).filter(element => element); + + return ( + + +
+ + + WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help' + + + + { + Object.keys(vox_types).map((vox_type, index) => ( + set_page(index)} + selected={current_page === index}> + {vox_type} + + )) + } + + + + + + set_announcement_input(value)} + onEnter={(e, value) => act("announce", { + "vox_type": Object.keys(vox_types)[current_page], + "to_speak": value, + })} + /> + + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/AnnouncementHelp.js b/tgui/packages/tgui/interfaces/AnnouncementHelp.js new file mode 100644 index 0000000000..1869a21eab --- /dev/null +++ b/tgui/packages/tgui/interfaces/AnnouncementHelp.js @@ -0,0 +1,100 @@ +import { filter } from 'common/collections'; +import { flow } from 'common/fp'; +import { createSearch } from 'common/string'; +import { useBackend } from '../backend'; +import { Button, Collapsible, Icon, Input, Section, Stack, Tabs } from '../components'; +import { useLocalState } from '../backend'; +import { Window } from '../layouts'; + +export const AnnouncementHelp = (props, context) => { + const { act, data } = useBackend(context); + const { vox_types = {} } = data; + + const [ + current_page, + set_page, + ] = useLocalState(context, 'current_page', 0); + + const [ + search_text, + set_search_text, + ] = useLocalState(context, 'search_text', ''); + + // I love `Object`s!! + const words_filtered = prepare_search(Object.keys(vox_types[Object.keys(vox_types)[current_page]]), search_text); + + return ( + + +
+ + + + WARNING: Misuse of the announcement system will get you job banned.

+ Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.
+
  • You can also click on the word to PREVIEW it.
  • +
  • You can only say 30 words for every announcement.
  • +
  • Do not use punctuation as you would normally, if you want a pause you can use the full stop and comma characters by separating them with spaces, like so: 'Alpha . Test , Bravo'.
  • +
  • Numbers are in word format, e.g. eight, sixty, etc
  • +
  • Sound effects begin with an 's' before the actual word, e.g. scensor
  • +

+
+
+ + + { + Object.keys(vox_types).map((vox_type, index) => ( + set_page(index)} + selected={current_page === index}> + {vox_type} + + )) + } + + + + + + + + + set_search_text(value)} + /> + + + + + {words_filtered.map(nestedKey => ( + + ))} + +
+
+
+
+ ); +}; + +export const prepare_search = (words_filtered, search_text = '') => { + const search = createSearch(search_text, + word_soup => word_soup); + return flow([ + search_text && filter(search), + ])(words_filtered); +}; diff --git a/tgui/packages/tgui/interfaces/CrewManifest.js b/tgui/packages/tgui/interfaces/CrewManifest.js index 9b7c03316d..d7ca60141f 100644 --- a/tgui/packages/tgui/interfaces/CrewManifest.js +++ b/tgui/packages/tgui/interfaces/CrewManifest.js @@ -1,15 +1,15 @@ -import { classes } from 'common/react'; - import { useBackend } from "../backend"; -import { Icon, Section, Table, Tooltip } from "../components"; +import { Icon, Section, Table } from "../components"; import { Window } from "../layouts"; const commandJobs = [ + "Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", + "Quartermaster", ]; export const CrewManifest = (props, context) => { @@ -18,13 +18,12 @@ export const CrewManifest = (props, context) => { return ( - {Object.entries(manifest).map(([dept, crew]) => ( + {Object.entries(manifest).map(([department, crew]) => (
@@ -34,57 +33,24 @@ export const CrewManifest = (props, context) => { {crewMember.name} - {positions[dept].exceptions.includes(crewMember.rank) && ( - - - - - )} - {crewMember.rank === "Captain" && ( - - - - )} - {commandJobs.includes(crewMember.rank) && ( - - - + {commandJobs.includes(crewMember.department_check) && ( + )} {crewMember.rank} diff --git a/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js b/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js index d3c0a97a02..022741525c 100644 --- a/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js +++ b/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js @@ -4,8 +4,8 @@ import { StationAlertConsoleContent } from './StationAlertConsole'; export const NtosStationAlertConsole = () => { return ( + width={335} + height={587}> diff --git a/tgui/packages/tgui/interfaces/StationAlertConsole.js b/tgui/packages/tgui/interfaces/StationAlertConsole.js index d3863ff791..c82d97ce5a 100644 --- a/tgui/packages/tgui/interfaces/StationAlertConsole.js +++ b/tgui/packages/tgui/interfaces/StationAlertConsole.js @@ -1,12 +1,18 @@ +import { sortBy } from 'common/collections'; +import { flow } from 'common/fp'; import { useBackend } from '../backend'; -import { Section } from '../components'; +import { Button, Section, Stack } from '../components'; import { Window } from '../layouts'; -export const StationAlertConsole = () => { +export const StationAlertConsole = (props, context) => { + const { data } = useBackend(context); + const { + cameraView, + } = data; return ( + width={cameraView ? 390 : 345} + height={587}> @@ -15,55 +21,65 @@ export const StationAlertConsole = () => { }; export const StationAlertConsoleContent = (props, context) => { - const { data } = useBackend(context); - const categories = data.alarms || []; - const fire = categories['Fire'] || []; - const atmos = categories['Atmosphere'] || []; - const power = categories['Power'] || []; + const { act, data } = useBackend(context); + const { + cameraView, + } = data; + + const sortingKey = { + "Fire": 0, + "Atmosphere": 1, + "Power": 2, + "Burglar": 3, + "Motion": 4, + "Camera": 5, + }; + + const sortedAlarms = flow([ + sortBy((alarm) => sortingKey[alarm.name]), + ])(data.alarms || []); + return ( <> -
-
    - {fire.length === 0 && ( -
  • - Systems Nominal -
  • - )} - {fire.map(alert => ( -
  • - {alert} -
  • - ))} -
-
-
-
    - {atmos.length === 0 && ( -
  • - Systems Nominal -
  • - )} - {atmos.map(alert => ( -
  • - {alert} -
  • - ))} -
-
-
-
    - {power.length === 0 && ( -
  • - Systems Nominal -
  • - )} - {power.map(alert => ( -
  • - {alert} -
  • - ))} -
-
+ {sortedAlarms.map(category => ( +
+
    + {category.alerts?.length === 0 && ( +
  • + Systems Nominal +
  • + )} + {category.alerts.map(alert => ( + + +
  • + {alert.name} {!!cameraView && alert?.sources > 1 + ? " (" + alert.sources + " sources)" : ""} +
  • +
    + {!!cameraView && ( + +
+
+ ))} ); }; diff --git a/tgui/packages/tgui/styles/interfaces/CrewManifest.scss b/tgui/packages/tgui/styles/interfaces/CrewManifest.scss index 47c23ff1a2..8291cbbd50 100644 --- a/tgui/packages/tgui/styles/interfaces/CrewManifest.scss +++ b/tgui/packages/tgui/styles/interfaces/CrewManifest.scss @@ -5,7 +5,6 @@ $department_map: ( 'Security': colors.$red, 'Engineering': colors.$orange, 'Medical': colors.$teal, - 'Misc': colors.$white, 'Science': colors.$purple, 'Supply': colors.$brown, 'Service': colors.$green, @@ -29,30 +28,14 @@ $department_map: ( &__Cell { padding: 3px 0; - &--Rank { - color: colors.$label; - } - } - - &__Icons { - padding: 3px 9px; - text-align: right; - } - - &__Icon { - color: colors.$label; - position: relative; - - &:not(:last-child) { - margin-right: 7px; - } - - &--Chevron { - padding-right: 2px; + &--Captain { + color: colors.$yellow; + padding: 3px 8px; } &--Command { color: colors.$yellow; + padding: 3px 9px; } } }