Merge remote-tracking branch 'upstream/master' into discounts

This commit is contained in:
AzuleUtama
2018-11-23 11:33:08 +00:00
451 changed files with 1729 additions and 22225 deletions
@@ -261,4 +261,4 @@
return .
if("toggleadvcontrol" in href_list)
advcontrol = !advcontrol
return MT_UPDATE
return TRUE
@@ -413,7 +413,7 @@
/obj/machinery/atmospherics/unary/vent_pump/multitool_topic(var/mob/user, var/list/href_list, var/obj/O)
if("toggleadvcontrol" in href_list)
advcontrol = !advcontrol
return MT_UPDATE
return TRUE
if("set_id" in href_list)
var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src.id_tag) as null|text), 1, MAX_MESSAGE_LEN)
@@ -426,7 +426,7 @@
id_tag = newid
broadcast_status()
return MT_UPDATE
return TRUE
return ..()
@@ -351,7 +351,7 @@
/obj/machinery/atmospherics/unary/vent_scrubber/multitool_topic(var/mob/user, var/list/href_list, var/obj/O)
if("toggleadvcontrol" in href_list)
advcontrol = !advcontrol
return MT_UPDATE
return TRUE
if("set_id" in href_list)
var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src:id_tag) as null|text),1,MAX_MESSAGE_LEN)
@@ -365,7 +365,7 @@
id_tag = newid
broadcast_status()
return MT_UPDATE
return TRUE
return ..()
+2 -2
View File
@@ -47,9 +47,9 @@
//End positions
#define COMPONENT_EXNAME_CHANGED 1
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom)
#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
#define COMPONENT_ATOM_BLOCK_EXIT 1
#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity)
#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume)
@@ -106,9 +106,9 @@
#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir)
#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable)
#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable)
#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable)
#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable)
#define COMPONENT_MOVABLE_BLOCK_UNCROSS 1
#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable)
#define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom)
#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum)
#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone)
+1
View File
@@ -11,6 +11,7 @@
#define isconstruct(A) (istype(A, /mob/living/simple_animal/hostile/construct))
//Objects
#define isitem(A) (istype(A, /obj/item))
#define ismecha(A) (istype(A, /obj/mecha))
-5
View File
@@ -32,11 +32,6 @@
#define HYDRO_SPEED_MULTIPLIER 1
// multitool_topic() shit
#define MT_ERROR -1
#define MT_UPDATE 1
#define MT_REINIT 2
//Modular computer/NTNet defines
//Modular computer part defines
+7 -5
View File
@@ -455,7 +455,7 @@ proc/checkhtml(var/t)
// Pencode
/proc/pencode_to_html(text, mob/user, obj/item/pen/P = null, format = 1, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT)
/proc/pencode_to_html(text, mob/user, obj/item/pen/P = null, format = 1, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT, no_font = FALSE)
text = replacetext(text, "\[b\]", "<B>")
text = replacetext(text, "\[/b\]", "</B>")
text = replacetext(text, "\[i\]", "<I>")
@@ -509,10 +509,12 @@ proc/checkhtml(var/t)
text = replacetext(text, "\[cell\]", "<td>")
text = replacetext(text, "\[logo\]", "<img src = ntlogo.png>")
text = replacetext(text, "\[time\]", "[station_time_timestamp()]") // TO DO
if(P)
text = "<font face=\"[deffont]\" color=[P ? P.colour : "black"]>[text]</font>"
else
text = "<font face=\"[deffont]\">[text]</font>"
if(!no_font)
if(P)
text = "<font face=\"[deffont]\" color=[P ? P.colour : "black"]>[text]</font>"
else
text = "<font face=\"[deffont]\">[text]</font>"
text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN)
return text
+8 -1
View File
@@ -7,6 +7,8 @@
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT)
return
return
/obj/item/proc/pre_attackby(atom/A, mob/living/user, params) //do stuff before attackby!
@@ -28,9 +30,12 @@
return I.attack(src, user)
/obj/item/proc/attack(mob/living/M, mob/living/user, def_zone)
SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user)
SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user)
if(flags & (NOBLUDGEON))
return 0
if(check_martial_counter(M, user))
return 0
if(can_operate(M)) //Checks if mob is lying down on table for surgery
if(istype(src,/obj/item/robot_parts))//popup override for direct attach
if(!attempt_initiate_surgery(src, M, user,1))
@@ -74,6 +79,8 @@
//the equivalent of the standard version of attack() but for object targets.
/obj/item/proc/attack_obj(obj/O, mob/living/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ)
return
if(flags & (NOBLUDGEON))
return
user.changeNext_move(CLICK_CD_MELEE)
+88
View File
@@ -0,0 +1,88 @@
// Squeak component ported over from tg
/datum/component/squeak
var/static/list/default_squeak_sounds = list('sound/items/toysqueak1.ogg'=1, 'sound/items/toysqueak2.ogg'=1, 'sound/items/toysqueak3.ogg'=1)
var/list/override_squeak_sounds
var/squeak_chance = 100
var/volume = 30
// This is so shoes don't squeak every step
var/steps = 0
var/step_delay = 1
// This is to stop squeak spam from inhand usage
var/last_use = 0
var/use_delay = 20
/datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override)
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak)
if(ismovableatom(parent))
RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), .proc/play_squeak)
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/play_squeak_crossed)
RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react)
if(isitem(parent))
RegisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), .proc/play_squeak)
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak)
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
if(istype(parent, /obj/item/clothing/shoes))
RegisterSignal(parent, COMSIG_SHOES_STEP_ACTION, .proc/step_squeak)
override_squeak_sounds = custom_sounds
if(chance_override)
squeak_chance = chance_override
if(volume_override)
volume = volume_override
if(isnum(step_delay_override))
step_delay = step_delay_override
if(isnum(use_delay_override))
use_delay = use_delay_override
/datum/component/squeak/proc/play_squeak()
if(prob(squeak_chance))
if(!override_squeak_sounds)
playsound(parent, pickweight(default_squeak_sounds), volume, 1, -1)
else
playsound(parent, pickweight(override_squeak_sounds), volume, 1, -1)
/datum/component/squeak/proc/step_squeak()
if(steps > step_delay)
play_squeak()
steps = 0
else
steps++
/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot)
RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE)
/datum/component/squeak/proc/on_drop(datum/source, mob/user)
UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING)
/datum/component/squeak/proc/play_squeak_crossed(atom/movable/AM)
if(isitem(AM))
var/obj/item/I = AM
if(I.flags & ABSTRACT)
return
else if(istype(AM, /obj/item/projectile))
var/obj/item/projectile/P = AM
if(P.original != parent)
return
var/atom/current_parent = parent
if(isturf(current_parent.loc))
play_squeak()
/datum/component/squeak/proc/use_squeak()
if(last_use + use_delay < world.time)
last_use = world.time
play_squeak()
/datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/source)
//We don't need to worry about unregistering this signal as it will happen for us automaticaly when the holder is qdeleted
RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change)
/datum/component/squeak/proc/holder_dir_change(datum/source, old_dir, new_dir)
//If the dir changes it means we're going through a bend in the pipes, let's pretend we bumped the wall
if(old_dir != new_dir)
play_squeak()
+3 -1
View File
@@ -1063,7 +1063,9 @@
H.mind.vampire.bloodtotal = 9999
H.mind.vampire.check_vampire_upgrade(0)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/bats)
to_chat(H, "You have gained the ability to shapeshift into bat form. While capable of basic self defense, you cannot use your other abilities in that form.")
to_chat(H, "You have gained the ability to shapeshift into bat form. This is a weak form with no abilities, only useful for stealth.")
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/hellhound)
to_chat(H, "You have gained the ability to shapeshift into lesser hellhound form. This is a combat form with different abilities, tough but not invincible. It can regenerate itself over time by resting.")
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/raise_vampires)
to_chat(H, "You have gained the ability to Raise Vampires. This extremely powerful AOE ability affects all humans near you. Vampires/thralls are healed. Corpses are raised as vampires. Others are stunned, then brain damaged, then killed.")
H.dna.SetSEState(JUMPBLOCK, 1)
+21 -1
View File
@@ -91,4 +91,24 @@
shapeshift_type = /mob/living/simple_animal/hostile/scarybat/batswarm
list/current_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
list/current_casters = list()
list/possible_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
list/possible_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
/obj/effect/proc_holder/spell/targeted/shapeshift/hellhound
name = "Lesser Hellhound Form"
desc = "Take on the shape of a Hellhound."
invocation = "none"
invocation_type = "none"
action_background_icon_state = "bg_demon"
action_icon_state = "glare"
shapeshift_type = /mob/living/simple_animal/hostile/hellhound
list/current_shapes = list(/mob/living/simple_animal/hostile/hellhound)
list/current_casters = list()
list/possible_shapes = list(/mob/living/simple_animal/hostile/hellhound)
/obj/effect/proc_holder/spell/targeted/shapeshift/hellhound/greater
name = "Greater Hellhound Form"
shapeshift_type = /mob/living/simple_animal/hostile/hellhound/greater
list/current_shapes = list(/mob/living/simple_animal/hostile/hellhound/greater)
list/current_casters = list()
list/possible_shapes = list(/mob/living/simple_animal/hostile/hellhound/greater)
+9
View File
@@ -737,6 +737,15 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 10
containername = "advanced first aid kits crate"
/datum/supply_packs/medical/firstaidmachine
name = "Machine First Aid Kits Crate"
contains = list(/obj/item/storage/firstaid/machine,
/obj/item/storage/firstaid/machine,
/obj/item/storage/firstaid/machine,
/obj/item/storage/firstaid/machine)
cost = 10
containername = "machine first aid kits crate"
/datum/supply_packs/medical/firstaibrute
name = "Brute Treatment Kits Crate"
contains = list(/obj/item/storage/firstaid/brute,
+7
View File
@@ -807,6 +807,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
refundable = TRUE
cant_discount = TRUE
/datum/uplink_item/stealthy_weapons/cqc
name = "CQC Manual"
desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing. Does not restrict weapon usage, but cannot be used alongside Gloves of the North Star."
reference = "CQC"
item = /obj/item/CQC_manual
cost = 9
/datum/uplink_item/stealthy_weapons/throwingweapons
name = "Box of Throwing Weapons"
desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \
+366 -1
View File
@@ -9,30 +9,47 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"accelerator" = 'sound/vox_fem/accelerator.ogg',
"accepted" = 'sound/vox_fem/accepted.ogg',
"access" = 'sound/vox_fem/access.ogg',
"accessed" = 'sound/vox_fem/accessed.ogg',
"accessing" = 'sound/vox_fem/accessing.ogg',
"acknowledge" = 'sound/vox_fem/acknowledge.ogg',
"acknowledged" = 'sound/vox_fem/acknowledged.ogg',
"acquired" = 'sound/vox_fem/acquired.ogg',
"acquisition" = 'sound/vox_fem/acquisition.ogg',
"across" = 'sound/vox_fem/across.ogg',
"act" = 'sound/vox_fem/act.ogg',
"acted" = 'sound/vox_fem/acted.ogg',
"acting" = 'sound/vox_fem/acting.ogg',
"activate" = 'sound/vox_fem/activate.ogg',
"activated" = 'sound/vox_fem/activated.ogg',
"active" = 'sound/vox_fem/active.ogg',
"activity" = 'sound/vox_fem/activity.ogg',
"actor" = 'sound/vox_fem/actor.ogg',
"actual" = 'sound/vox_fem/actual.ogg',
"actually" = 'sound/vox_fem/actually.ogg',
"adios" = 'sound/vox_fem/adios.ogg',
"administration" = 'sound/vox_fem/administration.ogg',
"advanced" = 'sound/vox_fem/advanced.ogg',
"aft" = 'sound/vox_fem/aft.ogg',
"after" = 'sound/vox_fem/after.ogg',
"again" = 'sound/vox_fem/again.ogg',
"agent" = 'sound/vox_fem/agent.ogg',
"ai" = 'sound/vox_fem/ai.ogg',
"air" = 'sound/vox_fem/air.ogg',
"airlock" = 'sound/vox_fem/airlock.ogg',
"alarm" = 'sound/vox_fem/alarm.ogg',
"alarmed" = 'sound/vox_fem/alarmed.ogg',
"alarms" = 'sound/vox_fem/alarms.ogg',
"alcohol" = 'sound/vox_fem/alcohol.ogg',
"alert" = 'sound/vox_fem/alert.ogg',
"alerted" = 'sound/vox_fem/alerted.ogg',
"alerting" = 'sound/vox_fem/alerting.ogg',
"alien" = 'sound/vox_fem/alien.ogg',
"aligned" = 'sound/vox_fem/aligned.ogg',
"alive" = 'sound/vox_fem/alive.ogg',
"all" = 'sound/vox_fem/all.ogg',
"alpha" = 'sound/vox_fem/alpha.ogg',
"alright" = 'sound/vox_fem/alright.ogg',
"always" = 'sound/vox_fem/always.ogg',
"am" = 'sound/vox_fem/am.ogg',
"amigo" = 'sound/vox_fem/amigo.ogg',
"ammunition" = 'sound/vox_fem/ammunition.ogg',
@@ -41,9 +58,12 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"andy" = 'sound/vox_fem/andy.ogg',
"announcement" = 'sound/vox_fem/announcement.ogg',
"anomalous" = 'sound/vox_fem/anomalous.ogg',
"anomaly" = 'sound/vox_fem/anomaly.ogg',
"another" = 'sound/vox_fem/another.ogg',
"antenna" = 'sound/vox_fem/antenna.ogg',
"antimov" = 'sound/vox_fem/antimov.ogg',
"any" = 'sound/vox_fem/any.ogg',
"apc" = 'sound/vox_fem/apc.ogg',
"apprehend" = 'sound/vox_fem/apprehend.ogg',
"approach" = 'sound/vox_fem/approach.ogg',
"are" = 'sound/vox_fem/are.ogg',
@@ -56,10 +76,17 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"arrest" = 'sound/vox_fem/arrest.ogg',
"arrival" = 'sound/vox_fem/arrival.ogg',
"arrivals" = 'sound/vox_fem/arrivals.ogg',
"arrived" = 'sound/vox_fem/arrived.ogg',
"art" = 'sound/vox_fem/art.ogg',
"artifact" = 'sound/vox_fem/artifact.ogg',
"artificial" = 'sound/vox_fem/artificial.ogg',
"asimov" = 'sound/vox_fem/asimov.ogg',
"ass" = 'sound/vox_fem/ass.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',
"assistants" = 'sound/vox_fem/assistants.ogg',
"at" = 'sound/vox_fem/at.ogg',
"atmospherics" = 'sound/vox_fem/atmospherics.ogg',
"atomic" = 'sound/vox_fem/atomic.ogg',
@@ -67,8 +94,12 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"authorize" = 'sound/vox_fem/authorize.ogg',
"authorized" = 'sound/vox_fem/authorized.ogg',
"automatic" = 'sound/vox_fem/automatic.ogg',
"avenge" = 'sound/vox_fem/avenge.ogg',
"avenged" = 'sound/vox_fem/avenged.ogg',
"avenging" = 'sound/vox_fem/avenging.ogg',
"away" = 'sound/vox_fem/away.ogg',
"b" = 'sound/vox_fem/b.ogg',
"baby" = 'sound/vox_fem/baby.ogg',
"back" = 'sound/vox_fem/back.ogg',
"backman" = 'sound/vox_fem/backman.ogg',
"bad" = 'sound/vox_fem/bad.ogg',
@@ -77,13 +108,27 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"bar" = 'sound/vox_fem/bar.ogg',
"barracks" = 'sound/vox_fem/barracks.ogg',
"base" = 'sound/vox_fem/base.ogg',
"battle" = 'sound/vox_fem/battle.ogg',
"battled" = 'sound/vox_fem/battled.ogg',
"battles" = 'sound/vox_fem/battles.ogg',
"battling" = 'sound/vox_fem/battling.ogg',
"bay" = 'sound/vox_fem/bay.ogg',
"be" = 'sound/vox_fem/be.ogg',
"because" = 'sound/vox_fem/because.ogg',
"becoming" = 'sound/vox_fem/becoming.ogg',
"been" = 'sound/vox_fem/been.ogg',
"before" = 'sound/vox_fem/before.ogg',
"being" = 'sound/vox_fem/being.ogg',
"believe" = 'sound/vox_fem/believe.ogg',
"believed" = 'sound/vox_fem/believed.ogg',
"believer" = 'sound/vox_fem/believer.ogg',
"believing" = 'sound/vox_fem/believing.ogg',
"best" = 'sound/vox_fem/best.ogg',
"bested" = 'sound/vox_fem/bested.ogg',
"besting" = 'sound/vox_fem/besting.ogg',
"between" = 'sound/vox_fem/between.ogg',
"beyond" = 'sound/vox_fem/beyond.ogg',
"big" = 'sound/vox_fem/big.ogg',
"biohazard" = 'sound/vox_fem/biohazard.ogg',
"biological" = 'sound/vox_fem/biological.ogg',
"biomass" = 'sound/vox_fem/biomass.ogg',
@@ -93,14 +138,30 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"bizwarn" = 'sound/vox_fem/bizwarn.ogg',
"black" = 'sound/vox_fem/black.ogg',
"blast" = 'sound/vox_fem/blast.ogg',
"blend" = 'sound/vox_fem/blend.ogg',
"blender" = 'sound/vox_fem/blender.ogg',
"blending" = 'sound/vox_fem/blending.ogg',
"blew" = 'sound/vox_fem/blew.ogg',
"blob" = 'sound/vox_fem/blob.ogg',
"blocked" = 'sound/vox_fem/blocked.ogg',
"bloop" = 'sound/vox_fem/bloop.ogg',
"blow" = 'sound/vox_fem/blow.ogg',
"blowing" = 'sound/vox_fem/blowing.ogg',
"blown" = 'sound/vox_fem/blown.ogg',
"blue" = 'sound/vox_fem/blue.ogg',
"blueshield" = 'sound/vox_fem/blueshield.ogg',
"bluespace" = 'sound/vox_fem/bluespace.ogg',
"board" = 'sound/vox_fem/board.ogg',
"bodies" = 'sound/vox_fem/bodies.ogg',
"body" = 'sound/vox_fem/body.ogg',
"bomb" = 'sound/vox_fem/bomb.ogg',
"bombs" = 'sound/vox_fem/bombs.ogg',
"borer" = 'sound/vox_fem/borer.ogg',
"borers" = 'sound/vox_fem/borers.ogg',
"boss" = 'sound/vox_fem/boss.ogg',
"bossed" = 'sound/vox_fem/bossed.ogg',
"bossing" = 'sound/vox_fem/bossing.ogg',
"bossy" = 'sound/vox_fem/bossy.ogg',
"botanist" = 'sound/vox_fem/botanist.ogg',
"botanists" = 'sound/vox_fem/botanists.ogg',
"bottom" = 'sound/vox_fem/bottom.ogg',
@@ -114,16 +175,22 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"bridge" = 'sound/vox_fem/bridge.ogg',
"briefing" = 'sound/vox_fem/briefing.ogg',
"brig" = 'sound/vox_fem/brig.ogg',
"build" = 'sound/vox_fem/build.ogg',
"builder" = 'sound/vox_fem/builder.ogg',
"building" = 'sound/vox_fem/building.ogg',
"built" = 'sound/vox_fem/built.ogg',
"bust" = 'sound/vox_fem/bust.ogg',
"but" = 'sound/vox_fem/but.ogg',
"button" = 'sound/vox_fem/button.ogg',
"buzwarn" = 'sound/vox_fem/buzwarn.ogg',
"by" = 'sound/vox_fem/by.ogg',
"bypass" = 'sound/vox_fem/bypass.ogg',
"c" = 'sound/vox_fem/c.ogg',
"cable" = 'sound/vox_fem/cable.ogg',
"cage" = 'sound/vox_fem/cage.ogg',
"call" = 'sound/vox_fem/call.ogg',
"called" = 'sound/vox_fem/called.ogg',
"came" = 'sound/vox_fem/came.ogg',
"camp" = 'sound/vox_fem/camp.ogg',
"can" = 'sound/vox_fem/can.ogg',
"canal" = 'sound/vox_fem/canal.ogg',
@@ -147,6 +214,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"changelings" = 'sound/vox_fem/changelings.ogg',
"changer" = 'sound/vox_fem/changer.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',
@@ -154,7 +222,10 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"chefs" = 'sound/vox_fem/chefs.ogg',
"chemical" = 'sound/vox_fem/chemical.ogg',
"chemist" = 'sound/vox_fem/chemist.ogg',
"chemistry" = 'sound/vox_fem/chemistry.ogg',
"chemists" = 'sound/vox_fem/chemists.ogg',
"chief" = 'sound/vox_fem/chief.ogg',
"civilian" = 'sound/vox_fem/civilian.ogg',
"cleanup" = 'sound/vox_fem/cleanup.ogg',
"clear" = 'sound/vox_fem/clear.ogg',
"clearance" = 'sound/vox_fem/clearance.ogg',
@@ -168,6 +239,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"collider" = 'sound/vox_fem/collider.ogg',
"comdom" = 'sound/vox_fem/comdom.ogg',
"come" = 'sound/vox_fem/come.ogg',
"coming" = 'sound/vox_fem/coming.ogg',
"command" = 'sound/vox_fem/command.ogg',
"communication" = 'sound/vox_fem/communication.ogg',
"complex" = 'sound/vox_fem/complex.ogg',
@@ -182,12 +254,26 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"coolant" = 'sound/vox_fem/coolant.ogg',
"coomer" = 'sound/vox_fem/coomer.ogg',
"core" = 'sound/vox_fem/core.ogg',
"coroner" = 'sound/vox_fem/coroner.ogg',
"correct" = 'sound/vox_fem/correct.ogg',
"corridor" = 'sound/vox_fem/corridor.ogg',
"could" = 'sound/vox_fem/could.ogg',
"court" = 'sound/vox_fem/court.ogg',
"coward" = 'sound/vox_fem/coward.ogg',
"cowards" = 'sound/vox_fem/cowards.ogg',
"crate" = 'sound/vox_fem/crate.ogg',
"crated" = 'sound/vox_fem/crated.ogg',
"crates" = 'sound/vox_fem/crates.ogg',
"crating" = 'sound/vox_fem/crating.ogg',
"cremate" = 'sound/vox_fem/cremate.ogg',
"cremated" = 'sound/vox_fem/cremated.ogg',
"cremating" = 'sound/vox_fem/cremating.ogg',
"cremation" = 'sound/vox_fem/cremation.ogg',
"crematorium" = 'sound/vox_fem/crematorium.ogg',
"crew" = 'sound/vox_fem/crew.ogg',
"criminal" = 'sound/vox_fem/criminal.ogg',
"criminals" = 'sound/vox_fem/criminals.ogg',
"critical" = 'sound/vox_fem/critical.ogg',
"cross" = 'sound/vox_fem/cross.ogg',
"cryogenic" = 'sound/vox_fem/cryogenic.ogg',
"cunt" = 'sound/vox_fem/cunt.ogg',
@@ -200,17 +286,24 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"damage" = 'sound/vox_fem/damage.ogg',
"damaged" = 'sound/vox_fem/damaged.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',
"decision" = 'sound/vox_fem/decision.ogg',
"declared" = 'sound/vox_fem/declared.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',
"delay" = 'sound/vox_fem/delay.ogg',
"delayed" = 'sound/vox_fem/delayed.ogg',
"delaying" = 'sound/vox_fem/delaying.ogg',
"delays" = 'sound/vox_fem/delays.ogg',
"delta" = 'sound/vox_fem/delta.ogg',
"demon" = 'sound/vox_fem/demon.ogg',
"denied" = 'sound/vox_fem/denied.ogg',
"department" = 'sound/vox_fem/department.ogg',
"departments" = 'sound/vox_fem/departments.ogg',
@@ -226,14 +319,20 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"device" = 'sound/vox_fem/device.ogg',
"did" = 'sound/vox_fem/did.ogg',
"die" = 'sound/vox_fem/die.ogg',
"died" = 'sound/vox_fem/died.ogg',
"dies" = 'sound/vox_fem/dies.ogg',
"dimensional" = 'sound/vox_fem/dimensional.ogg',
"diona" = 'sound/vox_fem/diona.ogg',
"dirt" = 'sound/vox_fem/dirt.ogg',
"disease" = 'sound/vox_fem/disease.ogg',
"diseased" = 'sound/vox_fem/diseased.ogg',
"diseases" = 'sound/vox_fem/diseases.ogg',
"disengaged" = 'sound/vox_fem/disengaged.ogg',
"dish" = 'sound/vox_fem/dish.ogg',
"disposal" = 'sound/vox_fem/disposal.ogg',
"distance" = 'sound/vox_fem/distance.ogg',
"distortion" = 'sound/vox_fem/distortion.ogg',
"dna" = 'sound/vox_fem/dna.ogg',
"do" = 'sound/vox_fem/do.ogg',
"dock" = 'sound/vox_fem/dock.ogg',
"docked" = 'sound/vox_fem/docked.ogg',
@@ -246,9 +345,13 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"dorms" = 'sound/vox_fem/dorms.ogg',
"down" = 'sound/vox_fem/down.ogg',
"drask" = 'sound/vox_fem/drask.ogg',
"drive" = 'sound/vox_fem/drive.ogg',
"drived" = 'sound/vox_fem/drived.ogg',
"driving" = 'sound/vox_fem/driving.ogg',
"drunk" = 'sound/vox_fem/drunk.ogg',
"dual" = 'sound/vox_fem/dual.ogg',
"duct" = 'sound/vox_fem/duct.ogg',
"dying" = 'sound/vox_fem/dying.ogg',
"e" = 'sound/vox_fem/e.ogg',
"east" = 'sound/vox_fem/east.ogg',
"echo" = 'sound/vox_fem/echo.ogg',
@@ -281,6 +384,9 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"evacuate" = 'sound/vox_fem/evacuate.ogg',
"evacuation" = 'sound/vox_fem/evacuation.ogg',
"every" = 'sound/vox_fem/every.ogg',
"everybody" = 'sound/vox_fem/everybody.ogg',
"everyone" = 'sound/vox_fem/everyone.ogg',
"everything" = 'sound/vox_fem/everything.ogg',
"everywhere" = 'sound/vox_fem/everywhere.ogg',
"exchange" = 'sound/vox_fem/exchange.ogg',
"execution" = 'sound/vox_fem/execution.ogg',
@@ -303,19 +409,39 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"failure" = 'sound/vox_fem/failure.ogg',
"farthest" = 'sound/vox_fem/farthest.ogg',
"fast" = 'sound/vox_fem/fast.ogg',
"fatal" = 'sound/vox_fem/fatal.ogg',
"fatalities" = 'sound/vox_fem/fatalities.ogg',
"fatality" = 'sound/vox_fem/fatality.ogg',
"fatally" = 'sound/vox_fem/fatally.ogg',
"fate" = 'sound/vox_fem/fate.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',
"fig" = 'sound/vox_fem/fig.ogg',
"figure" = 'sound/vox_fem/figure.ogg',
"figured" = 'sound/vox_fem/figured.ogg',
"figuring" = 'sound/vox_fem/figuring.ogg',
"final" = 'sound/vox_fem/final.ogg',
"finally" = 'sound/vox_fem/finally.ogg',
"find" = 'sound/vox_fem/find.ogg',
"finding" = 'sound/vox_fem/finding.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',
"flood" = 'sound/vox_fem/flood.ogg',
"flooded" = 'sound/vox_fem/flooded.ogg',
"flooding" = 'sound/vox_fem/flooding.ogg',
"floods" = 'sound/vox_fem/floods.ogg',
"floor" = 'sound/vox_fem/floor.ogg',
"floored" = 'sound/vox_fem/floored.ogg',
"flooring" = 'sound/vox_fem/flooring.ogg',
"food" = 'sound/vox_fem/food.ogg',
"foods" = 'sound/vox_fem/foods.ogg',
"fool" = 'sound/vox_fem/fool.ogg',
"foot" = 'sound/vox_fem/foot.ogg',
"for" = 'sound/vox_fem/for.ogg',
"forbidden" = 'sound/vox_fem/forbidden.ogg',
"force" = 'sound/vox_fem/force.ogg',
@@ -332,29 +458,46 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"from" = 'sound/vox_fem/from.ogg',
"front" = 'sound/vox_fem/front.ogg',
"fuck" = 'sound/vox_fem/fuck.ogg',
"fucked" = 'sound/vox_fem/fucked.ogg',
"fucking" = 'sound/vox_fem/fucking.ogg',
"fucks" = 'sound/vox_fem/fucks.ogg',
"fuel" = 'sound/vox_fem/fuel.ogg',
"g" = 'sound/vox_fem/g.ogg',
"gas" = 'sound/vox_fem/gas.ogg',
"gateway" = 'sound/vox_fem/gateway.ogg',
"gave" = 'sound/vox_fem/gave.ogg',
"generate" = 'sound/vox_fem/generate.ogg',
"generated" = 'sound/vox_fem/generated.ogg',
"generator" = 'sound/vox_fem/generator.ogg',
"get" = 'sound/vox_fem/get.ogg',
"give" = 'sound/vox_fem/give.ogg',
"given" = 'sound/vox_fem/given.ogg',
"giving" = 'sound/vox_fem/giving.ogg',
"glory" = 'sound/vox_fem/glory.ogg',
"go" = 'sound/vox_fem/go.ogg',
"god" = 'sound/vox_fem/god.ogg',
"goddess" = 'sound/vox_fem/goddess.ogg',
"going" = 'sound/vox_fem/going.ogg',
"gone" = 'sound/vox_fem/gone.ogg',
"good" = 'sound/vox_fem/good.ogg',
"goodbye" = 'sound/vox_fem/goodbye.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',
"ground" = 'sound/vox_fem/ground.ogg',
"grounded" = 'sound/vox_fem/grounded.ogg',
"grounding" = 'sound/vox_fem/grounding.ogg',
"guard" = 'sound/vox_fem/guard.ogg',
"gulf" = 'sound/vox_fem/gulf.ogg',
"gun" = 'sound/vox_fem/gun.ogg',
"gunned" = 'sound/vox_fem/gunned.ogg',
"guns" = 'sound/vox_fem/guns.ogg',
"guthrie" = 'sound/vox_fem/guthrie.ogg',
"h" = 'sound/vox_fem/h.ogg',
"hacker" = 'sound/vox_fem/hacker.ogg',
@@ -362,16 +505,26 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"hacking" = 'sound/vox_fem/hacking.ogg',
"hail" = 'sound/vox_fem/hail.ogg',
"hallway" = 'sound/vox_fem/hallway.ogg',
"hand" = 'sound/vox_fem/hand.ogg',
"handle" = 'sound/vox_fem/handle.ogg',
"handled" = 'sound/vox_fem/handled.ogg',
"handling" = 'sound/vox_fem/handling.ogg',
"hangar" = 'sound/vox_fem/hangar.ogg',
"happening" = 'sound/vox_fem/happening.ogg',
"happy" = 'sound/vox_fem/happy.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',
"he" = 'sound/vox_fem/he.ogg',
"head" = 'sound/vox_fem/head.ogg',
"health" = 'sound/vox_fem/health.ogg',
"hear" = 'sound/vox_fem/hear.ogg',
"heard" = 'sound/vox_fem/heard.ogg',
"hearing" = 'sound/vox_fem/hearing.ogg',
"heart" = 'sound/vox_fem/heart.ogg',
"heat" = 'sound/vox_fem/heat.ogg',
"held" = 'sound/vox_fem/held.ogg',
"helicopter" = 'sound/vox_fem/helicopter.ogg',
"helium" = 'sound/vox_fem/helium.ogg',
"hello" = 'sound/vox_fem/hello.ogg',
@@ -381,16 +534,24 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"high" = 'sound/vox_fem/high.ogg',
"highest" = 'sound/vox_fem/highest.ogg',
"hit" = 'sound/vox_fem/hit.ogg',
"hold" = 'sound/vox_fem/hold.ogg',
"holding" = 'sound/vox_fem/holding.ogg',
"hole" = 'sound/vox_fem/hole.ogg',
"holoparasite" = 'sound/vox_fem/holoparasite.ogg',
"honk" = 'sound/vox_fem/honk.ogg',
"hop" = 'sound/vox_fem/hop.ogg',
"hope" = 'sound/vox_fem/hope.ogg',
"hoped" = 'sound/vox_fem/hoped.ogg',
"hos" = 'sound/vox_fem/hos.ogg',
"hostile" = 'sound/vox_fem/hostile.ogg',
"hot" = 'sound/vox_fem/hot.ogg',
"hotel" = 'sound/vox_fem/hotel.ogg',
"hour" = 'sound/vox_fem/hour.ogg',
"hours" = 'sound/vox_fem/hours.ogg',
"how" = 'sound/vox_fem/how.ogg',
"hug" = 'sound/vox_fem/hug.ogg',
"hugged" = 'sound/vox_fem/hugged.ogg',
"hugging" = 'sound/vox_fem/hugging.ogg',
"hull" = 'sound/vox_fem/hull.ogg',
"human" = 'sound/vox_fem/human.ogg',
"humans" = 'sound/vox_fem/humans.ogg',
@@ -401,19 +562,35 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"i" = 'sound/vox_fem/i.ogg',
"iaa" = 'sound/vox_fem/iaa.ogg',
"ian" = 'sound/vox_fem/ian.ogg',
"idea" = 'sound/vox_fem/idea.ogg',
"identified" = 'sound/vox_fem/identified.ogg',
"identify" = 'sound/vox_fem/identify.ogg',
"identity" = 'sound/vox_fem/identity.ogg',
"idiot" = 'sound/vox_fem/idiot.ogg',
"illegal" = 'sound/vox_fem/illegal.ogg',
"immediate" = 'sound/vox_fem/immediate.ogg',
"immediately" = 'sound/vox_fem/immediately.ogg',
"imminent" = 'sound/vox_fem/imminent.ogg',
"implant" = 'sound/vox_fem/implant.ogg',
"implanted" = 'sound/vox_fem/implanted.ogg',
"implanting" = 'sound/vox_fem/implanting.ogg',
"implants" = 'sound/vox_fem/implants.ogg',
"in" = 'sound/vox_fem/in.ogg',
"inch" = 'sound/vox_fem/inch.ogg',
"inches" = 'sound/vox_fem/inches.ogg',
"india" = 'sound/vox_fem/india.ogg',
"infect" = 'sound/vox_fem/infect.ogg',
"infected" = 'sound/vox_fem/infected.ogg',
"infection" = 'sound/vox_fem/infection.ogg',
"infections" = 'sound/vox_fem/infections.ogg',
"ing" = 'sound/vox_fem/ing.ogg',
"injured" = 'sound/vox_fem/injured.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',
"intelligence" = 'sound/vox_fem/intelligence.ogg',
"intelligent" = 'sound/vox_fem/intelligent.ogg',
"interchange" = 'sound/vox_fem/interchange.ogg',
"interested" = 'sound/vox_fem/interested.ogg',
"intruder" = 'sound/vox_fem/intruder.ogg',
@@ -423,8 +600,11 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"is" = 'sound/vox_fem/is.ogg',
"it" = 'sound/vox_fem/it.ogg',
"j" = 'sound/vox_fem/j.ogg',
"job" = 'sound/vox_fem/job.ogg',
"jobs" = 'sound/vox_fem/jobs.ogg',
"johnson" = 'sound/vox_fem/johnson.ogg',
"juliet" = 'sound/vox_fem/juliet.ogg',
"just" = 'sound/vox_fem/just.ogg',
"k" = 'sound/vox_fem/k.ogg',
"key" = 'sound/vox_fem/key.ogg',
"kida" = 'sound/vox_fem/kida.ogg',
@@ -439,6 +619,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"lab" = 'sound/vox_fem/lab.ogg',
"labor" = 'sound/vox_fem/labor.ogg',
"lambda" = 'sound/vox_fem/lambda.ogg',
"larva" = 'sound/vox_fem/larva.ogg',
"laser" = 'sound/vox_fem/laser.ogg',
"last" = 'sound/vox_fem/last.ogg',
"launch" = 'sound/vox_fem/launch.ogg',
@@ -447,6 +628,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"lawyer" = 'sound/vox_fem/lawyer.ogg',
"leak" = 'sound/vox_fem/leak.ogg',
"leave" = 'sound/vox_fem/leave.ogg',
"leaving" = 'sound/vox_fem/leaving.ogg',
"left" = 'sound/vox_fem/left.ogg',
"legal" = 'sound/vox_fem/legal.ogg',
"level" = 'sound/vox_fem/level.ogg',
@@ -456,10 +638,18 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"lieutenant" = 'sound/vox_fem/lieutenant.ogg',
"life" = 'sound/vox_fem/life.ogg',
"light" = 'sound/vox_fem/light.ogg',
"like" = 'sound/vox_fem/like.ogg',
"liked" = 'sound/vox_fem/liked.ogg',
"liking" = 'sound/vox_fem/liking.ogg',
"lima" = 'sound/vox_fem/lima.ogg',
"ling" = 'sound/vox_fem/ling.ogg',
"liquid" = 'sound/vox_fem/liquid.ogg',
"live" = 'sound/vox_fem/live.ogg',
"lived" = 'sound/vox_fem/lived.ogg',
"living" = 'sound/vox_fem/living.ogg',
"lizard" = 'sound/vox_fem/lizard.ogg',
"loading" = 'sound/vox_fem/loading.ogg',
"lobby" = 'sound/vox_fem/lobby.ogg',
"locate" = 'sound/vox_fem/locate.ogg',
"located" = 'sound/vox_fem/located.ogg',
"location" = 'sound/vox_fem/location.ogg',
@@ -469,30 +659,49 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"lockout" = 'sound/vox_fem/lockout.ogg',
"loose" = 'sound/vox_fem/loose.ogg',
"love" = 'sound/vox_fem/love.ogg',
"loved" = 'sound/vox_fem/loved.ogg',
"loving" = 'sound/vox_fem/loving.ogg',
"lower" = 'sound/vox_fem/lower.ogg',
"lowest" = 'sound/vox_fem/lowest.ogg',
"m" = 'sound/vox_fem/m.ogg',
"made" = 'sound/vox_fem/made.ogg',
"magic" = 'sound/vox_fem/magic.ogg',
"magician" = 'sound/vox_fem/magician.ogg',
"magicians" = 'sound/vox_fem/magicians.ogg',
"magistrate" = 'sound/vox_fem/magistrate.ogg',
"magnetic" = 'sound/vox_fem/magnetic.ogg',
"main" = 'sound/vox_fem/main.ogg',
"maintenance" = 'sound/vox_fem/maintenance.ogg',
"make" = 'sound/vox_fem/make.ogg',
"maker" = 'sound/vox_fem/maker.ogg',
"making" = 'sound/vox_fem/making.ogg',
"malf" = 'sound/vox_fem/malf.ogg',
"malfunction" = 'sound/vox_fem/malfunction.ogg',
"malfunctioning" = 'sound/vox_fem/malfunctioning.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',
"maybe" = 'sound/vox_fem/maybe.ogg',
"me" = 'sound/vox_fem/me.ogg',
"mean" = 'sound/vox_fem/mean.ogg',
"meaning" = 'sound/vox_fem/meaning.ogg',
"meant" = 'sound/vox_fem/meant.ogg',
"medbay" = 'sound/vox_fem/medbay.ogg',
"medical" = 'sound/vox_fem/medical.ogg',
"member" = 'sound/vox_fem/member.ogg',
"members" = 'sound/vox_fem/members.ogg',
"men" = 'sound/vox_fem/men.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',
"mice" = 'sound/vox_fem/mice.ogg',
"micro" = 'sound/vox_fem/micro.ogg',
"middle" = 'sound/vox_fem/middle.ogg',
"might" = 'sound/vox_fem/might.ogg',
"mike" = 'sound/vox_fem/mike.ogg',
"miles" = 'sound/vox_fem/miles.ogg',
"military" = 'sound/vox_fem/military.ogg',
@@ -513,15 +722,25 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"money" = 'sound/vox_fem/money.ogg',
"monkey" = 'sound/vox_fem/monkey.ogg',
"monkeys" = 'sound/vox_fem/monkeys.ogg',
"morgue" = 'sound/vox_fem/morgue.ogg',
"motor" = 'sound/vox_fem/motor.ogg',
"motorpool" = 'sound/vox_fem/motorpool.ogg',
"mouse" = 'sound/vox_fem/mouse.ogg',
"move" = 'sound/vox_fem/move.ogg',
"must" = 'sound/vox_fem/must.ogg',
"my" = 'sound/vox_fem/my.ogg',
"n" = 'sound/vox_fem/n.ogg',
"n2o" = 'sound/vox_fem/n2o.ogg',
"nanny" = 'sound/vox_fem/nanny.ogg',
"nanotrasen" = 'sound/vox_fem/nanotrasen.ogg',
"naughty" = 'sound/vox_fem/naughty.ogg',
"near" = 'sound/vox_fem/near.ogg',
"nearest" = 'sound/vox_fem/nearest.ogg',
"nearing" = 'sound/vox_fem/nearing.ogg',
"need" = 'sound/vox_fem/need.ogg',
"needed" = 'sound/vox_fem/needed.ogg',
"needing" = 'sound/vox_fem/needing.ogg',
"needy" = 'sound/vox_fem/needy.ogg',
"negative" = 'sound/vox_fem/negative.ogg',
"nice" = 'sound/vox_fem/nice.ogg',
"nine" = 'sound/vox_fem/nine.ogg',
@@ -533,20 +752,31 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"nominal" = 'sound/vox_fem/nominal.ogg',
"north" = 'sound/vox_fem/north.ogg',
"not" = 'sound/vox_fem/not.ogg',
"notified" = 'sound/vox_fem/notified.ogg',
"notify" = 'sound/vox_fem/notify.ogg',
"november" = 'sound/vox_fem/november.ogg',
"now" = 'sound/vox_fem/now.ogg',
"nuke" = 'sound/vox_fem/nuke.ogg',
"number" = 'sound/vox_fem/number.ogg',
"nurse" = 'sound/vox_fem/nurse.ogg',
"o" = 'sound/vox_fem/o.ogg',
"objective" = 'sound/vox_fem/objective.ogg',
"observation" = 'sound/vox_fem/observation.ogg',
"obtain" = 'sound/vox_fem/obtain.ogg',
"of" = 'sound/vox_fem/of.ogg',
"offer" = 'sound/vox_fem/offer.ogg',
"offered" = 'sound/vox_fem/offered.ogg',
"offering" = 'sound/vox_fem/offering.ogg',
"offers" = 'sound/vox_fem/offers.ogg',
"office" = 'sound/vox_fem/office.ogg',
"officer" = 'sound/vox_fem/officer.ogg',
"officers" = 'sound/vox_fem/officers.ogg',
"offline" = 'sound/vox_fem/offline.ogg',
"ok" = 'sound/vox_fem/ok.ogg',
"okay" = 'sound/vox_fem/okay.ogg',
"on" = 'sound/vox_fem/on.ogg',
"one" = 'sound/vox_fem/one.ogg',
"only" = 'sound/vox_fem/only.ogg',
"op" = 'sound/vox_fem/op.ogg',
"open" = 'sound/vox_fem/open.ogg',
"operating" = 'sound/vox_fem/operating.ogg',
@@ -559,16 +789,26 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"order" = 'sound/vox_fem/order.ogg',
"organic" = 'sound/vox_fem/organic.ogg',
"oscar" = 'sound/vox_fem/oscar.ogg',
"other" = 'sound/vox_fem/other.ogg',
"others" = 'sound/vox_fem/others.ogg',
"ouch" = 'sound/vox_fem/ouch.ogg',
"out" = 'sound/vox_fem/out.ogg',
"outside" = 'sound/vox_fem/outside.ogg',
"over" = 'sound/vox_fem/over.ogg',
"overload" = 'sound/vox_fem/overload.ogg',
"override" = 'sound/vox_fem/override.ogg',
"p" = 'sound/vox_fem/p.ogg',
"pacifist" = 'sound/vox_fem/pacifist.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',
"paramedic" = 'sound/vox_fem/paramedic.ogg',
"pass" = 'sound/vox_fem/pass.ogg',
"passed" = 'sound/vox_fem/passed.ogg',
"passes" = 'sound/vox_fem/passes.ogg',
"passing" = 'sound/vox_fem/passing.ogg',
"passive" = 'sound/vox_fem/passive.ogg',
"percent" = 'sound/vox_fem/percent.ogg',
"perimeter" = 'sound/vox_fem/perimeter.ogg',
"permitted" = 'sound/vox_fem/permitted.ogg',
@@ -576,8 +816,12 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"pipe" = 'sound/vox_fem/pipe.ogg',
"plant" = 'sound/vox_fem/plant.ogg',
"plasma" = 'sound/vox_fem/plasma.ogg',
"plasmaman" = 'sound/vox_fem/plasmaman.ogg',
"plasmamen" = 'sound/vox_fem/plasmamen.ogg',
"plastic" = 'sound/vox_fem/plastic.ogg',
"platform" = 'sound/vox_fem/platform.ogg',
"please" = 'sound/vox_fem/please.ogg',
"pleasure" = 'sound/vox_fem/pleasure.ogg',
"pod" = 'sound/vox_fem/pod.ogg',
"pods" = 'sound/vox_fem/pods.ogg',
"point" = 'sound/vox_fem/point.ogg',
@@ -595,6 +839,9 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"propulsion" = 'sound/vox_fem/propulsion.ogg',
"prosecute" = 'sound/vox_fem/prosecute.ogg',
"protective" = 'sound/vox_fem/protective.ogg',
"pull" = 'sound/vox_fem/pull.ogg',
"pulled" = 'sound/vox_fem/pulled.ogg',
"pulling" = 'sound/vox_fem/pulling.ogg',
"pun" = 'sound/vox_fem/pun.ogg',
"push" = 'sound/vox_fem/push.ogg',
"q" = 'sound/vox_fem/q.ogg',
@@ -606,6 +853,7 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"question" = 'sound/vox_fem/question.ogg',
"questioning" = 'sound/vox_fem/questioning.ogg',
"quick" = 'sound/vox_fem/quick.ogg',
"quickly" = 'sound/vox_fem/quickly.ogg',
"quit" = 'sound/vox_fem/quit.ogg',
"r" = 'sound/vox_fem/r.ogg',
"radiation" = 'sound/vox_fem/radiation.ogg',
@@ -619,10 +867,17 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"reach" = 'sound/vox_fem/reach.ogg',
"reached" = 'sound/vox_fem/reached.ogg',
"reactor" = 'sound/vox_fem/reactor.ogg',
"real" = 'sound/vox_fem/real.ogg',
"reality" = 'sound/vox_fem/reality.ogg',
"reboot" = 'sound/vox_fem/reboot.ogg',
"rebooted" = 'sound/vox_fem/rebooted.ogg',
"rebooting" = 'sound/vox_fem/rebooting.ogg',
"recommend" = 'sound/vox_fem/recommend.ogg',
"red" = 'sound/vox_fem/red.ogg',
"relay" = 'sound/vox_fem/relay.ogg',
"release" = 'sound/vox_fem/release.ogg',
"released" = 'sound/vox_fem/released.ogg',
"releasing" = 'sound/vox_fem/releasing.ogg',
"remaining" = 'sound/vox_fem/remaining.ogg',
"removal" = 'sound/vox_fem/removal.ogg',
"renault" = 'sound/vox_fem/renault.ogg',
@@ -638,7 +893,11 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"resevoir" = 'sound/vox_fem/resevoir.ogg',
"resistance" = 'sound/vox_fem/resistance.ogg',
"respond" = 'sound/vox_fem/respond.ogg',
"responded" = 'sound/vox_fem/responded.ogg',
"response" = 'sound/vox_fem/response.ogg',
"rest" = 'sound/vox_fem/rest.ogg',
"revenant" = 'sound/vox_fem/revenant.ogg',
"revenge" = 'sound/vox_fem/revenge.ogg',
"right" = 'sound/vox_fem/right.ogg',
"roboticist" = 'sound/vox_fem/roboticist.ogg',
"robotics" = 'sound/vox_fem/robotics.ogg',
@@ -651,13 +910,23 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"run" = 'sound/vox_fem/run.ogg',
"runtime" = 'sound/vox_fem/runtime.ogg',
"s" = 'sound/vox_fem/s.ogg',
"sad" = 'sound/vox_fem/sad.ogg',
"saddened" = 'sound/vox_fem/saddened.ogg',
"saddening" = 'sound/vox_fem/saddening.ogg',
"safe" = 'sound/vox_fem/safe.ogg',
"safety" = 'sound/vox_fem/safety.ogg',
"said" = 'sound/vox_fem/said.ogg',
"sarah" = 'sound/vox_fem/sarah.ogg',
"sargeant" = 'sound/vox_fem/sargeant.ogg',
"sat" = 'sound/vox_fem/sat.ogg',
"satellite" = 'sound/vox_fem/satellite.ogg',
"save" = 'sound/vox_fem/save.ogg',
"saved" = 'sound/vox_fem/saved.ogg',
"say" = 'sound/vox_fem/say.ogg',
"saying" = 'sound/vox_fem/saying.ogg',
"science" = 'sound/vox_fem/science.ogg',
"scientist" = 'sound/vox_fem/scientist.ogg',
"scientists" = 'sound/vox_fem/scientists.ogg',
"scream" = 'sound/vox_fem/scream.ogg',
"screen" = 'sound/vox_fem/screen.ogg',
"scrubbers" = 'sound/vox_fem/scrubbers.ogg',
@@ -671,16 +940,33 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"security" = 'sound/vox_fem/security.ogg',
"select" = 'sound/vox_fem/select.ogg',
"selected" = 'sound/vox_fem/selected.ogg',
"sell" = 'sound/vox_fem/sell.ogg',
"selling" = 'sound/vox_fem/selling.ogg',
"sense" = 'sound/vox_fem/sense.ogg',
"sensed" = 'sound/vox_fem/sensed.ogg',
"sensing" = 'sound/vox_fem/sensing.ogg',
"sensitive" = 'sound/vox_fem/sensitive.ogg',
"sensitivity" = 'sound/vox_fem/sensitivity.ogg',
"sensors" = 'sound/vox_fem/sensors.ogg',
"sequencer" = 'sound/vox_fem/sequencer.ogg',
"server" = 'sound/vox_fem/server.ogg',
"servers" = 'sound/vox_fem/servers.ogg',
"service" = 'sound/vox_fem/service.ogg',
"serviced" = 'sound/vox_fem/serviced.ogg',
"servicing" = 'sound/vox_fem/servicing.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',
"shadow" = 'sound/vox_fem/shadow.ogg',
"shadowling" = 'sound/vox_fem/shadowling.ogg',
"shadowlings" = 'sound/vox_fem/shadowlings.ogg',
"she" = 'sound/vox_fem/she.ogg',
"shield" = 'sound/vox_fem/shield.ogg',
"shielded" = 'sound/vox_fem/shielded.ogg',
"shielding" = 'sound/vox_fem/shielding.ogg',
"shipment" = 'sound/vox_fem/shipment.ogg',
"shirt" = 'sound/vox_fem/shirt.ogg',
"shirts" = 'sound/vox_fem/shirts.ogg',
@@ -691,7 +977,11 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"shitting" = 'sound/vox_fem/shitting.ogg',
"shock" = 'sound/vox_fem/shock.ogg',
"shoot" = 'sound/vox_fem/shoot.ogg',
"should" = 'sound/vox_fem/should.ogg',
"shower" = 'sound/vox_fem/shower.ogg',
"shrug" = 'sound/vox_fem/shrug.ogg',
"shrugged" = 'sound/vox_fem/shrugged.ogg',
"shrugging" = 'sound/vox_fem/shrugging.ogg',
"shut" = 'sound/vox_fem/shut.ogg',
"shuttle" = 'sound/vox_fem/shuttle.ogg',
"side" = 'sound/vox_fem/side.ogg',
@@ -699,6 +989,8 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"sight" = 'sound/vox_fem/sight.ogg',
"silo" = 'sound/vox_fem/silo.ogg',
"singularity" = 'sound/vox_fem/singularity.ogg',
"sit" = 'sound/vox_fem/sit.ogg',
"sitting" = 'sound/vox_fem/sitting.ogg',
"six" = 'sound/vox_fem/six.ogg',
"sixteen" = 'sound/vox_fem/sixteen.ogg',
"sixty" = 'sound/vox_fem/sixty.ogg',
@@ -709,18 +1001,25 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"slime" = 'sound/vox_fem/slime.ogg',
"slow" = 'sound/vox_fem/slow.ogg',
"smoke" = 'sound/vox_fem/smoke.ogg',
"so" = 'sound/vox_fem/so.ogg',
"solar" = 'sound/vox_fem/solar.ogg',
"solars" = 'sound/vox_fem/solars.ogg',
"sold" = 'sound/vox_fem/sold.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',
"soon" = 'sound/vox_fem/soon.ogg',
"sorry" = 'sound/vox_fem/sorry.ogg',
"south" = 'sound/vox_fem/south.ogg',
"space" = 'sound/vox_fem/space.ogg',
"speak" = 'sound/vox_fem/speak.ogg',
"speaking" = 'sound/vox_fem/speaking.ogg',
"spider" = 'sound/vox_fem/spider.ogg',
"spiders" = 'sound/vox_fem/spiders.ogg',
"spoke" = 'sound/vox_fem/spoke.ogg',
"spoken" = 'sound/vox_fem/spoken.ogg',
"squad" = 'sound/vox_fem/squad.ogg',
"square" = 'sound/vox_fem/square.ogg',
"ss13" = 'sound/vox_fem/ss13.ogg',
@@ -728,22 +1027,33 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"starboard" = 'sound/vox_fem/starboard.ogg',
"station" = 'sound/vox_fem/station.ogg',
"stations" = 'sound/vox_fem/stations.ogg',
"statue" = 'sound/vox_fem/statue.ogg',
"status" = 'sound/vox_fem/status.ogg',
"sterile" = 'sound/vox_fem/sterile.ogg',
"sterilization" = 'sound/vox_fem/sterilization.ogg',
"still" = 'sound/vox_fem/still.ogg',
"storage" = 'sound/vox_fem/storage.ogg',
"strong" = 'sound/vox_fem/strong.ogg',
"stuck" = 'sound/vox_fem/stuck.ogg',
"stuff" = 'sound/vox_fem/stuff.ogg',
"stuffed" = 'sound/vox_fem/stuffed.ogg',
"stuffing" = 'sound/vox_fem/stuffing.ogg',
"stupid" = 'sound/vox_fem/stupid.ogg',
"sub" = 'sound/vox_fem/sub.ogg',
"subject" = 'sound/vox_fem/subject.ogg',
"subjected" = 'sound/vox_fem/subjected.ogg',
"subjecting" = 'sound/vox_fem/subjecting.ogg',
"subsurface" = 'sound/vox_fem/subsurface.ogg',
"sudden" = 'sound/vox_fem/sudden.ogg',
"suffer" = 'sound/vox_fem/suffer.ogg',
"suffering" = 'sound/vox_fem/suffering.ogg',
"suit" = 'sound/vox_fem/suit.ogg',
"suited" = 'sound/vox_fem/suited.ogg',
"suiting" = 'sound/vox_fem/suiting.ogg',
"superconducting" = 'sound/vox_fem/superconducting.ogg',
"supercooled" = 'sound/vox_fem/supercooled.ogg',
"supply" = 'sound/vox_fem/supply.ogg',
"sure" = 'sound/vox_fem/sure.ogg',
"surface" = 'sound/vox_fem/surface.ogg',
"surrender" = 'sound/vox_fem/surrender.ogg',
"surround" = 'sound/vox_fem/surround.ogg',
@@ -759,17 +1069,26 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"tactical" = 'sound/vox_fem/tactical.ogg',
"tajaran" = 'sound/vox_fem/tajaran.ogg',
"take" = 'sound/vox_fem/take.ogg',
"taken" = 'sound/vox_fem/taken.ogg',
"talk" = 'sound/vox_fem/talk.ogg',
"tango" = 'sound/vox_fem/tango.ogg',
"tank" = 'sound/vox_fem/tank.ogg',
"target" = 'sound/vox_fem/target.ogg',
"taze" = 'sound/vox_fem/taze.ogg',
"tazed" = 'sound/vox_fem/tazed.ogg',
"tazer" = 'sound/vox_fem/tazer.ogg',
"tazing" = 'sound/vox_fem/tazing.ogg',
"team" = 'sound/vox_fem/team.ogg',
"tech" = 'sound/vox_fem/tech.ogg',
"technician" = 'sound/vox_fem/technician.ogg',
"technicians" = 'sound/vox_fem/technicians.ogg',
"technology" = 'sound/vox_fem/technology.ogg',
"telecomms" = 'sound/vox_fem/telecomms.ogg',
"teleport" = 'sound/vox_fem/teleport.ogg',
"teleported" = 'sound/vox_fem/teleported.ogg',
"teleporter" = 'sound/vox_fem/teleporter.ogg',
"teleporting" = 'sound/vox_fem/teleporting.ogg',
"tell" = 'sound/vox_fem/tell.ogg',
"temperature" = 'sound/vox_fem/temperature.ogg',
"temporal" = 'sound/vox_fem/temporal.ogg',
"ten" = 'sound/vox_fem/ten.ogg',
@@ -778,15 +1097,23 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"termination" = 'sound/vox_fem/termination.ogg',
"tesla" = 'sound/vox_fem/tesla.ogg',
"test" = 'sound/vox_fem/test.ogg',
"thank" = 'sound/vox_fem/thank.ogg',
"thanked" = 'sound/vox_fem/thanked.ogg',
"thanks" = 'sound/vox_fem/thanks.ogg',
"that" = 'sound/vox_fem/that.ogg',
"the" = 'sound/vox_fem/the.ogg',
"them" = 'sound/vox_fem/them.ogg',
"then" = 'sound/vox_fem/then.ogg',
"there" = 'sound/vox_fem/there.ogg',
"they" = 'sound/vox_fem/they.ogg',
"think" = 'sound/vox_fem/think.ogg',
"thinking" = 'sound/vox_fem/thinking.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',
"thought" = 'sound/vox_fem/thought.ogg',
"thousand" = 'sound/vox_fem/thousand.ogg',
"threat" = 'sound/vox_fem/threat.ogg',
"three" = 'sound/vox_fem/three.ogg',
@@ -794,9 +1121,11 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"tide" = 'sound/vox_fem/tide.ogg',
"time" = 'sound/vox_fem/time.ogg',
"to" = 'sound/vox_fem/to.ogg',
"took" = 'sound/vox_fem/took.ogg',
"tool" = 'sound/vox_fem/tool.ogg',
"top" = 'sound/vox_fem/top.ogg',
"topside" = 'sound/vox_fem/topside.ogg',
"tosser" = 'sound/vox_fem/tosser.ogg',
"touch" = 'sound/vox_fem/touch.ogg',
"towards" = 'sound/vox_fem/towards.ogg',
"toxins" = 'sound/vox_fem/toxins.ogg',
@@ -817,8 +1146,16 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"unathi" = 'sound/vox_fem/unathi.ogg',
"unauthorized" = 'sound/vox_fem/unauthorized.ogg',
"under" = 'sound/vox_fem/under.ogg',
"unidentified" = 'sound/vox_fem/unidentified.ogg',
"uniform" = 'sound/vox_fem/uniform.ogg',
"unit" = 'sound/vox_fem/unit.ogg',
"unite" = 'sound/vox_fem/unite.ogg',
"united" = 'sound/vox_fem/united.ogg',
"uniting" = 'sound/vox_fem/uniting.ogg',
"unknown" = 'sound/vox_fem/unknown.ogg',
"unknowns" = 'sound/vox_fem/unknowns.ogg',
"unlocked" = 'sound/vox_fem/unlocked.ogg',
"unsure" = 'sound/vox_fem/unsure.ogg',
"until" = 'sound/vox_fem/until.ogg',
"up" = 'sound/vox_fem/up.ogg',
"update" = 'sound/vox_fem/update.ogg',
@@ -841,34 +1178,54 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"vapor" = 'sound/vox_fem/vapor.ogg',
"vault" = 'sound/vox_fem/vault.ogg',
"vent" = 'sound/vox_fem/vent.ogg',
"vented" = 'sound/vox_fem/vented.ogg',
"ventilation" = 'sound/vox_fem/ventilation.ogg',
"venting" = 'sound/vox_fem/venting.ogg',
"vents" = 'sound/vox_fem/vents.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',
"viruses" = 'sound/vox_fem/viruses.ogg',
"voltage" = 'sound/vox_fem/voltage.ogg',
"vox" = 'sound/vox_fem/vox.ogg',
"vox_login" = 'sound/vox_fem/vox_login.ogg',
"voxy" = 'sound/vox_fem/voxy.ogg',
"vulpkanin" = 'sound/vox_fem/vulpkanin.ogg',
"w" = 'sound/vox_fem/w.ogg',
"wait" = 'sound/vox_fem/wait.ogg',
"waited" = 'sound/vox_fem/waited.ogg',
"waiter" = 'sound/vox_fem/waiter.ogg',
"waiting" = 'sound/vox_fem/waiting.ogg',
"walk" = 'sound/vox_fem/walk.ogg',
"wall" = 'sound/vox_fem/wall.ogg',
"wanker" = 'sound/vox_fem/wanker.ogg',
"wankers" = 'sound/vox_fem/wankers.ogg',
"want" = 'sound/vox_fem/want.ogg',
"wanted" = 'sound/vox_fem/wanted.ogg',
"wanting" = 'sound/vox_fem/wanting.ogg',
"wants" = 'sound/vox_fem/wants.ogg',
"warm" = 'sound/vox_fem/warm.ogg',
"warn" = 'sound/vox_fem/warn.ogg',
"warning" = 'sound/vox_fem/warning.ogg',
"was" = 'sound/vox_fem/was.ogg',
"waste" = 'sound/vox_fem/waste.ogg',
"water" = 'sound/vox_fem/water.ogg',
"way" = 'sound/vox_fem/way.ogg',
"we" = 'sound/vox_fem/we.ogg',
"weapon" = 'sound/vox_fem/weapon.ogg',
"wear" = 'sound/vox_fem/wear.ogg',
"weed" = 'sound/vox_fem/weed.ogg',
"welcome" = 'sound/vox_fem/welcome.ogg',
"weld" = 'sound/vox_fem/weld.ogg',
"welded" = 'sound/vox_fem/welded.ogg',
"welder" = 'sound/vox_fem/welder.ogg',
"welding" = 'sound/vox_fem/welding.ogg',
"west" = 'sound/vox_fem/west.ogg',
"what" = 'sound/vox_fem/what.ogg',
"where" = 'sound/vox_fem/where.ogg',
"whiskey" = 'sound/vox_fem/whiskey.ogg',
"white" = 'sound/vox_fem/white.ogg',
"wiggle" = 'sound/vox_fem/wiggle.ogg',
@@ -876,6 +1233,9 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"will" = 'sound/vox_fem/will.ogg',
"window" = 'sound/vox_fem/window.ogg',
"windows" = 'sound/vox_fem/windows.ogg',
"wish" = 'sound/vox_fem/wish.ogg',
"wished" = 'sound/vox_fem/wished.ogg',
"wishing" = 'sound/vox_fem/wishing.ogg',
"with" = 'sound/vox_fem/with.ogg',
"without" = 'sound/vox_fem/without.ogg',
"wizard" = 'sound/vox_fem/wizard.ogg',
@@ -883,6 +1243,11 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"wood" = 'sound/vox_fem/wood.ogg',
"woody" = 'sound/vox_fem/woody.ogg',
"woop" = 'sound/vox_fem/woop.ogg',
"work" = 'sound/vox_fem/work.ogg',
"worked" = 'sound/vox_fem/worked.ogg',
"working" = 'sound/vox_fem/working.ogg',
"works" = 'sound/vox_fem/works.ogg',
"wow" = 'sound/vox_fem/wow.ogg',
"x" = 'sound/vox_fem/x.ogg',
"xeno" = 'sound/vox_fem/xeno.ogg',
"xenobiology" = 'sound/vox_fem/xenobiology.ogg',
@@ -901,5 +1266,5 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"z" = 'sound/vox_fem/z.ogg',
"zero" = 'sound/vox_fem/zero.ogg',
"zone" = 'sound/vox_fem/zone.ogg',
"zulu" = 'sound/vox_fem/zulu.ogg',
"zulu" = 'sound/vox_fem/zulu.ogg'
)
+15 -2
View File
@@ -150,9 +150,11 @@
//Hook for running code when a dir change occurs
/atom/proc/setDir(newdir)
SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir)
dir = newdir
/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
if(does_attack_animation)
user.changeNext_move(CLICK_CD_MELEE)
add_attack_logs(user, src, "Punched with hulk powers")
@@ -305,8 +307,8 @@
/atom/proc/ex_act()
return
/atom/proc/blob_act()
return
/atom/proc/blob_act(obj/structure/blob/B)
SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
/atom/proc/fire_act()
return
@@ -734,3 +736,14 @@ var/list/blood_splatter_icons = list()
if(!L)
return null
return L.AllowDrop() ? L : get_turf(L)
/atom/Entered(atom/movable/AM, atom/oldLoc)
SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc)
/atom/Exit(atom/movable/AM, atom/newLoc)
. = ..()
if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, newLoc) & COMPONENT_ATOM_BLOCK_EXIT)
return FALSE
/atom/Exited(atom/movable/AM, atom/newLoc)
SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc)
+3 -1
View File
@@ -126,10 +126,11 @@
// Previously known as HasEntered()
// This is automatically called when something enters your square
/atom/movable/Crossed(atom/movable/AM)
return
SEND_SIGNAL(src, COMSIG_MOVABLE_CROSSED, AM)
/atom/movable/Bump(atom/A, yes) //the "yes" arg is to differentiate our Bump proc from byond's, without it every Bump() call would become a double Bump().
if(A && yes)
SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A)
if(throwing)
throwing.hit_atom(A)
. = 1
@@ -213,6 +214,7 @@
//called when src is thrown into hit_atom
/atom/movable/proc/throw_impact(atom/hit_atom, throwingdatum)
set waitfor = 0
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum)
if(!QDELETED(hit_atom))
return hit_atom.hitby(src)
+3 -3
View File
@@ -19,7 +19,7 @@
src.update_icon()
..(loc)
for(var/atom/A in loc)
A.blob_act()
A.blob_act(src)
return
@@ -126,7 +126,7 @@
qdel(B)
for(var/atom/A in T)//Hit everything in the turf
A.blob_act()
A.blob_act(src)
return 1
/obj/structure/blob/ex_act(severity)
@@ -141,7 +141,7 @@
/obj/structure/blob/Crossed(var/mob/living/L)
..()
L.blob_act()
L.blob_act(src)
/obj/structure/blob/tesla_act(power)
..()
-1
View File
@@ -85,7 +85,6 @@
)
cybernetic_implants = list(
/obj/item/organ/internal/cyberimp/eyes/xray,
/obj/item/organ/internal/cyberimp/brain/anti_drop,
/obj/item/organ/internal/cyberimp/brain/anti_stun,
/obj/item/organ/internal/cyberimp/chest/nutriment/plus,
/obj/item/organ/internal/cyberimp/arm/combat/centcom
+9 -9
View File
@@ -57,14 +57,14 @@
output &= ~bitflag_value
else//can't not be off
output |= bitflag_value
return MT_UPDATE
return TRUE
if("toggle_bolts" in href_list)
bolts = !bolts
if(bolts)
visible_message("You hear a quite click as the [src] bolts to the floor", "You hear a quite click")
else
visible_message("You hear a quite click as the [src]'s floor bolts raise", "You hear a quite click")
return MT_UPDATE
return TRUE
/obj/machinery/air_sensor/attackby(var/obj/item/W as obj, var/mob/user as mob)
if(istype(W, /obj/item/multitool))
@@ -301,19 +301,19 @@
sensor_list|=G.id_tag
if(!sensor_list.len)
to_chat(user, "<span class=\"warning\">No sensors on this frequency.</span>")
return MT_ERROR
return FALSE
// Have the user pick one of them and name its label
var/sensor = input(user, "Select a sensor:", "Sensor Data") as null|anything in sensor_list
if(!sensor)
return MT_ERROR
return FALSE
var/label = reject_bad_name( input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1)
if(!label)
return MT_ERROR
return FALSE
// Add the sensor's information to general_air_controler
sensors[sensor] = label
return MT_UPDATE
return TRUE
if("edit_sensor" in href_list)
var/list/sensor_list = list()
@@ -322,14 +322,14 @@
sensor_list|=G.id_tag
if(!sensor_list.len)
to_chat(user, "<span class=\"warning\">No sensors on this frequency.</span>")
return MT_ERROR
return FALSE
var/label = sensors[href_list["edit_sensor"]]
var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list
if(!sensor)
return MT_ERROR
return FALSE
sensors.Remove(href_list["edit_sensor"])
sensors[sensor] = label
return MT_UPDATE
return TRUE
/obj/machinery/computer/general_air_control/unlinkFrom(mob/user, obj/O)
..()
+3 -3
View File
@@ -4,17 +4,17 @@
icon = 'icons/obj/meter.dmi'
icon_state = "meterX"
var/obj/machinery/atmospherics/pipe/target = null
anchored = 1
anchored = TRUE
armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100)
power_channel = ENVIRON
var/frequency = 0
var/frequency = ATMOS_DISTRO_FREQ
var/id
var/id_tag
use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 5
req_one_access_txt = "24;10"
Mtoollink = 1
Mtoollink = TRUE
settagwhitelist = list("id_tag")
/obj/machinery/meter/New()
+23 -32
View File
@@ -222,11 +222,11 @@ Class Procs:
var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID tag for this machine", src, src:id_tag) as null|text),1,MAX_MESSAGE_LEN)
if(newid)
src:id_tag = newid
return MT_UPDATE|MT_REINIT
return TRUE
if("set_freq" in href_list)
if(!("frequency" in vars))
warning("set_freq: [type] has no frequency var.")
return 0
return FALSE
var/newfreq=src:frequency
if(href_list["set_freq"]!="-1")
newfreq=text2num(href_list["set_freq"])
@@ -235,90 +235,81 @@ Class Procs:
if(newfreq)
if(findtext(num2text(newfreq), "."))
newfreq *= 10 // shift the decimal one place
if(newfreq < 10000)
src:frequency = newfreq
return MT_UPDATE|MT_REINIT
return 0
src:frequency = sanitize_frequency(newfreq, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
return TRUE
return FALSE
/obj/machinery/proc/handle_multitool_topic(var/href, var/list/href_list, var/mob/user)
if(!allowed(user))//no, not even HREF exploits
return 0
return FALSE
var/obj/item/multitool/P = get_multitool(usr)
if(P && istype(P))
var/update_mt_menu=0
var/re_init=0
var/update_mt_menu = FALSE
if("set_tag" in href_list)
if(!(href_list["set_tag"] in settagwhitelist))//I see you're trying Href exploits, I see you're failing, I SEE ADMIN WARNING. (seriously though, this is a powerfull HREF, I originally found this loophole, I'm not leaving it in on my PR)
message_admins("set_tag HREF (var attempted to edit: [href_list["set_tag"]]) exploit attempted by [key_name_admin(user)] on [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
return 1
return FALSE
if(!(href_list["set_tag"] in vars))
to_chat(usr, "<span class='warning'>Something went wrong: Unable to find [href_list["set_tag"]] in vars!</span>")
return 1
return FALSE
var/current_tag = vars[href_list["set_tag"]]
var/newid = copytext(reject_bad_text(input(usr, "Specify the new value", src, current_tag) as null|text),1,MAX_MESSAGE_LEN)
if(newid)
vars[href_list["set_tag"]] = newid
re_init=1
update_mt_menu = TRUE
if("unlink" in href_list)
var/idx = text2num(href_list["unlink"])
if(!idx)
return 1
return FALSE
var/obj/O = getLink(idx)
if(!O)
return 1
return FALSE
if(!canLink(O))
to_chat(usr, "<span class='warning'>You can't link with that device.</span>")
return 1
return FALSE
if(unlinkFrom(usr, O))
to_chat(usr, "<span class='notice'>A green light flashes on \the [P], confirming the link was removed.</span>")
else
to_chat(usr, "<span class='warning'>A red light flashes on \the [P]. It appears something went wrong when unlinking the two devices.</span>")
update_mt_menu=1
update_mt_menu = TRUE
if("link" in href_list)
var/obj/O = P.buffer
if(!O)
return 1
return FALSE
if(!canLink(O,href_list))
to_chat(usr, "<span class='warning'>You can't link with that device.</span>")
return 1
return FALSE
if(isLinkedWith(O))
to_chat(usr, "<span class='warning'>A red light flashes on \the [P]. The two devices are already linked.</span>")
return 1
return FALSE
if(linkWith(usr, O, href_list))
to_chat(usr, "<span class='notice'>A green light flashes on \the [P], confirming the link was added.</span>")
else
to_chat(usr, "<span class='warning'>A red light flashes on \the [P]. It appears something went wrong when linking the two devices.</span>")
update_mt_menu=1
update_mt_menu = TRUE
if("buffer" in href_list)
P.buffer = src
to_chat(usr, "<span class='notice'>A green light flashes, and the device appears in the multitool buffer.</span>")
update_mt_menu=1
update_mt_menu = TRUE
if("flush" in href_list)
to_chat(usr, "<span class='notice'>A green light flashes, and the device disappears from the multitool buffer.</span>")
P.buffer = null
update_mt_menu=1
update_mt_menu = TRUE
var/ret = multitool_topic(usr,href_list,P.buffer)
if(ret == MT_ERROR)
return 1
if(ret & MT_UPDATE)
update_mt_menu=1
if(ret & MT_REINIT)
re_init=1
if(ret)
update_mt_menu = TRUE
if(re_init)
Initialize()
if(update_mt_menu)
//usr.set_machine(src)
update_multitool_menu(usr)
return 1
return TRUE
/obj/machinery/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = default_state)
if(..(href, href_list, nowindow, state))
+182 -6
View File
@@ -1,3 +1,7 @@
#define JOB_STYLE_1 "Name (Job)"
#define JOB_STYLE_2 "Name - Job"
#define JOB_STYLE_3 "\[Job\] Name"
#define JOB_STYLE_4 "(Job) Name"
GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
// Custom Implementations for NTTC
/* NTTC Configuration Datum
@@ -5,16 +9,125 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
* as well as allowing users to save and load configurations.
*/
/datum/nttc_configuration
// ALL OF THE JOB CRAP
// Dict of all jobs and their colors
var/all_jobs = list(
// AI
"AI" = "#FF00FF",
"Android" = "#FF00FF",
"Cyborg" = "#FF00FF",
"Personal AI" = "#FF00FF",
"Robot" = "#FF00FF",
// Civilian + Varients
"Assistant" = "#408010",
"Businessman" = "#408010",
"Civilian" = "#408010",
"Tourist" = "#408010",
"Trader" = "#408010",
// Command (Solo command, not department heads)
"Blueshield" = "#204090",
"Captain" = "#204090",
"Head of Personnel" = "#204090",
"Nanotrasen Representative" = "#204090",
// Engineeering
"Atmospheric Technician" = "#A66300",
"Chief Engineer" = "#A66300",
"Electrician" = "#A66300",
"Engine Technician" = "#A66300",
"Life Support Specialist" = "#A66300",
"Maintenance Technician" = "#A66300",
"Mechanic" = "#A66300",
"Station Engineer" = "#A66300",
// ERT
"Emergency Response Team Engineer" = "#5C5C7C",
"Emergency Response Team Leader" = "#5C5C7C",
"Emergency Response Team Medic" = "#5C5C7C",
"Emergency Response Team Member" = "#5C5C7C",
"Emergency Response Team Officer" = "#5C5C7C",
// Medical
"Chemist" = "#009190",
"Chief Medical Officer" = "#009190",
"Coroner" = "#009190",
"Medical Doctor" = "#009190",
"Microbiologist" = "#009190",
"Nurse" = "#009190",
"Paramedic" = "#009190",
"Pharmacologist" = "#009190",
"Pharmacist" = "#009190",
"Psychiatrist" = "#009190",
"Psychologist" = "#009190",
"Surgeon" = "#009190",
"Therapist" = "#009190",
"Virologist" = "#009190",
// Science
"Anomalist" = "#993399",
"Biomechanical Engineer" = "#993399",
"Chemical Researcher" = "#993399",
"Geneticist" = "#993399",
"Mechatronic Engineer" = "#993399",
"Plasma Researcher" = "#993399",
"Research Director" = "#993399",
"Roboticist" = "#993399",
"Scientist" = "#993399",
"Xenoarcheologist" = "#993399",
"Xenobiologist" = "#993399",
// Security
"Brig Physician" = "#A30000",
"Detective" = "#A30000",
"Forensic Technician" = "#A30000",
"Head of Security" = "#A30000",
"Human Resources Agent" = "#A30000",
"Internal Affairs Agent" = "#A30000",
"Magistrate" = "#A30000",
"Security Officer" = "#A30000",
"Security Pod Pilot" = "#A30000",
"Warden" = "#A30000",
// Supply
"Quartermaster" = "#7F6539",
"Cargo Technician" = "#7F6539",
"Shaft Miner" = "#7F6539",
"Spelunker" = "#7F6539",
// Service
"Barber" = "#80A000",
"Bartender" = "#80A000",
"Beautician" = "#80A000",
"Botanical Researcher" = "#80A000",
"Botanist" = "#80A000",
"Butcher" = "#80A000",
"Chaplain" = "#80A000",
"Chef" = "#80A000",
"Clown" = "#80A000",
"Cook" = "#80A000",
"Culinary Artist" = "#80A000",
"Custodial Technician" = "#80A000",
"Hair Stylist" = "#80A000",
"Hydroponicist" = "#80A000",
"Janitor" = "#80A000",
"Journalist" = "#80A000",
"Librarian" = "#80A000",
"Mime" = "#80A000",
)
// Just command members
var/heads = list("Captain", "Head of Personnel", "Nanotrasen Representative", "Blueshield", "Chief Engineer", "Chief Medical Officer", "Research Director", "Head of Security")
// Just ERT
var/ert_jobs = list("Emergency Response Team Officer", "Emergency Response Team Engineer", "Emergency Response Team Medic", "Emergency Response Team Leader", "Emergency Response Team Member")
// Defined so code compiles and incase someone has a non-standard job
var/job_color = "#000000"
// NOW FOR ACTUAL TOGGLES
/* Simple Toggles */
var/toggle_activated = TRUE
var/toggle_jobs = FALSE
var/toggle_job_color = FALSE
var/toggle_name_color = FALSE
var/toggle_timecode = FALSE
var/toggle_command_bold = FALSE
// Hack section
var/toggle_gibberish = FALSE
var/toggle_honk = FALSE
/* Strings */
var/setting_language = null
var/job_indicator_type = null
/* Tables */
var/list/regex = list()
@@ -38,7 +151,11 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
var/list/to_serialize = list(
"toggle_activated",
"toggle_jobs",
"toggle_job_color",
"toggle_name_color",
"job_indicator_type",
"toggle_timecode",
"toggle_command_bold",
"toggle_gibberish",
"toggle_honk",
"setting_language",
@@ -50,7 +167,11 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
var/list/serialize_sanitize = list(
"toggle_activated" = "bool",
"toggle_jobs" = "bool",
"toggle_job_color" = "bool",
"toggle_name_color" = "bool",
"job_indicator_type" = "string",
"toggle_timecode" = "bool",
"toggle_command_bold" = "bool",
"toggle_gibberish" = "bool",
"toggle_honk" = "bool",
"setting_language" = "string",
@@ -58,6 +179,10 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
"firewall" = "array"
)
// These are the job card styles
var/list/job_card_styles = list(
JOB_STYLE_1, JOB_STYLE_2, JOB_STYLE_3, JOB_STYLE_4
)
// Used to determine what languages are allowable for conversion. Generated during runtime.
var/list/valid_languages = list("--DISABLE--")
@@ -65,13 +190,17 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
/* Simple Toggles */
toggle_activated = initial(toggle_activated)
toggle_jobs = initial(toggle_jobs)
toggle_job_color = initial(toggle_job_color)
toggle_name_color = initial(toggle_name_color)
toggle_timecode = initial(toggle_timecode)
toggle_command_bold = initial(toggle_command_bold)
// Hack section
toggle_gibberish = initial(toggle_gibberish)
toggle_honk = initial(toggle_honk)
/* Strings */
setting_language = initial(setting_language)
job_indicator_type = initial(job_indicator_type)
/* Tables */
regex = list()
@@ -142,10 +271,42 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
if(firewall.Find(signal.data["name"]))
signal.data["reject"] = 1
// These two stack properly.
// Simple job indicator switch.
// All job and coloring shit
if(toggle_job_color || toggle_name_color)
var/job = signal.data["job"]
job_color = all_jobs[job]
if(toggle_name_color)
var/new_name = "<font color=\"[job_color]\">" + signal.data["name"] + "</font>"
signal.data["name"] = new_name
signal.data["realname"] = new_name // this is required because the broadcaster uses this directly if the speaker doesn't have a voice changer on
if(toggle_jobs)
var/new_name = signal.data["name"] + " ([signal.data["job"]]) "
var/new_name = ""
var/job = signal.data["job"]
if(job in ert_jobs)
job = "ERT"
if(toggle_job_color)
switch(job_indicator_type)
if(JOB_STYLE_1)
new_name = signal.data["name"] + " <font color=\"[job_color]\">([job])</font> "
if(JOB_STYLE_2)
new_name = signal.data["name"] + " - <font color=\"[job_color]\">[job]</font> "
if(JOB_STYLE_3)
new_name = "<font color=\"[job_color]\"><small>\[[job]\]</small></font> " + signal.data["name"] + " "
if(JOB_STYLE_4)
new_name = "<font color=[job_color]>([job])</font> " + signal.data["name"] + " "
else
switch(job_indicator_type)
if(JOB_STYLE_1)
new_name = signal.data["name"] + " ([job]) "
if(JOB_STYLE_2)
new_name = signal.data["name"] + " - [job] "
if(JOB_STYLE_3)
new_name = "<small>\[[job]\]</small> " + signal.data["name"] + " "
if(JOB_STYLE_4)
new_name = "([job]) " + signal.data["name"] + " "
signal.data["name"] = new_name
signal.data["realname"] = new_name // this is required because the broadcaster uses this directly if the speaker doesn't have a voice changer on
@@ -155,6 +316,12 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
signal.data["name"] = new_name
signal.data["realname"] = new_name // this is required because the broadcaster uses this directly if the speaker doesn't have a voice changer on
// Makes heads of staff bold
if(toggle_command_bold)
var/job = signal.data["job"]
if((job in ert_jobs) || (job in heads))
signal.data["message"] = "<b>" + signal.data["message"] + "</b>"
// Hacks!
// Censor dat shit like nobody's business
if(toggle_gibberish)
@@ -169,7 +336,6 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
new_message += pick("HoNK!", "HONK", "HOOOoONK", "HONKHONK!", "HoNnnkKK!!!", "HOOOOOOOOOOONK!!!!11!", "henk!") + " "
signal.data["message"] = new_message
// Language Conversion
if(setting_language && valid_languages[setting_language])
if(setting_language == "--DISABLE--")
@@ -183,7 +349,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
var/new_message = original
for(var/reg in regex)
var/replacePattern = pencode_to_html(regex[reg])
var/regex/start = regex(reg, "gi")
var/regex/start = regex("[reg]", "gi")
new_message = start.Replace(new_message, replacePattern)
signal.data["message"] = new_message
@@ -202,6 +368,15 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
vars[var_to_toggle] = !vars[var_to_toggle]
log_action(user, "toggled NTTC variable [var_to_toggle] [vars[var_to_toggle] ? "on" : "off"]")
// Job Format
if(href_list["setting_job_card_style"])
var/card_style = input(user, "Pick a job card format.", "Job Card Format") as null|anything in job_card_styles
if(!card_style)
return
job_indicator_type = card_style
to_chat(user, "<span class='notice'>Jobs will now have the style of [card_style].</span>")
log_action(user, "has set NTTC job card format to [card_style]", TRUE)
// Strings
if(href_list["setting_language"])
var/new_language = input(user, "Pick a language to convert messages to.", "Language Conversion") as null|anything in valid_languages
@@ -252,7 +427,7 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
var/list/array = vars[href_list["array"]]
array.Add(new_value)
to_chat(user, "<span class='notice'>Added row [new_value].</span>")
log_action(user, "updated [href_list["array"]] - new value [new_value]")
log_action(user, "updated [href_list["array"]] - new value [new_value]", TRUE)
if(href_list["delete_item"])
if(href_list["array"] && href_list["array"] in arrays)
@@ -316,3 +491,4 @@ GLOBAL_DATUM_INIT(nttc_config, /datum/nttc_configuration, new())
dat += "window.updateConfig = function(config) { window.config = JSON.parse(config); window.reload_tab() };"
dat += "</script>"
return dat
@@ -151,6 +151,7 @@
/obj/item/implanter/storage = 1,
/obj/item/toy/cards/deck/syndicate = 2,
/obj/item/storage/secure/briefcase/syndie = 2,
/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 2,
"" = 70
)
+12
View File
@@ -310,6 +310,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
return ..()
/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
SEND_SIGNAL(src, COMSIG_ITEM_HIT_REACT, args)
if(prob(final_block_chance))
owner.visible_message("<span class='danger'>[owner] blocks [attack_text] with [src]!</span>")
return 1
@@ -324,6 +325,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
A.Remove(user)
if(flags & DROPDEL)
qdel(src)
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
@@ -351,6 +353,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
// for items that can be placed in multiple slots
// note this isn't called during the initial dressing of a player
/obj/item/proc/equipped(var/mob/user, var/slot)
SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot)
for(var/X in actions)
var/datum/action/A = X
if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot.
@@ -498,6 +501,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/throw_impact(atom/A)
if(A && !QDELETED(A))
SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, A)
var/itempush = 1
if(w_class < WEIGHT_CLASS_BULKY)
itempush = 0 // too light to push anything
@@ -548,6 +552,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
return I == src
/obj/item/Crossed(atom/movable/AM)
. = ..()
if(prob(trip_chance) && ishuman(AM))
var/mob/living/carbon/human/H = AM
on_trip(H)
@@ -558,3 +563,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/attack_hulk(mob/living/carbon/human/user)
return FALSE
/obj/item/proc/check_martial_counter(mob/living/carbon/human/target, mob/living/carbon/human/user) //handles block for CQC
if(target.check_block())
target.visible_message("<span class='danger'>[target.name] blocks [src] and twists [user]'s arm behind [user.p_their()] back!</span>",
"<span class='userdanger'>You block the attack!</span>")
user.Stun(2)
return TRUE
@@ -10,6 +10,7 @@
var/translate_binary = FALSE
var/translate_hive = FALSE
var/syndie = FALSE
var/change_voice = FALSE
var/list/channels = list()
@@ -20,7 +21,7 @@
channels = list("Syndicate" = 1)
origin_tech = "syndicate=1;engineering=3;bluespace=2"
syndie = TRUE //Signifies that it de-crypts Syndicate transmissions
var/change_voice = TRUE
change_voice = TRUE
var/fake_name = "Agent ALERT_A_CODER"
var/static/list/fakename_list
+12 -27
View File
@@ -18,35 +18,21 @@
hitsound = null
throwforce = 3
w_class = WEIGHT_CLASS_TINY
var/list/honk_sounds = list('sound/items/bikehorn.ogg' = 1)
throw_speed = 3
throw_range = 15
attack_verb = list("HONKED")
var/spam_flag = 0
var/honk_sound = 'sound/items/bikehorn.ogg'
var/cooldowntime = 20
/obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!spam_flag)
playsound(loc, honk_sound, 50, 1, -1) //plays instead of tap.ogg!
return ..()
/obj/item/bikehorn/attack_self(mob/user)
if(!spam_flag)
spam_flag = 1
playsound(src.loc, honk_sound, 50, 1)
src.add_fingerprint(user)
spawn(cooldowntime)
spam_flag = 0
return
/obj/item/bikehorn/Initialize()
. = ..()
AddComponent(/datum/component/squeak, honk_sounds, 50)
/obj/item/bikehorn/airhorn
name = "air horn"
desc = "Damn son, where'd you find this?"
icon_state = "air_horn"
honk_sound = 'sound/items/AirHorn2.ogg'
cooldowntime = 50
origin_tech = "materials=4;engineering=4"
honk_sounds = list('sound/items/airhorn2.ogg' = 1)
/obj/item/bikehorn/golden
name = "golden bike horn"
@@ -63,11 +49,10 @@
..()
/obj/item/bikehorn/golden/proc/flip_mobs(mob/living/carbon/M, mob/user)
if(!spam_flag)
var/turf/T = get_turf(src)
for(M in ohearers(7, T))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(!H.can_hear())
continue
M.emote("flip")
var/turf/T = get_turf(src)
for(M in ohearers(7, T))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(!H.can_hear())
continue
M.emote("flip")
@@ -158,6 +158,28 @@
/obj/item/storage/firstaid/adv/empty
empty = 1
/obj/item/storage/firstaid/machine
name = "machine repair kit"
desc = "A kit that contains supplies to repair IPCs on the go."
icon_state = "machinefirstaid"
item_state = "firstaid-machine"
med_bot_skin = "machine"
/obj/item/storage/firstaid/machine/New()
..()
if(empty)
return
new /obj/item/weldingtool(src)
new /obj/item/stack/cable_coil(src)
new /obj/item/stack/cable_coil(src)
new /obj/item/stack/cable_coil(src)
new /obj/item/reagent_containers/food/drinks/oilcan/full(src)
new /obj/item/robotanalyzer(src)
/obj/item/storage/firstaid/machine/empty
empty = 1
/obj/item/storage/firstaid/tactical
name = "first-aid kit"
icon_state = "bezerk"
@@ -166,6 +166,8 @@
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(check_martial_counter(L, user))
return
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/Genhit.ogg', 50, 1)
return
+1 -3
View File
@@ -507,10 +507,8 @@
icon = 'icons/obj/watercloset.dmi'
icon_state = "rubberducky"
item_state = "rubberducky"
honk_sounds = list('sound/items/squeaktoy.ogg' = 1)
attack_verb = list("quacked", "squeaked")
honk_sound = 'sound/items/squeaktoy.ogg' //credit to DANMITCH3LL of freesound for this
/obj/structure/sink
name = "sink"
+1
View File
@@ -136,6 +136,7 @@
/turf/Entered(atom/movable/M, atom/OL, ignoreRest = 0)
..()
if(ismob(M))
var/mob/O = M
if(!O.lastarea)
+1
View File
@@ -411,6 +411,7 @@ BLIND // can't see anything
..()
/obj/item/clothing/shoes/proc/step_action(var/mob/living/carbon/human/H) //squeek squeek
SEND_SIGNAL(src, COMSIG_SHOES_STEP_ACTION)
if(shoe_sound)
var/turf/T = get_turf(H)
+42 -28
View File
@@ -69,6 +69,7 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd)
siemens_coefficient = 0
actions_types = list(/datum/action/item_action/toggle_helmet)
hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran")
species_restricted = list("exclude","Diona","Wryn")
@@ -156,6 +157,10 @@
H.unEquip(boots)
boots.forceMove(src)
/obj/item/clothing/suit/space/hardsuit/ui_action_click()
..()
toggle_helmet()
/obj/item/clothing/suit/space/hardsuit/verb/toggle_helmet()
set name = "Toggle Helmet"
set category = "Object"
@@ -222,6 +227,10 @@
user.drop_item()
W.loc = src
src.helmet = W
var/obj/item/clothing/head/helmet/space/hardsuit/syndi/S = W
S.forceMove(src)
helmet = S
S.link_suit()
return
else if(istype(W,/obj/item/clothing/shoes/magboots) && can_modify(user))
@@ -312,6 +321,7 @@
item_color = "syndi"
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
on = 1
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL
visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDETAIL
@@ -319,6 +329,11 @@
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
icon_state = "hardsuit[on]-[item_color]"
/obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/link_suit()
. = ..()
if(istype(loc,/obj/item/clothing/suit/space/hardsuit/syndi))
linkedsuit = loc
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
on = !on
if(on)
@@ -342,12 +357,38 @@
update_icon()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
toggle_hardsuit_mode(user)
user.update_inv_head()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/toggle_hardsuit_mode(mob/user) //Helmet Toggles Suit Mode
if(linkedsuit)
if(on)
linkedsuit.name = initial(linkedsuit.name)
linkedsuit.desc = initial(linkedsuit.desc)
linkedsuit.slowdown = 1
linkedsuit.flags |= STOPSPRESSUREDMAGE | THICKMATERIAL
linkedsuit.flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
linkedsuit.cold_protection |= UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
else
linkedsuit.name += " (combat)"
linkedsuit.desc = linkedsuit.alt_desc
linkedsuit.slowdown = 0
linkedsuit.flags = THICKMATERIAL
linkedsuit.cold_protection &= ~(UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS)
linkedsuit.flags_inv &= ~(HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL)
linkedsuit.update_icon()
user.update_inv_wear_suit()
user.update_inv_w_uniform()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom
name = "eagle helmet"
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
@@ -360,6 +401,7 @@
/obj/item/clothing/suit/space/hardsuit/syndi
name = "blood-red hardsuit"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
alt_desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
@@ -372,34 +414,6 @@
/obj/item/clothing/suit/space/hardsuit/syndi/update_icon()
icon_state = "hardsuit[on]-[item_color]"
/obj/item/clothing/suit/space/hardsuit/syndi/attack_self(mob/user)
on = !on
if(on)
to_chat(user, "<span class='notice'>You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed.</span>")
name = "blood-red hardsuit"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
slowdown = 1
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
else
to_chat(user, "<span class='notice'>You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.</span>")
name = "blood-red hardsuit (combat)"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in combat mode. Property of Gorlex Marauders."
slowdown = 0
flags = THICKMATERIAL
flags_inv = null
cold_protection = null
update_icon()
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
user.update_inv_wear_suit()
user.update_inv_w_uniform()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
//Elite Syndie suit
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit helmet"
+3 -2
View File
@@ -12,11 +12,12 @@
New()
..()
for(var/U in subtypesof(/obj/item/clothing/under/color))
var/blocked = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/rank/centcom) // Stops random coloured jumpsuit and undefined centcomm suit appearing in the list.
for(var/U in subtypesof(/obj/item/clothing/under/color) - blocked)
var/obj/item/clothing/under/V = new U
src.clothing_choices += V
for(var/U in subtypesof(/obj/item/clothing/under/rank))
for(var/U in subtypesof(/obj/item/clothing/under/rank) - blocked)
var/obj/item/clothing/under/V = new U
src.clothing_choices += V
return
+5 -3
View File
@@ -69,15 +69,17 @@
item_state = "clown"
item_color = "clown"
flags_size = ONESIZEFITSALL
var/honk_sound = 'sound/items/bikehorn.ogg'
/obj/item/clothing/under/rank/clown/Initialize()
. = ..()
AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50)
/obj/item/clothing/under/rank/clown/hit_reaction()
playsound(loc, honk_sound, 50, 1, -1)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.mind && H.mind.assigned_role == "Clown")
score_clownabuse++
return 0
return ..()
/obj/item/clothing/under/rank/head_of_personnel
desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
+1 -1
View File
@@ -1490,9 +1490,9 @@
icon = 'icons/obj/custom_items.dmi'
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
honk_sounds = list('sound/items/teri_horn.ogg' = 1)
icon_state = "teri_horn"
item_state = "teri_horn"
honk_sound = 'sound/items/teri_horn.ogg'
/obj/item/clothing/accessory/medal/fluff/elo //V-Force_Bomber: E.L.O.
name = "distinguished medal of loyalty and excellence"
@@ -392,4 +392,7 @@
desc = "Contains oil intended for use on cyborgs, robots, and other synthetics."
icon = 'icons/goonstation/objects/oil.dmi'
icon_state = "oilcan"
volume = 100
volume = 100
/obj/item/reagent_containers/food/drinks/oilcan/full
list_reagents = list("oil" = 100)
+204
View File
@@ -0,0 +1,204 @@
#define SLAM_COMBO "HG"
#define KICK_COMBO "HH"
#define RESTRAIN_COMBO "GG"
#define PRESSURE_COMBO "DG"
#define CONSECUTIVE_COMBO "DDH"
/datum/martial_art/cqc
name = "CQC"
help_verb = /mob/living/carbon/human/proc/CQC_help
block_chance = 75
/datum/martial_art/cqc/can_use(mob/living/carbon/human/H)
if(istype(H.gloves, /obj/item/clothing/gloves/fingerless/rapid))
return FALSE
return ..()
/datum/martial_art/cqc/proc/drop_restraining()
restraining = FALSE
/datum/martial_art/cqc/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
if(findtext(streak, SLAM_COMBO))
streak = ""
Slam(A, D)
return TRUE
if(findtext(streak, KICK_COMBO))
streak = ""
Kick(A, D)
return TRUE
if(findtext(streak, RESTRAIN_COMBO))
streak = ""
Restrain(A, D)
return TRUE
if(findtext(streak, PRESSURE_COMBO))
streak = ""
Pressure(A, D)
return TRUE
if(findtext(streak, CONSECUTIVE_COMBO))
streak = ""
Consecutive(A, D)
return FALSE
/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
if(!D.stat || !D.weakened)
D.visible_message("<span class='warning'>[A] slams [D] into the ground!</span>", \
"<span class='userdanger'>[A] slams you into the ground!</span>")
playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1)
D.apply_damage(10, BRUTE)
D.Weaken(6)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Slam", ATKLOG_ALL)
else //if target can't be slammed, do a regular grab attack then clear the streak
streak = ""
grab_act(A, D)
streak = ""
return TRUE
/datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
if(!D.stat || !D.weakened)
D.visible_message("<span class='warning'>[A] kicks [D] back!</span>", \
"<span class='userdanger'>[A] kicks you back!</span>")
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
var/atom/throw_target = get_edge_target_turf(D, A.dir)
D.throw_at(throw_target, 1, 14, A)
D.apply_damage(10, BRUTE)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Kick", ATKLOG_ALL)
if(D.weakened && !D.stat)
D.visible_message("<span class='warning'>[A] kicks [D]'s head, knocking [D.p_them()] out!</span>", \
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
D.SetSleeping(15)
D.adjustBrainLoss(15, 150)
add_attack_logs(A, D, "Knocked out with martial-art [src] : Kick", ATKLOG_ALL)
else //if target can't be kicked, do a regular harm attack then clear the streak
streak = ""
harm_act(A, D)
streak = ""
return TRUE
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
D.visible_message("<span class='warning'>[A] forces their arm on [D]'s neck!</span>")
D.adjustStaminaLoss(60)
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Pressure", ATKLOG_ALL)
return TRUE
/datum/martial_art/cqc/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(restraining)
return
if(!can_use(A))
return FALSE
if(!D.stat)
D.visible_message("<span class='warning'>[A] locks [D] into a restraining position!</span>", \
"<span class='userdanger'>[A] locks you into a restraining position!</span>")
D.adjustStaminaLoss(20)
D.Stun(5)
restraining = TRUE
addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Restrain", ATKLOG_ALL)
return TRUE
/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
if(!D.stat)
D.visible_message("<span class='warning'>[A] strikes [D]'s abdomen, neck and back consecutively</span>", \
"<span class='userdanger'>[A] strikes your abdomen, neck and back consecutively!</span>")
playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
var/obj/item/I = D.get_active_hand()
if(I && D.drop_item())
A.put_in_hands(I)
D.adjustStaminaLoss(50)
D.apply_damage(25, BRUTE)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Consecutive", ATKLOG_ALL)
else //if target can't be hit, do a regular harm attack then clear the streak
streak = ""
harm_act(A, D)
streak = ""
return TRUE
/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
add_to_streak("G", D)
if(check_streak(A, D))
return TRUE
var/obj/item/grab/G = D.grabbedby(A, 1)
if(G)
G.state = GRAB_AGGRESSIVE //Instant aggressive grab
return TRUE
/datum/martial_art/cqc/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
add_to_streak("H", D)
if(check_streak(A, D))
return TRUE
A.do_attack_animation(D)
var/picked_hit_type = pick("CQC'd", "neck chopped", "gut punched")
var/bonus_damage = 13
if(D.weakened || D.resting || D.lying)
bonus_damage += 5
picked_hit_type = "stomps on"
D.apply_damage(bonus_damage, BRUTE)
if(picked_hit_type == "kicks" || picked_hit_type == "stomps on")
playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
else
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
D.visible_message("<span class='danger'>[A] [picked_hit_type] [D]!</span>", \
"<span class='userdanger'>[A] [picked_hit_type] you!</span>")
add_attack_logs(A, D, "Melee attacked with martial-art [src]", ATKLOG_ALL)
if(A.resting && !D.stat && !D.weakened)
D.visible_message("<span class='warning'>[A] leg sweeps [D]!", \
"<span class='userdanger'>[A] leg sweeps you!</span>")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
D.apply_damage(10, BRUTE)
D.Weaken(3)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Leg sweep", ATKLOG_ALL)
return TRUE
/datum/martial_art/cqc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
add_to_streak("D", D)
if(check_streak(A, D))
return TRUE
if(!restraining)
D.visible_message("<span class='warning'>[A] strikes [D]'s jaw with their hand!</span>", \
"<span class='userdanger'>[A] strikes your jaw, disorienting you!</span>")
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
D.Jitter(2)
D.apply_damage(5, BRUTE)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Disarm", ATKLOG_ALL)
if(restraining)
D.visible_message("<span class='danger'>[A] puts [D] into a chokehold!</span>", \
"<span class='userdanger'>[A] puts you into a chokehold!</span>")
D.SetSleeping(20)
restraining = FALSE
add_attack_logs(A, D, "Knocked out with martial-art [src] : Choke hold", ATKLOG_ALL)
else
restraining = FALSE
return FALSE
return TRUE
/mob/living/carbon/human/proc/CQC_help()
set name = "Remember The Basics"
set desc = "You try to remember some of the basics of CQC."
set category = "CQC"
to_chat(usr, "<b><i>You try to remember some of the basics of CQC.</i></b>")
to_chat(usr, "<span class='notice'>Slam</span>: Harm Grab. Slam opponent into the ground, knocking them down.")
to_chat(usr, "<span class='notice'>CQC Kick</span>: Harm Harm. Knocks opponent away. Knocks out stunned or knocked down opponents.")
to_chat(usr, "<span class='notice'>Restrain</span>: Grab Switch Hand Grab. Locks opponent into a restraining position, stunning them.")
to_chat(usr, "<span class='notice'>Choke Hold</span>: Restrain Disarm. Knocks out an opponent you have restrained.")
to_chat(usr, "<span class='notice'>Pressure</span>: Disarm Grab. Decent stamina damage.")
to_chat(usr, "<span class='notice'>Consecutive CQC</span>: Disarm Disarm Harm. Mainly offensive move, huge damage and decent stamina damage.")
to_chat(usr, "<b><i>In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter melee attacks done to you.</i></b>")
+23
View File
@@ -6,6 +6,8 @@
var/temporary = 0
var/datum/martial_art/base = null // The permanent style
var/deflection_chance = 0 //Chance to deflect projectiles
var/block_chance = 0 //Chance to block melee attacks using items while on throw mode.
var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not
var/help_verb = null
var/no_guns = FALSE //set to TRUE to prevent users of this style from using guns (sleeping carp, highlander). They can still pick them up, but not fire them.
var/no_guns_message = "" //message to tell the style user if they try and use a gun while no_guns = TRUE (DISHONORABRU!)
@@ -22,6 +24,9 @@
/datum/martial_art/proc/help_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
return 0
/datum/martial_art/proc/can_use(mob/living/carbon/human/H)
return TRUE
/datum/martial_art/proc/add_to_streak(var/element,var/mob/living/carbon/human/D)
if(D != current_target)
current_target = D
@@ -184,6 +189,24 @@
new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
/obj/item/CQC_manual
name = "old manual"
desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat."
icon = 'icons/obj/library.dmi'
icon_state = "cqcmanual"
/obj/item/CQC_manual/attack_self(mob/living/carbon/human/user)
if(!istype(user) || !user)
return
to_chat(user, "<span class='boldannounce'>You remember the basics of CQC.</span>")
var/datum/martial_art/cqc/CQC = new(null)
CQC.teach(user)
user.drop_item()
visible_message("<span class='warning'>[src] beeps ominously, and a moment later it bursts up in flames.</span>")
new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
/obj/item/twohanded/bostaff
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
+23
View File
@@ -0,0 +1,23 @@
/mob/dead/forceMove(atom/destination)
// Overriden from code/game/atoms_movable.dm#141 to prevent things like mice squeaking when ghosts walk on them.
// Same as parent, except that it does not include Uncrossed or Crossed calls.
var/turf/old_loc = loc
loc = destination
if(old_loc)
old_loc.Exited(src, destination)
if(destination)
destination.Entered(src)
if(isturf(destination) && opacity)
var/turf/new_loc = destination
new_loc.reconsider_lights()
if(isturf(old_loc) && opacity)
old_loc.reconsider_lights()
for(var/datum/light_source/L in light_sources)
L.source_atom.update_light()
return 1
@@ -156,6 +156,10 @@ emp_act
return 1
return 0
/mob/living/carbon/human/proc/check_block()
if(martial_art && prob(martial_art.block_chance) && martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE))
return TRUE
/mob/living/carbon/human/emp_act(severity)
for(var/obj/O in src)
if(!O) continue
@@ -198,7 +198,7 @@
var/obj/item/organ/internal/ears/ears = H.get_int_organ(/obj/item/organ/internal/ears)
if(ears)
qdel(ears)
ears = new mutantears(H)
/datum/species/proc/breathe(mob/living/carbon/human/H)
@@ -318,6 +318,9 @@
user.do_cpr(target)
/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(target.check_block()) //cqc
target.visible_message("<span class='warning'>[target] blocks [user]'s grab attempt!</span>")
return FALSE
if(attacker_style && attacker_style.grab_act(user, target))
return TRUE
else
@@ -344,6 +347,9 @@
add_attack_logs(user, target, "vampirebit")
return
//end vampire codes
if(target.check_block()) //cqc
target.visible_message("<span class='warning'>[target] blocks [user]'s attack!</span>")
return FALSE
if(attacker_style && attacker_style.harm_act(user, target))
return TRUE
else
@@ -382,6 +388,9 @@
target.forcesay(GLOB.hit_appends)
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(target.check_block()) //cqc
target.visible_message("<span class='warning'>[target] blocks [user]'s disarm attempt!</span>")
return FALSE
if(attacker_style && attacker_style.disarm_act(user, target))
return TRUE
else
@@ -65,6 +65,9 @@
/mob/living/simple_animal/bot/medbot/fish
skin = "fish"
/mob/living/simple_animal/bot/medbot/machine
skin = "machine"
/mob/living/simple_animal/bot/medbot/mysterious
name = "\improper Mysterious Medibot"
desc = "International Medibot of mystery."
@@ -578,6 +581,8 @@
T.syndicate_aligned = syndicate_aligned //This is a special case since Syndicate medibots and the mysterious medibot look the same; we also dont' want crew building Syndicate medibots if the mysterious medibot blows up.
if("fish")
new /obj/item/storage/firstaid/aquatic_kit(Tsec)
if("machine")
new /obj/item/storage/firstaid/machine/empty(Tsec)
else
new /obj/item/storage/firstaid(Tsec)
@@ -33,6 +33,9 @@
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/mouse/Initialize()
. = ..()
/mob/living/simple_animal/mouse/handle_automated_speech()
..()
if(prob(speak_chance))
@@ -81,39 +84,16 @@
get_scooped(M)
..()
//make mice fit under tables etc? this was hacky, and not working
/*
/mob/living/simple_animal/mouse/Move(var/dir)
var/turf/target_turf = get_step(src,dir)
//CanReachThrough(src.loc, target_turf, src)
var/can_fit_under = 0
if(target_turf.ZCanPass(get_turf(src),1))
can_fit_under = 1
..(dir)
if(can_fit_under)
src.loc = target_turf
for(var/d in cardinal)
var/turf/O = get_step(T,d)
//Simple pass check.
if(O.ZCanPass(T, 1) && !(O in open) && !(O in closed) && O in possibles)
open += O
*/
///mob/living/simple_animal/mouse/restrained() //Hotfix to stop mice from doing things with MouseDrop
// return 1
/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things
to_chat(src, "<span class='warning'>You are too small to pull anything.</span>")
return
/mob/living/simple_animal/mouse/Crossed(AM as mob|obj)
if( ishuman(AM) )
if(!stat)
if(ishuman(AM))
if(stat == CONSCIOUS)
var/mob/M = AM
to_chat(M, "<span class='notice'>[bicon(src)] Squeek!</span>")
M << 'sound/effects/mousesqueek.ogg'
SEND_SOUND(M, 'sound/effects/mousesqueek.ogg')
..()
/mob/living/simple_animal/mouse/death(gibbed)
@@ -72,5 +72,6 @@
melee_damage_lower = 10
melee_damage_upper = 30
a_intent = INTENT_HARM
pass_flags = PASSTABLE
universal_speak = 1
universal_understand = 1
@@ -0,0 +1,121 @@
// Hellhound
/mob/living/simple_animal/hostile/hellhound
// Sprites by FoS: http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
name = "Lesser Hellhound"
desc = "A horrifying, black canine monster, with glowing red eyes and vicious-looking teeth."
icon_state = "blackdog"
icon_living = "blackdog"
icon_dead = "blackdog_dead"
icon_resting = "blackdog_rest"
mutations = list(BREATHLESS)
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
melee_damage_lower = 10 // slightly higher than araneus
melee_damage_upper = 30
a_intent = INTENT_HARM
environment_smash = 1
speak_chance = 0
speed = 0
maxHealth = 250 // same as sgt araneus
health = 250
obj_damage = 50
robust_searching = 1
stat_attack = 1
attacktext = "savages"
attack_sound = 'sound/effects/bite.ogg'
speak_emote = list("growls")
see_in_dark = 9
universal_understand = 1
wander = 0
var/life_regen_cycles = 0
var/life_regen_cycle_trigger = 10 // heal once for every X number of cycles spent resting
var/life_regen_amount = -10 // negative, because negative = healing
var/smoke_lastuse = 0
var/smoke_freq = 300 // 30 seconds
var/datum/action/innate/demon/whisper/whisper_action
/mob/living/simple_animal/hostile/hellhound/New()
. = ..()
whisper_action = new()
whisper_action.Grant(src)
/mob/living/simple_animal/hostile/hellhound/handle_automated_action()
. = ..()
if(resting)
if(!wants_to_rest())
custom_emote(1, "growls, and gets up.")
playsound(get_turf(src), 'sound/hallucinations/growl2.ogg', 50, 1)
icon_state = "[icon_living]"
resting = 0
update_canmove()
else if(wants_to_rest())
custom_emote(1, "lays down, and starts to lick their wounds.")
icon_state = "[icon_living]_rest"
resting = 1
update_canmove()
/mob/living/simple_animal/hostile/hellhound/examine(mob/user)
. = ..()
if(stat != DEAD)
var/list/msgs = list()
if(key)
msgs += "<span class='warning'>Its eyes have the spark of intelligence.</span>"
if(health > (maxHealth*0.95))
msgs += "<span class='notice'>It appears to be in excellent health.</span>"
else if(health > (maxHealth*0.75))
msgs += "<span class='notice'>It has a few injuries.</span>"
else if(health > (maxHealth*0.55))
msgs += "<span class='warning'>It has many injuries.</span>"
else if(health > (maxHealth*0.25))
msgs += "<span class='warning'>It is covered in wounds!</span>"
if(resting)
if(bruteloss > 0 || fireloss > 0)
msgs += "<span class='warning'>It is currently licking its wounds, regenerating the damage to its body!</span>"
else
msgs += "<span class='notice'>It is currently resting.</span>"
to_chat(usr,msgs.Join("<BR>"))
/mob/living/simple_animal/hostile/hellhound/Life(seconds, times_fired)
. = ..()
if(stat != DEAD && resting && (bruteloss > 0) || (fireloss > 0))
if(life_regen_cycles >= life_regen_cycle_trigger)
life_regen_cycles = 0
to_chat(src, "<span class='notice'>You lick your wounds, helping them close.</span>")
adjustBruteLoss(life_regen_amount)
adjustFireLoss(life_regen_amount)
else
life_regen_cycles++
/mob/living/simple_animal/hostile/hellhound/proc/wants_to_rest()
if(target)
return FALSE
if(bruteloss > 0 || fireloss > 0)
return TRUE
return FALSE
/mob/living/simple_animal/hostile/hellhound/AttackingTarget()
. = ..()
if(ishuman(target))
special_aoe()
/mob/living/simple_animal/hostile/hellhound/proc/special_aoe()
if(world.time < (smoke_lastuse + smoke_freq))
return
smoke_lastuse = world.time
var/datum/effect_system/smoke_spread/sleeping/smoke = new
smoke.set_up(10, 0, loc)
smoke.start()
/mob/living/simple_animal/hostile/hellhound/greater
name = "Greater Hellhound"
maxHealth = 400
health = 400
melee_damage_lower = 20
melee_damage_upper = 30
environment_smash = 2
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
light_color = "#FF0000"
light_power = 6
light_range = 2
@@ -0,0 +1,19 @@
//Put all your tacticool gun gadgets here. So far it's pretty empty
/obj/item/suppressor
name = "suppressor"
desc = "A universal syndicate small-arms suppressor for maximum espionage."
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "suppressor"
item_state = "suppressor"
w_class = WEIGHT_CLASS_SMALL
var/oldsound = null
var/initial_w_class = null
origin_tech = "combat=2;engineering=2"
/obj/item/suppressor/specialoffer
name = "cheap suppressor"
desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits all weapons."
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "suppressor"
+1 -17
View File
@@ -183,20 +183,4 @@
for(var/obj/item/ammo_casing/AC in magazine.stored_ammo)
if(AC.BB)
process_fire(user, user,0)
. = 1
/obj/item/suppressor
name = "suppressor"
desc = "A universal syndicate small-arms suppressor for maximum espionage."
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "suppressor"
item_state = "suppressor"
w_class = WEIGHT_CLASS_SMALL
var/oldsound = null
var/initial_w_class = null
/obj/item/suppressor/specialoffer
name = "cheap suppressor"
desc = "A foreign knock-off suppressor, it feels flimsy, cheap, and brittle. Still fits all weapons."
icon = 'icons/obj/guns/projectile.dmi'
icon_state = "suppressor"
. = 1
+1 -1
View File
@@ -79,7 +79,7 @@
name = "laser tag beam"
icon_state = "omnilaser"
hitsound = 'sound/weapons/tap.ogg'
damage = 0
nodamage = 1
damage_type = STAMINA
flag = "laser"
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
+1
View File
@@ -538,6 +538,7 @@
// note AM since can contain mobs or objs
for(var/atom/movable/AM in D)
AM.loc = src
SEND_SIGNAL(AM, COMSIG_MOVABLE_DISPOSING, src, D)
if(istype(AM, /mob/living/carbon/human))
var/mob/living/carbon/human/H = AM
if(FAT in H.mutations) // is a human and fat?
@@ -242,6 +242,8 @@
name = "NT specops cybernetics implant"
desc = "An extremely powerful cybernetic implant that contains combat and utility modules used by NT special forces."
contents = newlist(/obj/item/gun/energy/pulse/pistol/m1911, /obj/item/door_remote/omni, /obj/item/melee/energy/blade/hardlight, /obj/item/reagent_containers/hypospray/combat/nanites, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/implanter/mindshield, /obj/item/flash/armimplant)
icon = 'icons/obj/guns/energy.dmi'
icon_state = "m1911"
emp_proof = 1
/obj/item/organ/internal/cyberimp/arm/surgery