From dc0d157d8c19ffe989b3d03bc8595ec219453230 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Mon, 26 Aug 2013 07:33:55 +0100 Subject: [PATCH] Re-added AI vocal announcements. Unlike before, the announcement no longer require a huge list to work, saving up room from the string table. They also work while streaming resources, meaning they won't overlap; this is because the resources are sent when a user joins, instead of when the AI makes an announcement and it messes up the ordering. There have been improvements since last time, they now have a small delay of 10 seconds, which anyone is free to adjust. The help screen will now only preview the sound to the AI. The last announcement is saved to the AI's variables. There's a limit of how many words can be said in a single announcement. --- code/modules/client/client procs.dm | 3 +- code/modules/mob/living/silicon/ai/ai.dm | 3 +- code/modules/mob/living/silicon/ai/say.dm | 724 +++------------------- 3 files changed, 75 insertions(+), 655 deletions(-) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index f372f27e547..5f091280210 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -107,7 +107,7 @@ if(config.resource_urls) src.preload_rsc = pick(config.resource_urls) else src.preload_rsc = 1 // If config.resource_urls is not set, preload like normal. - + src << "\red If the title screen is black, resources are still downloading. Please be patient until the title screen appears." @@ -241,6 +241,7 @@ //send resources to the client. It's here in its own proc so we can move it around easiliy if need be /client/proc/send_resources() + preload_vox() getFiles( 'nano/js/libraries.min.js', 'nano/js/nano_update.js', diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c701be0f558..fef0164d7d7 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -50,6 +50,7 @@ var/list/ai_list = list() var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through. var/datum/trackable/track = null + var/last_announcement = "" /mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0) var/list/possibleNames = ai_names @@ -338,7 +339,7 @@ var/list/ai_list = list() checklaws() if(href_list["say_word"]) - src.announcement(href_list["say_word"]) + play_vox_word(href_list["say_word"], null, src) return if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index e5624459e2a..57880471486 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -14,9 +14,10 @@ return 1 return ..() -var/announcing_vox = 0 +var/announcing_vox = 0 // Stores the time of the last announcement var/const/VOX_CHANNEL = 200 -var/const/VOX_VOLUME = 75 +var/const/VOX_DELAY = 100 // 10 seconds +var/const/VOX_PATH = "sound/vox/" /mob/living/silicon/ai/verb/announcement_help() @@ -24,689 +25,106 @@ var/const/VOX_VOLUME = 75 set desc = "Display a list of vocal words to announce to the crew." set category = "AI Commands" - src << "\red VOX is disabled until issues with the code can be sorted." - return -/* var/dat = "Here is a list of words you can type into the Announcement button to create sentences to vocally announce.
\ - 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'.
" + + var/dat = "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.
\ + \ + WARNING:
Misuse of the announcement system will get you job banned.
" var/index = 0 - for(var/word in vox_sounds) + var/list/vox_words = flist(VOX_PATH) // flist will return a list of strings with all the files in the path + for(var/word in vox_words) index++ - dat += "[capitalize(word)]" - if(index != vox_sounds.len) + var/stripped_word = copytext(word, 1, length(word) - 3) // Remove the .wav + dat += "[capitalize(stripped_word)]" + if(index != vox_words.len) dat += " / " - src << browse(dat, "window=announce_help;size=500x400")*/ + src << browse(dat, "window=announce_help;size=500x400") -/mob/living/silicon/ai/verb/announcement(var/message as text) +/mob/living/silicon/ai/verb/announcement() set name = "Announcement" - set desc = "Create a vocal announcement by typing in the available words to create a setence. More help is available in 'Announcement Help'" + set desc = "Create a vocal announcement by typing in the available words to create a sentence." set category = "AI Commands" - src << "\red VOX is disabled until issues with the code can be sorted." - return -/* - if(!message) + if(announcing_vox > world.time) + src << "Please wait [round((announcing_vox - world.time) / 10)] seconds." return - //if(!announcing_vox > world.time) - // return - log_game("[key_name_admin(src)] made a vocal announcement with the following message: [message].") + 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 - announcing_vox = world.time + 30 + last_announcement = message + + if(!message || announcing_vox > world.time) + return var/list/words = stringsplit(trim(message), " ") var/list/incorrect_words = list() - if(words.len > 32) - words.len = 32 + if(words.len > 30) + words.len = 30 + + // Detect incorrect words which aren't .wav files. for(var/word in words) word = trim(word) if(!word) + words -= word continue - if(!play_vox_word(word, src.z)) // If the word isn't speakable + if(!vox_word_exists(word)) incorrect_words += word if(incorrect_words.len) src << "These words are not available on the announcement system: [english_list(incorrect_words)]." -*/ -/proc/play_vox_word(var/word, var/z_level) -/* + return + + announcing_vox = world.time + VOX_DELAY + + log_game("[key_name_admin(src)] made a vocal announcement with the following message: [message].") + + for(var/word in words) + play_vox_word(word, src.z, null) + + +/proc/play_vox_word(var/word, var/z_level, var/mob/only_listener) + word = lowertext(word) - if(vox_sounds[word]) + if(vox_word_exists(word)) - var/sound_file = vox_sounds[word] - var/sound/voice = sound(sound_file, wait = 1, channel = VOX_CHANNEL, volume = VOX_VOLUME) + var/sound_file = get_vox_file(word) + var/sound/voice = sound(sound_file, wait = 1, channel = VOX_CHANNEL) voice.status = SOUND_STREAM - // Play voice for all mobs in the z level - for(var/mob/M in player_list) - if(M.client) - var/turf/T = get_turf(M) - if(T.z == z_level) - M << voice + // If there is no single listener, broadcast to everyone in the same z level + if(!only_listener) + // Play voice for all mobs in the z level + for(var/mob/M in player_list) + if(M.client) + var/turf/T = get_turf(M) + if(T.z == z_level) + M << voice + else + only_listener << voice return 1 - return 0*/ + return 0 + + +/proc/vox_word_exists(var/word) + return fexists("[VOX_PATH][word].wav") + +/proc/get_vox_file(var/word) + if(vox_word_exists(word)) + return file("[VOX_PATH][word].wav") -// List is required to compile the resources into the game when it loads. // Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable. +// We send the file to the user when they login. -var/list/vox_sounds = list(/*"," = 'sound/vox/,.wav', -"." = 'sound/vox/..wav', -"a" = 'sound/vox/a.wav', -"accelerating" = 'sound/vox/accelerating.wav', -"accelerator" = 'sound/vox/accelerator.wav', -"accepted" = 'sound/vox/accepted.wav', -"access" = 'sound/vox/access.wav', -"acknowledge" = 'sound/vox/acknowledge.wav', -"acknowledged" = 'sound/vox/acknowledged.wav', -"acquired" = 'sound/vox/acquired.wav', -"acquisition" = 'sound/vox/acquisition.wav', -"across" = 'sound/vox/across.wav', -"activate" = 'sound/vox/activate.wav', -"activated" = 'sound/vox/activated.wav', -"activity" = 'sound/vox/activity.wav', -"adios" = 'sound/vox/adios.wav', -"administration" = 'sound/vox/administration.wav', -"advanced" = 'sound/vox/advanced.wav', -"after" = 'sound/vox/after.wav', -"agent" = 'sound/vox/agent.wav', -"alarm" = 'sound/vox/alarm.wav', -"alert" = 'sound/vox/alert.wav', -"alien" = 'sound/vox/alien.wav', -"aligned" = 'sound/vox/aligned.wav', -"all" = 'sound/vox/all.wav', -"alpha" = 'sound/vox/alpha.wav', -"am" = 'sound/vox/am.wav', -"amigo" = 'sound/vox/amigo.wav', -"ammunition" = 'sound/vox/ammunition.wav', -"an" = 'sound/vox/an.wav', -"and" = 'sound/vox/and.wav', -"announcement" = 'sound/vox/announcement.wav', -"anomalous" = 'sound/vox/anomalous.wav', -"antenna" = 'sound/vox/antenna.wav', -"any" = 'sound/vox/any.wav', -"apprehend" = 'sound/vox/apprehend.wav', -"approach" = 'sound/vox/approach.wav', -"are" = 'sound/vox/are.wav', -"area" = 'sound/vox/area.wav', -"arm" = 'sound/vox/arm.wav', -"armed" = 'sound/vox/armed.wav', -"armor" = 'sound/vox/armor.wav', -"armory" = 'sound/vox/armory.wav', -"arrest" = 'sound/vox/arrest.wav', -"ass" = 'sound/vox/ass.wav', -"at" = 'sound/vox/at.wav', -"atomic" = 'sound/vox/atomic.wav', -"attention" = 'sound/vox/attention.wav', -"authorize" = 'sound/vox/authorize.wav', -"authorized" = 'sound/vox/authorized.wav', -"automatic" = 'sound/vox/automatic.wav', -"away" = 'sound/vox/away.wav', -"b" = 'sound/vox/b.wav', -"back" = 'sound/vox/back.wav', -"backman" = 'sound/vox/backman.wav', -"bad" = 'sound/vox/bad.wav', -"bag" = 'sound/vox/bag.wav', -"bailey" = 'sound/vox/bailey.wav', -"barracks" = 'sound/vox/barracks.wav', -"base" = 'sound/vox/base.wav', -"bay" = 'sound/vox/bay.wav', -"be" = 'sound/vox/be.wav', -"been" = 'sound/vox/been.wav', -"before" = 'sound/vox/before.wav', -"beyond" = 'sound/vox/beyond.wav', -"biohazard" = 'sound/vox/biohazard.wav', -"biological" = 'sound/vox/biological.wav', -"birdwell" = 'sound/vox/birdwell.wav', -"bizwarn" = 'sound/vox/bizwarn.wav', -"black" = 'sound/vox/black.wav', -"blast" = 'sound/vox/blast.wav', -"blocked" = 'sound/vox/blocked.wav', -"bloop" = 'sound/vox/bloop.wav', -"blue" = 'sound/vox/blue.wav', -"bottom" = 'sound/vox/bottom.wav', -"bravo" = 'sound/vox/bravo.wav', -"breach" = 'sound/vox/breach.wav', -"breached" = 'sound/vox/breached.wav', -"break" = 'sound/vox/break.wav', -"bridge" = 'sound/vox/bridge.wav', -"bust" = 'sound/vox/bust.wav', -"but" = 'sound/vox/but.wav', -"button" = 'sound/vox/button.wav', -"buzwarn" = 'sound/vox/buzwarn.wav', -"bypass" = 'sound/vox/bypass.wav', -"c" = 'sound/vox/c.wav', -"cable" = 'sound/vox/cable.wav', -"call" = 'sound/vox/call.wav', -"called" = 'sound/vox/called.wav', -"canal" = 'sound/vox/canal.wav', -"cap" = 'sound/vox/cap.wav', -"captain" = 'sound/vox/captain.wav', -"capture" = 'sound/vox/capture.wav', -"ceiling" = 'sound/vox/ceiling.wav', -"celsius" = 'sound/vox/celsius.wav', -"center" = 'sound/vox/center.wav', -"centi" = 'sound/vox/centi.wav', -"central" = 'sound/vox/central.wav', -"chamber" = 'sound/vox/chamber.wav', -"charlie" = 'sound/vox/charlie.wav', -"check" = 'sound/vox/check.wav', -"checkpoint" = 'sound/vox/checkpoint.wav', -"chemical" = 'sound/vox/chemical.wav', -"cleanup" = 'sound/vox/cleanup.wav', -"clear" = 'sound/vox/clear.wav', -"clearance" = 'sound/vox/clearance.wav', -"close" = 'sound/vox/close.wav', -"code" = 'sound/vox/code.wav', -"coded" = 'sound/vox/coded.wav', -"collider" = 'sound/vox/collider.wav', -"command" = 'sound/vox/command.wav', -"communication" = 'sound/vox/communication.wav', -"complex" = 'sound/vox/complex.wav', -"computer" = 'sound/vox/computer.wav', -"condition" = 'sound/vox/condition.wav', -"containment" = 'sound/vox/containment.wav', -"contamination" = 'sound/vox/contamination.wav', -"control" = 'sound/vox/control.wav', -"coolant" = 'sound/vox/coolant.wav', -"coomer" = 'sound/vox/coomer.wav', -"core" = 'sound/vox/core.wav', -"correct" = 'sound/vox/correct.wav', -"corridor" = 'sound/vox/corridor.wav', -"crew" = 'sound/vox/crew.wav', -"cross" = 'sound/vox/cross.wav', -"cryogenic" = 'sound/vox/cryogenic.wav', -"d" = 'sound/vox/d.wav', -"dadeda" = 'sound/vox/dadeda.wav', -"damage" = 'sound/vox/damage.wav', -"damaged" = 'sound/vox/damaged.wav', -"danger" = 'sound/vox/danger.wav', -"day" = 'sound/vox/day.wav', -"deactivated" = 'sound/vox/deactivated.wav', -"decompression" = 'sound/vox/decompression.wav', -"decontamination" = 'sound/vox/decontamination.wav', -"deeoo" = 'sound/vox/deeoo.wav', -"defense" = 'sound/vox/defense.wav', -"degrees" = 'sound/vox/degrees.wav', -"delta" = 'sound/vox/delta.wav', -"denied" = 'sound/vox/denied.wav', -"deploy" = 'sound/vox/deploy.wav', -"deployed" = 'sound/vox/deployed.wav', -"destroy" = 'sound/vox/destroy.wav', -"destroyed" = 'sound/vox/destroyed.wav', -"detain" = 'sound/vox/detain.wav', -"detected" = 'sound/vox/detected.wav', -"detonation" = 'sound/vox/detonation.wav', -"device" = 'sound/vox/device.wav', -"did" = 'sound/vox/did.wav', -"die" = 'sound/vox/die.wav', -"dimensional" = 'sound/vox/dimensional.wav', -"dirt" = 'sound/vox/dirt.wav', -"disengaged" = 'sound/vox/disengaged.wav', -"dish" = 'sound/vox/dish.wav', -"disposal" = 'sound/vox/disposal.wav', -"distance" = 'sound/vox/distance.wav', -"distortion" = 'sound/vox/distortion.wav', -"do" = 'sound/vox/do.wav', -"doctor" = 'sound/vox/doctor.wav', -"doop" = 'sound/vox/doop.wav', -"door" = 'sound/vox/door.wav', -"down" = 'sound/vox/down.wav', -"dual" = 'sound/vox/dual.wav', -"duct" = 'sound/vox/duct.wav', -"e" = 'sound/vox/e.wav', -"east" = 'sound/vox/east.wav', -"echo" = 'sound/vox/echo.wav', -"ed" = 'sound/vox/ed.wav', -"effect" = 'sound/vox/effect.wav', -"egress" = 'sound/vox/egress.wav', -"eight" = 'sound/vox/eight.wav', -"eighteen" = 'sound/vox/eighteen.wav', -"eighty" = 'sound/vox/eighty.wav', -"electric" = 'sound/vox/electric.wav', -"electromagnetic" = 'sound/vox/electromagnetic.wav', -"elevator" = 'sound/vox/elevator.wav', -"eleven" = 'sound/vox/eleven.wav', -"eliminate" = 'sound/vox/eliminate.wav', -"emergency" = 'sound/vox/emergency.wav', -"energy" = 'sound/vox/energy.wav', -"engage" = 'sound/vox/engage.wav', -"engaged" = 'sound/vox/engaged.wav', -"engine" = 'sound/vox/engine.wav', -"enter" = 'sound/vox/enter.wav', -"entry" = 'sound/vox/entry.wav', -"environment" = 'sound/vox/environment.wav', -"error" = 'sound/vox/error.wav', -"escape" = 'sound/vox/escape.wav', -"evacuate" = 'sound/vox/evacuate.wav', -"exchange" = 'sound/vox/exchange.wav', -"exit" = 'sound/vox/exit.wav', -"expect" = 'sound/vox/expect.wav', -"experiment" = 'sound/vox/experiment.wav', -"experimental" = 'sound/vox/experimental.wav', -"explode" = 'sound/vox/explode.wav', -"explosion" = 'sound/vox/explosion.wav', -"exposure" = 'sound/vox/exposure.wav', -"exterminate" = 'sound/vox/exterminate.wav', -"extinguish" = 'sound/vox/extinguish.wav', -"extinguisher" = 'sound/vox/extinguisher.wav', -"extreme" = 'sound/vox/extreme.wav', -"f" = 'sound/vox/f.wav', -"facility" = 'sound/vox/facility.wav', -"fahrenheit" = 'sound/vox/fahrenheit.wav', -"failed" = 'sound/vox/failed.wav', -"failure" = 'sound/vox/failure.wav', -"farthest" = 'sound/vox/farthest.wav', -"fast" = 'sound/vox/fast.wav', -"feet" = 'sound/vox/feet.wav', -"field" = 'sound/vox/field.wav', -"fifteen" = 'sound/vox/fifteen.wav', -"fifth" = 'sound/vox/fifth.wav', -"fifty" = 'sound/vox/fifty.wav', -"final" = 'sound/vox/final.wav', -"fine" = 'sound/vox/fine.wav', -"fire" = 'sound/vox/fire.wav', -"first" = 'sound/vox/first.wav', -"five" = 'sound/vox/five.wav', -"flooding" = 'sound/vox/flooding.wav', -"floor" = 'sound/vox/floor.wav', -"fool" = 'sound/vox/fool.wav', -"for" = 'sound/vox/for.wav', -"forbidden" = 'sound/vox/forbidden.wav', -"force" = 'sound/vox/force.wav', -"forms" = 'sound/vox/forms.wav', -"found" = 'sound/vox/found.wav', -"four" = 'sound/vox/four.wav', -"fourteen" = 'sound/vox/fourteen.wav', -"fourth" = 'sound/vox/fourth.wav', -"fourty" = 'sound/vox/fourty.wav', -"foxtrot" = 'sound/vox/foxtrot.wav', -"freeman" = 'sound/vox/freeman.wav', -"freezer" = 'sound/vox/freezer.wav', -"from" = 'sound/vox/from.wav', -"front" = 'sound/vox/front.wav', -"fuel" = 'sound/vox/fuel.wav', -"g" = 'sound/vox/g.wav', -"get" = 'sound/vox/get.wav', -"go" = 'sound/vox/go.wav', -"going" = 'sound/vox/going.wav', -"good" = 'sound/vox/good.wav', -"goodbye" = 'sound/vox/goodbye.wav', -"gordon" = 'sound/vox/gordon.wav', -"got" = 'sound/vox/got.wav', -"government" = 'sound/vox/government.wav', -"granted" = 'sound/vox/granted.wav', -"great" = 'sound/vox/great.wav', -"green" = 'sound/vox/green.wav', -"grenade" = 'sound/vox/grenade.wav', -"guard" = 'sound/vox/guard.wav', -"gulf" = 'sound/vox/gulf.wav', -"gun" = 'sound/vox/gun.wav', -"guthrie" = 'sound/vox/guthrie.wav', -"handling" = 'sound/vox/handling.wav', -"hangar" = 'sound/vox/hangar.wav', -"has" = 'sound/vox/has.wav', -"have" = 'sound/vox/have.wav', -"hazard" = 'sound/vox/hazard.wav', -"head" = 'sound/vox/head.wav', -"health" = 'sound/vox/health.wav', -"heat" = 'sound/vox/heat.wav', -"helicopter" = 'sound/vox/helicopter.wav', -"helium" = 'sound/vox/helium.wav', -"hello" = 'sound/vox/hello.wav', -"help" = 'sound/vox/help.wav', -"here" = 'sound/vox/here.wav', -"hide" = 'sound/vox/hide.wav', -"high" = 'sound/vox/high.wav', -"highest" = 'sound/vox/highest.wav', -"hit" = 'sound/vox/hit.wav', -"hole" = 'sound/vox/hole.wav', -"hostile" = 'sound/vox/hostile.wav', -"hot" = 'sound/vox/hot.wav', -"hotel" = 'sound/vox/hotel.wav', -"hour" = 'sound/vox/hour.wav', -"hours" = 'sound/vox/hours.wav', -"hundred" = 'sound/vox/hundred.wav', -"hydro" = 'sound/vox/hydro.wav', -"i" = 'sound/vox/i.wav', -"idiot" = 'sound/vox/idiot.wav', -"illegal" = 'sound/vox/illegal.wav', -"immediate" = 'sound/vox/immediate.wav', -"immediately" = 'sound/vox/immediately.wav', -"in" = 'sound/vox/in.wav', -"inches" = 'sound/vox/inches.wav', -"india" = 'sound/vox/india.wav', -"ing" = 'sound/vox/ing.wav', -"inoperative" = 'sound/vox/inoperative.wav', -"inside" = 'sound/vox/inside.wav', -"inspection" = 'sound/vox/inspection.wav', -"inspector" = 'sound/vox/inspector.wav', -"interchange" = 'sound/vox/interchange.wav', -"intruder" = 'sound/vox/intruder.wav', -"invallid" = 'sound/vox/invallid.wav', -"invasion" = 'sound/vox/invasion.wav', -"is" = 'sound/vox/is.wav', -"it" = 'sound/vox/it.wav', -"johnson" = 'sound/vox/johnson.wav', -"juliet" = 'sound/vox/juliet.wav', -"key" = 'sound/vox/key.wav', -"kill" = 'sound/vox/kill.wav', -"kilo" = 'sound/vox/kilo.wav', -"kit" = 'sound/vox/kit.wav', -"lab" = 'sound/vox/lab.wav', -"lambda" = 'sound/vox/lambda.wav', -"laser" = 'sound/vox/laser.wav', -"last" = 'sound/vox/last.wav', -"launch" = 'sound/vox/launch.wav', -"leak" = 'sound/vox/leak.wav', -"leave" = 'sound/vox/leave.wav', -"left" = 'sound/vox/left.wav', -"legal" = 'sound/vox/legal.wav', -"level" = 'sound/vox/level.wav', -"lever" = 'sound/vox/lever.wav', -"lie" = 'sound/vox/lie.wav', -"lieutenant" = 'sound/vox/lieutenant.wav', -"life" = 'sound/vox/life.wav', -"light" = 'sound/vox/light.wav', -"lima" = 'sound/vox/lima.wav', -"liquid" = 'sound/vox/liquid.wav', -"loading" = 'sound/vox/loading.wav', -"locate" = 'sound/vox/locate.wav', -"located" = 'sound/vox/located.wav', -"location" = 'sound/vox/location.wav', -"lock" = 'sound/vox/lock.wav', -"locked" = 'sound/vox/locked.wav', -"locker" = 'sound/vox/locker.wav', -"lockout" = 'sound/vox/lockout.wav', -"lower" = 'sound/vox/lower.wav', -"lowest" = 'sound/vox/lowest.wav', -"magnetic" = 'sound/vox/magnetic.wav', -"main" = 'sound/vox/main.wav', -"maintenance" = 'sound/vox/maintenance.wav', -"malfunction" = 'sound/vox/malfunction.wav', -"man" = 'sound/vox/man.wav', -"mass" = 'sound/vox/mass.wav', -"materials" = 'sound/vox/materials.wav', -"maximum" = 'sound/vox/maximum.wav', -"may" = 'sound/vox/may.wav', -"medical" = 'sound/vox/medical.wav', -"men" = 'sound/vox/men.wav', -"mercy" = 'sound/vox/mercy.wav', -"mesa" = 'sound/vox/mesa.wav', -"message" = 'sound/vox/message.wav', -"meter" = 'sound/vox/meter.wav', -"micro" = 'sound/vox/micro.wav', -"middle" = 'sound/vox/middle.wav', -"mike" = 'sound/vox/mike.wav', -"miles" = 'sound/vox/miles.wav', -"military" = 'sound/vox/military.wav', -"milli" = 'sound/vox/milli.wav', -"million" = 'sound/vox/million.wav', -"minefield" = 'sound/vox/minefield.wav', -"minimum" = 'sound/vox/minimum.wav', -"minutes" = 'sound/vox/minutes.wav', -"mister" = 'sound/vox/mister.wav', -"mode" = 'sound/vox/mode.wav', -"motor" = 'sound/vox/motor.wav', -"motorpool" = 'sound/vox/motorpool.wav', -"move" = 'sound/vox/move.wav', -"must" = 'sound/vox/must.wav', -"nearest" = 'sound/vox/nearest.wav', -"nice" = 'sound/vox/nice.wav', -"nine" = 'sound/vox/nine.wav', -"nineteen" = 'sound/vox/nineteen.wav', -"ninety" = 'sound/vox/ninety.wav', -"no" = 'sound/vox/no.wav', -"nominal" = 'sound/vox/nominal.wav', -"north" = 'sound/vox/north.wav', -"not" = 'sound/vox/not.wav', -"november" = 'sound/vox/november.wav', -"now" = 'sound/vox/now.wav', -"number" = 'sound/vox/number.wav', -"objective" = 'sound/vox/objective.wav', -"observation" = 'sound/vox/observation.wav', -"of" = 'sound/vox/of.wav', -"officer" = 'sound/vox/officer.wav', -"ok" = 'sound/vox/ok.wav', -"on" = 'sound/vox/on.wav', -"one" = 'sound/vox/one.wav', -"open" = 'sound/vox/open.wav', -"operating" = 'sound/vox/operating.wav', -"operations" = 'sound/vox/operations.wav', -"operative" = 'sound/vox/operative.wav', -"option" = 'sound/vox/option.wav', -"order" = 'sound/vox/order.wav', -"organic" = 'sound/vox/organic.wav', -"oscar" = 'sound/vox/oscar.wav', -"out" = 'sound/vox/out.wav', -"outside" = 'sound/vox/outside.wav', -"over" = 'sound/vox/over.wav', -"overload" = 'sound/vox/overload.wav', -"override" = 'sound/vox/override.wav', -"pacify" = 'sound/vox/pacify.wav', -"pain" = 'sound/vox/pain.wav', -"pal" = 'sound/vox/pal.wav', -"panel" = 'sound/vox/panel.wav', -"percent" = 'sound/vox/percent.wav', -"perimeter" = 'sound/vox/perimeter.wav', -"permitted" = 'sound/vox/permitted.wav', -"personnel" = 'sound/vox/personnel.wav', -"pipe" = 'sound/vox/pipe.wav', -"plant" = 'sound/vox/plant.wav', -"platform" = 'sound/vox/platform.wav', -"please" = 'sound/vox/please.wav', -"point" = 'sound/vox/point.wav', -"portal" = 'sound/vox/portal.wav', -"power" = 'sound/vox/power.wav', -"presence" = 'sound/vox/presence.wav', -"press" = 'sound/vox/press.wav', -"primary" = 'sound/vox/primary.wav', -"proceed" = 'sound/vox/proceed.wav', -"processing" = 'sound/vox/processing.wav', -"progress" = 'sound/vox/progress.wav', -"proper" = 'sound/vox/proper.wav', -"propulsion" = 'sound/vox/propulsion.wav', -"prosecute" = 'sound/vox/prosecute.wav', -"protective" = 'sound/vox/protective.wav', -"push" = 'sound/vox/push.wav', -"quantum" = 'sound/vox/quantum.wav', -"quebec" = 'sound/vox/quebec.wav', -"question" = 'sound/vox/question.wav', -"questioning" = 'sound/vox/questioning.wav', -"quick" = 'sound/vox/quick.wav', -"quit" = 'sound/vox/quit.wav', -"radiation" = 'sound/vox/radiation.wav', -"radioactive" = 'sound/vox/radioactive.wav', -"rads" = 'sound/vox/rads.wav', -"rapid" = 'sound/vox/rapid.wav', -"reach" = 'sound/vox/reach.wav', -"reached" = 'sound/vox/reached.wav', -"reactor" = 'sound/vox/reactor.wav', -"red" = 'sound/vox/red.wav', -"relay" = 'sound/vox/relay.wav', -"released" = 'sound/vox/released.wav', -"remaining" = 'sound/vox/remaining.wav', -"renegade" = 'sound/vox/renegade.wav', -"repair" = 'sound/vox/repair.wav', -"report" = 'sound/vox/report.wav', -"reports" = 'sound/vox/reports.wav', -"required" = 'sound/vox/required.wav', -"research" = 'sound/vox/research.wav', -"resevoir" = 'sound/vox/resevoir.wav', -"resistance" = 'sound/vox/resistance.wav', -"right" = 'sound/vox/right.wav', -"rocket" = 'sound/vox/rocket.wav', -"roger" = 'sound/vox/roger.wav', -"romeo" = 'sound/vox/romeo.wav', -"room" = 'sound/vox/room.wav', -"round" = 'sound/vox/round.wav', -"run" = 'sound/vox/run.wav', -"safe" = 'sound/vox/safe.wav', -"safety" = 'sound/vox/safety.wav', -"sargeant" = 'sound/vox/sargeant.wav', -"satellite" = 'sound/vox/satellite.wav', -"save" = 'sound/vox/save.wav', -"science" = 'sound/vox/science.wav', -"scream" = 'sound/vox/scream.wav', -"screen" = 'sound/vox/screen.wav', -"search" = 'sound/vox/search.wav', -"second" = 'sound/vox/second.wav', -"secondary" = 'sound/vox/secondary.wav', -"seconds" = 'sound/vox/seconds.wav', -"sector" = 'sound/vox/sector.wav', -"secure" = 'sound/vox/secure.wav', -"secured" = 'sound/vox/secured.wav', -"security" = 'sound/vox/security.wav', -"select" = 'sound/vox/select.wav', -"selected" = 'sound/vox/selected.wav', -"service" = 'sound/vox/service.wav', -"seven" = 'sound/vox/seven.wav', -"seventeen" = 'sound/vox/seventeen.wav', -"seventy" = 'sound/vox/seventy.wav', -"severe" = 'sound/vox/severe.wav', -"sewage" = 'sound/vox/sewage.wav', -"sewer" = 'sound/vox/sewer.wav', -"shield" = 'sound/vox/shield.wav', -"shipment" = 'sound/vox/shipment.wav', -"shock" = 'sound/vox/shock.wav', -"shoot" = 'sound/vox/shoot.wav', -"shower" = 'sound/vox/shower.wav', -"shut" = 'sound/vox/shut.wav', -"side" = 'sound/vox/side.wav', -"sierra" = 'sound/vox/sierra.wav', -"sight" = 'sound/vox/sight.wav', -"silo" = 'sound/vox/silo.wav', -"six" = 'sound/vox/six.wav', -"sixteen" = 'sound/vox/sixteen.wav', -"sixty" = 'sound/vox/sixty.wav', -"slime" = 'sound/vox/slime.wav', -"slow" = 'sound/vox/slow.wav', -"soldier" = 'sound/vox/soldier.wav', -"some" = 'sound/vox/some.wav', -"someone" = 'sound/vox/someone.wav', -"something" = 'sound/vox/something.wav', -"son" = 'sound/vox/son.wav', -"sorry" = 'sound/vox/sorry.wav', -"south" = 'sound/vox/south.wav', -"squad" = 'sound/vox/squad.wav', -"square" = 'sound/vox/square.wav', -"stairway" = 'sound/vox/stairway.wav', -"status" = 'sound/vox/status.wav', -"sterile" = 'sound/vox/sterile.wav', -"sterilization" = 'sound/vox/sterilization.wav', -"storage" = 'sound/vox/storage.wav', -"sub" = 'sound/vox/sub.wav', -"subsurface" = 'sound/vox/subsurface.wav', -"sudden" = 'sound/vox/sudden.wav', -"suit" = 'sound/vox/suit.wav', -"superconducting" = 'sound/vox/superconducting.wav', -"supercooled" = 'sound/vox/supercooled.wav', -"supply" = 'sound/vox/supply.wav', -"surface" = 'sound/vox/surface.wav', -"surrender" = 'sound/vox/surrender.wav', -"surround" = 'sound/vox/surround.wav', -"surrounded" = 'sound/vox/surrounded.wav', -"switch" = 'sound/vox/switch.wav', -"system" = 'sound/vox/system.wav', -"systems" = 'sound/vox/systems.wav', -"tactical" = 'sound/vox/tactical.wav', -"take" = 'sound/vox/take.wav', -"talk" = 'sound/vox/talk.wav', -"tango" = 'sound/vox/tango.wav', -"tank" = 'sound/vox/tank.wav', -"target" = 'sound/vox/target.wav', -"team" = 'sound/vox/team.wav', -"temperature" = 'sound/vox/temperature.wav', -"temporal" = 'sound/vox/temporal.wav', -"ten" = 'sound/vox/ten.wav', -"terminal" = 'sound/vox/terminal.wav', -"terminated" = 'sound/vox/terminated.wav', -"termination" = 'sound/vox/termination.wav', -"test" = 'sound/vox/test.wav', -"that" = 'sound/vox/that.wav', -"the" = 'sound/vox/the.wav', -"then" = 'sound/vox/then.wav', -"there" = 'sound/vox/there.wav', -"third" = 'sound/vox/third.wav', -"thirteen" = 'sound/vox/thirteen.wav', -"thirty" = 'sound/vox/thirty.wav', -"this" = 'sound/vox/this.wav', -"those" = 'sound/vox/those.wav', -"thousand" = 'sound/vox/thousand.wav', -"threat" = 'sound/vox/threat.wav', -"three" = 'sound/vox/three.wav', -"through" = 'sound/vox/through.wav', -"time" = 'sound/vox/time.wav', -"to" = 'sound/vox/to.wav', -"top" = 'sound/vox/top.wav', -"topside" = 'sound/vox/topside.wav', -"touch" = 'sound/vox/touch.wav', -"towards" = 'sound/vox/towards.wav', -"track" = 'sound/vox/track.wav', -"train" = 'sound/vox/train.wav', -"transportation" = 'sound/vox/transportation.wav', -"truck" = 'sound/vox/truck.wav', -"tunnel" = 'sound/vox/tunnel.wav', -"turn" = 'sound/vox/turn.wav', -"turret" = 'sound/vox/turret.wav', -"twelve" = 'sound/vox/twelve.wav', -"twenty" = 'sound/vox/twenty.wav', -"two" = 'sound/vox/two.wav', -"unauthorized" = 'sound/vox/unauthorized.wav', -"under" = 'sound/vox/under.wav', -"uniform" = 'sound/vox/uniform.wav', -"unlocked" = 'sound/vox/unlocked.wav', -"until" = 'sound/vox/until.wav', -"up" = 'sound/vox/up.wav', -"upper" = 'sound/vox/upper.wav', -"uranium" = 'sound/vox/uranium.wav', -"us" = 'sound/vox/us.wav', -"usa" = 'sound/vox/usa.wav', -"use" = 'sound/vox/use.wav', -"used" = 'sound/vox/used.wav', -"user" = 'sound/vox/user.wav', -"vacate" = 'sound/vox/vacate.wav', -"valid" = 'sound/vox/valid.wav', -"vapor" = 'sound/vox/vapor.wav', -"vent" = 'sound/vox/vent.wav', -"ventillation" = 'sound/vox/ventillation.wav', -"victor" = 'sound/vox/victor.wav', -"violated" = 'sound/vox/violated.wav', -"violation" = 'sound/vox/violation.wav', -"voltage" = 'sound/vox/voltage.wav', -"vox_login" = 'sound/vox/vox_login.wav', -"walk" = 'sound/vox/walk.wav', -"wall" = 'sound/vox/wall.wav', -"want" = 'sound/vox/want.wav', -"wanted" = 'sound/vox/wanted.wav', -"warm" = 'sound/vox/warm.wav', -"warn" = 'sound/vox/warn.wav', -"warning" = 'sound/vox/warning.wav', -"waste" = 'sound/vox/waste.wav', -"water" = 'sound/vox/water.wav', -"we" = 'sound/vox/we.wav', -"weapon" = 'sound/vox/weapon.wav', -"west" = 'sound/vox/west.wav', -"whiskey" = 'sound/vox/whiskey.wav', -"white" = 'sound/vox/white.wav', -"wilco" = 'sound/vox/wilco.wav', -"will" = 'sound/vox/will.wav', -"with" = 'sound/vox/with.wav', -"without" = 'sound/vox/without.wav', -"woop" = 'sound/vox/woop.wav', -"xeno" = 'sound/vox/xeno.wav', -"yankee" = 'sound/vox/yankee.wav', -"yards" = 'sound/vox/yards.wav', -"year" = 'sound/vox/year.wav', -"yellow" = 'sound/vox/yellow.wav', -"yes" = 'sound/vox/yes.wav', -"you" = 'sound/vox/you.wav', -"your" = 'sound/vox/your.wav', -"yourself" = 'sound/vox/yourself.wav', -"zero" = 'sound/vox/zero.wav', -"zone" = 'sound/vox/zone.wav', -"zulu" = 'sound/vox/zulu.wav'*/) \ No newline at end of file +/client/proc/preload_vox() + var/list/vox_files = flist(VOX_PATH) + for(var/file in vox_files) + // src << "Downloading [file]" + var/sound/S = sound("[VOX_PATH][file]") + src << browse_rsc(S) \ No newline at end of file