diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index ca51fec347..73052acfe1 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -9,6 +9,7 @@
var/chem_catalysts[] = list() //like tools but for reagents
var/category = CAT_NONE //where it shows up in the crafting UI
var/subcategory = CAT_NONE
+ var/always_availible = TRUE //Set to FALSE if it needs to be learned first.
/datum/crafting_recipe/pin_removal
name = "Pin Removal"
@@ -68,7 +69,7 @@
/datum/crafting_recipe/molotov
name = "Molotov"
result = /obj/item/reagent_containers/food/drinks/bottle/molotov
- reqs = list(/obj/item/reagent_containers/glass/rag = 1,
+ reqs = list(/obj/item/reagent_containers/rag = 1,
/obj/item/reagent_containers/food/drinks/bottle = 1)
parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1)
time = 40
@@ -210,6 +211,12 @@
time = 40
category = CAT_ROBOT
+/datum/crafting_recipe/potatos
+ name = "Potat-OS"
+ reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 )
+ result = /obj/item/aicard/potato
+ category = CAT_ROBOT
+
/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
name = "Pneumatic Cannon"
result = /obj/item/pneumatic_cannon/ghetto
@@ -352,6 +359,7 @@
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
/obj/item/shard = 1,
/obj/item/stack/rods = 1)
+ parts = list(/obj/item/shard = 1)
time = 40
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -454,6 +462,12 @@
/obj/item/bikehorn = 1)
category = CAT_MISC
+/datum/crafting_recipe/toyneb
+ name = "Non-Euplastic Blade"
+ reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
+ result = /obj/item/toy/sword/cx
+ category = CAT_MISC
+
/datum/crafting_recipe/chemical_payload
name = "Chemical Payload (C4)"
result = /obj/item/bombcore/chemical
@@ -659,6 +673,15 @@
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
category = CAT_MISC
+/datum/crafting_recipe/femur_breaker
+ name = "Femur Breaker"
+ result = /obj/structure/femur_breaker
+ time = 150
+ reqs = list(/obj/item/stack/sheet/metal = 20,
+ /obj/item/stack/cable_coil = 30)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
+ category = CAT_MISC
+
/datum/crafting_recipe/lizardhat
name = "Lizard Cloche Hat"
result = /obj/item/clothing/head/lizard
@@ -873,3 +896,44 @@
time = 150 //It's a gun
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
+
+/datum/crafting_recipe/durathread_duffelbag
+ name = "Durathread Dufflebag"
+ result = /obj/item/storage/backpack/duffelbag/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 7,
+ /obj/item/stack/sheet/leather = 3)
+ time = 70
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/durathread_toolbelt
+ name = "Durathread Toolbelt"
+ result = /obj/item/storage/belt/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 5,
+ /obj/item/stack/sheet/leather = 1)
+ time = 30
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/durathread_bandolier
+ name = "Durathread Bandolier"
+ result = /obj/item/storage/belt/bandolier/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 6,
+ /obj/item/stack/sheet/leather = 2)
+ time = 50
+ category = CAT_CLOTHING
+
+ /datum/crafting_recipe/durathread_helmet
+ name = "Makeshift Durathread Helmet"
+ result = /obj/item/clothing/head/helmet/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 4,
+ /obj/item/stack/sheet/leather = 2)
+ time = 30
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/durathread_vest
+ name = "Makeshift Durathread Armour"
+ result = /obj/item/clothing/suit/armor/vest/durathread
+ reqs = list(/obj/item/stack/sheet/durathread = 6,
+ /obj/item/stack/sheet/leather = 3)
+ time = 50
+ category = CAT_CLOTHING
+
diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm
deleted file mode 100644
index a25bc01b13..0000000000
--- a/code/modules/detectivework/footprints_and_rag.dm
+++ /dev/null
@@ -1,50 +0,0 @@
-
-/mob
- var/bloody_hands = 0
-
-/obj/item/clothing/gloves
- var/transfer_blood = 0
-
-
-/obj/item/reagent_containers/glass/rag
- name = "damp rag"
- desc = "For cleaning up messes, you suppose."
- w_class = WEIGHT_CLASS_TINY
- icon = 'icons/obj/toy.dmi'
- icon_state = "rag"
- item_flags = NOBLUDGEON
- reagent_flags = OPENCONTAINER
- amount_per_transfer_from_this = 5
- possible_transfer_amounts = list()
- volume = 5
- spillable = FALSE
-
-/obj/item/reagent_containers/glass/rag/suicide_act(mob/user)
- user.visible_message("[user] is smothering [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- return (OXYLOSS)
-
-/obj/item/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity)
- . = ..()
- if(!proximity)
- return
- if(iscarbon(A) && A.reagents && reagents.total_volume)
- var/mob/living/carbon/C = A
- var/reagentlist = pretty_string_from_reagent_list(reagents)
- var/log_object = "a damp rag containing [reagentlist]"
- if(user.a_intent == INTENT_HARM && !C.is_mouth_covered())
- reagents.reaction(C, INGEST)
- reagents.trans_to(C, reagents.total_volume)
- C.visible_message("[user] has smothered \the [C] with \the [src]!", "[user] has smothered you with \the [src]!", "You hear some struggling and muffled cries of surprise.")
- log_combat(user, C, "smothered", log_object)
- else
- reagents.reaction(C, TOUCH)
- reagents.clear_reagents()
- C.visible_message("[user] has touched \the [C] with \the [src].")
- log_combat(user, C, "touched", log_object)
-
- else if(istype(A) && src in user)
- user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...")
- if(do_after(user,30, target = A))
- user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].")
- SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
- return
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 798bcf82dd..af22ae3b96 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -15,6 +15,12 @@
var/list/wave_type
var/wave_name = "normal"
+/datum/round_event/meteor_wave/setup()
+ announceWhen = 1
+ startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
+ endWhen = startWhen + 60
+
+
/datum/round_event/meteor_wave/New()
..()
if(!wave_type)
@@ -46,7 +52,7 @@
kill()
/datum/round_event/meteor_wave/announce(fake)
- priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg')
+ priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.", "Meteor Alert", 'sound/ai/meteors.ogg')
/datum/round_event/meteor_wave/tick()
if(ISMULTIPLE(activeFor, 3))
diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm
index ec253f13c3..7e37429223 100644
--- a/code/modules/events/wizard/shuffle.dm
+++ b/code/modules/events/wizard/shuffle.dm
@@ -27,7 +27,7 @@
for(var/mob/living/carbon/human/H in mobs)
if(!moblocs)
break //locs aren't always unique, so this may come into play
- do_teleport(H, moblocs[moblocs.len])
+ do_teleport(H, moblocs[moblocs.len], channel = TELEPORT_CHANNEL_MAGIC)
moblocs.len -= 1
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm
index 412e54878a..bb601b7c82 100644
--- a/code/modules/events/wormholes.dm
+++ b/code/modules/events/wormholes.dm
@@ -63,4 +63,4 @@
hard_target = P.loc
if(!hard_target)
return
- do_teleport(M, hard_target, 1, 1, 0, 0) ///You will appear adjacent to the beacon
+ do_teleport(M, hard_target, 1, 1, 0, 0, channel = TELEPORT_CHANNEL_WORMHOLE) ///You will appear adjacent to the beacon
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index f85668d2b8..e72b624ae5 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -7,11 +7,12 @@
/obj/item/reagent_containers/food/drinks/bottle
amount_per_transfer_from_this = 10
volume = 100
+ force = 15
throwforce = 15
item_state = "broken_beer" //Generic held-item sprite until unique ones are made.
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
- var/const/duration = 13 //Directly relates to the 'knockdown' duration. Lowered by armor (i.e. helmets)
+ var/knockdown_duration = 13 //Directly relates to the 'knockdown' duration. Lowered by armor (i.e. helmets)
isGlass = TRUE
foodtype = ALCOHOL
@@ -61,46 +62,30 @@
to_chat(user, "You don't want to harm [target]!")
return
- force = 15 //Smashing bottles over someoen's head hurts.
-
var/obj/item/bodypart/affecting = user.zone_selected //Find what the player is aiming at
- var/armor_block = 0 //Get the target's armor values for normal attack damage.
- var/armor_duration = 0 //The more force the bottle has, the longer the duration.
+ var/headarmor = 0 // Target's head armor
+ var/armor_block = min(90, target.run_armor_check(affecting, "melee", null, null,armour_penetration)) // For normal attack damage
- //Calculating duration and calculating damage.
- if(ishuman(target))
+ //If they have a hat/helmet and the user is targeting their head.
+ if(affecting == BODY_ZONE_HEAD)
+ var/obj/item/I = target.get_item_by_slot(SLOT_HEAD)
+ if(I)
+ headarmor = I.armor.melee
- var/mob/living/carbon/human/H = target
- var/headarmor = 0 // Target's head armor
- armor_block = H.run_armor_check(affecting, "melee", null, null,armour_penetration) // For normal attack damage
-
- //If they have a hat/helmet and the user is targeting their head.
- if(istype(H.head, /obj/item/clothing/head) && affecting == BODY_ZONE_HEAD)
- headarmor = H.head.armor.melee
- else
- headarmor = 0
-
- //Calculate the knockdown duration for the target.
- armor_duration = (duration - headarmor) + force
-
- else
- //Only humans can have armor, right?
- armor_block = target.run_armor_check(affecting, "melee")
- if(affecting == BODY_ZONE_HEAD)
- armor_duration = duration + force
+ //Calculate the knockdown duration for the target.
+ var/armor_duration = (knockdown_duration - headarmor) + force
//Apply the damage!
- armor_block = min(90,armor_block)
target.apply_damage(force, BRUTE, affecting, armor_block)
// You are going to knock someone out for longer if they are not wearing a helmet.
var/head_attack_message = ""
- if(affecting == BODY_ZONE_HEAD && istype(target, /mob/living/carbon/))
+ if(affecting == BODY_ZONE_HEAD && iscarbon(target))
head_attack_message = " on the head"
//Knockdown the target for the duration that we calculated and divide it by 5.
if(armor_duration)
- target.apply_effect(min(armor_duration, 200) , EFFECT_KNOCKDOWN) // Never knockdown more than a flash!
+ target.Knockdown(min(armor_duration, 200)) // Never knockdown more than a flash!
//Display an attack message.
if(target != user)
@@ -202,17 +187,18 @@
desc = "A flask of holy water...it's been sitting in the Necropolis a while though."
list_reagents = list("hell_water" = 100)
-/obj/item/reagent_containers/food/drinks/holyoil
+/obj/item/reagent_containers/food/drinks/bottle/holyoil
name = "flask of zelus oil"
- desc = "A brass flask of Zelus oil, a viscous fluid with a scenting of brass - this flask may be sipped or thrown."
+ desc = "A brass flask of Zelus oil, a viscous fluid scenting of brass. Can be thrown to deal damage from afar."
icon_state = "zelusflask"
- list_reagents = list("holyoil" = 30) //Powerfull
+ list_reagents = list("holyoil" = 30)
volume = 30
foodtype = NONE
- force = 12 //Same as a toolbox
+ force = 18
throwforce = 18
+ knockdown_duration = 18
-/obj/item/reagent_containers/food/drinks/holyoil/null
+/obj/item/reagent_containers/food/drinks/bottle/holyoil/empty
list_reagents = list("holyoil" = 0)
/obj/item/reagent_containers/food/drinks/bottle/vermouth
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index 1eeea79410..d66cfdd667 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -17,21 +17,21 @@
foodtype = GRAIN | DAIRY
/obj/item/reagent_containers/food/snacks/store/cake/plain
- name = "vanilla cake"
+ name = "plain cake"
desc = "A plain cake, not a lie."
icon_state = "plaincake"
custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/cake
bonus_reagents = list("nutriment" = 10, "vitamin" = 2)
- tastes = list("vanilla" = 1, "sweetness" = 2,"cake" = 5)
+ tastes = list("sweetness" = 2,"cake" = 5)
foodtype = GRAIN | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/cakeslice/plain
- name = "vanilla cake slice"
+ name = "plain cake slice"
desc = "Just a slice of cake, it is enough for everyone."
icon_state = "plaincake_slice"
filling_color = "#FFD700"
customfoodfilling = 1
- tastes = list("vanilla" = 1, "sweetness" = 2,"cake" = 5)
+ tastes = list("sweetness" = 2,"cake" = 5)
foodtype = GRAIN | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/store/cake/carrot
@@ -147,7 +147,6 @@
tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-
/obj/item/reagent_containers/food/snacks/store/cake/chocolate
name = "chocolate cake"
desc = "A cake with added chocolate."
@@ -186,7 +185,6 @@
tastes = list("cake" = 5, "sweetness" = 1)
foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
-
/obj/item/reagent_containers/food/snacks/store/cake/apple
name = "apple cake"
desc = "A cake centred with Apple."
@@ -248,7 +246,6 @@
/obj/item/reagent_containers/food/snacks/store/cake/bsvc // blackberry strawberries vanilla cake
name = "blackberry and strawberry vanilla cake"
desc = "A plain cake, filled with assortment of blackberries and strawberries!"
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "blackbarry_strawberries_cake_vanilla_cake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bsvc
bonus_reagents = list("nutriment" = 14, "vitamin" = 4)
@@ -258,7 +255,6 @@
/obj/item/reagent_containers/food/snacks/cakeslice/bsvc
name = "blackberry and strawberry vanilla cake slice"
desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "blackbarry_strawberries_cake_vanilla_slice"
filling_color = "#FFD700"
tastes = list("blackbarry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3)
@@ -267,7 +263,6 @@
/obj/item/reagent_containers/food/snacks/store/cake/bscc // blackbarry strawberries chocolate cake
name = "blackberry and strawberry chocolate cake"
desc = "A plain cake, filled with assortment of blackberries and strawberries!"
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "blackbarry_strawberries_cake_coco_cake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bscc
bonus_reagents = list("nutriment" = 14, "vitamin" = 4, "cocoa" = 5)
@@ -277,16 +272,14 @@
/obj/item/reagent_containers/food/snacks/cakeslice/bscc
name = "blackberry and strawberry chocolate cake slice"
desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "blackbarry_strawberries_cake_coco_cake_slice"
filling_color = "#FFD700"
tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
-obj/item/reagent_containers/food/snacks/store/cake/holy_cake
+/obj/item/reagent_containers/food/snacks/store/cake/holy_cake
name = "angel food cake"
desc = "A cake made for angels and chaplains alike! Contains holy water."
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "holy_cake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
bonus_reagents = list("nutriment" = 1, "vitamin" = 3, "holy_water" = 10)
@@ -296,7 +289,6 @@ obj/item/reagent_containers/food/snacks/store/cake/holy_cake
/obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
name = "angel food cake slice"
desc = "A slice of heavenly cake."
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "holy_cake_slice"
filling_color = "#00FFFF"
tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
@@ -305,7 +297,6 @@ obj/item/reagent_containers/food/snacks/store/cake/holy_cake
obj/item/reagent_containers/food/snacks/store/cake/pound_cake
name = "pound cake"
desc = "A condensed cake made for filling people up quickly."
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "pound_cake"
slices_num = 7 //Its ment to feed the party
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
@@ -316,16 +307,14 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
/obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
name = "pound cake slice"
desc = "A slice of condensed cake made for filling people up quickly."
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "pound_cake_slice"
filling_color = "#00FFFF"
tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1)
foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
-obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
+/obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
name = "hardware cake"
desc = "A cake that is made with electronic boards and leaks acid..."
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "hardware_cake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
bonus_reagents = list("sacid" = 15, "oil" = 15)
@@ -335,8 +324,41 @@ obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
/obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
name = "hardware cake slice"
desc = "A slice of electronic boards and some acid."
- icon = 'modular_citadel/icons/obj/food/cake.dmi'
icon_state = "hardware_cake_slice"
filling_color = "#00FFFF"
tastes = list("acid" = 1, "metal" = 1, "regret" = 10)
foodtype = GRAIN | GROSS
+
+/obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
+ name = "vanilla cake"
+ desc = "A vanilla frosted cake."
+ icon_state = "vanillacake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
+ bonus_reagents = list("sugar" = 15, "vanilla" = 15)
+ tastes = list("caje" = 1, "sugar" = 1, "vanilla" = 10)
+ foodtype = GRAIN | SUGAR | DAIRY
+
+/obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
+ name = "vanilla cake slice"
+ desc = "A slice of vanilla frosted cake."
+ icon_state = "vanillacake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
+ foodtype = GRAIN | SUGAR | DAIRY
+
+/obj/item/reagent_containers/food/snacks/store/cake/clown_cake
+ name = "clown cake"
+ desc = "A funny cake with a clown face on it."
+ icon_state = "clowncake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/clown_slice
+ bonus_reagents = list("sugar" = 15, "laugher" = 15)
+ tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
+ foodtype = GRAIN | SUGAR | DAIRY
+
+/obj/item/reagent_containers/food/snacks/cakeslice/clown_slice
+ name = "clown cake slice"
+ desc = "A slice of bad jokes, and silly props."
+ icon_state = "clowncake_slice"
+ filling_color = "#00FFFF"
+ tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
+ foodtype = GRAIN | SUGAR | DAIRY
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm
index febfa527ca..c4f8ccf76b 100644
--- a/code/modules/food_and_drinks/food/snacks_frozen.dm
+++ b/code/modules/food_and_drinks/food/snacks_frozen.dm
@@ -88,7 +88,7 @@
/obj/item/reagent_containers/food/snacks/snowcones/orange
name = "orange flavored snowcone"
- desc = "A mix of different flavors dizzled on a snowball in a paper cup."
+ desc = "A orange flavor dizzled on a snowball in a paper cup."
icon_state = "orange_sc"
list_reagents = list("nutriment" = 1, "orangejuice" = 10)
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
@@ -130,7 +130,7 @@
name = "mixed fruit flavored snowcone"
desc = "A mix of different flavors dizzled on a snowball in a paper cup."
icon_state = "fruitsalad_sc"
- list_reagents = list("nutriment" = 1, "lemonjuice" = 5, "limejuice" = 5, "lemonjuice" = 5, "orangejuice" = 5)
+ list_reagents = list("nutriment" = 1, "limejuice" = 5, "lemonjuice" = 5, "orangejuice" = 5)
tastes = list("ice" = 1, "water" = 1, "fruits" = 25)
foodtype = FRUIT
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index e36efe750b..c4b9451c7f 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -573,4 +573,14 @@
name = "Maintenance Peaches"
desc = "I have a mouth and I must eat."
icon_state = "peachcanmaint"
- tastes = list("peaches" = 1, "tin" = 7)
\ No newline at end of file
+ tastes = list("peaches" = 1, "tin" = 7)
+
+/obj/item/reagent_containers/food/snacks/chocolatestrawberry
+ name = "Chocolate dipped strawberries"
+ desc = "A strawberry dipped in a bit of chocolate."
+ icon_state = "chocolatestrawberry"
+ list_reagents = list("sugar" = 5, "nutriment" = 2)
+ filling_color = "#ffdf26"
+ w_class = WEIGHT_CLASS_NORMAL
+ tastes = list("strawberries" = 5, "chocolate" = 3)
+ foodtype = FRUIT | SUGAR
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index 238bb4f86a..9b87002738 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -308,7 +308,6 @@
tastes = list("bread" = 1, "egg" = 1, "cheese" = 1)
foodtype = GRAIN | MEAT | DAIRY
-
/obj/item/reagent_containers/food/snacks/sugarcookie
name = "sugar cookie"
desc = "Just like your little sister used to make."
@@ -369,6 +368,16 @@
tastes = list("cake" = 3, "blue cherry" = 1)
foodtype = GRAIN | FRUIT | SUGAR
+/obj/item/reagent_containers/food/snacks/strawberrycupcake
+ name = "Strawberry cupcake"
+ desc = "Strawberry inside a delicious cupcake."
+ icon_state = "strawberrycupcake"
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
+ list_reagents = list("nutriment" = 5, "vitamin" = 1)
+ filling_color = "#F0E68C"
+ tastes = list("cake" = 2, "strawberry" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
+
/obj/item/reagent_containers/food/snacks/honeybun
name = "honey bun"
desc = "A sticky pastry bun glazed with honey."
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 0b12ee4fcf..be6c11fd68 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -171,8 +171,6 @@
tastes = list("pie" = 1, "apple" = 1)
foodtype = GRAIN | FRUIT | SUGAR
-
-
/obj/item/reagent_containers/food/snacks/pie/cherrypie
name = "cherry pie"
desc = "Taste so good, make a grown man cry."
@@ -221,6 +219,33 @@
tastes = list("pie" = 1, "grape" = 1)
foodtype = GRAIN | FRUIT | SUGAR
+/obj/item/reagent_containers/food/snacks/pie/mimetart
+ name = "mime tart"
+ desc = "..."
+ icon_state = "mimetart"
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 4, "nothing" = 10)
+ list_reagents = list("nutriment" = 5, "vitamin" = 5)
+ tastes = list("pie" = 1, "nothing" = 1)
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/pie/berrytart
+ name = "berry tart"
+ desc = "A tasty dessert of many different small barries on a thin pie crust."
+ icon_state = "berrytart"
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
+ list_reagents = list("nutriment" = 3, "vitamin" = 5)
+ tastes = list("pie" = 1, "berries" = 2)
+ foodtype = GRAIN | FRUIT
+
+/obj/item/reagent_containers/food/snacks/pie/cocolavatart
+ name = "chocolate lava tart"
+ desc = "A tasty dessert made of chocaloate, with a liquid core."
+ icon_state = "cocolavatart"
+ bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
+ list_reagents = list("nutriment" = 4, "vitamin" = 4)
+ tastes = list("pie" = 1, "grape" = 1)
+ foodtype = GRAIN | SUGAR
+
/obj/item/reagent_containers/food/snacks/pie/blumpkinpie
name = "blumpkin pie"
desc = "An odd blue pie made with toxic blumpkin."
@@ -288,6 +313,14 @@
icon_state = "baklavaslice"
trash = /obj/item/trash/plate
filling_color = "#1E90FF"
- list_reagents = list("nutriment" = 2, "vitamins" = 4)
+ list_reagents = list("nutriment" = 2, "vitamin" = 4)
tastes = list("nuts" = 1, "pie" = 1)
- foodtype = GRAIN
\ No newline at end of file
+ foodtype = GRAIN
+
+/obj/item/reagent_containers/food/snacks/pie/strawberrypie
+ name = "strawberry pie"
+ desc = "A strawberry.pie."
+ icon_state = "strawberrypie"
+ bonus_reagents = list("nutriment" = 6, "vitamin" = 6)
+ tastes = list("strawberry" = 1, "pie" = 1)
+ foodtype = GRAIN | FRUIT | SUGAR
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
index 464b8ce26f..e26d15dbd3 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
@@ -148,6 +148,27 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc
subcategory = CAT_CAKE
+/datum/crafting_recipe/food/clowncake
+ name = "clown cake"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/sundae = 2,
+ /obj/item/reagent_containers/food/snacks/grown/banana = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/clown_cake
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/vanillacake
+ name = "vanilla cake"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/vanillapod = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
+ subcategory = CAT_CAKE
+
/datum/crafting_recipe/food/cak
name = "Living cat/cake hybrid"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
index 08d5716779..73b09df68d 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
@@ -211,7 +211,7 @@
subcategory = CAT_ICE
/datum/crafting_recipe/food/kiwi_sc
- name = "Soda water snowcone"
+ name = "Kiwi snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/obj/item/reagent_containers/food/snacks/egg/kiwiEgg = 1,
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index a6240e5b48..9cf5ea31a0 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -258,7 +258,7 @@
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/lizardwine
+/datum/crafting_recipe/lizardwine //not a subtype of /datum/crafting_recipe/food due to a bug where the resulting bottle would contain 100u of lizardwine and 100u of ethanol.
name = "Lizard wine"
time = 40
reqs = list(
@@ -266,6 +266,7 @@
/datum/reagent/consumable/ethanol = 100
)
result = /obj/item/reagent_containers/food/drinks/bottle/lizardwine
+ category = CAT_FOOD
subcategory = CAT_MISCFOOD
@@ -331,3 +332,12 @@
)
result = /obj/item/reagent_containers/food/snacks/riceball
subcategory = CAT_MISCFOOD
+
+/datum/crafting_recipe/food/chocolatestrawberry
+ name = "Chocolate Strawberry"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/chocolatestrawberry
+ subcategory = CAT_MISCFOOD
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index 2246d12df4..931a78212f 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -325,6 +325,15 @@ datum/crafting_recipe/food/donut/meat
result = /obj/item/reagent_containers/food/snacks/bluecherrycupcake
subcategory = CAT_PASTRY
+/datum/crafting_recipe/food/strawberrycupcake
+ name = "Strawberry cherry cupcake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/strawberrycupcake
+ subcategory = CAT_PASTRY
+
/datum/crafting_recipe/food/honeybun
name = "Honey bun"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
index 79d761c2e2..81824dc4b8 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
@@ -160,6 +160,15 @@
result = /obj/item/reagent_containers/food/snacks/pie/frostypie
subcategory = CAT_PIE
+/datum/crafting_recipe/food/strawberrypie
+ name = "Strawberry pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/strawberrypie
+ subcategory = CAT_PIE
+
/datum/crafting_recipe/food/baklava
name = "Baklava pie"
reqs = list(
@@ -168,4 +177,41 @@
/obj/item/seeds/wheat/oat = 3
)
result = /obj/item/reagent_containers/food/snacks/pie/baklava
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/mimetart
+ name = "Mime tart"
+ always_availible = FALSE
+ reqs = list(
+ /datum/reagent/consumable/milk = 5,
+ /datum/reagent/consumable/sugar = 5,
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /datum/reagent/consumable/nothing = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/mimetart
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/berrytart
+ name = "Berry tart"
+ always_availible = FALSE
+ reqs = list(
+ /datum/reagent/consumable/milk = 5,
+ /datum/reagent/consumable/sugar = 5,
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/berries = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/berrytart
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/cocolavatart
+ name = "Chocolate Lava tart"
+ always_availible = FALSE
+ reqs = list(
+ /datum/reagent/consumable/milk = 5,
+ /datum/reagent/consumable/sugar = 5,
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 3,
+ /obj/item/slime_extract = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart
subcategory = CAT_PIE
\ No newline at end of file
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index 463df71f71..082f20f524 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -82,6 +82,12 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
if("setMusicVolume")
data = setMusicVolume(arglist(params))
+ if("swaptodarkmode")
+ swaptodarkmode()
+
+ if("swaptolightmode")
+ swaptolightmode()
+
if(data)
ehjax_send(data = data)
@@ -240,3 +246,10 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
// url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
C << output(url_encode(url_encode(message)), "browseroutput:output")
+
+
+/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
+ owner.force_white_theme()
+
+/datum/chatOutput/proc/swaptodarkmode()
+ owner.force_dark_theme()
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index a12e221345..7b942494f4 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -7,16 +7,20 @@ html, body {
padding: 0;
margin: 0;
height: 100%;
- color: #000000;
+ color: #f0f0f0;
}
body {
- background: #E0E0E0; /*CIT CHANGE - darkens chatbox a lil*/
+ background: #171717;
font-family: Verdana, sans-serif;
font-size: 9pt;
+ font-color: #f0f0f0;
line-height: 1.2;
overflow-x: hidden;
overflow-y: scroll;
- word-wrap: break-word;
+ word-wrap: break-word;
+ scrollbar-face-color:#1A1A1A;
+ scrollbar-track-color:#171717;
+ scrollbar-highlight-color:#171717;
}
em {
@@ -56,9 +60,9 @@ img.icon {
border-radius: 10px;
}
-a {color: #0000ff;}
-a.visited {color: #ff00ff;}
-a:visited {color: #ff00ff;}
+a {color: #397ea5;}
+a.visited {color: #7c00e6;}
+a:visited {color: #7c00e6;}
a.popt {text-decoration: none;}
/*****************************************
@@ -89,21 +93,21 @@ a.popt {text-decoration: none;}
bottom: 0;
right: 0;
padding: 8px;
- background: #ddd;
+ background: #202020;
text-decoration: none;
font-variant: small-caps;
font-size: 1.1em;
font-weight: bold;
- color: #333;
+ color: #a4bad6;
}
-#newMessages:hover {background: #ccc;}
+#newMessages:hover {background: #171717;}
#newMessages i {vertical-align: middle; padding-left: 3px;}
#ping {
position: fixed;
top: 0;
- right: 80px;
+ right: 115px;
width: 45px;
- background: #ddd;
+ background: #202020;
height: 30px;
padding: 8px 0 2px 0;
}
@@ -120,19 +124,19 @@ a.popt {text-decoration: none;}
right: 0;
}
#userBar .subCell {
- background: #ddd;
+ background: #202020;
height: 30px;
padding: 5px 0;
display: block;
- color: #333;
+ color: #a4bad6;
text-decoration: none;
line-height: 28px;
- border-top: 1px solid #b4b4b4;
+ border-top: 1px solid #171717;
}
-#userBar .subCell:hover {background: #ccc;}
+#userBar .subCell:hover {background: #202020;}
#userBar .toggle {
width: 40px;
- background: #ccc;
+ background: #202020;
border-top: 0;
float: right;
text-align: center;
@@ -242,9 +246,9 @@ a.popt {text-decoration: none;}
******************************************/
/* MOTD */
-.motd {color: #638500; font-family: Verdana, sans-serif;}
-.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;}
-.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;}
+.motd {color: #a4bad6; font-family: Verdana, sans-serif;}
+.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #a4bad6; text-decoration: underline;}
+.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #a4bad6;}
/* ADD HERE FOR BOLD */
.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;}
@@ -255,88 +259,90 @@ a.popt {text-decoration: none;}
/* OUTPUT COLORS */
.highlight {background: yellow;}
-h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;}
-h1.alert, h2.alert {color: #000000;}
+h1, h2, h3, h4, h5, h6 {color: #a4bad6;font-family: Georgia, Verdana, sans-serif;}
+h1.alert, h2.alert {color: #a4bad6;}
em {font-style: normal; font-weight: bold;}
-.ooc { font-weight: bold;}
+.ooc {color: #cca300; font-weight: bold;}
+.antagooc {color: #ce254f; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
-.adminooc {color: #700038; font-weight: bold;}
+.adminooc {color: #3d5bc3; font-weight: bold;}
-.adminsay {color: #FF4500; font-weight: bold;}
-.admin {color: #386aff; font-weight: bold;}
+.adminsay {color: #ff4500; font-weight: bold;}
+.admin {color: #5975da; font-weight: bold;}
.name { font-weight: bold;}
.say {}
-.deadsay {color: #5c00e6;}
+.deadsay {color: #e2c1ff;}
.binarysay {color: #20c20e; background-color: #000000; display: block;}
.binarysay a {color: #00ff00;}
.binarysay a:active, .binarysay a:visited {color: #88ff88;}
-.radio {color: #008000;}
-.sciradio {color: #993399;}
-.comradio {color: #948f02;}
-.secradio {color: #a30000;}
-.medradio {color: #337296;}
-.engradio {color: #fb5613;}
-.suppradio {color: #a8732b;}
-.servradio {color: #6eaa2c;}
-.syndradio {color: #6d3f40;}
-.centcomradio {color: #686868;}
-.aiprivradio {color: #ff00ff;}
-.redteamradio {color: #ff0000;}
-.blueteamradio {color: #0000ff;}
+.radio {color: #1ecc43;}
+.sciradio {color: #c68cfa;}
+.comradio {color: #5177ff;}
+.secradio {color: #dd3535;}
+.medradio {color: #57b8f0;}
+.engradio {color: #f37746;}
+.suppradio {color: #b88646;}
+.servradio {color: #6ca729;}
+.syndradio {color: #8f4a4b;}
+.centcomradio {color: #2681a5;}
+.aiprivradio {color: #d65d95;}
+.redteamradio {color: #ff4444;}
+.blueteamradio {color: #3434fd;}
.yell { font-weight: bold;}
-.alert {color: #ff0000;}
-h1.alert, h2.alert {color: #000000;}
+.alert {color: #d82020;}
+h1.alert, h2.alert {color: #99aab5;}
.emote { font-style: italic;}
.selecteddna {color: #ffffff; background-color: #001B1B}
-.attack {color: #ff0000;}
-.disarm {color: #990000;}
-.passive {color: #660000;}
+.attack {color: #e01c1c;}
+.disarm {color: #b42525;}
+.passive {color: #a00f0f;}
-.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
-.danger {color: #ff0000;}
-.warning {color: #ff0000; font-style: italic;}
-.alertwarning {color: #FF0000; font-weight: bold}
-.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
-.announce {color: #228b22; font-weight: bold;}
-.boldannounce {color: #ff0000; font-weight: bold;}
-.greenannounce {color: #00ff00; font-weight: bold;}
+.userdanger {color: #c51e1e; font-weight: bold; font-size: 24px;}
+.danger {color: #c51e1e;}
+.warning {color: #c51e1e; font-style: italic;}
+.alertwarning {color: #FF0000; font-weight: bold}
+.boldwarning {color: #c51e1e; font-style: italic; font-weight: bold}
+.announce {color: #c51e1e; font-weight: bold;}
+.boldannounce {color: #c51e1e; font-weight: bold;}
+.greenannounce {color: #059223; font-weight: bold;}
.rose {color: #ff5050;}
-.info {color: #0000CC;}
-.notice {color: #000099;}
-.boldnotice {color: #000099; font-weight: bold;}
-.adminnotice {color: #0000ff;}
+.info {color: #6685f5;}
+.notice {color: #6685f5;}
+.boldnotice {color: #6685f5; font-weight: bold;}
+.adminnotice {color: #6685f5;}
.adminhelp {color: #ff0000; font-weight: bold;}
-.unconscious {color: #0000ff; font-weight: bold;}
+.unconscious {color: #a4bad6; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
-.green {color: #03ff39;}
-.red {color: #FF0000}
-.blue {color: #215cff}
-.nicegreen {color: #14a833;}
+.red {color: #FF0000}
+.pink {color: #ff70c1;}
+.blue {color: #215cff}
+.green {color: #059223;}
+.nicegreen {color: #059223;}
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
-.shadowling {color: #3b2769;}
-.cult {color: #960000;}
+.shadowling {color: #8e8a99;}
+.cult {color: #aa1c1c;}
-.cultitalic {color: #960000; font-style: italic;}
-.cultbold {color: #960000; font-style: italic; font-weight: bold;}
-.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;}
+.cultitalic {color: #aa1c1c; font-style: italic;}
+.cultbold {color: #aa1c1c; font-style: italic; font-weight: bold;}
+.cultboldtalic {color: #aa1c1c; font-weight: bold; font-size: 24px;}
-.cultlarge {color: #960000; font-weight: bold; font-size: 24px;}
-.narsie {color: #960000; font-weight: bold; font-size: 120px;}
-.narsiesmall {color: #960000; font-weight: bold; font-size: 48px;}
+.cultlarge {color: #aa1c1c; font-weight: bold; font-size: 24px;}
+.narsie {color: #aa1c1c; font-weight: bold; font-size: 120px;}
+.narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 48px;}
.colossus {color: #7F282A; font-size: 40px;}
-.hierophant {color: #660099; font-weight: bold; font-style: italic;}
-.hierophant_warning {color: #660099; font-style: italic;}
-.purple {color: #5e2d79;}
-.holoparasite {color: #35333a;}
+.hierophant {color: #b441ee; font-weight: bold; font-style: italic;}
+.hierophant_warning {color: #c56bf1; font-style: italic;}
+.purple {color: #9956d3;}
+.holoparasite {color: #88809c;}
.revennotice {color: #1d2953;}
.revenboldnotice {color: #1d2953; font-weight: bold;}
@@ -344,11 +350,11 @@ h1.alert, h2.alert {color: #000000;}
.revenminor {color: #823abb}
.revenwarning {color: #760fbb; font-style: italic;}
.revendanger {color: #760fbb; font-weight: bold; font-size: 24px;}
-.umbra {color: #5000A0;}
-.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;}
-.umbra_large {color: #5000A0; font-size: 24px; font-weight: bold; font-style: italic;}
+.umbra {color: #7c00e6;}
+.umbra_emphasis {color: #7c00e6; font-weight: bold; font-style: italic;}
+.umbra_large {color: #7c00e6; font-size: 24px; font-weight: bold; font-style: italic;}
-.deconversion_message {color: #5000A0; font-size: 24px; font-style: italic;}
+.deconversion_message {color: #a947ff; font-size: 24px; font-style: italic;}
.brass {color: #BE8700;}
.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
@@ -373,17 +379,17 @@ h1.alert, h2.alert {color: #000000;}
.neovgre {color: #6E001A; font-weight: bold; font-style: italic;}
.neovgre_small {color: #6E001A;}
-.newscaster {color: #800000;}
-.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
+.newscaster {color: #c05d5d;}
+.ghostalert {color: #6600ff; font-style: italic; font-weight: bold;}
-.alien {color: #543354;}
-.noticealien {color: #00c000;}
-.alertalien {color: #00c000; font-weight: bold;}
-.changeling {color: #800080; font-style: italic;}
+.alien {color: #855d85;}
+.noticealien {color: #059223;}
+.alertalien {color: #059223; font-weight: bold;}
+.changeling {color: #059223; font-style: italic;}
-.spider {color: #4d004d;}
+.spider {color: #8800ff;}
-.interface {color: #330033;}
+.interface {color: #750e75;}
.sans {font-family: "Comic Sans MS", cursive, sans-serif;}
.papyrus {font-family: "Papyrus", cursive, sans-serif;}
@@ -394,9 +400,9 @@ h1.alert, h2.alert {color: #000000;}
.big {font-size: 24px;}
.reallybig {font-size: 32px;}
.extremelybig {font-size: 40px;}
-.greentext {color: #00FF00; font-size: 24px;}
-.redtext {color: #FF0000; font-size: 24px;}
-.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
+.greentext {color: #059223; font-size: 24px;}
+.redtext {color: #c51e1e; font-size: 24px;}
+.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
@keyframes velvet {
@@ -428,20 +434,20 @@ h1.alert, h2.alert {color: #000000;}
.memo {color: #638500; text-align: center;}
.memoedit {text-align: center; font-size: 16px;}
-.abductor {color: #800080; font-style: italic;}
-.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
+.abductor {color: #c204c2; font-style: italic;}
+.mind_control {color: #df3da9; font-size: 3; font-weight: bold; font-style: italic;}
.slime {color: #00CED1;}
.drone {color: #848482;}
.monkey {color: #975032;}
.swarmer {color: #2C75FF;}
.resonate {color: #298F85;}
-.monkeyhive {color: #774704;}
-.monkeylead {color: #774704; font-size: 2;}
+.monkeyhive {color: #a56408;}
+.monkeylead {color: #af6805; font-size: 2;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
-.internal.boldnshit {color: blue; font-weight: bold;}
+.internal.boldnshit {color: #3d5bc3; font-weight: bold;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css
new file mode 100644
index 0000000000..e21185449b
--- /dev/null
+++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css
@@ -0,0 +1,426 @@
+/*****************************************
+*
+* GLOBAL STYLES
+*
+******************************************/
+html, body {
+ padding: 0;
+ margin: 0;
+ height: 100%;
+ color: #000000;
+}
+body {
+ background: #fff;
+ font-family: Verdana, sans-serif;
+ font-size: 9pt;
+ line-height: 1.2;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ word-wrap: break-word;
+}
+
+em {
+ font-style: normal;
+ font-weight: bold;
+}
+
+img {
+ margin: 0;
+ padding: 0;
+ line-height: 1;
+ -ms-interpolation-mode: nearest-neighbor;
+ image-rendering: pixelated;
+}
+img.icon {
+ height: 1em;
+ min-height: 16px;
+ width: auto;
+ vertical-align: bottom;
+}
+
+
+.r:before { /* "repeated" badge class for combined messages */
+ content: 'x';
+}
+.r {
+ display: inline-block;
+ min-width: 0.5em;
+ font-size: 0.7em;
+ padding: 0.2em 0.3em;
+ line-height: 1;
+ color: white;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ background-color: crimson;
+ border-radius: 10px;
+}
+
+a {color: #0000ff;}
+a.visited {color: #ff00ff;}
+a:visited {color: #ff00ff;}
+a.popt {text-decoration: none;}
+
+/*****************************************
+*
+* OUTPUT NOT RELATED TO ACTUAL MESSAGES
+*
+******************************************/
+#loading {
+ position: fixed;
+ width: 300px;
+ height: 150px;
+ text-align: center;
+ left: 50%;
+ top: 50%;
+ margin: -75px 0 0 -150px;
+}
+#loading i {display: block; padding-bottom: 3px;}
+
+#messages {
+ font-size: 13px;
+ padding: 3px;
+ margin: 0;
+ word-wrap: break-word;
+}
+#newMessages {
+ position: fixed;
+ display: block;
+ bottom: 0;
+ right: 0;
+ padding: 8px;
+ background: #ddd;
+ text-decoration: none;
+ font-variant: small-caps;
+ font-size: 1.1em;
+ font-weight: bold;
+ color: #333;
+}
+#newMessages:hover {background: #ccc;}
+#newMessages i {vertical-align: middle; padding-left: 3px;}
+#ping {
+ position: fixed;
+ top: 0;
+ right: 115px;
+ width: 45px;
+ background: #ddd;
+ height: 30px;
+ padding: 8px 0 2px 0;
+}
+#ping i {display: block; text-align: center;}
+#ping .ms {
+ display: block;
+ text-align: center;
+ font-size: 8pt;
+ padding-top: 2px;
+}
+#userBar {
+ position: fixed;
+ top: 0;
+ right: 0;
+}
+#userBar .subCell {
+ background: #ddd;
+ height: 30px;
+ padding: 5px 0;
+ display: block;
+ color: #333;
+ text-decoration: none;
+ line-height: 28px;
+ border-top: 1px solid #b4b4b4;
+}
+#userBar .subCell:hover {background: #ccc;}
+#userBar .toggle {
+ width: 40px;
+ background: #ccc;
+ border-top: 0;
+ float: right;
+ text-align: center;
+}
+#userBar .sub {clear: both; display: none; width: 160px;}
+#userBar .sub.scroll {overflow-y: scroll;}
+#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
+#userBar .sub span {
+ display: block;
+ line-height: 30px;
+ float: left;
+}
+#userBar .sub i {
+ display: block;
+ padding: 0 5px;
+ font-size: 1.1em;
+ width: 22px;
+ text-align: center;
+ line-height: 30px;
+ float: right;
+}
+#userBar .sub input {
+ position: absolute;
+ padding: 7px 5px;
+ width: 121px;
+ line-height: 30px;
+ float: left;
+}
+#userBar .topCell {border-top: 0;}
+
+/* POPUPS */
+.popup {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ background: #ddd;
+}
+.popup .close {
+ position: absolute;
+ background: #aaa;
+ top: 0;
+ right: 0;
+ color: #333;
+ text-decoration: none;
+ z-index: 2;
+ padding: 0 10px;
+ height: 30px;
+ line-height: 30px;
+}
+.popup .close:hover {background: #999;}
+.popup .head {
+ background: #999;
+ color: #ddd;
+ padding: 0 10px;
+ height: 30px;
+ line-height: 30px;
+ text-transform: uppercase;
+ font-size: 0.9em;
+ font-weight: bold;
+ border-bottom: 2px solid green;
+}
+.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;}
+.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;}
+.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
+.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;}
+
+.changeFont {padding: 10px;}
+.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;}
+.changeFont a:hover {background: #ccc;}
+
+.highlightPopup {padding: 10px; text-align: center;}
+.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;}
+.highlightPopup input.highlightColor {background-color: #FFFF00;}
+.highlightPopup input.highlightTermSubmit {margin-top: 5px;}
+
+/* ADMIN CONTEXT MENU */
+.contextMenu {
+ background-color: #ddd;
+ position: fixed;
+ margin: 2px;
+ width: 150px;
+}
+.contextMenu a {
+ display: block;
+ padding: 2px 5px;
+ text-decoration: none;
+ color: #333;
+}
+
+.contextMenu a:hover {
+ background-color: #ccc;
+}
+
+/* ADMIN FILTER MESSAGES MENU */
+.filterMessages {padding: 5px;}
+.filterMessages div {padding: 2px 0;}
+.filterMessages input {}
+.filterMessages label {}
+
+.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;}
+
+
+/*****************************************
+*
+* OUTPUT ACTUALLY RELATED TO MESSAGES
+*
+******************************************/
+
+/* MOTD */
+.motd {color: #638500; font-family: Verdana, sans-serif;}
+.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;}
+.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;}
+
+/* ADD HERE FOR BOLD */
+.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;}
+
+/* ADD HERE FOR ITALIC */
+.italic, .italics, .emote {font-style: italic;}
+
+/* OUTPUT COLORS */
+.highlight {background: yellow;}
+
+h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;}
+h1.alert, h2.alert {color: #000000;}
+
+em {font-style: normal; font-weight: bold;}
+
+.ooc {color: #002eb8; font-weight: bold;}
+.antagooc {color: #b8002e; font-weight: bold;}
+.adminobserverooc {color: #0099cc; font-weight: bold;}
+.adminooc {color: #700038; font-weight: bold;}
+
+.adminsay {color: #ff4500; font-weight: bold;}
+.admin {color: #4473ff; font-weight: bold;}
+
+.name { font-weight: bold;}
+
+.say {}
+.deadsay {color: #5c00e6;}
+.binarysay {color: #20c20e; background-color: #000000; display: block;}
+.binarysay a {color: #00ff00;}
+.binarysay a:active, .binarysay a:visited {color: #88ff88;}
+.radio {color: #008000;}
+.sciradio {color: #993399;}
+.comradio {color: #948f02;}
+.secradio {color: #a30000;}
+.medradio {color: #337296;}
+.engradio {color: #fb5613;}
+.suppradio {color: #a8732b;}
+.servradio {color: #6eaa2c;}
+.syndradio {color: #6d3f40;}
+.centcomradio {color: #686868;}
+.aiprivradio {color: #ff00ff;}
+.redteamradio {color: #ff0000;}
+.blueteamradio {color: #0000ff;}
+
+.yell { font-weight: bold;}
+
+.alert {color: #ff0000;}
+h1.alert, h2.alert {color: #000000;}
+
+.emote { font-style: italic;}
+.selecteddna {color: #ffffff; background-color: #001B1B}
+
+.attack {color: #ff0000;}
+.disarm {color: #990000;}
+.passive {color: #660000;}
+
+.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
+.danger {color: #ff0000;}
+.warning {color: #ff0000; font-style: italic;}
+.alertwarning {color: #FF0000; font-weight: bold}
+.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
+.announce {color: #228b22; font-weight: bold;}
+.boldannounce {color: #ff0000; font-weight: bold;}
+.greenannounce {color: #00ff00; font-weight: bold;}
+.rose {color: #ff5050;}
+.info {color: #0000CC;}
+.notice {color: #000099;}
+.boldnotice {color: #000099; font-weight: bold;}
+.adminnotice {color: #0000ff;}
+.adminhelp {color: #ff0000; font-weight: bold;}
+.unconscious {color: #0000ff; font-weight: bold;}
+.suicide {color: #ff5050; font-style: italic;}
+.green {color: #03ff39;}
+.red {color: #FF0000}
+.pink {color: #FF69Bf;}
+.blue {color: #0000FF}
+.nicegreen {color: #14a833;}
+.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
+.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
+.shadowling {color: #3b2769;}
+.cult {color: #960000;}
+
+.cultitalic {color: #960000; font-style: italic;}
+.cultbold {color: #960000; font-style: italic; font-weight: bold;}
+.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;}
+
+.cultlarge {color: #960000; font-weight: bold; font-size: 24px;}
+.narsie {color: #960000; font-weight: bold; font-size: 120px;}
+.narsiesmall {color: #960000; font-weight: bold; font-size: 48px;}
+.colossus {color: #7F282A; font-size: 40px;}
+.hierophant {color: #660099; font-weight: bold; font-style: italic;}
+.hierophant_warning {color: #660099; font-style: italic;}
+.purple {color: #5e2d79;}
+.holoparasite {color: #35333a;}
+
+.revennotice {color: #1d2953;}
+.revenboldnotice {color: #1d2953; font-weight: bold;}
+.revenbignotice {color: #1d2953; font-weight: bold; font-size: 24px;}
+.revenminor {color: #823abb}
+.revenwarning {color: #760fbb; font-style: italic;}
+.revendanger {color: #760fbb; font-weight: bold; font-size: 24px;}
+.umbra {color: #5000A0;}
+.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;}
+.umbra_large {color: #5000A0; font-size: 24px; font-weight: bold; font-style: italic;}
+
+.deconversion_message {color: #5000A0; font-size: 24px; font-style: italic;}
+
+.brass {color: #BE8700;}
+.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
+.large_brass {color: #BE8700; font-size: 24px;}
+.big_brass {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic;}
+.ratvar {color: #BE8700; font-size: 48px; font-weight: bold; font-style: italic;}
+.alloy {color: #42474D;}
+.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;}
+.nezbere_large {color: #42474D; font-size: 24px; font-weight: bold; font-style: italic;}
+.nezbere {color: #42474D; font-weight: bold; font-style: italic;}
+.nezbere_small {color: #42474D;}
+.sevtug_large {color: #AF0AAF; font-size: 24px; font-weight: bold; font-style: italic;}
+.sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;}
+.sevtug_small {color: #AF0AAF;}
+.inathneq_large {color: #1E8CE1; font-size: 24px; font-weight: bold; font-style: italic;}
+.inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;}
+.inathneq_small {color: #1E8CE1;}
+.nzcrentr_large {color: #DAAA18; font-size: 24px; font-weight: bold; font-style: italic;}
+.nzcrentr {color: #DAAA18; font-weight: bold; font-style: italic;}
+.nzcrentr_small {color: #DAAA18;}
+.neovgre_large {color: #6E001A; font-size: 24px; font-weight: bold; font-style: italic;}
+.neovgre {color: #6E001A; font-weight: bold; font-style: italic;}
+.neovgre_small {color: #6E001A;}
+
+.newscaster {color: #800000;}
+.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
+
+.alien {color: #543354;}
+.noticealien {color: #00c000;}
+.alertalien {color: #00c000; font-weight: bold;}
+.changeling {color: #800080; font-style: italic;}
+
+.spider {color: #4d004d;}
+
+.interface {color: #330033;}
+
+.sans {font-family: "Comic Sans MS", cursive, sans-serif;}
+.papyrus {font-family: "Papyrus", cursive, sans-serif;}
+.robot {font-family: "Courier New", cursive, sans-serif;}
+
+.command_headset {font-weight: bold; font-size: 24px;}
+.small {font-size: 8px;}
+.big {font-size: 24px;}
+.reallybig {font-size: 32px;}
+.extremelybig {font-size: 40px;}
+.greentext {color: #00FF00; font-size: 24px;}
+.redtext {color: #FF0000; font-size: 24px;}
+.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
+.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
+
+.icon {height: 1em; width: auto;}
+
+.memo {color: #638500; text-align: center;}
+.memoedit {text-align: center; font-size: 16px;}
+.abductor {color: #800080; font-style: italic;}
+.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
+.slime {color: #00CED1;}
+.drone {color: #848482;}
+.monkey {color: #975032;}
+.swarmer {color: #2C75FF;}
+.resonate {color: #298F85;}
+
+.monkeyhive {color: #774704;}
+.monkeylead {color: #774704; font-size: 2;}
+
+.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
+.connectionClosed.restored {background: green;}
+.internal.boldnshit {color: blue; font-weight: bold;}
+
+/* HELPER CLASSES */
+.text-normal {font-weight: normal; font-style: normal;}
+.hidden {display: none; visibility: hidden;}
+
diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html
index fe3be9486c..9c6d462a85 100644
--- a/code/modules/goonchat/browserassets/html/browserOutput.html
+++ b/code/modules/goonchat/browserassets/html/browserOutput.html
@@ -5,7 +5,7 @@
-
+
@@ -28,6 +28,9 @@
--ms
+
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js
index 33553d765e..93a498fd06 100644
--- a/code/modules/goonchat/browserassets/js/browserOutput.js
+++ b/code/modules/goonchat/browserassets/js/browserOutput.js
@@ -35,6 +35,7 @@ var opts = {
'wasd': false, //Is the user in wasd mode?
'priorChatHeight': 0, //Thing for height-resizing detection
'restarting': false, //Is the round restarting?
+ 'darkmode':false, //Are we using darkmode? If not WHY ARE YOU LIVING IN 2009???
//Options menu
'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu
@@ -394,6 +395,19 @@ function toHex(n) {
return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
}
+function swap() { //Swap to darkmode
+ if (opts.darkmode){
+ document.getElementById("sheetofstyles").href = "browserOutput_white.css";
+ opts.darkmode = false;
+ runByond('?_src_=chat&proc=swaptolightmode');
+ } else {
+ document.getElementById("sheetofstyles").href = "browserOutput.css";
+ opts.darkmode = true;
+ runByond('?_src_=chat&proc=swaptodarkmode');
+ }
+ setCookie('darkmode', (opts.darkmode ? 'true' : 'false'), 365);
+}
+
function handleClientData(ckey, ip, compid) {
//byond sends player info to here
var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid};
@@ -601,6 +615,7 @@ $(function() {
'shighlightColor': getCookie('highlightcolor'),
'smusicVolume': getCookie('musicVolume'),
'smessagecombining': getCookie('messagecombining'),
+ 'sdarkmode': getCookie('darkmode'),
};
if (savedConfig.sfontSize) {
@@ -611,6 +626,9 @@ $(function() {
$("body").css('line-height', savedConfig.slineHeight);
internalOutput('Loaded line height setting of: '+savedConfig.slineHeight+'', 'internal');
}
+ if(savedConfig.sdarkmode == 'true'){
+ swap();
+ }
if (savedConfig.spingDisabled) {
if (savedConfig.spingDisabled == 'true') {
opts.pingDisabled = true;
@@ -655,8 +673,6 @@ $(function() {
opts.messageCombining = true;
}
}
-
-
(function() {
var dataCookie = getCookie('connData');
if (dataCookie) {
@@ -823,7 +839,9 @@ $(function() {
$('#toggleOptions').click(function(e) {
handleToggleClick($subOptions, $(this));
});
-
+ $('#darkmodetoggle').click(function(e) {
+ swap();
+ });
$('#toggleAudio').click(function(e) {
handleToggleClick($subAudio, $(this));
});
@@ -895,7 +913,7 @@ $(function() {
$.ajax({
type: 'GET',
- url: 'browserOutput.css',
+ url: 'browserOutput_white.css',
success: function(styleData) {
var blob = new Blob(['Chat Log', $messages.html(), '']);
diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm
index 4ffc10f9c2..6cc11afdf5 100644
--- a/code/modules/holodeck/computer.dm
+++ b/code/modules/holodeck/computer.dm
@@ -149,6 +149,7 @@
active_power_usage = 50 + spawned.len * 3 + effects.len * 5
/obj/machinery/computer/holodeck/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
if(!LAZYLEN(emag_programs))
@@ -160,6 +161,7 @@
to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.")
log_game("[key_name(user)] emagged the Holodeck Control Console")
nerf(!(obj_flags & EMAGGED))
+ return TRUE
/obj/machinery/computer/holodeck/emp_act(severity)
. = ..()
diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm
index fee0b2b7c9..308cec1cbd 100644
--- a/code/modules/holodeck/holo_effect.dm
+++ b/code/modules/holodeck/holo_effect.dm
@@ -78,6 +78,12 @@
// these vars are not really standardized but all would theoretically create stuff on death
for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & mob.vars)
mob.vars[v] = null
+ ENABLE_BITFIELD(mob.flags_1, HOLOGRAM_1)
+ if(isliving(mob))
+ var/mob/living/L = mob
+ L.feeding = FALSE
+ L.devourable = FALSE
+ L.digestable = FALSE
return mob
/obj/effect/holodeck_effect/mobspawner/deactivate(var/obj/machinery/computer/holodeck/HC)
@@ -100,7 +106,7 @@
/obj/effect/holodeck_effect/mobspawner/penguin
mobtype = /mob/living/simple_animal/pet/penguin/emperor
-
+
/obj/effect/holodeck_effect/mobspawner/penguin/Initialize()
if(prob(1))
mobtype = /mob/living/simple_animal/pet/penguin/emperor/shamebrero
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index d6eacfe0e1..79a23014b0 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -69,6 +69,8 @@
if(default_deconstruction_screwdriver(user, "dnamod", "dnamod", I))
update_icon()
return
+ else if(default_unfasten_wrench(user, I))
+ return
if(default_deconstruction_crowbar(I))
return
if(iscyborg(user))
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index 19abdacf3a..ef019387e8 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -215,3 +215,26 @@
filling_color = "#7FFF00"
tastes = list("green grape" = 1)
distill_reagent = "cognac"
+
+// Strawberry
+/obj/item/seeds/strawberry
+ name = "pack of strawberry seeds"
+ desc = "These seeds grow into strawberry vines."
+ icon_state = "seed-strawberry"
+ species = "strawberry"
+ plantname = "Strawberry Vine"
+ product = /obj/item/reagent_containers/food/snacks/grown/strawberry
+ growthstages = 6
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "strawberry-grow"
+ icon_dead = "berry-dead"
+ reagents_add = list("vitamin" = 0.07, "nutriment" = 0.1, "sugar" = 0.2)
+ mutatelist = list()
+
+/obj/item/reagent_containers/food/snacks/grown/strawberry
+ seed = /obj/item/seeds/strawberry
+ name = "strawberry"
+ icon_state = "strawberry"
+ filling_color = "#7FFF00"
+ tastes = list("strawberries" = 1)
+ wine_power = 20
diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm
new file mode 100644
index 0000000000..3fa4247f57
--- /dev/null
+++ b/code/modules/hydroponics/grown/cotton.dm
@@ -0,0 +1,79 @@
+/obj/item/seeds/cotton
+ name = "pack of cotton seeds"
+ desc = "A pack of seeds that'll grow into a cotton plant. Assistants make good free labor if neccesary."
+ icon_state = "seed-cotton"
+ species = "cotton"
+ plantname = "Cotton"
+ icon_harvest = "cotton-harvest"
+ product = /obj/item/grown/cotton
+ lifespan = 35
+ endurance = 25
+ maturation = 15
+ production = 1
+ yield = 2
+ potency = 50
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing.dmi'
+ icon_dead = "cotton-dead"
+ mutatelist = list(/obj/item/seeds/cotton/durathread)
+
+/obj/item/grown/cotton
+ seed = /obj/item/seeds/cotton
+ name = "cotton bundle"
+ desc = "A fluffy bundle of cotton."
+ icon_state = "cotton"
+ force = 0
+ throwforce = 0
+ w_class = WEIGHT_CLASS_TINY
+ throw_speed = 2
+ throw_range = 3
+ attack_verb = list("pomfed")
+ var/cotton_type = /obj/item/stack/sheet/cotton
+ var/cotton_name = "raw cotton"
+
+/obj/item/grown/cotton/attack_self(mob/user)
+ user.show_message("You pull some [cotton_name] out of the [name]!", 1)
+ var/seed_modifier = 0
+ if(seed)
+ seed_modifier = round(seed.potency / 25)
+ var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier)
+ var/old_cotton_amount = cotton.amount
+ for(var/obj/item/stack/ST in user.loc)
+ if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount)
+ ST.attackby(cotton, user)
+ if(cotton.amount > old_cotton_amount)
+ to_chat(user, "You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].")
+ qdel(src)
+
+//reinforced mutated variant
+/obj/item/seeds/cotton/durathread
+ name = "pack of durathread seeds"
+ desc = "A pack of seeds that'll grow into an extremely durable thread that could easily rival plasteel if woven properly."
+ icon_state = "seed-durathread"
+ species = "durathread"
+ plantname = "Durathread"
+ icon_harvest = "durathread-harvest"
+ product = /obj/item/grown/cotton/durathread
+ lifespan = 80
+ endurance = 50
+ maturation = 15
+ production = 1
+ yield = 2
+ potency = 50
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing.dmi'
+ icon_dead = "cotton-dead"
+
+/obj/item/grown/cotton/durathread
+ seed = /obj/item/seeds/cotton/durathread
+ name = "durathread bundle"
+ desc = "A tough bundle of durathread, good luck unraveling this."
+ icon_state = "durathread"
+ force = 5
+ throwforce = 5
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 2
+ throw_range = 3
+ attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
+ cotton_type = /obj/item/stack/sheet/cotton/durathread
+ cotton_name = "raw durathread"
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index 4e1718f853..f1aea5706a 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -25,6 +25,7 @@
slot_flags = ITEM_SLOT_HEAD
filling_color = "#FF6347"
bitesize_mod = 3
+ tastes = list("sesame seeds" = 1)
foodtype = VEGETABLES | GROSS
distill_reagent = "vermouth"
@@ -43,6 +44,7 @@
name = "lily"
desc = "A beautiful orange flower."
icon_state = "lily"
+ tastes = list("pelts " = 1)
filling_color = "#FFA500"
// Geranium
@@ -61,6 +63,7 @@
desc = "A beautiful blue flower."
icon_state = "geranium"
filling_color = "#008B8B"
+ tastes = list("pelts " = 1)
// Harebell
/obj/item/seeds/harebell
@@ -86,6 +89,7 @@
name = "harebell"
desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten'd not thy breath.\""
icon_state = "harebell"
+ tastes = list("salt" = 1)
slot_flags = ITEM_SLOT_HEAD
filling_color = "#E6E6FA"
bitesize_mod = 3
@@ -123,6 +127,7 @@
w_class = WEIGHT_CLASS_TINY
throw_speed = 1
throw_range = 3
+ tastes = list("seeds" = 1)
/obj/item/grown/sunflower/attack(mob/M, mob/user)
to_chat(M, " [user] smacks you with a sunflower!FLOWER POWER")
@@ -153,6 +158,7 @@
filling_color = "#E6E6FA"
bitesize_mod = 2
distill_reagent = "absinthe" //It's made from flowers.
+ tastes = list("glowbugs" = 1)
// Novaflower
/obj/item/seeds/sunflower/novaflower
@@ -184,6 +190,7 @@
throw_range = 3
attack_verb = list("roasted", "scorched", "burned")
grind_results = list("capsaicin" = 0, "condensedcapsaicin" = 0)
+ tastes = list("cooked sunflower" = 1)
/obj/item/grown/novaflower/add_juice()
..()
diff --git a/code/modules/hydroponics/grown/peach.dm b/code/modules/hydroponics/grown/peach.dm
new file mode 100644
index 0000000000..6fbf933bd1
--- /dev/null
+++ b/code/modules/hydroponics/grown/peach.dm
@@ -0,0 +1,27 @@
+// Peach
+/obj/item/seeds/peach
+ name = "pack of peach seeds"
+ desc = "These seeds grow into peach trees."
+ icon_state = "seed-peach"
+ species = "peach"
+ plantname = "Peach Tree"
+ product = /obj/item/reagent_containers/food/snacks/grown/peach
+ lifespan = 65
+ endurance = 40
+ yield = 3
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ icon_grow = "peach-grow"
+ icon_dead = "peach-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
+
+/obj/item/reagent_containers/food/snacks/grown/peach
+ seed = /obj/item/seeds/peach
+ name = "peach"
+ desc = "It's fuzzy!"
+ icon_state = "peach"
+ filling_color = "#FF4500"
+ bitesize = 25
+ foodtype = FRUIT
+ juice_results = list("peachjuice" = 0)
+ tastes = list("peach" = 1)
diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm
index fc84617ed8..d9e775acc0 100644
--- a/code/modules/hydroponics/grown/tea_coffee.dm
+++ b/code/modules/hydroponics/grown/tea_coffee.dm
@@ -14,6 +14,7 @@
icon_dead = "tea-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
mutatelist = list(/obj/item/seeds/tea/astra)
+ reagents_add = list("teapowder" = 0.1)
/obj/item/reagent_containers/food/snacks/grown/tea
seed = /obj/item/seeds/tea
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 5aeef19b1a..c0e3beaf79 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -7,6 +7,7 @@
icon = 'icons/obj/hydroponics/harvest.dmi'
resistance_flags = FLAMMABLE
var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item.
+ var/tastes = list("indescribable" = 1) //Stops runtimes. Grown are un-eatable anyways so if you do then its a bug
/obj/item/grown/Initialize(newloc, obj/item/seeds/new_seed)
. = ..()
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 17462c0626..db529e8ffb 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -290,15 +290,15 @@
var/teleport_radius = max(round(G.seed.potency / 10), 1)
var/turf/T = get_turf(target)
new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
- do_teleport(target, T, teleport_radius)
+ do_teleport(target, T, teleport_radius, channel = TELEPORT_CHANNEL_BLUESPACE)
/datum/plant_gene/trait/teleport/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C)
var/teleport_radius = max(round(G.seed.potency / 10), 1)
var/turf/T = get_turf(C)
to_chat(C, "You slip through spacetime!")
- do_teleport(C, T, teleport_radius)
+ do_teleport(C, T, teleport_radius, channel = TELEPORT_CHANNEL_BLUESPACE)
if(prob(50))
- do_teleport(G, T, teleport_radius)
+ do_teleport(G, T, teleport_radius, channel = TELEPORT_CHANNEL_BLUESPACE)
else
new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect...
qdel(G)
diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm
index de3ade389f..f0aa10f2da 100644
--- a/code/modules/integrated_electronics/core/printer.dm
+++ b/code/modules/integrated_electronics/core/printer.dm
@@ -193,7 +193,7 @@
else if(ispath(build_type, /obj/item/integrated_circuit))
var/obj/item/integrated_circuit/IC = SScircuit.cached_components[build_type]
cost = IC.materials[MAT_METAL]
- else if(!build_type in SScircuit.circuit_fabricator_recipe_list["Tools"])
+ else if(!(build_type in SScircuit.circuit_fabricator_recipe_list["Tools"]))
return
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm
index 65805f73fd..ce6eea97b0 100644
--- a/code/modules/jobs/job_types/assistant.dm
+++ b/code/modules/jobs/job_types/assistant.dm
@@ -30,6 +30,12 @@ Assistant
/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H)
..()
if (CONFIG_GET(flag/grey_assistants))
- uniform = /obj/item/clothing/under/color/grey
+ if(H.jumpsuit_style == PREF_SUIT)
+ uniform = /obj/item/clothing/under/color/grey
+ else
+ uniform = /obj/item/clothing/under/skirt/color/grey
else
- uniform = /obj/item/clothing/under/color/random
+ if(H.jumpsuit_style == PREF_SUIT)
+ uniform = /obj/item/clothing/under/color/random
+ else
+ uniform = /obj/item/clothing/under/skirt/color/random
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index cd9c914e7a..b3c952f536 100755
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -21,6 +21,8 @@ Captain
access = list() //See get_access()
minimal_access = list() //See get_access()
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
+
/datum/job/captain/get_access()
return get_all_accesses()
@@ -67,7 +69,7 @@ Head of Personnel
flag = HOP
department_head = list("Captain")
department_flag = CIVILIAN
- head_announce = list("Supply", "Service")
+ head_announce = list(RADIO_CHANNEL_SERVICE)
faction = "Station"
total_positions = 1
spawn_positions = 1
@@ -94,6 +96,7 @@ Head of Personnel
ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION,
ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity)
/datum/outfit/job/hop
name = "Head of Personnel"
diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm
index 22ef2a9211..8e24ece655 100644
--- a/code/modules/jobs/job_types/cargo_service.dm
+++ b/code/modules/jobs/job_types/cargo_service.dm
@@ -6,6 +6,7 @@ Quartermaster
flag = QUARTERMASTER
department_head = list("Head of Personnel")
department_flag = CIVILIAN
+ head_announce = list(RADIO_CHANNEL_SUPPLY)
faction = "Station"
total_positions = 1
spawn_positions = 1
@@ -17,6 +18,8 @@ Quartermaster
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_VAULT)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
+
/datum/outfit/job/quartermaster
name = "Quartermaster"
jobtype = /datum/job/qm
@@ -88,9 +91,9 @@ Shaft Miner
gloves = /obj/item/clothing/gloves/color/black
uniform = /obj/item/clothing/under/rank/miner/lavaland
l_pocket = /obj/item/reagent_containers/hypospray/medipen/survival
- r_pocket = /obj/item/flashlight/seclite
+ r_pocket = /obj/item/storage/bag/ore //causes issues if spawned in backpack
backpack_contents = list(
- /obj/item/storage/bag/ore=1,\
+ /obj/item/flashlight/seclite=1,\
/obj/item/kitchen/knife/combat/survival=1,\
/obj/item/mining_voucher=1,\
/obj/item/suit_voucher=1,\
@@ -116,7 +119,7 @@ Shaft Miner
suit_store = /obj/item/tank/internals/oxygen
internals_slot = SLOT_S_STORE
backpack_contents = list(
- /obj/item/storage/bag/ore=1,
+ /obj/item/flashlight/seclite=1,\
/obj/item/kitchen/knife/combat/survival=1,
/obj/item/mining_voucher=1,
/obj/item/t_scanner/adv_mining_scanner/lesser=1,
diff --git a/code/modules/jobs/job_types/engineering.dm b/code/modules/jobs/job_types/engineering.dm
index f28e5f1afc..e65cbab1bd 100644
--- a/code/modules/jobs/job_types/engineering.dm
+++ b/code/modules/jobs/job_types/engineering.dm
@@ -6,7 +6,7 @@ Chief Engineer
flag = CHIEF
department_head = list("Captain")
department_flag = ENGSEC
- head_announce = list("Engineering")
+ head_announce = list(RADIO_CHANNEL_ENGINEERING)
faction = "Station"
total_positions = 1
spawn_positions = 1
@@ -29,6 +29,8 @@ Chief Engineer
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity)
+
/datum/outfit/job/ce
name = "Chief Engineer"
jobtype = /datum/job/chief_engineer
diff --git a/code/modules/jobs/job_types/job.dm b/code/modules/jobs/job_types/job.dm
index f678700735..9549b6100c 100644
--- a/code/modules/jobs/job_types/job.dm
+++ b/code/modules/jobs/job_types/job.dm
@@ -56,6 +56,8 @@
var/list/mind_traits // Traits added to the mind of the mob assigned this job
+ var/list/blacklisted_quirks //list of quirk typepaths blacklisted.
+
//Only override this proc
//H is usually a human unless an /equip override transformed it
/datum/job/proc/after_spawn(mob/living/H, mob/M, latejoin = FALSE)
@@ -190,6 +192,16 @@
backpack_contents.Insert(1, box) // Box always takes a first slot in backpack
backpack_contents[box] = 1
+ //converts the uniform string into the path we'll wear, whether it's the skirt or regular variant
+ var/holder
+ if(H.jumpsuit_style == PREF_SKIRT)
+ holder = "[uniform]/skirt"
+ if(!text2path(holder))
+ holder = "[uniform]"
+ else
+ holder = "[uniform]"
+ uniform = text2path(holder)
+
/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
return
diff --git a/code/modules/jobs/job_types/medical.dm b/code/modules/jobs/job_types/medical.dm
index da1f9a7b33..9eeb4ab06e 100644
--- a/code/modules/jobs/job_types/medical.dm
+++ b/code/modules/jobs/job_types/medical.dm
@@ -6,7 +6,7 @@ Chief Medical Officer
flag = CMO_JF
department_head = list("Captain")
department_flag = MEDSCI
- head_announce = list("Medical")
+ head_announce = list(RADIO_CHANNEL_MEDICAL)
faction = "Station"
total_positions = 1
spawn_positions = 1
@@ -27,6 +27,8 @@ Chief Medical Officer
ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE,
ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
+
/datum/outfit/job/cmo
name = "Chief Medical Officer"
jobtype = /datum/job/cmo
diff --git a/code/modules/jobs/job_types/science.dm b/code/modules/jobs/job_types/science.dm
index 6a14f204a3..b58f3faa27 100644
--- a/code/modules/jobs/job_types/science.dm
+++ b/code/modules/jobs/job_types/science.dm
@@ -6,7 +6,7 @@ Research Director
flag = RD_JF
department_head = list("Captain")
department_flag = MEDSCI
- head_announce = list("Science")
+ head_announce = list(RADIO_CHANNEL_SCIENCE)
faction = "Station"
total_positions = 1
spawn_positions = 1
@@ -31,6 +31,8 @@ Research Director
ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM,
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)
+
/datum/outfit/job/rd
name = "Research Director"
jobtype = /datum/job/rd
diff --git a/code/modules/jobs/job_types/security.dm b/code/modules/jobs/job_types/security.dm
index 8d2b9e8681..96cedd89ef 100644
--- a/code/modules/jobs/job_types/security.dm
+++ b/code/modules/jobs/job_types/security.dm
@@ -12,7 +12,7 @@ Head of Security
flag = HOS
department_head = list("Captain")
department_flag = ENGSEC
- head_announce = list("Security")
+ head_announce = list(RADIO_CHANNEL_SECURITY)
faction = "Station"
total_positions = 1
spawn_positions = 1
@@ -37,6 +37,8 @@ Head of Security
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity)
+
/datum/outfit/job/hos
name = "Head of Security"
jobtype = /datum/job/hos
@@ -95,6 +97,7 @@ Warden
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //SEE /DATUM/JOB/WARDEN/GET_ACCESS()
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic)
/datum/job/warden/get_access()
var/list/L = list()
@@ -150,6 +153,7 @@ Detective
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic)
/datum/outfit/job/detective
name = "Detective"
@@ -205,6 +209,7 @@ Security Officer
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) //BUT SEE /DATUM/JOB/WARDEN/GET_ACCESS()
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
+ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic)
/datum/job/officer/get_access()
var/list/L = list()
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 699df5de12..ef58943731 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -343,8 +343,11 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
return ..()
/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user)
- if(density && !(obj_flags & EMAGGED))
- obj_flags |= EMAGGED
+ . = ..()
+ if(!density || obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/computer/libraryconsole/bookmanagement/Topic(href, href_list)
if(..())
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index 86499e694b..4a0faf69f5 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -214,8 +214,11 @@
return ..()
/obj/structure/closet/crate/secure/loot/emag_act(mob/user)
- if(locked)
- boom(user)
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+ if(!locked)
+ return
+ boom(user)
+ return TRUE
/obj/structure/closet/crate/secure/loot/togglelock(mob/user)
if(locked)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 2c35c3148f..23ec02976d 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -43,7 +43,7 @@
name = "explorer gas mask"
desc = "A military-grade gas mask that can be connected to an air supply."
icon_state = "gas_mining"
- visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS
visor_flags_inv = HIDEFACIALHAIR
visor_flags_cover = MASKCOVERSMOUTH
actions_types = list(/datum/action/item_action/adjust)
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index 4a628c5f34..953da6cbb0 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -128,9 +128,12 @@ GLOBAL_LIST(labor_sheet_values)
qdel(src)
/obj/machinery/mineral/labor_claim_console/emag_act(mob/user)
- if(!(obj_flags & EMAGGED))
- obj_flags |= EMAGGED
- to_chat(user, "PZZTTPFFFT")
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ to_chat(user, "PZZTTPFFFT")
+ return TRUE
/**********************Prisoner Collection Unit**************************/
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index abcb6d5911..5990c70813 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -641,6 +641,8 @@
nemesis_factions = list("mining", "boss")
var/transform_cooldown
var/swiping = FALSE
+ total_mass = 2.75
+ total_mass_on = 5
/obj/item/melee/transforming/cleaving_saw/examine(mob/user)
..()
@@ -785,30 +787,30 @@
/obj/item/melee/ghost_sword/process()
ghost_check()
-/obj/item/melee/ghost_sword/proc/ghost_check()
- var/ghost_counter = 0
- var/turf/T = get_turf(src)
- var/list/contents = T.GetAllContents()
- var/mob/dead/observer/current_spirits = list()
- for(var/thing in contents)
- var/atom/A = thing
- A.transfer_observers_to(src)
-
- for(var/i in orbiters?.orbiters)
- if(!isobserver(i))
+/obj/item/melee/ghost_sword/proc/recursive_orbit_collect(atom/A, list/L)
+ for(var/i in A.orbiters?.orbiters)
+ if(!isobserver(i) || (i in L))
continue
+ L |= i
+ recursive_orbit_collect(i, L)
+
+/obj/item/melee/ghost_sword/proc/ghost_check()
+ var/list/mob/dead/observer/current_spirits = list()
+
+ recursive_orbit_collect(src, current_spirits)
+ recursive_orbit_collect(loc, current_spirits) //anything holding us
+
+ for(var/i in spirits - current_spirits)
var/mob/dead/observer/G = i
- ghost_counter++
- G.invisibility = 0
- current_spirits |= G
-
- for(var/mob/dead/observer/G in spirits - current_spirits)
G.invisibility = GLOB.observer_default_invisibility
-
+
+ for(var/i in current_spirits)
+ var/mob/dead/observer/G = i
+ G.invisibility = 0
+
spirits = current_spirits
-
- return ghost_counter
-
+ return length(spirits)
+
/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
force = 0
var/ghost_counter = ghost_check()
@@ -1333,4 +1335,4 @@
if(2)
new /obj/item/wisp_lantern(src)
if(3)
- new /obj/item/prisoncube(src)
\ No newline at end of file
+ new /obj/item/prisoncube(src)
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index a1ba493d46..0abb1cfa9e 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -68,6 +68,7 @@
/obj/machinery/computer/shuttle/mining
name = "mining shuttle console"
desc = "Used to call and send the mining shuttle."
+ req_access = list(ACCESS_MINING)
circuit = /obj/item/circuitboard/computer/mining_shuttle
shuttleId = "mining"
possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public"
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 4ccac5f9d7..750805ae93 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -416,7 +416,7 @@
SSticker.mode.make_antag_chance(humanc)
if(humanc && CONFIG_GET(flag/roundstart_traits))
- SSquirks.AssignQuirks(humanc, humanc.client, TRUE)
+ SSquirks.AssignQuirks(humanc, humanc.client, TRUE, FALSE, job, FALSE)
log_manifest(character.mind.key,character.mind,character,latejoin = TRUE)
@@ -429,7 +429,19 @@
/mob/dead/new_player/proc/LateChoices()
- var/dat = "Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
"
+
+ var/level = "green"
+ switch(GLOB.security_level)
+ if(SEC_LEVEL_BLUE)
+ level = "blue"
+ if(SEC_LEVEL_AMBER)
+ level = "amber"
+ if(SEC_LEVEL_RED)
+ level = "red"
+ if(SEC_LEVEL_DELTA)
+ level = "delta"
+
+ var/dat = "Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
Alert Level: [capitalize(level)]
"
if(SSshuttle.emergency)
switch(SSshuttle.emergency.mode)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index ffe9a800a1..6e91b58506 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -6,11 +6,11 @@
else
gender = pick(MALE,FEMALE)
underwear = random_underwear(gender)
- undie_color = random_color()
+ undie_color = random_short_color()
undershirt = random_undershirt(gender)
- shirt_color = random_color()
+ shirt_color = random_short_color()
socks = random_socks()
- socks_color = random_color()
+ socks_color = random_short_color()
skin_tone = random_skin_tone()
hair_style = random_hair_style(gender)
facial_hair_style = random_facial_hair_style(gender)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
index bf63ea09d7..fb40563ccf 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm
@@ -172,11 +172,13 @@
name = "Tank Top - Midriff"
icon_state = "tank_midriff"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/tanktop_midriff_alt
name = "Tank Top - Midriff Halterneck"
icon_state = "tank_midriff_alt"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/tankstripe
name = "Tank Top - Striped"
@@ -190,100 +192,122 @@
name = "Baby-Doll"
icon_state = "babydoll"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra
name = "Bra"
icon_state = "bra"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_alt
name = "Bra - Alt"
icon_state = "bra_alt"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_thin
name = "Bra - Thin"
icon_state = "bra_thin"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_kinky
name = "Bra - Kinky Black"
icon_state = "bra_kinky"
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_freedom
name = "Bra - Freedom"
icon_state = "bra_assblastusa"
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_commie
name = "Bra - Commie"
icon_state = "bra_commie"
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_beekini
name = "Bra - Bee-kini"
icon_state = "bra_bee-kini"
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_uk
name = "Bra - UK"
icon_state = "bra_uk"
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_neko
name = "Bra - Neko"
icon_state = "bra_neko"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/halterneck_bra
name = "Bra - Halterneck"
icon_state = "halterneck_bra"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/sports_bra
name = "Bra, Sports"
icon_state = "sports_bra"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/sports_bra_alt
name = "Bra, Sports - Alt"
icon_state = "sports_bra_alt"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_strapless
name = "Bra, Strapless"
icon_state = "bra_strapless"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_strapless_alt
name = "Bra, Strapless - Alt"
icon_state = "bra_blue"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/striped_bra
name = "Bra - Striped"
icon_state = "striped_bra"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_sleeves
name = "Fishnet - sleeves"
icon_state = "fishnet_sleeves"
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_gloves
name = "Fishnet - gloves"
icon_state = "fishnet_gloves"
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_base
name = "Fishnet - top"
icon_state = "fishnet_body"
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/swimsuit
name = "Swimsuit Top"
icon_state = "bra_swimming"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/swimsuit_alt
name = "Swimsuit Top - Strapless"
icon_state = "bra_swimming_alt"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/top/tubetop
name = "Tube Top"
icon_state = "tubetop"
- has_color = TRUE
\ No newline at end of file
+ has_color = TRUE
+ gender = FEMALE
\ No newline at end of file
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
index 611547ad4e..3356804cb3 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm
@@ -10,45 +10,55 @@
name = "Mankini"
icon_state = "mankini"
has_color = TRUE
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/male_kinky
name = "Jockstrap"
icon_state = "jockstrap"
has_color = TRUE
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/briefs
name = "Briefs"
icon_state = "briefs"
has_color = TRUE
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/boxers
name = "Boxers"
icon_state = "boxers"
has_color = TRUE
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/male_bee
name = "Boxers - Bee"
icon_state = "bee_shorts"
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/male_hearts
name = "Boxers - Heart"
icon_state = "boxers_heart"
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/male_stripe
name = "Boxers - Striped"
icon_state = "boxers_striped"
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/male_commie
name = "Boxers - Striped Communist"
icon_state = "boxers_commie"
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/male_usastripe
name = "Boxers - Striped Freedom"
icon_state = "boxers_assblastusa"
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/male_uk
name = "Boxers - Striped UK"
icon_state = "boxers_uk"
+ gender = MALE
/datum/sprite_accessory/underwear/bottom/boxer_briefs
name = "Boxer Briefs"
@@ -59,60 +69,73 @@
name = "Panties"
icon_state = "panties"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/panties_alt
name = "Panties - Alt"
icon_state = "panties_alt"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/fishnet_lower
name = "Panties - Fishnet"
icon_state = "fishnet_lower"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/female_beekini
name = "Panties - Bee-kini"
icon_state = "panties_bee-kini"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/female_commie
name = "Panties - Commie"
icon_state = "panties_commie"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/female_usastripe
name = "Panties - Freedom"
icon_state = "panties_assblastusa"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/female_kinky
name = "Panties - Kinky Black"
icon_state = "panties_kinky"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/panties_uk
name = "Panties - UK"
icon_state = "panties_uk"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/panties_neko
name = "Panties - Neko"
icon_state = "panties_neko"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/panties_slim
name = "Panties - Slim"
icon_state = "panties_slim"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/striped_panties
name = "Panties - Striped"
icon_state = "striped_panties"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/panties_swimsuit
name = "Panties - Swimsuit"
icon_state = "panties_swimming"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/panties_thin
name = "Panties - Thin"
icon_state = "panties_thin"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/longjon
name = "Long John Bottoms"
@@ -122,23 +145,28 @@
/datum/sprite_accessory/underwear/bottom/swimsuit_red
name = "Swimsuit, One Piece - Red"
icon_state = "swimming_red"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/swimsuit
name = "Swimsuit, One Piece - Black"
icon_state = "swimming_black"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/swimsuit_blue
name = "Swimsuit, One Piece - Striped Blue"
icon_state = "swimming_blue"
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/thong
name = "Thong"
icon_state = "thong"
has_color = TRUE
+ gender = FEMALE
/datum/sprite_accessory/underwear/bottom/thong_babydoll
name = "Thong - Alt"
icon_state = "thong_babydoll"
has_color = TRUE
+ gender = FEMALE
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index d521ef179f..7eeab05466 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -4,14 +4,14 @@
return
var/message_mode = get_message_mode(message)
- if(client && (message_mode == "admin" || message_mode == "deadmin"))
+ if(client && (message_mode == MODE_ADMIN || message_mode == MODE_DEADMIN))
message = copytext(message, 3)
if(findtext(message, " ", 1, 2))
message = copytext(message, 2)
- if(message_mode == "admin")
+ if(message_mode == MODE_ADMIN)
client.cmd_admin_say(message)
- else if(message_mode == "deadmin")
+ else if(message_mode == MODE_DEADMIN)
client.dsay(message)
return
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 8403d533c4..edf0fde83e 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -91,7 +91,7 @@
else
return initial(pixel_x)
-/mob/living/carbon/alien/humanoid/get_permeability_protection()
+/mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones)
return 0.8
/mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index e1a7752e9d..d2788075e2 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -59,15 +59,19 @@
/mob/living/carbon/alien/humanoid/update_inv_handcuffed()
remove_overlay(HANDCUFF_LAYER)
- var/cuff_icon = "aliencuff"
- var/dmi_file = 'icons/mob/alien.dmi'
-
- if(mob_size == MOB_SIZE_LARGE)
- cuff_icon = "aliencuff_[caste]"
- dmi_file = 'icons/mob/alienqueen.dmi'
if(handcuffed)
- overlays_standing[HANDCUFF_LAYER] = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER)
+ var/cuff_icon = handcuffed.item_state
+ var/dmi_file = 'icons/mob/alien.dmi'
+
+ if(mob_size == MOB_SIZE_LARGE)
+ cuff_icon += "_[caste]"
+ dmi_file = 'icons/mob/alienqueen.dmi'
+
+ var/mutable_appearance/cuffs = mutable_appearance(dmi_file, cuff_icon, -HANDCUFF_LAYER)
+ cuffs.color = handcuffed.color
+
+ overlays_standing[HANDCUFF_LAYER] = cuffs
apply_overlay(HANDCUFF_LAYER)
//Royals have bigger sprites, so inhand things must be handled differently.
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index b4739f943e..1574305a83 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -63,7 +63,7 @@
-/obj/item/organ/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success=TRUE)
+/obj/item/organ/body_egg/alien_embryo/proc/AttemptGrow(var/kill_on_sucess=TRUE)
if(!owner || bursting)
return
@@ -102,10 +102,12 @@
new_xeno.notransform = 0
new_xeno.invisibility = 0
- if(gib_on_success)
- new_xeno.visible_message("[new_xeno] bursts out of [owner] in a shower of gore!", "You exit [owner], your previous host.", "You hear organic matter ripping and tearing!")
- owner.gib(TRUE)
- else
+ if(kill_on_sucess) //ITS TOO LATE
+ new_xeno.visible_message("[new_xeno] bursts out of [owner]!", "You exit [owner], your previous host.", "You hear organic matter ripping and tearing!")
+ owner.apply_damage(rand(100,300),BRUTE,zone,FALSE) //Random high damage to torso so health sensors don't metagame.
+ owner.spill_organs(TRUE,FALSE,TRUE) //Lets still make the death gruesome and impossible to just simply defib someone.
+ owner.death(FALSE) //Just in case some freak occurance occurs where you somehow survive all your organs being removed from you and the 100-300 brute damage.
+ else //When it is removed via surgery at a late stage, rather than forced.
new_xeno.visible_message("[new_xeno] wriggles out of [owner]!", "You exit [owner], your previous host.")
owner.adjustBruteLoss(40)
owner.cut_overlay(overlay)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index c2c8904aa1..e66d70f492 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -15,7 +15,7 @@
icon_state = "facehugger"
item_state = "facehugger"
w_class = WEIGHT_CLASS_TINY //note: can be picked up by aliens unlike most other items of w_class below 4
- clothing_flags = MASKINTERNALS
+ clothing_flags = ALLOWINTERNALS
throw_range = 5
tint = 3
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
@@ -33,16 +33,18 @@
/obj/item/clothing/mask/facehugger/lamarr
name = "Lamarr"
- sterile = 1
+ sterile = TRUE
/obj/item/clothing/mask/facehugger/dead
icon_state = "facehugger_dead"
item_state = "facehugger_inactive"
+ sterile = TRUE
stat = DEAD
/obj/item/clothing/mask/facehugger/impregnated
icon_state = "facehugger_impregnated"
item_state = "facehugger_impregnated"
+ sterile = TRUE
stat = DEAD
/obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 9b494c3daf..9acecea545 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -239,7 +239,7 @@
if(href_list["internal"])
var/slot = text2num(href_list["internal"])
var/obj/item/ITEM = get_item_by_slot(slot)
- if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & MASKINTERNALS))
+ if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS))
visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \
"[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].")
if(do_mob(usr, src, POCKET_STRIP_DELAY))
@@ -247,7 +247,7 @@
internal = null
update_internals_hud_icon(0)
else if(ITEM && istype(ITEM, /obj/item/tank))
- if((wear_mask && (wear_mask.clothing_flags & MASKINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE))
+ if((wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE))
internal = ITEM
update_internals_hud_icon(1)
@@ -637,6 +637,18 @@
else
. += INFINITY
+/mob/living/carbon/get_permeability_protection(list/target_zones = list(HANDS,CHEST,GROIN,LEGS,FEET,ARMS,HEAD))
+ var/list/tally = list()
+ for(var/obj/item/I in get_equipped_items())
+ for(var/zone in target_zones)
+ if(I.body_parts_covered & zone)
+ tally["[zone]"] = max(1 - I.permeability_coefficient, target_zones["[zone]"])
+ var/protection = 0
+ for(var/key in tally)
+ protection += tally[key]
+ protection *= INVERSE(target_zones.len)
+ return protection
+
//this handles hud updates
/mob/living/carbon/update_damage_hud()
@@ -690,9 +702,10 @@
clear_fullscreen("critvision")
//Oxygen damage overlay
- if(oxyloss)
+ var/windedup = getOxyLoss() + getStaminaLoss() * 0.2
+ if(windedup)
var/severity = 0
- switch(oxyloss)
+ switch(windedup)
if(10 to 20)
severity = 1
if(20 to 25)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index f782289e18..794194b3a1 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -11,8 +11,8 @@
var/silent = FALSE //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
var/dreaming = 0 //How many dream images we have left to send
- var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
- var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+ var/obj/item/restraints/handcuffed //Whether or not the mob is handcuffed
+ var/obj/item/restraints/legcuffed //Same as handcuffs but for legs. Bear traps use this.
var/disgust = 0
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 2fa98c59de..5b224444e0 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -281,6 +281,13 @@
if(91.01 to INFINITY)
msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
+ if(reagents.has_reagent("astral"))
+ msg += "[t_He] have wild, spacey eyes"
+ if(mind)
+ msg += " and have a strange, abnormal look to them.\n"
+ else
+ msg += " and don't look like they're all there.\n"
+
if(isliving(user))
var/mob/living/L = user
if(src != user && HAS_TRAIT(L, TRAIT_EMPATH) && !appears_dead)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 57dd1af749..528b55c921 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -623,6 +623,7 @@
facial_hair_style = "Shaved"
hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
underwear = "Nude"
+ undershirt = "Nude"
update_body()
update_hair()
update_genitals()
@@ -811,6 +812,8 @@
for(var/datum/mutation/human/HM in dna.mutations)
if(HM.quality != POSITIVE)
dna.remove_mutation(HM.name)
+ if(blood_volume < (BLOOD_VOLUME_NORMAL*blood_ratio))
+ blood_volume = (BLOOD_VOLUME_NORMAL*blood_ratio)
..()
/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker)
@@ -899,12 +902,9 @@
stop_pulling()
/mob/living/carbon/human/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this
- var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor)
- for(var/bp in body_parts)
- if(istype(bp, /obj/item/clothing))
- var/obj/item/clothing/C = bp
- if(C.blocks_shove_knockdown)
- return TRUE
+ for(var/obj/item/clothing/C in get_equipped_items()) //doesn't include pockets
+ if(C.blocks_shove_knockdown)
+ return TRUE
return FALSE
/mob/living/carbon/human/proc/clear_shove_slowdown()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index b42346382f..ff4878aa13 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -27,7 +27,7 @@
for(var/bp in body_parts)
if(!bp)
continue
- if(bp && istype(bp , /obj/item/clothing))
+ if(istype(bp, /obj/item/clothing))
var/obj/item/clothing/C = bp
if(C.body_parts_covered & def_zone.body_part)
protection += C.armor.getRating(d_type)
@@ -654,6 +654,7 @@
if(health >= 0)
if(src == M)
+ var/to_send = ""
visible_message("[src] examines [p_them()]self.", \
"You check yourself for injuries.")
@@ -700,53 +701,55 @@
var/no_damage
if(status == "OK" || status == "no damage")
no_damage = TRUE
- to_chat(src, "\t Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].")
+ to_send += "\t Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n"
for(var/obj/item/I in LB.embedded_objects)
- to_chat(src, "\t There is \a [I] embedded in your [LB.name]!")
+ to_send += "\t There is \a [I] embedded in your [LB.name]!\n"
for(var/t in missing)
- to_chat(src, "Your [parse_zone(t)] is missing!")
+ to_send += "Your [parse_zone(t)] is missing!\n"
if(bleed_rate)
- to_chat(src, "You are bleeding!")
+ to_send += "You are bleeding!\n"
if(getStaminaLoss())
if(getStaminaLoss() > 30)
- to_chat(src, "You're completely exhausted.")
+ to_send += "You're completely exhausted.\n"
else
- to_chat(src, "You feel fatigued.")
+ to_send += "You feel fatigued.\n"
if(HAS_TRAIT(src, TRAIT_SELF_AWARE))
if(toxloss)
if(toxloss > 10)
- to_chat(src, "You feel sick.")
+ to_send += "You feel sick.\n"
else if(toxloss > 20)
- to_chat(src, "You feel nauseated.")
+ to_send += "You feel nauseated.\n"
else if(toxloss > 40)
- to_chat(src, "You feel very unwell!")
+ to_send += "You feel very unwell!\n"
if(oxyloss)
if(oxyloss > 10)
- to_chat(src, "You feel lightheaded.")
+ to_send += "You feel lightheaded.\n"
else if(oxyloss > 20)
- to_chat(src, "Your thinking is clouded and distant.")
+ to_send += "Your thinking is clouded and distant.\n"
else if(oxyloss > 30)
- to_chat(src, "You're choking!")
+ to_send += "You're choking!\n"
switch(nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
- to_chat(src, "You're completely stuffed!")
+ to_send += "You're completely stuffed!\n"
if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL)
- to_chat(src, "You're well fed!")
+ to_send += "You're well fed!\n"
if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED)
- to_chat(src, "You're not hungry.")
+ to_send += "You're not hungry.\n"
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED)
- to_chat(src, "You could use a bite to eat.")
+ to_send += "You could use a bite to eat.\n"
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
- to_chat(src, "You feel quite hungry.")
+ to_send += "You feel quite hungry.\n"
if(0 to NUTRITION_LEVEL_STARVING)
- to_chat(src, "You're starving!")
+ to_send += "You're starving!\n"
if(roundstart_quirks.len)
- to_chat(src, "You have these quirks: [get_trait_string()].")
+ to_send += "You have these quirks: [get_trait_string()].\n"
+
+ to_chat(src, to_send)
else
if(wear_suit)
wear_suit.add_fingerprint(M)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 08aeed8d74..35b0384145 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -25,12 +25,13 @@
var/age = 30 //Player's age
var/underwear = "Nude" //Which underwear the player wants
- var/undie_color = "#FFFFFF"
+ var/undie_color = "FFFFFF"
var/undershirt = "Nude" //Which undershirt the player wants
- var/shirt_color = "#FFFFFF"
+ var/shirt_color = "FFFFFF"
var/socks = "Nude" //Which socks the player wants
- var/socks_color = "#FFFFFF"
+ var/socks_color = "FFFFFF"
var/backbag = DBACKPACK //Which backpack type the player has chosen.
+ var/jumpsuit_style = PREF_SUIT //suit/skirt
//Equipment slots
var/obj/item/wear_suit = null
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 0b40d3d26a..b65d62b63b 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -111,26 +111,6 @@
return ..()
-/mob/living/carbon/human/get_permeability_protection()
- var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0)
- for(var/obj/item/I in get_equipped_items())
- if(I.body_parts_covered & HANDS)
- prot["hands"] = max(1 - I.permeability_coefficient, prot["hands"])
- if(I.body_parts_covered & CHEST)
- prot["chest"] = max(1 - I.permeability_coefficient, prot["chest"])
- if(I.body_parts_covered & GROIN)
- prot["groin"] = max(1 - I.permeability_coefficient, prot["groin"])
- if(I.body_parts_covered & LEGS)
- prot["legs"] = max(1 - I.permeability_coefficient, prot["legs"])
- if(I.body_parts_covered & FEET)
- prot["feet"] = max(1 - I.permeability_coefficient, prot["feet"])
- if(I.body_parts_covered & ARMS)
- prot["arms"] = max(1 - I.permeability_coefficient, prot["arms"])
- if(I.body_parts_covered & HEAD)
- prot["head"] = max(1 - I.permeability_coefficient, prot["head"])
- var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7
- return protection
-
/mob/living/carbon/human/can_use_guns(obj/item/G)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 176d967d52..d35df6b789 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -167,9 +167,9 @@
dropItemToGround(r_store, TRUE) //Again, makes sense for pockets to drop.
if(l_store)
dropItemToGround(l_store, TRUE)
- if(wear_id)
+ if(wear_id && !CHECK_BITFIELD(wear_id.item_flags, NO_UNIFORM_REQUIRED))
dropItemToGround(wear_id)
- if(belt)
+ if(belt && !CHECK_BITFIELD(belt.item_flags, NO_UNIFORM_REQUIRED))
dropItemToGround(belt)
w_uniform = null
update_suit_sensors()
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 56be62c75e..eee425063d 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -53,14 +53,14 @@
if(ears)
var/obj/item/radio/headset/dongle = ears
if(!istype(dongle))
- return 0
+ return FALSE
if(dongle.translate_binary)
- return 1
+ return TRUE
/mob/living/carbon/human/radio(message, message_mode, list/spans, language)
. = ..()
- if(. != 0)
- return .
+ if(.)
+ return
switch(message_mode)
if(MODE_HEADSET)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 76d8a10474..0f83e675fc 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -500,7 +500,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(B)
var/mutable_appearance/MA = mutable_appearance(B.icon, B.icon_state, -BODY_LAYER)
if(UNDIE_COLORABLE(B))
- MA.color = H.undie_color
+ MA.color = "#[H.undie_color]"
standing += MA
if(H.undershirt)
@@ -516,7 +516,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
MA = mutable_appearance(T.icon, T.icon_state, -BODY_LAYER)
if(UNDIE_COLORABLE(T))
- MA.color = H.shirt_color
+ MA.color = "#[H.shirt_color]"
standing += MA
if(H.socks && H.get_num_legs(FALSE) >= 2)
@@ -529,7 +529,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/digilegs = (DIGITIGRADE in species_traits) ? "_d" : ""
var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER)
if(UNDIE_COLORABLE(S))
- MA.color = H.socks_color
+ MA.color = "#[H.socks_color]"
standing += MA
if(standing.len)
@@ -1019,13 +1019,12 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(SLOT_BELT)
if(H.belt)
return FALSE
-
- var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
-
- if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
- if(!disable_warning)
- to_chat(H, "You need a jumpsuit before you can attach this [I.name]!")
- return FALSE
+ if(!CHECK_BITFIELD(I.item_flags, NO_UNIFORM_REQUIRED))
+ var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
+ if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
+ if(!disable_warning)
+ to_chat(H, "You need a jumpsuit before you can attach this [I.name]!")
+ return FALSE
if(!(I.slot_flags & ITEM_SLOT_BELT))
return
return equip_delay_self_check(I, H, bypass_equip_delay_self)
@@ -1062,12 +1061,12 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(SLOT_WEAR_ID)
if(H.wear_id)
return FALSE
-
- var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
- if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
- if(!disable_warning)
- to_chat(H, "You need a jumpsuit before you can attach this [I.name]!")
- return FALSE
+ if(!CHECK_BITFIELD(I.item_flags, NO_UNIFORM_REQUIRED))
+ var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST)
+ if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC))
+ if(!disable_warning)
+ to_chat(H, "You need a jumpsuit before you can attach this [I.name]!")
+ return FALSE
if( !(I.slot_flags & ITEM_SLOT_ID) )
return FALSE
return equip_delay_self_check(I, H, bypass_equip_delay_self)
@@ -1697,7 +1696,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.stat == CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma.
var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev)
- var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang/)
+ var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang && !/datum/antagonist/gang/boss)
if(rev)
rev.remove_revolutionary(FALSE, user)
if(gang)
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 2c663b4094..88dd59749c 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -420,7 +420,7 @@
H.visible_message("[H] teleports!", "You destabilize and teleport!")
new /obj/effect/particle_effect/sparks(get_turf(H))
playsound(get_turf(H), "sparks", 50, 1)
- do_teleport(H, get_turf(H), 6, asoundin = 'sound/weapons/emitter2.ogg')
+ do_teleport(H, get_turf(H), 6, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
last_teleport = world.time
/datum/species/golem/bluespace/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
@@ -486,7 +486,7 @@
spark_system.set_up(10, 0, src)
spark_system.attach(H)
spark_system.start()
- do_teleport(H, get_turf(H), 12, asoundin = 'sound/weapons/emitter2.ogg')
+ do_teleport(H, get_turf(H), 12, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
last_teleport = world.time
UpdateButtonIcon() //action icon looks unavailable
sleep(cooldown + 5)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index cb7be656f9..66586744fb 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -14,7 +14,8 @@
damage_overlay_type = ""
var/datum/action/innate/regenerate_limbs/regenerate_limbs
var/datum/action/innate/slime_change/slime_change //CIT CHANGE
- liked_food = MEAT
+ liked_food = TOXIC | MEAT
+ toxic_food = null
coldmod = 6 // = 3x cold damage
heatmod = 0.5 // = 1/4x heat damage
burnmod = 0.5 // = 1/2x generic burn damage
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 11a25cea6c..754c48c3bd 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -174,6 +174,7 @@
item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/light_eater/Initialize()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index 5c20b0ce75..49121c9409 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -3,7 +3,7 @@
amount = dna.species.spec_stun(src,amount)
return ..()
-/mob/living/carbon/human/Knockdown(amount, updating = 1, ignore_canknockdown = 0)
+/mob/living/carbon/human/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg)
amount = dna.species.spec_stun(src,amount)
return ..()
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index feb80e8d2c..72ff7e7a60 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -288,8 +288,10 @@ There are several things that need to be remembered:
S.alternate_worn_icon = 'modular_citadel/icons/mob/digishoes.dmi'
else
S.alternate_worn_icon = null
-
- overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = ((shoes.alternate_worn_icon) ? shoes.alternate_worn_icon : 'icons/mob/feet.dmi'))
+ var/t_state = shoes.item_state
+ if (!t_state)
+ t_state = shoes.icon_state
+ overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = t_state, default_layer = SHOES_LAYER, default_icon_file = ((shoes.alternate_worn_icon) ? shoes.alternate_worn_icon : 'icons/mob/feet.dmi'))
var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER]
if(OFFSET_SHOES in dna.species.offset_features)
shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1]
@@ -377,13 +379,16 @@ There are several things that need to be remembered:
if(wear_suit)
var/obj/item/clothing/suit/S = wear_suit
+ var/no_taur_thanks = FALSE
+ if(!istype(S))
+ no_taur_thanks = TRUE
wear_suit.screen_loc = ui_oclothing
if(client && hud_used && hud_used.hud_shown)
if(hud_used.inventory_shown)
client.screen += wear_suit
update_observer_view(wear_suit,1)
- if(S.mutantrace_variation) //Just make sure we've got this checked too
+ if(!no_taur_thanks && S.mutantrace_variation) //Just make sure we've got this checked too
if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) //are we not a taur, but we have Digitigrade legs? Run this check first, then.
S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi'
else
@@ -404,7 +409,7 @@ There are several things that need to be remembered:
if(OFFSET_SUIT in dna.species.offset_features)
suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1]
suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2]
- if(S.center)
+ if(!no_taur_thanks && S.center)
suit_overlay = center_image(suit_overlay, S.dimension_x, S.dimension_y)
overlays_standing[SUIT_LAYER] = suit_overlay
update_hair()
@@ -468,14 +473,6 @@ There are several things that need to be remembered:
overlays_standing[BACK_LAYER] = back_overlay
apply_overlay(BACK_LAYER)
-/mob/living/carbon/human/update_inv_legcuffed()
- remove_overlay(LEGCUFF_LAYER)
- clear_alert("legcuffed")
- if(legcuffed)
- overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER)
- apply_overlay(LEGCUFF_LAYER)
- throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed)
-
/proc/wear_female_version(t_color, icon, layer, type)
var/index = t_color
var/icon/female_clothing_icon = GLOB.female_clothing_icons[index]
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 06338e5218..36e4e18817 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -307,11 +307,17 @@
return
/mob/living/carbon/proc/get_breath_from_internal(volume_needed)
+ var/obj/item/clothing/check
+ var/internals = FALSE
+
+ for(check in GET_INTERNAL_SLOTS(src))
+ if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
+ internals = TRUE
if(internal)
if(internal.loc != src)
internal = null
update_internals_hud_icon(0)
- else if ((!wear_mask || !(wear_mask.clothing_flags & MASKINTERNALS)) && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
+ else if (!internals && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
internal = null
update_internals_hud_icon(0)
else
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index f1a6b58cd1..f9c2e2dd3d 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -152,15 +152,6 @@
return threatcount
-/mob/living/carbon/monkey/get_permeability_protection()
- var/protection = 0
- if(head)
- protection = 1 - head.permeability_coefficient
- if(wear_mask)
- protection = max(1 - wear_mask.permeability_coefficient, protection)
- protection = protection/7 //the rest of the body isn't covered.
- return protection
-
/mob/living/carbon/monkey/IsVocal()
if(!getorganslot(ORGAN_SLOT_LUNGS))
return 0
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
index 6311776596..e9bb9fc207 100644
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ b/code/modules/mob/living/carbon/monkey/update_icons.dm
@@ -43,12 +43,15 @@
/mob/living/carbon/monkey/update_inv_legcuffed()
remove_overlay(LEGCUFF_LAYER)
+ clear_alert("legcuffed")
if(legcuffed)
- var/mutable_appearance/legcuff_overlay = mutable_appearance('icons/mob/mob.dmi', "legcuff1", -LEGCUFF_LAYER)
- legcuff_overlay.pixel_y = 8
- overlays_standing[LEGCUFF_LAYER] = legcuff_overlay
- apply_overlay(LEGCUFF_LAYER)
+ var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER)
+ legcuffs.color = handcuffed.color
+ legcuffs.pixel_y = 8
+ overlays_standing[HANDCUFF_LAYER] = legcuffs
+ apply_overlay(LEGCUFF_LAYER)
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
//monkey HUD updates for items in our inventory
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 87bf662c4f..5662f25993 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -176,9 +176,22 @@
/mob/living/carbon/update_inv_handcuffed()
remove_overlay(HANDCUFF_LAYER)
if(handcuffed)
- overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "handcuff1", -HANDCUFF_LAYER)
+ var/mutable_appearance/cuffs = mutable_appearance('icons/mob/restraints.dmi', handcuffed.item_state, -HANDCUFF_LAYER)
+ cuffs.color = handcuffed.color
+
+ overlays_standing[HANDCUFF_LAYER] = cuffs
apply_overlay(HANDCUFF_LAYER)
+/mob/living/carbon/update_inv_legcuffed()
+ remove_overlay(LEGCUFF_LAYER)
+ clear_alert("legcuffed")
+ if(legcuffed)
+ var/mutable_appearance/legcuffs = mutable_appearance('icons/mob/restraints.dmi', legcuffed.item_state, -LEGCUFF_LAYER)
+ legcuffs.color = legcuffed.color
+
+ overlays_standing[HANDCUFF_LAYER] = legcuffs
+ apply_overlay(LEGCUFF_LAYER)
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
//mob HUD updates for items in our inventory
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index c322de21f6..19f18f9973 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -636,14 +636,15 @@
else if(canmove)
if(on_fire)
resist_fire() //stop, drop, and roll
- else if(resting) //cit change - allows resisting out of resting
+ return
+ if(resting) //cit change - allows resisting out of resting
resist_a_rest() // ditto
- else if(iscarbon(src)) //Citadel Change for embedded removal memes
- var/mob/living/carbon/C = src
- if(!C.handcuffed && !C.legcuffed)
- return TRUE
- else if(last_special <= world.time)
+ return
+ if(resist_embedded()) //Citadel Change for embedded removal memes
+ return
+ if(last_special <= world.time)
resist_restraints() //trying to remove cuffs.
+ return
/mob/proc/resist_grab(moving_resist)
@@ -823,7 +824,7 @@
return 1
//used in datum/reagents/reaction() proc
-/mob/living/proc/get_permeability_protection()
+/mob/living/proc/get_permeability_protection(list/target_zones)
return 0
/mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 6c9c6eb1a1..3b045b9eee 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -2,61 +2,61 @@ GLOBAL_LIST_INIT(department_radio_prefixes, list(":", "."))
GLOBAL_LIST_INIT(department_radio_keys, list(
// Location
- "r" = "right hand",
- "l" = "left hand",
- "i" = "intercom",
+ MODE_KEY_R_HAND = MODE_R_HAND,
+ MODE_KEY_L_HAND = MODE_L_HAND,
+ MODE_KEY_INTERCOM = MODE_INTERCOM,
// Department
- "h" = "department",
- "c" = "Command",
- "n" = "Science",
- "m" = "Medical",
- "e" = "Engineering",
- "s" = "Security",
- "u" = "Supply",
- "v" = "Service",
+ MODE_KEY_DEPARTMENT = MODE_DEPARTMENT,
+ RADIO_KEY_COMMAND = RADIO_CHANNEL_COMMAND,
+ RADIO_KEY_SCIENCE = RADIO_CHANNEL_SCIENCE,
+ RADIO_KEY_MEDICAL = RADIO_CHANNEL_MEDICAL,
+ RADIO_KEY_ENGINEERING = RADIO_CHANNEL_ENGINEERING,
+ RADIO_KEY_SECURITY = RADIO_CHANNEL_SECURITY,
+ RADIO_KEY_SUPPLY = RADIO_CHANNEL_SUPPLY,
+ RADIO_KEY_SERVICE = RADIO_CHANNEL_SERVICE,
// Faction
- "t" = "Syndicate",
- "y" = "CentCom",
+ RADIO_KEY_SYNDICATE = RADIO_CHANNEL_SYNDICATE,
+ RADIO_KEY_CENTCOM = RADIO_CHANNEL_CENTCOM,
// Admin
- "p" = "admin",
- "d" = "deadmin",
+ MODE_KEY_ADMIN = MODE_ADMIN,
+ MODE_KEY_DEADMIN = MODE_DEADMIN,
// Misc
- "o" = "AI Private", // AI Upload channel
- "x" = "cords", // vocal cords, used by Voice of God
+ RADIO_KEY_AI_PRIVATE = RADIO_CHANNEL_AI_PRIVATE, // AI Upload channel
+ MODE_KEY_VOCALCORDS = MODE_VOCALCORDS, // vocal cords, used by Voice of God
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
// Location
- "ê" = "right hand",
- "ä" = "left hand",
- "ø" = "intercom",
+ "ê" = MODE_R_HAND,
+ "ä" = MODE_L_HAND,
+ "ø" = MODE_INTERCOM,
// Department
- "ð" = "department",
- "ñ" = "Command",
- "ò" = "Science",
- "ü" = "Medical",
- "ó" = "Engineering",
- "û" = "Security",
- "ã" = "Supply",
- "ì" = "Service",
+ "ð" = MODE_DEPARTMENT,
+ "ñ" = RADIO_CHANNEL_COMMAND,
+ "ò" = RADIO_CHANNEL_SCIENCE,
+ "ü" = RADIO_CHANNEL_MEDICAL,
+ "ó" = RADIO_CHANNEL_ENGINEERING,
+ "û" = RADIO_CHANNEL_SECURITY,
+ "ã" = RADIO_CHANNEL_SUPPLY,
+ "ì" = RADIO_CHANNEL_SERVICE,
// Faction
- "å" = "Syndicate",
- "í" = "CentCom",
+ "å" = RADIO_CHANNEL_SYNDICATE,
+ "í" = RADIO_CHANNEL_CENTCOM,
// Admin
- "ç" = "admin",
- "â" = "deadmin",
+ "ç" = MODE_ADMIN,
+ "â" = MODE_ADMIN,
// Misc
- "ù" = "AI Private",
- "÷" = "cords"
+ "ù" = RADIO_CHANNEL_AI_PRIVATE,
+ "÷" = MODE_VOCALCORDS
))
/mob/living/proc/Ellipsis(original_msg, chance = 50, keep_words)
@@ -105,12 +105,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(findtext(message, " ", 1, 2))
message = copytext(message, 2)
- if(message_mode == "admin")
+ if(message_mode == MODE_ADMIN)
if(client)
client.cmd_admin_say(message)
return
- if(message_mode == "deadmin")
+ if(message_mode == MODE_DEADMIN)
if(client)
client.dsay(message)
return
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index 4ac5c1f0bb..c6d4527812 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -100,6 +100,8 @@
last_announcement = message
+ var/voxType = input(src, "Male or female VOX?", "VOX-gender") in list("male", "female")
+
if(!message || announcing_vox > world.time)
return
@@ -121,7 +123,9 @@
if(!word)
words -= word
continue
- if(!GLOB.vox_sounds[word])
+ if(!GLOB.vox_sounds[word] && voxType == "female")
+ incorrect_words += word
+ if(!GLOB.vox_sounds_male[word] && voxType == "male")
incorrect_words += word
if(incorrect_words.len)
@@ -133,16 +137,21 @@
log_game("[key_name(src)] made a vocal announcement with the following message: [message].")
for(var/word in words)
- play_vox_word(word, src.z, null)
+ play_vox_word(word, src.z, null, voxType)
-/proc/play_vox_word(word, z_level, mob/only_listener)
+/proc/play_vox_word(word, z_level, mob/only_listener, voxType = "female")
word = lowertext(word)
- if(GLOB.vox_sounds[word])
+ if( (GLOB.vox_sounds[word] && voxType == "female") || (GLOB.vox_sounds_male[word] && voxType == "male") )
- var/sound_file = GLOB.vox_sounds[word]
+ var/sound_file
+
+ if(voxType == "female")
+ sound_file = GLOB.vox_sounds[word]
+ else
+ sound_file = GLOB.vox_sounds_male[word]
var/sound/voice = sound(sound_file, wait = 1, channel = CHANNEL_VOX)
voice.status = SOUND_STREAM
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index c90c719e8a..0f09b6f62a 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -92,17 +92,18 @@
/mob/living/silicon/robot/emag_act(mob/user)
if(user == src)//To prevent syndieborgs from emagging themselves
- return
+ return FALSE
+ if(world.time < emag_cooldown)
+ return FALSE
+ . = ..()
if(!opened)//Cover is closed
if(locked)
to_chat(user, "You emag the cover lock.")
locked = FALSE
if(shell) //A warning to Traitors who may not know that emagging AI shells does not slave them.
to_chat(user, "[src] seems to be controlled remotely! Emagging the interface may not work as expected.")
- else
- to_chat(user, "The cover is already unlocked!")
- return
- if(world.time < emag_cooldown)
+ return TRUE
+ to_chat(user, "The cover is already unlocked!")
return
if(wiresexposed)
to_chat(user, "You must unexpose the wires first!")
@@ -115,20 +116,24 @@
to_chat(src, "\"[text2ratvar("You will serve Engine above all else")]!\"\n\
ALERT: Subversion attempt denied.")
log_game("[key_name(user)] attempted to emag cyborg [key_name(src)], but they serve only Ratvar.")
- return
+ return TRUE
if(connected_ai && connected_ai.mind && connected_ai.mind.has_antag_datum(/datum/antagonist/traitor))
to_chat(src, "ALERT: Foreign software execution prevented.")
to_chat(connected_ai, "ALERT: Cyborg unit \[[src]] successfully defended against subversion.")
log_game("[key_name(user)] attempted to emag cyborg [key_name(src)], but they were slaved to traitor AI [connected_ai].")
- return
+ return TRUE
if(shell) //AI shells cannot be emagged, so we try to make it look like a standard reset. Smart players may see through this, however.
to_chat(user, "[src] is remotely controlled! Your emag attempt has triggered a system reset instead!")
log_game("[key_name(user)] attempted to emag an AI shell belonging to [key_name(src) ? key_name(src) : connected_ai]. The shell has been reset as a result.")
ResetModule()
- return
+ return TRUE
+ INVOKE_ASYNC(src, .proc/beep_boop_rogue_bot, user)
+ return TRUE
+
+/mob/living/silicon/robot/proc/beep_boop_rogue_bot(mob/user)
SetEmagged(1)
SetStun(60) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown
lawupdate = 0
diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm
index bf0c1f8fd8..9bac53ef22 100644
--- a/code/modules/mob/living/simple_animal/astral.dm
+++ b/code/modules/mob/living/simple_animal/astral.dm
@@ -22,6 +22,7 @@
speak_emote = list("echos")
movement_type = FLYING
var/pseudo_death = FALSE
+ var/posses_safe = FALSE
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)
unsuitable_atmos_damage = 0
minbodytemp = 0
@@ -40,6 +41,17 @@
..()
if(pseudo_death == FALSE)
if(isliving(A))
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(H.reagents.has_reagent("astral") && !H.mind)
+ var/datum/reagent/fermi/astral/As = locate(/datum/reagent/fermi/astral) in H.reagents.reagent_list
+ if(As.originalmind == src.mind && As.current_cycle < 10 && H.stat != DEAD) //So you can return to your body.
+ to_chat(src, "The intensity of the astrogen in your body is too much allow you to return to yourself yet!")
+ return
+ to_chat(src, "You astrally possess [H]!")
+ log_game("FERMICHEM: [src] has astrally possessed [A]!")
+ src.mind.transfer_to(H)
+ qdel(src)
var/message = html_decode(stripped_input(src, "Enter a message to send to [A]", MAX_MESSAGE_LEN))
if(!message)
return
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index ce99e301c5..49261d6e38 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -61,7 +61,7 @@
var/mob/living/silicon/ai/calling_ai //Links a bot to the AI calling it.
var/obj/item/radio/Radio //The bot's radio, for speaking to people.
var/radio_key = null //which channels can the bot listen to
- var/radio_channel = "Common" //The bot's default radio channel
+ var/radio_channel = RADIO_CHANNEL_COMMON //The bot's default radio channel
var/auto_patrol = 0// set to make bot automatically patrol
var/turf/patrol_target // this is turf to navigate to (location of beacon)
var/turf/summon_target // The turf of a user summoning a bot.
@@ -187,22 +187,23 @@
qdel(src)
/mob/living/simple_animal/bot/emag_act(mob/user)
+ . = ..()
if(locked) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again.
locked = FALSE
emagged = 1
to_chat(user, "You bypass [src]'s controls.")
- return
- if(!locked && open) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging.
- emagged = 2
- remote_disabled = 1 //Manually emagging the bot locks out the AI built in panel.
- locked = TRUE //Access denied forever!
- bot_reset()
- turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP.
- to_chat(src, "(#$*#$^^( OVERRIDE DETECTED")
- log_combat(user, src, "emagged")
- return
- else //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet.
+ return TRUE
+ if(!open)
to_chat(user, "You need to open maintenance panel first!")
+ return
+ emagged = 2
+ remote_disabled = 1 //Manually emagging the bot locks out the AI built in panel.
+ locked = TRUE //Access denied forever!
+ bot_reset()
+ turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP.
+ to_chat(src, "(#$*#$^^( OVERRIDE DETECTED")
+ log_combat(user, src, "emagged")
+ return TRUE
/mob/living/simple_animal/bot/examine(mob/user)
..()
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index bc8dd0c3ab..bdffb032a3 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -9,7 +9,7 @@
health = 25
maxHealth = 25
radio_key = /obj/item/encryptionkey/headset_service
- radio_channel = "Service" //Service
+ radio_channel = RADIO_CHANNEL_SERVICE //Service
bot_type = CLEAN_BOT
model = "Cleanbot"
bot_core_type = /obj/machinery/bot_core/cleanbot
@@ -78,7 +78,7 @@
return ..()
/mob/living/simple_animal/bot/cleanbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
to_chat(user, "[src] buzzes and beeps.")
@@ -155,7 +155,7 @@
else
shuffle = TRUE //Shuffle the list the next time we scan so we dont both go the same way.
path = list()
-
+
if(!path || path.len == 0) //No path, need a new one
//Try to produce a path to the target, and ignore airlocks to which it has access.
path = get_path_to(src, target.loc, /turf/proc/Distance_cardinal, 0, 30, id=access_card)
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 9db21f13e0..a72b71be85 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -478,18 +478,19 @@
to_chat(user, "The superglue binding [src]'s toy swords to its chassis snaps!")
for(var/IS in 1 to toyswordamt)
new /obj/item/toy/sword(Tsec)
+ toyswordamt--
if(ASSEMBLY_FIFTH_STEP)
if(istype(I, /obj/item/melee/transforming/energy/sword/saber))
if(swordamt < 3)
if(!user.temporarilyRemoveItemFromInventory(I))
return
- created_name = "General Beepsky"
- name = "helmet/signaler/prox sensor/robot arm/energy sword assembly"
- icon_state = "grievous_assembly"
- to_chat(user, "You bolt [I] onto one of [src]'s arm slots.")
- qdel(I)
- swordamt ++
+ created_name = "General Beepsky"
+ name = "helmet/signaler/prox sensor/robot arm/energy sword assembly"
+ icon_state = "grievous_assembly"
+ to_chat(user, "You bolt [I] onto one of [src]'s arm slots.")
+ qdel(I)
+ swordamt ++
else
if(!can_finish_build(I, user))
return
@@ -505,6 +506,7 @@
to_chat(user, "You unbolt [src]'s energy swords")
for(var/IS in 1 to swordamt)
new /obj/item/melee/transforming/energy/sword/saber(Tsec)
+ swordamt--
//Firebot Assembly
/obj/item/bot_assembly/firebot
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 581711d271..e272878574 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -13,7 +13,7 @@
mob_size = MOB_SIZE_LARGE
radio_key = /obj/item/encryptionkey/headset_sec
- radio_channel = "Security"
+ radio_channel = RADIO_CHANNEL_SECURITY
bot_type = SEC_BOT
model = "ED-209"
bot_core = /obj/machinery/bot_core/secbot
@@ -195,7 +195,7 @@ Auto Patrol[]"},
shootAt(user)
/mob/living/simple_animal/bot/ed209/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
to_chat(user, "You short out [src]'s target assessment circuits.")
diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm
index d8c3bca72a..2b52da6821 100644
--- a/code/modules/mob/living/simple_animal/bot/firebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/firebot.dm
@@ -16,7 +16,7 @@
spacewalk = TRUE
radio_key = /obj/item/encryptionkey/headset_eng
- radio_channel = "Engineering"
+ radio_channel = RADIO_CHANNEL_ENGINEERING
bot_type = FIRE_BOT
model = "Firebot"
bot_core = /obj/machinery/bot_core/firebot
@@ -120,7 +120,7 @@
return dat
/mob/living/simple_animal/bot/firebot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 1)
if(user)
to_chat(user, "[src] buzzes and beeps.")
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 7e5cfe2110..396c6de166 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -11,7 +11,7 @@
spacewalk = TRUE
radio_key = /obj/item/encryptionkey/headset_eng
- radio_channel = "Engineering"
+ radio_channel = RADIO_CHANNEL_ENGINEERING
bot_type = FLOOR_BOT
model = "Floorbot"
bot_core = /obj/machinery/bot_core/floorbot
@@ -124,7 +124,7 @@
..()
/mob/living/simple_animal/bot/floorbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
to_chat(user, "[src] buzzes and beeps.")
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index d586cc694b..1c19cd82a1 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -11,7 +11,6 @@
pass_flags = PASSMOB
radio_key = /obj/item/encryptionkey/headset_service //doesn't have security key
- radio_channel = "Service" //Doesn't even use the radio anyway.
bot_type = HONK_BOT
model = "Honkbot"
bot_core_type = /obj/machinery/bot_core/honkbot
@@ -128,10 +127,9 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
..()
/mob/living/simple_animal/bot/honkbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
- user << "You short out [src]'s sound control system. It gives out an evil laugh!!"
oldtarget_name = user.name
audible_message("[src] gives out an evil laugh!")
playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 75, 1, -1) // evil laughter
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 5a21d33d5a..1bff7dc10c 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -17,7 +17,7 @@
status_flags = (CANPUSH | CANSTUN)
radio_key = /obj/item/encryptionkey/headset_med
- radio_channel = "Medical"
+ radio_channel = RADIO_CHANNEL_MEDICAL
bot_type = MED_BOT
model = "Medibot"
@@ -240,7 +240,7 @@
step_to(src, (get_step_away(src,user)))
/mob/living/simple_animal/bot/medbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
declare_crit = 0
if(user)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index c45d435253..1bc7493684 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -23,7 +23,7 @@
mob_size = MOB_SIZE_LARGE
radio_key = /obj/item/encryptionkey/headset_cargo
- radio_channel = "Supply"
+ radio_channel = RADIO_CHANNEL_SUPPLY
bot_type = MULE_BOT
model = "MULE"
@@ -115,6 +115,7 @@
return
/mob/living/simple_animal/bot/mulebot/emag_act(mob/user)
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
if(emagged < 1)
emagged = TRUE
if(!open)
@@ -122,6 +123,7 @@
to_chat(user, "You [locked ? "lock" : "unlock"] [src]'s controls!")
flick("mulebot-emagged", src)
playsound(src, "sparks", 100, 0)
+ return TRUE
/mob/living/simple_animal/bot/mulebot/update_icon()
if(open)
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index fca1f66546..9572b4dafc 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -11,7 +11,7 @@
pass_flags = PASSMOB
radio_key = /obj/item/encryptionkey/secbot //AI Priv + Security
- radio_channel = "Security" //Security channel
+ radio_channel = RADIO_CHANNEL_SECURITY //Security channel
bot_type = SEC_BOT
model = "Securitron"
bot_core_type = /obj/machinery/bot_core/secbot
@@ -61,7 +61,7 @@
/mob/living/simple_animal/bot/secbot/pingsky
name = "Officer Pingsky"
desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment."
- radio_channel = "AI Private"
+ radio_channel = RADIO_CHANNEL_AI_PRIVATE
/mob/living/simple_animal/bot/secbot/Initialize()
. = ..()
@@ -190,7 +190,7 @@ Auto Patrol: []"},
return
/mob/living/simple_animal/bot/secbot/emag_act(mob/user)
- ..()
+ . = ..()
if(emagged == 2)
if(user)
to_chat(user, "You short out [src]'s target assessment circuits.")
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index 807c52ea46..23ac527b2e 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -222,7 +222,7 @@
if(.)
update_icons()
-/mob/living/simple_animal/drone/cogscarab/Knockdown(amount, updating = 1, ignore_canknockdown = 0)
+/mob/living/simple_animal/drone/cogscarab/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg)
. = ..()
if(.)
update_icons()
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 1a918766b6..73274dcfaf 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS]
var/reset = 0 //if the summoner has reset the guardian already
var/cooldown = 0
- var/mob/living/summoner
+ var/mob/living/carbon/summoner
var/range = 10 //how far from the user the spirit can be
var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses
var/datum/guardianname/namedatum = new/datum/guardianname()
@@ -149,6 +149,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
death(TRUE)
qdel(src)
snapback()
+ if(HAS_TRAIT(summoner, TRAIT_NODEATH) && (istype(summoner.wear_neck, /obj/item/clothing/neck/necklace/memento_mori)))
+ REMOVE_TRAIT(summoner, TRAIT_NODEATH, "memento_mori")
+ to_chat(summoner,"You feel incredibly vulnerable as the memento mori pulls your life force in one too many directions!")
/mob/living/simple_animal/hostile/guardian/Stat()
..()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index 8fb1de18df..ff2f453207 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -22,7 +22,7 @@
var/mob/living/M = target
if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
- do_teleport(M, M, 10)
+ do_teleport(M, M, 10, channel = TELEPORT_CHANNEL_BLUESPACE)
for(var/mob/living/L in range(1, M))
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
continue
diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm
index 8ef70e439f..794683e69f 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/support.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm
@@ -142,5 +142,5 @@
L.flash_act()
A.visible_message("[A] disappears in a flash of light!", \
"Your vision is obscured by a flash of light!")
- do_teleport(A, beacon, 0)
+ do_teleport(A, beacon, 0, channel = TELEPORT_CHANNEL_BLUESPACE)
new /obj/effect/temp_visual/guardian/phase(get_turf(A))
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 7cf8defc0f..b529d826c9 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -747,6 +747,12 @@ Difficulty: Very Hard
/obj/structure/closet/stasis/ex_act()
return
+/obj/structure/closet/stasis/handle_lock_addition()
+ return
+
+/obj/structure/closet/stasis/handle_lock_removal()
+ return
+
/obj/effect/proc_holder/spell/targeted/exit_possession
name = "Exit Possession"
desc = "Exits the body you are possessing."
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 6577553a6a..cca39cfea6 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -158,6 +158,8 @@ Difficulty: Normal
else
burst_range = 3
INVOKE_ASYNC(src, .proc/burst, get_turf(src), 0.25) //melee attacks on living mobs cause it to release a fast burst if on cooldown
+ if(L.stat == CONSCIOUS && L.health >= 30)
+ OpenFire()
else
devour(L)
else
@@ -426,6 +428,7 @@ Difficulty: Normal
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original, spread_speed = 0.5) //release a wave of blasts
playsound(original,'sound/machines/airlockopen.ogg', 200, 1)
var/last_dist = 0
+ var/list/hit_mobs = list() //don't hit people multiple times.
for(var/t in spiral_range_turfs(burst_range, original))
var/turf/T = t
if(!T)
@@ -434,7 +437,7 @@ Difficulty: Normal
if(dist > last_dist)
last_dist = dist
sleep(1 + min(burst_range - last_dist, 12) * spread_speed) //gets faster as it gets further out
- new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE)
+ new /obj/effect/temp_visual/hierophant/blast(T, src, FALSE, hit_mobs)
/mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck)
if(!istype(A) || get_dist(A, src) <= 2)
@@ -591,8 +594,10 @@ Difficulty: Normal
var/friendly_fire_check = FALSE
var/bursting = FALSE //if we're bursting and need to hit anyone crossing us
-/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire)
+/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire, list/only_hit_once)
. = ..()
+ if(only_hit_once)
+ hit_things = only_hit_once
friendly_fire_check = friendly_fire
if(new_caster)
hit_things += new_caster
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
index 5cee4ef1b7..cc54ad3bef 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
@@ -38,3 +38,13 @@
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
+/mob/living/simple_animal/hostile/retaliate/bat/secbat
+ name = "Security Bat"
+ icon_state = "secbat"
+ icon_living = "secbat"
+ icon_dead = "secbat_dead"
+ icon_gib = "secbat_dead"
+ desc = "A fruit bat with a tiny little security hat who is ready to inject cuteness into any security operation."
+ emote_see = list("is ready to law down the law.", "flaps about with an air of authority.")
+ response_help = "respects the authority of"
+ gold_core_spawnable = FRIENDLY_SPAWN
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index fc53483eda..86f63a729d 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -241,23 +241,23 @@
clearlist(available_channels)
for(var/ch in headset_to_add.channels)
switch(ch)
- if("Engineering")
- available_channels.Add(":e")
- if("Command")
- available_channels.Add(":c")
- if("Security")
- available_channels.Add(":s")
- if("Science")
- available_channels.Add(":n")
- if("Medical")
- available_channels.Add(":m")
- if("Supply")
- available_channels.Add(":u")
- if("Service")
- available_channels.Add(":v")
+ if(RADIO_CHANNEL_ENGINEERING)
+ available_channels.Add(RADIO_TOKEN_ENGINEERING)
+ if(RADIO_CHANNEL_COMMAND)
+ available_channels.Add(RADIO_TOKEN_COMMAND)
+ if(RADIO_CHANNEL_SECURITY)
+ available_channels.Add(RADIO_TOKEN_SECURITY)
+ if(RADIO_CHANNEL_SCIENCE)
+ available_channels.Add(RADIO_TOKEN_SCIENCE)
+ if(RADIO_CHANNEL_MEDICAL)
+ available_channels.Add(RADIO_TOKEN_MEDICAL)
+ if(RADIO_CHANNEL_SUPPLY)
+ available_channels.Add(RADIO_TOKEN_SUPPLY)
+ if(RADIO_CHANNEL_SERVICE)
+ available_channels.Add(RADIO_TOKEN_SERVICE)
if(headset_to_add.translate_binary)
- available_channels.Add(":b")
+ available_channels.Add(MODE_TOKEN_BINARY)
else
return ..()
@@ -897,6 +897,11 @@
. = ..()
+/mob/living/simple_animal/parrot/Poly/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
+ . = ..()
+ if(. && !client && prob(1) && prob(1)) //Only the one true bird may speak across dimensions.
+ world.TgsTargetedChatBroadcast("A stray squawk is heard... \"[message]\"", FALSE)
+
/mob/living/simple_animal/parrot/Poly/Life()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE)
diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
index 4d808a11a9..666de9cef0 100644
--- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm
@@ -49,6 +49,8 @@
// Simple animals have only one belly. This creates it (if it isn't already set up)
/mob/living/simple_animal/init_vore()
vore_init = TRUE
+ if(CHECK_BITFIELD(flags_1, HOLOGRAM_1))
+ return
if(vore_organs.len)
return
if(no_vore) //If it can't vore, let's not give it a stomach.
@@ -105,6 +107,9 @@
var/mob/living/carbon/human/user = usr
if(!istype(user) || user.stat) return
+ if(!vore_active)
+ return
+
if(vore_selected.digest_mode == DM_HOLD)
var/confirm = alert(usr, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel")
if(confirm == "Enable")
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index 07985215d8..29b4689317 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -69,7 +69,7 @@
if(Target.Adjacent(src))
Target.attack_slime(src)
- return
+ break
if(!Target.lying && prob(80))
if(Target.client && Target.health >= 20)
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 5006bd2920..0880f7f432 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -62,15 +62,15 @@
return K.duration - world.time
return 0
-/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Can't go below remaining duration
+/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) //Can't go below remaining duration
if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown)
- if(absorb_stun(amount, ignore_canknockdown))
+ if(absorb_stun(isnull(override_hardstun)? amount : override_hardstun, ignore_canknockdown))
return
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
if(K)
- K.duration = max(world.time + amount, K.duration)
- else if(amount > 0)
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
+ K.duration = max(world.time + (isnull(override_hardstun)? amount : override_hardstun), K.duration)
+ else if((amount || override_hardstun) > 0)
+ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating, override_hardstun, override_stamdmg)
return K
/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Sets remaining duration
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index b098801da8..f1602f429c 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -116,19 +116,23 @@
// vision_distance (optional) define how many tiles away the message can be seen.
// ignored_mob (optional) doesn't show any message to a given mob if TRUE.
-/atom/proc/visible_message(message, self_message, blind_message, vision_distance, ignored_mob)
+/atom/proc/visible_message(message, self_message, blind_message, vision_distance, list/ignored_mobs, no_ghosts = FALSE)
var/turf/T = get_turf(src)
if(!T)
return
+ if(!islist(ignored_mobs))
+ ignored_mobs = list(ignored_mobs)
var/range = 7
if(vision_distance)
range = vision_distance
for(var/mob/M in get_hearers_in_view(range, src))
if(!M.client)
continue
- if(M == ignored_mob)
+ if(M in ignored_mobs)
continue
var/msg = message
+ if(isobserver(M) && no_ghosts)
+ continue
if(M == src) //the src always see the main message or self message
if(self_message)
msg = self_message
@@ -155,7 +159,7 @@
// deaf_message (optional) is what deaf people will see.
// hearing_distance (optional) is the range, how many tiles away the message can be heard.
-/mob/audible_message(message, deaf_message, hearing_distance, self_message)
+/mob/audible_message(message, deaf_message, hearing_distance, self_message, no_ghosts = FALSE)
var/range = 7
if(hearing_distance)
range = hearing_distance
@@ -163,6 +167,8 @@
var/msg = message
if(self_message && M==src)
msg = self_message
+ if(no_ghosts && isobserver(M))
+ continue
M.show_message( msg, 2, deaf_message, 1)
// Show a message to all mobs in earshot of this atom
@@ -171,11 +177,13 @@
// deaf_message (optional) is what deaf people will see.
// hearing_distance (optional) is the range, how many tiles away the message can be heard.
-/atom/proc/audible_message(message, deaf_message, hearing_distance)
+/atom/proc/audible_message(message, deaf_message, hearing_distance, no_ghosts = FALSE)
var/range = 7
if(hearing_distance)
range = hearing_distance
for(var/mob/M in get_hearers_in_view(range, src))
+ if(no_ghosts && isobserver(M))
+ continue
M.show_message( message, 2, deaf_message, 1)
/mob/proc/Life()
@@ -449,13 +457,17 @@
set name = ".click"
set hidden = TRUE
set category = null
- return
+ var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .click macro!"
+ log_admin(msg)
+ message_admins(msg)
/mob/verb/DisDblClick(argu = null as anything, sec = "" as text, number1 = 0 as num , number2 = 0 as num)
set name = ".dblclick"
set hidden = TRUE
set category = null
- return
+ var/msg = "[key_name_admin(src)]([ADMIN_KICK(src)]) attempted to use the .dblclick macro!"
+ log_admin(msg)
+ message_admins(msg)
/mob/Topic(href, href_list)
if(href_list["mach_close"])
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index a0126f5fdd..0cb886f11b 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -65,6 +65,7 @@
var/active_hand_index = 1
var/list/held_items = list() //len = number of hands, eg: 2 nulls is 2 empty hands, 1 item and 1 null is 1 full hand and 1 empty hand.
//held_items[active_hand_index] is the actively held item, but please use get_active_held_item() instead, because OOP
+ var/bloody_hands = 0
var/datum/component/storage/active_storage = null//Carbon
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 66444abf91..1fc97c31e4 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -172,15 +172,11 @@ proc/get_top_level_mob(var/mob/S)
user.log_message(message, INDIVIDUAL_EMOTE_LOG)
message = "[user] " + "[message]"
- for(var/mob/M)
- if(M in list(/mob/living))
- M.show_message(message)
-
if(emote_type == EMOTE_AUDIBLE)
- user.audible_message(message=message,hearing_distance=1)
+ user.audible_message(message=message,hearing_distance=1, no_ghosts = TRUE)
else
- user.visible_message(message=message,self_message=message,vision_distance=1)
- log_emote("[key_name(user)] : [message]")
+ user.visible_message(message=message,self_message=message,vision_distance=1, no_ghosts = TRUE)
+ log_emote("[key_name(user)] : (SUBTLER) [message]")
message = null
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index 580374c5c0..db4cdc2ff5 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -178,13 +178,13 @@
turn_on(user)
/obj/item/modular_computer/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "\The [src] was already emagged.")
- return 0
- else
- obj_flags |= EMAGGED
- to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.")
- return 1
+ return
+ obj_flags |= EMAGGED
+ to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.")
+ return TRUE
/obj/item/modular_computer/examine(mob/user)
..()
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index 19d3b56046..b3476e7046 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -44,7 +44,9 @@
cpu.attack_ghost(user)
/obj/machinery/modular_computer/emag_act(mob/user)
- return cpu ? cpu.emag_act(user) : 1
+ . = ..()
+ if(cpu)
+ . |= cpu.emag_act(user)
/obj/machinery/modular_computer/update_icon()
cut_overlays()
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
index 1c3fbd8147..94be922fdf 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
@@ -8,33 +8,37 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth()
- var/mob/living/carbon/human/U = affecting
- if(!U)
+ if(!affecting)
return
if(stealth)
cancel_stealth()
else
if(cell.charge <= 0)
- to_chat(U, "You don't have enough power to enable Stealth!")
+ to_chat(affecting, "You don't have enough power to enable Stealth!")
return
stealth = !stealth
- animate(U, alpha = 50,time = 15)
- U.visible_message("[U.name] vanishes into thin air!", \
+ animate(affecting, alpha = 10,time = 15)
+ affecting.visible_message("[affecting.name] vanishes into thin air!", \
"You are now mostly invisible to normal detection.")
+ RegisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY), .proc/reduce_stealth)
+ RegisterSignal(affecting, COMSIG_MOVABLE_BUMP, .proc/bumping_stealth)
+/obj/item/clothing/suit/space/space_ninja/proc/reduce_stealth()
+ affecting.alpha = min(affecting.alpha + 30, 80)
+
+/obj/item/clothing/suit/space/space_ninja/proc/bumping_stealth(datum/source, atom/A)
+ if(isliving(A))
+ affecting.alpha = min(affecting.alpha + 15, 80)
/obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth()
- var/mob/living/carbon/human/U = affecting
- if(!U)
- return 0
- if(stealth)
- stealth = !stealth
- animate(U, alpha = 255, time = 15)
- U.visible_message("[U.name] appears from thin air!", \
- "You are now visible.")
- return 1
- return 0
-
+ if(!affecting || !stealth)
+ return FALSE
+ stealth = !stealth
+ UnregisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_BUMP))
+ animate(affecting, alpha = 255, time = 15)
+ affecting.visible_message("[affecting.name] appears from thin air!", \
+ "You are now visible.")
+ return TRUE
/obj/item/clothing/suit/space/space_ninja/proc/stealth()
if(!s_busy)
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index 1b935a00de..115b14b63b 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -1,4 +1,3 @@
-
/obj/item/clothing/shoes/space_ninja
name = "ninja shoes"
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
@@ -13,3 +12,12 @@
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+
+/obj/item/clothing/shoes/space_ninja/equipped(mob/user, slot)
+ . = ..()
+ if(slot == SLOT_SHOES)
+ ADD_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]")
+
+/obj/item/clothing/shoes/space_ninja/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]")
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index b98ef764c0..ac1ef3b96a 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -149,12 +149,11 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/examine(mob/user)
..()
- if(s_initialized)
- if(user == affecting)
- to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].")
- to_chat(user, "The CLOAK-tech device is [stealth?"active":"inactive"].")
- to_chat(user, "There are [s_bombs] smoke bomb\s remaining.")
- to_chat(user, "There are [a_boost] adrenaline booster\s remaining.")
+ if(s_initialized && user == affecting)
+ to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].\n\
+ The CLOAK-tech device is [stealth?"active":"inactive"].\n\
+ There are [s_bombs] smoke bomb\s remaining.\n\
+ There are [a_boost] adrenaline booster\s remaining.")
/obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/initialize_ninja_suit))
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index 4b159557bc..3d80282fe7 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -48,7 +48,7 @@
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_seven(delay, mob/living/carbon/human/U)
to_chat(U, "All systems operational. Welcome to SpiderOS, [U.real_name].")
s_initialized = TRUE
- ntick()
+ START_PROCESSING(SSprocessing, src)
s_busy = FALSE
@@ -91,4 +91,5 @@
unlock_suit()
U.regenerate_icons()
s_initialized = FALSE
+ STOP_PROCESSING(SSprocessing, src)
s_busy = FALSE
diff --git a/code/modules/ninja/suit/suit_process.dm b/code/modules/ninja/suit/suit_process.dm
index 4a89a59f75..850fb837b4 100644
--- a/code/modules/ninja/suit/suit_process.dm
+++ b/code/modules/ninja/suit/suit_process.dm
@@ -1,20 +1,17 @@
-/obj/item/clothing/suit/space/space_ninja/proc/ntick(mob/living/carbon/human/U = affecting)
- //Runs in the background while the suit is initialized.
- //Requires charge or stealth to process.
- spawn while(s_initialized)
- if(!affecting)
- terminate()//Kills the suit and attached objects.
+/obj/item/clothing/suit/space/space_ninja/process()
+ if(!affecting || !s_initialized)
+ return PROCESS_KILL
- else if(cell.charge > 0)
- if(s_coold)
- s_coold--//Checks for ability s_cooldown first.
+ if(cell.charge > 0)
+ if(s_coold)
+ s_coold--//Checks for ability s_cooldown first.
- cell.charge -= s_cost//s_cost is the default energy cost each ntick, usually 5.
- if(stealth)//If stealth is active.
- cell.charge -= s_acost
+ cell.charge -= s_cost//s_cost is the default energy cost each tick, usually 5.
+ if(stealth)//If stealth is active.
+ cell.charge -= s_acost
+ affecting.alpha = max(affecting.alpha - 10, 10)
- else
- cell.charge = 0
+ else
+ cell.charge = 0
+ if(stealth)
cancel_stealth()
-
- sleep(10)//Checks every second.
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index f379541b9c..6469a1091b 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -46,7 +46,7 @@
/obj/item/wallframe/picture/update_icon()
cut_overlays()
if(displayed)
- add_overlay(getFlatIcon(displayed))
+ add_overlay(image(displayed))
/obj/item/wallframe/picture/after_attach(obj/O)
..()
@@ -148,7 +148,7 @@
/obj/structure/sign/picture_frame/update_icon()
cut_overlays()
if(framed)
- add_overlay(getFlatIcon(framed))
+ add_overlay(image(framed))
/obj/structure/sign/picture_frame/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 7c377ffa22..d837f0d420 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -267,7 +267,7 @@
to_chat(user, "There is an integration cog installed!")
to_chat(user, "Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface.")
-
+
if(issilicon(user))
to_chat(user, "Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"].")
@@ -747,7 +747,7 @@
if(damage_flag == "melee" && damage_amount < damage_deflection)
return 0
. = ..()
-
+
/obj/machinery/power/apc/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
if(!(stat & BROKEN))
@@ -759,21 +759,23 @@
update_icon()
/obj/machinery/power/apc/emag_act(mob/user)
- if(!(obj_flags & EMAGGED) && !malfhack)
- if(opened)
- to_chat(user, "You must close the cover to swipe an ID card!")
- else if(panel_open)
- to_chat(user, "You must close the panel first!")
- else if(stat & (BROKEN|MAINT))
- to_chat(user, "Nothing happens!")
- else
- flick("apc-spark", src)
- playsound(src, "sparks", 75, 1)
- obj_flags |= EMAGGED
- locked = FALSE
- to_chat(user, "You emag the APC interface.")
- update_icon()
-
+ . = ..()
+ if(obj_flags & EMAGGED || malfhack)
+ return
+ if(opened)
+ to_chat(user, "You must close the cover to swipe an ID card!")
+ else if(panel_open)
+ to_chat(user, "You must close the panel first!")
+ else if(stat & (BROKEN|MAINT))
+ to_chat(user, "Nothing happens!")
+ else
+ flick("apc-spark", src)
+ playsound(src, "sparks", 75, 1)
+ obj_flags |= EMAGGED
+ locked = FALSE
+ to_chat(user, "You emag the APC interface.")
+ update_icon()
+ return TRUE
// attack with hand - remove cell (if cover open) or interact with the APC
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 7a6e313cd0..7375a3e17a 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -194,10 +194,12 @@
return ..()
/obj/machinery/power/port_gen/pacman/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
emp_act(EMP_HEAVY)
+ return TRUE
/obj/machinery/power/port_gen/pacman/attack_ai(mob/user)
interact(user)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index d805713fa6..4d6ede69d1 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -339,12 +339,13 @@
projectile_sound = initial(projectile_sound)
/obj/machinery/power/emitter/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
locked = FALSE
obj_flags |= EMAGGED
- if(user)
- user.visible_message("[user.name] emags [src].","You short out the lock.")
+ user?.visible_message("[user.name] emags [src].","You short out the lock.")
+ return TRUE
/obj/machinery/power/emitter/prototype
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 026c39c6cf..19db73dfdd 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -5,12 +5,21 @@
#define PLASMA_HEAT_PENALTY 15 // Higher == Bigger heat and waste penalty from having the crystal surrounded by this gas. Negative numbers reduce penalty.
#define OXYGEN_HEAT_PENALTY 1
#define CO2_HEAT_PENALTY 0.1
-#define NITROGEN_HEAT_MODIFIER -1.5
+#define PLUOXIUM_HEAT_PENALTY -1
+#define TRITIUM_HEAT_PENALTY 10
+#define NITROGEN_HEAT_PENALTY -1.5
+#define BZ_HEAT_PENALTY 5
#define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation.
#define PLASMA_TRANSMIT_MODIFIER 4
+#define BZ_TRANSMIT_MODIFIER -2
+
+#define TRITIUM_RADIOACTIVITY_MODIFIER 3 //Higher == Crystal spews out more radiation
+#define BZ_RADIOACTIVITY_MODIFIER 5
+#define PLUOXIUM_RADIOACTIVITY_MODIFIER -2
#define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage.
+#define PLUOXIUM_HEAT_RESISTANCE 3
#define POWERLOSS_INHIBITION_GAS_THRESHOLD 0.20 //Higher == Higher percentage of inhibitor gas needed before the charge inertia chain reaction effect starts.
#define POWERLOSS_INHIBITION_MOLE_THRESHOLD 20 //Higher == More moles of the gas are needed before the charge inertia chain reaction effect starts. //Scales powerloss inhibition down until this amount of moles is reached
@@ -53,6 +62,7 @@
#define SUPERMATTER_EMERGENCY_PERCENT 25
#define SUPERMATTER_DANGER_PERCENT 50
#define SUPERMATTER_WARNING_PERCENT 100
+#define CRITICAL_TEMPERATURE 10000
#define SUPERMATTER_COUNTDOWN_TIME 30 SECONDS
@@ -102,6 +112,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
var/o2comp = 0
var/co2comp = 0
var/n2ocomp = 0
+ var/pluoxiumcomp = 0
+ var/tritiumcomp = 0
+ var/bzcomp = 0
+
+ var/pluoxiumbonus = 0
var/combined_gas = 0
var/gasmix_power_ratio = 0
@@ -184,8 +199,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
to_chat(H, "You get headaches just from looking at it.")
return
-#define CRITICAL_TEMPERATURE 10000
-
/obj/machinery/power/supermatter_crystal/proc/get_status()
var/turf/T = get_turf(src)
if(!T)
@@ -354,16 +367,24 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
plasmacomp = max(removed.gases[/datum/gas/plasma]/combined_gas, 0)
o2comp = max(removed.gases[/datum/gas/oxygen]/combined_gas, 0)
co2comp = max(removed.gases[/datum/gas/carbon_dioxide]/combined_gas, 0)
+ pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium]/combined_gas, 0)
+ tritiumcomp = max(removed.gases[/datum/gas/tritium]/combined_gas, 0)
+ bzcomp = max(removed.gases[/datum/gas/bz]/combined_gas, 0)
n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide]/combined_gas, 0)
n2comp = max(removed.gases[/datum/gas/nitrogen]/combined_gas, 0)
- gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp, 0), 1)
+ if(pluoxiumcomp >= 0.15)
+ pluoxiumbonus = 1 //makes pluoxium only work at 15%+
+ else
+ pluoxiumbonus = 0
- dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY)+(o2comp * OXYGEN_HEAT_PENALTY)+(co2comp * CO2_HEAT_PENALTY)+(n2comp * NITROGEN_HEAT_MODIFIER), 0.5)
- dynamic_heat_resistance = max(n2ocomp * N2O_HEAT_RESISTANCE, 1)
+ gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp + tritiumcomp + bzcomp - pluoxiumcomp - n2comp, 0), 1)
- power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER), 0)
+ dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY) + (o2comp * OXYGEN_HEAT_PENALTY) + (co2comp * CO2_HEAT_PENALTY) + (tritiumcomp * TRITIUM_HEAT_PENALTY) + ((pluoxiumcomp * PLUOXIUM_HEAT_PENALTY) * pluoxiumbonus) + (n2comp * NITROGEN_HEAT_PENALTY) + (bzcomp * BZ_HEAT_PENALTY), 0.5)
+ dynamic_heat_resistance = max((n2ocomp * N2O_HEAT_RESISTANCE) + ((pluoxiumcomp * PLUOXIUM_HEAT_RESISTANCE) * pluoxiumbonus), 1)
+
+ power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER) + (bzcomp * BZ_TRANSMIT_MODIFIER), 0)
//more moles of gases are harder to heat than fewer, so let's scale heat damage around them
mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25)
@@ -392,7 +413,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload
if(prob(50))
- radiation_pulse(src, power * (1 + power_transmission_bonus/10))
+ radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%)
+ if(bzcomp >= 0.4 && prob(30 * bzcomp))
+ src.fire_nuclear_particles() // Start to emit radballs at a maximum of 30% chance per tick
var/device_energy = power * REACTION_POWER_MODIFIER
diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm
index 9d6befce53..bc693d96bc 100644
--- a/code/modules/projectiles/ammunition/caseless/rocket.dm
+++ b/code/modules/projectiles/ammunition/caseless/rocket.dm
@@ -9,7 +9,7 @@
name = "\improper PM-9HEDP"
desc = "An 84mm High Explosive Dual Purpose rocket. Pointy end toward mechs."
caliber = "84mm"
- icon_state = "s-casing-live"
+ icon_state = "84mm-hedp"
projectile_type = /obj/item/projectile/bullet/a84mm
/obj/item/ammo_casing/caseless/a75
diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm
index 0879506036..7b4e0bfa97 100644
--- a/code/modules/projectiles/ammunition/energy/special.dm
+++ b/code/modules/projectiles/ammunition/energy/special.dm
@@ -62,3 +62,8 @@
e_cost = 200
select_name = "stun"
projectile_type = /obj/item/projectile/energy/tesla/revolver
+
+/obj/item/ammo_casing/energy/emitter
+ fire_sound = 'sound/weapons/emitter.ogg'
+ e_cost = 2000 //20,000 is in the cell making this 10 shots before reload
+ projectile_type = /obj/item/projectile/beam/emitter
diff --git a/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/code/modules/projectiles/boxes_magazines/internal/grenade.dm
index 352d1eb951..79a005ee8a 100644
--- a/code/modules/projectiles/boxes_magazines/internal/grenade.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/grenade.dm
@@ -11,7 +11,7 @@
max_ammo = 1
/obj/item/ammo_box/magazine/internal/rocketlauncher
- name = "grenade launcher internal magazine"
+ name = "rocket launcher internal magazine"
ammo_type = /obj/item/ammo_casing/caseless/rocket
caliber = "84mm"
max_ammo = 1
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 98fd774d63..fb3ed19f82 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -32,9 +32,10 @@
var/fire_delay = 0 //rate of fire for burst firing and semi auto
var/firing_burst = 0 //Prevent the weapon from firing again while already firing
var/semicd = 0 //cooldown handler
- var/weapon_weight = WEAPON_LIGHT
+ var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy
var/spread = 0 //Spread induced by the gun itself.
var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
+ var/inaccuracy_modifier = 1
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
@@ -538,3 +539,13 @@
if(A == chambered)
chambered = null
update_icon()
+
+/obj/item/gun/proc/getinaccuracy(mob/living/user)
+ if(!iscarbon(user))
+ return FALSE
+ else
+ var/mob/living/carbon/holdingdude = user
+ if(istype(holdingdude) && holdingdude.combatmode)
+ return (max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0) * inaccuracy_modifier)
+ else
+ return ((weapon_weight * 25) * inaccuracy_modifier)
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index eea4e1bc0b..12006440d2 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -86,6 +86,7 @@
pin = /obj/item/firing_pin/implant/pindicate
burst_size = 1
fire_delay = 0
+ inaccuracy_modifier = 0.7
casing_ejector = FALSE
weapon_weight = WEAPON_HEAVY
magazine_wording = "rocket"
@@ -108,34 +109,33 @@
/obj/item/gun/ballistic/rocketlauncher/can_shoot()
return chambered?.BB
-/obj/item/gun/ballistic/rocketlauncher/process_chamber()
- if(chambered)
- chambered = null
- if(magazine)
- QDEL_NULL(magazine)
- update_icon()
-
/obj/item/gun/ballistic/rocketlauncher/attack_self_tk(mob/user)
return //too difficult to remove the rocket with TK
/obj/item/gun/ballistic/rocketlauncher/attack_self(mob/living/user)
if(magazine)
- if(chambered)
- chambered.forceMove(magazine)
- magazine.stored_ammo.Insert(1, chambered)
+ var/obj/item/ammo_casing/AC = chambered
+ if(AC)
+ if(!user.put_in_hands(AC))
+ AC.bounce_away(FALSE, NONE)
+ to_chat(user, "You remove \the [AC] from \the [src]!")
+ playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, TRUE)
chambered = null
else
- stack_trace("Removed [magazine] from [src] without a chambered round")
- magazine.forceMove(drop_location())
- if(user.is_holding(src))
- user.put_in_hands(magazine)
- playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, TRUE)
- to_chat(user, "You work the [magazine] out from [src].")
- magazine = null
- else
- to_chat(user, "There's no rocket in [src].")
+ to_chat(user, "There's no [magazine_wording] in [src].")
update_icon()
+/obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params)
+ if(magazine && istype(A, /obj/item/ammo_casing))
+ if(chambered)
+ to_chat(user, "[src] already has a [magazine_wording] chambered.")
+ return
+ if(magazine.attackby(A, user, silent = TRUE))
+ to_chat(user, "You load a new [A] into \the [src].")
+ playsound(src, "gun_insert_full_magazine", 70, 1)
+ chamber_round()
+ update_icon()
+
/obj/item/gun/ballistic/rocketlauncher/update_icon()
icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]"
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index bb6a144c93..7d71a9acdd 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -40,7 +40,7 @@
if(istype(user) && user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit
to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
return//CIT CHANGE - ditto
- pump(user)
+ pump(user, TRUE)
recentpump = world.time + 10
if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina.
user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added
@@ -52,7 +52,9 @@
process_fire(user, user, FALSE)
. = 1
-/obj/item/gun/ballistic/shotgun/proc/pump(mob/M)
+/obj/item/gun/ballistic/shotgun/proc/pump(mob/M, visible = TRUE)
+ if(visible)
+ M.visible_message("[M] racks [src].", "You rack [src].")
playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1)
pump_unload(M)
pump_reload(M)
@@ -212,14 +214,41 @@
)
/obj/item/gun/ballistic/shotgun/automatic/combat/compact
- name = "compact combat shotgun"
- desc = "A compact version of the semi automatic combat shotgun. For close encounters."
+ name = "warden's combat shotgun"
+ desc = "A modified version of the semi automatic combat shotgun with a collapsible stock. For close encounters."
icon_state = "cshotgunc"
- mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact
+ mag_type = /obj/item/ammo_box/magazine/internal/shot/com
w_class = WEIGHT_CLASS_NORMAL
- unique_reskin = list("Tatical" = "cshotgunc",
- "Slick" = "cshotgunc_slick"
- )
+ var/stock = FALSE
+ recoil = 5
+ spread = 2
+
+/obj/item/gun/ballistic/shotgun/automatic/combat/compact/AltClick(mob/living/user)
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ toggle_stock(user)
+ . = ..()
+
+/obj/item/gun/ballistic/shotgun/automatic/combat/compact/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to toggle the stock.")
+
+/obj/item/gun/ballistic/shotgun/automatic/combat/compact/proc/toggle_stock(mob/living/user)
+ stock = !stock
+ if(stock)
+ w_class = WEIGHT_CLASS_HUGE
+ to_chat(user, "You unfold the stock.")
+ recoil = 1
+ spread = 0
+ else
+ w_class = WEIGHT_CLASS_NORMAL
+ to_chat(user, "You fold the stock.")
+ recoil = 5
+ spread = 2
+ update_icon()
+
+/obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_icon()
+ icon_state = "[current_skin ? unique_reskin[current_skin] : "cshotgun"][stock ? "" : "c"]"
//Dual Feed Shotgun
@@ -235,6 +264,7 @@
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user)
..()
to_chat(user, "Alt-click to pump it.")
+ . = ..()
/obj/item/gun/ballistic/shotgun/automatic/dual_tube/Initialize()
. = ..()
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 6e2c9dc62a..87bfd578bc 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -304,3 +304,22 @@
/obj/item/gun/energy/gravity_gun/security
pin = /obj/item/firing_pin
+
+//Emitter Gun
+
+/obj/item/gun/energy/emitter
+ name = "Emitter Carbine"
+ desc = "A small emitter fitted into a handgun case, do to size constraints and safety it can only shoot about ten times when fully charged."
+ icon_state = "emitter_carbine"
+ force = 12
+ w_class = WEIGHT_CLASS_SMALL
+ cell_type = /obj/item/stock_parts/cell/super
+ ammo_type = list(/obj/item/ammo_casing/energy/emitter)
+
+/obj/item/gun/energy/emitter/update_icon()
+ ..()
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(!QDELETED(cell) && (cell.charge > shot.e_cost))
+ add_overlay("emitter_carbine_empty")
+ else
+ add_overlay("emitter_carbine")
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index e3724fdf31..42033d8c88 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -131,7 +131,7 @@
no_den_usage = 1
/obj/item/gun/magic/wand/teleport/zap_self(mob/living/user)
- if(do_teleport(user, user, 10))
+ if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC))
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(3, user.loc)
smoke.start()
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 05d6367306..da3743f053 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -37,10 +37,12 @@
to_chat(user, "This firearm already has a firing pin installed.")
/obj/item/firing_pin/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You override the authentication mechanism.")
+ return TRUE
/obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/G)
gun = G
diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm
index f5d0607341..c8333a811c 100644
--- a/code/modules/projectiles/projectile/energy/net_snare.dm
+++ b/code/modules/projectiles/projectile/energy/net_snare.dm
@@ -42,10 +42,10 @@
/obj/effect/nettingportal/proc/pop(teletarget)
if(teletarget)
for(var/mob/living/L in get_turf(src))
- do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon
+ do_teleport(L, teletarget, 2, channel = TELEPORT_CHANNEL_BLUESPACE)//teleport what's in the tile to the beacon
else
for(var/mob/living/L in get_turf(src))
- do_teleport(L, L, 15) //Otherwise it just warps you off somewhere.
+ do_teleport(L, L, 15, channel = TELEPORT_CHANNEL_BLUESPACE) //Otherwise it just warps you off somewhere.
qdel(src)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index dee88f176f..5b84608fad 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -67,7 +67,7 @@
teleloc = target.loc
for(var/atom/movable/stuff in teleloc)
if(!stuff.anchored && stuff.loc)
- if(do_teleport(stuff, stuff, 10))
+ if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC))
teleammount++
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
index a62fa25f7d..e15810c6bb 100644
--- a/code/modules/projectiles/projectile/special/rocket.dm
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -16,6 +16,7 @@
var/anti_armour_damage = 200
armour_penetration = 100
dismemberment = 100
+ ricochets_max = 0
/obj/item/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
..()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 2bca1fc031..d1eec39f44 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -1,3 +1,5 @@
+#define CHEMICAL_QUANTISATION_LEVEL 0.0001
+
/proc/build_chemical_reagent_list()
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
@@ -94,7 +96,7 @@
var/list/data = list()
for(var/r in reagent_list) //no reagents will be left behind
var/datum/reagent/R = r
- data += "[R.id] ([round(R.volume, 0.1)]u)"
+ data += "[R.id] ([round(R.volume, CHEMICAL_QUANTISATION_LEVEL)]u)"
//Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
return english_list(data)
@@ -471,7 +473,7 @@
return 0
for(var/B in cached_required_reagents)
- multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01))
+ multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), CHEMICAL_QUANTISATION_LEVEL))
for(var/P in selected_reaction.results)
targetVol = cached_results[P]*multiplier
@@ -498,7 +500,7 @@
return 0
for(var/B in cached_required_reagents) //
- multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), 0.01))
+ multiplier = min(multiplier, round((get_reagent_amount(B) / cached_required_reagents[B]), CHEMICAL_QUANTISATION_LEVEL))
for(var/B in cached_required_reagents)
remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1, ignore_pH = TRUE)
@@ -646,8 +648,8 @@
addChemAmmount = deltaT * stepChemAmmount
if (addChemAmmount >= (targetVol - reactedVol))
addChemAmmount = (targetVol - reactedVol)
- if (addChemAmmount < 0.01)
- addChemAmmount = 0.01
+ if (addChemAmmount < CHEMICAL_QUANTISATION_LEVEL)
+ addChemAmmount = CHEMICAL_QUANTISATION_LEVEL
removeChemAmmount = (addChemAmmount/cached_results[P])
//This is kept for future bugtesters.
//message_admins("Reaction vars: PreReacted: [reactedVol] of [targetVol]. deltaT [deltaT], multiplier [multiplier], Step [stepChemAmmount], uncapped Step [deltaT*(multiplier*cached_results[P])], addChemAmmount [addChemAmmount], removeFactor [removeChemAmmount] Pfactor [cached_results[P]], adding [addChemAmmount]")
@@ -692,11 +694,7 @@
return
//Make sure things are limited.
- if (pH > 14)
- pH = 14
- else if (pH < 0)
- pH = 0
- //some beakers melt at extremes. This proc is called in add_reagent
+ pH = CLAMP(pH, 0, 14)
//return said amount to compare for next step.
return (reactedVol)
@@ -743,7 +741,7 @@
total_volume = 0
for(var/reagent in cached_reagents)
var/datum/reagent/R = reagent
- if(R.volume < 0.1)
+ if(R.volume < CHEMICAL_QUANTISATION_LEVEL)
del_reagent(R.id)
else
total_volume += R.volume
@@ -812,7 +810,7 @@
if(!isnum(amount) || !amount)
return FALSE
- if(amount <= 0.00)
+ if(amount <= CHEMICAL_QUANTISATION_LEVEL)//To prevent small ammount problems.
return FALSE
var/datum/reagent/D = GLOB.chemical_reagents_list[reagent]
@@ -971,7 +969,7 @@
if(!amount)
return R
else
- if(R.volume >= amount)
+ if(round(R.volume, CHEMICAL_QUANTISATION_LEVEL) >= amount)
return R
else
return 0
@@ -983,7 +981,7 @@
for(var/_reagent in cached_reagents)
var/datum/reagent/R = _reagent
if (R.id == reagent)
- return R.volume
+ return round(R.volume, CHEMICAL_QUANTISATION_LEVEL)
return 0
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index bc998c6657..9a228b28e3 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -139,12 +139,14 @@
/obj/machinery/chem_dispenser/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
to_chat(user, "[src] has no functional safeties to emag.")
return
to_chat(user, "You short out [src]'s safeties.")
dispensable_reagents |= emagged_reagents//add the emagged reagents to the dispensable ones
obj_flags |= EMAGGED
+ return TRUE
/obj/machinery/chem_dispenser/ex_act(severity, target)
if(severity < 3)
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index fd0a896406..002c54be94 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -21,6 +21,7 @@
var/analyzeVars[0]
var/useramount = 30 // Last used amount
var/list/pillStyles
+ var/fermianalyze //Give more detail on fermireactions on analysis
/obj/machinery/chem_master/Initialize()
create_reagents(100)
@@ -102,12 +103,9 @@
updateUsrDialog()
update_icon()
else if(!condi && istype(I, /obj/item/storage/pill_bottle))
- if(bottle)
- to_chat(user, "A pill bottle is already loaded into [src]!")
- return
if(!user.transferItemToLoc(I, src))
return
- bottle = I
+ replace_pillbottle(user, I)
to_chat(user, "You add [I] into the dispenser slot.")
updateUsrDialog()
else
@@ -131,12 +129,23 @@
update_icon()
return TRUE
-/obj/machinery/chem_master/on_deconstruction()
- replace_beaker(usr)
+/obj/machinery/chem_master/proc/replace_pillbottle(mob/living/user, obj/item/storage/pill_bottle/new_bottle)
if(bottle)
bottle.forceMove(drop_location())
- adjust_item_drop_location(bottle)
+ if(user && Adjacent(user) && !issiliconoradminghost(user))
+ user.put_in_hands(beaker)
+ else
+ adjust_item_drop_location(bottle)
+ if(new_bottle)
+ bottle = new_bottle
+ else
bottle = null
+ update_icon()
+ return TRUE
+
+/obj/machinery/chem_master/on_deconstruction()
+ replace_beaker(usr)
+ replace_pillbottle(usr)
return ..()
/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
@@ -162,6 +171,7 @@
data["condi"] = condi
data["screen"] = screen
data["analyzeVars"] = analyzeVars
+ data["fermianalyze"] = fermianalyze
data["chosenPillStyle"] = chosenPillStyle
data["isPillBottleLoaded"] = bottle ? 1 : 0
if(bottle)
@@ -195,11 +205,8 @@
. = TRUE
if("ejectp")
- if(bottle)
- bottle.forceMove(drop_location())
- adjust_item_drop_location(bottle)
- bottle = null
- . = TRUE
+ replace_pillbottle(usr)
+ . = TRUE
if("transferToBuffer")
if(beaker)
@@ -247,14 +254,14 @@
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr)))
return
var/obj/item/reagent_containers/pill/P
- var/target_loc = drop_location()
+ var/target_loc = bottle ? bottle : drop_location()
var/drop_threshold = INFINITY
if(bottle)
GET_COMPONENT_FROM(STRB, /datum/component/storage, bottle)
if(STRB)
drop_threshold = STRB.max_items - bottle.contents.len
- for(var/i = 0; i < amount; i++)
+ for(var/i in 1 to amount)
if(i < drop_threshold)
P = new(target_loc)
else
@@ -350,10 +357,10 @@
return
var/amount_full = 0
- var/vol_part = min(reagents.total_volume, 30)
+ var/vol_part = min(reagents.total_volume, 60)
if(text2num(many))
- amount_full = round(reagents.total_volume / 30)
- vol_part = reagents.total_volume % 30
+ amount_full = round(reagents.total_volume / 60)
+ vol_part = reagents.total_volume % 60
var/name = stripped_input(usr, "Name:","Name your hypovial!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr)))
return
@@ -363,7 +370,7 @@
P = new/obj/item/reagent_containers/glass/bottle/vial/small(drop_location())
P.name = trim("[name] hypovial")
adjust_item_drop_location(P)
- reagents.trans_to(P, 30)
+ reagents.trans_to(P, 60)
if(vol_part)
P = new/obj/item/reagent_containers/glass/bottle/vial/small(drop_location())
@@ -384,7 +391,14 @@
state = "Gas"
var/const/P = 3 //The number of seconds between life ticks
var/T = initial(R.metabolization_rate) * (60 / P)
- analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold))
+ if(istype(R, /datum/reagent/fermi))
+ fermianalyze = TRUE
+ var/datum/chemical_reaction/Rcr = get_chemical_reaction(R.id)
+ var/pHpeakCache = (Rcr.OptimalpHMin + Rcr.OptimalpHMax)/2
+ analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "purityF" = initial(R.purity), "inverseRatioF" = initial(R.InverseChemVal), "purityE" = initial(Rcr.PurityMin), "minTemp" = initial(Rcr.OptimalTempMin), "maxTemp" = initial(Rcr.OptimalTempMax), "eTemp" = initial(Rcr.ExplodeTemp), "pHpeak" = pHpeakCache)
+ else
+ fermianalyze = FALSE
+ analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold))
screen = "analyze"
return
@@ -437,4 +451,4 @@
condi = TRUE
#undef PILL_STYLE_COUNT
-#undef RANDOM_PILL_STYLE
\ No newline at end of file
+#undef RANDOM_PILL_STYLE
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 45c6069318..c21629ce8f 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -44,6 +44,7 @@
var/DoNotSplit = FALSE // If impurity is handled within the main chem itself
var/OnMobMergeCheck = FALSE //Call on_mob_life proc when reagents are merging.
var/metabolizing = FALSE
+ var/invisible = FALSE //Set to true if it doesn't appear on handheld health analyzers.
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 9424f0b987..79b6f96781 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -230,7 +230,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "glass of vodka"
glass_desc = "The glass contain wodka. Xynta."
shot_glass_icon_state = "shotglassclear"
- pH = 4
+ pH = 8.1
/datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M)
M.radiation = max(M.radiation-2,0)
@@ -528,6 +528,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_name = "Vodka martini"
glass_desc ="A bastardisation of the classic martini. Still great."
+
/datum/reagent/consumable/ethanol/white_russian
name = "White Russian"
id = "whiterussian"
@@ -2102,7 +2103,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M)
if(M.drunkenness > 40)
if(stored_teleports)
- do_teleport(M, get_turf(M), rand(1,3))
+ do_teleport(M, get_turf(M), rand(1,3), channel = TELEPORT_CHANNEL_WORMHOLE)
stored_teleports--
if(prob(10))
stored_teleports += rand(2,6)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 5719ec81b6..19aeaeb25e 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -323,7 +323,7 @@
victim.blind_eyes(2)
victim.confused = max(M.confused, 3)
victim.damageoverlaytemp = 60
- victim.Knockdown(60, override_stamdmg = min(reac_volume * 3, 15))
+ victim.Knockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 3, 15))
return
else if ( eyes_covered ) // Eye cover is better than mouth cover
victim.blur_eyes(3)
@@ -336,7 +336,7 @@
victim.blind_eyes(3)
victim.confused = max(M.confused, 6)
victim.damageoverlaytemp = 75
- victim.Knockdown(100, override_stamdmg = min(reac_volume * 5, 25))
+ victim.Knockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 5, 25))
victim.update_damage_hud()
/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 22e230e671..07c9b166ff 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -351,7 +351,7 @@
//We only get 30u to start with...
/datum/reagent/fuel/holyoil/reaction_obj(obj/O, reac_volume)
- . = ..()
+ . = ..()
if(istype(O, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = O
reac_volume = min(reac_volume, M.amount)
@@ -1013,7 +1013,7 @@
/datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
- do_teleport(M, get_turf(M), (reac_volume / 5), asoundin = 'sound/effects/phasein.ogg') //4 tiles per crystal
+ do_teleport(M, get_turf(M), (reac_volume / 5), asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) //4 tiles per crystal
..()
/datum/reagent/bluespace/on_mob_life(mob/living/carbon/M)
@@ -1025,7 +1025,7 @@
..()
/mob/living/proc/bluespace_shuffle()
- do_teleport(src, get_turf(src), 5, asoundin = 'sound/effects/phasein.ogg')
+ do_teleport(src, get_turf(src), 5, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
/datum/reagent/aluminium
name = "Aluminium"
@@ -1993,3 +1993,41 @@
P.length += added_length
P.update()
..()
+
+/datum/reagent/changeling_string
+ name = "UNKNOWN"
+ id = "changeling_sting_real"
+ description = "404: Chemical not found."
+ metabolization_rate = REAGENTS_METABOLISM
+ color = "#0000FF"
+ can_synth = FALSE
+ var/datum/dna/original_dna
+ var/reagent_ticks = 0
+ invisible = TRUE
+
+/datum/reagent/changeling_string/on_mob_metabolize(mob/living/carbon/C)
+ if(C && C.dna && data["desired_dna"])
+ original_dna = new C.dna.type
+ C.dna.copy_dna(original_dna)
+ var/datum/dna/new_dna = data["desired_dna"]
+ new_dna.copy_dna(C.dna)
+ C.real_name = new_dna.real_name
+ C.updateappearance(mutcolor_update=1)
+ C.update_body()
+ C.domutcheck()
+ C.regenerate_icons()
+ ..()
+
+/datum/reagent/changeling_string/on_mob_end_metabolize(mob/living/carbon/C)
+ if(original_dna)
+ original_dna.copy_dna(C.dna)
+ C.real_name = original_dna.real_name
+ C.updateappearance(mutcolor_update=1)
+ C.update_body()
+ C.domutcheck()
+ C.regenerate_icons()
+ ..()
+
+/datum/reagent/changeling_string/Destroy()
+ qdel(original_dna)
+ return ..()
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index bf1dc66ee9..014401b72c 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -54,7 +54,7 @@
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
. = ..()
- if((!proximity) || !spillable || !check_allowed_items(target,target_self=1))
+ if((!proximity) || !check_allowed_items(target,target_self=1))
return
if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it.
diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm
new file mode 100644
index 0000000000..92a4b155d8
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/rags.dm
@@ -0,0 +1,177 @@
+/obj/item/reagent_containers/rag
+ name = "damp rag"
+ desc = "For cleaning up messes, you suppose."
+ w_class = WEIGHT_CLASS_TINY
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "rag"
+ item_flags = NOBLUDGEON
+ reagent_flags = OPENCONTAINER
+ amount_per_transfer_from_this = 5
+ possible_transfer_amounts = list()
+ volume = 5
+ spillable = FALSE
+ var/wipe_sound
+ var/soak_efficiency = 1
+ var/extinguish_efficiency = 0
+ var/action_speed = 3 SECONDS
+ var/damp_threshold = 0.5
+
+/obj/item/reagent_containers/rag/suicide_act(mob/user)
+ user.visible_message("[user] is smothering [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ return (OXYLOSS)
+
+/obj/item/reagent_containers/rag/examine(mob/user)
+ . = ..()
+ if(reagents.total_volume)
+ to_chat(user, "Alt-Click to squeeze the liquids out of it.")
+
+/obj/item/reagent_containers/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity)
+ . = ..()
+ if(!proximity)
+ return
+ if(iscarbon(A) && A.reagents && reagents.total_volume)
+ var/mob/living/carbon/C = A
+ var/reagentlist = pretty_string_from_reagent_list(reagents)
+ var/log_object = "a damp rag containing [reagentlist]"
+ if(user.a_intent == INTENT_HARM && !C.is_mouth_covered())
+ reagents.reaction(C, INGEST)
+ reagents.trans_to(C, 5)
+ C.visible_message("[user] has smothered \the [C] with \the [src]!", "[user] has smothered you with \the [src]!", "You hear some struggling and muffled cries of surprise.")
+ log_combat(user, C, "smothered", log_object)
+ else
+ reagents.reaction(C, TOUCH)
+ reagents.remove_all(5)
+ C.visible_message("[user] has touched \the [C] with \the [src].")
+ log_combat(user, C, "touched", log_object)
+
+ else if(istype(A) && src in user)
+ user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...")
+ if(do_after(user, action_speed, target = A))
+ user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].")
+ SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM)
+ return
+
+/obj/item/reagent_containers/rag/pre_altattackby(mob/living/M, mob/living/user, params)
+ if(istype(M) && user.a_intent == INTENT_HELP)
+ user.changeNext_move(CLICK_CD_MELEE)
+ if(M.on_fire)
+ user.visible_message("\The [user] uses \the [src] to pat out [M == user ? "[user.p_their()]" : "\the [M]'s"] flames!")
+ if(hitsound)
+ playsound(M, hitsound, 25, 1)
+ M.adjust_fire_stacks(-min(extinguish_efficiency, M.fire_stacks))
+ else
+ if(reagents.total_volume > (volume * damp_threshold))
+ to_chat(user, "\The [src] is too drenched to be used to dry [user == M ? "yourself" : "\the [M]"] off.")
+ return TRUE
+ user.visible_message("\The [user] starts drying [M == user ? "[user.p_them()]self" : "\the [M]"] off with \the [src]...")
+ if(do_mob(user, M, action_speed))
+ if(reagents.total_volume > (volume * damp_threshold))
+ return
+ user.visible_message("\The [user] dries [M == user ? "[user.p_them()]self" : "\the [M]"] off with \the [src].")
+ if(wipe_sound)
+ playsound(M, wipe_sound, 25, 1)
+ if(M.fire_stacks)
+ var/minus_plus = M.fire_stacks < 0 ? 1 : -1
+ var/amount = min(abs(M.fire_stacks), soak_efficiency)
+ var/r_id = "fuel"
+ if(M.fire_stacks < 0)
+ r_id = "water"
+ reagents.add_reagent(r_id, amount * 0.3)
+ M.adjust_fire_stacks(minus_plus * amount)
+ M.wash_cream()
+ return TRUE
+ return ..()
+
+/obj/item/reagent_containers/rag/AltClick(mob/user)
+ . = ..()
+ if(reagents.total_volume && user.canUseTopic(src, BE_CLOSE))
+ to_chat(user, "You start squeezing the liquids out of \the [src]...")
+ if(do_after(user, action_speed, TRUE, src))
+ to_chat(user, "You squeeze \the [src] dry.")
+ var/atom/react_loc = get_turf(src)
+ if(ismob(react_loc))
+ react_loc = react_loc.loc
+ if(react_loc)
+ reagents.reaction(react_loc, TOUCH)
+ reagents.clear_reagents()
+
+/obj/item/reagent_containers/rag/towel
+ name = "towel"
+ desc = "A soft cotton towel."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "towel"
+ item_state = "towel"
+ slot_flags = ITEM_SLOT_HEAD | ITEM_SLOT_BELT | ITEM_SLOT_OCLOTHING
+ item_flags = NOBLUDGEON | NO_UNIFORM_REQUIRED //so it can be worn on the belt slot even with no uniform.
+ force = 1
+ w_class = WEIGHT_CLASS_NORMAL
+ attack_verb = list("whipped")
+ hitsound = 'sound/items/towelwhip.ogg'
+ volume = 10
+ total_mass = 2
+ wipe_sound = 'sound/items/towelwipe.ogg'
+ soak_efficiency = 4
+ extinguish_efficiency = 3
+ var/flat_icon = "towel_flat"
+ var/folded_icon = "towel"
+ var/list/possible_colors
+
+/obj/item/reagent_containers/rag/towel/Initialize()
+ . = ..()
+ if(possible_colors)
+ add_atom_colour(pick(possible_colors), FIXED_COLOUR_PRIORITY)
+
+/obj/item/reagent_containers/rag/towel/attack(mob/living/M, mob/living/user)
+ if(user.a_intent == INTENT_HARM)
+ DISABLE_BITFIELD(item_flags, NOBLUDGEON)
+ . = TRUE
+ ..()
+ if(.)
+ ENABLE_BITFIELD(item_flags, NOBLUDGEON)
+
+/obj/item/reagent_containers/rag/towel/equipped(mob/living/user, slot)
+ . = ..()
+ switch(slot)
+ if(SLOT_BELT)
+ body_parts_covered = GROIN|LEGS
+ if(SLOT_WEAR_SUIT)
+ body_parts_covered = CHEST|GROIN|LEGS
+ if(SLOT_HEAD)
+ body_parts_covered = HEAD
+ flags_inv = HIDEHAIR
+
+/obj/item/reagent_containers/rag/towel/dropped(mob/user)
+ . = ..()
+ body_parts_covered = NONE
+ flags_inv = NONE
+
+/obj/item/reagent_containers/rag/towel/attack_self(mob/user)
+ if(!user.CanReach(src) || !user.dropItemToGround(src))
+ return
+ to_chat(user, "You lay out \the [src] flat on the ground.")
+ icon_state = flat_icon
+ layer = BELOW_OBJ_LAYER
+
+/obj/item/reagent_containers/rag/towel/pickup(mob/living/user)
+ . = ..()
+ icon_state = folded_icon
+ layer = initial(layer)
+
+/obj/item/reagent_containers/rag/towel/on_reagent_change(changetype)
+ force = initial(force) + round(reagents.total_volume * 0.5)
+
+/obj/item/reagent_containers/rag/towel/random
+ possible_colors = list("#FF0000","#FF7F00","#FFFF00","#00FF00","#0000FF","#4B0082","#8F00FF")
+
+/obj/item/reagent_containers/rag/towel/syndicate
+ name = "syndicate towel"
+ desc = "Truly a weapon of mass destruction."
+ possible_colors = list("#DD1A1A", "#DB4325", "#E02700")
+ force = 4
+ armour_penetration = 10
+ volume = 20
+ soak_efficiency = 6
+ extinguish_efficiency = 5
+ action_speed = 15
+ damp_threshold = 0.8
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 50, "acid" = 50) //items don't provide armor to wearers unlike clothing yet.
\ No newline at end of file
diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo .dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo .dm
index fd548adc76..b11a5ee258 100644
--- a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo .dm
+++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo .dm
@@ -32,4 +32,12 @@
id = "mining"
build_path = /obj/item/circuitboard/computer/mining
category = list("Computer Boards")
- departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY
\ No newline at end of file
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/board/miningshuttle
+ name = "Computer Design (Mining Shuttle Console)"
+ desc = "Allows for the construction of circuit boards used to build a Mining Shuttle Console."
+ id = "miningshuttle"
+ build_path = /obj/item/circuitboard/computer/mining_shuttle
+ category = list("Computer Boards")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO
\ No newline at end of file
diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm
index 019d4461de..4a6f9625f1 100644
--- a/code/modules/research/designs/misc_designs.dm
+++ b/code/modules/research/designs/misc_designs.dm
@@ -290,6 +290,16 @@
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/light_replacer
+ name = "Light Replacer"
+ desc = "A device to automatically replace lights. Refill with working light bulbs."
+ id = "light_replacer"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1500, MAT_SILVER = 150, MAT_GLASS = 3000)
+ build_path = /obj/item/lightreplacer
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
/datum/design/blutrash
name = "Trashbag of Holding"
desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage."
@@ -459,6 +469,16 @@
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+/datum/design/quantum_keycard
+ name = "Quantum Keycard"
+ desc = "Allows for the construction of a quantum keycard."
+ id = "quantum_keycard"
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 500, MAT_METAL = 500, MAT_SILVER = 500, MAT_BLUESPACE = 1000)
+ build_path = /obj/item/quantum_keycard
+ category = list("Equipment")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+
/datum/design/anomaly_neutralizer
name = "Anomaly Neutralizer"
desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine."
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index f8122c16e3..1dbd111785 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -57,16 +57,6 @@
category = list("Misc","Power Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-/datum/design/light_replacer
- name = "Light Replacer"
- desc = "A device to automatically replace lights. Refill with working light bulbs."
- id = "light_replacer"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 1500, MAT_SILVER = 150, MAT_GLASS = 3000)
- build_path = /obj/item/lightreplacer
- category = list("Power Designs")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
-
/datum/design/inducer
name = "Inducer"
desc = "The NT-75 Electromagnetic Power Inducer can wirelessly induce electric charge in an object, allowing you to recharge power cells without having to remove them."
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index ebd386513e..e56350a280 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -651,7 +651,7 @@
if(loc == user && !is_centcom_level(userturf.z)) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you!
visible_message("[src] twists and bends, relocating itself!")
throwSmoke(userturf)
- do_teleport(user, userturf, 8, asoundin = 'sound/effects/phasein.ogg')
+ do_teleport(user, userturf, 8, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
throwSmoke(get_turf(user))
warn_admins(user, "Teleport", 0)
diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm
index 81c5a44527..e33f3d7cd7 100644
--- a/code/modules/research/nanites/nanite_program_hub.dm
+++ b/code/modules/research/nanites/nanite_program_hub.dm
@@ -115,4 +115,10 @@
qdel(disk.program)
disk.program = null
disk.name = initial(disk.name)
- . = TRUE
\ No newline at end of file
+ . = TRUE
+
+
+/obj/machinery/nanite_program_hub/admin/Initialize()
+ . = ..()
+ linked_techweb = SSresearch.admin_tech
+
diff --git a/code/modules/research/nanites/nanite_programs/buffing.dm b/code/modules/research/nanites/nanite_programs/buffing.dm
index c80c5c5d96..be12d06ede 100644
--- a/code/modules/research/nanites/nanite_programs/buffing.dm
+++ b/code/modules/research/nanites/nanite_programs/buffing.dm
@@ -49,14 +49,14 @@
. = ..()
if(ishuman(host_mob))
var/mob/living/carbon/human/H = host_mob
- H.physiology.armor.melee += 50
+ H.physiology.armor.melee += 35
H.physiology.armor.bullet += 35
/datum/nanite_program/hardening/disable_passive_effect()
. = ..()
if(ishuman(host_mob))
var/mob/living/carbon/human/H = host_mob
- H.physiology.armor.melee -= 50
+ H.physiology.armor.melee -= 35
H.physiology.armor.bullet -= 35
/datum/nanite_program/refractive
@@ -69,14 +69,14 @@
. = ..()
if(ishuman(host_mob))
var/mob/living/carbon/human/H = host_mob
- H.physiology.armor.laser += 50
+ H.physiology.armor.laser += 35
H.physiology.armor.energy += 35
/datum/nanite_program/refractive/disable_passive_effect()
. = ..()
if(ishuman(host_mob))
var/mob/living/carbon/human/H = host_mob
- H.physiology.armor.laser -= 50
+ H.physiology.armor.laser -= 35
H.physiology.armor.energy -= 35
/datum/nanite_program/coagulating
@@ -127,4 +127,4 @@
/datum/nanite_program/mindshield/disable_passive_effect()
. = ..()
REMOVE_TRAIT(host_mob, TRAIT_MINDSHIELD, "nanites")
- host_mob.sec_hud_set_implants()
\ No newline at end of file
+ host_mob.sec_hud_set_implants()
diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm
index 686e0fafea..8aab7f1e2b 100644
--- a/code/modules/research/nanites/nanite_programs/healing.dm
+++ b/code/modules/research/nanites/nanite_programs/healing.dm
@@ -48,7 +48,7 @@
/datum/nanite_program/purging
name = "Blood Purification"
- desc = "The nanites purge toxins and chemicals from the host's bloodstream."
+ desc = "The nanites purge toxins and chemicals from the host's bloodstream, however it is dangerous to slimepeople biology due to inaccuracy."
use_rate = 1
rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic)
@@ -143,7 +143,7 @@
/datum/nanite_program/purging_advanced
name = "Selective Blood Purification"
desc = "The nanites purge toxins and dangerous chemicals from the host's bloodstream, while ignoring beneficial chemicals. \
- The added processing power required to analyze the chemicals severely increases the nanite consumption rate."
+ The added processing power required to analyze the chemicals severely increases the nanite consumption rate. Due to added complexity, it is safe with slimepeople biology."
use_rate = 2
rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic)
@@ -157,7 +157,7 @@
return ..()
/datum/nanite_program/purging_advanced/active_effect()
- host_mob.adjustToxLoss(-1)
+ host_mob.adjustToxLoss(-1, forced = TRUE)
for(var/datum/reagent/toxin/R in host_mob.reagents.reagent_list)
host_mob.reagents.remove_reagent(R.id,1)
diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm
index 77fb4e1005..44b85e4210 100644
--- a/code/modules/research/nanites/nanite_programs/utility.dm
+++ b/code/modules/research/nanites/nanite_programs/utility.dm
@@ -190,13 +190,13 @@
if(!iscarbon(host_mob))
return FALSE
var/mob/living/carbon/C = host_mob
- if(C.nutrition <= NUTRITION_LEVEL_WELL_FED)
+ if(C.nutrition <= NUTRITION_LEVEL_STARVING)
return FALSE
return ..()
/datum/nanite_program/metabolic_synthesis/active_effect()
host_mob.nutrition -= 0.5
- nanites.adjust_nanites(0.5)
+ nanites.adjust_nanites(src, 0.5)
/datum/nanite_program/triggered/access
name = "Subdermal ID"
diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm
index f4914d4af0..4f29398e91 100644
--- a/code/modules/research/nanites/nanite_programs/weapon.dm
+++ b/code/modules/research/nanites/nanite_programs/weapon.dm
@@ -46,13 +46,13 @@
/datum/nanite_program/aggressive_replication
name = "Aggressive Replication"
desc = "Nanites will consume organic matter to improve their replication rate, damaging the host. The efficiency increases with the volume of nanites, requiring 200 to break even."
- use_rate = 1
+ use_rate = 0
rogue_types = list(/datum/nanite_program/necrotic)
/datum/nanite_program/aggressive_replication/active_effect()
- var/extra_regen = round(nanites.nanite_volume / 200, 0.1)
- nanites.adjust_nanites(extra_regen)
- host_mob.adjustBruteLoss(extra_regen / 2, TRUE)
+ var/extra_regen = round(nanites.nanite_volume / 50, 0.1)
+ nanites.adjust_nanites(src, extra_regen)
+ host_mob.adjustBruteLoss(extra_regen / 3, TRUE)
/datum/nanite_program/meltdown
name = "Meltdown"
@@ -89,10 +89,9 @@
/datum/nanite_program/triggered/explosive/proc/boom()
var/nanite_amount = nanites.nanite_volume
- var/dev_range = FLOOR(nanite_amount/200, 1) - 1
var/heavy_range = FLOOR(nanite_amount/100, 1) - 1
var/light_range = FLOOR(nanite_amount/50, 1) - 1
- explosion(host_mob, dev_range, heavy_range, light_range)
+ explosion(host_mob, 0, heavy_range, light_range)
qdel(nanites)
//TODO make it defuse if triggered again
@@ -197,4 +196,4 @@
if(host_mob.mind && host_mob.mind.has_antag_datum(/datum/antagonist/brainwashed))
host_mob.mind.remove_antag_datum(/datum/antagonist/brainwashed)
log_game("[key_name(host_mob)] is no longer brainwashed by nanites.")
- cooldown = world.time + 450
\ No newline at end of file
+ cooldown = world.time + 450
diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm
index 60dd78cf94..824d033bf4 100644
--- a/code/modules/research/nanites/nanite_remote.dm
+++ b/code/modules/research/nanites/nanite_remote.dm
@@ -37,6 +37,7 @@
to_chat(user, "Access denied.")
/obj/item/nanite_remote/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
to_chat(user, "You override [src]'s ID lock.")
@@ -44,6 +45,7 @@
if(locked)
locked = FALSE
update_icon()
+ return TRUE
/obj/item/nanite_remote/update_icon()
. = ..()
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index cb5062904d..a7d7857a24 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -184,12 +184,14 @@ Nothing else in the console has ID requirements.
..()
/obj/machinery/computer/rdconsole/emag_act(mob/user)
- if(!(obj_flags & EMAGGED))
- to_chat(user, "You disable the security protocols[locked? " and unlock the console":""].")
- playsound(src, "sparks", 75, 1)
- obj_flags |= EMAGGED
- locked = FALSE
- return ..()
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ to_chat(user, "You disable the security protocols[locked? " and unlock the console":""].")
+ playsound(src, "sparks", 75, 1)
+ obj_flags |= EMAGGED
+ locked = FALSE
+ return TRUE
/obj/machinery/computer/rdconsole/multitool_act(mob/user, obj/item/multitool/I)
var/lathe = linked_lathe && linked_lathe.multitool_act(user, I)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 20e05782ef..b3e114d2ad 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -155,8 +155,10 @@
src.updateUsrDialog()
/obj/machinery/computer/rdservercontrol/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
playsound(src, "sparks", 75, 1)
obj_flags |= EMAGGED
to_chat(user, "You disable the security protocols.")
+ return TRUE
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index ac20f97dee..99397897c6 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -221,13 +221,22 @@
//research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
//export_price = 5000
+/datum/techweb_node/computer_board_gaming
+ id = "computer_board_gaming"
+ display_name = "Games and Toys"
+ description = "For the slackers on the station."
+ prereq_ids = list("comptech")
+ design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
+ export_price = 5000
+
/////////////////////////Bluespace tech/////////////////////////
/datum/techweb_node/bluespace_basic //Bluespace-memery
id = "bluespace_basic"
display_name = "Basic Bluespace Theory"
description = "Basic studies into the mysterious alternate dimension known as bluespace."
prereq_ids = list("base", "datatheory")
- design_ids = list("beacon", "xenobioconsole", "telesci_gps")
+ design_ids = list("beacon", "xenobioconsole", "telesci_gps", "xenobio_monkeys")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -236,7 +245,7 @@
display_name = "Applied Bluespace Research"
description = "Using bluespace to make things faster and better."
prereq_ids = list("bluespace_basic", "engineering")
- design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart")
+ design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
export_price = 5000
@@ -245,7 +254,7 @@
display_name = "Advanced Bluespace Research"
description = "Deeper understanding of how the Bluespace dimension works"
prereq_ids = list("practical_bluespace", "high_efficiency")
- design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal")
+ design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal", "xenobio_slimeadv")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
export_price = 5000
@@ -278,10 +287,10 @@
/datum/techweb_node/bluespace_warping
id = "bluespace_warping"
- display_name = "Bluespace Teleportation tech"
- description = "Traversing through space at an instant with Bluespace."
+ display_name = "Bluespace Travel"
+ description = "Application of Bluespace for static teleportation technology."
prereq_ids = list("adv_power", "adv_bluespace")
- design_ids = list( "tele_station", "tele_hub", "quantumpad", "launchpad", "launchpad_console", "teleconsole", "roastingstick")
+ design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -423,7 +432,7 @@
display_name = "Computer Consoles"
description = "Computers and how they work."
prereq_ids = list("datatheory")
- design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera")
+ design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "miningshuttle", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
export_price = 5000
@@ -438,15 +447,6 @@
"portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced",
"bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small")
-/datum/techweb_node/computer_board_gaming
- id = "computer_board_gaming"
- display_name = "Arcade Games"
- description = "For the slackers on the station."
- prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "slotmachine") // Magic money
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 2000
-
/datum/techweb_node/comp_recordkeeping
id = "comp_recordkeeping"
display_name = "Computerized Recordkeeping"
@@ -672,7 +672,7 @@
display_name = "Ballistic Weaponry"
description = "This isn't research.. This is reverse-engineering!"
prereq_ids = list("weaponry")
- design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic")
+ design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber", "mag_oldsmg_tx")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
export_price = 5000
@@ -1049,6 +1049,15 @@
continue
boost_item_paths |= UI.item //allows deconning to unlock.
+/datum/techweb_node/advanced_illegl_ballistics
+ id = "advanced_illegal_ballistics"
+ display_name = "Advanced Illegal Ballistics"
+ description = "Advanced Ballistic for Illegal weaponds."
+ design_ids = list("10mm","10mmap","10mminc","10mmhp","pistolm9mm","m45","bolt_clip")
+ prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space.
+ export_price = 7000
+
//Helpers for debugging/balancing the techweb in its entirety!
/proc/total_techweb_exports()
var/list/datum/techweb_node/processing = list()
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index ad5bfa27dc..b9e7122d07 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -680,7 +680,7 @@ datum/status_effect/stabilized/blue/on_remove()
if(!F)
F = get_turf(owner)
range = 50
- if(do_teleport(owner, F, range))
+ if(do_teleport(owner, F, range, channel = TELEPORT_CHANNEL_BLUESPACE))
to_chat(owner, "[linked_extract] will take some time to re-align you on the bluespace axis.")
do_sparks(5,FALSE,owner)
owner.apply_status_effect(/datum/status_effect/bluespacestabilization)
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 141e6b1fe1..4753abff97 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -9,11 +9,13 @@
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
+ slot_flags = NONE
force = 5
max_charges = 1 //Recharging costs blood.
recharge_rate = 1
ammo_type = /obj/item/ammo_casing/magic/bloodchill
fire_sound = 'sound/effects/attackblob.ogg'
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/gun/magic/bloodchill/Initialize()
. = ..()
@@ -46,4 +48,4 @@
/obj/item/projectile/magic/bloodchill/on_hit(mob/living/target)
. = ..()
if(isliving(target))
- target.apply_status_effect(/datum/status_effect/bloodchill)
\ No newline at end of file
+ target.apply_status_effect(/datum/status_effect/bloodchill)
diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm
index 38362e6d64..363331e12d 100644
--- a/code/modules/research/xenobiology/crossbreeding/burning.dm
+++ b/code/modules/research/xenobiology/crossbreeding/burning.dm
@@ -144,7 +144,7 @@ Burning extracts:
user.visible_message("[src] sparks, and lets off a shockwave of bluespace energy!")
for(var/mob/living/L in range(1, get_turf(user)))
if(L != user)
- do_teleport(L, get_turf(L), 6, asoundin = 'sound/effects/phasein.ogg') //Somewhere between the effectiveness of fake and real BS crystal
+ do_teleport(L, get_turf(L), 6, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) //Somewhere between the effectiveness of fake and real BS crystal
new /obj/effect/particle_effect/sparks(get_turf(L))
playsound(get_turf(L), "sparks", 50, 1)
..()
diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm
index b51a7b2553..0b2d60da8c 100644
--- a/code/modules/research/xenobiology/crossbreeding/consuming.dm
+++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm
@@ -232,7 +232,7 @@ Consuming extracts:
L.Cut(I,I+1)
if(target)
- do_teleport(M, target, 0, asoundin = 'sound/effects/phasein.ogg')
+ do_teleport(M, target, 0, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
new /obj/effect/particle_effect/sparks(get_turf(M))
playsound(get_turf(M), "sparks", 50, 1)
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index ce36be8e42..7acbaaac1c 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -494,7 +494,7 @@
to_chat(user, "You feel your body vibrating...")
if(do_after(user, 25, target = user))
to_chat(user, "You teleport!")
- do_teleport(user, get_turf(user), 6, asoundin = 'sound/weapons/emitter2.ogg')
+ do_teleport(user, get_turf(user), 6, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
return 300
if(SLIME_ACTIVATE_MAJOR)
@@ -510,7 +510,7 @@
if(teleport_x && teleport_y && teleport_z)
var/turf/T = locate(teleport_x, teleport_y, teleport_z)
to_chat(user, "You snap back to your anchor point!")
- do_teleport(user, T, asoundin = 'sound/weapons/emitter2.ogg')
+ do_teleport(user, T, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
return 450
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 0c957919a1..946f0fb9a4 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -63,11 +63,13 @@
to_chat(usr, "Unable to comply.")
/obj/machinery/computer/shuttle/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
req_access = list()
obj_flags |= EMAGGED
to_chat(user, "You fried the consoles ID checking system.")
+ return TRUE
/obj/machinery/computer/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
if(port && (shuttleId == initial(shuttleId) || override))
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 020b4b29ab..119023d465 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -134,6 +134,8 @@
. = TRUE
/obj/machinery/computer/emergency_shuttle/emag_act(mob/user)
+ . = ..()
+
// How did you even get on the shuttle before it go to the station?
if(!IS_DOCKED)
return
@@ -159,6 +161,7 @@
authorized += ID
process()
+ return TRUE
/obj/machinery/computer/emergency_shuttle/Destroy()
// Our fake IDs that the emag generated are just there for colour
@@ -459,10 +462,12 @@
return
/obj/machinery/computer/shuttle/pod/emag_act(mob/user)
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You fry the pod's alert level checking system.")
+ return TRUE
/obj/machinery/computer/shuttle/pod/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
. = ..()
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index eaa1f36b75..39ab087f9c 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -12,7 +12,7 @@
/obj/machinery/computer/shuttle/ferry/emag_act(mob/user)
if(!allow_emag)
to_chat(user, "[src]'s security firewall is far too powerful for you to bypass.")
- return FALSE
+ return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
return ..()
/obj/machinery/computer/shuttle/ferry/attack_ai()
@@ -37,4 +37,4 @@
return
last_request = world.time
to_chat(usr, "Your request has been received by CentCom.")
- to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.")
+ to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.")
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index a6904c28cc..dd2d7483e3 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -179,7 +179,7 @@ All ShuttleMove procs go here
for(var/obj/machinery/door/airlock/A in range(1, src)) // includes src
A.shuttledocked = FALSE
A.air_tight = TRUE
- INVOKE_ASYNC(A, /obj/machinery/door/.proc/close)
+ addtimer(CALLBACK(A, /obj/machinery/door/.proc/close), 0)
/obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index d1435a554c..9bea790957 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -48,7 +48,7 @@
return
/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user)
- return
+ return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
/obj/structure/table/abductor/wabbajack
name = "wabbajack altar"
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index b54fceb3e7..2249f5f10e 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -60,6 +60,10 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
for(var/a in T.GetAllContents())
if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types))
return FALSE
+ if(istype(a, /obj/structure/closet))//Prevents eigenlockers from ending up at CC
+ var/obj/structure/closet/c = a
+ if(c.eigen_teleport == TRUE)
+ return FALSE
return TRUE
/obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S)
diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm
index ab399f4e2a..7bede9f8be 100644
--- a/code/modules/spells/spell_types/area_teleport.dm
+++ b/code/modules/spells/spell_types/area_teleport.dm
@@ -58,7 +58,7 @@
var/success = 0
while(tempL.len)
attempt = pick(tempL)
- target.Move(attempt)
+ do_teleport(target, attempt, channel = TELEPORT_CHANNEL_MAGIC)
if(get_turf(target) == attempt)
success = 1
break
@@ -66,7 +66,7 @@
tempL.Remove(attempt)
if(!success)
- target.forceMove(L)
+ do_teleport(target, L, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC)
playsound(get_turf(user), sound2, 50,1)
return
diff --git a/code/modules/spells/spell_types/turf_teleport.dm b/code/modules/spells/spell_types/turf_teleport.dm
index 093285b74d..8a45f2be22 100644
--- a/code/modules/spells/spell_types/turf_teleport.dm
+++ b/code/modules/spells/spell_types/turf_teleport.dm
@@ -40,6 +40,5 @@
if(!picked || !isturf(picked))
return
- if(!target.Move(picked))
- target.forceMove(picked)
- playsound(get_turf(user), sound2, 50,1)
+ if(do_teleport(user, picked, forceMove = TRUE, channel = TELEPORT_CHANNEL_MAGIC))
+ playsound(get_turf(user), sound1, 50,1)
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 98f5534d06..b09dee04c7 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -133,6 +133,7 @@
mode = "M-SHIELD"
speed_process = TRUE
var/kill_range = 14
+ density = 0
/obj/machinery/satellite/meteor_shield/sci
name = "\improper Meteor Shield Satellite"
@@ -197,9 +198,11 @@
change_meteor_chance(0.5)
/obj/machinery/satellite/meteor_shield/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You access the satellite's debug mode, increasing the chance of meteor strikes.")
if(active)
change_meteor_chance(4)
+ return TRUE
diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm
index f4b23c89b1..99902ff6d6 100644
--- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm
+++ b/code/modules/surgery/advanced/bioware/nerve_grounding.dm
@@ -17,10 +17,14 @@
time = 155
/datum/surgery_step/ground_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts splicing together [target]'s nerves.", "You start splicing together [target]'s nerves.")
+ display_results(user, target, "You start rerouting [target]'s nerves.",
+ "[user] starts rerouting [target]'s nerves.",
+ "[user] starts manipulating [target]'s nervous system.")
/datum/surgery_step/ground_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully splices [target]'s nervous system!", "You successfully splice [target]'s nervous system!")
+ display_results(user, target, "You successfully reroute [target]'s nervous system!",
+ "[user] successfully reroutes [target]'s nervous system!",
+ "[user] finishes manipulating [target]'s nervous system.")
new /datum/bioware/grounded_nerves(target)
return TRUE
@@ -37,4 +41,4 @@
/datum/bioware/grounded_nerves/on_lose()
..()
- owner.physiology.siemens_coeff = prev_coeff
\ No newline at end of file
+ owner.physiology.siemens_coeff = prev_coeff
diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm
index 6192786cc4..e6e66e1b6e 100644
--- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm
+++ b/code/modules/surgery/advanced/bioware/nerve_splicing.dm
@@ -10,17 +10,20 @@
/datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
bioware_target = BIOWARE_NERVES
-
/datum/surgery_step/splice_nerves
name = "splice nerves"
accept_hand = TRUE
time = 155
/datum/surgery_step/splice_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts splicing together [target]'s nerves.", "You start splicing together [target]'s nerves.")
+ display_results(user, target, "You start splicing together [target]'s nerves.",
+ "[user] starts splicing together [target]'s nerves.",
+ "[user] starts manipulating [target]'s nervous system.")
/datum/surgery_step/splice_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully splices [target]'s nervous system!", "You successfully splice [target]'s nervous system!")
+ display_results(user, target, "You successfully splice [target]'s nervous system!",
+ "[user] successfully splices [target]'s nervous system!",
+ "[user] finishes manipulating [target]'s nervous system.")
new /datum/bioware/spliced_nerves(target)
return TRUE
@@ -28,11 +31,9 @@
name = "Spliced Nerves"
desc = "Nerves are connected to each other multiple times, greatly reducing the impact of stunning effects."
mod_type = BIOWARE_NERVES
-
/datum/bioware/spliced_nerves/on_gain()
..()
owner.physiology.stun_mod *= 0.5
-
/datum/bioware/spliced_nerves/on_lose()
..()
- owner.physiology.stun_mod *= 2
\ No newline at end of file
+ owner.physiology.stun_mod *= 2
diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm
index 7a03833c51..fc0868c116 100644
--- a/code/modules/surgery/advanced/bioware/vein_threading.dm
+++ b/code/modules/surgery/advanced/bioware/vein_threading.dm
@@ -10,17 +10,20 @@
/datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
bioware_target = BIOWARE_CIRCULATION
-
/datum/surgery_step/thread_veins
name = "thread veins"
accept_hand = TRUE
time = 125
/datum/surgery_step/thread_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts weaving [target]'s circulatory system.", "You start weaving [target]'s circulatory system.")
+ display_results(user, target, "You start weaving [target]'s circulatory system.",
+ "[user] starts weaving [target]'s circulatory system.",
+ "[user] starts manipulating [target]'s circulatory system.")
/datum/surgery_step/thread_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] weaves [target]'s circulatory system into a resistant mesh!", "You weave [target]'s circulatory system into a resistant mesh!")
+ display_results(user, target, "You weave [target]'s circulatory system into a resistant mesh!",
+ "[user] weaves [target]'s circulatory system into a resistant mesh!",
+ "[user] finishes manipulating [target]'s circulatory system.")
new /datum/bioware/threaded_veins(target)
return TRUE
@@ -28,11 +31,9 @@
name = "Threaded Veins"
desc = "The circulatory system is woven into a mesh, severely reducing the amount of blood lost from wounds."
mod_type = BIOWARE_CIRCULATION
-
/datum/bioware/threaded_veins/on_gain()
..()
owner.physiology.bleed_mod *= 0.25
-
/datum/bioware/threaded_veins/on_lose()
..()
- owner.physiology.bleed_mod *= 4
\ No newline at end of file
+ owner.physiology.bleed_mod *= 4
diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm
index 23783f1bf2..730a912189 100644
--- a/code/modules/surgery/advanced/brainwashing.dm
+++ b/code/modules/surgery/advanced/brainwashing.dm
@@ -2,7 +2,6 @@
name = "Brainwashing Surgery Disk"
desc = "The disk provides instructions on how to impress an order on a brain, making it the primary objective of the patient."
surgeries = list(/datum/surgery/advanced/brainwashing)
-
/datum/surgery/advanced/brainwashing
name = "Brainwashing"
desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant."
@@ -13,10 +12,9 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/brainwash,
/datum/surgery_step/close)
-
+
species = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_HEAD)
-
/datum/surgery/advanced/brainwashing/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
@@ -24,27 +22,29 @@
if(!B)
return FALSE
return TRUE
-
/datum/surgery_step/brainwash
name = "brainwash"
implements = list(/obj/item/hemostat = 85, TOOL_WIRECUTTER = 50, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15)
time = 200
var/objective
-
/datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
objective = stripped_input(user, "Choose the objective to imprint on your victim's brain.", "Brainwashing", null, MAX_MESSAGE_LEN)
if(!objective)
return -1
- user.visible_message("[user] begins to tinker with [target]'s brain.", "You begin to brainwash [target]...")
+ display_results(user, target, "You begin to brainwash [target]...",
+ "[user] begins to fix [target]'s brain.",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(!target.mind)
- user.visible_message("[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...")
+ to_chat(user, "[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...")
return FALSE
if(HAS_TRAIT(target, TRAIT_MINDSHIELD))
- user.visible_message("You hear a faint buzzing from a device inside [target]'s brain, and the brainwashing is erased.")
+ to_chat(user, "You hear a faint buzzing from a device inside [target]'s brain, and the brainwashing is erased.")
return FALSE
- user.visible_message("[user] successfully brainwashes [target]!", "You succeed in brainwashing [target].")
+ display_results(user, target, "You succeed in brainwashing [target].",
+ "[user] successfully fixes [target]'s brain!",
+ "[user] completes the surgery on [target]'s brain.")
to_chat(target, "A new compulsion fills your mind... you feel forced to obey it!")
brainwash(target, objective)
message_admins("[ADMIN_LOOKUPFLW(user)] surgically brainwashed [ADMIN_LOOKUPFLW(target)] with the objective '[objective]'.")
@@ -53,8 +53,10 @@
/datum/surgery_step/brainwash/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorganslot(ORGAN_SLOT_BRAIN))
- user.visible_message("[user] damages some brain tissue!", "You bruise some brain tissue!")
+ display_results(user, target, "You screw up, bruising the brain tissue!",
+ "[user] screws up, causing brain damage!",
+ "[user] completes the surgery on [target]'s brain.")
target.adjustBrainLoss(40)
else
user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.")
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm
index f74346b193..1c09f5f7da 100644
--- a/code/modules/surgery/advanced/lobotomy.dm
+++ b/code/modules/surgery/advanced/lobotomy.dm
@@ -12,7 +12,6 @@
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
/datum/surgery/advanced/lobotomy/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
@@ -20,23 +19,25 @@
if(!B)
return FALSE
return TRUE
-
/datum/surgery_step/lobotomize
name = "perform lobotomy"
implements = list(/obj/item/scalpel = 85, /obj/item/melee/transforming/energy/sword = 55, /obj/item/kitchen/knife = 35,
/obj/item/shard = 25, /obj/item = 20)
time = 100
-
/datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.is_sharp())
return FALSE
return TRUE
/datum/surgery_step/lobotomize/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to cut a piece of [target]'s brain.", "You begin to cut a piece of [target]'s brain...")
+ display_results(user, target, "You begin to perform a lobotomy on [target]'s brain...",
+ "[user] begins to perform a lobotomy on [target]'s brain.",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully lobotomizes [target]!", "You succeed in lobotomizing [target].")
+ display_results(user, target, "You succeed in lobotomizing [target].",
+ "[user] successfully lobotomizes [target]!",
+ "[user] completes the surgery on [target]'s brain.")
target.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY)
if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed))
target.mind.remove_antag_datum(/datum/antagonist/brainwashed)
@@ -51,7 +52,9 @@
/datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorganslot(ORGAN_SLOT_BRAIN))
- user.visible_message("[user] removes the wrong part, causing more damage!", "You remove the wrong part, causing more damage!")
+ display_results(user, target, "You remove the wrong part, causing more damage!",
+ "[user] successfully lobotomizes [target]!",
+ "[user] completes the surgery on [target]'s brain.")
target.adjustBrainLoss(80)
switch(rand(1,3))
if(1)
@@ -62,4 +65,4 @@
target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC)
else
user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.")
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm
index a88bb51b31..8c57930252 100644
--- a/code/modules/surgery/advanced/necrotic_revival.dm
+++ b/code/modules/surgery/advanced/necrotic_revival.dm
@@ -7,9 +7,7 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/bionecrosis,
/datum/surgery_step/close)
-
possible_locs = list(BODY_ZONE_HEAD)
-
/datum/surgery/advanced/necrotic_revival/can_start(mob/user, mob/living/carbon/target)
. = ..()
var/obj/item/organ/zombie_infection/ZI = target.getorganslot(ORGAN_SLOT_ZOMBIE)
@@ -19,16 +17,21 @@
/datum/surgery_step/bionecrosis
name = "start bionecrosis"
implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
+ implements = list(/obj/item/reagent_containers/syringe = 100, /obj/item/pen = 30)
time = 50
chems_needed = list("zombiepowder", "rezadone")
require_all_chems = FALSE
/datum/surgery_step/bionecrosis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to stimulate [target]'s brain.", "You begin to stimulate [target]'s brain...")
+ display_results(user, target, "You begin to grow a romerol tumor on [target]'s brain...",
+ "[user] begins to tinker with [target]'s brain...",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully grows a necrotic tumor on [target]'s brain!", "You succeed in growing a necrotic tumor on [target]'s brain.")
+ display_results(user, target, "You succeed in growing a romerol tumor on [target]'s brain.",
+ "[user] successfully grows a romerol tumor on [target]'s brain!",
+ "[user] completes the surgery on [target]'s brain.")
if(!target.getorganslot(ORGAN_SLOT_ZOMBIE))
var/obj/item/organ/zombie_infection/ZI = new()
ZI.Insert(target)
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm
index 15e34d003c..d5585d71a8 100644
--- a/code/modules/surgery/advanced/pacification.dm
+++ b/code/modules/surgery/advanced/pacification.dm
@@ -7,31 +7,34 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/pacify,
/datum/surgery_step/close)
-
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
/datum/surgery/advanced/pacify/can_start(mob/user, mob/living/carbon/target)
. = ..()
var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN)
if(!B)
return FALSE
-
/datum/surgery_step/pacify
name = "rewire brain"
implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15)
time = 40
/datum/surgery_step/pacify/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to reshape [target]'s brain.", "You begin to reshape [target]'s brain...")
+ display_results(user, target, "You begin to pacify [target]...",
+ "[user] begins to fix [target]'s brain.",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] reshapes [target]'s brain!", "You succeed in reshaping [target]'s brain.")
+ display_results(user, target, "You succeed in neurologically pacifying [target].",
+ "[user] successfully fixes [target]'s brain!",
+ "[user] completes the surgery on [target]'s brain.")
target.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_LOBOTOMY)
return TRUE
/datum/surgery_step/pacify/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] reshapes [target]'s brain!", "You screwed up, and rewired [target]'s brain the wrong way around...")
+ display_results(user, target, "You screw up, rewiring [target]'s brain the wrong way around...",
+ "[user] screws up, causing brain damage!",
+ "[user] completes the surgery on [target]'s brain.")
target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY)
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm
index ebda8a04e2..01c30f174a 100644
--- a/code/modules/surgery/advanced/revival.dm
+++ b/code/modules/surgery/advanced/revival.dm
@@ -8,11 +8,9 @@
/datum/surgery_step/incise,
/datum/surgery_step/revive,
/datum/surgery_step/close)
-
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
/datum/surgery/advanced/revival/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
@@ -24,12 +22,10 @@
if(!B)
return FALSE
return TRUE
-
/datum/surgery_step/revive
name = "electrically stimulate brain"
implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60)
time = 120
-
/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool)
. = TRUE
if(istype(tool, /obj/item/twohanded/shockpaddles))
@@ -51,25 +47,33 @@
return FALSE
/datum/surgery_step/revive/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] prepares to shock [target]'s brain with [tool].", "You prepare to give [target]'s brain the spark of life with [tool].")
+ display_results(user, target, "You prepare to give [target]'s brain the spark of life with [tool].",
+ "[user] prepares to shock [target]'s brain with [tool].",
+ "[user] prepares to shock [target]'s brain with [tool].")
target.notify_ghost_cloning("Someone is trying to zap your brain. Re-enter your corpse if you want to be revived!", source = target)
/datum/surgery_step/revive/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] send a powerful shock to [target]'s brain with [tool]...", "You successfully shock [target]'s brain with [tool]...")
+ display_results(user, target, "You successfully shock [target]'s brain with [tool]...",
+ "[user] send a powerful shock to [target]'s brain with [tool]...",
+ "[user] send a powerful shock to [target]'s brain with [tool]...")
playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1)
target.adjustOxyLoss(-50, 0)
target.updatehealth()
if(target.revive())
user.visible_message("...[target] wakes up, alive and aware!", "IT'S ALIVE!")
+ target.visible_message("...[target] wakes up, alive and aware!")
target.emote("gasp")
target.adjustBrainLoss(50, 199) //MAD SCIENCE
return TRUE
else
user.visible_message("...[target.p_they()] convulses, then lies still.")
+ target.visible_message("...[target.p_they()] convulses, then lies still.")
return FALSE
/datum/surgery_step/revive/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.", "You shock [target]'s brain with [tool], but [target.p_they()] doesn't react.")
+ display_results(user, target, "You shock [target]'s brain with [tool], but [target.p_they()] doesn't react.",
+ "[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.",
+ "[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.")
playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1)
target.adjustBrainLoss(15, 199)
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm
index 115f8a2eed..b87d5e001c 100644
--- a/code/modules/surgery/advanced/viral_bonding.dm
+++ b/code/modules/surgery/advanced/viral_bonding.dm
@@ -7,17 +7,14 @@
/datum/surgery_step/incise,
/datum/surgery_step/viral_bond,
/datum/surgery_step/close)
-
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
-
/datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target)
if(!..())
return FALSE
if(!LAZYLEN(target.diseases))
return FALSE
return TRUE
-
/datum/surgery_step/viral_bond
name = "viral bond"
implements = list(/obj/item/cautery = 100, TOOL_WELDER = 50, /obj/item = 30) // 30% success with any hot item.
@@ -27,15 +24,18 @@
/datum/surgery_step/viral_bond/tool_check(mob/user, obj/item/tool)
if(implement_type == TOOL_WELDER || implement_type == /obj/item)
return tool.is_hot()
-
return TRUE
/datum/surgery_step/viral_bond/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts heating [target]'s bone marrow with [tool]...", "You start heating [target]'s bone marrow with [tool]...")
+ display_results(user, target, "You start heating [target]'s bone marrow with [tool]...",
+ "[user] starts heating [target]'s bone marrow with [tool]...",
+ "[user] starts heating something in [target]'s chest with [tool]...")
/datum/surgery_step/viral_bond/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[target]'s bone marrow begins pulsing slowly.", "[target]'s bone marrow begins pulsing slowly. The viral bonding is complete.")
+ display_results(user, target, "[target]'s bone marrow begins pulsing slowly. The viral bonding is complete.",
+ "[target]'s bone marrow begins pulsing slowly.",
+ "[user] finishes the operation.")
for(var/X in target.diseases)
var/datum/disease/D = X
D.carrier = TRUE
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 8465a6d332..01cf6ae112 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -1,25 +1,25 @@
-
/datum/surgery/amputation
- name = "amputation"
+ name = "Amputation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/sever_limb)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
-
/datum/surgery_step/sever_limb
name = "sever limb"
implements = list(/obj/item/scalpel = 100, /obj/item/circular_saw = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/required/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25)
time = 64
/datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to sever [target]'s [parse_zone(target_zone)]!", "You begin to sever [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to sever [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to sever [target]'s [parse_zone(target_zone)]!",
+ "[user] begins to sever [target]'s [parse_zone(target_zone)]!")
/datum/surgery_step/sever_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/mob/living/carbon/human/L = target
- user.visible_message("[user] severs [L]'s [parse_zone(target_zone)]!", "You sever [L]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You sever [L]'s [parse_zone(target_zone)].",
+ "[user] severs [L]'s [parse_zone(target_zone)]!",
+ "[user] severs [L]'s [parse_zone(target_zone)]!")
if(surgery.operated_bodypart)
var/obj/item/bodypart/target_limb = surgery.operated_bodypart
target_limb.drop_limb()
-
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index a97a133685..81b491e6de 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -354,7 +354,8 @@
if("mam_body_markings" in S.default_features)
var/datum/sprite_accessory/Smark
Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
- body_markings_icon = Smark.icon
+ if(Smark)
+ body_markings_icon = Smark.icon
if(H.dna.features.["mam_body_markings"] != "None")
body_markings = lowertext(H.dna.features.["mam_body_markings"])
auxmarking = lowertext(H.dna.features.["mam_body_markings"])
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index ab31d64034..a3f8b883b4 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -20,8 +20,8 @@
icon_state = "borg_l_arm"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -41,8 +41,8 @@
icon_state = "borg_r_arm"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -62,8 +62,8 @@
icon_state = "borg_l_leg"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -83,8 +83,8 @@
icon_state = "borg_r_leg"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -103,8 +103,8 @@
icon_state = "borg_chest"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -268,38 +268,38 @@
burn_reduction = 0
max_damage = 20
-// Upgraded Surplus lims
+// Upgraded Surplus lims - Better then robotic lims
/obj/item/bodypart/l_arm/robot/surplus_upgraded
name = "reinforced surplus prosthetic left arm"
- desc = "A skeletal, robotic limb. This one is reinforced to provide better protection."
+ desc = "A skeletal, robotic limb. This one is reinforced to provide better protection, and is made of stronger parts."
icon = 'icons/mob/augmentation/surplus_augments.dmi'
- brute_reduction = 1
- burn_reduction = 1
- max_damage = 30
+ brute_reduction = 3
+ burn_reduction = 2
+ max_damage = 55
/obj/item/bodypart/r_arm/robot/surplus_upgraded
name = "reinforced surplus prosthetic right arm"
- desc = "A skeletal, robotic limb. This one is reinforced to provide better protection."
+ desc = "A skeletal, robotic limb. This one is reinforced to provide better protection, and is made of stronger parts."
icon = 'icons/mob/augmentation/surplus_augments.dmi'
- brute_reduction = 1
- burn_reduction = 1
- max_damage = 30
+ brute_reduction = 3
+ burn_reduction = 2
+ max_damage = 55
/obj/item/bodypart/l_leg/robot/surplus_upgraded
name = "reinforced surplus prosthetic left leg"
- desc = "A skeletal, robotic limb. This one is reinforced to provide better protection."
+ desc = "A skeletal, robotic limb. This one is reinforced to provide better protection, and is made of stronger parts."
icon = 'icons/mob/augmentation/surplus_augments.dmi'
- brute_reduction = 1
- burn_reduction = 1
- max_damage = 30
+ brute_reduction = 3
+ burn_reduction = 2
+ max_damage = 55
/obj/item/bodypart/r_leg/robot/surplus_upgraded
name = "reinforced surplus prosthetic right leg"
- desc = "A skeletal, robotic limb. This one is reinforced to provide better protection."
+ desc = "A skeletal, robotic limb. This one is reinforced to provide better protection, and is made of stronger parts."
icon = 'icons/mob/augmentation/surplus_augments.dmi'
- brute_reduction = 1
- burn_reduction = 1
- max_damage = 30
+ brute_reduction = 3
+ burn_reduction = 2
+ max_damage = 55
#undef ROBOTIC_LIGHT_BRUTE_MSG
#undef ROBOTIC_MEDIUM_BRUTE_MSG
diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm
index fcd626ad97..e65271576d 100644
--- a/code/modules/surgery/brain_surgery.dm
+++ b/code/modules/surgery/brain_surgery.dm
@@ -1,5 +1,5 @@
/datum/surgery/brain_surgery
- name = "brain surgery"
+ name = "Brain surgery"
steps = list(
/datum/surgery_step/incise,
/datum/surgery_step/retract_skin,
@@ -7,16 +7,13 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/fix_brain,
/datum/surgery_step/close)
-
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_HEAD)
requires_bodypart_type = 0
-
/datum/surgery_step/fix_brain
name = "fix brain"
implements = list(/obj/item/hemostat = 85, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100
time = 120 //long and complicated
-
/datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target)
var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN)
if(!B)
@@ -24,10 +21,14 @@
return TRUE
/datum/surgery_step/fix_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to fix [target]'s brain.", "You begin to fix [target]'s brain...")
+ display_results(user, target, "You begin to fix [target]'s brain...",
+ "[user] begins to fix [target]'s brain.",
+ "[user] begins to perform surgery on [target]'s brain.")
/datum/surgery_step/fix_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully fixes [target]'s brain!", "You succeed in fixing [target]'s brain.")
+ display_results(user, target, "You succeed in fixing [target]'s brain.",
+ "[user] successfully fixes [target]'s brain!",
+ "[user] completes the surgery on [target]'s brain.")
if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed))
target.mind.remove_antag_datum(/datum/antagonist/brainwashed)
target.adjustBrainLoss(-60)
@@ -36,9 +37,11 @@
/datum/surgery_step/fix_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorganslot(ORGAN_SLOT_BRAIN))
- user.visible_message("[user] screws up, causing more damage!", "You screw up, causing more damage!")
+ display_results(user, target, "You screw up, causing more damage!",
+ "[user] screws up, causing brain damage!",
+ "[user] completes the surgery on [target]'s brain.")
target.adjustBrainLoss(60)
target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY)
else
user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.")
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm
index 72874e0308..4c65b56962 100644
--- a/code/modules/surgery/cavity_implant.dm
+++ b/code/modules/surgery/cavity_implant.dm
@@ -1,30 +1,32 @@
/datum/surgery/cavity_implant
- name = "cavity implant"
+ name = "Cavity implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/handle_cavity, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
-
-
//handle cavity
/datum/surgery_step/handle_cavity
name = "implant item"
accept_hand = 1
accept_any_item = 1
+ implements = list(/obj/item = 100)
+ repeatable = TRUE
time = 32
var/obj/item/IC = null
-
+/datum/surgery_step/handle_cavity/tool_check(mob/user, obj/item/tool)
+ if(istype(tool, /obj/item/cautery) || istype(tool, /obj/item/gun/energy/laser))
+ return FALSE
+ return !tool.is_hot()
/datum/surgery_step/handle_cavity/preop(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST)
IC = CH.cavity_item
if(tool)
- if(istype(tool, /obj/item/surgical_drapes) || istype(tool, /obj/item/bedsheet))
- var/obj/item/inactive = user.get_inactive_held_item()
- if(istype(inactive, /obj/item/cautery) || istype(inactive, /obj/item/screwdriver) || iscyborg(user))
- attempt_cancel_surgery(surgery, tool, target, user)
- return -1
- user.visible_message("[user] begins to insert [tool] into [target]'s [target_zone].", "You begin to insert [tool] into [target]'s [target_zone]...")
+ display_results(user, target, "You begin to insert [tool] into [target]'s [target_zone]...",
+ "[user] begins to insert [tool] into [target]'s [target_zone].",
+ "[user] begins to insert [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].")
else
- user.visible_message("[user] checks for items in [target]'s [target_zone].", "You check for items in [target]'s [target_zone]...")
+ display_results(user, target, "You check for items in [target]'s [target_zone]...",
+ "[user] checks for items in [target]'s [target_zone].",
+ "[user] looks for something in [target]'s [target_zone].")
/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/bodypart/chest/CH = target.get_bodypart(BODY_ZONE_CHEST)
@@ -32,18 +34,18 @@
if(IC || tool.w_class > WEIGHT_CLASS_NORMAL || HAS_TRAIT(tool, TRAIT_NODROP) || istype(tool, /obj/item/organ))
to_chat(user, "You can't seem to fit [tool] in [target]'s [target_zone]!")
return 0
- var/obj/item/electronic_assembly/EA = tool
- if(istype(EA) && EA.combat_circuits && tool.w_class > WEIGHT_CLASS_SMALL)
- to_chat(user, "[tool] is too dangerous to put in [target]'s [target_zone]! Maybe if it was smaller...")
- return 0
else
- user.visible_message("[user] stuffs [tool] into [target]'s [target_zone]!", "You stuff [tool] into [target]'s [target_zone].")
+ display_results(user, target, "You stuff [tool] into [target]'s [target_zone].",
+ "[user] stuffs [tool] into [target]'s [target_zone]!",
+ "[user] stuffs [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].")
user.transferItemToLoc(tool, target, TRUE)
CH.cavity_item = tool
return 1
else
if(IC)
- user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].")
+ display_results(user, target, "You pull [IC] out of [target]'s [target_zone].",
+ "[user] pulls [IC] out of [target]'s [target_zone]!",
+ "[user] pulls [IC.w_class > WEIGHT_CLASS_SMALL ? IC : "something"] out of [target]'s [target_zone].")
user.put_in_hands(IC)
CH.cavity_item = null
return 1
diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm
index 7bf888ab40..6243405f8d 100644
--- a/code/modules/surgery/core_removal.dm
+++ b/code/modules/surgery/core_removal.dm
@@ -1,5 +1,5 @@
/datum/surgery/core_removal
- name = "core removal"
+ name = "Core removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/extract_core)
species = list(/mob/living/simple_animal/slime)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
@@ -8,7 +8,6 @@
if(target.stat == DEAD)
return 1
return 0
-
//extract brain
/datum/surgery_step/extract_core
name = "extract core"
@@ -16,13 +15,17 @@
time = 16
/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to extract a core from [target].", "You begin to extract a core from [target]...")
+ display_results(user, target, "You begin to extract a core from [target]...",
+ "[user] begins to extract a core from [target].",
+ "[user] begins to extract a core from [target].")
/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/mob/living/simple_animal/slime/slime = target
if(slime.cores > 0)
slime.cores--
- user.visible_message("[user] successfully extracts a core from [target]!", "You successfully extract a core from [target]. [slime.cores] core\s remaining.")
+ display_results(user, target, "You successfully extract a core from [target]. [slime.cores] core\s remaining.",
+ "[user] successfully extracts a core from [target]!",
+ "[user] successfully extracts a core from [target]!")
new slime.coretype(slime.loc)
@@ -33,4 +36,4 @@
return 0
else
to_chat(user, "There aren't any cores left in [target]!")
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index a8cb881326..85142e7bb1 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -1,16 +1,14 @@
/datum/surgery/eye_surgery
- name = "eye surgery"
+ name = "Eye surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_PRECISE_EYES)
requires_bodypart_type = 0
-
//fix eyes
/datum/surgery_step/fix_eyes
name = "fix eyes"
implements = list(/obj/item/hemostat = 100, TOOL_SCREWDRIVER = 45, /obj/item/pen = 25)
time = 64
-
/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target)
var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES)
if(!E)
@@ -19,10 +17,14 @@
return TRUE
/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...")
+ display_results(user, target, "You begin to fix [target]'s eyes...",
+ "[user] begins to fix [target]'s eyes.",
+ "[user] begins to perform surgery on [target]'s eyes.")
/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.")
+ display_results(user, target, "You succeed in fixing [target]'s eyes.",
+ "[user] successfully fixes [target]'s eyes!",
+ "[user] completes the surgery on [target]'s eyes.")
target.cure_blind(list(EYE_DAMAGE))
target.set_blindness(0)
target.cure_nearsighted(list(EYE_DAMAGE))
@@ -32,8 +34,12 @@
/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(target.getorgan(/obj/item/organ/brain))
- user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!")
+ display_results(user, target, "You accidentally stab [target] right in the brain!",
+ "[user] accidentally stabs [target] right in the brain!",
+ "[user] accidentally stabs [target] right in the brain!")
target.adjustBrainLoss(70)
else
- user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.")
- return FALSE
\ No newline at end of file
+ display_results(user, target, "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.",
+ "[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.",
+ "[user] accidentally stabs [target] right in the brain!")
+ return FALSE
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 59440cc3ee..0419a4c73f 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -65,7 +65,7 @@
if(S.ignore_clothes || get_location_accessible(M, selected_zone))
var/datum/surgery/procedure = new S.type(M, selected_zone, affecting)
- user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].", \
+ user.visible_message("[user] drapes [I] over [M]'s [parse_zone(selected_zone)] to prepare for surgery.", \
"You drape [I] over [M]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name].")
log_combat(user, M, "operated on", null, "(OPERATION TYPE: [procedure.name]) (TARGET AREA: [selected_zone])")
@@ -169,4 +169,3 @@
return 0
return 1
-
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 92c5e05246..05119b365d 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -3,27 +3,30 @@
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/extract_implant, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
-
-
//extract implant
/datum/surgery_step/extract_implant
name = "extract implant"
implements = list(/obj/item/hemostat = 100, TOOL_CROWBAR = 65)
time = 64
var/obj/item/implant/I = null
-
/datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
for(var/obj/item/O in target.implants)
I = O
break
if(I)
- user.visible_message("[user] begins to extract [I] from [target]'s [target_zone].", "You begin to extract [I] from [target]'s [target_zone]...")
+ display_results(user, target, "You begin to extract [I] from [target]'s [target_zone]...",
+ "[user] begins to extract [I] from [target]'s [target_zone].",
+ "[user] begins to extract something from [target]'s [target_zone].")
else
- user.visible_message("[user] looks for an implant in [target]'s [target_zone].", "You look for an implant in [target]'s [target_zone]...")
+ display_results(user, target, "You look for an implant in [target]'s [target_zone]...",
+ "[user] looks for an implant in [target]'s [target_zone].",
+ "[user] looks for something in [target]'s [target_zone].")
/datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(I)
- user.visible_message("[user] successfully removes [I] from [target]'s [target_zone]!", "You successfully remove [I] from [target]'s [target_zone].")
+ display_results(user, target, "You successfully remove [I] from [target]'s [target_zone].",
+ "[user] successfully removes [I] from [target]'s [target_zone]!",
+ "[user] successfully removes something from [target]'s [target_zone]!")
I.removed(target)
var/obj/item/implantcase/case
@@ -36,14 +39,15 @@
case.imp = I
I.forceMove(case)
case.update_icon()
- user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].")
+ display_results(user, target, "You place [I] into [case].",
+ "[user] places [I] into [case]!",
+ "[user] places it into [case]!")
else
qdel(I)
else
to_chat(user, "You can't find anything in [target]'s [target_zone]!")
return 1
-
/datum/surgery/implant_removal/mechanic
name = "implant removal"
requires_bodypart_type = BODYPART_ROBOTIC
@@ -53,4 +57,4 @@
/datum/surgery_step/mechanic_unwrench,
/datum/surgery_step/extract_implant,
/datum/surgery_step/mechanic_wrench,
- /datum/surgery_step/mechanic_close)
\ No newline at end of file
+ /datum/surgery_step/mechanic_close)
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 46fe262189..7ba8dbc49d 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -1,9 +1,5 @@
-
/////AUGMENTATION SURGERIES//////
-
-
//SURGERY STEPS
-
/datum/surgery_step/replace
name = "sever muscles"
implements = list(/obj/item/scalpel = 100, TOOL_WIRECUTTER = 55)
@@ -11,16 +7,15 @@
/datum/surgery_step/replace/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_selected)].", "You begin to sever the muscles on [target]'s [parse_zone(user.zone_selected)]...")
-
+ display_results(user, target, "You begin to sever the muscles on [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to sever the muscles on [target]'s [parse_zone(user.zone_selected)].",
+ "[user] begins an incision on [target]'s [parse_zone(user.zone_selected)].")
/datum/surgery_step/replace_limb
name = "replace limb"
implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100)
time = 32
var/obj/item/bodypart/L = null // L because "limb"
-
-
/datum/surgery_step/replace_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(tool, /obj/item/organ_storage) && istype(tool.contents[1], /obj/item/bodypart))
tool = tool.contents[1]
@@ -33,22 +28,20 @@
return -1
L = surgery.operated_bodypart
if(L)
- user.visible_message("[user] begins to augment [target]'s [parse_zone(user.zone_selected)].", "You begin to augment [target]'s [parse_zone(user.zone_selected)]...")
+ display_results(user, target, "You begin to augment [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].",
+ "[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")
else
user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
-
//ACTUAL SURGERIES
-
/datum/surgery/augmentation
- name = "augmentation"
+ name = "Augmentation"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/saw, /datum/surgery_step/replace_limb)
species = list(/mob/living/carbon/human)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
requires_real_bodypart = TRUE
-
//SURGERY STEP SUCCESSES
-
/datum/surgery_step/replace_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery)
if(L)
if(istype(tool, /obj/item/organ_storage))
@@ -58,7 +51,9 @@
tool = tool.contents[1]
if(istype(tool) && user.temporarilyRemoveItemFromInventory(tool))
tool.replace_limb(target, TRUE)
- user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "You successfully augment [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You successfully augment [target]'s [parse_zone(target_zone)].",
+ "[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully augments [target]'s [parse_zone(target_zone)]!")
log_combat(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
else
to_chat(user, "[target] has no organic [parse_zone(target_zone)] there!")
diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm
index 9967eba663..bb297b4604 100644
--- a/code/modules/surgery/lipoplasty.dm
+++ b/code/modules/surgery/lipoplasty.dm
@@ -1,14 +1,11 @@
/datum/surgery/lipoplasty
- name = "lipoplasty"
+ name = "Lipoplasty"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/cut_fat, /datum/surgery_step/remove_fat, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
-
/datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target)
if(HAS_TRAIT(target, TRAIT_FAT))
return 1
return 0
-
-
//cut fat
/datum/surgery_step/cut_fat
name = "cut excess fat"
@@ -16,10 +13,14 @@
time = 64
/datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to cut away [target]'s excess fat.", "You begin to cut away [target]'s excess fat...")
+ display_results(user, target, "You begin to cut away [target]'s excess fat...",
+ "[user] begins to cut away [target]'s excess fat.",
+ "[user] begins to cut [target]'s [target_zone] with [tool].")
/datum/surgery_step/cut_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] cuts [target]'s excess fat loose!", "You cut [target]'s excess fat loose.")
+ display_results(user, target, "You cut [target]'s excess fat loose.",
+ "[user] cuts [target]'s excess fat loose!",
+ "[user] finishes the cut on [target]'s [target_zone].")
return 1
//remove fat
@@ -29,25 +30,27 @@
time = 32
/datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to extract [target]'s loose fat!", "You begin to extract [target]'s loose fat...")
+ display_results(user, target, "You begin to extract [target]'s loose fat...",
+ "[user] begins to extract [target]'s loose fat!",
+ "[user] begins to extract something from [target]'s [target_zone].")
/datum/surgery_step/remove_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] extracts [target]'s fat!", "You extract [target]'s fat.")
+ display_results(user, target, "You extract [target]'s fat.",
+ "[user] extracts [target]'s fat!",
+ "[user] extracts [target]'s fat!")
target.overeatduration = 0 //patient is unfatted
var/removednutriment = target.nutrition
target.nutrition = NUTRITION_LEVEL_WELL_FED
removednutriment -= 450 //whatever was removed goes into the meat
var/mob/living/carbon/human/H = target
var/typeofmeat = /obj/item/reagent_containers/food/snacks/meat/slab/human
-
if(H.dna && H.dna.species)
typeofmeat = H.dna.species.meat
-
var/obj/item/reagent_containers/food/snacks/meat/slab/human/newmeat = new typeofmeat
newmeat.name = "fatty meat"
newmeat.desc = "Extremely fatty tissue taken from a patient."
newmeat.subjectname = H.real_name
newmeat.subjectjob = H.job
- newmeat.reagents.add_reagent ("nutriment", (removednutriment / 15)) //To balance with nutriment_factor of nutriment
+ newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment
newmeat.forceMove(target.loc)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm
index 6431770fa9..7d364d9ecf 100644
--- a/code/modules/surgery/mechanic_steps.dm
+++ b/code/modules/surgery/mechanic_steps.dm
@@ -9,15 +9,14 @@
time = 24
/datum/surgery_step/mechanic_open/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].",
- "You begin to unscrew the shell of [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to unscrew the shell of [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].",
+ "[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/mechanic_incise/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.is_sharp())
return FALSE
-
return TRUE
-
//close shell
/datum/surgery_step/mechanic_close
name = "screw shell"
@@ -29,15 +28,14 @@
time = 24
/datum/surgery_step/mechanic_close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].",
- "You begin to screw the shell of [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to screw the shell of [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].",
+ "[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/mechanic_close/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.is_sharp())
return FALSE
-
return TRUE
-
//prepare electronics
/datum/surgery_step/prepare_electronics
name = "prepare electronics"
@@ -47,8 +45,9 @@
time = 24
/datum/surgery_step/prepare_electronics/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)].",
- "You begin to prepare electronics in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to prepare electronics in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)].")
//unwrench
/datum/surgery_step/mechanic_unwrench
@@ -59,8 +58,9 @@
time = 24
/datum/surgery_step/mechanic_unwrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].",
- "You begin to unwrench some bolts in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to unwrench some bolts in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].")
//wrench
/datum/surgery_step/mechanic_wrench
@@ -71,8 +71,9 @@
time = 24
/datum/surgery_step/mechanic_wrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].",
- "You begin to wrench some bolts in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to wrench some bolts in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].")
//open hatch
/datum/surgery_step/open_hatch
@@ -81,5 +82,6 @@
time = 10
/datum/surgery_step/open_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].",
- "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...")
\ No newline at end of file
+ display_results(user, target, "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].")
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 553de45c60..6bffed7452 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -1,5 +1,5 @@
/datum/surgery/organ_manipulation
- name = "organ manipulation"
+ name = "Organ manipulation"
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD)
requires_real_bodypart = 1
@@ -13,7 +13,6 @@
//there should be bone fixing
/datum/surgery_step/close
)
-
/datum/surgery/organ_manipulation/soft
possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
steps = list(
@@ -24,9 +23,8 @@
/datum/surgery_step/manipulate_organs,
/datum/surgery_step/close
)
-
/datum/surgery/organ_manipulation/alien
- name = "alien organ manipulation"
+ name = "Alien organ manipulation"
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
species = list(/mob/living/carbon/alien/humanoid)
steps = list(
@@ -37,9 +35,8 @@
/datum/surgery_step/manipulate_organs,
/datum/surgery_step/close
)
-
/datum/surgery/organ_manipulation/mechanic
- name = "prosthesis organ manipulation"
+ name = "Prosthesis organ manipulation"
possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD)
requires_bodypart_type = BODYPART_ROBOTIC
steps = list(
@@ -51,7 +48,6 @@
/datum/surgery_step/mechanic_wrench,
/datum/surgery_step/mechanic_close
)
-
/datum/surgery/organ_manipulation/mechanic/soft
possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
steps = list(
@@ -61,7 +57,6 @@
/datum/surgery_step/manipulate_organs,
/datum/surgery_step/mechanic_close
)
-
/datum/surgery_step/manipulate_organs
time = 64
name = "manipulate organs"
@@ -70,11 +65,9 @@
var/implements_extract = list(/obj/item/hemostat = 100, TOOL_CROWBAR = 55)
var/current_type
var/obj/item/organ/I = null
-
/datum/surgery_step/manipulate_organs/New()
..()
implements = implements + implements_extract
-
/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
I = null
if(istype(tool, /obj/item/organ_storage))
@@ -92,9 +85,9 @@
if(target_zone != I.zone || target.getorganslot(I.slot))
to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!")
return -1
-
- user.visible_message("[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].",
- "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].",
+ "[user] begins to insert something into [target]'s [parse_zone(target_zone)].")
else if(implement_type in implements_extract)
current_type = "extract"
@@ -107,21 +100,20 @@
O.on_find(user)
organs -= O
organs[O.name] = O
-
I = input("Remove which organ?", "Surgery", null, null) as null|anything in organs
if(I && user && target && user.Adjacent(target) && user.get_active_held_item() == tool)
I = organs[I]
if(!I)
return -1
- user.visible_message("[user] begins to extract [I] from [target]'s [parse_zone(target_zone)].",
- "You begin to extract [I] from [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to extract [I] from [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to extract [I] from [target]'s [parse_zone(target_zone)].",
+ "[user] begins to extract something from [target]'s [parse_zone(target_zone)].")
else
return -1
else if(istype(tool, /obj/item/reagent_containers/food/snacks/organ))
to_chat(user, "[tool] was bitten by someone! It's too damaged to use!")
return -1
-
/datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(current_type == "insert")
if(istype(tool, /obj/item/organ_storage))
@@ -134,17 +126,20 @@
I = tool
user.temporarilyRemoveItemFromInventory(I, TRUE)
I.Insert(target)
- user.visible_message("[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!",
- "You insert [tool] into [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You insert [tool] into [target]'s [parse_zone(target_zone)].",
+ "[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!",
+ "[user] inserts something into [target]'s [parse_zone(target_zone)]!")
else if(current_type == "extract")
if(I && I.owner == target)
- user.visible_message("[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!",
- "You successfully extract [I] from [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You successfully extract [I] from [target]'s [parse_zone(target_zone)].",
+ "[user] successfully extracts [I] from [target]'s [parse_zone(target_zone)]!",
+ "[user] successfully extracts something from [target]'s [parse_zone(target_zone)]!")
log_combat(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]")
I.Remove(target)
I.forceMove(get_turf(target))
else
- user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
- "You can't extract anything from [target]'s [parse_zone(target_zone)]!")
+ display_results(user, target, "You can't extract anything from [target]'s [parse_zone(target_zone)]!",
+ "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!",
+ "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!")
return 0
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 01eb751f39..da03771a27 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -1,4 +1,3 @@
-
//make incision
/datum/surgery_step/incise
name = "make incision"
@@ -7,13 +6,22 @@
time = 16
/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].",
- "You begin to make an incision in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to make an incision in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to make an incision in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to make an incision in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/incise/tool_check(mob/user, obj/item/tool)
if(implement_type == /obj/item && !tool.is_sharp())
return FALSE
-
+ return TRUE
+/datum/surgery_step/incise/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if ishuman(target)
+ var/mob/living/carbon/human/H = target
+ if (!(NOBLOOD in H.dna.species.species_traits))
+ display_results(user, target, "Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
+ "Blood pools around the incision in [H]'s [parse_zone(target_zone)].",
+ "")
+ H.bleed_rate += 3
return TRUE
//clamp bleeders
@@ -23,15 +31,17 @@
time = 24
/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].",
- "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/clamp_bleeders/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(locate(/datum/surgery_step/saw) in surgery.steps)
target.heal_bodypart_damage(20,0)
+ if (ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.bleed_rate = max( (H.bleed_rate - 3), 0)
return ..()
-
-
//retract skin
/datum/surgery_step/retract_skin
name = "retract skin"
@@ -39,8 +49,9 @@
time = 24
/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].",
- "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].")
@@ -52,22 +63,21 @@
time = 24
/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].",
- "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/close/tool_check(mob/user, obj/item/tool)
if(implement_type == TOOL_WELDER || implement_type == /obj/item)
return tool.is_hot()
-
return TRUE
-
/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(locate(/datum/surgery_step/saw) in surgery.steps)
target.heal_bodypart_damage(45,0)
+ if (ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.bleed_rate = max( (H.bleed_rate - 3), 0)
return ..()
-
-
-
//saw bone
/datum/surgery_step/saw
name = "saw bone"
@@ -77,13 +87,15 @@
time = 54
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].",
- "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
target.apply_damage(50, BRUTE, "[target_zone]")
-
- user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!", "You saw [target]'s [parse_zone(target_zone)] open.")
+ display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.",
+ "[user] saws [target]'s [parse_zone(target_zone)] open!",
+ "[user] saws [target]'s [parse_zone(target_zone)] open!")
return 1
//drill bone
@@ -93,10 +105,12 @@
time = 30
/datum/surgery_step/drill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].",
- "You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].",
+ "[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].")
/datum/surgery_step/drill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] drills into [target]'s [parse_zone(target_zone)]!",
- "You drill into [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You drill into [target]'s [parse_zone(target_zone)].",
+ "[user] drills into [target]'s [parse_zone(target_zone)]!",
+ "[user] drills into [target]'s [parse_zone(target_zone)]!")
return 1
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index cb004ce599..2489aa0705 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -132,7 +132,7 @@
else
var/list/choice_list = list()
for(var/obj/item/I in items_list)
- choice_list[I] = getFlatIcon(I)
+ choice_list[I] = image(I)
var/obj/item/choice = show_radial_menu(owner, owner, choice_list)
if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !holder && (choice in contents))
// This monster sanity check is a nice example of how bad input is.
@@ -185,11 +185,12 @@
zone = BODY_ZONE_L_ARM
/obj/item/organ/cyberimp/arm/toolset/emag_act()
- if(!(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list))
- to_chat(usr, "You unlock [src]'s integrated knife!")
- items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
- return 1
- return 0
+ . = ..()
+ if(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list)
+ return
+ to_chat(usr, "You unlock [src]'s integrated knife!")
+ items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
+ return TRUE
/obj/item/organ/cyberimp/arm/esword
name = "arm-mounted energy blade"
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 98abb2528a..eeaaaf2a03 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -169,7 +169,6 @@
var/list/obj/effect/abstract/eye_lighting/eye_lighting
var/obj/effect/abstract/eye_lighting/on_mob
var/image/mob_overlay
- var/datum/component/mobhook
/obj/item/organ/eyes/robotic/glow/Initialize()
. = ..()
@@ -185,7 +184,7 @@
/obj/item/organ/eyes/robotic/glow/proc/terminate_effects()
if(owner && active)
- deactivate()
+ deactivate(TRUE)
active = FALSE
clear_visuals(TRUE)
STOP_PROCESSING(SSfastprocess, src)
@@ -238,26 +237,12 @@
return
deactivate(silent = TRUE)
-/obj/item/organ/eyes/robotic/glow/Insert(mob/living/carbon/M, special = FALSE, drop_if_replaced = FALSE)
- . = ..()
- if (mobhook && mobhook.parent != M)
- QDEL_NULL(mobhook)
- if (!mobhook)
- mobhook = M.AddComponent(/datum/component/redirect, list(COMSIG_ATOM_DIR_CHANGE = CALLBACK(src, .proc/update_visuals)))
-
-/obj/item/organ/eyes/robotic/glow/Remove(mob/living/carbon/M)
- . = ..()
- QDEL_NULL(mobhook)
-
-/obj/item/organ/eyes/robotic/glow/Destroy()
- QDEL_NULL(mobhook) // mobhook is not our component
- return ..()
-
/obj/item/organ/eyes/robotic/glow/proc/activate(silent = FALSE)
start_visuals()
if(!silent)
to_chat(owner, "Your [src] clicks and makes a whining noise, before shooting out a beam of light!")
active = TRUE
+ RegisterSignal(owner, COMSIG_ATOM_DIR_CHANGE, .proc/update_visuals)
cycle_mob_overlay()
/obj/item/organ/eyes/robotic/glow/proc/deactivate(silent = FALSE)
@@ -265,6 +250,7 @@
if(!silent)
to_chat(owner, "Your [src] shuts off!")
active = FALSE
+ UnregisterSignal(owner, COMSIG_ATOM_DIR_CHANGE)
remove_mob_overlay()
/obj/item/organ/eyes/robotic/glow/proc/update_visuals(datum/source, olddir, newdir)
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index ff8310e2aa..cfbb530e69 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -497,6 +497,6 @@
/obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
. = ..()
- if (breath.gases[/datum/gas/plasma])
+ if (breath && breath.gases[/datum/gas/plasma])
var/plasma_pp = breath.get_breath_partial_pressure(breath.gases[/datum/gas/plasma])
owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index b16967b6b0..9f910de9a9 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -153,6 +153,17 @@
// if they have no mutant tongues, give them a regular one
T.Insert(src)
+ else
+ var/obj/item/organ/tongue/oT = getorganslot(ORGAN_SLOT_TONGUE)
+ if(oT.name == "fluffy tongue")
+ var/obj/item/organ/tongue/T
+ if(dna && dna.species && dna.species.mutanttongue)
+ T = new dna.species.mutanttongue()
+ else
+ T = new()
+ oT.Remove(src)
+ qdel(oT)
+ T.Insert(src)
if(!getorganslot(ORGAN_SLOT_EYES))
var/obj/item/organ/eyes/E
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 549f0cc953..3eaaa8de92 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -253,8 +253,6 @@
message = replacetext(message, "ove", "uv")
message = replacetext(message, "l", "w")
message = replacetext(message, "r", "w")
- if(prob(20))
- message += pick(" OwO", " uwu")
message = lowertext(message)
speech_args[SPEECH_MESSAGE] = message
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 1967ac9bd7..3819015465 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -3,7 +3,7 @@
#define COOLDOWN_MEME 300
#define COOLDOWN_NONE 100
-/obj/item/organ/vocal_cords //organs that are activated through speech with the :x channel
+/obj/item/organ/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel
name = "vocal cords"
icon_state = "appendix"
zone = BODY_ZONE_PRECISE_MOUTH
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index 54482ade73..39077ae235 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -1,8 +1,7 @@
/datum/surgery/plastic_surgery
- name = "plastic surgery"
+ name = "Plastic surgery"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/reshape_face, /datum/surgery_step/close)
possible_locs = list(BODY_ZONE_HEAD)
-
//reshape_face
/datum/surgery_step/reshape_face
name = "reshape face"
@@ -10,12 +9,16 @@
time = 64
/datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to alter [target]'s appearance.", "You begin to alter [target]'s appearance...")
+ display_results(user, target, "You begin to alter [target]'s appearance...",
+ "[user] begins to alter [target]'s appearance.",
+ "[user] begins to make an incision in [target]'s face.")
/datum/surgery_step/reshape_face/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(HAS_TRAIT_FROM(target, TRAIT_DISFIGURED, TRAIT_GENERIC))
REMOVE_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC)
- user.visible_message("[user] successfully restores [target]'s appearance!", "You successfully restore [target]'s appearance.")
+ display_results(user, target, "You successfully restore [target]'s appearance.",
+ "[user] successfully restores [target]'s appearance!",
+ "[user] finishes the operation on [target]'s face.")
else
var/list/names = list()
if(!isabductor(user))
@@ -31,8 +34,18 @@
var/oldname = target.real_name
target.real_name = chosen_name
var/newname = target.real_name //something about how the code handles names required that I use this instead of target.real_name
- user.visible_message("[user] alters [oldname]'s appearance completely, [target.p_they()] is now [newname]!", "You alter [oldname]'s appearance completely, [target.p_they()] is now [newname].")
+ display_results(user, target, "You alter [oldname]'s appearance completely, [target.p_they()] is now [newname].",
+ "[user] alters [oldname]'s appearance completely, [target.p_they()] is now [newname]!",
+ "[user] finishes the operation on [target]'s face.")
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.sec_hud_set_ID()
return 1
+ return TRUE
+
+/datum/surgery_step/reshape_face/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You screw up, leaving [target]'s appearance disfigured!",
+ "[user] screws up, disfiguring [target]'s appearance!",
+ "[user] finishes the operation on [target]'s face.")
+ ADD_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC)
+ return FALSE
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 9032964ae4..fdceb1fb1f 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -1,26 +1,21 @@
/datum/surgery/prosthetic_replacement
- name = "prosthetic replacement"
+ name = "Prosthetic replacement"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/add_prosthetic)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
requires_bodypart = FALSE //need a missing limb
requires_bodypart_type = 0
-
/datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target)
if(!iscarbon(target))
return 0
var/mob/living/carbon/C = target
if(!C.get_bodypart(user.zone_selected)) //can only start if limb is missing
return 1
-
-
-
/datum/surgery_step/add_prosthetic
name = "add prosthetic"
implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100)
time = 32
var/organ_rejection_dam = 0
-
/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(tool, /obj/item/organ_storage))
if(!tool.contents.len)
@@ -48,16 +43,19 @@
organ_rejection_dam = 30
if(target_zone == BP.body_zone) //so we can't replace a leg with an arm, or a human arm with a monkey arm.
- user.visible_message("[user] begins to replace [target]'s [parse_zone(target_zone)].", "You begin to replace [target]'s [parse_zone(target_zone)]...")
+ display_results(user, target, "You begin to replace [target]'s [parse_zone(target_zone)] with [tool]...",
+ "[user] begins to replace [target]'s [parse_zone(target_zone)] with [tool].",
+ "[user] begins to replace [target]'s [parse_zone(target_zone)].")
else
to_chat(user, "[tool] isn't the right type for [parse_zone(target_zone)].")
return -1
else if(target_zone == BODY_ZONE_L_ARM || target_zone == BODY_ZONE_R_ARM)
- user.visible_message("[user] begins to attach [tool] onto [target].", "You begin to attach [tool] onto [target]...")
+ display_results(user, target, "You begin to attach [tool] onto [target]...",
+ "[user] begins to attach [tool] onto [target]'s [parse_zone(target_zone)].",
+ "[user] begins to attach something onto [target]'s [parse_zone(target_zone)].")
else
to_chat(user, "[tool] must be installed onto an arm.")
return -1
-
/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(tool, /obj/item/organ_storage))
tool.icon_state = initial(tool.icon_state)
@@ -69,13 +67,17 @@
L.attach_limb(target)
if(organ_rejection_dam)
target.adjustToxLoss(organ_rejection_dam)
- user.visible_message("[user] successfully replaces [target]'s [parse_zone(target_zone)]!", "You succeed in replacing [target]'s [parse_zone(target_zone)].")
+ display_results(user, target, "You succeed in replacing [target]'s [parse_zone(target_zone)].",
+ "[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!",
+ "[user] successfully replaces [target]'s [parse_zone(target_zone)]!")
return 1
else
var/obj/item/bodypart/L = target.newBodyPart(target_zone, FALSE, FALSE)
L.is_pseudopart = TRUE
L.attach_limb(target)
- user.visible_message("[user] finishes attaching [tool]!", "You attach [tool].")
+ display_results(user, target, "You attach [tool].",
+ "[user] finishes attaching [tool]!",
+ "[user] finishes the attachment procedure!")
qdel(tool)
if(istype(tool, /obj/item/twohanded/required/chainsaw))
var/obj/item/mounted_chainsaw/new_arm = new(target)
@@ -85,4 +87,3 @@
var/obj/item/melee/arm_blade/new_arm = new(target,TRUE,TRUE)
target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
return 1
-
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 451ae02dac..0c3a3b55a5 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -2,23 +2,20 @@
name = "removal of embedded objects"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/remove_object)
possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD)
-
-
/datum/surgery_step/remove_object
name = "remove embedded objects"
time = 32
accept_hand = 1
var/obj/item/bodypart/L = null
-
-
/datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
L = surgery.operated_bodypart
if(L)
- user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_selected)].", "You look for objects embedded in [target]'s [parse_zone(user.zone_selected)]...")
+ display_results(user, target, "You look for objects embedded in [target]'s [parse_zone(user.zone_selected)]...",
+ "[user] looks for objects embedded in [target]'s [parse_zone(user.zone_selected)].",
+ "[user] looks for something in [target]'s [parse_zone(user.zone_selected)].")
else
user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...")
-
/datum/surgery_step/remove_object/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(L)
if(ishuman(target))
@@ -33,11 +30,12 @@
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "embedded")
if(objects > 0)
- user.visible_message("[user] successfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].")
+ display_results(user, target, "You successfully remove [objects] objects from [H]'s [L.name].",
+ "[user] successfully removes [objects] objects from [H]'s [L]!",
+ "[user] successfully removes [objects] objects from [H]'s [L]!")
else
to_chat(user, "You find no objects embedded in [H]'s [L]!")
else
to_chat(user, "You can't find [target]'s [parse_zone(user.zone_selected)], let alone any objects embedded in it!")
-
return 1
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index f670b80167..c5a944fbb2 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -2,13 +2,12 @@
var/name
var/list/implements = list() //format is path = probability of success. alternatively
var/implement_type = null //the current type of implement used. This has to be stored, as the actual typepath of the tool may not match the list type.
- var/accept_hand = 0 //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
- var/accept_any_item = 0 //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
+ var/accept_hand = FALSE //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
+ var/accept_any_item = FALSE //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
var/time = 10 //how long does the step take?
- var/repeatable = 0 //can this step be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop
+ var/repeatable = FALSE //can this step be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop
var/list/chems_needed = list() //list of chems needed to complete the step. Even on success, the step will have no effect if there aren't the chems required in the mob.
var/require_all_chems = TRUE //any on the list or all on the list?
-
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
var/success = FALSE
if(accept_hand)
@@ -16,104 +15,87 @@
success = TRUE
if(iscyborg(user))
success = TRUE
-
if(accept_any_item)
if(tool && tool_check(user, tool))
success = TRUE
-
else if(tool)
for(var/key in implements)
var/match = FALSE
-
if(ispath(key) && istype(tool, key))
match = TRUE
else if(tool.tool_behaviour == key)
match = TRUE
-
if(match)
implement_type = key
if(tool_check(user, tool))
success = TRUE
break
-
if(success)
if(target_zone == surgery.location)
if(get_location_accessible(target, target_zone) || surgery.ignore_clothes)
- initiate(user, target, target_zone, tool, surgery, try_to_fail)
- return 1
+ return initiate(user, target, target_zone, tool, surgery, try_to_fail)
else
to_chat(user, "You need to expose [target]'s [parse_zone(target_zone)] to perform surgery on it!")
- return 1 //returns 1 so we don't stab the guy in the dick or wherever.
-
+ return TRUE //returns TRUE so we don't stab the guy in the dick or wherever.
if(repeatable)
var/datum/surgery_step/next_step = surgery.get_surgery_next_step()
if(next_step)
surgery.status++
if(next_step.try_op(user, target, user.zone_selected, user.get_active_held_item(), surgery))
- return 1
+ return TRUE
else
surgery.status--
-
- if(iscyborg(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache
- return 1
-
- return 0
-
-
+ return FALSE
/datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
- surgery.step_in_progress = 1
-
+ surgery.step_in_progress = TRUE
var/speed_mod = 1
-
+ var/advance = FALSE
if(preop(user, target, target_zone, tool, surgery) == -1)
- surgery.step_in_progress = 0
- return
-
+ surgery.step_in_progress = FALSE
+ return FALSE
if(tool)
speed_mod = tool.toolspeed
-
if(do_after(user, time * speed_mod, target = target))
- var/advance = 0
var/prob_chance = 100
-
if(implement_type) //this means it isn't a require hand or any item step.
prob_chance = implements[implement_type]
prob_chance *= surgery.get_propability_multiplier()
-
if((prob(prob_chance) || iscyborg(user)) && chem_check(target) && !try_to_fail)
if(success(user, target, target_zone, tool, surgery))
- advance = 1
+ advance = TRUE
else
if(failure(user, target, target_zone, tool, surgery))
- advance = 1
-
+ advance = TRUE
if(advance && !repeatable)
surgery.status++
if(surgery.status > surgery.steps.len)
surgery.complete()
-
- surgery.step_in_progress = 0
+ surgery.step_in_progress = FALSE
+ return advance
/datum/surgery_step/proc/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to perform surgery on [target].", "You begin to perform surgery on [target]...")
-
+ display_results(user, target, "You begin to perform surgery on [target]...",
+ "[user] begins to perform surgery on [target].",
+ "[user] begins to perform surgery on [target].")
/datum/surgery_step/proc/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] succeeds!", "You succeed.")
- return 1
+ display_results(user, target, "You succeed.",
+ "[user] succeeds!",
+ "[user] finishes.")
+ return TRUE
/datum/surgery_step/proc/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] screws up!", "You screw up!")
- return 0
+ display_results(user, target, "You screw up!",
+ "[user] screws up!",
+ "[user] finishes.", TRUE) //By default the patient will notice if the wrong thing has been cut
+ return FALSE
/datum/surgery_step/proc/tool_check(mob/user, obj/item/tool)
- return 1
-
+ return TRUE
/datum/surgery_step/proc/chem_check(mob/living/carbon/target)
if(!LAZYLEN(chems_needed))
return TRUE
-
if(require_all_chems)
. = TRUE
for(var/R in chems_needed)
@@ -124,7 +106,6 @@
for(var/R in chems_needed)
if(target.reagents.has_reagent(R))
return TRUE
-
/datum/surgery_step/proc/get_chem_list()
if(!LAZYLEN(chems_needed))
return
@@ -135,3 +116,11 @@
var/chemname = temp.name
chems += chemname
return english_list(chems, and_text = require_all_chems ? " and " : " or ")
+
+//Replaces visible_message during operations so only people looking over the surgeon can tell what they're doing, allowing for shenanigans.
+/datum/surgery_step/proc/display_results(mob/user, mob/living/carbon/target, self_message, detailed_message, vague_message, target_detailed = FALSE)
+ var/list/detailed_mobs = get_hearers_in_view(1, user) //Only the surgeon and people looking over his shoulder can see the operation clearly
+ if(!target_detailed)
+ detailed_mobs -= target //The patient can't see well what's going on, unless it's something like getting cut
+ user.visible_message(detailed_message, self_message, vision_distance = 1, ignored_mobs = target_detailed ? null : target)
+ user.visible_message(vague_message, "", ignored_mobs = detailed_mobs)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 2ec320f20f..781fdb24f5 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -290,6 +290,22 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous
category = "Conspicuous and Dangerous Weapons"
+/datum/uplink_item/dangerous/pistol
+ name = "Stechkin Pistol"
+ desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible \
+ with suppressors."
+ item = /obj/item/gun/ballistic/automatic/pistol
+ cost = 7
+ exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+
+/datum/uplink_item/dangerous/revolver
+ name = "Syndicate Revolver"
+ desc = "A brutally simple syndicate revolver that fires .357 Magnum rounds and has 7 chambers."
+ item = /obj/item/gun/ballistic/revolver/syndie
+ cost = 13
+ surplus = 50
+ exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/dangerous/rawketlawnchair
name = "84mm Rocket Propelled Grenade Launcher"
desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \
@@ -414,8 +430,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/rapier
name = "Rapier"
desc = "A fancy rapier with a diamond tip piercing anything that it comes into contack with. \
- The rapier comes with its own shielf, this is rather noticeable as only the captain is known to carry a shielf. \
- The shielf itself can be used to block melee attacks only. Its also jet black colours."
+ The rapier comes with its own sheath, this is rather noticeable as only the captain is known to carry a sheath. \
+ The sheath itself can be used to block melee attacks only. Its also jet black colours."
item = /obj/item/storage/belt/sabre/rapier
cost = 8
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
@@ -494,14 +510,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
surplus = 25
include_modes = list(/datum/game_mode/nuclear)
-/datum/uplink_item/dangerous/pistol
- name = "Stechkin Pistol"
- desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible \
- with suppressors."
- item = /obj/item/gun/ballistic/automatic/pistol
- cost = 7
- exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
-
/datum/uplink_item/dangerous/bolt_action
name = "Surplus Rifle"
desc = "A horribly outdated bolt action weapon. You've got to be desperate to use this."
@@ -509,14 +517,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
include_modes = list(/datum/game_mode/nuclear)
-/datum/uplink_item/dangerous/revolver
- name = "Syndicate Revolver"
- desc = "A brutally simple Syndicate revolver that fires .357 Magnum rounds and has 7 chambers."
- item = /obj/item/gun/ballistic/revolver/syndie
- cost = 13
- surplus = 50
- exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
-
/datum/uplink_item/dangerous/foamsmg
name = "Toy Submachine Gun"
desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine."
@@ -563,6 +563,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 13
surplus = 0
+/datum/uplink_item/dangerous/phantomthief
+ name = "Syndicate Mask"
+ desc = "A cheap plastic mask fitted with an adrenaline autoinjector, which can be used by simply tensing your muscles"
+ item = /obj/item/clothing/glasses/phantomthief/syndicate
+ cost = 2
+
/datum/uplink_item/stealthy_weapons/dart_pistol
name = "Dart Pistol"
desc = "A miniaturized version of a normal syringe gun. It is very quiet when fired and can fit into any \
@@ -1263,9 +1269,44 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
//Space Suits and Hardsuits
/datum/uplink_item/suits
- category = "Space Suits and Hardsuits"
+ category = "Space Suits, Hardsuits and Clothing"
surplus = 40
+/datum/uplink_item/suits/turtlenck
+ name = "Tactical Turtleneck"
+ desc = "A slightly armored suit that has no sensor on them, if someone sees you in this hope they think its a fake."
+ item = /obj/item/clothing/under/syndicate
+ cost = 1
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) //They already get these
+
+/datum/uplink_item/suits/turtlenck_skirt
+ name = "Tactical Skirtleneck"
+ desc = "A slightly armored suit that has no sensor on them, if someone sees you in this hope they think its a fake."
+ item = /obj/item/clothing/under/syndicate/skirt
+ cost = 1
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) //They already get these
+
+/datum/uplink_item/suits/padding
+ name = "Soft Padding"
+ desc = "Padding to add to a jumpsuit to help against melee and bullets."
+ item = /obj/item/clothing/accessory/padding
+ cost = 2
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
+/datum/uplink_item/suits/kevlar
+ name = "Kevlar sheets"
+ desc = "Kevlar sheets to add to jumpsuit to help against bullets and melee."
+ item = /obj/item/clothing/accessory/kevlar
+ cost = 2
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
+/datum/uplink_item/suits/plastic
+ name = "Plastic sheet"
+ desc = "Plastic body sheet to add to a jumpsuit to help against laser and energy harm."
+ item = /obj/item/clothing/accessory/plastics
+ cost = 2
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
+
/datum/uplink_item/suits/space_suit
name = "Syndicate Space Suit"
desc = "This red and black Syndicate space suit is less encumbering than Nanotrasen variants, \
@@ -1307,6 +1348,19 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools
category = "Devices and Tools"
+/datum/uplink_item/device_tools/emag
+ name = "Cryptographic Sequencer"
+ desc = "The cryptographic sequencer, electromagnetic card, or emag, is a small card that unlocks hidden functions \
+ in electronic devices, subverts intended functions, and easily breaks security mechanisms."
+ item = /obj/item/card/emag
+ cost = 6
+
+/datum/uplink_item/device_tools/emagrecharge
+ name = "Electromagnet Charging Device"
+ desc = "A small device intended for recharging Cryptographic Sequencers. Using it will add five extra charges to the Cryptographic Sequencer."
+ item = /obj/item/emagrecharge
+ cost = 2
+
/datum/uplink_item/device_tools/cutouts
name = "Adaptive Cardboard Cutouts"
desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. \
@@ -1375,19 +1429,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 1
exclude_modes = list(/datum/game_mode/nuclear)
-/datum/uplink_item/device_tools/emag
- name = "Cryptographic Sequencer"
- desc = "The cryptographic sequencer, electromagnetic card, or emag, is a small card that unlocks hidden functions \
- in electronic devices, subverts intended functions, and easily breaks security mechanisms."
- item = /obj/item/card/emag
- cost = 6
-
-/datum/uplink_item/device_tools/emagrecharge
- name = "Electromagnet Charging Device"
- desc = "A small device intended for recharging Cryptographic Sequencers. Using it will add five extra charges to the Cryptographic Sequencer."
- item = /obj/item/emagrecharge
- cost = 2
-
/datum/uplink_item/device_tools/fakenucleardisk
name = "Decoy Nuclear Authentication Disk"
desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \
@@ -1418,6 +1459,7 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
desc = "A cheap bottle of one use syndicate brand super glue. \
Use on any item to make it undroppable. \
Be careful not to glue an item you're already holding!"
+ exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
item = /obj/item/syndie_glue
cost = 2
@@ -1837,6 +1879,13 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
item = /obj/item/clothing/shoes/clown_shoes/taeclowndo
restricted_roles = list("Clown")
+/datum/uplink_item/role_restricted/emitter_cannon
+ name = "Emitter Cannon"
+ desc = "A small emitter fitted into a gun case, do to size constraints and safety it can only shoot about ten times when fully charged."
+ cost = 5 //Low ammo, and deals same as 10mm but emp-able
+ item = /obj/item/gun/energy/emitter
+ restricted_roles = list("Chief Engineer", "Station Engineer", "Atmospheric Technician")
+
// Pointless
/datum/uplink_item/badass
category = "(Pointless) Badassery"
@@ -1848,16 +1897,6 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
Please note that this kit did NOT pass quality control."
item = /obj/item/storage/box/syndie_kit/chameleon/broken
-//ported from tg as is along with functions, removal requested.
-//Commented out, will remove when fixing merge conflicts
-/*
-/datum/uplink_item/device_tools/hypnotic_flash
- name = "Hypnotic Flash"
- desc = "A modified flash able to hypnotize targets. If the target is not in a mentally vulnerable state, it will only confuse and pacify them temporarily."
- item = /obj/item/assembly/flash/hypnotic
- cost = 7
-*/
-
/datum/uplink_item/badass/costumes
include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
cost = 4
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index 63ef4fda5a..e504ea84f2 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -63,11 +63,13 @@
DumpMobs(TRUE)
/obj/vehicle/sealed/car/clowncar/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You scramble the clowncar child safety lock and a panel with 6 colorful buttons appears!")
initialize_controller_action_type(/datum/action/vehicle/sealed/RollTheDice, VEHICLE_CONTROL_DRIVE)
+ return TRUE
/obj/vehicle/sealed/car/clowncar/Destroy()
playsound(src, 'sound/vehicles/clowncar_fart.ogg', 100)
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 410952397d..5165343993 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -65,7 +65,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
var/scan_id = 1
var/obj/item/coin/coin
var/obj/item/stack/spacecash/bill
-
+
var/global/vending_cache = list() //used for storing the icons of items being vended
var/dish_quants = list() //used by the snack machine's custom compartment to count dishes.
@@ -306,10 +306,12 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
. = ..()
/obj/machinery/vending/emag_act(mob/user)
+ . = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
to_chat(user, "You short out the product lock on [src].")
+ return TRUE
/obj/machinery/vending/_try_interact(mob/user)
if(seconds_electrified && !(stat & NOPOWER))
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 5cfa454bd9..a265a4e907 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -63,6 +63,8 @@
/obj/item/clothing/suit/wizrobe/fake = 1,
/obj/item/clothing/head/wizard/fake = 1,
/obj/item/staff = 3,
+ /obj/item/clothing/under/rank/mime/skirt = 1,
+ /obj/item/clothing/under/gimmick/rank/captain/suit/skirt = 1,
/obj/item/clothing/mask/gas/sexyclown = 1,
/obj/item/clothing/under/rank/clown/sexy = 1,
/obj/item/clothing/mask/gas/sexymime = 1,
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index c31c9a12a2..1497992fe8 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -31,6 +31,9 @@
/obj/item/clothing/under/pants/tan = 4,
/obj/item/clothing/under/pants/track = 3,
/obj/item/clothing/suit/jacket/miljacket = 5,
+ /obj/item/clothing/under/scratch/skirt = 2,
+ /obj/item/clothing/under/gimmick/rank/captain/suit/skirt = 2,
+ /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt = 2,
/obj/item/clothing/neck/tie/blue = 3,
/obj/item/clothing/neck/tie/red = 3,
/obj/item/clothing/neck/tie/black = 3,
@@ -98,6 +101,7 @@
/obj/item/clothing/suit/apron/purple_bartender = 4,
/obj/item/clothing/under/rank/bartender/purple = 4)
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 3,
+ /obj/item/clothing/under/syndicate/tacticool/skirt = 3,
/obj/item/clothing/mask/balaclava = 3,
/obj/item/clothing/head/ushanka = 3,
/obj/item/clothing/under/soviet = 3,
diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm
index 4594048256..d230f40af0 100644
--- a/code/modules/vending/megaseed.dm
+++ b/code/modules/vending/megaseed.dm
@@ -15,6 +15,7 @@
/obj/item/seeds/chili = 3,
/obj/item/seeds/cocoapod = 3,
/obj/item/seeds/coffee = 3,
+ /obj/item/seeds/cotton = 3,
/obj/item/seeds/corn = 3,
/obj/item/seeds/eggplant = 3,
/obj/item/seeds/grape = 3,
@@ -23,6 +24,7 @@
/obj/item/seeds/lime = 3,
/obj/item/seeds/onion = 3,
/obj/item/seeds/orange = 3,
+ /obj/item/seeds/peach = 3,
/obj/item/seeds/peanutseed = 3,
/obj/item/seeds/pineapple = 3,
/obj/item/seeds/potato = 3,
@@ -31,7 +33,9 @@
/obj/item/seeds/replicapod = 3,
/obj/item/seeds/wheat/rice = 3,
/obj/item/seeds/soya = 3,
+ /obj/item/seeds/sugarcane = 3,
/obj/item/seeds/sunflower = 3,
+ /obj/item/seeds/strawberry = 3,
/obj/item/seeds/tea = 3,
/obj/item/seeds/tobacco = 3,
/obj/item/seeds/tomato = 3,
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index aaa1cf3b6f..b3b21fe375 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -12,7 +12,8 @@
/obj/item/reagent_containers/food/snacks/donut = 12,
/obj/item/storage/box/evidence = 6,
/obj/item/flashlight/seclite = 4,
- /obj/item/restraints/legcuffs/bola/energy = 7)
+ /obj/item/restraints/legcuffs/bola/energy = 7,
+ /obj/item/secbat = 5)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,
/obj/item/storage/fancy/donut_box = 2,
/obj/item/ssword_kit = 1)
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 4e88833553..015890419d 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -40,6 +40,7 @@
/obj/item/clothing/suit/hooded/wintercoat/medical = 3,
/obj/item/clothing/under/rank/nursesuit = 3,
/obj/item/clothing/head/nursehat = 3,
+ /obj/item/clothing/under/rank/medical/skirt= 5,
/obj/item/clothing/under/rank/medical/blue = 2,
/obj/item/clothing/under/rank/medical/green = 2,
/obj/item/clothing/under/rank/medical/purple = 2,
@@ -67,6 +68,7 @@
/obj/item/storage/backpack/satchel/eng = 3,
/obj/item/clothing/suit/hooded/wintercoat/engineering = 3,
/obj/item/clothing/under/rank/engineer = 5,
+ /obj/item/clothing/under/rank/engineer/skirt = 5,
/obj/item/clothing/suit/hazardvest = 5,
/obj/item/clothing/shoes/workboots = 5,
/obj/item/clothing/head/hardhat = 5)
@@ -87,6 +89,7 @@
/obj/item/storage/backpack/industrial = 3,
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 5,
/obj/item/clothing/under/rank/atmospheric_technician = 5,
+ /obj/item/clothing/under/rank/atmospheric_technician/skirt = 5,
/obj/item/clothing/shoes/sneakers/black = 5)
refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe
@@ -101,6 +104,7 @@
vend_reply = "Thank you for using the CargoDrobe!"
products = list(/obj/item/clothing/suit/hooded/wintercoat/cargo = 3,
/obj/item/clothing/under/rank/cargotech = 5,
+ /obj/item/clothing/under/rank/cargotech/skirt = 5,
/obj/item/clothing/shoes/sneakers/black = 5,
/obj/item/clothing/gloves/fingerless = 5,
/obj/item/clothing/head/soft = 5,
@@ -118,12 +122,14 @@
vend_reply = "Thank you for using the RoboDrobe!"
products = list(/obj/item/clothing/glasses/hud/diagnostic = 3,
/obj/item/clothing/under/rank/roboticist = 3,
+ /obj/item/clothing/under/rank/roboticist/skirt = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
/obj/item/clothing/head/soft/black = 3,
/obj/item/clothing/mask/bandana/skull = 2)
premium = list(/obj/item/radio/headset/headset_rob = 2) //Cit change
+ contraband = list(/obj/item/clothing/suit/hooded/techpriest = 2)
refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe
/obj/item/vending_refill/wardrobe/robo_wardrobe
@@ -140,6 +146,7 @@
/obj/item/storage/backpack/satchel/tox = 3,
/obj/item/clothing/suit/hooded/wintercoat/science = 3,
/obj/item/clothing/under/rank/scientist = 4,
+ /obj/item/clothing/under/rank/scientist/skirt = 4,
/obj/item/clothing/suit/toggle/labcoat/science = 4,
/obj/item/clothing/shoes/sneakers/white = 4,
/obj/item/radio/headset/headset_sci = 4,
@@ -161,6 +168,7 @@
/obj/item/clothing/suit/apron = 3,
/obj/item/clothing/suit/apron/overalls = 5,
/obj/item/clothing/under/rank/hydroponics = 5,
+ /obj/item/clothing/under/rank/hydroponics/skirt = 5,
/obj/item/clothing/mask/bandana = 4)
refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe
@@ -175,6 +183,9 @@
vend_reply = "Thank you for using the CuraDrobe!"
products = list(/obj/item/clothing/head/fedora/curator = 2,
/obj/item/clothing/suit/curator = 2,
+ /obj/item/clothing/under/rank/curator/skirt = 2,
+ /obj/item/clothing/under/gimmick/rank/captain/suit/skirt = 2,
+ /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt = 2,
/obj/item/clothing/under/rank/curator/treasure_hunter = 2,
/obj/item/clothing/shoes/workboots/mining = 2,
/obj/item/storage/backpack/satchel/explorer = 2,
@@ -194,12 +205,13 @@
/obj/item/radio/headset/headset_srv = 3,
/obj/item/clothing/under/sl_suit = 3,
/obj/item/clothing/under/rank/bartender = 3,
+ /obj/item/clothing/under/rank/bartender/skirt = 2,
/obj/item/clothing/under/rank/bartender/purple = 2,
/obj/item/clothing/accessory/waistcoat = 3,
/obj/item/clothing/suit/apron/purple_bartender = 2,
/obj/item/clothing/head/soft/black = 4,
/obj/item/clothing/shoes/sneakers/black = 4,
- /obj/item/reagent_containers/glass/rag = 4,
+ /obj/item/reagent_containers/rag = 4,
/obj/item/storage/box/beanbag = 1,
/obj/item/clothing/suit/armor/vest/alt = 1,
/obj/item/circuitboard/machine/dish_drive = 1,
@@ -226,8 +238,10 @@
/obj/item/circuitboard/machine/dish_drive = 1,
/obj/item/clothing/suit/toggle/chef = 2,
/obj/item/clothing/under/rank/chef = 2,
+ /obj/item/clothing/under/rank/chef/skirt = 2,
/obj/item/clothing/head/chefhat = 2,
- /obj/item/reagent_containers/glass/rag = 3)
+ /obj/item/reagent_containers/rag = 3,
+ /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2)
refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe
/obj/item/vending_refill/wardrobe/chef_wardrobe
@@ -240,6 +254,7 @@
product_ads = "Come and get your janitorial clothing, now endorsed by lizard janitors everywhere!"
vend_reply = "Thank you for using the JaniDrobe!"
products = list(/obj/item/clothing/under/rank/janitor = 2,
+ /obj/item/clothing/under/rank/janitor/skirt = 2,
/obj/item/cartridge/janitor = 3,
/obj/item/clothing/gloves/color/black = 2,
/obj/item/clothing/head/soft/purple = 2,
@@ -265,10 +280,19 @@
icon_state = "lawdrobe"
product_ads = "OBJECTION! Get the rule of law for yourself!"
vend_reply = "Thank you for using the LawDrobe!"
- products = list(/obj/item/clothing/under/lawyer/female = 3,
- /obj/item/clothing/under/lawyer/black = 3,
+ products = list(/obj/item/clothing/under/lawyer/bluesuit/skirt = 3,
+ /obj/item/clothing/under/lawyer/purpsuit/skirt = 3,
+ /obj/item/clothing/under/lawyer/blacksuit/skirt = 3,
+ /obj/item/clothing/under/lawyer/female = 3,
+ /obj/item/clothing/under/lawyer/female/skirt = 3,
+ /obj/item/clothing/under/lawyer/really_black = 3,
+ /obj/item/clothing/under/lawyer/really_black/skirt = 3,
+ /obj/item/clothing/under/lawyer/blue = 3,
+ /obj/item/clothing/under/lawyer/blue/skirt = 3,
/obj/item/clothing/under/lawyer/red = 3,
- /obj/item/clothing/under/lawyer/bluesuit = 3,
+ /obj/item/clothing/under/lawyer/red/skirt = 3,
+ /obj/item/clothing/under/lawyer/black = 3,
+ /obj/item/clothing/under/lawyer/black/skirt = 3,
/obj/item/clothing/suit/toggle/lawyer = 3,
/obj/item/clothing/under/lawyer/purpsuit = 3,
/obj/item/clothing/suit/toggle/lawyer/purple = 3,
@@ -291,10 +315,14 @@
/obj/item/storage/backpack/cultpack = 2,
/obj/item/clothing/accessory/pocketprotector/cosmetology = 2,
/obj/item/clothing/under/rank/chaplain = 2,
+ /obj/item/clothing/under/rank/chaplain/skirt = 2,
/obj/item/clothing/shoes/sneakers/black = 2,
/obj/item/clothing/suit/nun = 2,
/obj/item/clothing/head/nun_hood = 2,
/obj/item/clothing/suit/holidaypriest = 2,
+ /obj/item/clothing/suit/pharaoh = 2,
+ /obj/item/clothing/head/nemes = 1,
+ /obj/item/clothing/head/pharaoh = 1,
/obj/item/storage/fancy/candle_box = 3)
refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe
@@ -308,6 +336,7 @@
product_ads = "Our clothes are 0.5% more resistant to acid spills! Get yours now!"
vend_reply = "Thank you for using the ChemDrobe!"
products = list(/obj/item/clothing/under/rank/chemist = 3,
+ /obj/item/clothing/under/rank/chemist/skirt = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/chemist = 3,
/obj/item/storage/backpack/chemistry = 3,
@@ -326,6 +355,7 @@
product_ads = "Perfect for the mad scientist in you!"
vend_reply = "Thank you for using the GeneDrobe!"
products = list(/obj/item/clothing/under/rank/geneticist = 3,
+ /obj/item/clothing/under/rank/geneticist/skirt = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/genetics = 3,
/obj/item/storage/backpack/genetics = 3,
@@ -342,6 +372,7 @@
product_ads = " Viruses getting you down? Then upgrade to sterilized clothing today!"
vend_reply = "Thank you for using the ViroDrobe"
products = list(/obj/item/clothing/under/rank/virologist = 3,
+ /obj/item/clothing/under/rank/virologist/skirt = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/virologist = 3,
/obj/item/clothing/mask/surgical = 3,
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 9a2455f56d..ae53f29a55 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -13,6 +13,7 @@
hitsound = 'sound/hallucinations/growl1.ogg'
force = 21 // Just enough to break airlocks with melee attacks
damtype = "brute"
+ total_mass = TOTAL_MASS_HAND_REPLACEMENT
/obj/item/zombie_hand/Initialize()
. = ..()
diff --git a/config/config.txt b/config/config.txt
index 3bc9f873a9..a01f5424da 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -4,6 +4,7 @@ $include game_options.txt
$include dbconfig.txt
$include comms.txt
$include antag_rep.txt
+$include donator_groupings.txt
# You can use the @ character at the beginning of a config option to lock it from being edited in-game
# Example usage:
diff --git a/config/donator_groupings.txt b/config/donator_groupings.txt
new file mode 100644
index 0000000000..b26d1efe22
--- /dev/null
+++ b/config/donator_groupings.txt
@@ -0,0 +1,8 @@
+#this is a bad system but I'm lazy so it piggybacks off config loader system.
+#Specify group followed by ckey for each ckey.
+
+#TIER_1_DONATORS test_ckey
+
+#TIER_2_DONATORS test_ckey
+
+#TIER_3_DONATORS test_ckey
diff --git a/config/spaceRuinBlacklist.txt b/config/spaceRuinBlacklist.txt
index cba9a01e73..deafa47969 100644
--- a/config/spaceRuinBlacklist.txt
+++ b/config/spaceRuinBlacklist.txt
@@ -49,3 +49,4 @@
#_maps/RandomRuins/SpaceRuins/bigape.dmm
#_maps/RandomRuins/SpaceRuins/arcade.dmm
#_maps/RandomRuins/SpaceRuins/spacehermit.dmm
+#_maps/RandomRuins/SpaceRuins/advancedlab.dmm
diff --git a/html/changelogs/AutoChangeLog-pr-8349.yml b/html/changelogs/AutoChangeLog-pr-8349.yml
new file mode 100644
index 0000000000..de4c08624a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8349.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "more bountys"
+ - rscdel: "Nitryl bounty"
diff --git a/html/changelogs/AutoChangeLog-pr-8537.yml b/html/changelogs/AutoChangeLog-pr-8537.yml
new file mode 100644
index 0000000000..a537ba1c3a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8537.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes emags wasting charges on un-emaggable & co stuff."
diff --git a/html/changelogs/AutoChangeLog-pr-8636.yml b/html/changelogs/AutoChangeLog-pr-8636.yml
new file mode 100644
index 0000000000..3b291661b5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8636.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "fixed airless place"
diff --git a/html/changelogs/AutoChangeLog-pr-8649.yml b/html/changelogs/AutoChangeLog-pr-8649.yml
new file mode 100644
index 0000000000..c8f61cc24e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8649.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "The default amount of z-levels reserved specifically for space ruin generation has been increased from 1 to 2"
diff --git a/html/changelogs/AutoChangeLog-pr-8660.yml b/html/changelogs/AutoChangeLog-pr-8660.yml
new file mode 100644
index 0000000000..710c4489ea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8660.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - code_imp: "Changes some files to be better"
diff --git a/html/changelogs/AutoChangeLog-pr-8673.yml b/html/changelogs/AutoChangeLog-pr-8673.yml
new file mode 100644
index 0000000000..6ff2c7135c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8673.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "As all things are not"
diff --git a/html/changelogs/AutoChangeLog-pr-8763.yml b/html/changelogs/AutoChangeLog-pr-8763.yml
new file mode 100644
index 0000000000..d99b529656
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8763.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "bone satchles"
diff --git a/html/changelogs/AutoChangeLog-pr-8774.yml b/html/changelogs/AutoChangeLog-pr-8774.yml
new file mode 100644
index 0000000000..7ba01cc6aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8774.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - bugfix: "Removed the human check for cult conversion of captain/chaplain minds."
diff --git a/html/changelogs/AutoChangeLog-pr-8795.yml b/html/changelogs/AutoChangeLog-pr-8795.yml
new file mode 100644
index 0000000000..7fe2250a0b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8795.yml
@@ -0,0 +1,7 @@
+author: "Sishen1542, original by @zxaber"
+delete-after: True
+changes:
+ - balance: "Utility mechs no longer automatically get beacons."
+ - balance: "Tracking beacons no longer delete themselves when EMPing a mech, and instead have a ten-second cooldown in-between EMPs. They also now do heavy EMP damage rather than light."
+ - balance: "Mechs that take EMP damage lose the use of their weapons and equipment temporarily. Movement and abilities are not effected."
+ - balance: "Mechs taking EMP damage no longer roll for a random malfunction."
diff --git a/html/changelogs/AutoChangeLog-pr-8829.yml b/html/changelogs/AutoChangeLog-pr-8829.yml
new file mode 100644
index 0000000000..6d0dd108dd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8829.yml
@@ -0,0 +1,5 @@
+author: "BurgerLUA"
+delete-after: True
+changes:
+ - code_imp: "Added a new framework for reagents. Reagents can now have a bool that determines if it can be detected by handheld medical analyzers. Currently only the changeling sting chemical does this."
+ - balance: "Made changeling transformation string last between 10-15 minutes. Lowered the dna cost of changeling sting from 3 dna to 2 dna. Lowered the chemical cost from 50 to 10. Lowered the loudness from 2 to 1. Changeling sting transformation can be removed via high doses of calomel."
diff --git a/html/changelogs/AutoChangeLog-pr-8830.yml b/html/changelogs/AutoChangeLog-pr-8830.yml
new file mode 100644
index 0000000000..e4cb94374b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8830.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (original PRs by Kmc2000 and actioninja)"
+delete-after: True
+changes:
+ - rscadd: "Added darkmode! You can opt-in to this by clicking the new toggle darkmode button just beside the settings one."
+ - rscadd: "Byond members will now have a new setting for their Antag OOC color, instead of using their OOC one. (Antag OOC still locked under admin discretion though)"
+ - rscdel: "Default black'n'white windows style."
diff --git a/html/changelogs/AutoChangeLog-pr-8881.yml b/html/changelogs/AutoChangeLog-pr-8881.yml
new file mode 100644
index 0000000000..3599d4fa23
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8881.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixing baklava pies a bit."
diff --git a/html/changelogs/AutoChangeLog-pr-8898.yml b/html/changelogs/AutoChangeLog-pr-8898.yml
new file mode 100644
index 0000000000..e836d4225e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8898.yml
@@ -0,0 +1,4 @@
+author: "WhiteHusky"
+delete-after: True
+changes:
+ - tweak: "Checking yourself shouldn't freeze the client anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-8900.yml b/html/changelogs/AutoChangeLog-pr-8900.yml
new file mode 100644
index 0000000000..cbb910c3d5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8900.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - rscadd: "Abductor Replication Lab ruin and advanced tools"
diff --git a/html/changelogs/AutoChangeLog-pr-8906.yml b/html/changelogs/AutoChangeLog-pr-8906.yml
new file mode 100644
index 0000000000..c988071f3e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8906.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "Sweaters now cover groins too."
diff --git a/html/changelogs/AutoChangeLog-pr-8908.yml b/html/changelogs/AutoChangeLog-pr-8908.yml
new file mode 100644
index 0000000000..d9cbd5abed
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8908.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "Improved the zelus flask to be more viable for bottle smashing than the average barman's selection."
+ - code_imp: "Very slight bottle smashing code clean up, stupid const vars."
diff --git a/html/changelogs/AutoChangeLog-pr-8909.yml b/html/changelogs/AutoChangeLog-pr-8909.yml
new file mode 100644
index 0000000000..bfb1470f71
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8909.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes krav maga gloves, wizard spells knockdowns."
diff --git a/html/changelogs/AutoChangeLog-pr-8912.yml b/html/changelogs/AutoChangeLog-pr-8912.yml
new file mode 100644
index 0000000000..5d5a7c38fc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8912.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (original PRs by ShizCalev and bobbahbrown)"
+delete-after: True
+changes:
+ - rscadd: "Headsets now dynamically show in their description how to speak on any channels they can use when held or worn."
+ - code_imp: "Radio channels names and keys now use defines."
+ - tweak: "The head arrival announcement will now be broadcast to the supply for the quartermaster."
diff --git a/html/changelogs/AutoChangeLog-pr-8913.yml b/html/changelogs/AutoChangeLog-pr-8913.yml
new file mode 100644
index 0000000000..ccac6aef16
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8913.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Added new chairs"
diff --git a/html/changelogs/AutoChangeLog-pr-8915.yml b/html/changelogs/AutoChangeLog-pr-8915.yml
new file mode 100644
index 0000000000..5e3e0e77a9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8915.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "Added in an alert pop up to the cult convertees, on top of the older \"click here to become a blood cultist\" chat message."
+ - tweak: "The convertee's screen will now flash red to fit in the aforementioned message's fluff."
+ - spellcheck: "Made said message less verbose."
diff --git a/html/changelogs/AutoChangeLog-pr-8917.yml b/html/changelogs/AutoChangeLog-pr-8917.yml
new file mode 100644
index 0000000000..2b858cad47
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8917.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - bugfix: "Warp whistles no longer grant permanent invulnerability and invisibility"
diff --git a/html/changelogs/AutoChangeLog-pr-8920.yml b/html/changelogs/AutoChangeLog-pr-8920.yml
new file mode 100644
index 0000000000..6d3ae3ada4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8920.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "Towels. Crafted with 3 sheets of cloth, they can be worn on head, suit and belt slots even without uniform, or laid flat on the floor. Sprites from Baystation and Aurora Station."
+ - rscadd: "You can combat mode right click people while wielding rags and towels to pat out their flames (to no use for rags) or otherwise drying them out."
diff --git a/html/changelogs/AutoChangeLog-pr-8921.yml b/html/changelogs/AutoChangeLog-pr-8921.yml
new file mode 100644
index 0000000000..9c1c456f7f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8921.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - admin: "Bugtesting zone upgrades for easy bug/game testing"
diff --git a/html/changelogs/AutoChangeLog-pr-8922.yml b/html/changelogs/AutoChangeLog-pr-8922.yml
new file mode 100644
index 0000000000..1e641bd424
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8922.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Gamemode voting results are displayed at the end-round screen."
diff --git a/html/changelogs/AutoChangeLog-pr-8925.yml b/html/changelogs/AutoChangeLog-pr-8925.yml
new file mode 100644
index 0000000000..ddc90eba19
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8925.yml
@@ -0,0 +1,4 @@
+author: "BurgerLUA"
+delete-after: True
+changes:
+ - bugfix: "Fixed autolathe wires not correctly shocking you when pulsed."
diff --git a/html/changelogs/AutoChangeLog-pr-8926.yml b/html/changelogs/AutoChangeLog-pr-8926.yml
new file mode 100644
index 0000000000..762318ab21
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8926.yml
@@ -0,0 +1,4 @@
+author: "Fermis"
+delete-after: True
+changes:
+ - rscadd: "Added the secbat, a box to hold it and the ability to dispense it from the SecTech vendor."
diff --git a/html/changelogs/AutoChangeLog-pr-8927.yml b/html/changelogs/AutoChangeLog-pr-8927.yml
new file mode 100644
index 0000000000..3a87d7652e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8927.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "toned down the stamina costs of some of the bulkier weapons."
+ - code_imp: "repathed hypereutactic blades to be a subtype of dual sabers. Way less copypasta."
diff --git a/html/changelogs/AutoChangeLog-pr-8929.yml b/html/changelogs/AutoChangeLog-pr-8929.yml
new file mode 100644
index 0000000000..4fed45f1d0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8929.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixing CX Shredder guns not accepting standard flechette mags."
+ - bugfix: "Fixing missing magpistol magazines icon states."
diff --git a/html/changelogs/AutoChangeLog-pr-8931.yml b/html/changelogs/AutoChangeLog-pr-8931.yml
new file mode 100644
index 0000000000..2bde1025db
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8931.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "more cargo to cargo"
diff --git a/html/changelogs/AutoChangeLog-pr-8932.yml b/html/changelogs/AutoChangeLog-pr-8932.yml
new file mode 100644
index 0000000000..d9038ef1a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8932.yml
@@ -0,0 +1,7 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - rscadd: "Adds a gun range to Box Station"
+ - rscadd: "Provides some extra power grid connections"
+ - rscdel: "Sunglasses and Earmuffs removed from the Warden's Office - they can be found at the range instead"
+ - tweak: "Rearranges a few objects within the prison as to accommodate the new gun range"
diff --git a/html/changelogs/AutoChangeLog-pr-8933.yml b/html/changelogs/AutoChangeLog-pr-8933.yml
new file mode 100644
index 0000000000..09d318be08
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8933.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Cloning no longer gives you positive mutations, but a chance for a negative one. Cloning has a chance to \"scramble\" your visual DNA."
diff --git a/html/changelogs/AutoChangeLog-pr-8934.yml b/html/changelogs/AutoChangeLog-pr-8934.yml
new file mode 100644
index 0000000000..e86e47a45f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8934.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "More loadout gear"
diff --git a/html/changelogs/AutoChangeLog-pr-8939.yml b/html/changelogs/AutoChangeLog-pr-8939.yml
new file mode 100644
index 0000000000..6041d66721
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8939.yml
@@ -0,0 +1,9 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "The syndicate base's bathroom is now fitted with a shower, and a special towel."
+ - bugfix: "Fixed many issues with towels."
+ - tweak: "The dry people off with rags/towels action can only be done if the object is NOT moist with reagents now. Also cleans banana creaming."
+ - rscadd: "Towels deal more damage while soaked with reagents."
+ - rscadd: "You can now squeeze rags/towels with Alt-Click."
+ - rscdel: "deleted an old and crappier towel sprite that got in the way."
diff --git a/html/changelogs/AutoChangeLog-pr-8942.yml b/html/changelogs/AutoChangeLog-pr-8942.yml
new file mode 100644
index 0000000000..a1b80ba839
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8942.yml
@@ -0,0 +1,4 @@
+author: "Chayse"
+delete-after: True
+changes:
+ - tweak: "Changed the Warden's compact combat shotgun to instead be a regular combat shotgun with a foldable stock and penalties for being folded."
diff --git a/html/changelogs/AutoChangeLog-pr-8945.yml b/html/changelogs/AutoChangeLog-pr-8945.yml
new file mode 100644
index 0000000000..afa9bdaa95
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8945.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes Pubby's disposal conveyor belts and lack of a second lawyer spawner."
diff --git a/html/changelogs/AutoChangeLog-pr-8949.yml b/html/changelogs/AutoChangeLog-pr-8949.yml
new file mode 100644
index 0000000000..83560d74f2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8949.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "Poojawa power creep"
diff --git a/html/changelogs/AutoChangeLog-pr-8950.yml b/html/changelogs/AutoChangeLog-pr-8950.yml
new file mode 100644
index 0000000000..62b90d2407
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8950.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "Not my work not my credit"
diff --git a/html/changelogs/AutoChangeLog-pr-8952.yml b/html/changelogs/AutoChangeLog-pr-8952.yml
new file mode 100644
index 0000000000..df2ff22d09
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8952.yml
@@ -0,0 +1,4 @@
+author: "CdrCross"
+delete-after: True
+changes:
+ - rscadd: "Adds the ability for cloning consoles to read and write record lists to the circuit board, and provides a template for giving other machines local circuit board memory."
diff --git a/html/changelogs/AutoChangeLog-pr-8953.yml b/html/changelogs/AutoChangeLog-pr-8953.yml
new file mode 100644
index 0000000000..2128149556
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8953.yml
@@ -0,0 +1,5 @@
+author: "Toriate"
+delete-after: True
+changes:
+ - rscadd: "RPD now has inhands"
+ - imageadd: "New sprites for RCDs and RPDs, inhands included"
diff --git a/html/changelogs/AutoChangeLog-pr-8956.yml b/html/changelogs/AutoChangeLog-pr-8956.yml
new file mode 100644
index 0000000000..d6d33b3bd2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8956.yml
@@ -0,0 +1,4 @@
+author: "CameronWoof"
+delete-after: True
+changes:
+ - tweak: "Altered the icons for inventory backplates. Sleek! Stylish! New!"
diff --git a/html/changelogs/AutoChangeLog-pr-8958.yml b/html/changelogs/AutoChangeLog-pr-8958.yml
new file mode 100644
index 0000000000..a800b1b218
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8958.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Emitter gun"
diff --git a/html/changelogs/AutoChangeLog-pr-8959.yml b/html/changelogs/AutoChangeLog-pr-8959.yml
new file mode 100644
index 0000000000..87ca24462e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8959.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "suit storage nulling anti magic item protection"
diff --git a/html/changelogs/AutoChangeLog-pr-8964.yml b/html/changelogs/AutoChangeLog-pr-8964.yml
new file mode 100644
index 0000000000..6675fecc50
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8964.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "rebalanced steal goals restrictions"
+ - spellcheck: "fixed a few misleading goals"
diff --git a/html/changelogs/AutoChangeLog-pr-8965.yml b/html/changelogs/AutoChangeLog-pr-8965.yml
new file mode 100644
index 0000000000..138991e507
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8965.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "ports a fix"
diff --git a/html/changelogs/AutoChangeLog-pr-8966.yml b/html/changelogs/AutoChangeLog-pr-8966.yml
new file mode 100644
index 0000000000..2d63b8356e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8966.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - imageadd: "RCL now show what color is currently in use"
diff --git a/html/changelogs/AutoChangeLog-pr-8968.yml b/html/changelogs/AutoChangeLog-pr-8968.yml
new file mode 100644
index 0000000000..0a0b0e84d0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8968.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "oversight in benos"
diff --git a/html/changelogs/AutoChangeLog-pr-8970.yml b/html/changelogs/AutoChangeLog-pr-8970.yml
new file mode 100644
index 0000000000..304c9115dc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8970.yml
@@ -0,0 +1,6 @@
+author: "original by @randolfthemeh and @twaticus, port by sishen1542"
+delete-after: True
+changes:
+ - rscadd: "jumpskirts"
+ - rscadd: "more jumpskirts"
+ - rscadd: "jumpskirt/suit prefs"
diff --git a/html/changelogs/AutoChangeLog-pr-8971.yml b/html/changelogs/AutoChangeLog-pr-8971.yml
new file mode 100644
index 0000000000..c5b5215ff9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8971.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - tweak: "slime people now enjoy eating toxic food and it will not disgust them"
diff --git a/html/changelogs/AutoChangeLog-pr-8974.yml b/html/changelogs/AutoChangeLog-pr-8974.yml
new file mode 100644
index 0000000000..b71dc88ecd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8974.yml
@@ -0,0 +1,4 @@
+author: "EgoSumStultus"
+delete-after: True
+changes:
+ - bugfix: "Fixed blood chiller's inhand"
diff --git a/html/changelogs/AutoChangeLog-pr-8976.yml b/html/changelogs/AutoChangeLog-pr-8976.yml
new file mode 100644
index 0000000000..67e7bbc11a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8976.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "combat pushes will now properly stop targets from using firearms, and will disarm the firearm if performed a second time, and also slow down people by 15%, and won't push people on tables blocked by shutters or other dense object anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-8978.yml b/html/changelogs/AutoChangeLog-pr-8978.yml
new file mode 100644
index 0000000000..56e3760e9c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8978.yml
@@ -0,0 +1,4 @@
+author: "Yakumo Chen"
+delete-after: True
+changes:
+ - balance: "Made stealth implant boxes flimsier"
diff --git a/html/changelogs/AutoChangeLog-pr-8979.yml b/html/changelogs/AutoChangeLog-pr-8979.yml
new file mode 100644
index 0000000000..f826fcd681
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8979.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes CHECK_BITFIELD macro."
diff --git a/html/changelogs/AutoChangeLog-pr-8980.yml b/html/changelogs/AutoChangeLog-pr-8980.yml
new file mode 100644
index 0000000000..caba11ae69
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8980.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes hypovials being unable to transfer out liquids or be refilled by large dispensers like water tanks."
+ - bugfix: "Fixes chem-masters machineries not dispensing newly made pills inside loaded in pill bottles."
diff --git a/html/changelogs/AutoChangeLog-pr-8982.yml b/html/changelogs/AutoChangeLog-pr-8982.yml
new file mode 100644
index 0000000000..8599966d64
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8982.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (original PR by Skoglol)"
+delete-after: True
+changes:
+ - bugfix: "Mining bags will no longer drop ore into backpack."
+ - bugfix: "Mining bags in backpack no longer interferes with other mining bags."
+ - bugfix: "Fixes some storage size circumventions."
diff --git a/html/changelogs/AutoChangeLog-pr-8984.yml b/html/changelogs/AutoChangeLog-pr-8984.yml
new file mode 100644
index 0000000000..31c45cdbc6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8984.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "Stunswords now fit in the captain's sabre sheat."
diff --git a/html/changelogs/AutoChangeLog-pr-8985.yml b/html/changelogs/AutoChangeLog-pr-8985.yml
new file mode 100644
index 0000000000..37aaa4162d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8985.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "hos trenchcloak now properly has a sprite on digi characters"
diff --git a/html/changelogs/AutoChangeLog-pr-8986.yml b/html/changelogs/AutoChangeLog-pr-8986.yml
new file mode 100644
index 0000000000..810631f5f5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8986.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "reworked ninja's stealth mode. Increased invisibility, but engaging in combat, attacking or throwing things, bumping people will temporarily lower it."
+ - rscadd: "Ninja shoes are even stealthier."
+ - code_imp: "cleaned up some 2014 tier processing code horror."
diff --git a/html/changelogs/AutoChangeLog-pr-8988.yml b/html/changelogs/AutoChangeLog-pr-8988.yml
new file mode 100644
index 0000000000..9145d73c01
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8988.yml
@@ -0,0 +1,5 @@
+author: "kiwedespars"
+delete-after: True
+changes:
+ - rscadd: "regenerative materia to hallucination sting"
+ - rscadd: "mindbreaker toxin as an actual chemical to hallucination sting"
diff --git a/html/changelogs/AutoChangeLog-pr-8991.yml b/html/changelogs/AutoChangeLog-pr-8991.yml
new file mode 100644
index 0000000000..138991e507
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8991.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "ports a fix"
diff --git a/html/changelogs/AutoChangeLog-pr-8992.yml b/html/changelogs/AutoChangeLog-pr-8992.yml
new file mode 100644
index 0000000000..299792fee3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8992.yml
@@ -0,0 +1,5 @@
+author: "Chayse"
+delete-after: True
+changes:
+ - rscadd: "Assorted space-worthy helmets can now act as masks for internals."
+ - refactor: "Internals code can now check any item with the ALLOWSINTERNALS flag through the GET_INTERNAL_SLOTS define. For now this only checks head and mask slots, since those are the most realistically speaking usable ones."
diff --git a/html/changelogs/AutoChangeLog-pr-8994.yml b/html/changelogs/AutoChangeLog-pr-8994.yml
new file mode 100644
index 0000000000..a3a4fef0b7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8994.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "the oxyloss fullscreen overlays now also take in consideration 1/5 of the user stamina loss."
diff --git a/html/changelogs/AutoChangeLog-pr-8995.yml b/html/changelogs/AutoChangeLog-pr-8995.yml
new file mode 100644
index 0000000000..76669d7821
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8995.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "When you're jogging, you will only slip on water if you have more than 20% staminaloss, for real this time."
diff --git a/html/changelogs/AutoChangeLog-pr-8996.yml b/html/changelogs/AutoChangeLog-pr-8996.yml
new file mode 100644
index 0000000000..7c631e3301
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8996.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "Different cuffs now come with different worn overlays instead of a generic one."
diff --git a/html/changelogs/AutoChangeLog-pr-8998.yml b/html/changelogs/AutoChangeLog-pr-8998.yml
new file mode 100644
index 0000000000..981e746fc9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8998.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "High luminosity eyes can now be properly deactivated and won't illuminate your surroundings again until turned back on."
diff --git a/html/changelogs/AutoChangeLog-pr-8999.yml b/html/changelogs/AutoChangeLog-pr-8999.yml
new file mode 100644
index 0000000000..182e3a8409
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8999.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Chestbursters no longer give and remove your brain. They just disembowel and kill you now."
diff --git a/html/changelogs/AutoChangeLog-pr-9000.yml b/html/changelogs/AutoChangeLog-pr-9000.yml
new file mode 100644
index 0000000000..3fa3e8946f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9000.yml
@@ -0,0 +1,4 @@
+author: "EgoSumStultus"
+delete-after: True
+changes:
+ - bugfix: "FIXED SHIELF"
diff --git a/html/changelogs/AutoChangeLog-pr-9001.yml b/html/changelogs/AutoChangeLog-pr-9001.yml
new file mode 100644
index 0000000000..be2fd2b833
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9001.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - rscdel: "duplicate definition of hos and sec skirts"
diff --git a/html/changelogs/AutoChangeLog-pr-9005.yml b/html/changelogs/AutoChangeLog-pr-9005.yml
new file mode 100644
index 0000000000..d65017a00d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9005.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "QM rooms not getting Key Aunths"
diff --git a/html/changelogs/AutoChangeLog-pr-9008.yml b/html/changelogs/AutoChangeLog-pr-9008.yml
new file mode 100644
index 0000000000..0c73bc8ae9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9008.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "Krav Maga leg sweep now works properly."
diff --git a/html/changelogs/AutoChangeLog-pr-9009.yml b/html/changelogs/AutoChangeLog-pr-9009.yml
new file mode 100644
index 0000000000..21cf0c8d85
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9009.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - bugfix: "Fixes WarOps miscalculating players."
diff --git a/html/changelogs/AutoChangeLog-pr-9010.yml b/html/changelogs/AutoChangeLog-pr-9010.yml
new file mode 100644
index 0000000000..52aed38e2c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9010.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Activating the nuclear device during war-ops informs the crew of the nuke's position."
diff --git a/html/changelogs/AutoChangeLog-pr-9014.yml b/html/changelogs/AutoChangeLog-pr-9014.yml
new file mode 100644
index 0000000000..f217b64afd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9014.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes freshly cloned people starting with undershirts. Fixes random characters possibly rolling with undergarments of the opposite gender (Doesn't affect preferences' freedom of choice)."
diff --git a/html/changelogs/AutoChangeLog-pr-9018.yml b/html/changelogs/AutoChangeLog-pr-9018.yml
new file mode 100644
index 0000000000..7acb63b426
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9018.yml
@@ -0,0 +1,12 @@
+author: "Ghommie (original PRs by XDTM, optimumtact, Nichlas0010 and monster860)"
+delete-after: True
+changes:
+ - rscadd: "Added Quantum Keycards, devices that can link to a quantum pad, and can be used on any other quantum pad to teleport to its linked pad.
+spellchecking: Renamed \"Bluespace Teleportation Tech\" tech node to \"Bluespace Travel\"."
+ - tweak: "Moved roasting sticks from the \"Bluespace Travel\" to \"Practical Bluespace\"."
+ - rscadd: "Spraying holy water on tiles will now prevent cult-based teleportation from using them as a destination point."
+ - tweak: "Quantum, wormhole and magic teleportation is no longer disrupted by bags of holding."
+ - bugfix: "You are now also blocked from teleporting IN to no-teleport areas, not just out of them."
+ - tweak: "Quantum teleportation now makes pretty rainbow sparks instead of the normal ones."
+ - bugfix: "Non-bluespace teleportation (spells etc.) no longer makes sparks."
+ - bugfix: "Fixed teleportation deleting mob spawners like golem shells and ashwalker eggs."
diff --git a/html/changelogs/AutoChangeLog-pr-9019.yml b/html/changelogs/AutoChangeLog-pr-9019.yml
new file mode 100644
index 0000000000..8006c134e3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9019.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "MRE menu 3 has cuban nachos instead of a chili now."
+ - bugfix: "Removed the illustration overlay from MREs, looks pretty weird otherwise."
+ - rscadd: "MRE menu 4, vegetarian."
diff --git a/html/changelogs/AutoChangeLog-pr-9021.yml b/html/changelogs/AutoChangeLog-pr-9021.yml
new file mode 100644
index 0000000000..e8809f1d7e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9021.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (by Floyd / Qustinnus, Arathian)"
+delete-after: True
+changes:
+ - rscadd: "The robotocist now has robe to show his love for toasters"
diff --git a/html/changelogs/AutoChangeLog-pr-9022.yml b/html/changelogs/AutoChangeLog-pr-9022.yml
new file mode 100644
index 0000000000..4fb48506e4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9022.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (by nemvar)"
+delete-after: True
+changes:
+ - tweak: "Dwarfs are now more robust."
diff --git a/html/changelogs/AutoChangeLog-pr-9024.yml b/html/changelogs/AutoChangeLog-pr-9024.yml
new file mode 100644
index 0000000000..1d75959c79
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9024.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (by Arkatos)"
+delete-after: True
+changes:
+ - bugfix: "Fixed an issue with a Lizardwine drink crafting, where a final product would contain unwated 100u of Ethanol."
diff --git a/html/changelogs/AutoChangeLog-pr-9026.yml b/html/changelogs/AutoChangeLog-pr-9026.yml
new file mode 100644
index 0000000000..bf8ce9efbe
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9026.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "The alert level is displayed at the job selection screen."
diff --git a/html/changelogs/AutoChangeLog-pr-9030.yml b/html/changelogs/AutoChangeLog-pr-9030.yml
new file mode 100644
index 0000000000..94c797433a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9030.yml
@@ -0,0 +1,4 @@
+author: "CameronWoof"
+delete-after: True
+changes:
+ - bugfix: "Attaching a beaker that contains water to an IV stand no longer causes a visual glitch"
diff --git a/html/changelogs/AutoChangeLog-pr-9033.yml b/html/changelogs/AutoChangeLog-pr-9033.yml
new file mode 100644
index 0000000000..3e69bc9486
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9033.yml
@@ -0,0 +1,4 @@
+author: "EgoSumStultus"
+delete-after: True
+changes:
+ - bugfix: "fixed magpistol magazine sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-9036.yml b/html/changelogs/AutoChangeLog-pr-9036.yml
new file mode 100644
index 0000000000..afd2882fc3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9036.yml
@@ -0,0 +1,5 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - rscadd: "shoes can have a different icon used for their item and mob icons"
+ - bugfix: "combat gloves plus having no mob icon"
diff --git a/html/changelogs/AutoChangeLog-pr-9040.yml b/html/changelogs/AutoChangeLog-pr-9040.yml
new file mode 100644
index 0000000000..33958a2ece
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9040.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "new books/cooking"
diff --git a/html/changelogs/AutoChangeLog-pr-9042.yml b/html/changelogs/AutoChangeLog-pr-9042.yml
new file mode 100644
index 0000000000..38c4006383
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9042.yml
@@ -0,0 +1,4 @@
+author: "EgoSumStultus"
+delete-after: True
+changes:
+ - rscadd: "Added the Femur Breaker"
diff --git a/html/changelogs/AutoChangeLog-pr-9043.yml b/html/changelogs/AutoChangeLog-pr-9043.yml
new file mode 100644
index 0000000000..14c9331e5b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9043.yml
@@ -0,0 +1,7 @@
+author: "chef"
+delete-after: True
+changes:
+ - rscadd: "Added main hallway approach to monastery"
+ - rscadd: "Added Maintenance hallway approach, with some maint loot"
+ - tweak: "moved the docking arm for the white ship"
+ - tweak: "changed placement of some grills and windows"
diff --git a/html/changelogs/AutoChangeLog-pr-9044.yml b/html/changelogs/AutoChangeLog-pr-9044.yml
new file mode 100644
index 0000000000..6133ea45e9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9044.yml
@@ -0,0 +1,7 @@
+author: "Original by Citinited, port by Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "You can now use an airlock electronics on a locker to add a lock, and can screwdriver an unlocked locker to remove its lock."
+ - rscadd: "You can now remove the locks on broken or emagged lockers."
+ - tweak: "Removing the lock from a personal locker now wipes that locker's ID details."
+ - tweak: "Broken lockers have had their appearance changed."
diff --git a/html/changelogs/AutoChangeLog-pr-9045.yml b/html/changelogs/AutoChangeLog-pr-9045.yml
new file mode 100644
index 0000000000..8917707ae3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9045.yml
@@ -0,0 +1,8 @@
+author: "CameronWoof"
+delete-after: True
+changes:
+ - tweak: "Fluid-producing sexual organs no longer start full"
+ - tweak: "Sexual organ fluid capacity decreased from 50 to 15"
+ - tweak: "Sexual organ production rate decreased from 5u to 0.035u per two seconds."
+ - tweak: "Sexual fluid decals no longer contain reagents"
+ - tweak: "Sexual fluids cannot by synthesized (e.g., by the Odysseus)"
diff --git a/html/changelogs/AutoChangeLog-pr-9046.yml b/html/changelogs/AutoChangeLog-pr-9046.yml
new file mode 100644
index 0000000000..24e7035a88
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9046.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - tweak: "density = 0"
diff --git a/html/changelogs/AutoChangeLog-pr-9050.yml b/html/changelogs/AutoChangeLog-pr-9050.yml
new file mode 100644
index 0000000000..3b12a12f17
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9050.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixes a few bad touchs on combat mode pushing."
diff --git a/html/changelogs/AutoChangeLog-pr-9052.yml b/html/changelogs/AutoChangeLog-pr-9052.yml
new file mode 100644
index 0000000000..a75b6c51ae
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9052.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "Hierophant now goes sicko mode, but hey, at least you can't be multi-hit by melee waves!"
diff --git a/html/changelogs/AutoChangeLog-pr-9054.yml b/html/changelogs/AutoChangeLog-pr-9054.yml
new file mode 100644
index 0000000000..5952c9ecfd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9054.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "hugboxing mining loot"
diff --git a/html/changelogs/AutoChangeLog-pr-9057.yml b/html/changelogs/AutoChangeLog-pr-9057.yml
new file mode 100644
index 0000000000..4df1b23ca7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9057.yml
@@ -0,0 +1,4 @@
+author: "EgoSumStultus"
+delete-after: True
+changes:
+ - rscadd: "Adds male AI vox."
diff --git a/html/changelogs/AutoChangeLog-pr-9061.yml b/html/changelogs/AutoChangeLog-pr-9061.yml
new file mode 100644
index 0000000000..4fc9d10ba5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9061.yml
@@ -0,0 +1,5 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - tweak: "The femur breaker now uses `*scream` instead of forced speech. This means that the femur breaker will no longer spam deadchat with \"AAAAAAAAAHHHHHHHHHH!!\""
+ - tweak: "The femur breaker will now guarantee that the victim falls into crit, which will make it harder to perform torture scenes with it since the victim can just succumb."
diff --git a/html/changelogs/AutoChangeLog-pr-9062.yml b/html/changelogs/AutoChangeLog-pr-9062.yml
new file mode 100644
index 0000000000..12102204c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9062.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - spellcheck: "less bad wording in slime"
diff --git a/html/changelogs/AutoChangeLog-pr-9064.yml b/html/changelogs/AutoChangeLog-pr-9064.yml
new file mode 100644
index 0000000000..6e775c1eb4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9064.yml
@@ -0,0 +1,4 @@
+author: "Cebutris"
+delete-after: True
+changes:
+ - rscadd: "Hugs of the North Star! Get them from the arcades (if you're lucky) and hug your friends at INCREDIBLE hihg speeds!"
diff --git a/html/changelogs/AutoChangeLog-pr-9069.yml b/html/changelogs/AutoChangeLog-pr-9069.yml
new file mode 100644
index 0000000000..0439515dd3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9069.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes clock cult Abscond scripture not dragging pulled mobs into Reebe. Also fixes blood cult tele runes teleporting you from the source turf to the source turf."
diff --git a/html/changelogs/AutoChangeLog-pr-9070.yml b/html/changelogs/AutoChangeLog-pr-9070.yml
new file mode 100644
index 0000000000..2013550dd2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9070.yml
@@ -0,0 +1,5 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - rscadd: "inhands sprite for rainbow knife"
+ - tweak: "colour of highlight on the regular knife when held in the right hand"
diff --git a/html/changelogs/AutoChangeLog-pr-9071.yml b/html/changelogs/AutoChangeLog-pr-9071.yml
new file mode 100644
index 0000000000..40ae43867f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9071.yml
@@ -0,0 +1,4 @@
+author: "Yakumo Chen"
+delete-after: True
+changes:
+ - balance: "Autocloning now requires tier 4 parts"
diff --git a/html/changelogs/AutoChangeLog-pr-9078.yml b/html/changelogs/AutoChangeLog-pr-9078.yml
new file mode 100644
index 0000000000..2e202ec43a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9078.yml
@@ -0,0 +1,7 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - rscdel: "Removed racism"
+ - tweak: "Teleporter calibration actually matters to all roundstart players"
+ - balance: "Slows down teleportation with the console/hub/teleporter setup if you care for your species."
+ - balance: "Dedicated non-humans can now get hulk without having to become human."
diff --git a/html/changelogs/AutoChangeLog-pr-9079.yml b/html/changelogs/AutoChangeLog-pr-9079.yml
new file mode 100644
index 0000000000..42aa732e16
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9079.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "ling blade now has 40 armor pen"
diff --git a/html/changelogs/AutoChangeLog-pr-9080.yml b/html/changelogs/AutoChangeLog-pr-9080.yml
new file mode 100644
index 0000000000..1ae1e3e2aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9080.yml
@@ -0,0 +1,4 @@
+author: "Fermis"
+delete-after: True
+changes:
+ - rscadd: "Adds 3 new music tracks."
diff --git a/html/changelogs/AutoChangeLog-pr-9081.yml b/html/changelogs/AutoChangeLog-pr-9081.yml
new file mode 100644
index 0000000000..c66148e446
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9081.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - balance: "Central Command informs you when a Meteor Storm is about to hit 5 to 10 minutes before it happens."
diff --git a/html/changelogs/AutoChangeLog-pr-9083.yml b/html/changelogs/AutoChangeLog-pr-9083.yml
new file mode 100644
index 0000000000..74b4d95ca3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9083.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "strawbarries and such"
diff --git a/html/changelogs/AutoChangeLog-pr-9084.yml b/html/changelogs/AutoChangeLog-pr-9084.yml
new file mode 100644
index 0000000000..c2569d10b4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9084.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixes clock cult mass recall."
diff --git a/html/changelogs/AutoChangeLog-pr-9085.yml b/html/changelogs/AutoChangeLog-pr-9085.yml
new file mode 100644
index 0000000000..92f5dc4cf8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9085.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes underwear colors a bit."
diff --git a/html/changelogs/AutoChangeLog-pr-9097.yml b/html/changelogs/AutoChangeLog-pr-9097.yml
new file mode 100644
index 0000000000..941c0e7b98
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9097.yml
@@ -0,0 +1,4 @@
+author: "lolman360"
+delete-after: True
+changes:
+ - rscadd: "NT has authorized shipments or Cotton to Megaseed Servitors. It's time to start picking, liggers."
diff --git a/html/changelogs/AutoChangeLog-pr-9098.yml b/html/changelogs/AutoChangeLog-pr-9098.yml
new file mode 100644
index 0000000000..6e11eaeb90
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9098.yml
@@ -0,0 +1,4 @@
+author: "Cebutris"
+delete-after: True
+changes:
+ - bugfix: "Tea Aspera now properly contains tea powder"
diff --git a/html/changelogs/AutoChangeLog-pr-9100.yml b/html/changelogs/AutoChangeLog-pr-9100.yml
new file mode 100644
index 0000000000..81141b3b0c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9100.yml
@@ -0,0 +1,4 @@
+author: "Cebutris"
+delete-after: True
+changes:
+ - tweak: "Breasts no longer lactate by default, lactation is now a preference"
diff --git a/html/changelogs/AutoChangeLog-pr-9101.yml b/html/changelogs/AutoChangeLog-pr-9101.yml
new file mode 100644
index 0000000000..174619dd49
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9101.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542, original by XDTM"
+delete-after: True
+changes:
+ - rscadd: "Surgery steps are now shown in detail only to the surgeon and anyone standing adjacent to them; the patient and people watching from further away get a more vague/ambiguous description."
diff --git a/html/changelogs/AutoChangeLog-pr-9107.yml b/html/changelogs/AutoChangeLog-pr-9107.yml
new file mode 100644
index 0000000000..65a14b9576
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9107.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - bugfix: "You can now actually use the resist hotkey to resist out of handcuffs. Woah, revolutionary"
diff --git a/html/changelogs/AutoChangeLog-pr-9113.yml b/html/changelogs/AutoChangeLog-pr-9113.yml
new file mode 100644
index 0000000000..1bdae7cab9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9113.yml
@@ -0,0 +1,5 @@
+author: "Fermis"
+delete-after: True
+changes:
+ - bugfix: "fixes fermichem reactions for tiny volumes work"
+ - tweak: "makes quantisation level for chemistry finer"
diff --git a/html/changelogs/AutoChangeLog-pr-9115.yml b/html/changelogs/AutoChangeLog-pr-9115.yml
new file mode 100644
index 0000000000..32c3109c43
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9115.yml
@@ -0,0 +1,4 @@
+author: "Thalpy"
+delete-after: True
+changes:
+ - bugfix: "fixes message_admins in SDZF"
diff --git a/html/changelogs/AutoChangeLog-pr-9119.yml b/html/changelogs/AutoChangeLog-pr-9119.yml
new file mode 100644
index 0000000000..756c3edcb2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9119.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - rscadd: "mining shuttle console can now be printed after computer consoles have been researched"
diff --git a/html/changelogs/AutoChangeLog-pr-9126.yml b/html/changelogs/AutoChangeLog-pr-9126.yml
new file mode 100644
index 0000000000..c3e54a8f2d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9126.yml
@@ -0,0 +1,4 @@
+author: "original by Skoglol, port by sishen1542"
+delete-after: True
+changes:
+ - balance: "Added lots of new virus cures, made cure difficulty scale more consistently. Cures are now picked from a list of possible cures per resistance level, multiple diseases at the same level no longer always share a cure. Looking at you table salt."
diff --git a/html/changelogs/AutoChangeLog-pr-9130.yml b/html/changelogs/AutoChangeLog-pr-9130.yml
new file mode 100644
index 0000000000..f10e72a6ce
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9130.yml
@@ -0,0 +1,9 @@
+author: "Owai-Seek"
+delete-after: True
+changes:
+ - rscadd: "custodial cruiser cargo crate"
+ - tweak: "removed light replacer from power designs and moved to misc designs"
+ - tweak: "added pimpin ride to custodial locator"
+ - tweak: "added additional items to janibelt whitelist"
+ - tweak: "made plant DNA manipulator unwrenchable"
+ - balance: "reduced janitor premium supply costs"
diff --git a/html/changelogs/AutoChangeLog-pr-9132.yml b/html/changelogs/AutoChangeLog-pr-9132.yml
new file mode 100644
index 0000000000..f9dee17687
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9132.yml
@@ -0,0 +1,4 @@
+author: "Toriate"
+delete-after: True
+changes:
+ - imageadd: "Updated the sprites of all the regular crates"
diff --git a/html/changelogs/AutoChangeLog-pr-9133.yml b/html/changelogs/AutoChangeLog-pr-9133.yml
new file mode 100644
index 0000000000..50bfced879
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9133.yml
@@ -0,0 +1,4 @@
+author: "Raptorizer"
+delete-after: True
+changes:
+ - tweak: "Doubled peach spawn rate"
diff --git a/html/changelogs/AutoChangeLog-pr-9134.yml b/html/changelogs/AutoChangeLog-pr-9134.yml
new file mode 100644
index 0000000000..f0be3bdd0a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9134.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - tweak: "Advanced toxin filtration nanites now heal slimes"
diff --git a/html/changelogs/AutoChangeLog-pr-9136.yml b/html/changelogs/AutoChangeLog-pr-9136.yml
new file mode 100644
index 0000000000..7bb9e3ccf2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9136.yml
@@ -0,0 +1,4 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "rebalances strained muscles"
diff --git a/html/changelogs/AutoChangeLog-pr-9137.yml b/html/changelogs/AutoChangeLog-pr-9137.yml
new file mode 100644
index 0000000000..a61a3dbe6f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9137.yml
@@ -0,0 +1,5 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "added in the assistant response team"
+ - bugfix: "fixed up access on the centcom hangar button"
diff --git a/html/changelogs/AutoChangeLog-pr-9138.yml b/html/changelogs/AutoChangeLog-pr-9138.yml
new file mode 100644
index 0000000000..b78d505c5a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9138.yml
@@ -0,0 +1,4 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - bugfix: "seed"
diff --git a/html/changelogs/AutoChangeLog-pr-9141.yml b/html/changelogs/AutoChangeLog-pr-9141.yml
new file mode 100644
index 0000000000..86230537de
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9141.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Fixed another runtime in warp whistles."
diff --git a/html/changelogs/AutoChangeLog-pr-9142.yml b/html/changelogs/AutoChangeLog-pr-9142.yml
new file mode 100644
index 0000000000..75fbfe4155
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9142.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "glue uplinks"
diff --git a/html/changelogs/AutoChangeLog-pr-9145.yml b/html/changelogs/AutoChangeLog-pr-9145.yml
new file mode 100644
index 0000000000..27e5712dd0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9145.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "RPDs to drones"
diff --git a/html/changelogs/AutoChangeLog-pr-9149.yml b/html/changelogs/AutoChangeLog-pr-9149.yml
new file mode 100644
index 0000000000..8a10035d1f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9149.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Armor and such"
diff --git a/html/changelogs/AutoChangeLog-pr-9150.yml b/html/changelogs/AutoChangeLog-pr-9150.yml
new file mode 100644
index 0000000000..585ea0a149
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9150.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "flavor"
+ - bugfix: "maybe a runtime"
diff --git a/html/changelogs/AutoChangeLog-pr-9151.yml b/html/changelogs/AutoChangeLog-pr-9151.yml
new file mode 100644
index 0000000000..ed01c0d137
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9151.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "chameloen clothing"
diff --git a/html/changelogs/AutoChangeLog-pr-9155.yml b/html/changelogs/AutoChangeLog-pr-9155.yml
new file mode 100644
index 0000000000..ad16ff6276
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9155.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - server: "Poly's speech now echos to the chat bot."
diff --git a/html/changelogs/AutoChangeLog-pr-9162.yml b/html/changelogs/AutoChangeLog-pr-9162.yml
new file mode 100644
index 0000000000..a415ce8bbc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9162.yml
@@ -0,0 +1,5 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - balance: "storage tweaks for belt briefcase"
+ - imageadd: "codersprite for belt briefcase"
diff --git a/html/changelogs/AutoChangeLog-pr-9164.yml b/html/changelogs/AutoChangeLog-pr-9164.yml
new file mode 100644
index 0000000000..08d7ccec18
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9164.yml
@@ -0,0 +1,4 @@
+author: "lolman360"
+delete-after: True
+changes:
+ - imageadd: "missing durathread sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-9168.yml b/html/changelogs/AutoChangeLog-pr-9168.yml
new file mode 100644
index 0000000000..2375f6a28a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9168.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - rscadd: "Added looc hotkey"
diff --git a/html/changelogs/AutoChangeLog-pr-9169.yml b/html/changelogs/AutoChangeLog-pr-9169.yml
new file mode 100644
index 0000000000..2a9d3ae34b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9169.yml
@@ -0,0 +1,8 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - rscadd: "Adds a mass driver to Delta Station's chapel"
+ - rscadd: "Adds a second means of entry into the chapel"
+ - tweak: "Slightly expands the chapel to make room for the driver, slight adjustment to air systems"
+ - tweak: "Clears a path in the station exterior for the mass driver to work properly"
+ - tweak: "Nearby maintenance loot has been relocated to accommodate the chapel expansion, surrounding area has been \"cleaned up\" somewhat"
diff --git a/html/changelogs/AutoChangeLog-pr-9172.yml b/html/changelogs/AutoChangeLog-pr-9172.yml
new file mode 100644
index 0000000000..751cfa6d26
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9172.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "Racking shotguns is now more threatening."
diff --git a/html/changelogs/AutoChangeLog-pr-9175.yml b/html/changelogs/AutoChangeLog-pr-9175.yml
new file mode 100644
index 0000000000..d3aa92d42d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9175.yml
@@ -0,0 +1,5 @@
+author: "lolman360"
+delete-after: True
+changes:
+ - rscadd: "Added durathread jumpskirt"
+ - imageadd: "Duraskirt sprites and rolled down jumpsuit sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-9177.yml b/html/changelogs/AutoChangeLog-pr-9177.yml
new file mode 100644
index 0000000000..4b8a06c8af
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9177.yml
@@ -0,0 +1,5 @@
+author: "JTGSZ"
+delete-after: True
+changes:
+ - tweak: "Added one more gang boss slot bringing total to 4 from 3"
+ - bugfix: "Fixed Gang Boss being able to be deconverted"
diff --git a/html/changelogs/AutoChangeLog-pr-9178.yml b/html/changelogs/AutoChangeLog-pr-9178.yml
new file mode 100644
index 0000000000..2a6de13f5e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9178.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - bugfix: "the `!tgs poly` command now actually works"
diff --git a/html/changelogs/AutoChangeLog-pr-9180.yml b/html/changelogs/AutoChangeLog-pr-9180.yml
new file mode 100644
index 0000000000..e184ad3205
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9180.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - rscadd: "Poly now has a 0.01% chance per squawk to speak through the TGS relay."
diff --git a/html/changelogs/AutoChangeLog-pr-9183.yml b/html/changelogs/AutoChangeLog-pr-9183.yml
new file mode 100644
index 0000000000..dc5b5a8bdb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9183.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes Blood Cult conversion prompts"
diff --git a/html/changelogs/AutoChangeLog-pr-9184.yml b/html/changelogs/AutoChangeLog-pr-9184.yml
new file mode 100644
index 0000000000..d0b4d1fa7e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9184.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscdel: "Removes an obnoxious temporary overlay var."
diff --git a/html/changelogs/AutoChangeLog-pr-9186.yml b/html/changelogs/AutoChangeLog-pr-9186.yml
new file mode 100644
index 0000000000..f0497ee7c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9186.yml
@@ -0,0 +1,5 @@
+author: "Sishen1542"
+delete-after: True
+changes:
+ - rscadd: "added pharaoh gear to chaplain vendor"
+ - spellcheck: "fixed typos in pharaoh items"
diff --git a/html/changelogs/AutoChangeLog-pr-9194.yml b/html/changelogs/AutoChangeLog-pr-9194.yml
new file mode 100644
index 0000000000..24299209ea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9194.yml
@@ -0,0 +1,4 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - tweak: "added obj/item/key to wallet whitelist"
diff --git a/html/changelogs/AutoChangeLog-pr-9200.yml b/html/changelogs/AutoChangeLog-pr-9200.yml
new file mode 100644
index 0000000000..d1be09ee4a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9200.yml
@@ -0,0 +1,4 @@
+author: "Owai-Seek"
+delete-after: True
+changes:
+ - bugfix: "fixed them strawberries"
diff --git a/html/changelogs/AutoChangeLog-pr-9204.yml b/html/changelogs/AutoChangeLog-pr-9204.yml
new file mode 100644
index 0000000000..3b70354fd9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9204.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "/cursed from a item path"
diff --git a/html/changelogs/AutoChangeLog-pr-9208.yml b/html/changelogs/AutoChangeLog-pr-9208.yml
new file mode 100644
index 0000000000..1645164266
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9208.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "colorable socks can be colored again."
diff --git a/html/changelogs/AutoChangeLog-pr-9209.yml b/html/changelogs/AutoChangeLog-pr-9209.yml
new file mode 100644
index 0000000000..5ed81d6856
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9209.yml
@@ -0,0 +1,4 @@
+author: "original by redmoogle, port by sishen1542"
+delete-after: True
+changes:
+ - rscadd: "Added support for 3 new gasses; Tritium, Pluoxium, and BZ"
diff --git a/html/changelogs/AutoChangeLog-pr-9210.yml b/html/changelogs/AutoChangeLog-pr-9210.yml
new file mode 100644
index 0000000000..b02811e7a8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9210.yml
@@ -0,0 +1,7 @@
+author: "EmeraldSundisk"
+delete-after: True
+changes:
+ - tweak: "CentCom has noticed the lack of coffins in Delta Station's chapel and provided some, but in exchange for reducing the chapel morgue's capacity."
+ - tweak: "Fixed a maintenance door the chaplain should have been able to open."
+ - bugfix: "Fixes space areas outside the driver
+removal: CentCom Defense Analysts have ordered the maintenance hatch to the Mass Driver room be removed citing \"security concerns\"."
diff --git a/html/changelogs/AutoChangeLog-pr-9212.yml b/html/changelogs/AutoChangeLog-pr-9212.yml
new file mode 100644
index 0000000000..48e8b8b4d3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9212.yml
@@ -0,0 +1,5 @@
+author: "dapnee"
+delete-after: True
+changes:
+ - rscadd: "Plasmaglass tables, spears, tiny plasmaglass shards"
+ - bugfix: "Plasmaglass structures now drop plasmaglass shards instead of nothing"
diff --git a/html/changelogs/AutoChangeLog-pr-9216.yml b/html/changelogs/AutoChangeLog-pr-9216.yml
new file mode 100644
index 0000000000..0be9314dbc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9216.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "oops not being blacklisted"
diff --git a/html/changelogs/AutoChangeLog-pr-9219.yml b/html/changelogs/AutoChangeLog-pr-9219.yml
new file mode 100644
index 0000000000..138991e507
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9219.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "ports a fix"
diff --git a/html/changelogs/AutoChangeLog-pr-9227.yml b/html/changelogs/AutoChangeLog-pr-9227.yml
new file mode 100644
index 0000000000..9f6bfabdc4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9227.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "Missing sprites with bad ones"
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 29086033c8..e13ce10347 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mecha/mecha_mouse-disable.dmi b/icons/mecha/mecha_mouse-disable.dmi
new file mode 100644
index 0000000000..48924c58c2
Binary files /dev/null and b/icons/mecha/mecha_mouse-disable.dmi differ
diff --git a/icons/member_content.dmi b/icons/member_content.dmi
index bb59764627..7744371119 100644
Binary files a/icons/member_content.dmi and b/icons/member_content.dmi differ
diff --git a/icons/mob/accessories.dmi b/icons/mob/accessories.dmi
index 8e3e48230f..68f13c8875 100644
Binary files a/icons/mob/accessories.dmi and b/icons/mob/accessories.dmi differ
diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi
index c50351eef3..21238366f1 100644
Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ
diff --git a/icons/mob/alienqueen.dmi b/icons/mob/alienqueen.dmi
index 115bd17cb0..1176f43edd 100644
Binary files a/icons/mob/alienqueen.dmi and b/icons/mob/alienqueen.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index c98ca98c42..2a85f8a422 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index e3c80708c3..b22f50623c 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 02fdc52b45..6843bac6bf 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi
index d974d0ca6c..1b917d9434 100644
Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index aad4718cbd..6cce82b5f7 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 09d6fe5374..09bfd9e0a2 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi
index 0e466486c5..3238b98757 100644
Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi
index 1c265a4137..a103c1a13f 100644
Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi
index 366493eebd..beac56725a 100644
Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi
index 81b075f706..da31cc9710 100644
Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/briefcase_lefthand.dmi b/icons/mob/inhands/equipment/briefcase_lefthand.dmi
index 08bc3814b0..38aaa98254 100644
Binary files a/icons/mob/inhands/equipment/briefcase_lefthand.dmi and b/icons/mob/inhands/equipment/briefcase_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/briefcase_righthand.dmi b/icons/mob/inhands/equipment/briefcase_righthand.dmi
index 5cc42559cd..fbcea4580e 100644
Binary files a/icons/mob/inhands/equipment/briefcase_righthand.dmi and b/icons/mob/inhands/equipment/briefcase_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi
index 277a7d8f05..93cd988cff 100644
Binary files a/icons/mob/inhands/equipment/kitchen_lefthand.dmi and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi
index 0103bd19b5..075b4c2033 100644
Binary files a/icons/mob/inhands/equipment/kitchen_righthand.dmi and b/icons/mob/inhands/equipment/kitchen_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/security_lefthand.dmi b/icons/mob/inhands/equipment/security_lefthand.dmi
index 6ccdfba3fc..01f8e2ca27 100644
Binary files a/icons/mob/inhands/equipment/security_lefthand.dmi and b/icons/mob/inhands/equipment/security_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/security_righthand.dmi b/icons/mob/inhands/equipment/security_righthand.dmi
index e3f930a13e..d2126fe22f 100644
Binary files a/icons/mob/inhands/equipment/security_righthand.dmi and b/icons/mob/inhands/equipment/security_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi
index 5b497afe53..72b994328d 100644
Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi
index dbed4c43d2..ef1001c438 100644
Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index f1b125eb20..71c453856a 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 7ef316be17..0ca09ad810 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi
index f6ac6ca499..8978d17237 100644
Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi
index 504121feba..3f8a876d43 100644
Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_lefthand.dmi b/icons/mob/inhands/weapons/polearms_lefthand.dmi
index 5529edfa51..5e04b3daa3 100644
Binary files a/icons/mob/inhands/weapons/polearms_lefthand.dmi and b/icons/mob/inhands/weapons/polearms_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_righthand.dmi b/icons/mob/inhands/weapons/polearms_righthand.dmi
index e902dcdc3b..4b304cfc3e 100644
Binary files a/icons/mob/inhands/weapons/polearms_righthand.dmi and b/icons/mob/inhands/weapons/polearms_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi
index ecc92c7d20..8b96b84236 100644
Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi
index 92e5b91323..202bab9e21 100644
Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 5f0b665ff4..019ae09517 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 1649706279..9beedfb417 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/restraints.dmi b/icons/mob/restraints.dmi
new file mode 100644
index 0000000000..fa7eb43aa3
Binary files /dev/null and b/icons/mob/restraints.dmi differ
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 756dcfa981..3cd7388378 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 42c32f134a..740ad43d42 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 3d281606de..f783331c19 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/advancedtools.dmi b/icons/obj/advancedtools.dmi
new file mode 100644
index 0000000000..974202dd58
Binary files /dev/null and b/icons/obj/advancedtools.dmi differ
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index 3754ff052c..9e8fb64aba 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi
index c35956687d..c62a88c829 100644
Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index d7bf32d7b1..717937c034 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/belts.dm b/icons/obj/clothing/belts.dm
deleted file mode 100644
index 34c716f5d8..0000000000
Binary files a/icons/obj/clothing/belts.dm and /dev/null differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 34c716f5d8..e329720cf7 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index e7bec8dbe4..2cdf97bd37 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index a8ec22c950..e151808cb1 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index a0153b1596..4ec45666c4 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 568adb69b3..dc5fa1399d 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 3e3a1cefcb..40844c9a29 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index 4165719a3c..3ab7f4b510 100644
Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index eb4f5813c8..601e32fb63 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 55c33e5e83..032b0c27ad 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/femur_breaker.dmi b/icons/obj/femur_breaker.dmi
new file mode 100644
index 0000000000..4b36f4b2b8
Binary files /dev/null and b/icons/obj/femur_breaker.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 92b5203f5d..6fda702cb3 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi
index 57dda21757..df1e61c849 100644
Binary files a/icons/obj/food/piecake.dmi and b/icons/obj/food/piecake.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 4dec451008..a6d5c8a5e1 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 47d05e3470..0a4152af64 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 7d44d35f55..0ac8ccf566 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 82dce552a7..dd4d1e1f93 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi
index 162c6b047e..e7dee2290d 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi
index d309884be0..029d49e196 100644
Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index a1ab5b08e5..fe126cadd8 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 5a2088c332..a78ce898e0 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 0d68f00c8b..6336669501 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/iv_drip.dmi b/icons/obj/iv_drip.dmi
index 016513245e..f530688da7 100644
Binary files a/icons/obj/iv_drip.dmi and b/icons/obj/iv_drip.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index 140f6a4d9e..f28b8be5c5 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi
index 9048739e0c..b6ca8c178c 100644
Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ
diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi
index a575ab292f..e7875efa26 100644
Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ
diff --git a/icons/obj/smooth_structures/plasmaglass_table.dmi b/icons/obj/smooth_structures/plasmaglass_table.dmi
new file mode 100644
index 0000000000..808e79aa43
Binary files /dev/null and b/icons/obj/smooth_structures/plasmaglass_table.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index 6d2b2b64cd..ac2d42378a 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 2a6ec3955a..e5d61fbfe0 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index cfb36bb3ae..c983201d5f 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm
index 511627b81f..3a0eb364cb 100644
--- a/modular_citadel/code/_onclick/hud/screen_objects.dm
+++ b/modular_citadel/code/_onclick/hud/screen_objects.dm
@@ -1,25 +1,3 @@
-/obj/screen/mov_intent
- icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
-
-/obj/screen/sprintbutton
- name = "toggle sprint"
- icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
- icon_state = "act_sprint"
- layer = ABOVE_HUD_LAYER - 0.1
-
-/obj/screen/sprintbutton/Click()
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- H.togglesprint()
-
-/obj/screen/sprintbutton/proc/insert_witty_toggle_joke_here(mob/living/carbon/human/H)
- if(!H)
- return
- if(H.sprinting)
- icon_state = "act_sprint_on"
- else
- icon_state = "act_sprint"
-
/obj/screen/restbutton
name = "rest"
icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/modular_citadel/code/_onclick/hud/sprint.dm
new file mode 100644
index 0000000000..290fcd368e
--- /dev/null
+++ b/modular_citadel/code/_onclick/hud/sprint.dm
@@ -0,0 +1,41 @@
+/obj/screen/mov_intent
+ icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
+
+/obj/screen/sprintbutton
+ name = "toggle sprint"
+ icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
+ icon_state = "act_sprint"
+ layer = ABOVE_HUD_LAYER - 0.1
+
+/obj/screen/sprintbutton/Click()
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ H.togglesprint()
+
+/obj/screen/sprintbutton/proc/insert_witty_toggle_joke_here(mob/living/carbon/human/H)
+ if(!H)
+ return
+ if(H.sprinting)
+ icon_state = "act_sprint_on"
+ else
+ icon_state = "act_sprint"
+
+//Sprint buffer onscreen code.
+/datum/hud/var/obj/screen/sprint_buffer/sprint_buffer
+
+/obj/screen/sprint_buffer
+ name = "sprint buffer"
+ icon = 'icons/effects/progessbar.dmi'
+ icon_state = "prog_bar_100"
+
+/obj/screen/sprint_buffer/Click()
+ if(isliving(usr))
+ var/mob/living/L = usr
+ to_chat(L, "Your sprint buffer's maximum capacity is [L.sprint_buffer_max]. It is currently at [L.sprint_buffer], regenerating at [L.sprint_buffer_regen_ds * 10] per second. \
+ Sprinting while this is empty will incur a [L.sprint_stamina_cost] stamina cost per tile.")
+
+/obj/screen/sprint_buffer/proc/update_to_mob(mob/living/L)
+ var/amount = 0
+ if(L.sprint_buffer_max > 0)
+ amount = round(CLAMP((L.sprint_buffer / L.sprint_buffer_max) * 100, 0, 100), 5)
+ icon_state = "prog_bar_[amount]"
diff --git a/modular_citadel/code/_onclick/item_attack.dm b/modular_citadel/code/_onclick/item_attack.dm
index dcc9f567e2..80281ee084 100644
--- a/modular_citadel/code/_onclick/item_attack.dm
+++ b/modular_citadel/code/_onclick/item_attack.dm
@@ -17,9 +17,3 @@
/obj/item/proc/altafterattack(atom/target, mob/user, proximity_flag, click_parameters)
return FALSE
-
-/obj/item/proc/getweight()
- if(total_mass)
- return max(total_mass,MIN_MELEE_STAMCOST)
- else
- return w_class*1.25
diff --git a/modular_citadel/code/controllers/subsystem/job.dm b/modular_citadel/code/controllers/subsystem/job.dm
index c433042ae6..46aef6f529 100644
--- a/modular_citadel/code/controllers/subsystem/job.dm
+++ b/modular_citadel/code/controllers/subsystem/job.dm
@@ -13,7 +13,7 @@
var/permitted = TRUE
if(G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles))
permitted = FALSE
- if(G.ckeywhitelist && G.ckeywhitelist.len && !(the_mob.client.ckey in G.ckeywhitelist))
+ if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey))
permitted = FALSE
if(!equipbackpackstuff && G.category == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs
permitted = FALSE
diff --git a/modular_citadel/code/datums/mood_events/moodular.dm b/modular_citadel/code/datums/mood_events/moodular.dm
index b53ce417e8..aa87f1b97a 100644
--- a/modular_citadel/code/datums/mood_events/moodular.dm
+++ b/modular_citadel/code/datums/mood_events/moodular.dm
@@ -3,9 +3,7 @@
// box of hugs
/obj/item/storage/box/hug/attack_self(mob/user)
. = ..()
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("hugbox", /datum/mood_event/hugbox)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"hugbox", /datum/mood_event/hugbox)
//Removed headpats here, duplicate code?
@@ -13,25 +11,17 @@
/obj/item/toy/plush/attack_self(mob/user)
. = ..()
if(stuffed || grenade)
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("plushpet", /datum/mood_event/plushpet)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet)
else
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("plush_nostuffing", /datum/mood_event/plush_nostuffing)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing)
// Jack the Ripper starring plush
/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params)
. = ..()
if(I.is_sharp())
if(!grenade)
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("plushjack", /datum/mood_event/plushjack)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushjack", /datum/mood_event/plushjack)
// plush playing (plush-on-plush action)
if(istype(I, /obj/item/toy/plush))
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("plushplay", /datum/mood_event/plushplay)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushplay", /datum/mood_event/plushplay)
diff --git a/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm b/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
index 334d6bf423..1653b8d314 100644
--- a/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
@@ -64,7 +64,7 @@
name = "Cyber"
color = "#00f904" //Cyber and waffle shared colors, I made these guys green and made weed darker green.
inner_outfits = list(/obj/item/clothing/under/color/lightbrown)
- outer_outfits = list(/obj/item/clothing/suit/nemes)
+ outer_outfits = list(/obj/item/clothing/suit/pharaoh)
/datum/team/gang/donk
name = "Donk"
@@ -136,4 +136,4 @@
name = "Weed"
color = "#6cd648"
inner_outfits = list(/obj/item/clothing/under/color/darkgreen)
- outer_outfits = list(/obj/item/clothing/suit/vapeshirt)
\ No newline at end of file
+ outer_outfits = list(/obj/item/clothing/suit/vapeshirt)
diff --git a/modular_citadel/code/game/machinery/plasmacases.dm b/modular_citadel/code/game/machinery/plasmacases.dm
index ac3621b58a..c45eb48caa 100644
--- a/modular_citadel/code/game/machinery/plasmacases.dm
+++ b/modular_citadel/code/game/machinery/plasmacases.dm
@@ -19,5 +19,6 @@
return MouseDrop(user)
/obj/structure/guncase/plasma/emag_act()
- to_chat(usr, "The locking mechanism is fitted with old style parts, The card has no effect.")
- return
\ No newline at end of file
+ . = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+ if(!.)
+ to_chat(usr, "The locking mechanism is fitted with old style parts, The card has no effect.")
\ No newline at end of file
diff --git a/modular_citadel/code/game/machinery/wishgranter.dm b/modular_citadel/code/game/machinery/wishgranter.dm
index f7c2c57d08..f24062a126 100644
--- a/modular_citadel/code/game/machinery/wishgranter.dm
+++ b/modular_citadel/code/game/machinery/wishgranter.dm
@@ -95,7 +95,7 @@
killwish.grasp_range = 6
killwish.melee_damage_upper = 30
killwish.grasp_chance = 50
- killwish.loot = list(/obj/item/twohanded/hypereutactic)
+ killwish.loot = list(/obj/item/twohanded/dualsaber/hypereutactic)
charges--
insisting = FALSE
if(!charges)
diff --git a/modular_citadel/code/game/objects/items.dm b/modular_citadel/code/game/objects/items.dm
index 337db986b0..c94923f9de 100644
--- a/modular_citadel/code/game/objects/items.dm
+++ b/modular_citadel/code/game/objects/items.dm
@@ -1,6 +1,4 @@
/obj/item
- var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds.
-
var/list/alternate_screams = list() //REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
// lazy for screaming.
diff --git a/modular_citadel/code/game/objects/items/handcuffs.dm b/modular_citadel/code/game/objects/items/handcuffs.dm
deleted file mode 100644
index ed5e8a191e..0000000000
--- a/modular_citadel/code/game/objects/items/handcuffs.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/obj/item/restraints/handcuffs/fake/kinky
- name = "kinky handcuffs"
- desc = "Fake handcuffs meant for erotic roleplay."
- icon = 'modular_citadel/icons/obj/items_and_weapons.dmi'
- icon_state = "handcuffgag"
diff --git a/modular_citadel/code/game/objects/items/melee/energy.dm b/modular_citadel/code/game/objects/items/melee/energy.dm
deleted file mode 100644
index c37f88eacf..0000000000
--- a/modular_citadel/code/game/objects/items/melee/energy.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/obj/item/melee/transforming/energy/sword
- total_mass = 0.375 //Survival flashlights typically weigh around 5 ounces.
- total_mass_on = 3.4 //The typical medieval sword, on the other hand, weighs roughly 3 pounds.
diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
index 6e28a3115f..68ab229f0a 100644
--- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
+++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
@@ -124,7 +124,7 @@
return
else
to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.")
- new /obj/item/twohanded/hypereutactic(user.drop_location())
+ new /obj/item/twohanded/dualsaber/hypereutactic(user.drop_location())
qdel(W)
qdel(src)
else
@@ -233,7 +233,7 @@
return
else
to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.")
- new /obj/item/twohanded/hypereutactic/toy(user.loc)
+ new /obj/item/twohanded/dualsaber/hypereutactic/toy(user.loc)
qdel(W)
qdel(src)
else
@@ -247,7 +247,7 @@
// HYPEREUTACTIC Blades /////////////////////////
/////////////////////////////////////////////////////
-/obj/item/twohanded/hypereutactic
+/obj/item/twohanded/dualsaber/hypereutactic
icon = 'modular_citadel/icons/eutactic/item/hypereutactic.dmi'
icon_state = "hypereutactic"
lefthand_file = 'modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi'
@@ -258,58 +258,29 @@
name = "hypereutactic blade"
desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
force = 7
- throwforce = 5
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_SMALL
- var/w_class_on = WEIGHT_CLASS_BULKY
force_unwielded = 7
force_wielded = 40
wieldsound = 'sound/weapons/nebon.ogg'
unwieldsound = 'sound/weapons/neboff.ogg'
- hitsound = "swing_hit"
+ hitsound_on = 'sound/weapons/nebhit.ogg'
+ slowdown_wielded = 1
armour_penetration = 60
light_color = "#37FFF7"
+ rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded")
- block_chance = 75
- max_integrity = 200
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
- resistance_flags = FIRE_PROOF
- var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
- item_flags = SLOWS_WHILE_IN_HAND
+ spinnable = FALSE
+ total_mass_on = 4
-/obj/item/twohanded/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
+/obj/item/twohanded/dualsaber/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params)
return TRUE
-/obj/item/twohanded/hypereutactic/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
+/obj/item/twohanded/dualsaber/hypereutactic/altafterattack(atom/target, mob/living/user, proximity_flag, click_parameters) //does right click memes
if(istype(user))
user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
return TRUE
-/obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
- if(M.has_dna())
- if(M.dna.check_mutation(HULK))
- to_chat(M, "You lack the grace to wield this!")
- return
- ..()
- if(wielded)
- sharpness = IS_SHARP
- w_class = w_class_on
- hitsound = 'sound/weapons/nebhit.ogg'
- START_PROCESSING(SSobj, src)
- set_light(brightness_on)
-
-/obj/item/twohanded/hypereutactic/unwield() //Specific unwield () to switch hitsounds.
- sharpness = initial(sharpness)
- w_class = initial(w_class)
- ..()
- hitsound = "swing_hit"
- STOP_PROCESSING(SSobj, src)
- set_light(0)
- slowdown = initial(slowdown)
-
-/obj/item/twohanded/hypereutactic/update_icon()
+/obj/item/twohanded/dualsaber/hypereutactic/update_icon()
var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_blade")
var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_gem")
@@ -329,21 +300,21 @@
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is)
-/obj/item/twohanded/hypereutactic/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
+/obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user)
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
return
if(user.incapacitated() || !istype(user))
to_chat(user, "You can't do that right now!")
return
-
if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null
- if(energy_color_input)
- light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ if(!energy_color_input || !user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
+ return
+ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
update_icon()
update_light()
-/obj/item/twohanded/hypereutactic/worn_overlays(isinhands, icon_file)
+/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file)
. = ..()
if(isinhands)
var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
@@ -354,70 +325,19 @@
blade_inhand.color = light_color
. += blade_inhand
-/obj/item/twohanded/hypereutactic/examine(mob/user)
+/obj/item/twohanded/dualsaber/hypereutactic/examine(mob/user)
..()
- to_chat(user, "Alt-click to recolor it.")
+ if(!hacked)
+ to_chat(user, "Alt-click to recolor it.")
-////////// stuff beneath this is all taken from the desword //////////// wow very professional such OOP wow
-
-/obj/item/twohanded/hypereutactic/attack(mob/target, mob/living/carbon/human/user)
- if(user.has_dna())
- if(user.dna.check_mutation(HULK))
- to_chat(user, "You grip the blade too hard and accidentally close it!")
- unwield()
- return
- ..()
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
- impale(user)
- return
-
-/obj/item/twohanded/hypereutactic/Destroy()
- STOP_PROCESSING(SSobj, src)
+/obj/item/twohanded/dualsaber/hypereutactic/rainbow_process()
. = ..()
-
-/obj/item/twohanded/hypereutactic/proc/impale(mob/living/user)
- to_chat(user, "You spin around a bit before losing your balance and impaling yourself on [src].")
- if (force_wielded)
- user.take_bodypart_damage(20,25)
- else
- user.adjustStaminaLoss(25)
-
-/obj/item/twohanded/hypereutactic/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(wielded)
- return ..()
- return FALSE
-
-/obj/item/twohanded/hypereutactic/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
- if(wielded)
- to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!")
- return TRUE
-
-/obj/item/twohanded/hypereutactic/process()
- if(wielded)
- open_flame()
- else
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/twohanded/hypereutactic/IsReflect()
- if(wielded)
- return TRUE
-
-/obj/item/twohanded/hypereutactic/ignition_effect(atom/A, mob/user)
- // same as /obj/item/melee/transforming/energy, mostly
- if(!wielded)
- return ""
- var/in_mouth = ""
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- if(C.wear_mask == src)
- in_mouth = ", barely missing their nose"
- . = "[user] swings [user.p_their()] [src][in_mouth]. [user.p_they()] light[user.p_s()] [A] in the process."
- playsound(loc, hitsound, get_clamped_volume(), 1, -1)
- add_fingerprint(user)
+ update_icon()
+ update_light()
////////////////// TOY VERSION /////////////////////////////
-/obj/item/twohanded/hypereutactic/toy
+/obj/item/twohanded/dualsaber/hypereutactic/toy
name = "\improper DX Hyper-Euplastic LightSword"
desc = "A supermassive toy envisioned to cleave the very fabric of space and time itself in twain. Realistic visuals and sounds! Ages 8 and up."
force = 0
@@ -427,11 +347,13 @@
force_unwielded = 0
force_wielded = 0
attack_verb = list("attacked", "struck", "hit")
+ total_mass_on = TOTAL_MASS_TOY_SWORD
+ slowdown_wielded = 0
-/obj/item/twohanded/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+/obj/item/twohanded/dualsaber/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
return FALSE
-/obj/item/twohanded/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles
+/obj/item/twohanded/dualsaber/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles
return FALSE
//////// Tatortot NEB /////////////// (same stats as regular esword)
@@ -455,17 +377,7 @@
//RAINBOW MEMES
-/obj/item/twohanded/hypereutactic/toy/rainbow
+/obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander"
desc = "A custom-built toy with fancy rainbow lights built-in."
- var/list/rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
-
-/obj/item/twohanded/hypereutactic/toy/rainbow/process()
- . = ..()
- var/set_color = pick(rainbow_colors)
- light_color = set_color
- update_light()
- update_icon()
-
-/obj/item/twohanded/hypereutactic/toy/rainbow/AltClick(mob/living/user)
- return
+ hacked = TRUE
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/items/melee/misc.dm b/modular_citadel/code/game/objects/items/melee/misc.dm
index 6a53adcc1f..48c221696e 100644
--- a/modular_citadel/code/game/objects/items/melee/misc.dm
+++ b/modular_citadel/code/game/objects/items/melee/misc.dm
@@ -4,7 +4,7 @@
var/hardstun_ds = 1
var/softstun_ds = 0
var/stam_dmg = 30
- cooldown = 20
+ cooldown = 0
total_mass = 3.75
/obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user)
diff --git a/modular_citadel/code/game/objects/items/melee/transforming.dm b/modular_citadel/code/game/objects/items/melee/transforming.dm
deleted file mode 100644
index 46610f4e54..0000000000
--- a/modular_citadel/code/game/objects/items/melee/transforming.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/obj/item/melee/transforming
- var/total_mass_on //Total mass in ounces when transformed. Primarily for balance purposes. Don't think about it too hard.
-
-/obj/item/melee/transforming/getweight()
- if(total_mass && total_mass_on)
- if(active)
- return max(total_mass_on,MIN_MELEE_STAMCOST)
- else
- return max(total_mass,MIN_MELEE_STAMCOST)
- else
- return initial(w_class)*1.25
-
-/obj/item/melee/transforming/cleaving_saw
- total_mass = 2.75
- total_mass_on = 5
diff --git a/modular_citadel/code/game/objects/items/stunsword.dm b/modular_citadel/code/game/objects/items/stunsword.dm
index 1262b0018a..7a5398f7d2 100644
--- a/modular_citadel/code/game/objects/items/stunsword.dm
+++ b/modular_citadel/code/game/objects/items/stunsword.dm
@@ -7,6 +7,14 @@
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
+/obj/item/melee/baton/stunsword/get_belt_overlay()
+ if(istype(loc, /obj/item/storage/belt/sabre))
+ return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "stunsword")
+ return ..()
+
+/obj/item/melee/baton/stunsword/get_worn_belt_overlay(icon_file)
+ return mutable_appearance(icon_file, "-stunsword")
+
/obj/item/ssword_kit
name = "stunsword kit"
desc = "a modkit for making a stunbaton into a stunsword"
diff --git a/modular_citadel/code/modules/admin/chat_commands.dm b/modular_citadel/code/modules/admin/chat_commands.dm
index 918b1dda5a..501e0fa25a 100644
--- a/modular_citadel/code/modules/admin/chat_commands.dm
+++ b/modular_citadel/code/modules/admin/chat_commands.dm
@@ -20,3 +20,20 @@
/datum/tgs_chat_command/despacito/Run()
return "https://www.youtube.com/watch?v=kJQP7kiw5Fk"
+
+/datum/tgs_chat_command/poly
+ name = "poly"
+ help_text = "The Lewder, more applicable Poly speak for Citadel Station 13."
+ var/list/speech_buffer
+
+/datum/tgs_chat_command/poly/Run()
+ LAZYINITLIST(speech_buffer) //I figure this is just safe to do for everything at this point
+ if(length(speech_buffer)) //Let's not look up the whole json EVERY TIME, just the first time.
+ return "[pick(speech_buffer)]"
+ else
+ var/json_file = file("data/npc_saves/Poly.json")
+ if(!fexists(json_file))
+ return "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***"
+ var/list/json = json_decode(file2text(json_file))
+ speech_buffer = json["phrases"]
+ return "[pick(speech_buffer)]"
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index 9602c8edad..3df2218766 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -21,10 +21,6 @@
can_climax = TRUE
fluid_transfer_factor = 0.5
-/obj/item/organ/genital/breasts/Initialize()
- . = ..()
- reagents.add_reagent(fluid_id, fluid_max_volume)
-
/obj/item/organ/genital/breasts/on_life()
if(QDELETED(src))
return
@@ -32,6 +28,14 @@
return
reagents.maximum_volume = fluid_max_volume
if(fluid_id && producing)
+ if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
+ fluid_rate = 0.1
+ else
+ fluid_rate = CUM_RATE
+ if(reagents.total_volume >= 5)
+ fluid_mult = 0.5
+ else
+ fluid_mult = 1
generate_milk()
/obj/item/organ/genital/breasts/proc/generate_milk()
diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
index de3a75f3f1..3abe7ecb1f 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals.dm
@@ -10,7 +10,7 @@
var/fluid_transfer_factor = 0.0 //How much would a partner get in them if they climax using this?
var/size = 2 //can vary between num or text, just used in icon_state strings
var/fluid_id = null
- var/fluid_max_volume = 50
+ var/fluid_max_volume = 15
var/fluid_efficiency = 1
var/fluid_rate = 1
var/fluid_mult = 1
@@ -230,6 +230,7 @@
B.prev_size = B.size
B.shape = dna.features["breasts_shape"]
B.fluid_id = dna.features["breasts_fluid"]
+ B.producing = dna.features["breasts_producing"]
B.update()
@@ -270,8 +271,8 @@
switch(layer)
if(GENITALS_BEHIND_LAYER)
return "BEHIND"
- if(GENITALS_ADJ_LAYER)
- return "ADJ"
+ /*if(GENITALS_ADJ_LAYER)
+ return "ADJ"*/
if(GENITALS_FRONT_LAYER)
return "FRONT"
@@ -344,7 +345,7 @@
if(HAS_TRAIT(H, TRAIT_HUSK))
return
var/list/genitals_to_add = list()
- var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER)
+ var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_FRONT_LAYER) //GENITALS_ADJ_LAYER removed
var/list/standing = list()
var/size
var/aroused_state
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index 1e6b4d62d4..f4ef4b5064 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -16,14 +16,18 @@
can_climax = TRUE
var/sent_full_message = TRUE //defaults to 1 since they're full to start
-/obj/item/organ/genital/testicles/Initialize()
- . = ..()
- reagents.add_reagent(fluid_id, fluid_max_volume)
-
/obj/item/organ/genital/testicles/on_life()
if(QDELETED(src))
return
if(reagents && producing)
+ if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
+ fluid_rate = 0.1
+ else
+ fluid_rate = CUM_RATE
+ if(reagents.total_volume >= 5)
+ fluid_mult = 0.5
+ else
+ fluid_mult = 1
generate_cum()
/obj/item/organ/genital/testicles/proc/generate_cum()
diff --git a/modular_citadel/code/modules/arousal/organs/womb.dm b/modular_citadel/code/modules/arousal/organs/womb.dm
index 686d9059a0..3f190b72ac 100644
--- a/modular_citadel/code/modules/arousal/organs/womb.dm
+++ b/modular_citadel/code/modules/arousal/organs/womb.dm
@@ -9,14 +9,18 @@
fluid_id = "femcum"
producing = TRUE
-/obj/item/organ/genital/womb/Initialize()
- . = ..()
- reagents.add_reagent(fluid_id, fluid_max_volume)
-
/obj/item/organ/genital/womb/on_life()
if(QDELETED(src))
return
if(reagents && producing)
+ if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
+ fluid_rate = 0.1
+ else
+ fluid_rate = CUM_RATE
+ if(reagents.total_volume >= 5)
+ fluid_mult = 0.5
+ else
+ fluid_mult = 1
generate_femcum()
/obj/item/organ/genital/womb/proc/generate_femcum()
diff --git a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
index f6991f1d9f..ccbf9a42fe 100644
--- a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
+++ b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
@@ -49,7 +49,7 @@
/datum/outfit/lavaknight/captain
name ="Cydonian Knight Captain"
- l_pocket = /obj/item/twohanded/hypereutactic
+ l_pocket = /obj/item/twohanded/dualsaber/hypereutactic
/datum/outfit/lavaknight/captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
diff --git a/modular_citadel/code/modules/cargo/console.dm b/modular_citadel/code/modules/cargo/console.dm
index 490f72d1d1..f54a6c577a 100644
--- a/modular_citadel/code/modules/cargo/console.dm
+++ b/modular_citadel/code/modules/cargo/console.dm
@@ -1,13 +1,9 @@
/obj/machinery/computer/cargo
req_access = list(ACCESS_CARGO)
-
+
/obj/machinery/computer/cargo/request
req_access = list()
-/obj/machinery/computer/cargo/emag_act(mob/user)
- req_access = list()
- . = ..()
-
/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui)
if(!allowed(usr))
to_chat(usr, "Access denied.")
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 90172bbf43..cc75e1bff9 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -220,13 +220,13 @@
/datum/gear/torisword
name = "Rainbow Zweihander"
category = SLOT_IN_BACKPACK
- path = /obj/item/twohanded/hypereutactic/toy/rainbow
+ path = /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
ckeywhitelist = list("annoymous35")
/datum/gear/darksabre
name = "Dark Sabre"
category = SLOT_IN_BACKPACK
- path = /obj/item/toy/sword/darksabre
+ path = /obj/item/toy/darksabre
ckeywhitelist = list("inferno707")
datum/gear/darksabresheath
@@ -434,3 +434,17 @@ datum/gear/darksabresheath
category = SLOT_NECK
path = /obj/item/bedsheet/captain
ckeywhitelist = list("tikibomb")
+
+/datum/gear/borgplush
+ name = "Robot Plush"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/toy/plush/borgplushie
+ ckeywhitelist = list("nicholaiavenicci")
+
+/datum/gear/donorberet
+ name = "Atmos Beret"
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/blueberet
+ ckeywhitelist = list("foxystalin")
+
+
diff --git a/modular_citadel/code/modules/client/loadout/loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm
similarity index 79%
rename from modular_citadel/code/modules/client/loadout/loadout.dm
rename to modular_citadel/code/modules/client/loadout/_loadout.dm
index 2e11519d0b..d48da1b863 100644
--- a/modular_citadel/code/modules/client/loadout/loadout.dm
+++ b/modular_citadel/code/modules/client/loadout/_loadout.dm
@@ -50,12 +50,32 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/path //item-to-spawn path
var/cost = 1 //normally, each loadout costs a single point.
var/geargroupID //defines the ID that the gear inherits from the config
+
+ //NEW DONATOR SYTSEM STUFF
+ var/donoritem //autoset on new if null
+ var/donator_group_id //New donator group ID system.
+ //END
+
var/list/restricted_roles
+
+ //Old donator system/snowflake ckey whitelist, used for single ckeys/exceptions
var/list/ckeywhitelist
+ //END
+
var/restricted_desc
/datum/gear/New()
- ..()
+ if(isnull(donoritem))
+ if(donator_group_id || ckeywhitelist)
+ donoritem = TRUE
if(!description && path)
var/obj/O = path
description = initial(O.desc)
+
+//a comprehensive donator check proc is intentionally not implemented due to the fact that we (((might))) have job-whitelists for donator items in the future and I like to stay on the safe side.
+
+//ckey only check
+/datum/gear/proc/donator_ckey_check(key)
+ if(ckeywhitelist && ckeywhitelist.Find(key))
+ return TRUE
+ return IS_CKEY_DONATOR_GROUP(key, donator_group_id)
diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm
index bb12fc8ac9..c2713b49be 100644
--- a/modular_citadel/code/modules/client/loadout/backpack.dm
+++ b/modular_citadel/code/modules/client/loadout/backpack.dm
@@ -79,8 +79,24 @@
path = /obj/item/toy/katana
cost = 3
-//datum/gear/lumeyes
-// name = "Luminescent eye auto surgeon"
-// category = SLOT_IN_BACKPACK
-// path = /obj/item/autosurgeon/gloweyes
-// cost = 4
+/datum/gear/box
+ name = "Spare box"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/storage/box
+ cost = 2
+
+/datum/gear/crowbar
+ name = "Pocket Crowbar"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/crowbar
+ cost = 2
+
+/datum/gear/tapeplayer
+ name = "Taperecorder"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/taperecorder
+
+/datum/gear/tape
+ name = "Spare cassette tape"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/tape/random
\ No newline at end of file
diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm
index 2921f70684..0a353e3f5d 100644
--- a/modular_citadel/code/modules/client/preferences_savefile.dm
+++ b/modular_citadel/code/modules/client/preferences_savefile.dm
@@ -65,6 +65,7 @@
WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"])
WRITE_FILE(S["feature_breasts_color"], features["breasts_color"])
WRITE_FILE(S["feature_breasts_fluid"], features["breasts_fluid"])
+ WRITE_FILE(S["feature_breasts_producing"], features["breasts_producing"])
//vagina features
WRITE_FILE(S["feature_has_vag"], features["has_vag"])
WRITE_FILE(S["feature_vag_shape"], features["vag_shape"])
diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm
index 8e2b94372d..a60f7653c5 100644
--- a/modular_citadel/code/modules/clothing/under/trek_under.dm
+++ b/modular_citadel/code/modules/clothing/under/trek_under.dm
@@ -5,7 +5,8 @@
*//////////////////////////////////////////////////////////////////////////////////
// <3 Nienhaus && Joan.
// I made the Voy and DS9 stuff tho. - Poojy
-
+// Armor lists for even Heads of Staff is Nulled out do round start armor as well most armor going onto the suit itself rather then a armor slot - Trilby
+///////////////////////////////////////////////////////////////////////////////////
/obj/item/clothing/under/rank/trek
@@ -22,7 +23,7 @@
desc = "The uniform worn by command officers in the mid 2260s."
icon_state = "trek_command"
item_state = "trek_command"
- armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 0, "bio" = 10, "rad" = 10, "fire" = 0, "acid" = 0) // Considering only staff heads get to pick it
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/under/rank/trek/engsec
name = "Operations Uniform"
@@ -104,7 +105,7 @@
/obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker,
/obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs,/obj/item/hypospray
)
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/suit/storage/trek/ds9/admiral // Only for adminuz
name = "Admiral Overcoat"
@@ -135,7 +136,6 @@
/obj/item/clothing/suit/storage/fluff/fedcoat
name = "Federation Uniform Jacket"
desc = "A uniform jacket from the United Federation. Set phasers to awesome."
-
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
icon_state = "fedcoat"
@@ -160,7 +160,7 @@
/obj/item/reagent_containers/glass/beaker,
/obj/item/storage/pill_bottle,
/obj/item/taperecorder)
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
var/unbuttoned = 0
verb/toggle()
@@ -214,7 +214,7 @@
/obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker,
/obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs,/obj/item/hypospray
)
- armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
//Variants
/obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
@@ -231,6 +231,7 @@
/obj/item/clothing/head/caphat/formal/fedcover
name = "Federation Officer's Cap"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
desc = "An officer's cap that demands discipline from the one who wears it."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
icon_state = "fedcapofficer"
diff --git a/modular_citadel/code/modules/clothing/under/turtlenecks.dm b/modular_citadel/code/modules/clothing/under/turtlenecks.dm
index f4e1ba8bd9..fd13da11e9 100644
--- a/modular_citadel/code/modules/clothing/under/turtlenecks.dm
+++ b/modular_citadel/code/modules/clothing/under/turtlenecks.dm
@@ -43,8 +43,8 @@
icon_state = "bb_turtle"
item_state = "w_suit"
item_color = "bb_turtle"
- body_parts_covered = CHEST|ARMS
- can_adjust = 1
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = TRUE
icon = 'modular_citadel/icons/obj/clothing/turtlenecks.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
diff --git a/modular_citadel/code/modules/clothing/under/under.dm b/modular_citadel/code/modules/clothing/under/under.dm
index 1796df01be..dcc6323f62 100644
--- a/modular_citadel/code/modules/clothing/under/under.dm
+++ b/modular_citadel/code/modules/clothing/under/under.dm
@@ -5,26 +5,6 @@
*//////////////////////////////////////////////////////////////////////////////////
-/obj/item/clothing/under/rank/security/skirt
- name = "security skirt"
- desc = "A tactical security skirt for officers complete with Nanotrasen belt buckle."
- icon = 'modular_citadel/icons/obj/clothing/cit_clothes.dmi'
- icon_state = "secskirt"
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- item_state = "r_suit"
- item_color = "secskirt"
- body_parts_covered = CHEST|GROIN|ARMS
-
-/obj/item/clothing/under/rank/head_of_security/skirt
- name = "head of security's skirt"
- desc = "A security skirt decorated for those few with the dedication to achieve the position of Head of Security."
- icon = 'modular_citadel/icons/obj/clothing/cit_clothes.dmi'
- icon_state = "hosskirt"
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- item_state = "gy_suit"
- item_color = "hosskirt"
- body_parts_covered = CHEST|GROIN|ARMS
-
/obj/item/clothing/under/corporateuniform
name = "corporate uniform"
desc = "A comfortable, tight fitting jumpsuit made of premium materials. Not space-proof."
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index 0ce4fbdd78..42363e9e07 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -49,7 +49,7 @@
item_color = "steele"
medaltype = "medal-silver"
-/obj/item/toy/sword/darksabre
+/obj/item/toy/darksabre
name = "Kiara's Sabre"
desc = "This blade looks as dangerous as its owner."
icon = 'icons/obj/custom.dmi'
@@ -58,9 +58,13 @@
item_state = "darksabre"
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
- w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
+/obj/item/toy/darksabre/get_belt_overlay()
+ return mutable_appearance('icons/obj/custom.dmi', "darksheath-darksabre")
+
+/obj/item/toy/darksabre/get_worn_belt_overlay(icon_file)
+ return mutable_appearance(icon_file, "darksheath-darksabre")
/obj/item/storage/belt/sabre/darksabre
name = "Ornate Sheathe"
@@ -69,32 +73,8 @@
alternate_worn_icon = 'icons/mob/custom_w.dmi'
icon_state = "darksheath"
item_state = "darksheath"
- w_class = WEIGHT_CLASS_BULKY
-
-/obj/item/storage/belt/sabre/darksabre/ComponentInitialize()
- . = ..()
- GET_COMPONENT(STR, /datum/component/storage)
- STR.max_items = 1
- STR.rustle_sound = FALSE
- STR.max_w_class = WEIGHT_CLASS_BULKY
- STR.can_hold = typecacheof(list(
- /obj/item/toy/sword/darksabre
- ))
-
-/obj/item/storage/belt/sabre/darksabre/update_icon()
- icon_state = "darksheath"
- item_state = "darksheath"
- if(contents.len)
- icon_state += "-darksabre"
- item_state += "-darksabre"
- if(loc && isliving(loc))
- var/mob/living/L = loc
- L.regenerate_icons()
- ..()
-
-/obj/item/storage/belt/sabre/darksabre/PopulateContents()
- new /obj/item/toy/sword/darksabre(src)
- update_icon()
+ fitting_swords = list(/obj/item/toy/darksabre)
+ starting_sword = /obj/item/toy/darksabre
/obj/item/clothing/suit/armor/vest/darkcarapace
name = "Dark Armor"
@@ -342,31 +322,6 @@
name = "worn pet collar"
desc = "a pet collar that looks well used."
-/obj/item/clothing/neck/petcollar/naomi/examine(mob/user)
- . = ..()
- if(usr.ckey != "technicalmagi")
- to_chat(user, "There's something odd about the it. You probably shouldn't wear it...")//warn people not to wear it if they're not Naomi, lest they become as crazy as she is
-
-/obj/item/clothing/neck/petcollar/naomi/equipped()
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/clothing/neck/petcollar/naomi/dropped()
- . = ..()
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/clothing/neck/petcollar/naomi/process()
- var/mob/living/carbon/human/H
- if(ishuman(loc))
- H = loc
- if(!H)
- return
- else if(H.get_item_by_slot(SLOT_NECK) == src)
- if(H.arousalloss < H.max_arousal / 3)
- H.arousalloss = H.max_arousal / 3
- if(prob(5) && H.hallucination < 15)
- H.hallucination += 10
-
/obj/item/clothing/neck/cloak/green
name = "Generic Green Cloak"
desc = "This cloak doesn't seem too special."
@@ -528,3 +483,11 @@
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
+
+/obj/item/clothing/head/blueberet
+ name = "Atmos Beret"
+ desc = "A fitted beret designed to be worn by Atmos Techs."
+ icon_state = "blueberet"
+ item_state = "blueberet"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
diff --git a/modular_citadel/code/modules/jobs/job_types/captain.dm b/modular_citadel/code/modules/jobs/job_types/captain.dm
index 674cd9d09e..7135e86507 100644
--- a/modular_citadel/code/modules/jobs/job_types/captain.dm
+++ b/modular_citadel/code/modules/jobs/job_types/captain.dm
@@ -4,7 +4,6 @@
/datum/job/hop
minimal_player_age = 20
- head_announce = list("Service")
exp_type_department = EXP_TYPE_SERVICE
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
diff --git a/modular_citadel/code/modules/mentor/mentorpm.dm b/modular_citadel/code/modules/mentor/mentorpm.dm
index 34ace6f002..4c9a4766ec 100644
--- a/modular_citadel/code/modules/mentor/mentorpm.dm
+++ b/modular_citadel/code/modules/mentor/mentorpm.dm
@@ -3,7 +3,7 @@
set category = "Mentor"
set name = "Mentor PM"
if(!is_mentor())
- to_chat(src, "Error: Mentor-PM-Panel: Only Mentors and Admins may use this command.")
+ to_chat(src, "Error: Mentor-PM-Panel: Only Mentors and Admins may use this command.")
return
var/list/client/targets[0]
for(var/client/T)
@@ -27,24 +27,24 @@
else if(istype(whom,/client))
C = whom
if(!C)
- if(is_mentor()) to_chat(src, "Error: Mentor-PM: Client not found.")
+ if(is_mentor()) to_chat(src, "Error: Mentor-PM: Client not found.")
else mentorhelp(msg) //Mentor we are replying to left. Mentorhelp instead(check below)
return
if(is_mentor(whom))
- to_chat(GLOB.admins | GLOB.mentors, "[src] has started replying to [whom]'s mhelp.")
+ to_chat(GLOB.admins | GLOB.mentors, "[src] has started replying to [whom]'s mhelp.")
//get message text, limit it's length.and clean/escape html
if(!msg)
msg = input(src,"Message:", "Private message") as text|null
-
+
if(!msg && is_mentor(whom))
- to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
+ to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
return
if(!C)
if(is_mentor())
- to_chat(src, "Error: Mentor-PM: Client not found.")
+ to_chat(src, "Error: Mentor-PM: Client not found.")
else
mentorhelp(msg) //Mentor we are replying to has vanished, Mentorhelp instead (how the fuck does this work?let's hope it works,shrug)
return
@@ -54,8 +54,8 @@
return
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
- if(!msg && is_mentor(whom))
- to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
+ if(!msg && is_mentor(whom))
+ to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
return
log_mentor("Mentor PM: [key_name(src)]->[key_name(C)]: [msg]")
@@ -65,21 +65,21 @@
var/show_char = CONFIG_GET(flag/mentors_mobname_only)
if(C.is_mentor())
if(is_mentor())//both are mentors
- to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
- to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
+ to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
+ to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
- else //recipient is an mentor but sender is not
- to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]")
- to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
+ else //recipient is a mentor but sender is not
+ to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]")
+ to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
else
- if(is_mentor()) //sender is an mentor but recipient is not.
- to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
- to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, show_char)]: [msg]")
+ if(is_mentor()) //sender is a mentor but recipient is not.
+ to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
+ to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, show_char)]: [msg]")
//we don't use message_Mentors here because the sender/receiver might get it too
var/show_char_sender = !is_mentor() && CONFIG_GET(flag/mentors_mobname_only)
var/show_char_recip = !C.is_mentor() && CONFIG_GET(flag/mentors_mobname_only)
for(var/client/X in GLOB.mentors | GLOB.admins)
if(X.key!=key && X.key!=C.key) //check client/X is an Mentor and isn't the sender or recipient
- to_chat(X, "Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]: [msg]") //inform X
+ to_chat(X, "Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]: [msg]") //inform X
diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
index aff1739ae4..a34b7b0526 100644
--- a/modular_citadel/code/modules/mob/cit_emotes.dm
+++ b/modular_citadel/code/modules/mob/cit_emotes.dm
@@ -185,22 +185,6 @@
emote_type = EMOTE_AUDIBLE
restraint_check = TRUE
-
-
-/datum/emote/living/dab/run_emote(mob/living/user, params)
- if (ishuman(user))
- var/def_zone = BODY_ZONE_CHEST
- var/luck = (rand(1,100))
- if(luck >= 65)
- user.adjustStaminaLoss(70)
- if(luck >= 80)
- def_zone = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
- user.apply_damage(20, BRUTE, def_zone)
- if(luck >= 95)
- user.adjustBrainLoss(100)
- . = ..()
-
-
/datum/emote/living/mothsqueak
key = "msqueak"
key_third_person = "lets out a tiny squeak"
diff --git a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
index c2c581d282..7264d95bae 100644
--- a/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/damage_procs.dm
@@ -18,3 +18,21 @@
if(recoveringstam && amount > 20)
incomingstammult = max(0.01, incomingstammult/(amount*0.05))
return amount
+
+/mob/living/carbon/doSprintLossTiles(tiles)
+ doSprintBufferRegen(FALSE) //first regen.
+ if(sprint_buffer)
+ var/use = min(tiles, sprint_buffer)
+ sprint_buffer -= use
+ tiles -= use
+ update_hud_sprint_bar()
+ if(!tiles) //we had enough, we're done!
+ return
+ adjustStaminaLoss(tiles * sprint_stamina_cost) //use stamina to cover deficit.
+
+/mob/living/carbon/proc/doSprintBufferRegen(updating = TRUE)
+ var/diff = world.time - sprint_buffer_regen_last
+ sprint_buffer_regen_last = world.time
+ sprint_buffer = min(sprint_buffer_max, sprint_buffer + sprint_buffer_regen_ds * diff)
+ if(updating)
+ update_hud_sprint_bar()
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
index 70bac64825..bb8d4a5f4a 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
@@ -13,18 +13,19 @@
/mob/living/carbon/human/species/xeno
race = /datum/species/xeno
-/mob/living/carbon/human/resist()
- . = ..()
- if(wear_suit && wear_suit.breakouttime)//added in human cuff breakout proc
+/mob/living/proc/resist_embedded()
+ return
+
+/mob/living/carbon/human/resist_embedded()
+ if(handcuffed || legcuffed || (wear_suit && wear_suit.breakouttime))
return
- if(.)
- if(canmove && !on_fire)
- for(var/obj/item/bodypart/L in bodyparts)
- if(istype(L) && L.embedded_objects.len)
- for(var/obj/item/I in L.embedded_objects)
- if(istype(I) && I.w_class >= WEIGHT_CLASS_NORMAL) //minimum weight class to insta-ripout via resist
- remove_embedded_unsafe(L, I, src, 1.5) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully.
- return FALSE //Hands are occupied
+ if(canmove && !on_fire)
+ for(var/obj/item/bodypart/L in bodyparts)
+ if(istype(L) && L.embedded_objects.len)
+ for(var/obj/item/I in L.embedded_objects)
+ if(istype(I) && I.w_class >= WEIGHT_CLASS_NORMAL) //minimum weight class to insta-ripout via resist
+ remove_embedded_unsafe(L, I, src, 1.5) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully.
+ return TRUE //Hands are occupied
return
/mob/living/carbon/human/proc/remove_embedded_unsafe(obj/item/bodypart/L, obj/item/I, mob/user, painmul = 1)
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
index 2a1c790b2a..409864c900 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
@@ -5,7 +5,7 @@
var/oldpseudoheight = pseudo_z_axis
. = ..()
if(. && sprinting && !(movement_type & FLYING) && canmove && !resting && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
- adjustStaminaLossBuffered(0.3)
+ doSprintLossTiles(1)
if((oldpseudoheight - pseudo_z_axis) >= 8)
to_chat(src, "You trip off of the elevated surface!")
for(var/obj/item/I in held_items)
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species.dm b/modular_citadel/code/modules/mob/living/carbon/human/species.dm
index fcc60fbe81..1c7456a8d8 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species.dm
@@ -80,10 +80,23 @@
else
target.Move(target_shove_turf, shove_dir)
if(get_turf(target) == target_oldturf)
- target_table = locate(/obj/structure/table) in target_shove_turf.contents
- shove_blocked = TRUE
+ if(target_shove_turf.density)
+ shove_blocked = TRUE
+ else
+ var/thoushallnotpass = FALSE
+ for(var/obj/O in target_shove_turf)
+ if(istype(O, /obj/structure/table))
+ target_table = O
+ else if(!O.CanPass(src, target_shove_turf))
+ shove_blocked = TRUE
+ thoushallnotpass = TRUE
+ if(thoushallnotpass)
+ target_table = null
- if(shove_blocked && !target.is_shove_knockdown_blocked())
+ if(target.is_shove_knockdown_blocked())
+ return
+
+ if(shove_blocked || target_table)
var/directional_blocked = FALSE
if(shove_dir in GLOB.cardinals) //Directional checks to make sure that we're not shoving through a windoor or something like that
var/target_turf = get_turf(target)
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index fa6ded8065..c18303ad84 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -15,7 +15,6 @@
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 160 //a notch brighter so it blends better.
- liked_food = MEAT
coldmod = 3
heatmod = 1
burnmod = 1
diff --git a/modular_citadel/code/modules/mob/living/carbon/life.dm b/modular_citadel/code/modules/mob/living/carbon/life.dm
new file mode 100644
index 0000000000..e94bd75985
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/carbon/life.dm
@@ -0,0 +1,3 @@
+/mob/living/carbon/Life()
+ . = ..()
+ doSprintBufferRegen()
diff --git a/modular_citadel/code/modules/mob/living/damage_procs.dm b/modular_citadel/code/modules/mob/living/damage_procs.dm
index 8323386eff..ce81c7aae7 100644
--- a/modular_citadel/code/modules/mob/living/damage_procs.dm
+++ b/modular_citadel/code/modules/mob/living/damage_procs.dm
@@ -1,2 +1,5 @@
/mob/living/proc/adjustStaminaLossBuffered(amount, updating_stamina = TRUE, forced = FALSE)
return
+
+/mob/living/proc/doSprintLossTiles(amount)
+ return
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
index b07b8ed64b..ac79ea7f25 100644
--- a/modular_citadel/code/modules/mob/living/living.dm
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -8,6 +8,14 @@
var/intentionalresting = FALSE
var/attemptingcrawl = FALSE
+ //Sprint buffer---
+ var/sprint_buffer = 42 //Tiles
+ var/sprint_buffer_max = 42
+ var/sprint_buffer_regen_ds = 0.3 //Tiles per world.time decisecond
+ var/sprint_buffer_regen_last = 0 //last world.time this was regen'd for math.
+ var/sprint_stamina_cost = 0.55 //stamina loss per tile while insufficient sprint buffer.
+ //---End
+
/mob/living/movement_delay(ignorewalk = 0)
. = ..()
if(resting)
@@ -118,3 +126,7 @@
filters -= CIT_FILTER_STAMINACRIT
update_canmove()
update_health_hud()
+
+/mob/living/proc/update_hud_sprint_bar()
+ if(hud_used && hud_used.sprint_buffer)
+ hud_used.sprint_buffer.update_to_mob(src)
diff --git a/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm b/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm
new file mode 100644
index 0000000000..b1e112aac5
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm
@@ -0,0 +1,633 @@
+// List is required to compile the resources into the game when it loads.
+// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
+#ifdef AI_VOX
+
+GLOBAL_LIST_INIT(vox_sounds_male, list("," = 'modular_citadel/sound/vox/_comma.ogg',
+"." = 'modular_citadel/sound/vox/_period.ogg',
+"a" = 'modular_citadel/sound/vox/a.ogg',
+"accelerating" = 'modular_citadel/sound/vox/accelerating.ogg',
+"accelerator" = 'modular_citadel/sound/vox/accelerator.ogg',
+"accepted" = 'modular_citadel/sound/vox/accepted.ogg',
+"access" = 'modular_citadel/sound/vox/access.ogg',
+"acknowledge" = 'modular_citadel/sound/vox/acknowledge.ogg',
+"acknowledged" = 'modular_citadel/sound/vox/acknowledged.ogg',
+"acquired" = 'modular_citadel/sound/vox/acquired.ogg',
+"acquisition" = 'modular_citadel/sound/vox/acquisition.ogg',
+"across" = 'modular_citadel/sound/vox/across.ogg',
+"activate" = 'modular_citadel/sound/vox/activate.ogg',
+"activated" = 'modular_citadel/sound/vox/activated.ogg',
+"activity" = 'modular_citadel/sound/vox/activity.ogg',
+"adios" = 'modular_citadel/sound/vox/adios.ogg',
+"administration" = 'modular_citadel/sound/vox/administration.ogg',
+"advanced" = 'modular_citadel/sound/vox/advanced.ogg',
+"after" = 'modular_citadel/sound/vox/after.ogg',
+"agent" = 'modular_citadel/sound/vox/agent.ogg',
+"alarm" = 'modular_citadel/sound/vox/alarm.ogg',
+"alert" = 'modular_citadel/sound/vox/alert.ogg',
+"alien" = 'modular_citadel/sound/vox/alien.ogg',
+"aligned" = 'modular_citadel/sound/vox/aligned.ogg',
+"all" = 'modular_citadel/sound/vox/all.ogg',
+"alpha" = 'modular_citadel/sound/vox/alpha.ogg',
+"am" = 'modular_citadel/sound/vox/am.ogg',
+"amigo" = 'modular_citadel/sound/vox/amigo.ogg',
+"ammunition" = 'modular_citadel/sound/vox/ammunition.ogg',
+"an" = 'modular_citadel/sound/vox/an.ogg',
+"and" = 'modular_citadel/sound/vox/and.ogg',
+"announcement" = 'modular_citadel/sound/vox/announcement.ogg',
+"anomalous" = 'modular_citadel/sound/vox/anomalous.ogg',
+"antenna" = 'modular_citadel/sound/vox/antenna.ogg',
+"any" = 'modular_citadel/sound/vox/any.ogg',
+"apprehend" = 'modular_citadel/sound/vox/apprehend.ogg',
+"approach" = 'modular_citadel/sound/vox/approach.ogg',
+"are" = 'modular_citadel/sound/vox/are.ogg',
+"area" = 'modular_citadel/sound/vox/area.ogg',
+"arm" = 'modular_citadel/sound/vox/arm.ogg',
+"armed" = 'modular_citadel/sound/vox/armed.ogg',
+"armor" = 'modular_citadel/sound/vox/armor.ogg',
+"armory" = 'modular_citadel/sound/vox/armory.ogg',
+"arrest" = 'modular_citadel/sound/vox/arrest.ogg',
+"ass" = 'modular_citadel/sound/vox/ass.ogg',
+"at" = 'modular_citadel/sound/vox/at.ogg',
+"atomic" = 'modular_citadel/sound/vox/atomic.ogg',
+"attention" = 'modular_citadel/sound/vox/attention.ogg',
+"authorize" = 'modular_citadel/sound/vox/authorize.ogg',
+"authorized" = 'modular_citadel/sound/vox/authorized.ogg',
+"automatic" = 'modular_citadel/sound/vox/automatic.ogg',
+"away" = 'modular_citadel/sound/vox/away.ogg',
+"b" = 'modular_citadel/sound/vox/b.ogg',
+"back" = 'modular_citadel/sound/vox/back.ogg',
+"backman" = 'modular_citadel/sound/vox/backman.ogg',
+"bad" = 'modular_citadel/sound/vox/bad.ogg',
+"bag" = 'modular_citadel/sound/vox/bag.ogg',
+"bailey" = 'modular_citadel/sound/vox/bailey.ogg',
+"barracks" = 'modular_citadel/sound/vox/barracks.ogg',
+"base" = 'modular_citadel/sound/vox/base.ogg',
+"bay" = 'modular_citadel/sound/vox/bay.ogg',
+"be" = 'modular_citadel/sound/vox/be.ogg',
+"been" = 'modular_citadel/sound/vox/been.ogg',
+"before" = 'modular_citadel/sound/vox/before.ogg',
+"beyond" = 'modular_citadel/sound/vox/beyond.ogg',
+"biohazard" = 'modular_citadel/sound/vox/biohazard.ogg',
+"biological" = 'modular_citadel/sound/vox/biological.ogg',
+"birdwell" = 'modular_citadel/sound/vox/birdwell.ogg',
+"bizwarn" = 'modular_citadel/sound/vox/bizwarn.ogg',
+"black" = 'modular_citadel/sound/vox/black.ogg',
+"blast" = 'modular_citadel/sound/vox/blast.ogg',
+"blocked" = 'modular_citadel/sound/vox/blocked.ogg',
+"bloop" = 'modular_citadel/sound/vox/bloop.ogg',
+"blue" = 'modular_citadel/sound/vox/blue.ogg',
+"bottom" = 'modular_citadel/sound/vox/bottom.ogg',
+"bravo" = 'modular_citadel/sound/vox/bravo.ogg',
+"breach" = 'modular_citadel/sound/vox/breach.ogg',
+"breached" = 'modular_citadel/sound/vox/breached.ogg',
+"break" = 'modular_citadel/sound/vox/break.ogg',
+"bridge" = 'modular_citadel/sound/vox/bridge.ogg',
+"bust" = 'modular_citadel/sound/vox/bust.ogg',
+"but" = 'modular_citadel/sound/vox/but.ogg',
+"button" = 'modular_citadel/sound/vox/button.ogg',
+"buzwarn" = 'modular_citadel/sound/vox/buzwarn.ogg',
+"bypass" = 'modular_citadel/sound/vox/bypass.ogg',
+"c" = 'modular_citadel/sound/vox/c.ogg',
+"cable" = 'modular_citadel/sound/vox/cable.ogg',
+"call" = 'modular_citadel/sound/vox/call.ogg',
+"called" = 'modular_citadel/sound/vox/called.ogg',
+"canal" = 'modular_citadel/sound/vox/canal.ogg',
+"cap" = 'modular_citadel/sound/vox/cap.ogg',
+"captain" = 'modular_citadel/sound/vox/captain.ogg',
+"capture" = 'modular_citadel/sound/vox/capture.ogg',
+"captured" = 'modular_citadel/sound/vox/captured.ogg',
+"ceiling" = 'modular_citadel/sound/vox/ceiling.ogg',
+"celsius" = 'modular_citadel/sound/vox/celsius.ogg',
+"center" = 'modular_citadel/sound/vox/center.ogg',
+"centi" = 'modular_citadel/sound/vox/centi.ogg',
+"central" = 'modular_citadel/sound/vox/central.ogg',
+"chamber" = 'modular_citadel/sound/vox/chamber.ogg',
+"charlie" = 'modular_citadel/sound/vox/charlie.ogg',
+"check" = 'modular_citadel/sound/vox/check.ogg',
+"checkpoint" = 'modular_citadel/sound/vox/checkpoint.ogg',
+"chemical" = 'modular_citadel/sound/vox/chemical.ogg',
+"cleanup" = 'modular_citadel/sound/vox/cleanup.ogg',
+"clear" = 'modular_citadel/sound/vox/clear.ogg',
+"clearance" = 'modular_citadel/sound/vox/clearance.ogg',
+"close" = 'modular_citadel/sound/vox/close.ogg',
+"clown" = 'modular_citadel/sound/vox/clown.ogg',
+"code" = 'modular_citadel/sound/vox/code.ogg',
+"coded" = 'modular_citadel/sound/vox/coded.ogg',
+"collider" = 'modular_citadel/sound/vox/collider.ogg',
+"command" = 'modular_citadel/sound/vox/command.ogg',
+"communication" = 'modular_citadel/sound/vox/communication.ogg',
+"complex" = 'modular_citadel/sound/vox/complex.ogg',
+"computer" = 'modular_citadel/sound/vox/computer.ogg',
+"condition" = 'modular_citadel/sound/vox/condition.ogg',
+"containment" = 'modular_citadel/sound/vox/containment.ogg',
+"contamination" = 'modular_citadel/sound/vox/contamination.ogg',
+"control" = 'modular_citadel/sound/vox/control.ogg',
+"coolant" = 'modular_citadel/sound/vox/coolant.ogg',
+"coomer" = 'modular_citadel/sound/vox/coomer.ogg',
+"core" = 'modular_citadel/sound/vox/core.ogg',
+"correct" = 'modular_citadel/sound/vox/correct.ogg',
+"corridor" = 'modular_citadel/sound/vox/corridor.ogg',
+"crew" = 'modular_citadel/sound/vox/crew.ogg',
+"cross" = 'modular_citadel/sound/vox/cross.ogg',
+"cryogenic" = 'modular_citadel/sound/vox/cryogenic.ogg',
+"d" = 'modular_citadel/sound/vox/d.ogg',
+"dadeda" = 'modular_citadel/sound/vox/dadeda.ogg',
+"damage" = 'modular_citadel/sound/vox/damage.ogg',
+"damaged" = 'modular_citadel/sound/vox/damaged.ogg',
+"danger" = 'modular_citadel/sound/vox/danger.ogg',
+"day" = 'modular_citadel/sound/vox/day.ogg',
+"deactivated" = 'modular_citadel/sound/vox/deactivated.ogg',
+"decompression" = 'modular_citadel/sound/vox/decompression.ogg',
+"decontamination" = 'modular_citadel/sound/vox/decontamination.ogg',
+"deeoo" = 'modular_citadel/sound/vox/deeoo.ogg',
+"defense" = 'modular_citadel/sound/vox/defense.ogg',
+"degrees" = 'modular_citadel/sound/vox/degrees.ogg',
+"delta" = 'modular_citadel/sound/vox/delta.ogg',
+"denied" = 'modular_citadel/sound/vox/denied.ogg',
+"deploy" = 'modular_citadel/sound/vox/deploy.ogg',
+"deployed" = 'modular_citadel/sound/vox/deployed.ogg',
+"destroy" = 'modular_citadel/sound/vox/destroy.ogg',
+"destroyed" = 'modular_citadel/sound/vox/destroyed.ogg',
+"detain" = 'modular_citadel/sound/vox/detain.ogg',
+"detected" = 'modular_citadel/sound/vox/detected.ogg',
+"detonation" = 'modular_citadel/sound/vox/detonation.ogg',
+"device" = 'modular_citadel/sound/vox/device.ogg',
+"did" = 'modular_citadel/sound/vox/did.ogg',
+"die" = 'modular_citadel/sound/vox/die.ogg',
+"dimensional" = 'modular_citadel/sound/vox/dimensional.ogg',
+"dirt" = 'modular_citadel/sound/vox/dirt.ogg',
+"disengaged" = 'modular_citadel/sound/vox/disengaged.ogg',
+"dish" = 'modular_citadel/sound/vox/dish.ogg',
+"disposal" = 'modular_citadel/sound/vox/disposal.ogg',
+"distance" = 'modular_citadel/sound/vox/distance.ogg',
+"distortion" = 'modular_citadel/sound/vox/distortion.ogg',
+"do" = 'modular_citadel/sound/vox/do.ogg',
+"doctor" = 'modular_citadel/sound/vox/doctor.ogg',
+"doop" = 'modular_citadel/sound/vox/doop.ogg',
+"door" = 'modular_citadel/sound/vox/door.ogg',
+"down" = 'modular_citadel/sound/vox/down.ogg',
+"dual" = 'modular_citadel/sound/vox/dual.ogg',
+"duct" = 'modular_citadel/sound/vox/duct.ogg',
+"e" = 'modular_citadel/sound/vox/e.ogg',
+"east" = 'modular_citadel/sound/vox/east.ogg',
+"echo" = 'modular_citadel/sound/vox/echo.ogg',
+"ed" = 'modular_citadel/sound/vox/ed.ogg',
+"effect" = 'modular_citadel/sound/vox/effect.ogg',
+"egress" = 'modular_citadel/sound/vox/egress.ogg',
+"eight" = 'modular_citadel/sound/vox/eight.ogg',
+"eighteen" = 'modular_citadel/sound/vox/eighteen.ogg',
+"eighty" = 'modular_citadel/sound/vox/eighty.ogg',
+"electric" = 'modular_citadel/sound/vox/electric.ogg',
+"electromagnetic" = 'modular_citadel/sound/vox/electromagnetic.ogg',
+"elevator" = 'modular_citadel/sound/vox/elevator.ogg',
+"eleven" = 'modular_citadel/sound/vox/eleven.ogg',
+"eliminate" = 'modular_citadel/sound/vox/eliminate.ogg',
+"emergency" = 'modular_citadel/sound/vox/emergency.ogg',
+"enemy" = 'modular_citadel/sound/vox/enemy.ogg',
+"energy" = 'modular_citadel/sound/vox/energy.ogg',
+"engage" = 'modular_citadel/sound/vox/engage.ogg',
+"engaged" = 'modular_citadel/sound/vox/engaged.ogg',
+"engine" = 'modular_citadel/sound/vox/engine.ogg',
+"enter" = 'modular_citadel/sound/vox/enter.ogg',
+"entry" = 'modular_citadel/sound/vox/entry.ogg',
+"environment" = 'modular_citadel/sound/vox/environment.ogg',
+"error" = 'modular_citadel/sound/vox/error.ogg',
+"escape" = 'modular_citadel/sound/vox/escape.ogg',
+"evacuate" = 'modular_citadel/sound/vox/evacuate.ogg',
+"exchange" = 'modular_citadel/sound/vox/exchange.ogg',
+"exit" = 'modular_citadel/sound/vox/exit.ogg',
+"expect" = 'modular_citadel/sound/vox/expect.ogg',
+"experiment" = 'modular_citadel/sound/vox/experiment.ogg',
+"experimental" = 'modular_citadel/sound/vox/experimental.ogg',
+"explode" = 'modular_citadel/sound/vox/explode.ogg',
+"explosion" = 'modular_citadel/sound/vox/explosion.ogg',
+"exposure" = 'modular_citadel/sound/vox/exposure.ogg',
+"exterminate" = 'modular_citadel/sound/vox/exterminate.ogg',
+"extinguish" = 'modular_citadel/sound/vox/extinguish.ogg',
+"extinguisher" = 'modular_citadel/sound/vox/extinguisher.ogg',
+"extreme" = 'modular_citadel/sound/vox/extreme.ogg',
+"f" = 'modular_citadel/sound/vox/f.ogg',
+"face" = 'modular_citadel/sound/vox/face.ogg',
+"facility" = 'modular_citadel/sound/vox/facility.ogg',
+"fahrenheit" = 'modular_citadel/sound/vox/fahrenheit.ogg',
+"failed" = 'modular_citadel/sound/vox/failed.ogg',
+"failure" = 'modular_citadel/sound/vox/failure.ogg',
+"farthest" = 'modular_citadel/sound/vox/farthest.ogg',
+"fast" = 'modular_citadel/sound/vox/fast.ogg',
+"feet" = 'modular_citadel/sound/vox/feet.ogg',
+"field" = 'modular_citadel/sound/vox/field.ogg',
+"fifteen" = 'modular_citadel/sound/vox/fifteen.ogg',
+"fifth" = 'modular_citadel/sound/vox/fifth.ogg',
+"fifty" = 'modular_citadel/sound/vox/fifty.ogg',
+"final" = 'modular_citadel/sound/vox/final.ogg',
+"fine" = 'modular_citadel/sound/vox/fine.ogg',
+"fire" = 'modular_citadel/sound/vox/fire.ogg',
+"first" = 'modular_citadel/sound/vox/first.ogg',
+"five" = 'modular_citadel/sound/vox/five.ogg',
+"flag" = 'modular_citadel/sound/vox/flag.ogg',
+"flooding" = 'modular_citadel/sound/vox/flooding.ogg',
+"floor" = 'modular_citadel/sound/vox/floor.ogg',
+"fool" = 'modular_citadel/sound/vox/fool.ogg',
+"for" = 'modular_citadel/sound/vox/for.ogg',
+"forbidden" = 'modular_citadel/sound/vox/forbidden.ogg',
+"force" = 'modular_citadel/sound/vox/force.ogg',
+"forms" = 'modular_citadel/sound/vox/forms.ogg',
+"found" = 'modular_citadel/sound/vox/found.ogg',
+"four" = 'modular_citadel/sound/vox/four.ogg',
+"fourteen" = 'modular_citadel/sound/vox/fourteen.ogg',
+"fourth" = 'modular_citadel/sound/vox/fourth.ogg',
+"fourty" = 'modular_citadel/sound/vox/fourty.ogg',
+"foxtrot" = 'modular_citadel/sound/vox/foxtrot.ogg',
+"freeman" = 'modular_citadel/sound/vox/freeman.ogg',
+"freezer" = 'modular_citadel/sound/vox/freezer.ogg',
+"from" = 'modular_citadel/sound/vox/from.ogg',
+"front" = 'modular_citadel/sound/vox/front.ogg',
+"fuel" = 'modular_citadel/sound/vox/fuel.ogg',
+"g" = 'modular_citadel/sound/vox/g.ogg',
+"gay" = 'modular_citadel/sound/vox/gay.ogg',
+"get" = 'modular_citadel/sound/vox/get.ogg',
+"go" = 'modular_citadel/sound/vox/go.ogg',
+"going" = 'modular_citadel/sound/vox/going.ogg',
+"good" = 'modular_citadel/sound/vox/good.ogg',
+"goodbye" = 'modular_citadel/sound/vox/goodbye.ogg',
+"gordon" = 'modular_citadel/sound/vox/gordon.ogg',
+"got" = 'modular_citadel/sound/vox/got.ogg',
+"government" = 'modular_citadel/sound/vox/government.ogg',
+"granted" = 'modular_citadel/sound/vox/granted.ogg',
+"great" = 'modular_citadel/sound/vox/great.ogg',
+"green" = 'modular_citadel/sound/vox/green.ogg',
+"grenade" = 'modular_citadel/sound/vox/grenade.ogg',
+"guard" = 'modular_citadel/sound/vox/guard.ogg',
+"gulf" = 'modular_citadel/sound/vox/gulf.ogg',
+"gun" = 'modular_citadel/sound/vox/gun.ogg',
+"guthrie" = 'modular_citadel/sound/vox/guthrie.ogg',
+"handling" = 'modular_citadel/sound/vox/handling.ogg',
+"hangar" = 'modular_citadel/sound/vox/hangar.ogg',
+"has" = 'modular_citadel/sound/vox/has.ogg',
+"have" = 'modular_citadel/sound/vox/have.ogg',
+"hazard" = 'modular_citadel/sound/vox/hazard.ogg',
+"head" = 'modular_citadel/sound/vox/head.ogg',
+"health" = 'modular_citadel/sound/vox/health.ogg',
+"heat" = 'modular_citadel/sound/vox/heat.ogg',
+"helicopter" = 'modular_citadel/sound/vox/helicopter.ogg',
+"helium" = 'modular_citadel/sound/vox/helium.ogg',
+"hello" = 'modular_citadel/sound/vox/hello.ogg',
+"help" = 'modular_citadel/sound/vox/help.ogg',
+"here" = 'modular_citadel/sound/vox/here.ogg',
+"hide" = 'modular_citadel/sound/vox/hide.ogg',
+"high" = 'modular_citadel/sound/vox/high.ogg',
+"highest" = 'modular_citadel/sound/vox/highest.ogg',
+"hit" = 'modular_citadel/sound/vox/hit.ogg',
+"holds" = 'modular_citadel/sound/vox/holds.ogg',
+"hole" = 'modular_citadel/sound/vox/hole.ogg',
+"hostile" = 'modular_citadel/sound/vox/hostile.ogg',
+"hot" = 'modular_citadel/sound/vox/hot.ogg',
+"hotel" = 'modular_citadel/sound/vox/hotel.ogg',
+"hour" = 'modular_citadel/sound/vox/hour.ogg',
+"hours" = 'modular_citadel/sound/vox/hours.ogg',
+"hundred" = 'modular_citadel/sound/vox/hundred.ogg',
+"hydro" = 'modular_citadel/sound/vox/hydro.ogg',
+"i" = 'modular_citadel/sound/vox/i.ogg',
+"idiot" = 'modular_citadel/sound/vox/idiot.ogg',
+"illegal" = 'modular_citadel/sound/vox/illegal.ogg',
+"immediate" = 'modular_citadel/sound/vox/immediate.ogg',
+"immediately" = 'modular_citadel/sound/vox/immediately.ogg',
+"in" = 'modular_citadel/sound/vox/in.ogg',
+"inches" = 'modular_citadel/sound/vox/inches.ogg',
+"india" = 'modular_citadel/sound/vox/india.ogg',
+"ing" = 'modular_citadel/sound/vox/ing.ogg',
+"inoperative" = 'modular_citadel/sound/vox/inoperative.ogg',
+"inside" = 'modular_citadel/sound/vox/inside.ogg',
+"inspection" = 'modular_citadel/sound/vox/inspection.ogg',
+"inspector" = 'modular_citadel/sound/vox/inspector.ogg',
+"interchange" = 'modular_citadel/sound/vox/interchange.ogg',
+"intruder" = 'modular_citadel/sound/vox/intruder.ogg',
+"invallid" = 'modular_citadel/sound/vox/invallid.ogg',
+"invasion" = 'modular_citadel/sound/vox/invasion.ogg',
+"is" = 'modular_citadel/sound/vox/is.ogg',
+"it" = 'modular_citadel/sound/vox/it.ogg',
+"johnson" = 'modular_citadel/sound/vox/johnson.ogg',
+"juliet" = 'modular_citadel/sound/vox/juliet.ogg',
+"key" = 'modular_citadel/sound/vox/key.ogg',
+"kill" = 'modular_citadel/sound/vox/kill.ogg',
+"kilo" = 'modular_citadel/sound/vox/kilo.ogg',
+"kit" = 'modular_citadel/sound/vox/kit.ogg',
+"lab" = 'modular_citadel/sound/vox/lab.ogg',
+"lambda" = 'modular_citadel/sound/vox/lambda.ogg',
+"laser" = 'modular_citadel/sound/vox/laser.ogg',
+"last" = 'modular_citadel/sound/vox/last.ogg',
+"launch" = 'modular_citadel/sound/vox/launch.ogg',
+"leak" = 'modular_citadel/sound/vox/leak.ogg',
+"leave" = 'modular_citadel/sound/vox/leave.ogg',
+"left" = 'modular_citadel/sound/vox/left.ogg',
+"legal" = 'modular_citadel/sound/vox/legal.ogg',
+"level" = 'modular_citadel/sound/vox/level.ogg',
+"lever" = 'modular_citadel/sound/vox/lever.ogg',
+"lie" = 'modular_citadel/sound/vox/lie.ogg',
+"lieutenant" = 'modular_citadel/sound/vox/lieutenant.ogg',
+"life" = 'modular_citadel/sound/vox/life.ogg',
+"light" = 'modular_citadel/sound/vox/light.ogg',
+"lima" = 'modular_citadel/sound/vox/lima.ogg',
+"liquid" = 'modular_citadel/sound/vox/liquid.ogg',
+"loading" = 'modular_citadel/sound/vox/loading.ogg',
+"locate" = 'modular_citadel/sound/vox/locate.ogg',
+"located" = 'modular_citadel/sound/vox/located.ogg',
+"location" = 'modular_citadel/sound/vox/location.ogg',
+"lock" = 'modular_citadel/sound/vox/lock.ogg',
+"locked" = 'modular_citadel/sound/vox/locked.ogg',
+"locker" = 'modular_citadel/sound/vox/locker.ogg',
+"lockout" = 'modular_citadel/sound/vox/lockout.ogg',
+"lower" = 'modular_citadel/sound/vox/lower.ogg',
+"lowest" = 'modular_citadel/sound/vox/lowest.ogg',
+"magnetic" = 'modular_citadel/sound/vox/magnetic.ogg',
+"main" = 'modular_citadel/sound/vox/main.ogg',
+"maintenance" = 'modular_citadel/sound/vox/maintenance.ogg',
+"malfunction" = 'modular_citadel/sound/vox/malfunction.ogg',
+"man" = 'modular_citadel/sound/vox/man.ogg',
+"mass" = 'modular_citadel/sound/vox/mass.ogg',
+"materials" = 'modular_citadel/sound/vox/materials.ogg',
+"maximum" = 'modular_citadel/sound/vox/maximum.ogg',
+"may" = 'modular_citadel/sound/vox/may.ogg',
+"med" = 'modular_citadel/sound/vox/med.ogg',
+"medical" = 'modular_citadel/sound/vox/medical.ogg',
+"men" = 'modular_citadel/sound/vox/men.ogg',
+"mercy" = 'modular_citadel/sound/vox/mercy.ogg',
+"mesa" = 'modular_citadel/sound/vox/mesa.ogg',
+"message" = 'modular_citadel/sound/vox/message.ogg',
+"meter" = 'modular_citadel/sound/vox/meter.ogg',
+"micro" = 'modular_citadel/sound/vox/micro.ogg',
+"middle" = 'modular_citadel/sound/vox/middle.ogg',
+"mike" = 'modular_citadel/sound/vox/mike.ogg',
+"miles" = 'modular_citadel/sound/vox/miles.ogg',
+"military" = 'modular_citadel/sound/vox/military.ogg',
+"milli" = 'modular_citadel/sound/vox/milli.ogg',
+"million" = 'modular_citadel/sound/vox/million.ogg',
+"minefield" = 'modular_citadel/sound/vox/minefield.ogg',
+"minimum" = 'modular_citadel/sound/vox/minimum.ogg',
+"minutes" = 'modular_citadel/sound/vox/minutes.ogg',
+"mister" = 'modular_citadel/sound/vox/mister.ogg',
+"mode" = 'modular_citadel/sound/vox/mode.ogg',
+"motor" = 'modular_citadel/sound/vox/motor.ogg',
+"motorpool" = 'modular_citadel/sound/vox/motorpool.ogg',
+"move" = 'modular_citadel/sound/vox/move.ogg',
+"must" = 'modular_citadel/sound/vox/must.ogg',
+"nearest" = 'modular_citadel/sound/vox/nearest.ogg',
+"nice" = 'modular_citadel/sound/vox/nice.ogg',
+"nine" = 'modular_citadel/sound/vox/nine.ogg',
+"nineteen" = 'modular_citadel/sound/vox/nineteen.ogg',
+"ninety" = 'modular_citadel/sound/vox/ninety.ogg',
+"no" = 'modular_citadel/sound/vox/no.ogg',
+"nominal" = 'modular_citadel/sound/vox/nominal.ogg',
+"north" = 'modular_citadel/sound/vox/north.ogg',
+"not" = 'modular_citadel/sound/vox/not.ogg',
+"november" = 'modular_citadel/sound/vox/november.ogg',
+"now" = 'modular_citadel/sound/vox/now.ogg',
+"number" = 'modular_citadel/sound/vox/number.ogg',
+"objective" = 'modular_citadel/sound/vox/objective.ogg',
+"observation" = 'modular_citadel/sound/vox/observation.ogg',
+"of" = 'modular_citadel/sound/vox/of.ogg',
+"officer" = 'modular_citadel/sound/vox/officer.ogg',
+"ok" = 'modular_citadel/sound/vox/ok.ogg',
+"on" = 'modular_citadel/sound/vox/on.ogg',
+"one" = 'modular_citadel/sound/vox/one.ogg',
+"open" = 'modular_citadel/sound/vox/open.ogg',
+"operating" = 'modular_citadel/sound/vox/operating.ogg',
+"operations" = 'modular_citadel/sound/vox/operations.ogg',
+"operative" = 'modular_citadel/sound/vox/operative.ogg',
+"option" = 'modular_citadel/sound/vox/option.ogg',
+"order" = 'modular_citadel/sound/vox/order.ogg',
+"organic" = 'modular_citadel/sound/vox/organic.ogg',
+"oscar" = 'modular_citadel/sound/vox/oscar.ogg',
+"out" = 'modular_citadel/sound/vox/out.ogg',
+"outside" = 'modular_citadel/sound/vox/outside.ogg',
+"over" = 'modular_citadel/sound/vox/over.ogg',
+"overload" = 'modular_citadel/sound/vox/overload.ogg',
+"override" = 'modular_citadel/sound/vox/override.ogg',
+"pacify" = 'modular_citadel/sound/vox/pacify.ogg',
+"pain" = 'modular_citadel/sound/vox/pain.ogg',
+"pal" = 'modular_citadel/sound/vox/pal.ogg',
+"panel" = 'modular_citadel/sound/vox/panel.ogg',
+"percent" = 'modular_citadel/sound/vox/percent.ogg',
+"perimeter" = 'modular_citadel/sound/vox/perimeter.ogg',
+"permitted" = 'modular_citadel/sound/vox/permitted.ogg',
+"personnel" = 'modular_citadel/sound/vox/personnel.ogg',
+"pipe" = 'modular_citadel/sound/vox/pipe.ogg',
+"plant" = 'modular_citadel/sound/vox/plant.ogg',
+"platform" = 'modular_citadel/sound/vox/platform.ogg',
+"please" = 'modular_citadel/sound/vox/please.ogg',
+"point" = 'modular_citadel/sound/vox/point.ogg',
+"portal" = 'modular_citadel/sound/vox/portal.ogg',
+"power" = 'modular_citadel/sound/vox/power.ogg',
+"presence" = 'modular_citadel/sound/vox/presence.ogg',
+"press" = 'modular_citadel/sound/vox/press.ogg',
+"primary" = 'modular_citadel/sound/vox/primary.ogg',
+"proceed" = 'modular_citadel/sound/vox/proceed.ogg',
+"processing" = 'modular_citadel/sound/vox/processing.ogg',
+"progress" = 'modular_citadel/sound/vox/progress.ogg',
+"proper" = 'modular_citadel/sound/vox/proper.ogg',
+"propulsion" = 'modular_citadel/sound/vox/propulsion.ogg',
+"prosecute" = 'modular_citadel/sound/vox/prosecute.ogg',
+"protective" = 'modular_citadel/sound/vox/protective.ogg',
+"push" = 'modular_citadel/sound/vox/push.ogg',
+"quantum" = 'modular_citadel/sound/vox/quantum.ogg',
+"quebec" = 'modular_citadel/sound/vox/quebec.ogg',
+"question" = 'modular_citadel/sound/vox/question.ogg',
+"questioning" = 'modular_citadel/sound/vox/questioning.ogg',
+"quick" = 'modular_citadel/sound/vox/quick.ogg',
+"quit" = 'modular_citadel/sound/vox/quit.ogg',
+"radiation" = 'modular_citadel/sound/vox/radiation.ogg',
+"radioactive" = 'modular_citadel/sound/vox/radioactive.ogg',
+"rads" = 'modular_citadel/sound/vox/rads.ogg',
+"rapid" = 'modular_citadel/sound/vox/rapid.ogg',
+"reach" = 'modular_citadel/sound/vox/reach.ogg',
+"reached" = 'modular_citadel/sound/vox/reached.ogg',
+"reactor" = 'modular_citadel/sound/vox/reactor.ogg',
+"red" = 'modular_citadel/sound/vox/red.ogg',
+"relay" = 'modular_citadel/sound/vox/relay.ogg',
+"released" = 'modular_citadel/sound/vox/released.ogg',
+"remaining" = 'modular_citadel/sound/vox/remaining.ogg',
+"renegade" = 'modular_citadel/sound/vox/renegade.ogg',
+"repair" = 'modular_citadel/sound/vox/repair.ogg',
+"report" = 'modular_citadel/sound/vox/report.ogg',
+"reports" = 'modular_citadel/sound/vox/reports.ogg',
+"required" = 'modular_citadel/sound/vox/required.ogg',
+"research" = 'modular_citadel/sound/vox/research.ogg',
+"reset" = 'modular_citadel/sound/vox/reset.ogg',
+"resevoir" = 'modular_citadel/sound/vox/resevoir.ogg',
+"resistance" = 'modular_citadel/sound/vox/resistance.ogg',
+"returned" = 'modular_citadel/sound/vox/returned.ogg',
+"right" = 'modular_citadel/sound/vox/right.ogg',
+"rocket" = 'modular_citadel/sound/vox/rocket.ogg',
+"roger" = 'modular_citadel/sound/vox/roger.ogg',
+"romeo" = 'modular_citadel/sound/vox/romeo.ogg',
+"room" = 'modular_citadel/sound/vox/room.ogg',
+"round" = 'modular_citadel/sound/vox/round.ogg',
+"run" = 'modular_citadel/sound/vox/run.ogg',
+"safe" = 'modular_citadel/sound/vox/safe.ogg',
+"safety" = 'modular_citadel/sound/vox/safety.ogg',
+"sargeant" = 'modular_citadel/sound/vox/sargeant.ogg',
+"satellite" = 'modular_citadel/sound/vox/satellite.ogg',
+"save" = 'modular_citadel/sound/vox/save.ogg',
+"science" = 'modular_citadel/sound/vox/science.ogg',
+"scores" = 'modular_citadel/sound/vox/scores.ogg',
+"scream" = 'modular_citadel/sound/vox/scream.ogg',
+"screen" = 'modular_citadel/sound/vox/screen.ogg',
+"search" = 'modular_citadel/sound/vox/search.ogg',
+"second" = 'modular_citadel/sound/vox/second.ogg',
+"secondary" = 'modular_citadel/sound/vox/secondary.ogg',
+"seconds" = 'modular_citadel/sound/vox/seconds.ogg',
+"sector" = 'modular_citadel/sound/vox/sector.ogg',
+"secure" = 'modular_citadel/sound/vox/secure.ogg',
+"secured" = 'modular_citadel/sound/vox/secured.ogg',
+"security" = 'modular_citadel/sound/vox/security.ogg',
+"select" = 'modular_citadel/sound/vox/select.ogg',
+"selected" = 'modular_citadel/sound/vox/selected.ogg',
+"service" = 'modular_citadel/sound/vox/service.ogg',
+"seven" = 'modular_citadel/sound/vox/seven.ogg',
+"seventeen" = 'modular_citadel/sound/vox/seventeen.ogg',
+"seventy" = 'modular_citadel/sound/vox/seventy.ogg',
+"severe" = 'modular_citadel/sound/vox/severe.ogg',
+"sewage" = 'modular_citadel/sound/vox/sewage.ogg',
+"sewer" = 'modular_citadel/sound/vox/sewer.ogg',
+"shield" = 'modular_citadel/sound/vox/shield.ogg',
+"shipment" = 'modular_citadel/sound/vox/shipment.ogg',
+"shock" = 'modular_citadel/sound/vox/shock.ogg',
+"shoot" = 'modular_citadel/sound/vox/shoot.ogg',
+"shower" = 'modular_citadel/sound/vox/shower.ogg',
+"shut" = 'modular_citadel/sound/vox/shut.ogg',
+"side" = 'modular_citadel/sound/vox/side.ogg',
+"sierra" = 'modular_citadel/sound/vox/sierra.ogg',
+"sight" = 'modular_citadel/sound/vox/sight.ogg',
+"silo" = 'modular_citadel/sound/vox/silo.ogg',
+"six" = 'modular_citadel/sound/vox/six.ogg',
+"sixteen" = 'modular_citadel/sound/vox/sixteen.ogg',
+"sixty" = 'modular_citadel/sound/vox/sixty.ogg',
+"slime" = 'modular_citadel/sound/vox/slime.ogg',
+"slow" = 'modular_citadel/sound/vox/slow.ogg',
+"soldier" = 'modular_citadel/sound/vox/soldier.ogg',
+"some" = 'modular_citadel/sound/vox/some.ogg',
+"someone" = 'modular_citadel/sound/vox/someone.ogg',
+"something" = 'modular_citadel/sound/vox/something.ogg',
+"son" = 'modular_citadel/sound/vox/son.ogg',
+"sorry" = 'modular_citadel/sound/vox/sorry.ogg',
+"south" = 'modular_citadel/sound/vox/south.ogg',
+"squad" = 'modular_citadel/sound/vox/squad.ogg',
+"square" = 'modular_citadel/sound/vox/square.ogg',
+"stairway" = 'modular_citadel/sound/vox/stairway.ogg',
+"status" = 'modular_citadel/sound/vox/status.ogg',
+"sterile" = 'modular_citadel/sound/vox/sterile.ogg',
+"sterilization" = 'modular_citadel/sound/vox/sterilization.ogg',
+"stolen" = 'modular_citadel/sound/vox/stolen.ogg',
+"storage" = 'modular_citadel/sound/vox/storage.ogg',
+"sub" = 'modular_citadel/sound/vox/sub.ogg',
+"subsurface" = 'modular_citadel/sound/vox/subsurface.ogg',
+"sudden" = 'modular_citadel/sound/vox/sudden.ogg',
+"suit" = 'modular_citadel/sound/vox/suit.ogg',
+"superconducting" = 'modular_citadel/sound/vox/superconducting.ogg',
+"supercooled" = 'modular_citadel/sound/vox/supercooled.ogg',
+"supply" = 'modular_citadel/sound/vox/supply.ogg',
+"surface" = 'modular_citadel/sound/vox/surface.ogg',
+"surrender" = 'modular_citadel/sound/vox/surrender.ogg',
+"surround" = 'modular_citadel/sound/vox/surround.ogg',
+"surrounded" = 'modular_citadel/sound/vox/surrounded.ogg',
+"switch" = 'modular_citadel/sound/vox/switch.ogg',
+"system" = 'modular_citadel/sound/vox/system.ogg',
+"systems" = 'modular_citadel/sound/vox/systems.ogg',
+"tactical" = 'modular_citadel/sound/vox/tactical.ogg',
+"take" = 'modular_citadel/sound/vox/take.ogg',
+"talk" = 'modular_citadel/sound/vox/talk.ogg',
+"tango" = 'modular_citadel/sound/vox/tango.ogg',
+"tank" = 'modular_citadel/sound/vox/tank.ogg',
+"target" = 'modular_citadel/sound/vox/target.ogg',
+"team" = 'modular_citadel/sound/vox/team.ogg',
+"temperature" = 'modular_citadel/sound/vox/temperature.ogg',
+"temporal" = 'modular_citadel/sound/vox/temporal.ogg',
+"ten" = 'modular_citadel/sound/vox/ten.ogg',
+"terminal" = 'modular_citadel/sound/vox/terminal.ogg',
+"terminated" = 'modular_citadel/sound/vox/terminated.ogg',
+"termination" = 'modular_citadel/sound/vox/termination.ogg',
+"test" = 'modular_citadel/sound/vox/test.ogg',
+"that" = 'modular_citadel/sound/vox/that.ogg',
+"the" = 'modular_citadel/sound/vox/the.ogg',
+"then" = 'modular_citadel/sound/vox/then.ogg',
+"there" = 'modular_citadel/sound/vox/there.ogg',
+"third" = 'modular_citadel/sound/vox/third.ogg',
+"thirteen" = 'modular_citadel/sound/vox/thirteen.ogg',
+"thirty" = 'modular_citadel/sound/vox/thirty.ogg',
+"this" = 'modular_citadel/sound/vox/this.ogg',
+"those" = 'modular_citadel/sound/vox/those.ogg',
+"thousand" = 'modular_citadel/sound/vox/thousand.ogg',
+"threat" = 'modular_citadel/sound/vox/threat.ogg',
+"three" = 'modular_citadel/sound/vox/three.ogg',
+"through" = 'modular_citadel/sound/vox/through.ogg',
+"time" = 'modular_citadel/sound/vox/time.ogg',
+"to" = 'modular_citadel/sound/vox/to.ogg',
+"top" = 'modular_citadel/sound/vox/top.ogg',
+"topside" = 'modular_citadel/sound/vox/topside.ogg',
+"touch" = 'modular_citadel/sound/vox/touch.ogg',
+"towards" = 'modular_citadel/sound/vox/towards.ogg',
+"track" = 'modular_citadel/sound/vox/track.ogg',
+"train" = 'modular_citadel/sound/vox/train.ogg',
+"transportation" = 'modular_citadel/sound/vox/transportation.ogg',
+"truck" = 'modular_citadel/sound/vox/truck.ogg',
+"tunnel" = 'modular_citadel/sound/vox/tunnel.ogg',
+"turn" = 'modular_citadel/sound/vox/turn.ogg',
+"turret" = 'modular_citadel/sound/vox/turret.ogg',
+"twelve" = 'modular_citadel/sound/vox/twelve.ogg',
+"twenty" = 'modular_citadel/sound/vox/twenty.ogg',
+"two" = 'modular_citadel/sound/vox/two.ogg',
+"unauthorized" = 'modular_citadel/sound/vox/unauthorized.ogg',
+"under" = 'modular_citadel/sound/vox/under.ogg',
+"uniform" = 'modular_citadel/sound/vox/uniform.ogg',
+"unlocked" = 'modular_citadel/sound/vox/unlocked.ogg',
+"until" = 'modular_citadel/sound/vox/until.ogg',
+"up" = 'modular_citadel/sound/vox/up.ogg',
+"upper" = 'modular_citadel/sound/vox/upper.ogg',
+"uranium" = 'modular_citadel/sound/vox/uranium.ogg',
+"us" = 'modular_citadel/sound/vox/us.ogg',
+"usa" = 'modular_citadel/sound/vox/usa.ogg',
+"use" = 'modular_citadel/sound/vox/use.ogg',
+"used" = 'modular_citadel/sound/vox/used.ogg',
+"user" = 'modular_citadel/sound/vox/user.ogg',
+"vacate" = 'modular_citadel/sound/vox/vacate.ogg',
+"valid" = 'modular_citadel/sound/vox/valid.ogg',
+"vapor" = 'modular_citadel/sound/vox/vapor.ogg',
+"vent" = 'modular_citadel/sound/vox/vent.ogg',
+"ventillation" = 'modular_citadel/sound/vox/ventillation.ogg',
+"victor" = 'modular_citadel/sound/vox/victor.ogg',
+"violated" = 'modular_citadel/sound/vox/violated.ogg',
+"violation" = 'modular_citadel/sound/vox/violation.ogg',
+"voltage" = 'modular_citadel/sound/vox/voltage.ogg',
+"vox_login" = 'modular_citadel/sound/vox/vox_login.ogg',
+"walk" = 'modular_citadel/sound/vox/walk.ogg',
+"wall" = 'modular_citadel/sound/vox/wall.ogg',
+"want" = 'modular_citadel/sound/vox/want.ogg',
+"wanted" = 'modular_citadel/sound/vox/wanted.ogg',
+"warm" = 'modular_citadel/sound/vox/warm.ogg',
+"warn" = 'modular_citadel/sound/vox/warn.ogg',
+"warning" = 'modular_citadel/sound/vox/warning.ogg',
+"waste" = 'modular_citadel/sound/vox/waste.ogg',
+"water" = 'modular_citadel/sound/vox/water.ogg',
+"we" = 'modular_citadel/sound/vox/we.ogg',
+"weapon" = 'modular_citadel/sound/vox/weapon.ogg',
+"west" = 'modular_citadel/sound/vox/west.ogg',
+"whiskey" = 'modular_citadel/sound/vox/whiskey.ogg',
+"white" = 'modular_citadel/sound/vox/white.ogg',
+"wilco" = 'modular_citadel/sound/vox/wilco.ogg',
+"will" = 'modular_citadel/sound/vox/will.ogg',
+"with" = 'modular_citadel/sound/vox/with.ogg',
+"without" = 'modular_citadel/sound/vox/without.ogg',
+"woop" = 'modular_citadel/sound/vox/woop.ogg',
+"xeno" = 'modular_citadel/sound/vox/xeno.ogg',
+"yankee" = 'modular_citadel/sound/vox/yankee.ogg',
+"yards" = 'modular_citadel/sound/vox/yards.ogg',
+"year" = 'modular_citadel/sound/vox/year.ogg',
+"yellow" = 'modular_citadel/sound/vox/yellow.ogg',
+"yes" = 'modular_citadel/sound/vox/yes.ogg',
+"you" = 'modular_citadel/sound/vox/you.ogg',
+"your" = 'modular_citadel/sound/vox/your.ogg',
+"yourself" = 'modular_citadel/sound/vox/yourself.ogg',
+"zero" = 'modular_citadel/sound/vox/zero.ogg',
+"zone" = 'modular_citadel/sound/vox/zone.ogg',
+"zulu" = 'modular_citadel/sound/vox/zulu.ogg',))
+#endif
\ No newline at end of file
diff --git a/modular_citadel/code/modules/mob/living/status_procs.dm b/modular_citadel/code/modules/mob/living/status_procs.dm
deleted file mode 100644
index 851c7438a7..0000000000
--- a/modular_citadel/code/modules/mob/living/status_procs.dm
+++ /dev/null
@@ -1,10 +0,0 @@
-/mob/living/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) //Can't go below remaining duration
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown)
- if(absorb_stun(isnull(override_hardstun)? amount : override_hardstun, ignore_canknockdown))
- return
- var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
- if(K)
- K.duration = max(world.time + (isnull(override_hardstun)? amount : override_hardstun), K.duration)
- else if((amount || override_hardstun) > 0)
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating, override_hardstun, override_stamdmg)
- return K
diff --git a/modular_citadel/code/modules/projectiles/gun.dm b/modular_citadel/code/modules/projectiles/gun.dm
index ea8af7c74c..317f68b4c4 100644
--- a/modular_citadel/code/modules/projectiles/gun.dm
+++ b/modular_citadel/code/modules/projectiles/gun.dm
@@ -9,13 +9,3 @@
return 0
else
return ..()
-
-/obj/item/gun/proc/getinaccuracy(mob/living/user)
- if(!iscarbon(user))
- return 0
- else
- var/mob/living/carbon/holdingdude = user
- if(istype(holdingdude) && holdingdude.combatmode)
- return max((holdingdude.lastdirchange + weapon_weight * 25) - world.time,0)
- else
- return weapon_weight * 25
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm
deleted file mode 100644
index f70ec76f04..0000000000
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/flechette.dm
+++ /dev/null
@@ -1,117 +0,0 @@
-//////Flechette Launcher//////
-
-///projectiles///
-
-/obj/item/projectile/bullet/cflechetteap //shreds armor
- name = "flechette (armor piercing)"
- damage = 8
- armour_penetration = 80
-
-/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding
- name = "flechette (serrated)"
- damage = 15
- dismemberment = 10
- armour_penetration = -80
-
-/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && iscarbon(target))
- var/mob/living/carbon/C = target
- C.bleed(10)
- return ..()
-
-///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)///
-
-/obj/item/ammo_casing/caseless/flechetteap
- name = "flechette (armor piercing)"
- desc = "A flechette made with a tungsten alloy."
- projectile_type = /obj/item/projectile/bullet/cflechetteap
- caliber = "flechette"
- throwforce = 1
- throw_speed = 3
-
-/obj/item/ammo_casing/caseless/flechettes
- name = "flechette (serrated)"
- desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh."
- projectile_type = /obj/item/projectile/bullet/cflechettes
- caliber = "flechette"
- throwforce = 2
- throw_speed = 3
- embedding = list("embedded_pain_multiplier" = 0, "embed_chance" = 40, "embedded_fall_chance" = 10)
-
-///magazine///
-
-/obj/item/ammo_box/magazine/flechette
- name = "flechette magazine (armor piercing)"
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "flechettemag"
- ammo_type = /obj/item/ammo_casing/caseless/flechetteap
- caliber = "flechette"
- max_ammo = 40
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/flechette/s
- name = "flechette magazine (serrated)"
- ammo_type = /obj/item/ammo_casing/caseless/flechettes
-
-///the gun itself///
-
-/obj/item/gun/ballistic/automatic/flechette
- name = "\improper CX Flechette Launcher"
- desc = "A flechette launching machine pistol with an unconventional bullpup frame."
- icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "flechettegun"
- item_state = "gun"
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = 0
- /obj/item/firing_pin/implant/pindicate
- mag_type = /obj/item/ammo_box/magazine/flechette/
- fire_sound = 'sound/weapons/gunshot_smg.ogg'
- can_suppress = 0
- burst_size = 5
- fire_delay = 1
- casing_ejector = 0
- spread = 10
- recoil = 0.05
-
-/obj/item/gun/ballistic/automatic/flechette/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("flechettegun-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-///unique variant///
-
-/obj/item/projectile/bullet/cflechetteshredder
- name = "flechette (shredder)"
- damage = 5
- dismemberment = 40
-
-/obj/item/ammo_casing/caseless/flechetteshredder
- name = "flechette (shredder)"
- desc = "A serrated flechette made of a special alloy that forms a monofilament edge."
- projectile_type = /obj/item/projectile/bullet/cflechettes
-
-/obj/item/ammo_box/magazine/flechette/shredder
- name = "flechette magazine (shredder)"
- icon_state = "shreddermag"
- ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder
-
-/obj/item/gun/ballistic/automatic/flechette/shredder
- name = "\improper CX Shredder"
- desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
- w_class = WEIGHT_CLASS_SMALL
- mag_type = /obj/item/ammo_box/magazine/flechette/shredder
- spread = 15
- recoil = 0.1
-
-/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
- ..()
- if(magazine)
- cut_overlays()
- add_overlay("shreddergun-magazine")
- else
- cut_overlays()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
index b3af722332..70d3bee5af 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
@@ -86,7 +86,7 @@
/obj/item/ammo_box/magazine/mmag/small
name = "magpistol magazine (non-lethal disabler)"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "nlmagmag"
+ icon_state = "smallmagmag"
ammo_type = /obj/item/ammo_casing/caseless/anlmags
caliber = "mags"
max_ammo = 15
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
index 8d08937f55..8786eb6dc9 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
@@ -56,7 +56,7 @@
/obj/item/ammo_box/magazine/mmag_e/small
name = "magpistol magazine (non-lethal disabler)"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
- icon_state = "nlmagmag"
+ icon_state = "smallmagmag"
ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmags
caliber = "mag_e"
max_ammo = 16
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
index 3df77c4951..1e0e0afc87 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm
@@ -123,8 +123,8 @@
item_state = "gun"
w_class = WEIGHT_CLASS_NORMAL
slot_flags = 0
- /obj/item/firing_pin/implant/pindicate
- mag_type = /obj/item/ammo_box/magazine/flechette/
+ pin = /obj/item/firing_pin/implant/pindicate
+ mag_type = /obj/item/ammo_box/magazine/flechette
fire_sound = 'sound/weapons/gunshot_smg.ogg'
can_suppress = 0
burst_size = 5
@@ -134,12 +134,9 @@
recoil = 0.05
/obj/item/gun/ballistic/automatic/flechette/update_icon()
- ..()
+ cut_overlays()
if(magazine)
- cut_overlays()
add_overlay("flechettegun-magazine")
- else
- cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
///unique variant///
@@ -163,17 +160,13 @@
name = "\improper CX Shredder"
desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes."
w_class = WEIGHT_CLASS_SMALL
- mag_type = /obj/item/ammo_box/magazine/flechette/shredder
spread = 15
recoil = 0.1
/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon()
- ..()
+ cut_overlays()
if(magazine)
- cut_overlays()
add_overlay("shreddergun-magazine")
- else
- cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/*/////////////////////////////////////////////////////////////
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
index 8dd6ffdca2..3c387bee10 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
@@ -66,7 +66,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
startHunger = M.nutrition
if(pollStarted == FALSE)
pollStarted = TRUE
- candies = pollGhostCandidates("Do you want to play as a clone of [M], and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you and it will likely earn you a bwoink.")
+ candies = pollGhostCandidates("Do you want to play as a clone of [M], and do you agree to respect their character and act in a similar manner to them? Do not engage in ERP as them unless you have LOOC permission from them, and ensure it is permission from the original, not a clone.")
log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.")
if(20 to INFINITY)
if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there!
@@ -80,7 +80,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
M.dna.transfer_identity(SM)
SM.updateappearance(mutcolor_update=1)
var/mob/dead/observer/C = pick(candies)
- message_admins("Ghost candidate found! [C] is becoming a clone of [M] (They agreed to respect the character they're becoming. If they don't, then they agreed to a a bwoinking.) (Hee~!! Exciting!!)")
+ message_admins("Ghost candidate found! [C] key [C.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)")
SM.key = C.key
SM.mind.enslave_mind_to_creator(M)
@@ -92,10 +92,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
ZI.Insert(SM)
log_game("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone")
- to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself, or rather, your original self.")
+ to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with your original, a perfect clone of your origin.")
if(prob(50))
- to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original")
+ to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original.")
log_game("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.")
else
to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")
@@ -208,6 +208,64 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
if (M.nutrition < 1500)
M.nutrition += 500
+/datum/reagent/fermi/SDGF/reaction_mob(mob/living/carbon/human/M, method=TOUCH, reac_volume)
+ if(volume<5)
+ M.visible_message("The growth factor froths upon [M]'s body, failing to do anything of note.")
+ return
+ if(M.stat == DEAD)
+ if(M.suiciding || (HAS_TRAIT(M, TRAIT_NOCLONE)) || M.hellbound)
+ M.visible_message("The growth factor inertly sticks to [M]'s body, failing to do anything of note.")
+ return
+ if(!M.mind)
+ M.visible_message("The growth factor shudders, merging with [M]'s body, but is unable to replicate properly.")
+
+ var/bodydamage = (M.getBruteLoss() + M.getFireLoss())
+ var/typepath = M.type
+ volume =- 5
+
+ var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc)
+ var/mob/living/carbon/human/SM = fermi_Gclone
+ if(istype(SM) && istype(M))
+ SM.real_name = M.real_name
+ M.dna.transfer_identity(SM)
+ SM.updateappearance(mutcolor_update=1)
+ M.mind.transfer_to(SM)
+ M.visible_message("[M]'s body shudders, the growth factor rapidly splitting into a new clone of [M].")
+
+ if(bodydamage>50)
+ SM.adjustOxyLoss(-(bodydamage/10), 0)
+ SM.adjustToxLoss(-(bodydamage/10), 0)
+ SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/1.5
+ SM.adjustCloneLoss((bodydamage/10), 0)
+ SM.setBrainLoss((bodydamage/10))
+ SM.nutrition = 400
+ if(bodydamage>200)
+ SM.gain_trauma_type(BRAIN_TRAUMA_MILD)
+ if(bodydamage>300)
+ var/obj/item/bodypart/l_arm = SM.get_bodypart(BODY_ZONE_L_ARM) //We get the body parts we want this way.
+ var/obj/item/bodypart/r_arm = SM.get_bodypart(BODY_ZONE_R_ARM)
+ l_arm.drop_limb()
+ r_arm.drop_limb()
+ if(bodydamage>400)
+ var/obj/item/bodypart/l_leg = SM.get_bodypart(BODY_ZONE_L_LEG) //We get the body parts we want this way.
+ var/obj/item/bodypart/r_leg = SM.get_bodypart(BODY_ZONE_R_LEG)
+ l_leg.drop_limb()
+ r_leg.drop_limb()
+ if(bodydamage>500)
+ SM.gain_trauma_type(BRAIN_TRAUMA_SEVERE)
+ if(bodydamage>600)
+ var/datum/species/mutation = pick(subtypesof(/datum/species))
+ SM.set_species(mutation)
+
+ //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger.
+ SM.reagents.add_reagent("SDGFheal", volume)
+ M.reagents.remove_reagent(id, volume)
+
+ SM.updatehealth()
+ SM.emote("gasp")
+ log_combat(M, M, "SDGF clone-vived", src)
+ ..()
+
//Unobtainable, used in clone spawn.
/datum/reagent/fermi/SDGFheal
name = "synthetic-derived growth factor"
@@ -271,7 +329,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
if(86)//mean clone time!
if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.)
- message_admins("(non-infectious) Zombie spawned at [M.loc], produced by impure chem, wah!")
+ message_admins("(non-infectious) SDZF: Zombie spawned at [M] [COORD(M)]!")
M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE
M.next_move_modifier = 1
to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
index b7e9ac3268..d05cfb552e 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
@@ -52,10 +52,10 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
qdel(O)
-/datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment!
+/datum/reagent/fermi/astral/on_mob_life(mob/living/carbon/M) // Gives you the ability to astral project for a moment!
M.alpha = 255
- originalmind = M.mind
if(current_cycle == 0)
+ originalmind = M.mind
log_game("FERMICHEM: [M] ckey: [M.key] became an astral ghost")
origin = M
if (G == null)
@@ -64,7 +64,8 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
var/datum/action/chem/astral/AS = new(G)
AS.origin = M
AS.ghost = G
- M.mind.transfer_to(G)
+ if(M.mind)
+ M.mind.transfer_to(G)
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections")
if(overdosed)
if(prob(50))
@@ -77,23 +78,26 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
if(G.stat == DEAD || G.pseudo_death == TRUE)
G.mind.transfer_to(M)
qdel(G)
- else
- M.Sleeping(20, 0)
- M.reagents.remove_reagent(id, 2, FALSE)
..()
/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M)
if(!G)
+ if(M.mind)
+ var/mob/living/simple_animal/astral/G = new(get_turf(M.loc))
+ M.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
+ to_chat(G, "[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'")
+ log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!")
originalmind.transfer_to(M)
else if(G.mind)
G.mind.transfer_to(origin)
qdel(G)
if(overdosed)
- to_chat(M, "The high volume of Astrogren you just took causes you to black out momentarily as your mind snaps back to your body.")
+ to_chat(M, "The high volume of astrogen you just took causes you to black out momentarily as your mind snaps back to your body.")
M.Sleeping(sleepytime, 0)
antiGenetics = 255
if(G)//just in case
qdel(G)
+ log_game("FERMICHEM: [M] has astrally returned to their body!")
..()
//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 50-80 minutes to die from this.
@@ -119,6 +123,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
M.alpha--
antiGenetics--
ADD_TRAIT(M, TRAIT_NOCLONE, "astral") //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else.
+ M.hellbound = TRUE
if(180)
to_chat(M, "You feel fear build up in yourself as more and more of your body and consciousness begins to fade.")
M.alpha--
@@ -135,7 +140,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.")
M.alpha--
antiGenetics--
- if(0 to 30)
+ if(-INFINITY to 30)
to_chat(M, "Your body disperses from existence, as you become one with the universe.")
to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag, you do not remember the afterlife IC)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only.
deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
index 399d9eeb1a..bf915d5b6f 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
@@ -171,4 +171,33 @@
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_overdose")//holdover until above fix works
..()
+/datum/reagent/fermi/eigenstate/reaction_turf(turf/T, reac_volume)
+ //if(cached_purity < 0.99) To add with next batch of fixes and tweaks.
+ var/obj/structure/closet/First
+ var/obj/structure/closet/Previous
+ for(var/obj/structure/closet/C in T.contents)
+ if(C.eigen_teleport == TRUE)
+ C.visible_message("[C] fizzes, it's already linked to something else!")
+ continue
+ if(!Previous)
+ First = C
+ Previous = C
+ continue
+ C.eigen_teleport = TRUE
+ C.eigen_target = Previous
+ C.color = "#9999FF" //Tint the locker slightly.
+ C.alpha = 200
+ do_sparks(5,FALSE,C)
+ Previous = C
+ if(!First)
+ return
+ if(Previous == First)
+ return
+ First.eigen_teleport = TRUE
+ First.eigen_target = Previous
+ First.color = "#9999FF"
+ First.alpha = 200
+ do_sparks(5,FALSE,First)
+ First.visible_message("The lockers' eigenstates spilt and merge, linking each of their contents together.")
+
//eigenstate END
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
index 70283a7edc..d603f3ba10 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
@@ -71,8 +71,12 @@
//If they have Acute hepatic pharmacokinesis, then route processing though liver.
if(HAS_TRAIT(M, TRAIT_PHARMA))
var/obj/item/organ/liver/L = M.getorganslot("liver")
- L.swelling+= 0.05
- return..()
+ if(L)
+ L.swelling+= 0.05
+ return..()
+ else
+ M.adjustToxLoss(1)
+ return..()
//otherwise proceed as normal
var/obj/item/organ/genital/breasts/nB = new
@@ -169,12 +173,14 @@
/datum/reagent/fermi/BEsmaller_hypo/on_mob_add(mob/living/carbon/M)
. = ..()
- if(M.dna.features["has_vag"])
- var/obj/item/organ/genital/vagina/nV = new
- nV.Insert(M)
- if(M.dna.features["has_womb"])
- var/obj/item/organ/genital/womb/nW = new
- nW.Insert(M)
+ if(!M.getorganslot("vagina"))
+ if(M.dna.features["has_vag"])
+ var/obj/item/organ/genital/vagina/nV = new
+ nV.Insert(M)
+ if(!M.getorganslot("womb"))
+ if(M.dna.features["has_womb"])
+ var/obj/item/organ/genital/womb/nW = new
+ nW.Insert(M)
/datum/reagent/fermi/BEsmaller_hypo/on_mob_life(mob/living/carbon/M)
var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts")
@@ -245,8 +251,12 @@
//If they have Acute hepatic pharmacokinesis, then route processing though liver.
if(HAS_TRAIT(M, TRAIT_PHARMA))
var/obj/item/organ/liver/L = M.getorganslot("liver")
- L.swelling+= 0.05
- return..()
+ if(L)
+ L.swelling+= 0.05
+ return..()
+ else
+ M.adjustToxLoss(1)
+ return..()
//otherwise proceed as normal
var/obj/item/organ/genital/penis/nP = new
@@ -334,15 +344,16 @@
/datum/reagent/fermi/PEsmaller_hypo/on_mob_add(mob/living/carbon/M)
. = ..()
- if(M.dna.features["has_balls"])
- var/obj/item/organ/genital/testicles/nT = new
- nT.Insert(M)
+ if(!M.getorganslot("testicles"))
+ if(M.dna.features["has_balls"])
+ var/obj/item/organ/genital/testicles/nT = new
+ nT.Insert(M)
/datum/reagent/fermi/PEsmaller_hypo/on_mob_life(mob/living/carbon/M)
var/obj/item/organ/genital/penis/P = M.getorganslot("penis")
if(!P)
return ..()
- if(!M.dna.features["has_penis"])//Fast fix for those who don't want it.
+ if(!M.dna.features["has_cock"])//Fast fix for those who don't want it.
P.cached_length = P.cached_length - 0.2
P.update()
else if(P.cached_length > (M.dna.features["cock_length"]+0.1))
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
index c187b7eddb..9e2cc84ada 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -134,6 +134,23 @@
var/obj/item/organ/tongue/T
can_synth = TRUE
+/datum/reagent/fermi/furranium/reaction_mob(mob/living/carbon/human/M, method=INJECT, reac_volume)
+ if(method == INJECT)
+ var/turf/T = get_turf(M)
+ M.adjustOxyLoss(15)
+ M.Knockdown(50)
+ M.Stun(50)
+ M.emote("cough")
+ var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush))
+ new P(T)
+ to_chat(M, "You feel a lump form in your throat, as you suddenly cough up what seems to be a hairball?")
+ var/list/seen = viewers(8, T)
+ for(var/mob/S in seen)
+ to_chat(S, "[M] suddenly coughs up a [P.name]!")
+ var/T2 = get_random_station_turf()
+ P.throw_at(T2, 8, 1)
+ ..()
+
/datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M)
switch(current_cycle)
@@ -160,15 +177,15 @@
T.Remove(M)
nT.Insert(M)
T.moveToNullspace()//To valhalla
- to_chat(M, "Youw tongue feews... weally fwuffy!!")
+ to_chat(M, "Your tongue feels... weally fwuffy!!")
if(17 to INFINITY)
- if(prob(10))
+ if(prob(5))
to_chat(M, "You find yourself unable to supress the desire to meow!")
M.emote("nya")
- if(prob(10))
+ if(prob(5))
to_chat(M, "You find yourself unable to supress the desire to howl!")
M.emote("awoo")
- if(prob(20))
+ if(prob(5))
var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers
for(var/victim in seen)
if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim)))
@@ -178,7 +195,7 @@
..()
/datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M)
- if(purity < 0.9)//Only permanent if you're a good chemist.
+ if(purity < 1)//Only permanent if you're a good chemist.
nT = M.getorganslot(ORGAN_SLOT_TONGUE)
nT.Remove(M)
qdel(nT)
@@ -188,6 +205,7 @@
else
log_game("FERMICHEM: [M] ckey: [M.key]'s tongue has been made permanent")
+
///////////////////////////////////////////////////////////////////////////////////////////////
//Nanite removal
//Writen by Trilby!! Embellsished a little by me.
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index ad3b504691..8b815e9459 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -7,7 +7,7 @@
pH = 8.6
overdose_threshold = 35
ImpureChem = "yamerol_tox"
- InverseChemVal = 0.3
+ InverseChemVal = 0.4
InverseChem = "yamerol_tox"
can_synth = TRUE
@@ -16,17 +16,31 @@
var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS)
if(T)
- T.adjustTongueLoss(C, -2)
+ T.adjustTongueLoss(C, -2)//Fix the inputs me!
if(L)
L.adjustLungLoss(-5, C)
C.adjustOxyLoss(-2)
else
C.adjustOxyLoss(-10)
+
+ if(T)
+ if(T.name == "fluffy tongue")
+ var/obj/item/organ/tongue/nT
+ if(C.dna && C.dna.species && C.dna.species.mutanttongue)
+ nT = new C.dna.species.mutanttongue()
+ else
+ nT = new()
+ T.Remove(C)
+ qdel(T)
+ nT.Insert(C)
+ to_chat(C, "You feel your tongue.... unfluffify...?")
+ holder.remove_reagent(src.id, "10")
..()
/datum/reagent/fermi/yamerol/overdose_process(mob/living/carbon/C)
var/obj/item/organ/tongue/oT = C.getorganslot(ORGAN_SLOT_TONGUE)
-
+ if(current_cycle == 1)
+ to_chat(C, "You feel the Yamerol sooth your tongue and lungs.")
if(current_cycle > 10)
if(!C.getorganslot(ORGAN_SLOT_TONGUE))
var/obj/item/organ/tongue/T
@@ -40,7 +54,6 @@
else
if((oT.name == "fluffy tongue") && (purity == 1))
var/obj/item/organ/tongue/T
-
if(C.dna && C.dna.species && C.dna.species.mutanttongue)
T = new C.dna.species.mutanttongue()
else
@@ -57,6 +70,10 @@
to_chat(C, "You feel your lungs reform in your chest.")
holder.remove_reagent(src.id, "10")
+<<<<<<< HEAD
+=======
+ C.adjustOxyLoss(-3)
+>>>>>>> upstream/master
..()
/datum/reagent/fermi/yamerol/reaction_mob(var/mob/living/L)
@@ -87,7 +104,7 @@
T.adjustTongueLoss(C, 1)
if(L)
L.adjustLungLoss(4, C)
- C.adjustOxyLoss(2)
+ C.adjustOxyLoss(3)
else
C.adjustOxyLoss(10)
..()
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index bed9569024..078e1c8a71 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -29,10 +29,22 @@
for(var/turf/turf in range(2,T))
new /obj/effect/hotspot(turf)
- if (1101 to INFINITY) //If you're crafty
+ if (1101 to 1500) //If you're crafty
for(var/turf/turf in range(3,T))
new /obj/effect/hotspot(turf)
+ if (1501 to 2500) //requested
+ for(var/turf/turf in range(4,T))
+ new /obj/effect/hotspot(turf)
+
+ if (2501 to 5000)
+ for(var/turf/turf in range(5,T))
+ new /obj/effect/hotspot(turf)
+
+ if (5001 to INFINITY)
+ for(var/turf/turf in range(6,T))
+ new /obj/effect/hotspot(turf)
+
message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].")
log_game("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].")
@@ -512,7 +524,7 @@
name = "Yamerol"
id = "yamerol"
results = list("yamerol" = 1.5)
- required_reagents = list("perfluorodecalin" = 0.5, "furranium" = 0.5, "water" = 0.5)
+ required_reagents = list("perfluorodecalin" = 0.5, "salbutamol" = 0.5, "water" = 0.5)
//FermiChem vars:
OptimalTempMin = 300
OptimalTempMax = 500
diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm
index f925c229a3..708f1f59f8 100644
--- a/modular_citadel/code/modules/reagents/objects/clothes.dm
+++ b/modular_citadel/code/modules/reagents/objects/clothes.dm
@@ -64,42 +64,6 @@
else
message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]"
speech_args[SPEECH_MESSAGE] = trim(message)
- /*
- if(message[1] != "*")
- message = " [message]"
- var/list/french_words = strings("french_replacement.json", "french")
-
- for(var/key in french_words)
- var/value = french_words[key]
- if(islist(value))
- value = pick(value)
-
- message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]")
- message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]")
- message = replacetextEx(message, " [key]", " [value]")
-
- if(prob(3))
- message += pick(" Honh honh honh!"," Honh!"," Zut Alors!")
- speech_args[SPEECH_MESSAGE] = trim(message)
- */
-/*
-/obj/item/clothing/head/hattip/speechModification(message, /mob/living/carbon/C)
- ..()
- var/mob/living/carbon/C = get_wearer()//user
- var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE)
- if (T.name == "fluffy tongue")
- if(prob(0.01))
- message += "\" and tips their hat. \"swpy's sappin' my chem dispwencer uwu!!"
- return message
- message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]"
- return message
- if(prob(0.01))
- message += "\" and tips their hat. \"Spy's sappin' my chem dispenser!"//How did I not think of this earlier
- message_admins("I really appreciate all the hard work you put into adminning citadel, I hope you're all having a good day and I hope this hidden and rare message admins brightens up your day.")
- return message
- message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]"
- return message
-*/
/obj/item/clothing/head/hattip/proc/get_wearer()
return loc
diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm
index e7b73525c6..02f2db7c1e 100644
--- a/modular_citadel/code/modules/reagents/objects/items.dm
+++ b/modular_citadel/code/modules/reagents/objects/items.dm
@@ -11,6 +11,8 @@
//A little janky with pockets
/obj/item/fermichem/pHbooklet/attack_hand(mob/user)
if(user.get_held_index_of_item(src))//Does this check pockets too..?
+ if(numberOfPages == 50)
+ icon_state = "pHbookletOpen"
if(numberOfPages >= 1)
var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper
P.add_fingerprint(user)
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
index 6cd9e1badc..9e7da03f9b 100755
--- a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
+++ b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
@@ -141,12 +141,18 @@
// Gunna allow this for now, still really don't approve - Pooj
/obj/item/hypospray/mkii/emag_act(mob/user)
+ . = ..()
+ if(obj_flags & EMAGGED)
+ to_chat(user, "[src] happens to be already overcharged.")
+ return
inject_wait = COMBAT_WAIT_INJECT
spray_wait = COMBAT_WAIT_SPRAY
spray_self = COMBAT_SELF_INJECT
inject_self = COMBAT_SELF_SPRAY
penetrates = TRUE
to_chat(user, "You overcharge [src]'s control circuit.")
+ obj_flags |= EMAGGED
+ return TRUE
/obj/item/hypospray/mkii/attack_hand(mob/user)
. = ..() //Don't bother changing this or removing it from containers will break.
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index ee8268128a..c4c1cff1e7 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -8,6 +8,7 @@
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
reagent_state = LIQUID
color = "#FFFFFF" // rgb: 255, 255, 255
+ can_synth = FALSE
nutriment_factor = 0.5 * REAGENTS_METABOLISM
/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume)
@@ -19,7 +20,6 @@
var/obj/effect/decal/cleanable/semen/S = locate() in T
if(!S)
S = new(T)
- S.reagents.add_reagent("semen", reac_volume)
if(data["blood_DNA"])
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
@@ -50,6 +50,7 @@
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
reagent_state = LIQUID
color = "#AAAAAA77"
+ can_synth = FALSE
nutriment_factor = 0.5 * REAGENTS_METABOLISM
/obj/effect/decal/cleanable/femcum
@@ -82,7 +83,6 @@
var/obj/effect/decal/cleanable/femcum/S = locate() in T
if(!S)
S = new(T)
- S.reagents.add_reagent("femcum", reac_volume)
if(data["blood_DNA"])
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
index 22085d520c..1ad29c1af3 100644
--- a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
@@ -47,7 +47,7 @@
var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again.
var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again.
var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick #
- var/tmp/recent_sound = FALSE // Prevent audio spam
+ var/tmp/recent_sound // Prevent audio spam
var/tmp/last_hearcheck = 0
var/tmp/list/hearing_mobs
@@ -152,11 +152,13 @@
SSbellies.belly_list += src
/obj/belly/Destroy()
- SSbellies.belly_list -= src
if(owner)
- owner.vore_organs -= src
- owner = null
- . = ..()
+ Remove(owner)
+ return ..()
+
+/obj/belly/proc/Remove(mob/living/owner)
+ owner.vore_organs -= src
+ owner = null
// Called whenever an atom enters this belly
/obj/belly/Entered(var/atom/movable/thing,var/atom/OldLoc)
@@ -167,12 +169,13 @@
to_chat(owner,"[thing] slides into your [lowertext(name)].")
//Sound w/ antispam flag setting
- if(is_wet && !recent_sound)
- for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
- if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
- var/sound/devourments = GLOB.vore_sounds[vore_sound]
- playsound(get_turf(owner),devourments,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
- recent_sound = TRUE
+ if(is_wet && (world.time > recent_sound))
+ var/turf/source = get_turf(owner)
+ var/sound/eating = GLOB.vore_sounds[vore_sound]
+ for(var/mob/living/M in get_hearers_in_view(3, source))
+ if(M.client && M.client.prefs.cit_toggles & EATING_NOISES)
+ SEND_SOUND(M, eating)
+ recent_sound = (world.time + 20 SECONDS)
//Messages if it's a mob
if(isliving(thing))
@@ -187,7 +190,7 @@
var/atom/destination = drop_location()
//Don't bother if we don't have contents
if(!contents.len)
- return 0
+ return FALSE
var/count = 0
for(var/thing in contents)
@@ -206,10 +209,10 @@
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey)
AM.forceMove(destination) // Move the belly contents into the same location as belly's owner.
count++
- for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
+ for(var/mob/living/M in get_hearers_in_view(2, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
var/sound/releasement = GLOB.release_sounds[release_sound]
- playsound(get_turf(owner),releasement,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ SEND_SOUND(M, releasement)
//Clean up our own business
items_preserved.Cut()
@@ -233,10 +236,10 @@
M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner.
items_preserved -= M
if(!silent)
- for(var/mob/H in get_hearers_in_view(2, get_turf(owner)))
+ for(var/mob/living/H in get_hearers_in_view(2, get_turf(owner)))
if(H.client && (H.client.prefs.cit_toggles & EATING_NOISES))
var/sound/releasement = GLOB.release_sounds[release_sound]
- playsound(get_turf(owner),releasement,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ SEND_SOUND(H, releasement)
if(istype(M,/mob/living))
var/mob/living/ML = M
@@ -285,10 +288,6 @@
SEND_SIGNAL(prey, COMSIG_CLEAR_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey)
prey.forceMove(src)
- var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
-
- if(is_wet)
- prey.playsound_local(loc,preyloop,70,0, channel = CHANNEL_PREYLOOP)
owner.updateVRPanel()
@@ -317,10 +316,12 @@
M.cure_blind("belly_[REF(src)]")
target.nom_mob(content, target.owner)
if(!silent)
- for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
- if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
- var/sound/devourments = GLOB.vore_sounds[vore_sound]
- playsound(get_turf(owner),devourments,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ var/turf/source = get_turf(owner)
+ var/sound/eating = GLOB.vore_sounds[vore_sound]
+ for(var/mob/living/M in get_hearers_in_view(3, source))
+ if(M.client && M.client.prefs.cit_toggles & EATING_NOISES)
+ SEND_SOUND(M, eating)
+
owner.updateVRPanel()
for(var/mob/living/M in contents)
M.updateVRPanel()
@@ -524,22 +525,25 @@
struggle_outer_message = "" + struggle_outer_message + ""
struggle_user_message = "" + struggle_user_message + ""
+ var/turf/source = get_turf(owner)
+ var/sound/struggle_snuggle = sound(get_sfx("struggle_sound"))
+ var/sound/struggle_rustle = sound(get_sfx("rustle"))
+
if(is_wet)
- for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
- if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
- playsound(get_turf(owner),"struggle_sound",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED)
- R.stop_sound_channel(CHANNEL_PRED)
- var/sound/prey_struggle = sound(get_sfx("prey_struggle"))
- R.playsound_local(get_turf(R),prey_struggle,45,0)
+ for(var/mob/living/M in get_hearers_in_view(3, source))
+ if(M.client && M.client.prefs.cit_toggles & EATING_NOISES)
+ SEND_SOUND(M, struggle_snuggle)
else
- for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
- if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
- playsound(get_turf(owner),"rustle",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ for(var/mob/living/M in get_hearers_in_view(3, source))
+ if(M.client && M.client.prefs.cit_toggles & EATING_NOISES)
+ SEND_SOUND(M, struggle_rustle)
- for(var/mob/M in get_hearers_in_view(3, get_turf(owner)))
+ var/list/watching = hearers(3, owner)
+ for(var/mob/living/M in watching)
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) //Might as well censor the normies here too.
M.show_message(struggle_outer_message, 1) // visible
+
to_chat(R,struggle_user_message)
if(escapable) //If the stomach has escapable enabled.
diff --git a/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm
index 6b6a3d30cc..da323f02e2 100644
--- a/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/bellymodes_vr.dm
@@ -4,10 +4,16 @@
recent_sound = FALSE
return SSBELLIES_IGNORED
+ if(!owner)
+ qdel(src)
+ SSbellies.belly_list -= src
+ return SSBELLIES_PROCESSED
+
if(loc != owner)
- if(istype(owner))
- loc = owner
+ if(isliving(owner)) //we don't have machine based bellies. (yet :honk:)
+ forceMove(owner)
else
+ SSbellies.belly_list -= src
qdel(src)
return SSBELLIES_PROCESSED
@@ -26,10 +32,13 @@
if(isbelly(M.loc))
if(world.time > M.next_preyloop)
if(is_wet)
+ if(!M.client)
+ continue
M.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case
- var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
- M.playsound_local(get_turf(src),preyloop,80,0, channel = CHANNEL_PREYLOOP)
- M.next_preyloop = world.time + 52 SECONDS
+ if(M.client.prefs.cit_toggles & DIGESTION_NOISES)
+ var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
+ M.playsound_local(get_turf(src),preyloop, 80,0, channel = CHANNEL_PREYLOOP)
+ M.next_preyloop = (world.time + 52 SECONDS)
/////////////////////////// Exit Early ////////////////////////////
@@ -63,12 +72,12 @@
if(prob(25))
if((world.time - NORMIE_HEARCHECK) > last_hearcheck)
LAZYCLEARLIST(hearing_mobs)
- for(var/mob/H in get_hearers_in_view(3, source))
+ for(var/mob/living/H in get_hearers_in_view(3, source))
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
continue
LAZYADD(hearing_mobs, H)
last_hearcheck = world.time
- for(var/mob/H in hearing_mobs)
+ for(var/mob/living/H in hearing_mobs)
if(!isbelly(H.loc))
H.playsound_local(source, null, 45, falloff = 0, S = pred_digest)
else if(H in contents)
@@ -100,12 +109,12 @@
owner.nutrition += 400 // so eating dead mobs gives you *something*.
if((world.time - NORMIE_HEARCHECK) > last_hearcheck)
LAZYCLEARLIST(hearing_mobs)
- for(var/mob/H in get_hearers_in_view(3, source))
+ for(var/mob/living/H in get_hearers_in_view(3, source))
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
continue
LAZYADD(hearing_mobs, H)
last_hearcheck = world.time
- for(var/mob/H in hearing_mobs)
+ for(var/mob/living/H in hearing_mobs)
if(!isbelly(H.loc))
H.playsound_local(source, null, 45, falloff = 0, S = pred_death)
else if(H in contents)
@@ -135,12 +144,12 @@
if(prob(25))
if((world.time - NORMIE_HEARCHECK) > last_hearcheck)
LAZYCLEARLIST(hearing_mobs)
- for(var/mob/H in get_hearers_in_view(3, source))
+ for(var/mob/living/H in get_hearers_in_view(3, source))
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
continue
LAZYADD(hearing_mobs, H)
last_hearcheck = world.time
- for(var/mob/H in hearing_mobs)
+ for(var/mob/living/H in hearing_mobs)
if(!isbelly(H.loc))
H.playsound_local(source, null, 45, falloff = 0, S = pred_digest)
else if(H in contents)
@@ -159,12 +168,12 @@
if(prob(35))
if((world.time - NORMIE_HEARCHECK) > last_hearcheck)
LAZYCLEARLIST(hearing_mobs)
- for(var/mob/H in get_hearers_in_view(3, source))
+ for(var/mob/living/H in get_hearers_in_view(3, source))
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
continue
LAZYADD(hearing_mobs, H)
last_hearcheck = world.time
- for(var/mob/H in hearing_mobs)
+ for(var/mob/living/H in hearing_mobs)
if(!isbelly(H.loc))
H.playsound_local(source, null, 45, falloff = 0, S = pred_digest)
else if(H in contents)
@@ -179,12 +188,12 @@
if(prob(10))//Less often than gurgles. People might leave this on forever.
if((world.time - NORMIE_HEARCHECK) > last_hearcheck)
LAZYCLEARLIST(hearing_mobs)
- for(var/mob/H in get_hearers_in_view(3, source))
+ for(var/mob/living/H in get_hearers_in_view(3, source))
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
continue
LAZYADD(hearing_mobs, H)
last_hearcheck = world.time
- for(var/mob/H in hearing_mobs)
+ for(var/mob/living/H in hearing_mobs)
if(!isbelly(H.loc))
H.playsound_local(source, null, 45, falloff = 0, S = pred_digest)
else if(H in contents)
@@ -221,12 +230,12 @@
if(prob(55)) //if you're hearing this, you're a vore ho anyway.
if((world.time - NORMIE_HEARCHECK) > last_hearcheck)
LAZYCLEARLIST(hearing_mobs)
- for(var/mob/H in get_hearers_in_view(3, source))
+ for(var/mob/living/H in get_hearers_in_view(3, source))
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
continue
LAZYADD(hearing_mobs, H)
last_hearcheck = world.time
- for(var/mob/H in hearing_mobs)
+ for(var/mob/living/H in hearing_mobs)
if(!isbelly(H.loc))
H.playsound_local(source, null, 45, falloff = 0, S = pred_digest)
else if(H in contents)
@@ -254,12 +263,12 @@
M.visible_message("You watch as [owner]'s guts loudly rumble as it finishes off a meal.")
if((world.time - NORMIE_HEARCHECK) > last_hearcheck)
LAZYCLEARLIST(hearing_mobs)
- for(var/mob/H in get_hearers_in_view(3, source))
+ for(var/mob/living/H in get_hearers_in_view(3, source))
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
continue
LAZYADD(hearing_mobs, H)
last_hearcheck = world.time
- for(var/mob/H in hearing_mobs)
+ for(var/mob/living/H in hearing_mobs)
if(!isbelly(H.loc))
H.playsound_local(source, null, 45, falloff = 0, S = pred_death)
else if(H in contents)
diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm
index a8a77895c8..d9adde04d1 100644
--- a/modular_citadel/code/modules/vore/eating/living_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/living_vr.dm
@@ -60,18 +60,6 @@
B.can_taste = 1
return TRUE
-/*
-// Hide vore organs in contents
-//
-/datum/proc/view_variables_filter_contents(list/L)
- return 0
-
-/mob/living/view_variables_filter_contents(list/L)
- . = ..()
- var/len_before = L.len
- L -= vore_organs
- . += len_before - L.len*/
-
// Handle being clicked, perhaps with something to devour
//
@@ -121,21 +109,12 @@
/mob/living/proc/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey)
var/belly = user.vore_selected
return perform_the_nom(user, prey, user, belly)
-/*
-/mob/living/proc/eat_held_mob(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
- var/belly
- if(user != pred)
- belly = input("Choose Belly") in pred.vore_organs
- else
- belly = pred.vore_selected
- return perform_the_nom(user, prey, pred, belly)*/
/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred)
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, user, pred, belly)
/mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
-// return//disabled until I can make that toggle work
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, prey, pred, belly)
@@ -182,9 +161,13 @@
// If we got this far, nom successful! Announce it!
user.visible_message(success_msg)
- for(var/mob/M in get_hearers_in_view(5, get_turf(user)))
+
+ // incredibly contentious eating noises time
+ var/turf/source = get_turf(user)
+ var/sound/eating = GLOB.vore_sounds[belly.vore_sound]
+ for(var/mob/living/M in get_hearers_in_view(3, source))
if(M.client && M.client.prefs.cit_toggles & EATING_NOISES)
- playsound(get_turf(user),"[belly.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
+ SEND_SOUND(M, eating)
// Actually shove prey into the belly.
belly.nom_mob(prey, user)
@@ -214,41 +197,7 @@
//
//End vore code.
-/*
- //Handle case: /obj/item/holder
- if(/obj/item/holder/micro)
- var/obj/item/holder/H = I
- if(!isliving(user)) return 0 // Return 0 to continue upper procs
- var/mob/living/attacker = user // Typecast to living
-
- if (is_vore_predator(src))
- for (var/mob/living/M in H.contents)
- attacker.eat_held_mob(attacker, M, src)
- return 1 //Return 1 to exit upper procs
- else
- log_attack("[attacker] attempted to feed [H.contents] to [src] ([src.type]) but it failed.")
-
- // I just can't imagine this not being complained about
- //Handle case: /obj/item/radio/beacon
- if(/obj/item/radio/beacon)
- var/confirm = alert(user, "[src == user ? "Eat the beacon?" : "Feed the beacon to [src]?"]", "Confirmation", "Yes!", "Cancel")
- if(confirm == "Yes!")
- var/bellychoice = input("Which belly?","Select A Belly") in src.vore_organs
- var/datum/belly/B = src.vore_organs[bellychoice]
- src.visible_message("[user] is trying to stuff a beacon into [src]'s [bellychoice]!","[user] is trying to stuff a beacon into you!")
- if(do_after(user,30,src))
- user.drop_item()
- I.loc = src
- B.internal_contents += I
- src.visible_message("[src] is fed the beacon!","You're fed the beacon!")
- playsound(get_turf(src), B.vore_sound,50,0,-6,0)
- return 1
- else
- return 1 //You don't get to hit someone 'later'
-
- return 0
-*/
//
// Our custom resist catches for /mob/living
@@ -272,7 +221,7 @@
if(isbelly(loc))
src.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case
var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
- src.playsound_local(get_turf(src),preyloop,80,0, channel = CHANNEL_PREYLOOP)
+ SEND_SOUND(src, preyloop)
else
to_chat(src, "You aren't inside anything, you clod.")
diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
index 6f484e7a51..ae7da895a6 100644
--- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
@@ -57,7 +57,7 @@
/datum/vore_look/proc/gen_vui(var/mob/living/user)
var/dat
dat += "Remember to toggle the vore mode, it's to the left of your combat toggle. Open mouth means you're voracious!
"
- dat += "Remember that your prey is blind, use audible mode subtle messages to communicate to them with posts!
"
+ dat += "Remember that the prey is blind, use audible mode subtle messages to communicate to them with posts!
"
dat += "
"
var/atom/userloc = user.loc
if (isbelly(userloc))
@@ -554,7 +554,7 @@
if(href_list["b_releasesoundtest"])
var/sound/releasetest = GLOB.release_sounds[selected.release_sound]
if(releasetest)
- user << releasetest
+ SEND_SOUND(user, releasetest)
if(href_list["b_sound"])
var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.vore_sounds
@@ -567,7 +567,7 @@
if(href_list["b_soundtest"])
var/sound/voretest = GLOB.vore_sounds[selected.vore_sound]
if(voretest)
- user << voretest
+ SEND_SOUND(user, voretest)
if(href_list["b_tastes"])
selected.can_taste = !selected.can_taste
diff --git a/modular_citadel/icons/mob/muzzled_helmet.dmi b/modular_citadel/icons/mob/muzzled_helmet.dmi
index e321f8ae47..a318f394f8 100644
Binary files a/modular_citadel/icons/mob/muzzled_helmet.dmi and b/modular_citadel/icons/mob/muzzled_helmet.dmi differ
diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi
index 1f1f506d9f..eba761ff79 100644
Binary files a/modular_citadel/icons/mob/suit_digi.dmi and b/modular_citadel/icons/mob/suit_digi.dmi differ
diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi
index 5ff291f400..aea900d110 100644
Binary files a/modular_citadel/icons/mob/uniform_digi.dmi and b/modular_citadel/icons/mob/uniform_digi.dmi differ
diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi
index e470b9638f..de7a86d574 100644
Binary files a/modular_citadel/icons/obj/FermiChem.dmi and b/modular_citadel/icons/obj/FermiChem.dmi differ
diff --git a/modular_citadel/icons/obj/clothing/hats.dmi b/modular_citadel/icons/obj/clothing/hats.dmi
new file mode 100644
index 0000000000..ba9b4b5f8e
Binary files /dev/null and b/modular_citadel/icons/obj/clothing/hats.dmi differ
diff --git a/modular_citadel/icons/obj/food/cake.dmi b/modular_citadel/icons/obj/food/cake.dmi
deleted file mode 100644
index 840bfe714d..0000000000
Binary files a/modular_citadel/icons/obj/food/cake.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/guns/cit_guns.dmi b/modular_citadel/icons/obj/guns/cit_guns.dmi
index cc04fbcb14..bd48d8edbd 100644
Binary files a/modular_citadel/icons/obj/guns/cit_guns.dmi and b/modular_citadel/icons/obj/guns/cit_guns.dmi differ
diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf
index e4531a24ea..c5b5138609 100644
--- a/modular_citadel/interface/skin.dmf
+++ b/modular_citadel/interface/skin.dmf
@@ -54,7 +54,7 @@ window "mainwindow"
size = 640x440
anchor1 = none
anchor2 = none
- background-color = #272727
+ background-color = #eeeeee
is-default = true
saved-params = "pos;size;is-minimized;is-maximized"
icon = 'icons\\ss13_64.png'
@@ -66,7 +66,7 @@ window "mainwindow"
size = 637x440
anchor1 = 0,0
anchor2 = 100,100
- background-color = #272727
+ background-color = #eeeeee
saved-params = "splitter"
left = "mapwindow"
right = "infowindow"
@@ -78,7 +78,7 @@ window "mainwindow"
size = 200x200
anchor1 = none
anchor2 = none
- background-color = #272727
+ background-color = #ffffff
is-visible = false
saved-params = ""
elem "tooltip"
@@ -87,7 +87,7 @@ window "mainwindow"
size = 999x999
anchor1 = none
anchor2 = none
- background-color = #272727
+ background-color = #ffffff
is-visible = false
saved-params = ""
@@ -98,7 +98,6 @@ window "mapwindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #272727
saved-params = "pos;size;is-minimized;is-maximized"
is-pane = true
elem "map"
@@ -120,7 +119,7 @@ window "infowindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #272727
+ background-color = #eeeeee
saved-params = "pos;size;is-minimized;is-maximized"
is-pane = true
elem "info"
@@ -129,7 +128,6 @@ window "infowindow"
size = 640x445
anchor1 = 0,0
anchor2 = 100,100
- background-color = #272727
saved-params = "splitter"
left = "statwindow"
right = "outputwindow"
@@ -140,8 +138,7 @@ window "infowindow"
size = 104x20
anchor1 = 3,0
anchor2 = 19,0
- text-color = #ffffff
- background-color = #40628a
+ background-color = #90b3dd
saved-params = "is-checked"
text = "Changelog"
command = "changelog"
@@ -151,8 +148,7 @@ window "infowindow"
size = 100x20
anchor1 = 19,0
anchor2 = 34,0
- text-color = #ffffff
- background-color = #40628a
+ background-color = #90b3dd
saved-params = "is-checked"
text = "Rules"
command = "rules"
@@ -162,8 +158,7 @@ window "infowindow"
size = 100x20
anchor1 = 34,0
anchor2 = 50,0
- text-color = #ffffff
- background-color = #40628a
+ background-color = #90b3dd
saved-params = "is-checked"
text = "Wiki"
command = "wiki"
@@ -173,8 +168,7 @@ window "infowindow"
size = 100x20
anchor1 = 50,0
anchor2 = 66,0
- text-color = #ffffff
- background-color = #40628a
+ background-color = #90b3dd
saved-params = "is-checked"
text = "Forum"
command = "forum"
@@ -184,8 +178,7 @@ window "infowindow"
size = 100x20
anchor1 = 66,0
anchor2 = 81,0
- text-color = #ffffff
- background-color = #40628a
+ background-color = #90b3dd
saved-params = "is-checked"
text = "GitHub"
command = "github"
@@ -196,8 +189,7 @@ window "infowindow"
anchor1 = 81,0
anchor2 = 97,0
font-size = 8
- text-color = #ffffff
- background-color = #40628a
+ background-color = #ef7f7f
saved-params = "is-checked"
text = "Report Issue"
command = "report-issue"
@@ -209,7 +201,7 @@ window "outputwindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #272727
+ background-color = #eeeeee
saved-params = "pos;size;is-minimized;is-maximized"
titlebar = false
statusbar = false
@@ -223,9 +215,9 @@ window "outputwindow"
size = 595x20
anchor1 = 0,100
anchor2 = 100,100
- font-size = 10
background-color = #d3b5b5
is-default = true
+ border = sunken
saved-params = "command"
elem "say"
type = BUTTON
@@ -233,8 +225,7 @@ window "outputwindow"
size = 37x20
anchor1 = 100,100
anchor2 = none
- text-color = #ffffff
- background-color = #272727
+ background-color = #eeeeee
saved-params = "is-checked"
text = "Chat"
command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\""
@@ -246,7 +237,7 @@ window "outputwindow"
size = 640x456
anchor1 = 0,0
anchor2 = 100,100
- background-color = #272727
+ background-color = #ffffff
is-visible = false
is-disabled = true
saved-params = ""
@@ -257,8 +248,6 @@ window "outputwindow"
size = 640x456
anchor1 = 0,0
anchor2 = 100,100
- text-color = #40628a
- background-color = #272727
is-default = true
saved-params = ""
@@ -269,7 +258,7 @@ window "statwindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #272727
+ background-color = #eeeeee
saved-params = "pos;size;is-minimized;is-maximized"
is-pane = true
elem "stat"
@@ -278,14 +267,9 @@ window "statwindow"
size = 640x480
anchor1 = 0,0
anchor2 = 100,100
- text-color = #ffffff
- background-color = #383838
is-default = true
saved-params = ""
- tab-text-color = #ffffff
- tab-background-color = #272727
- prefix-color = #ebebeb
- suffix-color = #ebebeb
+ tab-background-color = #eeeeee
window "preferences_window"
elem "preferences_window"
@@ -294,7 +278,6 @@ window "preferences_window"
size = 1280x1000
anchor1 = none
anchor2 = none
- background-color = none
is-visible = false
saved-params = "pos;size;is-minimized;is-maximized"
statusbar = false
@@ -304,7 +287,6 @@ window "preferences_window"
size = 960x1000
anchor1 = 0,0
anchor2 = 75,100
- background-color = none
saved-params = ""
elem "character_preview_map"
type = MAP
diff --git a/modular_citadel/sound/vox/_comma.ogg b/modular_citadel/sound/vox/_comma.ogg
new file mode 100644
index 0000000000..55ee3102a0
Binary files /dev/null and b/modular_citadel/sound/vox/_comma.ogg differ
diff --git a/modular_citadel/sound/vox/_period.ogg b/modular_citadel/sound/vox/_period.ogg
new file mode 100644
index 0000000000..dfb816d006
Binary files /dev/null and b/modular_citadel/sound/vox/_period.ogg differ
diff --git a/modular_citadel/sound/vox/a.ogg b/modular_citadel/sound/vox/a.ogg
new file mode 100644
index 0000000000..ad3a851290
Binary files /dev/null and b/modular_citadel/sound/vox/a.ogg differ
diff --git a/modular_citadel/sound/vox/accelerating.ogg b/modular_citadel/sound/vox/accelerating.ogg
new file mode 100644
index 0000000000..d6426aa798
Binary files /dev/null and b/modular_citadel/sound/vox/accelerating.ogg differ
diff --git a/modular_citadel/sound/vox/accelerator.ogg b/modular_citadel/sound/vox/accelerator.ogg
new file mode 100644
index 0000000000..6e8e1f10e8
Binary files /dev/null and b/modular_citadel/sound/vox/accelerator.ogg differ
diff --git a/modular_citadel/sound/vox/accepted.ogg b/modular_citadel/sound/vox/accepted.ogg
new file mode 100644
index 0000000000..f6c411f8c5
Binary files /dev/null and b/modular_citadel/sound/vox/accepted.ogg differ
diff --git a/modular_citadel/sound/vox/access.ogg b/modular_citadel/sound/vox/access.ogg
new file mode 100644
index 0000000000..ae8390e516
Binary files /dev/null and b/modular_citadel/sound/vox/access.ogg differ
diff --git a/modular_citadel/sound/vox/acknowledge.ogg b/modular_citadel/sound/vox/acknowledge.ogg
new file mode 100644
index 0000000000..da3143b729
Binary files /dev/null and b/modular_citadel/sound/vox/acknowledge.ogg differ
diff --git a/modular_citadel/sound/vox/acknowledged.ogg b/modular_citadel/sound/vox/acknowledged.ogg
new file mode 100644
index 0000000000..b4b89eaa52
Binary files /dev/null and b/modular_citadel/sound/vox/acknowledged.ogg differ
diff --git a/modular_citadel/sound/vox/acquired.ogg b/modular_citadel/sound/vox/acquired.ogg
new file mode 100644
index 0000000000..ba4595a908
Binary files /dev/null and b/modular_citadel/sound/vox/acquired.ogg differ
diff --git a/modular_citadel/sound/vox/acquisition.ogg b/modular_citadel/sound/vox/acquisition.ogg
new file mode 100644
index 0000000000..fcdf6a9832
Binary files /dev/null and b/modular_citadel/sound/vox/acquisition.ogg differ
diff --git a/modular_citadel/sound/vox/across.ogg b/modular_citadel/sound/vox/across.ogg
new file mode 100644
index 0000000000..d026b3dba9
Binary files /dev/null and b/modular_citadel/sound/vox/across.ogg differ
diff --git a/modular_citadel/sound/vox/activate.ogg b/modular_citadel/sound/vox/activate.ogg
new file mode 100644
index 0000000000..5611c456a7
Binary files /dev/null and b/modular_citadel/sound/vox/activate.ogg differ
diff --git a/modular_citadel/sound/vox/activated.ogg b/modular_citadel/sound/vox/activated.ogg
new file mode 100644
index 0000000000..e3fafca3b2
Binary files /dev/null and b/modular_citadel/sound/vox/activated.ogg differ
diff --git a/modular_citadel/sound/vox/activity.ogg b/modular_citadel/sound/vox/activity.ogg
new file mode 100644
index 0000000000..66535b485d
Binary files /dev/null and b/modular_citadel/sound/vox/activity.ogg differ
diff --git a/modular_citadel/sound/vox/adios.ogg b/modular_citadel/sound/vox/adios.ogg
new file mode 100644
index 0000000000..1eedd5468b
Binary files /dev/null and b/modular_citadel/sound/vox/adios.ogg differ
diff --git a/modular_citadel/sound/vox/administration.ogg b/modular_citadel/sound/vox/administration.ogg
new file mode 100644
index 0000000000..44f8b3e8d8
Binary files /dev/null and b/modular_citadel/sound/vox/administration.ogg differ
diff --git a/modular_citadel/sound/vox/advanced.ogg b/modular_citadel/sound/vox/advanced.ogg
new file mode 100644
index 0000000000..df110dd8db
Binary files /dev/null and b/modular_citadel/sound/vox/advanced.ogg differ
diff --git a/modular_citadel/sound/vox/after.ogg b/modular_citadel/sound/vox/after.ogg
new file mode 100644
index 0000000000..8c0857f99c
Binary files /dev/null and b/modular_citadel/sound/vox/after.ogg differ
diff --git a/modular_citadel/sound/vox/agent.ogg b/modular_citadel/sound/vox/agent.ogg
new file mode 100644
index 0000000000..eae99227bc
Binary files /dev/null and b/modular_citadel/sound/vox/agent.ogg differ
diff --git a/modular_citadel/sound/vox/alarm.ogg b/modular_citadel/sound/vox/alarm.ogg
new file mode 100644
index 0000000000..54bcc0b980
Binary files /dev/null and b/modular_citadel/sound/vox/alarm.ogg differ
diff --git a/modular_citadel/sound/vox/alert.ogg b/modular_citadel/sound/vox/alert.ogg
new file mode 100644
index 0000000000..08620fa58c
Binary files /dev/null and b/modular_citadel/sound/vox/alert.ogg differ
diff --git a/modular_citadel/sound/vox/alien.ogg b/modular_citadel/sound/vox/alien.ogg
new file mode 100644
index 0000000000..cb3c3d7787
Binary files /dev/null and b/modular_citadel/sound/vox/alien.ogg differ
diff --git a/modular_citadel/sound/vox/aligned.ogg b/modular_citadel/sound/vox/aligned.ogg
new file mode 100644
index 0000000000..f561a1ec2f
Binary files /dev/null and b/modular_citadel/sound/vox/aligned.ogg differ
diff --git a/modular_citadel/sound/vox/all.ogg b/modular_citadel/sound/vox/all.ogg
new file mode 100644
index 0000000000..48d05f1007
Binary files /dev/null and b/modular_citadel/sound/vox/all.ogg differ
diff --git a/modular_citadel/sound/vox/alpha.ogg b/modular_citadel/sound/vox/alpha.ogg
new file mode 100644
index 0000000000..b80828c408
Binary files /dev/null and b/modular_citadel/sound/vox/alpha.ogg differ
diff --git a/modular_citadel/sound/vox/am.ogg b/modular_citadel/sound/vox/am.ogg
new file mode 100644
index 0000000000..9d4289758e
Binary files /dev/null and b/modular_citadel/sound/vox/am.ogg differ
diff --git a/modular_citadel/sound/vox/amigo.ogg b/modular_citadel/sound/vox/amigo.ogg
new file mode 100644
index 0000000000..6992689553
Binary files /dev/null and b/modular_citadel/sound/vox/amigo.ogg differ
diff --git a/modular_citadel/sound/vox/ammunition.ogg b/modular_citadel/sound/vox/ammunition.ogg
new file mode 100644
index 0000000000..108fb2dc83
Binary files /dev/null and b/modular_citadel/sound/vox/ammunition.ogg differ
diff --git a/modular_citadel/sound/vox/an.ogg b/modular_citadel/sound/vox/an.ogg
new file mode 100644
index 0000000000..53382c68a0
Binary files /dev/null and b/modular_citadel/sound/vox/an.ogg differ
diff --git a/modular_citadel/sound/vox/and.ogg b/modular_citadel/sound/vox/and.ogg
new file mode 100644
index 0000000000..b9b4de26bf
Binary files /dev/null and b/modular_citadel/sound/vox/and.ogg differ
diff --git a/modular_citadel/sound/vox/announcement.ogg b/modular_citadel/sound/vox/announcement.ogg
new file mode 100644
index 0000000000..ba16d76c18
Binary files /dev/null and b/modular_citadel/sound/vox/announcement.ogg differ
diff --git a/modular_citadel/sound/vox/anomalous.ogg b/modular_citadel/sound/vox/anomalous.ogg
new file mode 100644
index 0000000000..a331afd06e
Binary files /dev/null and b/modular_citadel/sound/vox/anomalous.ogg differ
diff --git a/modular_citadel/sound/vox/antenna.ogg b/modular_citadel/sound/vox/antenna.ogg
new file mode 100644
index 0000000000..547e64786a
Binary files /dev/null and b/modular_citadel/sound/vox/antenna.ogg differ
diff --git a/modular_citadel/sound/vox/any.ogg b/modular_citadel/sound/vox/any.ogg
new file mode 100644
index 0000000000..49d578758b
Binary files /dev/null and b/modular_citadel/sound/vox/any.ogg differ
diff --git a/modular_citadel/sound/vox/apprehend.ogg b/modular_citadel/sound/vox/apprehend.ogg
new file mode 100644
index 0000000000..de0fc4d664
Binary files /dev/null and b/modular_citadel/sound/vox/apprehend.ogg differ
diff --git a/modular_citadel/sound/vox/approach.ogg b/modular_citadel/sound/vox/approach.ogg
new file mode 100644
index 0000000000..3135bb7fc4
Binary files /dev/null and b/modular_citadel/sound/vox/approach.ogg differ
diff --git a/modular_citadel/sound/vox/are.ogg b/modular_citadel/sound/vox/are.ogg
new file mode 100644
index 0000000000..b3e68aa8a6
Binary files /dev/null and b/modular_citadel/sound/vox/are.ogg differ
diff --git a/modular_citadel/sound/vox/area.ogg b/modular_citadel/sound/vox/area.ogg
new file mode 100644
index 0000000000..1408fedf4c
Binary files /dev/null and b/modular_citadel/sound/vox/area.ogg differ
diff --git a/modular_citadel/sound/vox/arm.ogg b/modular_citadel/sound/vox/arm.ogg
new file mode 100644
index 0000000000..e078c567b5
Binary files /dev/null and b/modular_citadel/sound/vox/arm.ogg differ
diff --git a/modular_citadel/sound/vox/armed.ogg b/modular_citadel/sound/vox/armed.ogg
new file mode 100644
index 0000000000..2b1d092658
Binary files /dev/null and b/modular_citadel/sound/vox/armed.ogg differ
diff --git a/modular_citadel/sound/vox/armor.ogg b/modular_citadel/sound/vox/armor.ogg
new file mode 100644
index 0000000000..70217b55a4
Binary files /dev/null and b/modular_citadel/sound/vox/armor.ogg differ
diff --git a/modular_citadel/sound/vox/armory.ogg b/modular_citadel/sound/vox/armory.ogg
new file mode 100644
index 0000000000..22835188f8
Binary files /dev/null and b/modular_citadel/sound/vox/armory.ogg differ
diff --git a/modular_citadel/sound/vox/arrest.ogg b/modular_citadel/sound/vox/arrest.ogg
new file mode 100644
index 0000000000..bfef18601f
Binary files /dev/null and b/modular_citadel/sound/vox/arrest.ogg differ
diff --git a/modular_citadel/sound/vox/ass.ogg b/modular_citadel/sound/vox/ass.ogg
new file mode 100644
index 0000000000..6bf9c01e62
Binary files /dev/null and b/modular_citadel/sound/vox/ass.ogg differ
diff --git a/modular_citadel/sound/vox/at.ogg b/modular_citadel/sound/vox/at.ogg
new file mode 100644
index 0000000000..5146ab9afb
Binary files /dev/null and b/modular_citadel/sound/vox/at.ogg differ
diff --git a/modular_citadel/sound/vox/atomic.ogg b/modular_citadel/sound/vox/atomic.ogg
new file mode 100644
index 0000000000..b8b1e1cec7
Binary files /dev/null and b/modular_citadel/sound/vox/atomic.ogg differ
diff --git a/modular_citadel/sound/vox/attention.ogg b/modular_citadel/sound/vox/attention.ogg
new file mode 100644
index 0000000000..ca5073e6c4
Binary files /dev/null and b/modular_citadel/sound/vox/attention.ogg differ
diff --git a/modular_citadel/sound/vox/authorize.ogg b/modular_citadel/sound/vox/authorize.ogg
new file mode 100644
index 0000000000..7ef68781ef
Binary files /dev/null and b/modular_citadel/sound/vox/authorize.ogg differ
diff --git a/modular_citadel/sound/vox/authorized.ogg b/modular_citadel/sound/vox/authorized.ogg
new file mode 100644
index 0000000000..5142ceba8d
Binary files /dev/null and b/modular_citadel/sound/vox/authorized.ogg differ
diff --git a/modular_citadel/sound/vox/automatic.ogg b/modular_citadel/sound/vox/automatic.ogg
new file mode 100644
index 0000000000..48d09f2304
Binary files /dev/null and b/modular_citadel/sound/vox/automatic.ogg differ
diff --git a/modular_citadel/sound/vox/away.ogg b/modular_citadel/sound/vox/away.ogg
new file mode 100644
index 0000000000..3e99af620e
Binary files /dev/null and b/modular_citadel/sound/vox/away.ogg differ
diff --git a/modular_citadel/sound/vox/b.ogg b/modular_citadel/sound/vox/b.ogg
new file mode 100644
index 0000000000..00b64030d6
Binary files /dev/null and b/modular_citadel/sound/vox/b.ogg differ
diff --git a/modular_citadel/sound/vox/back.ogg b/modular_citadel/sound/vox/back.ogg
new file mode 100644
index 0000000000..a8ca34ef52
Binary files /dev/null and b/modular_citadel/sound/vox/back.ogg differ
diff --git a/modular_citadel/sound/vox/backman.ogg b/modular_citadel/sound/vox/backman.ogg
new file mode 100644
index 0000000000..e0e6351f57
Binary files /dev/null and b/modular_citadel/sound/vox/backman.ogg differ
diff --git a/modular_citadel/sound/vox/bad.ogg b/modular_citadel/sound/vox/bad.ogg
new file mode 100644
index 0000000000..2dd38058a2
Binary files /dev/null and b/modular_citadel/sound/vox/bad.ogg differ
diff --git a/modular_citadel/sound/vox/bag.ogg b/modular_citadel/sound/vox/bag.ogg
new file mode 100644
index 0000000000..6daa1ab172
Binary files /dev/null and b/modular_citadel/sound/vox/bag.ogg differ
diff --git a/modular_citadel/sound/vox/bailey.ogg b/modular_citadel/sound/vox/bailey.ogg
new file mode 100644
index 0000000000..b912fe5801
Binary files /dev/null and b/modular_citadel/sound/vox/bailey.ogg differ
diff --git a/modular_citadel/sound/vox/barracks.ogg b/modular_citadel/sound/vox/barracks.ogg
new file mode 100644
index 0000000000..5e13a42773
Binary files /dev/null and b/modular_citadel/sound/vox/barracks.ogg differ
diff --git a/modular_citadel/sound/vox/base.ogg b/modular_citadel/sound/vox/base.ogg
new file mode 100644
index 0000000000..17d60fbc02
Binary files /dev/null and b/modular_citadel/sound/vox/base.ogg differ
diff --git a/modular_citadel/sound/vox/bay.ogg b/modular_citadel/sound/vox/bay.ogg
new file mode 100644
index 0000000000..7ac9991c69
Binary files /dev/null and b/modular_citadel/sound/vox/bay.ogg differ
diff --git a/modular_citadel/sound/vox/be.ogg b/modular_citadel/sound/vox/be.ogg
new file mode 100644
index 0000000000..01865aba54
Binary files /dev/null and b/modular_citadel/sound/vox/be.ogg differ
diff --git a/modular_citadel/sound/vox/been.ogg b/modular_citadel/sound/vox/been.ogg
new file mode 100644
index 0000000000..cf9e92a032
Binary files /dev/null and b/modular_citadel/sound/vox/been.ogg differ
diff --git a/modular_citadel/sound/vox/before.ogg b/modular_citadel/sound/vox/before.ogg
new file mode 100644
index 0000000000..fc16e8fef4
Binary files /dev/null and b/modular_citadel/sound/vox/before.ogg differ
diff --git a/modular_citadel/sound/vox/beyond.ogg b/modular_citadel/sound/vox/beyond.ogg
new file mode 100644
index 0000000000..e25982e700
Binary files /dev/null and b/modular_citadel/sound/vox/beyond.ogg differ
diff --git a/modular_citadel/sound/vox/biohazard.ogg b/modular_citadel/sound/vox/biohazard.ogg
new file mode 100644
index 0000000000..12d20ff2f3
Binary files /dev/null and b/modular_citadel/sound/vox/biohazard.ogg differ
diff --git a/modular_citadel/sound/vox/biological.ogg b/modular_citadel/sound/vox/biological.ogg
new file mode 100644
index 0000000000..538c2c4604
Binary files /dev/null and b/modular_citadel/sound/vox/biological.ogg differ
diff --git a/modular_citadel/sound/vox/birdwell.ogg b/modular_citadel/sound/vox/birdwell.ogg
new file mode 100644
index 0000000000..d3735d2531
Binary files /dev/null and b/modular_citadel/sound/vox/birdwell.ogg differ
diff --git a/modular_citadel/sound/vox/bizwarn.ogg b/modular_citadel/sound/vox/bizwarn.ogg
new file mode 100644
index 0000000000..1f875c644e
Binary files /dev/null and b/modular_citadel/sound/vox/bizwarn.ogg differ
diff --git a/modular_citadel/sound/vox/black.ogg b/modular_citadel/sound/vox/black.ogg
new file mode 100644
index 0000000000..28e5d48afe
Binary files /dev/null and b/modular_citadel/sound/vox/black.ogg differ
diff --git a/modular_citadel/sound/vox/blast.ogg b/modular_citadel/sound/vox/blast.ogg
new file mode 100644
index 0000000000..84a28e1fc8
Binary files /dev/null and b/modular_citadel/sound/vox/blast.ogg differ
diff --git a/modular_citadel/sound/vox/blocked.ogg b/modular_citadel/sound/vox/blocked.ogg
new file mode 100644
index 0000000000..f6efacfda1
Binary files /dev/null and b/modular_citadel/sound/vox/blocked.ogg differ
diff --git a/modular_citadel/sound/vox/bloop.ogg b/modular_citadel/sound/vox/bloop.ogg
new file mode 100644
index 0000000000..ada6ed636e
Binary files /dev/null and b/modular_citadel/sound/vox/bloop.ogg differ
diff --git a/modular_citadel/sound/vox/blue.ogg b/modular_citadel/sound/vox/blue.ogg
new file mode 100644
index 0000000000..a336a61968
Binary files /dev/null and b/modular_citadel/sound/vox/blue.ogg differ
diff --git a/modular_citadel/sound/vox/bottom.ogg b/modular_citadel/sound/vox/bottom.ogg
new file mode 100644
index 0000000000..b81c30477c
Binary files /dev/null and b/modular_citadel/sound/vox/bottom.ogg differ
diff --git a/modular_citadel/sound/vox/bravo.ogg b/modular_citadel/sound/vox/bravo.ogg
new file mode 100644
index 0000000000..df47058d5c
Binary files /dev/null and b/modular_citadel/sound/vox/bravo.ogg differ
diff --git a/modular_citadel/sound/vox/breach.ogg b/modular_citadel/sound/vox/breach.ogg
new file mode 100644
index 0000000000..3a4bae3f0d
Binary files /dev/null and b/modular_citadel/sound/vox/breach.ogg differ
diff --git a/modular_citadel/sound/vox/breached.ogg b/modular_citadel/sound/vox/breached.ogg
new file mode 100644
index 0000000000..0823bfc0d9
Binary files /dev/null and b/modular_citadel/sound/vox/breached.ogg differ
diff --git a/modular_citadel/sound/vox/break.ogg b/modular_citadel/sound/vox/break.ogg
new file mode 100644
index 0000000000..1bebe2b940
Binary files /dev/null and b/modular_citadel/sound/vox/break.ogg differ
diff --git a/modular_citadel/sound/vox/bridge.ogg b/modular_citadel/sound/vox/bridge.ogg
new file mode 100644
index 0000000000..8de8159b1e
Binary files /dev/null and b/modular_citadel/sound/vox/bridge.ogg differ
diff --git a/modular_citadel/sound/vox/bust.ogg b/modular_citadel/sound/vox/bust.ogg
new file mode 100644
index 0000000000..67622a5e4a
Binary files /dev/null and b/modular_citadel/sound/vox/bust.ogg differ
diff --git a/modular_citadel/sound/vox/but.ogg b/modular_citadel/sound/vox/but.ogg
new file mode 100644
index 0000000000..3c4d7172ef
Binary files /dev/null and b/modular_citadel/sound/vox/but.ogg differ
diff --git a/modular_citadel/sound/vox/button.ogg b/modular_citadel/sound/vox/button.ogg
new file mode 100644
index 0000000000..74639090f8
Binary files /dev/null and b/modular_citadel/sound/vox/button.ogg differ
diff --git a/modular_citadel/sound/vox/buzwarn.ogg b/modular_citadel/sound/vox/buzwarn.ogg
new file mode 100644
index 0000000000..34595dfe9b
Binary files /dev/null and b/modular_citadel/sound/vox/buzwarn.ogg differ
diff --git a/modular_citadel/sound/vox/bypass.ogg b/modular_citadel/sound/vox/bypass.ogg
new file mode 100644
index 0000000000..649fb0ca72
Binary files /dev/null and b/modular_citadel/sound/vox/bypass.ogg differ
diff --git a/modular_citadel/sound/vox/c.ogg b/modular_citadel/sound/vox/c.ogg
new file mode 100644
index 0000000000..99fc8eeb61
Binary files /dev/null and b/modular_citadel/sound/vox/c.ogg differ
diff --git a/modular_citadel/sound/vox/cable.ogg b/modular_citadel/sound/vox/cable.ogg
new file mode 100644
index 0000000000..8a03fec7a3
Binary files /dev/null and b/modular_citadel/sound/vox/cable.ogg differ
diff --git a/modular_citadel/sound/vox/call.ogg b/modular_citadel/sound/vox/call.ogg
new file mode 100644
index 0000000000..1cd702986d
Binary files /dev/null and b/modular_citadel/sound/vox/call.ogg differ
diff --git a/modular_citadel/sound/vox/called.ogg b/modular_citadel/sound/vox/called.ogg
new file mode 100644
index 0000000000..96c87be172
Binary files /dev/null and b/modular_citadel/sound/vox/called.ogg differ
diff --git a/modular_citadel/sound/vox/canal.ogg b/modular_citadel/sound/vox/canal.ogg
new file mode 100644
index 0000000000..0d4e92deb4
Binary files /dev/null and b/modular_citadel/sound/vox/canal.ogg differ
diff --git a/modular_citadel/sound/vox/cap.ogg b/modular_citadel/sound/vox/cap.ogg
new file mode 100644
index 0000000000..c229e6f5b1
Binary files /dev/null and b/modular_citadel/sound/vox/cap.ogg differ
diff --git a/modular_citadel/sound/vox/captain.ogg b/modular_citadel/sound/vox/captain.ogg
new file mode 100644
index 0000000000..69d2521e68
Binary files /dev/null and b/modular_citadel/sound/vox/captain.ogg differ
diff --git a/modular_citadel/sound/vox/capture.ogg b/modular_citadel/sound/vox/capture.ogg
new file mode 100644
index 0000000000..18eab2035b
Binary files /dev/null and b/modular_citadel/sound/vox/capture.ogg differ
diff --git a/modular_citadel/sound/vox/captured.ogg b/modular_citadel/sound/vox/captured.ogg
new file mode 100644
index 0000000000..fd6b652809
Binary files /dev/null and b/modular_citadel/sound/vox/captured.ogg differ
diff --git a/modular_citadel/sound/vox/ceiling.ogg b/modular_citadel/sound/vox/ceiling.ogg
new file mode 100644
index 0000000000..2f8d7eca0a
Binary files /dev/null and b/modular_citadel/sound/vox/ceiling.ogg differ
diff --git a/modular_citadel/sound/vox/celsius.ogg b/modular_citadel/sound/vox/celsius.ogg
new file mode 100644
index 0000000000..abb728c5c3
Binary files /dev/null and b/modular_citadel/sound/vox/celsius.ogg differ
diff --git a/modular_citadel/sound/vox/center.ogg b/modular_citadel/sound/vox/center.ogg
new file mode 100644
index 0000000000..1936e9190d
Binary files /dev/null and b/modular_citadel/sound/vox/center.ogg differ
diff --git a/modular_citadel/sound/vox/centi.ogg b/modular_citadel/sound/vox/centi.ogg
new file mode 100644
index 0000000000..63f9ce0aed
Binary files /dev/null and b/modular_citadel/sound/vox/centi.ogg differ
diff --git a/modular_citadel/sound/vox/central.ogg b/modular_citadel/sound/vox/central.ogg
new file mode 100644
index 0000000000..a805204243
Binary files /dev/null and b/modular_citadel/sound/vox/central.ogg differ
diff --git a/modular_citadel/sound/vox/chamber.ogg b/modular_citadel/sound/vox/chamber.ogg
new file mode 100644
index 0000000000..e3c77e927f
Binary files /dev/null and b/modular_citadel/sound/vox/chamber.ogg differ
diff --git a/modular_citadel/sound/vox/charlie.ogg b/modular_citadel/sound/vox/charlie.ogg
new file mode 100644
index 0000000000..bdadd74ca0
Binary files /dev/null and b/modular_citadel/sound/vox/charlie.ogg differ
diff --git a/modular_citadel/sound/vox/check.ogg b/modular_citadel/sound/vox/check.ogg
new file mode 100644
index 0000000000..f4a2a95de7
Binary files /dev/null and b/modular_citadel/sound/vox/check.ogg differ
diff --git a/modular_citadel/sound/vox/checkpoint.ogg b/modular_citadel/sound/vox/checkpoint.ogg
new file mode 100644
index 0000000000..aca98b09fa
Binary files /dev/null and b/modular_citadel/sound/vox/checkpoint.ogg differ
diff --git a/modular_citadel/sound/vox/chemical.ogg b/modular_citadel/sound/vox/chemical.ogg
new file mode 100644
index 0000000000..f7eae25c99
Binary files /dev/null and b/modular_citadel/sound/vox/chemical.ogg differ
diff --git a/modular_citadel/sound/vox/cleanup.ogg b/modular_citadel/sound/vox/cleanup.ogg
new file mode 100644
index 0000000000..2118f130cb
Binary files /dev/null and b/modular_citadel/sound/vox/cleanup.ogg differ
diff --git a/modular_citadel/sound/vox/clear.ogg b/modular_citadel/sound/vox/clear.ogg
new file mode 100644
index 0000000000..1b97835f0f
Binary files /dev/null and b/modular_citadel/sound/vox/clear.ogg differ
diff --git a/modular_citadel/sound/vox/clearance.ogg b/modular_citadel/sound/vox/clearance.ogg
new file mode 100644
index 0000000000..d2b641df40
Binary files /dev/null and b/modular_citadel/sound/vox/clearance.ogg differ
diff --git a/modular_citadel/sound/vox/close.ogg b/modular_citadel/sound/vox/close.ogg
new file mode 100644
index 0000000000..15e9fd315c
Binary files /dev/null and b/modular_citadel/sound/vox/close.ogg differ
diff --git a/modular_citadel/sound/vox/clown.ogg b/modular_citadel/sound/vox/clown.ogg
new file mode 100644
index 0000000000..e72f9703fd
Binary files /dev/null and b/modular_citadel/sound/vox/clown.ogg differ
diff --git a/modular_citadel/sound/vox/code.ogg b/modular_citadel/sound/vox/code.ogg
new file mode 100644
index 0000000000..cee2e4c036
Binary files /dev/null and b/modular_citadel/sound/vox/code.ogg differ
diff --git a/modular_citadel/sound/vox/coded.ogg b/modular_citadel/sound/vox/coded.ogg
new file mode 100644
index 0000000000..d4435296ae
Binary files /dev/null and b/modular_citadel/sound/vox/coded.ogg differ
diff --git a/modular_citadel/sound/vox/collider.ogg b/modular_citadel/sound/vox/collider.ogg
new file mode 100644
index 0000000000..a29bda0d17
Binary files /dev/null and b/modular_citadel/sound/vox/collider.ogg differ
diff --git a/modular_citadel/sound/vox/comma.ogg b/modular_citadel/sound/vox/comma.ogg
new file mode 100644
index 0000000000..a94221d0ed
Binary files /dev/null and b/modular_citadel/sound/vox/comma.ogg differ
diff --git a/modular_citadel/sound/vox/command.ogg b/modular_citadel/sound/vox/command.ogg
new file mode 100644
index 0000000000..cf6c32f736
Binary files /dev/null and b/modular_citadel/sound/vox/command.ogg differ
diff --git a/modular_citadel/sound/vox/communication.ogg b/modular_citadel/sound/vox/communication.ogg
new file mode 100644
index 0000000000..67ec74b30d
Binary files /dev/null and b/modular_citadel/sound/vox/communication.ogg differ
diff --git a/modular_citadel/sound/vox/complex.ogg b/modular_citadel/sound/vox/complex.ogg
new file mode 100644
index 0000000000..66dad5b30a
Binary files /dev/null and b/modular_citadel/sound/vox/complex.ogg differ
diff --git a/modular_citadel/sound/vox/computer.ogg b/modular_citadel/sound/vox/computer.ogg
new file mode 100644
index 0000000000..849cf4e96c
Binary files /dev/null and b/modular_citadel/sound/vox/computer.ogg differ
diff --git a/modular_citadel/sound/vox/condition.ogg b/modular_citadel/sound/vox/condition.ogg
new file mode 100644
index 0000000000..b16ea99736
Binary files /dev/null and b/modular_citadel/sound/vox/condition.ogg differ
diff --git a/modular_citadel/sound/vox/containment.ogg b/modular_citadel/sound/vox/containment.ogg
new file mode 100644
index 0000000000..0a1424a8c0
Binary files /dev/null and b/modular_citadel/sound/vox/containment.ogg differ
diff --git a/modular_citadel/sound/vox/contamination.ogg b/modular_citadel/sound/vox/contamination.ogg
new file mode 100644
index 0000000000..0d60c1c351
Binary files /dev/null and b/modular_citadel/sound/vox/contamination.ogg differ
diff --git a/modular_citadel/sound/vox/control.ogg b/modular_citadel/sound/vox/control.ogg
new file mode 100644
index 0000000000..7e4fae7220
Binary files /dev/null and b/modular_citadel/sound/vox/control.ogg differ
diff --git a/modular_citadel/sound/vox/coolant.ogg b/modular_citadel/sound/vox/coolant.ogg
new file mode 100644
index 0000000000..ca51223548
Binary files /dev/null and b/modular_citadel/sound/vox/coolant.ogg differ
diff --git a/modular_citadel/sound/vox/coomer.ogg b/modular_citadel/sound/vox/coomer.ogg
new file mode 100644
index 0000000000..eb684a6ab7
Binary files /dev/null and b/modular_citadel/sound/vox/coomer.ogg differ
diff --git a/modular_citadel/sound/vox/core.ogg b/modular_citadel/sound/vox/core.ogg
new file mode 100644
index 0000000000..6170255986
Binary files /dev/null and b/modular_citadel/sound/vox/core.ogg differ
diff --git a/modular_citadel/sound/vox/correct.ogg b/modular_citadel/sound/vox/correct.ogg
new file mode 100644
index 0000000000..99ca3efccc
Binary files /dev/null and b/modular_citadel/sound/vox/correct.ogg differ
diff --git a/modular_citadel/sound/vox/corridor.ogg b/modular_citadel/sound/vox/corridor.ogg
new file mode 100644
index 0000000000..e3ddeb39cc
Binary files /dev/null and b/modular_citadel/sound/vox/corridor.ogg differ
diff --git a/modular_citadel/sound/vox/crew.ogg b/modular_citadel/sound/vox/crew.ogg
new file mode 100644
index 0000000000..b63ce31874
Binary files /dev/null and b/modular_citadel/sound/vox/crew.ogg differ
diff --git a/modular_citadel/sound/vox/cross.ogg b/modular_citadel/sound/vox/cross.ogg
new file mode 100644
index 0000000000..ffd9f4161d
Binary files /dev/null and b/modular_citadel/sound/vox/cross.ogg differ
diff --git a/modular_citadel/sound/vox/cryogenic.ogg b/modular_citadel/sound/vox/cryogenic.ogg
new file mode 100644
index 0000000000..def31fe7c0
Binary files /dev/null and b/modular_citadel/sound/vox/cryogenic.ogg differ
diff --git a/modular_citadel/sound/vox/d.ogg b/modular_citadel/sound/vox/d.ogg
new file mode 100644
index 0000000000..08b85fc9eb
Binary files /dev/null and b/modular_citadel/sound/vox/d.ogg differ
diff --git a/modular_citadel/sound/vox/dadeda.ogg b/modular_citadel/sound/vox/dadeda.ogg
new file mode 100644
index 0000000000..9fd19f577c
Binary files /dev/null and b/modular_citadel/sound/vox/dadeda.ogg differ
diff --git a/modular_citadel/sound/vox/damage.ogg b/modular_citadel/sound/vox/damage.ogg
new file mode 100644
index 0000000000..d45cb0b532
Binary files /dev/null and b/modular_citadel/sound/vox/damage.ogg differ
diff --git a/modular_citadel/sound/vox/damaged.ogg b/modular_citadel/sound/vox/damaged.ogg
new file mode 100644
index 0000000000..cec2617cd2
Binary files /dev/null and b/modular_citadel/sound/vox/damaged.ogg differ
diff --git a/modular_citadel/sound/vox/danger.ogg b/modular_citadel/sound/vox/danger.ogg
new file mode 100644
index 0000000000..50bce6a5a5
Binary files /dev/null and b/modular_citadel/sound/vox/danger.ogg differ
diff --git a/modular_citadel/sound/vox/day.ogg b/modular_citadel/sound/vox/day.ogg
new file mode 100644
index 0000000000..c11c1b696c
Binary files /dev/null and b/modular_citadel/sound/vox/day.ogg differ
diff --git a/modular_citadel/sound/vox/deactivated.ogg b/modular_citadel/sound/vox/deactivated.ogg
new file mode 100644
index 0000000000..2c700cf4a7
Binary files /dev/null and b/modular_citadel/sound/vox/deactivated.ogg differ
diff --git a/modular_citadel/sound/vox/decompression.ogg b/modular_citadel/sound/vox/decompression.ogg
new file mode 100644
index 0000000000..39ba52f36a
Binary files /dev/null and b/modular_citadel/sound/vox/decompression.ogg differ
diff --git a/modular_citadel/sound/vox/decontamination.ogg b/modular_citadel/sound/vox/decontamination.ogg
new file mode 100644
index 0000000000..2115ec8aa4
Binary files /dev/null and b/modular_citadel/sound/vox/decontamination.ogg differ
diff --git a/modular_citadel/sound/vox/deeoo.ogg b/modular_citadel/sound/vox/deeoo.ogg
new file mode 100644
index 0000000000..22197de5e6
Binary files /dev/null and b/modular_citadel/sound/vox/deeoo.ogg differ
diff --git a/modular_citadel/sound/vox/defense.ogg b/modular_citadel/sound/vox/defense.ogg
new file mode 100644
index 0000000000..dc00256e0f
Binary files /dev/null and b/modular_citadel/sound/vox/defense.ogg differ
diff --git a/modular_citadel/sound/vox/degrees.ogg b/modular_citadel/sound/vox/degrees.ogg
new file mode 100644
index 0000000000..eb640ca08c
Binary files /dev/null and b/modular_citadel/sound/vox/degrees.ogg differ
diff --git a/modular_citadel/sound/vox/delta.ogg b/modular_citadel/sound/vox/delta.ogg
new file mode 100644
index 0000000000..93cbe2bdb6
Binary files /dev/null and b/modular_citadel/sound/vox/delta.ogg differ
diff --git a/modular_citadel/sound/vox/denied.ogg b/modular_citadel/sound/vox/denied.ogg
new file mode 100644
index 0000000000..8ef3366dbc
Binary files /dev/null and b/modular_citadel/sound/vox/denied.ogg differ
diff --git a/modular_citadel/sound/vox/deploy.ogg b/modular_citadel/sound/vox/deploy.ogg
new file mode 100644
index 0000000000..71bd4c4d7d
Binary files /dev/null and b/modular_citadel/sound/vox/deploy.ogg differ
diff --git a/modular_citadel/sound/vox/deployed.ogg b/modular_citadel/sound/vox/deployed.ogg
new file mode 100644
index 0000000000..d21fa814ba
Binary files /dev/null and b/modular_citadel/sound/vox/deployed.ogg differ
diff --git a/modular_citadel/sound/vox/destroy.ogg b/modular_citadel/sound/vox/destroy.ogg
new file mode 100644
index 0000000000..954d474a07
Binary files /dev/null and b/modular_citadel/sound/vox/destroy.ogg differ
diff --git a/modular_citadel/sound/vox/destroyed.ogg b/modular_citadel/sound/vox/destroyed.ogg
new file mode 100644
index 0000000000..cf5f20bf84
Binary files /dev/null and b/modular_citadel/sound/vox/destroyed.ogg differ
diff --git a/modular_citadel/sound/vox/detain.ogg b/modular_citadel/sound/vox/detain.ogg
new file mode 100644
index 0000000000..98a6d34c2f
Binary files /dev/null and b/modular_citadel/sound/vox/detain.ogg differ
diff --git a/modular_citadel/sound/vox/detected.ogg b/modular_citadel/sound/vox/detected.ogg
new file mode 100644
index 0000000000..80704064a4
Binary files /dev/null and b/modular_citadel/sound/vox/detected.ogg differ
diff --git a/modular_citadel/sound/vox/detonation.ogg b/modular_citadel/sound/vox/detonation.ogg
new file mode 100644
index 0000000000..a6c64c331c
Binary files /dev/null and b/modular_citadel/sound/vox/detonation.ogg differ
diff --git a/modular_citadel/sound/vox/device.ogg b/modular_citadel/sound/vox/device.ogg
new file mode 100644
index 0000000000..3f1b4905df
Binary files /dev/null and b/modular_citadel/sound/vox/device.ogg differ
diff --git a/modular_citadel/sound/vox/did.ogg b/modular_citadel/sound/vox/did.ogg
new file mode 100644
index 0000000000..966e8a3a13
Binary files /dev/null and b/modular_citadel/sound/vox/did.ogg differ
diff --git a/modular_citadel/sound/vox/die.ogg b/modular_citadel/sound/vox/die.ogg
new file mode 100644
index 0000000000..b2f99b4152
Binary files /dev/null and b/modular_citadel/sound/vox/die.ogg differ
diff --git a/modular_citadel/sound/vox/dimensional.ogg b/modular_citadel/sound/vox/dimensional.ogg
new file mode 100644
index 0000000000..a4ed638db0
Binary files /dev/null and b/modular_citadel/sound/vox/dimensional.ogg differ
diff --git a/modular_citadel/sound/vox/dirt.ogg b/modular_citadel/sound/vox/dirt.ogg
new file mode 100644
index 0000000000..b175b93205
Binary files /dev/null and b/modular_citadel/sound/vox/dirt.ogg differ
diff --git a/modular_citadel/sound/vox/disengaged.ogg b/modular_citadel/sound/vox/disengaged.ogg
new file mode 100644
index 0000000000..eb75ab975b
Binary files /dev/null and b/modular_citadel/sound/vox/disengaged.ogg differ
diff --git a/modular_citadel/sound/vox/dish.ogg b/modular_citadel/sound/vox/dish.ogg
new file mode 100644
index 0000000000..3b0f1f58ce
Binary files /dev/null and b/modular_citadel/sound/vox/dish.ogg differ
diff --git a/modular_citadel/sound/vox/disposal.ogg b/modular_citadel/sound/vox/disposal.ogg
new file mode 100644
index 0000000000..1a4c1f8bd1
Binary files /dev/null and b/modular_citadel/sound/vox/disposal.ogg differ
diff --git a/modular_citadel/sound/vox/distance.ogg b/modular_citadel/sound/vox/distance.ogg
new file mode 100644
index 0000000000..8bcec9ac7c
Binary files /dev/null and b/modular_citadel/sound/vox/distance.ogg differ
diff --git a/modular_citadel/sound/vox/distortion.ogg b/modular_citadel/sound/vox/distortion.ogg
new file mode 100644
index 0000000000..7ee3a5f560
Binary files /dev/null and b/modular_citadel/sound/vox/distortion.ogg differ
diff --git a/modular_citadel/sound/vox/do.ogg b/modular_citadel/sound/vox/do.ogg
new file mode 100644
index 0000000000..7202691b87
Binary files /dev/null and b/modular_citadel/sound/vox/do.ogg differ
diff --git a/modular_citadel/sound/vox/doctor.ogg b/modular_citadel/sound/vox/doctor.ogg
new file mode 100644
index 0000000000..adbbfab77a
Binary files /dev/null and b/modular_citadel/sound/vox/doctor.ogg differ
diff --git a/modular_citadel/sound/vox/doop.ogg b/modular_citadel/sound/vox/doop.ogg
new file mode 100644
index 0000000000..b497a8594d
Binary files /dev/null and b/modular_citadel/sound/vox/doop.ogg differ
diff --git a/modular_citadel/sound/vox/door.ogg b/modular_citadel/sound/vox/door.ogg
new file mode 100644
index 0000000000..db389b4eb9
Binary files /dev/null and b/modular_citadel/sound/vox/door.ogg differ
diff --git a/modular_citadel/sound/vox/down.ogg b/modular_citadel/sound/vox/down.ogg
new file mode 100644
index 0000000000..e16b0249dd
Binary files /dev/null and b/modular_citadel/sound/vox/down.ogg differ
diff --git a/modular_citadel/sound/vox/dual.ogg b/modular_citadel/sound/vox/dual.ogg
new file mode 100644
index 0000000000..d8833faf9b
Binary files /dev/null and b/modular_citadel/sound/vox/dual.ogg differ
diff --git a/modular_citadel/sound/vox/duct.ogg b/modular_citadel/sound/vox/duct.ogg
new file mode 100644
index 0000000000..23379f6cc2
Binary files /dev/null and b/modular_citadel/sound/vox/duct.ogg differ
diff --git a/modular_citadel/sound/vox/e.ogg b/modular_citadel/sound/vox/e.ogg
new file mode 100644
index 0000000000..105ea13ef2
Binary files /dev/null and b/modular_citadel/sound/vox/e.ogg differ
diff --git a/modular_citadel/sound/vox/east.ogg b/modular_citadel/sound/vox/east.ogg
new file mode 100644
index 0000000000..9e69856edb
Binary files /dev/null and b/modular_citadel/sound/vox/east.ogg differ
diff --git a/modular_citadel/sound/vox/echo.ogg b/modular_citadel/sound/vox/echo.ogg
new file mode 100644
index 0000000000..3ee16750a4
Binary files /dev/null and b/modular_citadel/sound/vox/echo.ogg differ
diff --git a/modular_citadel/sound/vox/ed.ogg b/modular_citadel/sound/vox/ed.ogg
new file mode 100644
index 0000000000..094bd4f3ba
Binary files /dev/null and b/modular_citadel/sound/vox/ed.ogg differ
diff --git a/modular_citadel/sound/vox/effect.ogg b/modular_citadel/sound/vox/effect.ogg
new file mode 100644
index 0000000000..01a77a1bba
Binary files /dev/null and b/modular_citadel/sound/vox/effect.ogg differ
diff --git a/modular_citadel/sound/vox/egress.ogg b/modular_citadel/sound/vox/egress.ogg
new file mode 100644
index 0000000000..6da62c754a
Binary files /dev/null and b/modular_citadel/sound/vox/egress.ogg differ
diff --git a/modular_citadel/sound/vox/eight.ogg b/modular_citadel/sound/vox/eight.ogg
new file mode 100644
index 0000000000..7c64ba326b
Binary files /dev/null and b/modular_citadel/sound/vox/eight.ogg differ
diff --git a/modular_citadel/sound/vox/eighteen.ogg b/modular_citadel/sound/vox/eighteen.ogg
new file mode 100644
index 0000000000..73330bfaa2
Binary files /dev/null and b/modular_citadel/sound/vox/eighteen.ogg differ
diff --git a/modular_citadel/sound/vox/eighty.ogg b/modular_citadel/sound/vox/eighty.ogg
new file mode 100644
index 0000000000..c190b69e02
Binary files /dev/null and b/modular_citadel/sound/vox/eighty.ogg differ
diff --git a/modular_citadel/sound/vox/electric.ogg b/modular_citadel/sound/vox/electric.ogg
new file mode 100644
index 0000000000..7d7154b350
Binary files /dev/null and b/modular_citadel/sound/vox/electric.ogg differ
diff --git a/modular_citadel/sound/vox/electromagnetic.ogg b/modular_citadel/sound/vox/electromagnetic.ogg
new file mode 100644
index 0000000000..160725e8c0
Binary files /dev/null and b/modular_citadel/sound/vox/electromagnetic.ogg differ
diff --git a/modular_citadel/sound/vox/elevator.ogg b/modular_citadel/sound/vox/elevator.ogg
new file mode 100644
index 0000000000..bcafc3ce3f
Binary files /dev/null and b/modular_citadel/sound/vox/elevator.ogg differ
diff --git a/modular_citadel/sound/vox/eleven.ogg b/modular_citadel/sound/vox/eleven.ogg
new file mode 100644
index 0000000000..6607692e1d
Binary files /dev/null and b/modular_citadel/sound/vox/eleven.ogg differ
diff --git a/modular_citadel/sound/vox/eliminate.ogg b/modular_citadel/sound/vox/eliminate.ogg
new file mode 100644
index 0000000000..2e81f5eb6c
Binary files /dev/null and b/modular_citadel/sound/vox/eliminate.ogg differ
diff --git a/modular_citadel/sound/vox/emergency.ogg b/modular_citadel/sound/vox/emergency.ogg
new file mode 100644
index 0000000000..5d2e068944
Binary files /dev/null and b/modular_citadel/sound/vox/emergency.ogg differ
diff --git a/modular_citadel/sound/vox/enemy.ogg b/modular_citadel/sound/vox/enemy.ogg
new file mode 100644
index 0000000000..ecee923235
Binary files /dev/null and b/modular_citadel/sound/vox/enemy.ogg differ
diff --git a/modular_citadel/sound/vox/energy.ogg b/modular_citadel/sound/vox/energy.ogg
new file mode 100644
index 0000000000..82d07e95dd
Binary files /dev/null and b/modular_citadel/sound/vox/energy.ogg differ
diff --git a/modular_citadel/sound/vox/engage.ogg b/modular_citadel/sound/vox/engage.ogg
new file mode 100644
index 0000000000..7e1cf2e625
Binary files /dev/null and b/modular_citadel/sound/vox/engage.ogg differ
diff --git a/modular_citadel/sound/vox/engaged.ogg b/modular_citadel/sound/vox/engaged.ogg
new file mode 100644
index 0000000000..0e8196b026
Binary files /dev/null and b/modular_citadel/sound/vox/engaged.ogg differ
diff --git a/modular_citadel/sound/vox/engine.ogg b/modular_citadel/sound/vox/engine.ogg
new file mode 100644
index 0000000000..0ed1b4bd80
Binary files /dev/null and b/modular_citadel/sound/vox/engine.ogg differ
diff --git a/modular_citadel/sound/vox/enter.ogg b/modular_citadel/sound/vox/enter.ogg
new file mode 100644
index 0000000000..d7392eeada
Binary files /dev/null and b/modular_citadel/sound/vox/enter.ogg differ
diff --git a/modular_citadel/sound/vox/entry.ogg b/modular_citadel/sound/vox/entry.ogg
new file mode 100644
index 0000000000..1ef6b14442
Binary files /dev/null and b/modular_citadel/sound/vox/entry.ogg differ
diff --git a/modular_citadel/sound/vox/environment.ogg b/modular_citadel/sound/vox/environment.ogg
new file mode 100644
index 0000000000..d05ba3106a
Binary files /dev/null and b/modular_citadel/sound/vox/environment.ogg differ
diff --git a/modular_citadel/sound/vox/error.ogg b/modular_citadel/sound/vox/error.ogg
new file mode 100644
index 0000000000..237191732a
Binary files /dev/null and b/modular_citadel/sound/vox/error.ogg differ
diff --git a/modular_citadel/sound/vox/escape.ogg b/modular_citadel/sound/vox/escape.ogg
new file mode 100644
index 0000000000..15e1181ac6
Binary files /dev/null and b/modular_citadel/sound/vox/escape.ogg differ
diff --git a/modular_citadel/sound/vox/evacuate.ogg b/modular_citadel/sound/vox/evacuate.ogg
new file mode 100644
index 0000000000..d0d755f1ba
Binary files /dev/null and b/modular_citadel/sound/vox/evacuate.ogg differ
diff --git a/modular_citadel/sound/vox/exchange.ogg b/modular_citadel/sound/vox/exchange.ogg
new file mode 100644
index 0000000000..d69eac774a
Binary files /dev/null and b/modular_citadel/sound/vox/exchange.ogg differ
diff --git a/modular_citadel/sound/vox/exit.ogg b/modular_citadel/sound/vox/exit.ogg
new file mode 100644
index 0000000000..a201b6b76b
Binary files /dev/null and b/modular_citadel/sound/vox/exit.ogg differ
diff --git a/modular_citadel/sound/vox/expect.ogg b/modular_citadel/sound/vox/expect.ogg
new file mode 100644
index 0000000000..95e559fdd3
Binary files /dev/null and b/modular_citadel/sound/vox/expect.ogg differ
diff --git a/modular_citadel/sound/vox/experiment.ogg b/modular_citadel/sound/vox/experiment.ogg
new file mode 100644
index 0000000000..34ef253e69
Binary files /dev/null and b/modular_citadel/sound/vox/experiment.ogg differ
diff --git a/modular_citadel/sound/vox/experimental.ogg b/modular_citadel/sound/vox/experimental.ogg
new file mode 100644
index 0000000000..6635998222
Binary files /dev/null and b/modular_citadel/sound/vox/experimental.ogg differ
diff --git a/modular_citadel/sound/vox/explode.ogg b/modular_citadel/sound/vox/explode.ogg
new file mode 100644
index 0000000000..16b38926e4
Binary files /dev/null and b/modular_citadel/sound/vox/explode.ogg differ
diff --git a/modular_citadel/sound/vox/explosion.ogg b/modular_citadel/sound/vox/explosion.ogg
new file mode 100644
index 0000000000..ede66453bd
Binary files /dev/null and b/modular_citadel/sound/vox/explosion.ogg differ
diff --git a/modular_citadel/sound/vox/exposure.ogg b/modular_citadel/sound/vox/exposure.ogg
new file mode 100644
index 0000000000..d2f66ca1ba
Binary files /dev/null and b/modular_citadel/sound/vox/exposure.ogg differ
diff --git a/modular_citadel/sound/vox/exterminate.ogg b/modular_citadel/sound/vox/exterminate.ogg
new file mode 100644
index 0000000000..34be77f8e2
Binary files /dev/null and b/modular_citadel/sound/vox/exterminate.ogg differ
diff --git a/modular_citadel/sound/vox/extinguish.ogg b/modular_citadel/sound/vox/extinguish.ogg
new file mode 100644
index 0000000000..c003ff4547
Binary files /dev/null and b/modular_citadel/sound/vox/extinguish.ogg differ
diff --git a/modular_citadel/sound/vox/extinguisher.ogg b/modular_citadel/sound/vox/extinguisher.ogg
new file mode 100644
index 0000000000..d23b898014
Binary files /dev/null and b/modular_citadel/sound/vox/extinguisher.ogg differ
diff --git a/modular_citadel/sound/vox/extreme.ogg b/modular_citadel/sound/vox/extreme.ogg
new file mode 100644
index 0000000000..c3f5a2d9f0
Binary files /dev/null and b/modular_citadel/sound/vox/extreme.ogg differ
diff --git a/modular_citadel/sound/vox/f.ogg b/modular_citadel/sound/vox/f.ogg
new file mode 100644
index 0000000000..344734986f
Binary files /dev/null and b/modular_citadel/sound/vox/f.ogg differ
diff --git a/modular_citadel/sound/vox/face.ogg b/modular_citadel/sound/vox/face.ogg
new file mode 100644
index 0000000000..acdd8722ef
Binary files /dev/null and b/modular_citadel/sound/vox/face.ogg differ
diff --git a/modular_citadel/sound/vox/facility.ogg b/modular_citadel/sound/vox/facility.ogg
new file mode 100644
index 0000000000..43649febb0
Binary files /dev/null and b/modular_citadel/sound/vox/facility.ogg differ
diff --git a/modular_citadel/sound/vox/fahrenheit.ogg b/modular_citadel/sound/vox/fahrenheit.ogg
new file mode 100644
index 0000000000..4730726ea4
Binary files /dev/null and b/modular_citadel/sound/vox/fahrenheit.ogg differ
diff --git a/modular_citadel/sound/vox/failed.ogg b/modular_citadel/sound/vox/failed.ogg
new file mode 100644
index 0000000000..f801962345
Binary files /dev/null and b/modular_citadel/sound/vox/failed.ogg differ
diff --git a/modular_citadel/sound/vox/failure.ogg b/modular_citadel/sound/vox/failure.ogg
new file mode 100644
index 0000000000..e9b5808f27
Binary files /dev/null and b/modular_citadel/sound/vox/failure.ogg differ
diff --git a/modular_citadel/sound/vox/farthest.ogg b/modular_citadel/sound/vox/farthest.ogg
new file mode 100644
index 0000000000..3d18f669b1
Binary files /dev/null and b/modular_citadel/sound/vox/farthest.ogg differ
diff --git a/modular_citadel/sound/vox/fast.ogg b/modular_citadel/sound/vox/fast.ogg
new file mode 100644
index 0000000000..dbf82c32a4
Binary files /dev/null and b/modular_citadel/sound/vox/fast.ogg differ
diff --git a/modular_citadel/sound/vox/feet.ogg b/modular_citadel/sound/vox/feet.ogg
new file mode 100644
index 0000000000..eba093e73d
Binary files /dev/null and b/modular_citadel/sound/vox/feet.ogg differ
diff --git a/modular_citadel/sound/vox/field.ogg b/modular_citadel/sound/vox/field.ogg
new file mode 100644
index 0000000000..bba79e6ddd
Binary files /dev/null and b/modular_citadel/sound/vox/field.ogg differ
diff --git a/modular_citadel/sound/vox/fifteen.ogg b/modular_citadel/sound/vox/fifteen.ogg
new file mode 100644
index 0000000000..60eca844ae
Binary files /dev/null and b/modular_citadel/sound/vox/fifteen.ogg differ
diff --git a/modular_citadel/sound/vox/fifth.ogg b/modular_citadel/sound/vox/fifth.ogg
new file mode 100644
index 0000000000..d6a76567d2
Binary files /dev/null and b/modular_citadel/sound/vox/fifth.ogg differ
diff --git a/modular_citadel/sound/vox/fifty.ogg b/modular_citadel/sound/vox/fifty.ogg
new file mode 100644
index 0000000000..30fd60072b
Binary files /dev/null and b/modular_citadel/sound/vox/fifty.ogg differ
diff --git a/modular_citadel/sound/vox/final.ogg b/modular_citadel/sound/vox/final.ogg
new file mode 100644
index 0000000000..d06bef9fc2
Binary files /dev/null and b/modular_citadel/sound/vox/final.ogg differ
diff --git a/modular_citadel/sound/vox/fine.ogg b/modular_citadel/sound/vox/fine.ogg
new file mode 100644
index 0000000000..3445a9ea54
Binary files /dev/null and b/modular_citadel/sound/vox/fine.ogg differ
diff --git a/modular_citadel/sound/vox/fire.ogg b/modular_citadel/sound/vox/fire.ogg
new file mode 100644
index 0000000000..094043b953
Binary files /dev/null and b/modular_citadel/sound/vox/fire.ogg differ
diff --git a/modular_citadel/sound/vox/first.ogg b/modular_citadel/sound/vox/first.ogg
new file mode 100644
index 0000000000..84977e4eb7
Binary files /dev/null and b/modular_citadel/sound/vox/first.ogg differ
diff --git a/modular_citadel/sound/vox/five.ogg b/modular_citadel/sound/vox/five.ogg
new file mode 100644
index 0000000000..0a28539c34
Binary files /dev/null and b/modular_citadel/sound/vox/five.ogg differ
diff --git a/modular_citadel/sound/vox/flag.ogg b/modular_citadel/sound/vox/flag.ogg
new file mode 100644
index 0000000000..0d13587d60
Binary files /dev/null and b/modular_citadel/sound/vox/flag.ogg differ
diff --git a/modular_citadel/sound/vox/flooding.ogg b/modular_citadel/sound/vox/flooding.ogg
new file mode 100644
index 0000000000..c32bf475f5
Binary files /dev/null and b/modular_citadel/sound/vox/flooding.ogg differ
diff --git a/modular_citadel/sound/vox/floor.ogg b/modular_citadel/sound/vox/floor.ogg
new file mode 100644
index 0000000000..14d4a84131
Binary files /dev/null and b/modular_citadel/sound/vox/floor.ogg differ
diff --git a/modular_citadel/sound/vox/fool.ogg b/modular_citadel/sound/vox/fool.ogg
new file mode 100644
index 0000000000..965251cc4a
Binary files /dev/null and b/modular_citadel/sound/vox/fool.ogg differ
diff --git a/modular_citadel/sound/vox/for.ogg b/modular_citadel/sound/vox/for.ogg
new file mode 100644
index 0000000000..b69a8f4b6c
Binary files /dev/null and b/modular_citadel/sound/vox/for.ogg differ
diff --git a/modular_citadel/sound/vox/forbidden.ogg b/modular_citadel/sound/vox/forbidden.ogg
new file mode 100644
index 0000000000..23daae8496
Binary files /dev/null and b/modular_citadel/sound/vox/forbidden.ogg differ
diff --git a/modular_citadel/sound/vox/force.ogg b/modular_citadel/sound/vox/force.ogg
new file mode 100644
index 0000000000..ff4cb84c3a
Binary files /dev/null and b/modular_citadel/sound/vox/force.ogg differ
diff --git a/modular_citadel/sound/vox/forms.ogg b/modular_citadel/sound/vox/forms.ogg
new file mode 100644
index 0000000000..7ef1862bb6
Binary files /dev/null and b/modular_citadel/sound/vox/forms.ogg differ
diff --git a/modular_citadel/sound/vox/found.ogg b/modular_citadel/sound/vox/found.ogg
new file mode 100644
index 0000000000..660a2f8520
Binary files /dev/null and b/modular_citadel/sound/vox/found.ogg differ
diff --git a/modular_citadel/sound/vox/four.ogg b/modular_citadel/sound/vox/four.ogg
new file mode 100644
index 0000000000..df8adfcd31
Binary files /dev/null and b/modular_citadel/sound/vox/four.ogg differ
diff --git a/modular_citadel/sound/vox/fourteen.ogg b/modular_citadel/sound/vox/fourteen.ogg
new file mode 100644
index 0000000000..21b61a0fd5
Binary files /dev/null and b/modular_citadel/sound/vox/fourteen.ogg differ
diff --git a/modular_citadel/sound/vox/fourth.ogg b/modular_citadel/sound/vox/fourth.ogg
new file mode 100644
index 0000000000..986102ea54
Binary files /dev/null and b/modular_citadel/sound/vox/fourth.ogg differ
diff --git a/modular_citadel/sound/vox/fourty.ogg b/modular_citadel/sound/vox/fourty.ogg
new file mode 100644
index 0000000000..b0edb0a7c7
Binary files /dev/null and b/modular_citadel/sound/vox/fourty.ogg differ
diff --git a/modular_citadel/sound/vox/foxtrot.ogg b/modular_citadel/sound/vox/foxtrot.ogg
new file mode 100644
index 0000000000..3be534fd22
Binary files /dev/null and b/modular_citadel/sound/vox/foxtrot.ogg differ
diff --git a/modular_citadel/sound/vox/freeman.ogg b/modular_citadel/sound/vox/freeman.ogg
new file mode 100644
index 0000000000..b2bc590942
Binary files /dev/null and b/modular_citadel/sound/vox/freeman.ogg differ
diff --git a/modular_citadel/sound/vox/freezer.ogg b/modular_citadel/sound/vox/freezer.ogg
new file mode 100644
index 0000000000..6bb30ad953
Binary files /dev/null and b/modular_citadel/sound/vox/freezer.ogg differ
diff --git a/modular_citadel/sound/vox/from.ogg b/modular_citadel/sound/vox/from.ogg
new file mode 100644
index 0000000000..535de03d14
Binary files /dev/null and b/modular_citadel/sound/vox/from.ogg differ
diff --git a/modular_citadel/sound/vox/front.ogg b/modular_citadel/sound/vox/front.ogg
new file mode 100644
index 0000000000..f1755a788b
Binary files /dev/null and b/modular_citadel/sound/vox/front.ogg differ
diff --git a/modular_citadel/sound/vox/fuel.ogg b/modular_citadel/sound/vox/fuel.ogg
new file mode 100644
index 0000000000..53d7889314
Binary files /dev/null and b/modular_citadel/sound/vox/fuel.ogg differ
diff --git a/modular_citadel/sound/vox/g.ogg b/modular_citadel/sound/vox/g.ogg
new file mode 100644
index 0000000000..a3702ca3e5
Binary files /dev/null and b/modular_citadel/sound/vox/g.ogg differ
diff --git a/modular_citadel/sound/vox/gay.ogg b/modular_citadel/sound/vox/gay.ogg
new file mode 100644
index 0000000000..a70d05716b
Binary files /dev/null and b/modular_citadel/sound/vox/gay.ogg differ
diff --git a/modular_citadel/sound/vox/get.ogg b/modular_citadel/sound/vox/get.ogg
new file mode 100644
index 0000000000..b5c0d47cd5
Binary files /dev/null and b/modular_citadel/sound/vox/get.ogg differ
diff --git a/modular_citadel/sound/vox/go.ogg b/modular_citadel/sound/vox/go.ogg
new file mode 100644
index 0000000000..f7dcb56f8e
Binary files /dev/null and b/modular_citadel/sound/vox/go.ogg differ
diff --git a/modular_citadel/sound/vox/going.ogg b/modular_citadel/sound/vox/going.ogg
new file mode 100644
index 0000000000..3ff4fe5427
Binary files /dev/null and b/modular_citadel/sound/vox/going.ogg differ
diff --git a/modular_citadel/sound/vox/good.ogg b/modular_citadel/sound/vox/good.ogg
new file mode 100644
index 0000000000..c8115bb5fb
Binary files /dev/null and b/modular_citadel/sound/vox/good.ogg differ
diff --git a/modular_citadel/sound/vox/goodbye.ogg b/modular_citadel/sound/vox/goodbye.ogg
new file mode 100644
index 0000000000..e793ba2fa6
Binary files /dev/null and b/modular_citadel/sound/vox/goodbye.ogg differ
diff --git a/modular_citadel/sound/vox/gordon.ogg b/modular_citadel/sound/vox/gordon.ogg
new file mode 100644
index 0000000000..5d5ab4ddba
Binary files /dev/null and b/modular_citadel/sound/vox/gordon.ogg differ
diff --git a/modular_citadel/sound/vox/got.ogg b/modular_citadel/sound/vox/got.ogg
new file mode 100644
index 0000000000..3d712c9fc4
Binary files /dev/null and b/modular_citadel/sound/vox/got.ogg differ
diff --git a/modular_citadel/sound/vox/government.ogg b/modular_citadel/sound/vox/government.ogg
new file mode 100644
index 0000000000..830b59bac2
Binary files /dev/null and b/modular_citadel/sound/vox/government.ogg differ
diff --git a/modular_citadel/sound/vox/granted.ogg b/modular_citadel/sound/vox/granted.ogg
new file mode 100644
index 0000000000..4dae196cf6
Binary files /dev/null and b/modular_citadel/sound/vox/granted.ogg differ
diff --git a/modular_citadel/sound/vox/great.ogg b/modular_citadel/sound/vox/great.ogg
new file mode 100644
index 0000000000..d820a56179
Binary files /dev/null and b/modular_citadel/sound/vox/great.ogg differ
diff --git a/modular_citadel/sound/vox/green.ogg b/modular_citadel/sound/vox/green.ogg
new file mode 100644
index 0000000000..05f6e6b0fa
Binary files /dev/null and b/modular_citadel/sound/vox/green.ogg differ
diff --git a/modular_citadel/sound/vox/grenade.ogg b/modular_citadel/sound/vox/grenade.ogg
new file mode 100644
index 0000000000..971a5d515b
Binary files /dev/null and b/modular_citadel/sound/vox/grenade.ogg differ
diff --git a/modular_citadel/sound/vox/guard.ogg b/modular_citadel/sound/vox/guard.ogg
new file mode 100644
index 0000000000..795ba08486
Binary files /dev/null and b/modular_citadel/sound/vox/guard.ogg differ
diff --git a/modular_citadel/sound/vox/gulf.ogg b/modular_citadel/sound/vox/gulf.ogg
new file mode 100644
index 0000000000..87cc1f953d
Binary files /dev/null and b/modular_citadel/sound/vox/gulf.ogg differ
diff --git a/modular_citadel/sound/vox/gun.ogg b/modular_citadel/sound/vox/gun.ogg
new file mode 100644
index 0000000000..472620ea76
Binary files /dev/null and b/modular_citadel/sound/vox/gun.ogg differ
diff --git a/modular_citadel/sound/vox/guthrie.ogg b/modular_citadel/sound/vox/guthrie.ogg
new file mode 100644
index 0000000000..b87c5f6cb1
Binary files /dev/null and b/modular_citadel/sound/vox/guthrie.ogg differ
diff --git a/modular_citadel/sound/vox/handling.ogg b/modular_citadel/sound/vox/handling.ogg
new file mode 100644
index 0000000000..be05e82d75
Binary files /dev/null and b/modular_citadel/sound/vox/handling.ogg differ
diff --git a/modular_citadel/sound/vox/hangar.ogg b/modular_citadel/sound/vox/hangar.ogg
new file mode 100644
index 0000000000..d6fe4084ae
Binary files /dev/null and b/modular_citadel/sound/vox/hangar.ogg differ
diff --git a/modular_citadel/sound/vox/has.ogg b/modular_citadel/sound/vox/has.ogg
new file mode 100644
index 0000000000..055cb0dc15
Binary files /dev/null and b/modular_citadel/sound/vox/has.ogg differ
diff --git a/modular_citadel/sound/vox/have.ogg b/modular_citadel/sound/vox/have.ogg
new file mode 100644
index 0000000000..c514165582
Binary files /dev/null and b/modular_citadel/sound/vox/have.ogg differ
diff --git a/modular_citadel/sound/vox/hazard.ogg b/modular_citadel/sound/vox/hazard.ogg
new file mode 100644
index 0000000000..032b1fb251
Binary files /dev/null and b/modular_citadel/sound/vox/hazard.ogg differ
diff --git a/modular_citadel/sound/vox/head.ogg b/modular_citadel/sound/vox/head.ogg
new file mode 100644
index 0000000000..e4902fcc6f
Binary files /dev/null and b/modular_citadel/sound/vox/head.ogg differ
diff --git a/modular_citadel/sound/vox/health.ogg b/modular_citadel/sound/vox/health.ogg
new file mode 100644
index 0000000000..c11ad1bcf2
Binary files /dev/null and b/modular_citadel/sound/vox/health.ogg differ
diff --git a/modular_citadel/sound/vox/heat.ogg b/modular_citadel/sound/vox/heat.ogg
new file mode 100644
index 0000000000..a6c0752ab8
Binary files /dev/null and b/modular_citadel/sound/vox/heat.ogg differ
diff --git a/modular_citadel/sound/vox/helicopter.ogg b/modular_citadel/sound/vox/helicopter.ogg
new file mode 100644
index 0000000000..6bfe6466b2
Binary files /dev/null and b/modular_citadel/sound/vox/helicopter.ogg differ
diff --git a/modular_citadel/sound/vox/helium.ogg b/modular_citadel/sound/vox/helium.ogg
new file mode 100644
index 0000000000..4a5c8326a5
Binary files /dev/null and b/modular_citadel/sound/vox/helium.ogg differ
diff --git a/modular_citadel/sound/vox/hello.ogg b/modular_citadel/sound/vox/hello.ogg
new file mode 100644
index 0000000000..622e4669ef
Binary files /dev/null and b/modular_citadel/sound/vox/hello.ogg differ
diff --git a/modular_citadel/sound/vox/help.ogg b/modular_citadel/sound/vox/help.ogg
new file mode 100644
index 0000000000..038438d63b
Binary files /dev/null and b/modular_citadel/sound/vox/help.ogg differ
diff --git a/modular_citadel/sound/vox/here.ogg b/modular_citadel/sound/vox/here.ogg
new file mode 100644
index 0000000000..ef69f1b282
Binary files /dev/null and b/modular_citadel/sound/vox/here.ogg differ
diff --git a/modular_citadel/sound/vox/hide.ogg b/modular_citadel/sound/vox/hide.ogg
new file mode 100644
index 0000000000..aa329d1f72
Binary files /dev/null and b/modular_citadel/sound/vox/hide.ogg differ
diff --git a/modular_citadel/sound/vox/high.ogg b/modular_citadel/sound/vox/high.ogg
new file mode 100644
index 0000000000..c20e382388
Binary files /dev/null and b/modular_citadel/sound/vox/high.ogg differ
diff --git a/modular_citadel/sound/vox/highest.ogg b/modular_citadel/sound/vox/highest.ogg
new file mode 100644
index 0000000000..d64bfd528c
Binary files /dev/null and b/modular_citadel/sound/vox/highest.ogg differ
diff --git a/modular_citadel/sound/vox/hit.ogg b/modular_citadel/sound/vox/hit.ogg
new file mode 100644
index 0000000000..bfe3cd0501
Binary files /dev/null and b/modular_citadel/sound/vox/hit.ogg differ
diff --git a/modular_citadel/sound/vox/holds.ogg b/modular_citadel/sound/vox/holds.ogg
new file mode 100644
index 0000000000..41b88d990e
Binary files /dev/null and b/modular_citadel/sound/vox/holds.ogg differ
diff --git a/modular_citadel/sound/vox/hole.ogg b/modular_citadel/sound/vox/hole.ogg
new file mode 100644
index 0000000000..a5dea701c8
Binary files /dev/null and b/modular_citadel/sound/vox/hole.ogg differ
diff --git a/modular_citadel/sound/vox/hostile.ogg b/modular_citadel/sound/vox/hostile.ogg
new file mode 100644
index 0000000000..7b8e495c87
Binary files /dev/null and b/modular_citadel/sound/vox/hostile.ogg differ
diff --git a/modular_citadel/sound/vox/hot.ogg b/modular_citadel/sound/vox/hot.ogg
new file mode 100644
index 0000000000..508f643856
Binary files /dev/null and b/modular_citadel/sound/vox/hot.ogg differ
diff --git a/modular_citadel/sound/vox/hotel.ogg b/modular_citadel/sound/vox/hotel.ogg
new file mode 100644
index 0000000000..5a5b66cdbf
Binary files /dev/null and b/modular_citadel/sound/vox/hotel.ogg differ
diff --git a/modular_citadel/sound/vox/hour.ogg b/modular_citadel/sound/vox/hour.ogg
new file mode 100644
index 0000000000..39f0fd0917
Binary files /dev/null and b/modular_citadel/sound/vox/hour.ogg differ
diff --git a/modular_citadel/sound/vox/hours.ogg b/modular_citadel/sound/vox/hours.ogg
new file mode 100644
index 0000000000..691b7a643b
Binary files /dev/null and b/modular_citadel/sound/vox/hours.ogg differ
diff --git a/modular_citadel/sound/vox/hundred.ogg b/modular_citadel/sound/vox/hundred.ogg
new file mode 100644
index 0000000000..3a254a137a
Binary files /dev/null and b/modular_citadel/sound/vox/hundred.ogg differ
diff --git a/modular_citadel/sound/vox/hydro.ogg b/modular_citadel/sound/vox/hydro.ogg
new file mode 100644
index 0000000000..47c9ad5d01
Binary files /dev/null and b/modular_citadel/sound/vox/hydro.ogg differ
diff --git a/modular_citadel/sound/vox/i.ogg b/modular_citadel/sound/vox/i.ogg
new file mode 100644
index 0000000000..1c4ce81b7a
Binary files /dev/null and b/modular_citadel/sound/vox/i.ogg differ
diff --git a/modular_citadel/sound/vox/idiot.ogg b/modular_citadel/sound/vox/idiot.ogg
new file mode 100644
index 0000000000..66e058effc
Binary files /dev/null and b/modular_citadel/sound/vox/idiot.ogg differ
diff --git a/modular_citadel/sound/vox/illegal.ogg b/modular_citadel/sound/vox/illegal.ogg
new file mode 100644
index 0000000000..e1f22738bd
Binary files /dev/null and b/modular_citadel/sound/vox/illegal.ogg differ
diff --git a/modular_citadel/sound/vox/immediate.ogg b/modular_citadel/sound/vox/immediate.ogg
new file mode 100644
index 0000000000..3e551dfa57
Binary files /dev/null and b/modular_citadel/sound/vox/immediate.ogg differ
diff --git a/modular_citadel/sound/vox/immediately.ogg b/modular_citadel/sound/vox/immediately.ogg
new file mode 100644
index 0000000000..0ca780ddac
Binary files /dev/null and b/modular_citadel/sound/vox/immediately.ogg differ
diff --git a/modular_citadel/sound/vox/in.ogg b/modular_citadel/sound/vox/in.ogg
new file mode 100644
index 0000000000..e0b20f4795
Binary files /dev/null and b/modular_citadel/sound/vox/in.ogg differ
diff --git a/modular_citadel/sound/vox/inches.ogg b/modular_citadel/sound/vox/inches.ogg
new file mode 100644
index 0000000000..058f8e9131
Binary files /dev/null and b/modular_citadel/sound/vox/inches.ogg differ
diff --git a/modular_citadel/sound/vox/india.ogg b/modular_citadel/sound/vox/india.ogg
new file mode 100644
index 0000000000..1eefc45266
Binary files /dev/null and b/modular_citadel/sound/vox/india.ogg differ
diff --git a/modular_citadel/sound/vox/ing.ogg b/modular_citadel/sound/vox/ing.ogg
new file mode 100644
index 0000000000..d8c5c72fc9
Binary files /dev/null and b/modular_citadel/sound/vox/ing.ogg differ
diff --git a/modular_citadel/sound/vox/inoperative.ogg b/modular_citadel/sound/vox/inoperative.ogg
new file mode 100644
index 0000000000..01f13af948
Binary files /dev/null and b/modular_citadel/sound/vox/inoperative.ogg differ
diff --git a/modular_citadel/sound/vox/inside.ogg b/modular_citadel/sound/vox/inside.ogg
new file mode 100644
index 0000000000..778f4539ed
Binary files /dev/null and b/modular_citadel/sound/vox/inside.ogg differ
diff --git a/modular_citadel/sound/vox/inspection.ogg b/modular_citadel/sound/vox/inspection.ogg
new file mode 100644
index 0000000000..60a2b3e788
Binary files /dev/null and b/modular_citadel/sound/vox/inspection.ogg differ
diff --git a/modular_citadel/sound/vox/inspector.ogg b/modular_citadel/sound/vox/inspector.ogg
new file mode 100644
index 0000000000..177651d631
Binary files /dev/null and b/modular_citadel/sound/vox/inspector.ogg differ
diff --git a/modular_citadel/sound/vox/interchange.ogg b/modular_citadel/sound/vox/interchange.ogg
new file mode 100644
index 0000000000..6c4230d2d1
Binary files /dev/null and b/modular_citadel/sound/vox/interchange.ogg differ
diff --git a/modular_citadel/sound/vox/intruder.ogg b/modular_citadel/sound/vox/intruder.ogg
new file mode 100644
index 0000000000..db4810966f
Binary files /dev/null and b/modular_citadel/sound/vox/intruder.ogg differ
diff --git a/modular_citadel/sound/vox/invallid.ogg b/modular_citadel/sound/vox/invallid.ogg
new file mode 100644
index 0000000000..b2e5628fa5
Binary files /dev/null and b/modular_citadel/sound/vox/invallid.ogg differ
diff --git a/modular_citadel/sound/vox/invasion.ogg b/modular_citadel/sound/vox/invasion.ogg
new file mode 100644
index 0000000000..8e9a41fc10
Binary files /dev/null and b/modular_citadel/sound/vox/invasion.ogg differ
diff --git a/modular_citadel/sound/vox/is.ogg b/modular_citadel/sound/vox/is.ogg
new file mode 100644
index 0000000000..db3ca1dc81
Binary files /dev/null and b/modular_citadel/sound/vox/is.ogg differ
diff --git a/modular_citadel/sound/vox/it.ogg b/modular_citadel/sound/vox/it.ogg
new file mode 100644
index 0000000000..c0d3de3992
Binary files /dev/null and b/modular_citadel/sound/vox/it.ogg differ
diff --git a/modular_citadel/sound/vox/johnson.ogg b/modular_citadel/sound/vox/johnson.ogg
new file mode 100644
index 0000000000..ea74d8a61f
Binary files /dev/null and b/modular_citadel/sound/vox/johnson.ogg differ
diff --git a/modular_citadel/sound/vox/juliet.ogg b/modular_citadel/sound/vox/juliet.ogg
new file mode 100644
index 0000000000..c9a61b63ab
Binary files /dev/null and b/modular_citadel/sound/vox/juliet.ogg differ
diff --git a/modular_citadel/sound/vox/key.ogg b/modular_citadel/sound/vox/key.ogg
new file mode 100644
index 0000000000..b761d5c1f9
Binary files /dev/null and b/modular_citadel/sound/vox/key.ogg differ
diff --git a/modular_citadel/sound/vox/kill.ogg b/modular_citadel/sound/vox/kill.ogg
new file mode 100644
index 0000000000..00db499476
Binary files /dev/null and b/modular_citadel/sound/vox/kill.ogg differ
diff --git a/modular_citadel/sound/vox/kilo.ogg b/modular_citadel/sound/vox/kilo.ogg
new file mode 100644
index 0000000000..7786c4fc7c
Binary files /dev/null and b/modular_citadel/sound/vox/kilo.ogg differ
diff --git a/modular_citadel/sound/vox/kit.ogg b/modular_citadel/sound/vox/kit.ogg
new file mode 100644
index 0000000000..15bbe46087
Binary files /dev/null and b/modular_citadel/sound/vox/kit.ogg differ
diff --git a/modular_citadel/sound/vox/lab.ogg b/modular_citadel/sound/vox/lab.ogg
new file mode 100644
index 0000000000..2031fdd255
Binary files /dev/null and b/modular_citadel/sound/vox/lab.ogg differ
diff --git a/modular_citadel/sound/vox/lambda.ogg b/modular_citadel/sound/vox/lambda.ogg
new file mode 100644
index 0000000000..f933c45376
Binary files /dev/null and b/modular_citadel/sound/vox/lambda.ogg differ
diff --git a/modular_citadel/sound/vox/laser.ogg b/modular_citadel/sound/vox/laser.ogg
new file mode 100644
index 0000000000..04b5ec4341
Binary files /dev/null and b/modular_citadel/sound/vox/laser.ogg differ
diff --git a/modular_citadel/sound/vox/last.ogg b/modular_citadel/sound/vox/last.ogg
new file mode 100644
index 0000000000..9ce61ac234
Binary files /dev/null and b/modular_citadel/sound/vox/last.ogg differ
diff --git a/modular_citadel/sound/vox/launch.ogg b/modular_citadel/sound/vox/launch.ogg
new file mode 100644
index 0000000000..c8e3b0820e
Binary files /dev/null and b/modular_citadel/sound/vox/launch.ogg differ
diff --git a/modular_citadel/sound/vox/leak.ogg b/modular_citadel/sound/vox/leak.ogg
new file mode 100644
index 0000000000..3154ac53c3
Binary files /dev/null and b/modular_citadel/sound/vox/leak.ogg differ
diff --git a/modular_citadel/sound/vox/leave.ogg b/modular_citadel/sound/vox/leave.ogg
new file mode 100644
index 0000000000..cec4a6befd
Binary files /dev/null and b/modular_citadel/sound/vox/leave.ogg differ
diff --git a/modular_citadel/sound/vox/left.ogg b/modular_citadel/sound/vox/left.ogg
new file mode 100644
index 0000000000..c6f32829ad
Binary files /dev/null and b/modular_citadel/sound/vox/left.ogg differ
diff --git a/modular_citadel/sound/vox/legal.ogg b/modular_citadel/sound/vox/legal.ogg
new file mode 100644
index 0000000000..c8f5163bd1
Binary files /dev/null and b/modular_citadel/sound/vox/legal.ogg differ
diff --git a/modular_citadel/sound/vox/level.ogg b/modular_citadel/sound/vox/level.ogg
new file mode 100644
index 0000000000..4d898a5ef7
Binary files /dev/null and b/modular_citadel/sound/vox/level.ogg differ
diff --git a/modular_citadel/sound/vox/lever.ogg b/modular_citadel/sound/vox/lever.ogg
new file mode 100644
index 0000000000..28c8c33e76
Binary files /dev/null and b/modular_citadel/sound/vox/lever.ogg differ
diff --git a/modular_citadel/sound/vox/lie.ogg b/modular_citadel/sound/vox/lie.ogg
new file mode 100644
index 0000000000..1516dc0072
Binary files /dev/null and b/modular_citadel/sound/vox/lie.ogg differ
diff --git a/modular_citadel/sound/vox/lieutenant.ogg b/modular_citadel/sound/vox/lieutenant.ogg
new file mode 100644
index 0000000000..1393b36008
Binary files /dev/null and b/modular_citadel/sound/vox/lieutenant.ogg differ
diff --git a/modular_citadel/sound/vox/life.ogg b/modular_citadel/sound/vox/life.ogg
new file mode 100644
index 0000000000..0d03320ce2
Binary files /dev/null and b/modular_citadel/sound/vox/life.ogg differ
diff --git a/modular_citadel/sound/vox/light.ogg b/modular_citadel/sound/vox/light.ogg
new file mode 100644
index 0000000000..c4e8a9fc78
Binary files /dev/null and b/modular_citadel/sound/vox/light.ogg differ
diff --git a/modular_citadel/sound/vox/lima.ogg b/modular_citadel/sound/vox/lima.ogg
new file mode 100644
index 0000000000..84e26666cf
Binary files /dev/null and b/modular_citadel/sound/vox/lima.ogg differ
diff --git a/modular_citadel/sound/vox/liquid.ogg b/modular_citadel/sound/vox/liquid.ogg
new file mode 100644
index 0000000000..b942e3cf6c
Binary files /dev/null and b/modular_citadel/sound/vox/liquid.ogg differ
diff --git a/modular_citadel/sound/vox/loading.ogg b/modular_citadel/sound/vox/loading.ogg
new file mode 100644
index 0000000000..2dfefd952e
Binary files /dev/null and b/modular_citadel/sound/vox/loading.ogg differ
diff --git a/modular_citadel/sound/vox/locate.ogg b/modular_citadel/sound/vox/locate.ogg
new file mode 100644
index 0000000000..2ea19ec257
Binary files /dev/null and b/modular_citadel/sound/vox/locate.ogg differ
diff --git a/modular_citadel/sound/vox/located.ogg b/modular_citadel/sound/vox/located.ogg
new file mode 100644
index 0000000000..cd161b556b
Binary files /dev/null and b/modular_citadel/sound/vox/located.ogg differ
diff --git a/modular_citadel/sound/vox/location.ogg b/modular_citadel/sound/vox/location.ogg
new file mode 100644
index 0000000000..966c9ae3f6
Binary files /dev/null and b/modular_citadel/sound/vox/location.ogg differ
diff --git a/modular_citadel/sound/vox/lock.ogg b/modular_citadel/sound/vox/lock.ogg
new file mode 100644
index 0000000000..c4c89992db
Binary files /dev/null and b/modular_citadel/sound/vox/lock.ogg differ
diff --git a/modular_citadel/sound/vox/locked.ogg b/modular_citadel/sound/vox/locked.ogg
new file mode 100644
index 0000000000..d1a05ba323
Binary files /dev/null and b/modular_citadel/sound/vox/locked.ogg differ
diff --git a/modular_citadel/sound/vox/locker.ogg b/modular_citadel/sound/vox/locker.ogg
new file mode 100644
index 0000000000..2c5c9ccb4b
Binary files /dev/null and b/modular_citadel/sound/vox/locker.ogg differ
diff --git a/modular_citadel/sound/vox/lockout.ogg b/modular_citadel/sound/vox/lockout.ogg
new file mode 100644
index 0000000000..36748ecb71
Binary files /dev/null and b/modular_citadel/sound/vox/lockout.ogg differ
diff --git a/modular_citadel/sound/vox/lower.ogg b/modular_citadel/sound/vox/lower.ogg
new file mode 100644
index 0000000000..a3a6a3ae9d
Binary files /dev/null and b/modular_citadel/sound/vox/lower.ogg differ
diff --git a/modular_citadel/sound/vox/lowest.ogg b/modular_citadel/sound/vox/lowest.ogg
new file mode 100644
index 0000000000..787fa2a961
Binary files /dev/null and b/modular_citadel/sound/vox/lowest.ogg differ
diff --git a/modular_citadel/sound/vox/magnetic.ogg b/modular_citadel/sound/vox/magnetic.ogg
new file mode 100644
index 0000000000..1211ab1cfd
Binary files /dev/null and b/modular_citadel/sound/vox/magnetic.ogg differ
diff --git a/modular_citadel/sound/vox/main.ogg b/modular_citadel/sound/vox/main.ogg
new file mode 100644
index 0000000000..a1e49b2c16
Binary files /dev/null and b/modular_citadel/sound/vox/main.ogg differ
diff --git a/modular_citadel/sound/vox/maintenance.ogg b/modular_citadel/sound/vox/maintenance.ogg
new file mode 100644
index 0000000000..691fea8b60
Binary files /dev/null and b/modular_citadel/sound/vox/maintenance.ogg differ
diff --git a/modular_citadel/sound/vox/malfunction.ogg b/modular_citadel/sound/vox/malfunction.ogg
new file mode 100644
index 0000000000..5e0d416d4f
Binary files /dev/null and b/modular_citadel/sound/vox/malfunction.ogg differ
diff --git a/modular_citadel/sound/vox/man.ogg b/modular_citadel/sound/vox/man.ogg
new file mode 100644
index 0000000000..10ca95640a
Binary files /dev/null and b/modular_citadel/sound/vox/man.ogg differ
diff --git a/modular_citadel/sound/vox/mass.ogg b/modular_citadel/sound/vox/mass.ogg
new file mode 100644
index 0000000000..6b785f5e8b
Binary files /dev/null and b/modular_citadel/sound/vox/mass.ogg differ
diff --git a/modular_citadel/sound/vox/materials.ogg b/modular_citadel/sound/vox/materials.ogg
new file mode 100644
index 0000000000..0321e579f7
Binary files /dev/null and b/modular_citadel/sound/vox/materials.ogg differ
diff --git a/modular_citadel/sound/vox/maximum.ogg b/modular_citadel/sound/vox/maximum.ogg
new file mode 100644
index 0000000000..ef566342a7
Binary files /dev/null and b/modular_citadel/sound/vox/maximum.ogg differ
diff --git a/modular_citadel/sound/vox/may.ogg b/modular_citadel/sound/vox/may.ogg
new file mode 100644
index 0000000000..2f9fa02cf0
Binary files /dev/null and b/modular_citadel/sound/vox/may.ogg differ
diff --git a/modular_citadel/sound/vox/med.ogg b/modular_citadel/sound/vox/med.ogg
new file mode 100644
index 0000000000..280a12362f
Binary files /dev/null and b/modular_citadel/sound/vox/med.ogg differ
diff --git a/modular_citadel/sound/vox/medical.ogg b/modular_citadel/sound/vox/medical.ogg
new file mode 100644
index 0000000000..3a293f31b2
Binary files /dev/null and b/modular_citadel/sound/vox/medical.ogg differ
diff --git a/modular_citadel/sound/vox/men.ogg b/modular_citadel/sound/vox/men.ogg
new file mode 100644
index 0000000000..a9e92245f1
Binary files /dev/null and b/modular_citadel/sound/vox/men.ogg differ
diff --git a/modular_citadel/sound/vox/mercy.ogg b/modular_citadel/sound/vox/mercy.ogg
new file mode 100644
index 0000000000..2de89bc70a
Binary files /dev/null and b/modular_citadel/sound/vox/mercy.ogg differ
diff --git a/modular_citadel/sound/vox/mesa.ogg b/modular_citadel/sound/vox/mesa.ogg
new file mode 100644
index 0000000000..649d3671ba
Binary files /dev/null and b/modular_citadel/sound/vox/mesa.ogg differ
diff --git a/modular_citadel/sound/vox/message.ogg b/modular_citadel/sound/vox/message.ogg
new file mode 100644
index 0000000000..1454e3df9e
Binary files /dev/null and b/modular_citadel/sound/vox/message.ogg differ
diff --git a/modular_citadel/sound/vox/meter.ogg b/modular_citadel/sound/vox/meter.ogg
new file mode 100644
index 0000000000..7afc6fb3d1
Binary files /dev/null and b/modular_citadel/sound/vox/meter.ogg differ
diff --git a/modular_citadel/sound/vox/micro.ogg b/modular_citadel/sound/vox/micro.ogg
new file mode 100644
index 0000000000..38d59ed2de
Binary files /dev/null and b/modular_citadel/sound/vox/micro.ogg differ
diff --git a/modular_citadel/sound/vox/middle.ogg b/modular_citadel/sound/vox/middle.ogg
new file mode 100644
index 0000000000..ef33287eff
Binary files /dev/null and b/modular_citadel/sound/vox/middle.ogg differ
diff --git a/modular_citadel/sound/vox/mike.ogg b/modular_citadel/sound/vox/mike.ogg
new file mode 100644
index 0000000000..27d4fdeb9e
Binary files /dev/null and b/modular_citadel/sound/vox/mike.ogg differ
diff --git a/modular_citadel/sound/vox/miles.ogg b/modular_citadel/sound/vox/miles.ogg
new file mode 100644
index 0000000000..fbf06913e2
Binary files /dev/null and b/modular_citadel/sound/vox/miles.ogg differ
diff --git a/modular_citadel/sound/vox/military.ogg b/modular_citadel/sound/vox/military.ogg
new file mode 100644
index 0000000000..8273851291
Binary files /dev/null and b/modular_citadel/sound/vox/military.ogg differ
diff --git a/modular_citadel/sound/vox/milli.ogg b/modular_citadel/sound/vox/milli.ogg
new file mode 100644
index 0000000000..806bccebab
Binary files /dev/null and b/modular_citadel/sound/vox/milli.ogg differ
diff --git a/modular_citadel/sound/vox/million.ogg b/modular_citadel/sound/vox/million.ogg
new file mode 100644
index 0000000000..e4c10a2d86
Binary files /dev/null and b/modular_citadel/sound/vox/million.ogg differ
diff --git a/modular_citadel/sound/vox/minefield.ogg b/modular_citadel/sound/vox/minefield.ogg
new file mode 100644
index 0000000000..b437449d1d
Binary files /dev/null and b/modular_citadel/sound/vox/minefield.ogg differ
diff --git a/modular_citadel/sound/vox/minimum.ogg b/modular_citadel/sound/vox/minimum.ogg
new file mode 100644
index 0000000000..a15483bde6
Binary files /dev/null and b/modular_citadel/sound/vox/minimum.ogg differ
diff --git a/modular_citadel/sound/vox/minutes.ogg b/modular_citadel/sound/vox/minutes.ogg
new file mode 100644
index 0000000000..2b7bf579ea
Binary files /dev/null and b/modular_citadel/sound/vox/minutes.ogg differ
diff --git a/modular_citadel/sound/vox/mister.ogg b/modular_citadel/sound/vox/mister.ogg
new file mode 100644
index 0000000000..bc5409bbed
Binary files /dev/null and b/modular_citadel/sound/vox/mister.ogg differ
diff --git a/modular_citadel/sound/vox/mode.ogg b/modular_citadel/sound/vox/mode.ogg
new file mode 100644
index 0000000000..04d6684bde
Binary files /dev/null and b/modular_citadel/sound/vox/mode.ogg differ
diff --git a/modular_citadel/sound/vox/motor.ogg b/modular_citadel/sound/vox/motor.ogg
new file mode 100644
index 0000000000..5a3084201a
Binary files /dev/null and b/modular_citadel/sound/vox/motor.ogg differ
diff --git a/modular_citadel/sound/vox/motorpool.ogg b/modular_citadel/sound/vox/motorpool.ogg
new file mode 100644
index 0000000000..a29772d545
Binary files /dev/null and b/modular_citadel/sound/vox/motorpool.ogg differ
diff --git a/modular_citadel/sound/vox/move.ogg b/modular_citadel/sound/vox/move.ogg
new file mode 100644
index 0000000000..cc6344813f
Binary files /dev/null and b/modular_citadel/sound/vox/move.ogg differ
diff --git a/modular_citadel/sound/vox/must.ogg b/modular_citadel/sound/vox/must.ogg
new file mode 100644
index 0000000000..d52d2c85e0
Binary files /dev/null and b/modular_citadel/sound/vox/must.ogg differ
diff --git a/modular_citadel/sound/vox/nearest.ogg b/modular_citadel/sound/vox/nearest.ogg
new file mode 100644
index 0000000000..fdf34564ad
Binary files /dev/null and b/modular_citadel/sound/vox/nearest.ogg differ
diff --git a/modular_citadel/sound/vox/nice.ogg b/modular_citadel/sound/vox/nice.ogg
new file mode 100644
index 0000000000..102f0eaf87
Binary files /dev/null and b/modular_citadel/sound/vox/nice.ogg differ
diff --git a/modular_citadel/sound/vox/nine.ogg b/modular_citadel/sound/vox/nine.ogg
new file mode 100644
index 0000000000..1d4fd45add
Binary files /dev/null and b/modular_citadel/sound/vox/nine.ogg differ
diff --git a/modular_citadel/sound/vox/nineteen.ogg b/modular_citadel/sound/vox/nineteen.ogg
new file mode 100644
index 0000000000..907ecc6e92
Binary files /dev/null and b/modular_citadel/sound/vox/nineteen.ogg differ
diff --git a/modular_citadel/sound/vox/ninety.ogg b/modular_citadel/sound/vox/ninety.ogg
new file mode 100644
index 0000000000..0f1c3c4fb5
Binary files /dev/null and b/modular_citadel/sound/vox/ninety.ogg differ
diff --git a/modular_citadel/sound/vox/no.ogg b/modular_citadel/sound/vox/no.ogg
new file mode 100644
index 0000000000..85d8497891
Binary files /dev/null and b/modular_citadel/sound/vox/no.ogg differ
diff --git a/modular_citadel/sound/vox/nominal.ogg b/modular_citadel/sound/vox/nominal.ogg
new file mode 100644
index 0000000000..45da127f1b
Binary files /dev/null and b/modular_citadel/sound/vox/nominal.ogg differ
diff --git a/modular_citadel/sound/vox/north.ogg b/modular_citadel/sound/vox/north.ogg
new file mode 100644
index 0000000000..03eb6f88d2
Binary files /dev/null and b/modular_citadel/sound/vox/north.ogg differ
diff --git a/modular_citadel/sound/vox/not.ogg b/modular_citadel/sound/vox/not.ogg
new file mode 100644
index 0000000000..bc691af375
Binary files /dev/null and b/modular_citadel/sound/vox/not.ogg differ
diff --git a/modular_citadel/sound/vox/november.ogg b/modular_citadel/sound/vox/november.ogg
new file mode 100644
index 0000000000..4819c132dc
Binary files /dev/null and b/modular_citadel/sound/vox/november.ogg differ
diff --git a/modular_citadel/sound/vox/now.ogg b/modular_citadel/sound/vox/now.ogg
new file mode 100644
index 0000000000..0e26869bac
Binary files /dev/null and b/modular_citadel/sound/vox/now.ogg differ
diff --git a/modular_citadel/sound/vox/number.ogg b/modular_citadel/sound/vox/number.ogg
new file mode 100644
index 0000000000..c139db7d17
Binary files /dev/null and b/modular_citadel/sound/vox/number.ogg differ
diff --git a/modular_citadel/sound/vox/objective.ogg b/modular_citadel/sound/vox/objective.ogg
new file mode 100644
index 0000000000..2496f83ccf
Binary files /dev/null and b/modular_citadel/sound/vox/objective.ogg differ
diff --git a/modular_citadel/sound/vox/observation.ogg b/modular_citadel/sound/vox/observation.ogg
new file mode 100644
index 0000000000..af04410915
Binary files /dev/null and b/modular_citadel/sound/vox/observation.ogg differ
diff --git a/modular_citadel/sound/vox/of.ogg b/modular_citadel/sound/vox/of.ogg
new file mode 100644
index 0000000000..ee71e1a46e
Binary files /dev/null and b/modular_citadel/sound/vox/of.ogg differ
diff --git a/modular_citadel/sound/vox/officer.ogg b/modular_citadel/sound/vox/officer.ogg
new file mode 100644
index 0000000000..c9f94915e6
Binary files /dev/null and b/modular_citadel/sound/vox/officer.ogg differ
diff --git a/modular_citadel/sound/vox/ok.ogg b/modular_citadel/sound/vox/ok.ogg
new file mode 100644
index 0000000000..cf58af4d13
Binary files /dev/null and b/modular_citadel/sound/vox/ok.ogg differ
diff --git a/modular_citadel/sound/vox/on.ogg b/modular_citadel/sound/vox/on.ogg
new file mode 100644
index 0000000000..3c59c6abd8
Binary files /dev/null and b/modular_citadel/sound/vox/on.ogg differ
diff --git a/modular_citadel/sound/vox/one.ogg b/modular_citadel/sound/vox/one.ogg
new file mode 100644
index 0000000000..377f270179
Binary files /dev/null and b/modular_citadel/sound/vox/one.ogg differ
diff --git a/modular_citadel/sound/vox/open.ogg b/modular_citadel/sound/vox/open.ogg
new file mode 100644
index 0000000000..81c11de72f
Binary files /dev/null and b/modular_citadel/sound/vox/open.ogg differ
diff --git a/modular_citadel/sound/vox/operating.ogg b/modular_citadel/sound/vox/operating.ogg
new file mode 100644
index 0000000000..cd2de79d79
Binary files /dev/null and b/modular_citadel/sound/vox/operating.ogg differ
diff --git a/modular_citadel/sound/vox/operations.ogg b/modular_citadel/sound/vox/operations.ogg
new file mode 100644
index 0000000000..9323d95f46
Binary files /dev/null and b/modular_citadel/sound/vox/operations.ogg differ
diff --git a/modular_citadel/sound/vox/operative.ogg b/modular_citadel/sound/vox/operative.ogg
new file mode 100644
index 0000000000..ba9c7d0cf4
Binary files /dev/null and b/modular_citadel/sound/vox/operative.ogg differ
diff --git a/modular_citadel/sound/vox/option.ogg b/modular_citadel/sound/vox/option.ogg
new file mode 100644
index 0000000000..c404be5556
Binary files /dev/null and b/modular_citadel/sound/vox/option.ogg differ
diff --git a/modular_citadel/sound/vox/order.ogg b/modular_citadel/sound/vox/order.ogg
new file mode 100644
index 0000000000..2961f353ed
Binary files /dev/null and b/modular_citadel/sound/vox/order.ogg differ
diff --git a/modular_citadel/sound/vox/organic.ogg b/modular_citadel/sound/vox/organic.ogg
new file mode 100644
index 0000000000..6195be46b4
Binary files /dev/null and b/modular_citadel/sound/vox/organic.ogg differ
diff --git a/modular_citadel/sound/vox/oscar.ogg b/modular_citadel/sound/vox/oscar.ogg
new file mode 100644
index 0000000000..5f43814f5e
Binary files /dev/null and b/modular_citadel/sound/vox/oscar.ogg differ
diff --git a/modular_citadel/sound/vox/out.ogg b/modular_citadel/sound/vox/out.ogg
new file mode 100644
index 0000000000..3a64ae9751
Binary files /dev/null and b/modular_citadel/sound/vox/out.ogg differ
diff --git a/modular_citadel/sound/vox/outside.ogg b/modular_citadel/sound/vox/outside.ogg
new file mode 100644
index 0000000000..a6417b9f97
Binary files /dev/null and b/modular_citadel/sound/vox/outside.ogg differ
diff --git a/modular_citadel/sound/vox/over.ogg b/modular_citadel/sound/vox/over.ogg
new file mode 100644
index 0000000000..193bbd797b
Binary files /dev/null and b/modular_citadel/sound/vox/over.ogg differ
diff --git a/modular_citadel/sound/vox/overload.ogg b/modular_citadel/sound/vox/overload.ogg
new file mode 100644
index 0000000000..d90e52e97d
Binary files /dev/null and b/modular_citadel/sound/vox/overload.ogg differ
diff --git a/modular_citadel/sound/vox/override.ogg b/modular_citadel/sound/vox/override.ogg
new file mode 100644
index 0000000000..f2efb63799
Binary files /dev/null and b/modular_citadel/sound/vox/override.ogg differ
diff --git a/modular_citadel/sound/vox/pacify.ogg b/modular_citadel/sound/vox/pacify.ogg
new file mode 100644
index 0000000000..232865ebe2
Binary files /dev/null and b/modular_citadel/sound/vox/pacify.ogg differ
diff --git a/modular_citadel/sound/vox/pain.ogg b/modular_citadel/sound/vox/pain.ogg
new file mode 100644
index 0000000000..88e8813158
Binary files /dev/null and b/modular_citadel/sound/vox/pain.ogg differ
diff --git a/modular_citadel/sound/vox/pal.ogg b/modular_citadel/sound/vox/pal.ogg
new file mode 100644
index 0000000000..185a15a6ac
Binary files /dev/null and b/modular_citadel/sound/vox/pal.ogg differ
diff --git a/modular_citadel/sound/vox/panel.ogg b/modular_citadel/sound/vox/panel.ogg
new file mode 100644
index 0000000000..e200e9ddd9
Binary files /dev/null and b/modular_citadel/sound/vox/panel.ogg differ
diff --git a/modular_citadel/sound/vox/percent.ogg b/modular_citadel/sound/vox/percent.ogg
new file mode 100644
index 0000000000..43c04572ba
Binary files /dev/null and b/modular_citadel/sound/vox/percent.ogg differ
diff --git a/modular_citadel/sound/vox/perimeter.ogg b/modular_citadel/sound/vox/perimeter.ogg
new file mode 100644
index 0000000000..7bd3f039ef
Binary files /dev/null and b/modular_citadel/sound/vox/perimeter.ogg differ
diff --git a/modular_citadel/sound/vox/period.ogg b/modular_citadel/sound/vox/period.ogg
new file mode 100644
index 0000000000..e333dc159b
Binary files /dev/null and b/modular_citadel/sound/vox/period.ogg differ
diff --git a/modular_citadel/sound/vox/permitted.ogg b/modular_citadel/sound/vox/permitted.ogg
new file mode 100644
index 0000000000..832fec7c24
Binary files /dev/null and b/modular_citadel/sound/vox/permitted.ogg differ
diff --git a/modular_citadel/sound/vox/personnel.ogg b/modular_citadel/sound/vox/personnel.ogg
new file mode 100644
index 0000000000..f499fb9f1d
Binary files /dev/null and b/modular_citadel/sound/vox/personnel.ogg differ
diff --git a/modular_citadel/sound/vox/pipe.ogg b/modular_citadel/sound/vox/pipe.ogg
new file mode 100644
index 0000000000..63ab07e4cb
Binary files /dev/null and b/modular_citadel/sound/vox/pipe.ogg differ
diff --git a/modular_citadel/sound/vox/plant.ogg b/modular_citadel/sound/vox/plant.ogg
new file mode 100644
index 0000000000..d82d73900d
Binary files /dev/null and b/modular_citadel/sound/vox/plant.ogg differ
diff --git a/modular_citadel/sound/vox/platform.ogg b/modular_citadel/sound/vox/platform.ogg
new file mode 100644
index 0000000000..cf9eb6ce53
Binary files /dev/null and b/modular_citadel/sound/vox/platform.ogg differ
diff --git a/modular_citadel/sound/vox/please.ogg b/modular_citadel/sound/vox/please.ogg
new file mode 100644
index 0000000000..cc21919798
Binary files /dev/null and b/modular_citadel/sound/vox/please.ogg differ
diff --git a/modular_citadel/sound/vox/point.ogg b/modular_citadel/sound/vox/point.ogg
new file mode 100644
index 0000000000..29925c714c
Binary files /dev/null and b/modular_citadel/sound/vox/point.ogg differ
diff --git a/modular_citadel/sound/vox/portal.ogg b/modular_citadel/sound/vox/portal.ogg
new file mode 100644
index 0000000000..4492842d97
Binary files /dev/null and b/modular_citadel/sound/vox/portal.ogg differ
diff --git a/modular_citadel/sound/vox/power.ogg b/modular_citadel/sound/vox/power.ogg
new file mode 100644
index 0000000000..109dde7b19
Binary files /dev/null and b/modular_citadel/sound/vox/power.ogg differ
diff --git a/modular_citadel/sound/vox/presence.ogg b/modular_citadel/sound/vox/presence.ogg
new file mode 100644
index 0000000000..fc929ee991
Binary files /dev/null and b/modular_citadel/sound/vox/presence.ogg differ
diff --git a/modular_citadel/sound/vox/press.ogg b/modular_citadel/sound/vox/press.ogg
new file mode 100644
index 0000000000..704c907141
Binary files /dev/null and b/modular_citadel/sound/vox/press.ogg differ
diff --git a/modular_citadel/sound/vox/primary.ogg b/modular_citadel/sound/vox/primary.ogg
new file mode 100644
index 0000000000..6f667e6a57
Binary files /dev/null and b/modular_citadel/sound/vox/primary.ogg differ
diff --git a/modular_citadel/sound/vox/proceed.ogg b/modular_citadel/sound/vox/proceed.ogg
new file mode 100644
index 0000000000..86df9fcf25
Binary files /dev/null and b/modular_citadel/sound/vox/proceed.ogg differ
diff --git a/modular_citadel/sound/vox/processing.ogg b/modular_citadel/sound/vox/processing.ogg
new file mode 100644
index 0000000000..f5aae3574c
Binary files /dev/null and b/modular_citadel/sound/vox/processing.ogg differ
diff --git a/modular_citadel/sound/vox/progress.ogg b/modular_citadel/sound/vox/progress.ogg
new file mode 100644
index 0000000000..c07c102a97
Binary files /dev/null and b/modular_citadel/sound/vox/progress.ogg differ
diff --git a/modular_citadel/sound/vox/proper.ogg b/modular_citadel/sound/vox/proper.ogg
new file mode 100644
index 0000000000..0dbfbaf599
Binary files /dev/null and b/modular_citadel/sound/vox/proper.ogg differ
diff --git a/modular_citadel/sound/vox/propulsion.ogg b/modular_citadel/sound/vox/propulsion.ogg
new file mode 100644
index 0000000000..8a4a77274a
Binary files /dev/null and b/modular_citadel/sound/vox/propulsion.ogg differ
diff --git a/modular_citadel/sound/vox/prosecute.ogg b/modular_citadel/sound/vox/prosecute.ogg
new file mode 100644
index 0000000000..c0895c54ef
Binary files /dev/null and b/modular_citadel/sound/vox/prosecute.ogg differ
diff --git a/modular_citadel/sound/vox/protective.ogg b/modular_citadel/sound/vox/protective.ogg
new file mode 100644
index 0000000000..67c1f1195b
Binary files /dev/null and b/modular_citadel/sound/vox/protective.ogg differ
diff --git a/modular_citadel/sound/vox/push.ogg b/modular_citadel/sound/vox/push.ogg
new file mode 100644
index 0000000000..2d9cfca1f7
Binary files /dev/null and b/modular_citadel/sound/vox/push.ogg differ
diff --git a/modular_citadel/sound/vox/quantum.ogg b/modular_citadel/sound/vox/quantum.ogg
new file mode 100644
index 0000000000..5082f84e7d
Binary files /dev/null and b/modular_citadel/sound/vox/quantum.ogg differ
diff --git a/modular_citadel/sound/vox/quebec.ogg b/modular_citadel/sound/vox/quebec.ogg
new file mode 100644
index 0000000000..59e84cd4a3
Binary files /dev/null and b/modular_citadel/sound/vox/quebec.ogg differ
diff --git a/modular_citadel/sound/vox/question.ogg b/modular_citadel/sound/vox/question.ogg
new file mode 100644
index 0000000000..197f11ca9a
Binary files /dev/null and b/modular_citadel/sound/vox/question.ogg differ
diff --git a/modular_citadel/sound/vox/questioning.ogg b/modular_citadel/sound/vox/questioning.ogg
new file mode 100644
index 0000000000..ba0436cf32
Binary files /dev/null and b/modular_citadel/sound/vox/questioning.ogg differ
diff --git a/modular_citadel/sound/vox/quick.ogg b/modular_citadel/sound/vox/quick.ogg
new file mode 100644
index 0000000000..19d4e91261
Binary files /dev/null and b/modular_citadel/sound/vox/quick.ogg differ
diff --git a/modular_citadel/sound/vox/quit.ogg b/modular_citadel/sound/vox/quit.ogg
new file mode 100644
index 0000000000..7ab07efa87
Binary files /dev/null and b/modular_citadel/sound/vox/quit.ogg differ
diff --git a/modular_citadel/sound/vox/radiation.ogg b/modular_citadel/sound/vox/radiation.ogg
new file mode 100644
index 0000000000..8d8fbdc001
Binary files /dev/null and b/modular_citadel/sound/vox/radiation.ogg differ
diff --git a/modular_citadel/sound/vox/radioactive.ogg b/modular_citadel/sound/vox/radioactive.ogg
new file mode 100644
index 0000000000..f5751882d4
Binary files /dev/null and b/modular_citadel/sound/vox/radioactive.ogg differ
diff --git a/modular_citadel/sound/vox/rads.ogg b/modular_citadel/sound/vox/rads.ogg
new file mode 100644
index 0000000000..e42722dd62
Binary files /dev/null and b/modular_citadel/sound/vox/rads.ogg differ
diff --git a/modular_citadel/sound/vox/rapid.ogg b/modular_citadel/sound/vox/rapid.ogg
new file mode 100644
index 0000000000..c803204bc8
Binary files /dev/null and b/modular_citadel/sound/vox/rapid.ogg differ
diff --git a/modular_citadel/sound/vox/reach.ogg b/modular_citadel/sound/vox/reach.ogg
new file mode 100644
index 0000000000..ab1a02e9ee
Binary files /dev/null and b/modular_citadel/sound/vox/reach.ogg differ
diff --git a/modular_citadel/sound/vox/reached.ogg b/modular_citadel/sound/vox/reached.ogg
new file mode 100644
index 0000000000..eddba60eed
Binary files /dev/null and b/modular_citadel/sound/vox/reached.ogg differ
diff --git a/modular_citadel/sound/vox/reactor.ogg b/modular_citadel/sound/vox/reactor.ogg
new file mode 100644
index 0000000000..75ea481a37
Binary files /dev/null and b/modular_citadel/sound/vox/reactor.ogg differ
diff --git a/modular_citadel/sound/vox/red.ogg b/modular_citadel/sound/vox/red.ogg
new file mode 100644
index 0000000000..97f2513772
Binary files /dev/null and b/modular_citadel/sound/vox/red.ogg differ
diff --git a/modular_citadel/sound/vox/relay.ogg b/modular_citadel/sound/vox/relay.ogg
new file mode 100644
index 0000000000..edc904c3f4
Binary files /dev/null and b/modular_citadel/sound/vox/relay.ogg differ
diff --git a/modular_citadel/sound/vox/released.ogg b/modular_citadel/sound/vox/released.ogg
new file mode 100644
index 0000000000..b86a39af72
Binary files /dev/null and b/modular_citadel/sound/vox/released.ogg differ
diff --git a/modular_citadel/sound/vox/remaining.ogg b/modular_citadel/sound/vox/remaining.ogg
new file mode 100644
index 0000000000..3ca55d3373
Binary files /dev/null and b/modular_citadel/sound/vox/remaining.ogg differ
diff --git a/modular_citadel/sound/vox/renegade.ogg b/modular_citadel/sound/vox/renegade.ogg
new file mode 100644
index 0000000000..6a4a3f3d50
Binary files /dev/null and b/modular_citadel/sound/vox/renegade.ogg differ
diff --git a/modular_citadel/sound/vox/repair.ogg b/modular_citadel/sound/vox/repair.ogg
new file mode 100644
index 0000000000..9435fe2ade
Binary files /dev/null and b/modular_citadel/sound/vox/repair.ogg differ
diff --git a/modular_citadel/sound/vox/report.ogg b/modular_citadel/sound/vox/report.ogg
new file mode 100644
index 0000000000..873ad6cbfe
Binary files /dev/null and b/modular_citadel/sound/vox/report.ogg differ
diff --git a/modular_citadel/sound/vox/reports.ogg b/modular_citadel/sound/vox/reports.ogg
new file mode 100644
index 0000000000..2fbf3151d0
Binary files /dev/null and b/modular_citadel/sound/vox/reports.ogg differ
diff --git a/modular_citadel/sound/vox/required.ogg b/modular_citadel/sound/vox/required.ogg
new file mode 100644
index 0000000000..902071124c
Binary files /dev/null and b/modular_citadel/sound/vox/required.ogg differ
diff --git a/modular_citadel/sound/vox/research.ogg b/modular_citadel/sound/vox/research.ogg
new file mode 100644
index 0000000000..c75b2ad2d0
Binary files /dev/null and b/modular_citadel/sound/vox/research.ogg differ
diff --git a/modular_citadel/sound/vox/reset.ogg b/modular_citadel/sound/vox/reset.ogg
new file mode 100644
index 0000000000..9864b79a54
Binary files /dev/null and b/modular_citadel/sound/vox/reset.ogg differ
diff --git a/modular_citadel/sound/vox/resevoir.ogg b/modular_citadel/sound/vox/resevoir.ogg
new file mode 100644
index 0000000000..30364c6400
Binary files /dev/null and b/modular_citadel/sound/vox/resevoir.ogg differ
diff --git a/modular_citadel/sound/vox/resistance.ogg b/modular_citadel/sound/vox/resistance.ogg
new file mode 100644
index 0000000000..dfbe6c512d
Binary files /dev/null and b/modular_citadel/sound/vox/resistance.ogg differ
diff --git a/modular_citadel/sound/vox/returned.ogg b/modular_citadel/sound/vox/returned.ogg
new file mode 100644
index 0000000000..0119402e24
Binary files /dev/null and b/modular_citadel/sound/vox/returned.ogg differ
diff --git a/modular_citadel/sound/vox/right.ogg b/modular_citadel/sound/vox/right.ogg
new file mode 100644
index 0000000000..b46b8cb135
Binary files /dev/null and b/modular_citadel/sound/vox/right.ogg differ
diff --git a/modular_citadel/sound/vox/rocket.ogg b/modular_citadel/sound/vox/rocket.ogg
new file mode 100644
index 0000000000..bfb2d3b0ed
Binary files /dev/null and b/modular_citadel/sound/vox/rocket.ogg differ
diff --git a/modular_citadel/sound/vox/roger.ogg b/modular_citadel/sound/vox/roger.ogg
new file mode 100644
index 0000000000..b249613c56
Binary files /dev/null and b/modular_citadel/sound/vox/roger.ogg differ
diff --git a/modular_citadel/sound/vox/romeo.ogg b/modular_citadel/sound/vox/romeo.ogg
new file mode 100644
index 0000000000..4c0b2356e3
Binary files /dev/null and b/modular_citadel/sound/vox/romeo.ogg differ
diff --git a/modular_citadel/sound/vox/room.ogg b/modular_citadel/sound/vox/room.ogg
new file mode 100644
index 0000000000..5151e39d46
Binary files /dev/null and b/modular_citadel/sound/vox/room.ogg differ
diff --git a/modular_citadel/sound/vox/round.ogg b/modular_citadel/sound/vox/round.ogg
new file mode 100644
index 0000000000..685f42d223
Binary files /dev/null and b/modular_citadel/sound/vox/round.ogg differ
diff --git a/modular_citadel/sound/vox/run.ogg b/modular_citadel/sound/vox/run.ogg
new file mode 100644
index 0000000000..9d6012cf3b
Binary files /dev/null and b/modular_citadel/sound/vox/run.ogg differ
diff --git a/modular_citadel/sound/vox/safe.ogg b/modular_citadel/sound/vox/safe.ogg
new file mode 100644
index 0000000000..d7a16d66b4
Binary files /dev/null and b/modular_citadel/sound/vox/safe.ogg differ
diff --git a/modular_citadel/sound/vox/safety.ogg b/modular_citadel/sound/vox/safety.ogg
new file mode 100644
index 0000000000..68ad663df4
Binary files /dev/null and b/modular_citadel/sound/vox/safety.ogg differ
diff --git a/modular_citadel/sound/vox/sargeant.ogg b/modular_citadel/sound/vox/sargeant.ogg
new file mode 100644
index 0000000000..1ab4150c9c
Binary files /dev/null and b/modular_citadel/sound/vox/sargeant.ogg differ
diff --git a/modular_citadel/sound/vox/satellite.ogg b/modular_citadel/sound/vox/satellite.ogg
new file mode 100644
index 0000000000..c07895ab77
Binary files /dev/null and b/modular_citadel/sound/vox/satellite.ogg differ
diff --git a/modular_citadel/sound/vox/save.ogg b/modular_citadel/sound/vox/save.ogg
new file mode 100644
index 0000000000..8a53055d62
Binary files /dev/null and b/modular_citadel/sound/vox/save.ogg differ
diff --git a/modular_citadel/sound/vox/science.ogg b/modular_citadel/sound/vox/science.ogg
new file mode 100644
index 0000000000..6e2e748cbb
Binary files /dev/null and b/modular_citadel/sound/vox/science.ogg differ
diff --git a/modular_citadel/sound/vox/scores.ogg b/modular_citadel/sound/vox/scores.ogg
new file mode 100644
index 0000000000..3328f38dc7
Binary files /dev/null and b/modular_citadel/sound/vox/scores.ogg differ
diff --git a/modular_citadel/sound/vox/scream.ogg b/modular_citadel/sound/vox/scream.ogg
new file mode 100644
index 0000000000..c795ca95ba
Binary files /dev/null and b/modular_citadel/sound/vox/scream.ogg differ
diff --git a/modular_citadel/sound/vox/screen.ogg b/modular_citadel/sound/vox/screen.ogg
new file mode 100644
index 0000000000..514cc3f71a
Binary files /dev/null and b/modular_citadel/sound/vox/screen.ogg differ
diff --git a/modular_citadel/sound/vox/search.ogg b/modular_citadel/sound/vox/search.ogg
new file mode 100644
index 0000000000..638710b721
Binary files /dev/null and b/modular_citadel/sound/vox/search.ogg differ
diff --git a/modular_citadel/sound/vox/second.ogg b/modular_citadel/sound/vox/second.ogg
new file mode 100644
index 0000000000..fc4dc806ca
Binary files /dev/null and b/modular_citadel/sound/vox/second.ogg differ
diff --git a/modular_citadel/sound/vox/secondary.ogg b/modular_citadel/sound/vox/secondary.ogg
new file mode 100644
index 0000000000..3cffa3dbe9
Binary files /dev/null and b/modular_citadel/sound/vox/secondary.ogg differ
diff --git a/modular_citadel/sound/vox/seconds.ogg b/modular_citadel/sound/vox/seconds.ogg
new file mode 100644
index 0000000000..98d08be46c
Binary files /dev/null and b/modular_citadel/sound/vox/seconds.ogg differ
diff --git a/modular_citadel/sound/vox/sector.ogg b/modular_citadel/sound/vox/sector.ogg
new file mode 100644
index 0000000000..ae2d733b87
Binary files /dev/null and b/modular_citadel/sound/vox/sector.ogg differ
diff --git a/modular_citadel/sound/vox/secure.ogg b/modular_citadel/sound/vox/secure.ogg
new file mode 100644
index 0000000000..c860e376dd
Binary files /dev/null and b/modular_citadel/sound/vox/secure.ogg differ
diff --git a/modular_citadel/sound/vox/secured.ogg b/modular_citadel/sound/vox/secured.ogg
new file mode 100644
index 0000000000..3134b679fa
Binary files /dev/null and b/modular_citadel/sound/vox/secured.ogg differ
diff --git a/modular_citadel/sound/vox/security.ogg b/modular_citadel/sound/vox/security.ogg
new file mode 100644
index 0000000000..40f6bc61af
Binary files /dev/null and b/modular_citadel/sound/vox/security.ogg differ
diff --git a/modular_citadel/sound/vox/select.ogg b/modular_citadel/sound/vox/select.ogg
new file mode 100644
index 0000000000..ef04570d32
Binary files /dev/null and b/modular_citadel/sound/vox/select.ogg differ
diff --git a/modular_citadel/sound/vox/selected.ogg b/modular_citadel/sound/vox/selected.ogg
new file mode 100644
index 0000000000..23891f5189
Binary files /dev/null and b/modular_citadel/sound/vox/selected.ogg differ
diff --git a/modular_citadel/sound/vox/service.ogg b/modular_citadel/sound/vox/service.ogg
new file mode 100644
index 0000000000..90294bd34b
Binary files /dev/null and b/modular_citadel/sound/vox/service.ogg differ
diff --git a/modular_citadel/sound/vox/seven.ogg b/modular_citadel/sound/vox/seven.ogg
new file mode 100644
index 0000000000..a0b2de4119
Binary files /dev/null and b/modular_citadel/sound/vox/seven.ogg differ
diff --git a/modular_citadel/sound/vox/seventeen.ogg b/modular_citadel/sound/vox/seventeen.ogg
new file mode 100644
index 0000000000..f23a0b0572
Binary files /dev/null and b/modular_citadel/sound/vox/seventeen.ogg differ
diff --git a/modular_citadel/sound/vox/seventy.ogg b/modular_citadel/sound/vox/seventy.ogg
new file mode 100644
index 0000000000..54f6cd6aef
Binary files /dev/null and b/modular_citadel/sound/vox/seventy.ogg differ
diff --git a/modular_citadel/sound/vox/severe.ogg b/modular_citadel/sound/vox/severe.ogg
new file mode 100644
index 0000000000..9a0cf3784e
Binary files /dev/null and b/modular_citadel/sound/vox/severe.ogg differ
diff --git a/modular_citadel/sound/vox/sewage.ogg b/modular_citadel/sound/vox/sewage.ogg
new file mode 100644
index 0000000000..44fb0d7fd5
Binary files /dev/null and b/modular_citadel/sound/vox/sewage.ogg differ
diff --git a/modular_citadel/sound/vox/sewer.ogg b/modular_citadel/sound/vox/sewer.ogg
new file mode 100644
index 0000000000..10516d86de
Binary files /dev/null and b/modular_citadel/sound/vox/sewer.ogg differ
diff --git a/modular_citadel/sound/vox/shield.ogg b/modular_citadel/sound/vox/shield.ogg
new file mode 100644
index 0000000000..c190383867
Binary files /dev/null and b/modular_citadel/sound/vox/shield.ogg differ
diff --git a/modular_citadel/sound/vox/shipment.ogg b/modular_citadel/sound/vox/shipment.ogg
new file mode 100644
index 0000000000..9677d3db98
Binary files /dev/null and b/modular_citadel/sound/vox/shipment.ogg differ
diff --git a/modular_citadel/sound/vox/shock.ogg b/modular_citadel/sound/vox/shock.ogg
new file mode 100644
index 0000000000..1c44bcca33
Binary files /dev/null and b/modular_citadel/sound/vox/shock.ogg differ
diff --git a/modular_citadel/sound/vox/shoot.ogg b/modular_citadel/sound/vox/shoot.ogg
new file mode 100644
index 0000000000..978a4aaa35
Binary files /dev/null and b/modular_citadel/sound/vox/shoot.ogg differ
diff --git a/modular_citadel/sound/vox/shower.ogg b/modular_citadel/sound/vox/shower.ogg
new file mode 100644
index 0000000000..d131987f13
Binary files /dev/null and b/modular_citadel/sound/vox/shower.ogg differ
diff --git a/modular_citadel/sound/vox/shut.ogg b/modular_citadel/sound/vox/shut.ogg
new file mode 100644
index 0000000000..ceba400b93
Binary files /dev/null and b/modular_citadel/sound/vox/shut.ogg differ
diff --git a/modular_citadel/sound/vox/side.ogg b/modular_citadel/sound/vox/side.ogg
new file mode 100644
index 0000000000..dbc3a7c9ff
Binary files /dev/null and b/modular_citadel/sound/vox/side.ogg differ
diff --git a/modular_citadel/sound/vox/sierra.ogg b/modular_citadel/sound/vox/sierra.ogg
new file mode 100644
index 0000000000..5c33745f28
Binary files /dev/null and b/modular_citadel/sound/vox/sierra.ogg differ
diff --git a/modular_citadel/sound/vox/sight.ogg b/modular_citadel/sound/vox/sight.ogg
new file mode 100644
index 0000000000..027c356b8d
Binary files /dev/null and b/modular_citadel/sound/vox/sight.ogg differ
diff --git a/modular_citadel/sound/vox/silo.ogg b/modular_citadel/sound/vox/silo.ogg
new file mode 100644
index 0000000000..3e0801f8ba
Binary files /dev/null and b/modular_citadel/sound/vox/silo.ogg differ
diff --git a/modular_citadel/sound/vox/six.ogg b/modular_citadel/sound/vox/six.ogg
new file mode 100644
index 0000000000..3544814963
Binary files /dev/null and b/modular_citadel/sound/vox/six.ogg differ
diff --git a/modular_citadel/sound/vox/sixteen.ogg b/modular_citadel/sound/vox/sixteen.ogg
new file mode 100644
index 0000000000..8c1159e147
Binary files /dev/null and b/modular_citadel/sound/vox/sixteen.ogg differ
diff --git a/modular_citadel/sound/vox/sixty.ogg b/modular_citadel/sound/vox/sixty.ogg
new file mode 100644
index 0000000000..bdf47b25b8
Binary files /dev/null and b/modular_citadel/sound/vox/sixty.ogg differ
diff --git a/modular_citadel/sound/vox/slime.ogg b/modular_citadel/sound/vox/slime.ogg
new file mode 100644
index 0000000000..0a6c1254e8
Binary files /dev/null and b/modular_citadel/sound/vox/slime.ogg differ
diff --git a/modular_citadel/sound/vox/slow.ogg b/modular_citadel/sound/vox/slow.ogg
new file mode 100644
index 0000000000..7639f9c7c2
Binary files /dev/null and b/modular_citadel/sound/vox/slow.ogg differ
diff --git a/modular_citadel/sound/vox/soldier.ogg b/modular_citadel/sound/vox/soldier.ogg
new file mode 100644
index 0000000000..3eb10ff590
Binary files /dev/null and b/modular_citadel/sound/vox/soldier.ogg differ
diff --git a/modular_citadel/sound/vox/some.ogg b/modular_citadel/sound/vox/some.ogg
new file mode 100644
index 0000000000..bcb5bbbbd3
Binary files /dev/null and b/modular_citadel/sound/vox/some.ogg differ
diff --git a/modular_citadel/sound/vox/someone.ogg b/modular_citadel/sound/vox/someone.ogg
new file mode 100644
index 0000000000..420a58e925
Binary files /dev/null and b/modular_citadel/sound/vox/someone.ogg differ
diff --git a/modular_citadel/sound/vox/something.ogg b/modular_citadel/sound/vox/something.ogg
new file mode 100644
index 0000000000..e3d26ede65
Binary files /dev/null and b/modular_citadel/sound/vox/something.ogg differ
diff --git a/modular_citadel/sound/vox/son.ogg b/modular_citadel/sound/vox/son.ogg
new file mode 100644
index 0000000000..843536c84a
Binary files /dev/null and b/modular_citadel/sound/vox/son.ogg differ
diff --git a/modular_citadel/sound/vox/sorry.ogg b/modular_citadel/sound/vox/sorry.ogg
new file mode 100644
index 0000000000..c125765112
Binary files /dev/null and b/modular_citadel/sound/vox/sorry.ogg differ
diff --git a/modular_citadel/sound/vox/south.ogg b/modular_citadel/sound/vox/south.ogg
new file mode 100644
index 0000000000..d32f048772
Binary files /dev/null and b/modular_citadel/sound/vox/south.ogg differ
diff --git a/modular_citadel/sound/vox/squad.ogg b/modular_citadel/sound/vox/squad.ogg
new file mode 100644
index 0000000000..582f6459af
Binary files /dev/null and b/modular_citadel/sound/vox/squad.ogg differ
diff --git a/modular_citadel/sound/vox/square.ogg b/modular_citadel/sound/vox/square.ogg
new file mode 100644
index 0000000000..a9beddd3c9
Binary files /dev/null and b/modular_citadel/sound/vox/square.ogg differ
diff --git a/modular_citadel/sound/vox/stairway.ogg b/modular_citadel/sound/vox/stairway.ogg
new file mode 100644
index 0000000000..31b0042edd
Binary files /dev/null and b/modular_citadel/sound/vox/stairway.ogg differ
diff --git a/modular_citadel/sound/vox/status.ogg b/modular_citadel/sound/vox/status.ogg
new file mode 100644
index 0000000000..611088f19a
Binary files /dev/null and b/modular_citadel/sound/vox/status.ogg differ
diff --git a/modular_citadel/sound/vox/sterile.ogg b/modular_citadel/sound/vox/sterile.ogg
new file mode 100644
index 0000000000..4e4d9fad22
Binary files /dev/null and b/modular_citadel/sound/vox/sterile.ogg differ
diff --git a/modular_citadel/sound/vox/sterilization.ogg b/modular_citadel/sound/vox/sterilization.ogg
new file mode 100644
index 0000000000..fec2104d0b
Binary files /dev/null and b/modular_citadel/sound/vox/sterilization.ogg differ
diff --git a/modular_citadel/sound/vox/stolen.ogg b/modular_citadel/sound/vox/stolen.ogg
new file mode 100644
index 0000000000..7e8c624bdf
Binary files /dev/null and b/modular_citadel/sound/vox/stolen.ogg differ
diff --git a/modular_citadel/sound/vox/storage.ogg b/modular_citadel/sound/vox/storage.ogg
new file mode 100644
index 0000000000..e47ef4e09f
Binary files /dev/null and b/modular_citadel/sound/vox/storage.ogg differ
diff --git a/modular_citadel/sound/vox/sub.ogg b/modular_citadel/sound/vox/sub.ogg
new file mode 100644
index 0000000000..ca9a621ad1
Binary files /dev/null and b/modular_citadel/sound/vox/sub.ogg differ
diff --git a/modular_citadel/sound/vox/subsurface.ogg b/modular_citadel/sound/vox/subsurface.ogg
new file mode 100644
index 0000000000..08c98d50f5
Binary files /dev/null and b/modular_citadel/sound/vox/subsurface.ogg differ
diff --git a/modular_citadel/sound/vox/sudden.ogg b/modular_citadel/sound/vox/sudden.ogg
new file mode 100644
index 0000000000..7140e0f874
Binary files /dev/null and b/modular_citadel/sound/vox/sudden.ogg differ
diff --git a/modular_citadel/sound/vox/suit.ogg b/modular_citadel/sound/vox/suit.ogg
new file mode 100644
index 0000000000..c636d5f278
Binary files /dev/null and b/modular_citadel/sound/vox/suit.ogg differ
diff --git a/modular_citadel/sound/vox/superconducting.ogg b/modular_citadel/sound/vox/superconducting.ogg
new file mode 100644
index 0000000000..244bda01c6
Binary files /dev/null and b/modular_citadel/sound/vox/superconducting.ogg differ
diff --git a/modular_citadel/sound/vox/supercooled.ogg b/modular_citadel/sound/vox/supercooled.ogg
new file mode 100644
index 0000000000..c758cdf7f8
Binary files /dev/null and b/modular_citadel/sound/vox/supercooled.ogg differ
diff --git a/modular_citadel/sound/vox/supply.ogg b/modular_citadel/sound/vox/supply.ogg
new file mode 100644
index 0000000000..13341124b3
Binary files /dev/null and b/modular_citadel/sound/vox/supply.ogg differ
diff --git a/modular_citadel/sound/vox/surface.ogg b/modular_citadel/sound/vox/surface.ogg
new file mode 100644
index 0000000000..f498cfd6bd
Binary files /dev/null and b/modular_citadel/sound/vox/surface.ogg differ
diff --git a/modular_citadel/sound/vox/surrender.ogg b/modular_citadel/sound/vox/surrender.ogg
new file mode 100644
index 0000000000..ba1864d38f
Binary files /dev/null and b/modular_citadel/sound/vox/surrender.ogg differ
diff --git a/modular_citadel/sound/vox/surround.ogg b/modular_citadel/sound/vox/surround.ogg
new file mode 100644
index 0000000000..7a3ab9a69a
Binary files /dev/null and b/modular_citadel/sound/vox/surround.ogg differ
diff --git a/modular_citadel/sound/vox/surrounded.ogg b/modular_citadel/sound/vox/surrounded.ogg
new file mode 100644
index 0000000000..464ae912f4
Binary files /dev/null and b/modular_citadel/sound/vox/surrounded.ogg differ
diff --git a/modular_citadel/sound/vox/switch.ogg b/modular_citadel/sound/vox/switch.ogg
new file mode 100644
index 0000000000..d007893d35
Binary files /dev/null and b/modular_citadel/sound/vox/switch.ogg differ
diff --git a/modular_citadel/sound/vox/system.ogg b/modular_citadel/sound/vox/system.ogg
new file mode 100644
index 0000000000..fb459b927f
Binary files /dev/null and b/modular_citadel/sound/vox/system.ogg differ
diff --git a/modular_citadel/sound/vox/systems.ogg b/modular_citadel/sound/vox/systems.ogg
new file mode 100644
index 0000000000..37072c97f4
Binary files /dev/null and b/modular_citadel/sound/vox/systems.ogg differ
diff --git a/modular_citadel/sound/vox/tactical.ogg b/modular_citadel/sound/vox/tactical.ogg
new file mode 100644
index 0000000000..ae294b916b
Binary files /dev/null and b/modular_citadel/sound/vox/tactical.ogg differ
diff --git a/modular_citadel/sound/vox/take.ogg b/modular_citadel/sound/vox/take.ogg
new file mode 100644
index 0000000000..83409da4a3
Binary files /dev/null and b/modular_citadel/sound/vox/take.ogg differ
diff --git a/modular_citadel/sound/vox/talk.ogg b/modular_citadel/sound/vox/talk.ogg
new file mode 100644
index 0000000000..043385c389
Binary files /dev/null and b/modular_citadel/sound/vox/talk.ogg differ
diff --git a/modular_citadel/sound/vox/tango.ogg b/modular_citadel/sound/vox/tango.ogg
new file mode 100644
index 0000000000..f852cb0df3
Binary files /dev/null and b/modular_citadel/sound/vox/tango.ogg differ
diff --git a/modular_citadel/sound/vox/tank.ogg b/modular_citadel/sound/vox/tank.ogg
new file mode 100644
index 0000000000..df09c12f98
Binary files /dev/null and b/modular_citadel/sound/vox/tank.ogg differ
diff --git a/modular_citadel/sound/vox/target.ogg b/modular_citadel/sound/vox/target.ogg
new file mode 100644
index 0000000000..0601cac45b
Binary files /dev/null and b/modular_citadel/sound/vox/target.ogg differ
diff --git a/modular_citadel/sound/vox/team.ogg b/modular_citadel/sound/vox/team.ogg
new file mode 100644
index 0000000000..4fc1a7f198
Binary files /dev/null and b/modular_citadel/sound/vox/team.ogg differ
diff --git a/modular_citadel/sound/vox/temperature.ogg b/modular_citadel/sound/vox/temperature.ogg
new file mode 100644
index 0000000000..d7b92a0cdc
Binary files /dev/null and b/modular_citadel/sound/vox/temperature.ogg differ
diff --git a/modular_citadel/sound/vox/temporal.ogg b/modular_citadel/sound/vox/temporal.ogg
new file mode 100644
index 0000000000..c2f9aedb48
Binary files /dev/null and b/modular_citadel/sound/vox/temporal.ogg differ
diff --git a/modular_citadel/sound/vox/ten.ogg b/modular_citadel/sound/vox/ten.ogg
new file mode 100644
index 0000000000..704d38c1ae
Binary files /dev/null and b/modular_citadel/sound/vox/ten.ogg differ
diff --git a/modular_citadel/sound/vox/terminal.ogg b/modular_citadel/sound/vox/terminal.ogg
new file mode 100644
index 0000000000..f756e03064
Binary files /dev/null and b/modular_citadel/sound/vox/terminal.ogg differ
diff --git a/modular_citadel/sound/vox/terminated.ogg b/modular_citadel/sound/vox/terminated.ogg
new file mode 100644
index 0000000000..52d35451b0
Binary files /dev/null and b/modular_citadel/sound/vox/terminated.ogg differ
diff --git a/modular_citadel/sound/vox/termination.ogg b/modular_citadel/sound/vox/termination.ogg
new file mode 100644
index 0000000000..aec4df5b01
Binary files /dev/null and b/modular_citadel/sound/vox/termination.ogg differ
diff --git a/modular_citadel/sound/vox/test.ogg b/modular_citadel/sound/vox/test.ogg
new file mode 100644
index 0000000000..df3ab175c6
Binary files /dev/null and b/modular_citadel/sound/vox/test.ogg differ
diff --git a/modular_citadel/sound/vox/that.ogg b/modular_citadel/sound/vox/that.ogg
new file mode 100644
index 0000000000..442dc3d264
Binary files /dev/null and b/modular_citadel/sound/vox/that.ogg differ
diff --git a/modular_citadel/sound/vox/the.ogg b/modular_citadel/sound/vox/the.ogg
new file mode 100644
index 0000000000..71caecef1f
Binary files /dev/null and b/modular_citadel/sound/vox/the.ogg differ
diff --git a/modular_citadel/sound/vox/then.ogg b/modular_citadel/sound/vox/then.ogg
new file mode 100644
index 0000000000..916d9276af
Binary files /dev/null and b/modular_citadel/sound/vox/then.ogg differ
diff --git a/modular_citadel/sound/vox/there.ogg b/modular_citadel/sound/vox/there.ogg
new file mode 100644
index 0000000000..c3536a2f72
Binary files /dev/null and b/modular_citadel/sound/vox/there.ogg differ
diff --git a/modular_citadel/sound/vox/third.ogg b/modular_citadel/sound/vox/third.ogg
new file mode 100644
index 0000000000..ba1125fe5b
Binary files /dev/null and b/modular_citadel/sound/vox/third.ogg differ
diff --git a/modular_citadel/sound/vox/thirteen.ogg b/modular_citadel/sound/vox/thirteen.ogg
new file mode 100644
index 0000000000..b3585a2d3b
Binary files /dev/null and b/modular_citadel/sound/vox/thirteen.ogg differ
diff --git a/modular_citadel/sound/vox/thirty.ogg b/modular_citadel/sound/vox/thirty.ogg
new file mode 100644
index 0000000000..cac0402265
Binary files /dev/null and b/modular_citadel/sound/vox/thirty.ogg differ
diff --git a/modular_citadel/sound/vox/this.ogg b/modular_citadel/sound/vox/this.ogg
new file mode 100644
index 0000000000..e7acd16108
Binary files /dev/null and b/modular_citadel/sound/vox/this.ogg differ
diff --git a/modular_citadel/sound/vox/those.ogg b/modular_citadel/sound/vox/those.ogg
new file mode 100644
index 0000000000..149a806b23
Binary files /dev/null and b/modular_citadel/sound/vox/those.ogg differ
diff --git a/modular_citadel/sound/vox/thousand.ogg b/modular_citadel/sound/vox/thousand.ogg
new file mode 100644
index 0000000000..fd5d46bf9b
Binary files /dev/null and b/modular_citadel/sound/vox/thousand.ogg differ
diff --git a/modular_citadel/sound/vox/threat.ogg b/modular_citadel/sound/vox/threat.ogg
new file mode 100644
index 0000000000..d4aa8d1d13
Binary files /dev/null and b/modular_citadel/sound/vox/threat.ogg differ
diff --git a/modular_citadel/sound/vox/three.ogg b/modular_citadel/sound/vox/three.ogg
new file mode 100644
index 0000000000..72bab5ff6b
Binary files /dev/null and b/modular_citadel/sound/vox/three.ogg differ
diff --git a/modular_citadel/sound/vox/through.ogg b/modular_citadel/sound/vox/through.ogg
new file mode 100644
index 0000000000..9f527f38c7
Binary files /dev/null and b/modular_citadel/sound/vox/through.ogg differ
diff --git a/modular_citadel/sound/vox/time.ogg b/modular_citadel/sound/vox/time.ogg
new file mode 100644
index 0000000000..ff32baa603
Binary files /dev/null and b/modular_citadel/sound/vox/time.ogg differ
diff --git a/modular_citadel/sound/vox/to.ogg b/modular_citadel/sound/vox/to.ogg
new file mode 100644
index 0000000000..9e7f76c84d
Binary files /dev/null and b/modular_citadel/sound/vox/to.ogg differ
diff --git a/modular_citadel/sound/vox/top.ogg b/modular_citadel/sound/vox/top.ogg
new file mode 100644
index 0000000000..bc6b0bce22
Binary files /dev/null and b/modular_citadel/sound/vox/top.ogg differ
diff --git a/modular_citadel/sound/vox/topside.ogg b/modular_citadel/sound/vox/topside.ogg
new file mode 100644
index 0000000000..34dfaf4405
Binary files /dev/null and b/modular_citadel/sound/vox/topside.ogg differ
diff --git a/modular_citadel/sound/vox/touch.ogg b/modular_citadel/sound/vox/touch.ogg
new file mode 100644
index 0000000000..fe34a1b083
Binary files /dev/null and b/modular_citadel/sound/vox/touch.ogg differ
diff --git a/modular_citadel/sound/vox/towards.ogg b/modular_citadel/sound/vox/towards.ogg
new file mode 100644
index 0000000000..edb2bf04d1
Binary files /dev/null and b/modular_citadel/sound/vox/towards.ogg differ
diff --git a/modular_citadel/sound/vox/track.ogg b/modular_citadel/sound/vox/track.ogg
new file mode 100644
index 0000000000..447d1f6982
Binary files /dev/null and b/modular_citadel/sound/vox/track.ogg differ
diff --git a/modular_citadel/sound/vox/train.ogg b/modular_citadel/sound/vox/train.ogg
new file mode 100644
index 0000000000..e4b78fe638
Binary files /dev/null and b/modular_citadel/sound/vox/train.ogg differ
diff --git a/modular_citadel/sound/vox/transportation.ogg b/modular_citadel/sound/vox/transportation.ogg
new file mode 100644
index 0000000000..78d2122ccb
Binary files /dev/null and b/modular_citadel/sound/vox/transportation.ogg differ
diff --git a/modular_citadel/sound/vox/truck.ogg b/modular_citadel/sound/vox/truck.ogg
new file mode 100644
index 0000000000..5822f17d83
Binary files /dev/null and b/modular_citadel/sound/vox/truck.ogg differ
diff --git a/modular_citadel/sound/vox/tunnel.ogg b/modular_citadel/sound/vox/tunnel.ogg
new file mode 100644
index 0000000000..3264b41496
Binary files /dev/null and b/modular_citadel/sound/vox/tunnel.ogg differ
diff --git a/modular_citadel/sound/vox/turn.ogg b/modular_citadel/sound/vox/turn.ogg
new file mode 100644
index 0000000000..5a8a32cbd4
Binary files /dev/null and b/modular_citadel/sound/vox/turn.ogg differ
diff --git a/modular_citadel/sound/vox/turret.ogg b/modular_citadel/sound/vox/turret.ogg
new file mode 100644
index 0000000000..96d5bf6da9
Binary files /dev/null and b/modular_citadel/sound/vox/turret.ogg differ
diff --git a/modular_citadel/sound/vox/twelve.ogg b/modular_citadel/sound/vox/twelve.ogg
new file mode 100644
index 0000000000..2e45cf797d
Binary files /dev/null and b/modular_citadel/sound/vox/twelve.ogg differ
diff --git a/modular_citadel/sound/vox/twenty.ogg b/modular_citadel/sound/vox/twenty.ogg
new file mode 100644
index 0000000000..c54922a384
Binary files /dev/null and b/modular_citadel/sound/vox/twenty.ogg differ
diff --git a/modular_citadel/sound/vox/two.ogg b/modular_citadel/sound/vox/two.ogg
new file mode 100644
index 0000000000..e1abe93d97
Binary files /dev/null and b/modular_citadel/sound/vox/two.ogg differ
diff --git a/modular_citadel/sound/vox/unauthorized.ogg b/modular_citadel/sound/vox/unauthorized.ogg
new file mode 100644
index 0000000000..2238e09696
Binary files /dev/null and b/modular_citadel/sound/vox/unauthorized.ogg differ
diff --git a/modular_citadel/sound/vox/under.ogg b/modular_citadel/sound/vox/under.ogg
new file mode 100644
index 0000000000..8445ce571a
Binary files /dev/null and b/modular_citadel/sound/vox/under.ogg differ
diff --git a/modular_citadel/sound/vox/uniform.ogg b/modular_citadel/sound/vox/uniform.ogg
new file mode 100644
index 0000000000..6d3029ed7f
Binary files /dev/null and b/modular_citadel/sound/vox/uniform.ogg differ
diff --git a/modular_citadel/sound/vox/unlocked.ogg b/modular_citadel/sound/vox/unlocked.ogg
new file mode 100644
index 0000000000..1f66ba7003
Binary files /dev/null and b/modular_citadel/sound/vox/unlocked.ogg differ
diff --git a/modular_citadel/sound/vox/until.ogg b/modular_citadel/sound/vox/until.ogg
new file mode 100644
index 0000000000..00e1417aaa
Binary files /dev/null and b/modular_citadel/sound/vox/until.ogg differ
diff --git a/modular_citadel/sound/vox/up.ogg b/modular_citadel/sound/vox/up.ogg
new file mode 100644
index 0000000000..31d9dd13cc
Binary files /dev/null and b/modular_citadel/sound/vox/up.ogg differ
diff --git a/modular_citadel/sound/vox/upper.ogg b/modular_citadel/sound/vox/upper.ogg
new file mode 100644
index 0000000000..c26d7450ed
Binary files /dev/null and b/modular_citadel/sound/vox/upper.ogg differ
diff --git a/modular_citadel/sound/vox/uranium.ogg b/modular_citadel/sound/vox/uranium.ogg
new file mode 100644
index 0000000000..8eeed7b34e
Binary files /dev/null and b/modular_citadel/sound/vox/uranium.ogg differ
diff --git a/modular_citadel/sound/vox/us.ogg b/modular_citadel/sound/vox/us.ogg
new file mode 100644
index 0000000000..1d0cc90667
Binary files /dev/null and b/modular_citadel/sound/vox/us.ogg differ
diff --git a/modular_citadel/sound/vox/usa.ogg b/modular_citadel/sound/vox/usa.ogg
new file mode 100644
index 0000000000..2a057059f7
Binary files /dev/null and b/modular_citadel/sound/vox/usa.ogg differ
diff --git a/modular_citadel/sound/vox/use.ogg b/modular_citadel/sound/vox/use.ogg
new file mode 100644
index 0000000000..6fdb0d2f51
Binary files /dev/null and b/modular_citadel/sound/vox/use.ogg differ
diff --git a/modular_citadel/sound/vox/used.ogg b/modular_citadel/sound/vox/used.ogg
new file mode 100644
index 0000000000..126ab4cce3
Binary files /dev/null and b/modular_citadel/sound/vox/used.ogg differ
diff --git a/modular_citadel/sound/vox/user.ogg b/modular_citadel/sound/vox/user.ogg
new file mode 100644
index 0000000000..fa99d50a09
Binary files /dev/null and b/modular_citadel/sound/vox/user.ogg differ
diff --git a/modular_citadel/sound/vox/vacate.ogg b/modular_citadel/sound/vox/vacate.ogg
new file mode 100644
index 0000000000..1eadec9832
Binary files /dev/null and b/modular_citadel/sound/vox/vacate.ogg differ
diff --git a/modular_citadel/sound/vox/valid.ogg b/modular_citadel/sound/vox/valid.ogg
new file mode 100644
index 0000000000..5ec3b93b3b
Binary files /dev/null and b/modular_citadel/sound/vox/valid.ogg differ
diff --git a/modular_citadel/sound/vox/vapor.ogg b/modular_citadel/sound/vox/vapor.ogg
new file mode 100644
index 0000000000..9ceb555e77
Binary files /dev/null and b/modular_citadel/sound/vox/vapor.ogg differ
diff --git a/modular_citadel/sound/vox/vent.ogg b/modular_citadel/sound/vox/vent.ogg
new file mode 100644
index 0000000000..47f37d441f
Binary files /dev/null and b/modular_citadel/sound/vox/vent.ogg differ
diff --git a/modular_citadel/sound/vox/ventillation.ogg b/modular_citadel/sound/vox/ventillation.ogg
new file mode 100644
index 0000000000..a8e9928e7c
Binary files /dev/null and b/modular_citadel/sound/vox/ventillation.ogg differ
diff --git a/modular_citadel/sound/vox/victor.ogg b/modular_citadel/sound/vox/victor.ogg
new file mode 100644
index 0000000000..686b6fd7cd
Binary files /dev/null and b/modular_citadel/sound/vox/victor.ogg differ
diff --git a/modular_citadel/sound/vox/violated.ogg b/modular_citadel/sound/vox/violated.ogg
new file mode 100644
index 0000000000..01ebe6a2de
Binary files /dev/null and b/modular_citadel/sound/vox/violated.ogg differ
diff --git a/modular_citadel/sound/vox/violation.ogg b/modular_citadel/sound/vox/violation.ogg
new file mode 100644
index 0000000000..2d9e1b6fbe
Binary files /dev/null and b/modular_citadel/sound/vox/violation.ogg differ
diff --git a/modular_citadel/sound/vox/voltage.ogg b/modular_citadel/sound/vox/voltage.ogg
new file mode 100644
index 0000000000..64417b2556
Binary files /dev/null and b/modular_citadel/sound/vox/voltage.ogg differ
diff --git a/modular_citadel/sound/vox/vox_login.ogg b/modular_citadel/sound/vox/vox_login.ogg
new file mode 100644
index 0000000000..5c406191a2
Binary files /dev/null and b/modular_citadel/sound/vox/vox_login.ogg differ
diff --git a/modular_citadel/sound/vox/walk.ogg b/modular_citadel/sound/vox/walk.ogg
new file mode 100644
index 0000000000..6d4cebd36c
Binary files /dev/null and b/modular_citadel/sound/vox/walk.ogg differ
diff --git a/modular_citadel/sound/vox/wall.ogg b/modular_citadel/sound/vox/wall.ogg
new file mode 100644
index 0000000000..8f34bb6fdd
Binary files /dev/null and b/modular_citadel/sound/vox/wall.ogg differ
diff --git a/modular_citadel/sound/vox/want.ogg b/modular_citadel/sound/vox/want.ogg
new file mode 100644
index 0000000000..b307dbfdc6
Binary files /dev/null and b/modular_citadel/sound/vox/want.ogg differ
diff --git a/modular_citadel/sound/vox/wanted.ogg b/modular_citadel/sound/vox/wanted.ogg
new file mode 100644
index 0000000000..a783e64ee2
Binary files /dev/null and b/modular_citadel/sound/vox/wanted.ogg differ
diff --git a/modular_citadel/sound/vox/warm.ogg b/modular_citadel/sound/vox/warm.ogg
new file mode 100644
index 0000000000..00fbe521b1
Binary files /dev/null and b/modular_citadel/sound/vox/warm.ogg differ
diff --git a/modular_citadel/sound/vox/warn.ogg b/modular_citadel/sound/vox/warn.ogg
new file mode 100644
index 0000000000..931ae208c6
Binary files /dev/null and b/modular_citadel/sound/vox/warn.ogg differ
diff --git a/modular_citadel/sound/vox/warning.ogg b/modular_citadel/sound/vox/warning.ogg
new file mode 100644
index 0000000000..e237c5e0ae
Binary files /dev/null and b/modular_citadel/sound/vox/warning.ogg differ
diff --git a/modular_citadel/sound/vox/waste.ogg b/modular_citadel/sound/vox/waste.ogg
new file mode 100644
index 0000000000..7152c80fc8
Binary files /dev/null and b/modular_citadel/sound/vox/waste.ogg differ
diff --git a/modular_citadel/sound/vox/water.ogg b/modular_citadel/sound/vox/water.ogg
new file mode 100644
index 0000000000..fdced84c63
Binary files /dev/null and b/modular_citadel/sound/vox/water.ogg differ
diff --git a/modular_citadel/sound/vox/we.ogg b/modular_citadel/sound/vox/we.ogg
new file mode 100644
index 0000000000..f31d0c34d3
Binary files /dev/null and b/modular_citadel/sound/vox/we.ogg differ
diff --git a/modular_citadel/sound/vox/weapon.ogg b/modular_citadel/sound/vox/weapon.ogg
new file mode 100644
index 0000000000..fcf4b8bf07
Binary files /dev/null and b/modular_citadel/sound/vox/weapon.ogg differ
diff --git a/modular_citadel/sound/vox/west.ogg b/modular_citadel/sound/vox/west.ogg
new file mode 100644
index 0000000000..35eb23ac27
Binary files /dev/null and b/modular_citadel/sound/vox/west.ogg differ
diff --git a/modular_citadel/sound/vox/whiskey.ogg b/modular_citadel/sound/vox/whiskey.ogg
new file mode 100644
index 0000000000..53102ef546
Binary files /dev/null and b/modular_citadel/sound/vox/whiskey.ogg differ
diff --git a/modular_citadel/sound/vox/white.ogg b/modular_citadel/sound/vox/white.ogg
new file mode 100644
index 0000000000..b9c2c6e8fb
Binary files /dev/null and b/modular_citadel/sound/vox/white.ogg differ
diff --git a/modular_citadel/sound/vox/wilco.ogg b/modular_citadel/sound/vox/wilco.ogg
new file mode 100644
index 0000000000..08f1b38f60
Binary files /dev/null and b/modular_citadel/sound/vox/wilco.ogg differ
diff --git a/modular_citadel/sound/vox/will.ogg b/modular_citadel/sound/vox/will.ogg
new file mode 100644
index 0000000000..8b11eec8d5
Binary files /dev/null and b/modular_citadel/sound/vox/will.ogg differ
diff --git a/modular_citadel/sound/vox/with.ogg b/modular_citadel/sound/vox/with.ogg
new file mode 100644
index 0000000000..100131ddfd
Binary files /dev/null and b/modular_citadel/sound/vox/with.ogg differ
diff --git a/modular_citadel/sound/vox/without.ogg b/modular_citadel/sound/vox/without.ogg
new file mode 100644
index 0000000000..5e6b99206f
Binary files /dev/null and b/modular_citadel/sound/vox/without.ogg differ
diff --git a/modular_citadel/sound/vox/woop.ogg b/modular_citadel/sound/vox/woop.ogg
new file mode 100644
index 0000000000..c29a975858
Binary files /dev/null and b/modular_citadel/sound/vox/woop.ogg differ
diff --git a/modular_citadel/sound/vox/xeno.ogg b/modular_citadel/sound/vox/xeno.ogg
new file mode 100644
index 0000000000..9230e650c7
Binary files /dev/null and b/modular_citadel/sound/vox/xeno.ogg differ
diff --git a/modular_citadel/sound/vox/yankee.ogg b/modular_citadel/sound/vox/yankee.ogg
new file mode 100644
index 0000000000..ea5578d28f
Binary files /dev/null and b/modular_citadel/sound/vox/yankee.ogg differ
diff --git a/modular_citadel/sound/vox/yards.ogg b/modular_citadel/sound/vox/yards.ogg
new file mode 100644
index 0000000000..7b911ad4bd
Binary files /dev/null and b/modular_citadel/sound/vox/yards.ogg differ
diff --git a/modular_citadel/sound/vox/year.ogg b/modular_citadel/sound/vox/year.ogg
new file mode 100644
index 0000000000..7cd1065af1
Binary files /dev/null and b/modular_citadel/sound/vox/year.ogg differ
diff --git a/modular_citadel/sound/vox/yellow.ogg b/modular_citadel/sound/vox/yellow.ogg
new file mode 100644
index 0000000000..87668cd45f
Binary files /dev/null and b/modular_citadel/sound/vox/yellow.ogg differ
diff --git a/modular_citadel/sound/vox/yes.ogg b/modular_citadel/sound/vox/yes.ogg
new file mode 100644
index 0000000000..24be399de3
Binary files /dev/null and b/modular_citadel/sound/vox/yes.ogg differ
diff --git a/modular_citadel/sound/vox/you.ogg b/modular_citadel/sound/vox/you.ogg
new file mode 100644
index 0000000000..4a30e5c721
Binary files /dev/null and b/modular_citadel/sound/vox/you.ogg differ
diff --git a/modular_citadel/sound/vox/your.ogg b/modular_citadel/sound/vox/your.ogg
new file mode 100644
index 0000000000..12d49c3ded
Binary files /dev/null and b/modular_citadel/sound/vox/your.ogg differ
diff --git a/modular_citadel/sound/vox/yourself.ogg b/modular_citadel/sound/vox/yourself.ogg
new file mode 100644
index 0000000000..03a0af6531
Binary files /dev/null and b/modular_citadel/sound/vox/yourself.ogg differ
diff --git a/modular_citadel/sound/vox/zero.ogg b/modular_citadel/sound/vox/zero.ogg
new file mode 100644
index 0000000000..e14f91344c
Binary files /dev/null and b/modular_citadel/sound/vox/zero.ogg differ
diff --git a/modular_citadel/sound/vox/zone.ogg b/modular_citadel/sound/vox/zone.ogg
new file mode 100644
index 0000000000..3c8834c8f4
Binary files /dev/null and b/modular_citadel/sound/vox/zone.ogg differ
diff --git a/modular_citadel/sound/vox/zulu.ogg b/modular_citadel/sound/vox/zulu.ogg
new file mode 100644
index 0000000000..739cdd2187
Binary files /dev/null and b/modular_citadel/sound/vox/zulu.ogg differ
diff --git a/sound/effects/femur_breaker.ogg b/sound/effects/femur_breaker.ogg
new file mode 100644
index 0000000000..140dc0477e
Binary files /dev/null and b/sound/effects/femur_breaker.ogg differ
diff --git a/sound/items/towelwhip.ogg b/sound/items/towelwhip.ogg
new file mode 100644
index 0000000000..49dab750a8
Binary files /dev/null and b/sound/items/towelwhip.ogg differ
diff --git a/sound/items/towelwipe.ogg b/sound/items/towelwipe.ogg
new file mode 100644
index 0000000000..2bee55c38d
Binary files /dev/null and b/sound/items/towelwipe.ogg differ
diff --git a/sound/music/flyinghigh.ogg b/sound/music/flyinghigh.ogg
new file mode 100644
index 0000000000..4f1aa1458a
Binary files /dev/null and b/sound/music/flyinghigh.ogg differ
diff --git a/sound/music/samsara.ogg b/sound/music/samsara.ogg
new file mode 100644
index 0000000000..4842aab3e5
Binary files /dev/null and b/sound/music/samsara.ogg differ
diff --git a/sound/music/theend.ogg b/sound/music/theend.ogg
new file mode 100644
index 0000000000..52255eee2a
Binary files /dev/null and b/sound/music/theend.ogg differ
diff --git a/strings/round_start_sounds.txt b/strings/round_start_sounds.txt
index a8409188fc..c67bf6b4a6 100644
--- a/strings/round_start_sounds.txt
+++ b/strings/round_start_sounds.txt
@@ -22,3 +22,6 @@ sound/music/goodbyemoonmen.ogg
sound/music/flytothemoon_otomatone.ogg
sound/music/milkyway.ogg
sound/music/rocketridersprayer.ogg
+sound/music/theend.ogg
+sound/music/flyinghigh.ogg
+sound/music/samsara.ogg
diff --git a/tgstation.dme b/tgstation.dme
index e215f27da3..7218b87e0b 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -41,6 +41,7 @@
#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
+#include "code\__DEFINES\donator_groupings.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\exports.dm"
#include "code\__DEFINES\flags.dm"
@@ -62,6 +63,7 @@
#include "code\__DEFINES\maths.dm"
#include "code\__DEFINES\MC.dm"
#include "code\__DEFINES\medal.dm"
+#include "code\__DEFINES\melee.dm"
#include "code\__DEFINES\menu.dm"
#include "code\__DEFINES\misc.dm"
#include "code\__DEFINES\mobs.dm"
@@ -114,6 +116,7 @@
#include "code\__HELPERS\AStar.dm"
#include "code\__HELPERS\cmp.dm"
#include "code\__HELPERS\dates.dm"
+#include "code\__HELPERS\donator_groupings.dm"
#include "code\__HELPERS\files.dm"
#include "code\__HELPERS\game.dm"
#include "code\__HELPERS\global_lists.dm"
@@ -158,6 +161,7 @@
#include "code\_globalvars\lists\maintenance_loot.dm"
#include "code\_globalvars\lists\mapping.dm"
#include "code\_globalvars\lists\medals.dm"
+#include "code\_globalvars\lists\misc.dm"
#include "code\_globalvars\lists\mobs.dm"
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
@@ -217,6 +221,7 @@
#include "code\controllers\configuration\configuration.dm"
#include "code\controllers\configuration\entries\comms.dm"
#include "code\controllers\configuration\entries\dbconfig.dm"
+#include "code\controllers\configuration\entries\donator.dm"
#include "code\controllers\configuration\entries\game_options.dm"
#include "code\controllers\configuration\entries\general.dm"
#include "code\controllers\subsystem\acid.dm"
@@ -427,6 +432,7 @@
#include "code\datums\diseases\advance\symptoms\headache.dm"
#include "code\datums\diseases\advance\symptoms\heal.dm"
#include "code\datums\diseases\advance\symptoms\itching.dm"
+#include "code\datums\diseases\advance\symptoms\nanites.dm"
#include "code\datums\diseases\advance\symptoms\narcolepsy.dm"
#include "code\datums\diseases\advance\symptoms\oxygen.dm"
#include "code\datums\diseases\advance\symptoms\sensory.dm"
@@ -862,6 +868,7 @@
#include "code\game\objects\items\devices\pipe_painter.dm"
#include "code\game\objects\items\devices\powersink.dm"
#include "code\game\objects\items\devices\pressureplates.dm"
+#include "code\game\objects\items\devices\quantum_keycard.dm"
#include "code\game\objects\items\devices\reverse_bear_trap.dm"
#include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\sensor_device.dm"
@@ -969,6 +976,7 @@
#include "code\game\objects\structures\electricchair.dm"
#include "code\game\objects\structures\extinguisher.dm"
#include "code\game\objects\structures\false_walls.dm"
+#include "code\game\objects\structures\femur_breaker.dm"
#include "code\game\objects\structures\fence.dm"
#include "code\game\objects\structures\fireaxe.dm"
#include "code\game\objects\structures\fireplace.dm"
@@ -987,6 +995,7 @@
#include "code\game\objects\structures\ladders.dm"
#include "code\game\objects\structures\lattice.dm"
#include "code\game\objects\structures\life_candle.dm"
+#include "code\game\objects\structures\loom.dm"
#include "code\game\objects\structures\manned_turret.dm"
#include "code\game\objects\structures\memorial.dm"
#include "code\game\objects\structures\mineral_doors.dm"
@@ -1277,6 +1286,7 @@
#include "code\modules\antagonists\disease\disease_mob.dm"
#include "code\modules\antagonists\ert\ert.dm"
#include "code\modules\antagonists\greentext\greentext.dm"
+#include "code\modules\antagonists\greybois\greybois.dm"
#include "code\modules\antagonists\highlander\highlander.dm"
#include "code\modules\antagonists\monkey\monkey.dm"
#include "code\modules\antagonists\morph\morph.dm"
@@ -1454,6 +1464,7 @@
#include "code\modules\client\client_colour.dm"
#include "code\modules\client\client_defines.dm"
#include "code\modules\client\client_procs.dm"
+#include "code\modules\client\darkmode.dm"
#include "code\modules\client\message.dm"
#include "code\modules\client\player_details.dm"
#include "code\modules\client\preferences.dm"
@@ -1547,7 +1558,6 @@
#include "code\modules\crafting\recipes.dm"
#include "code\modules\detectivework\detective_work.dm"
#include "code\modules\detectivework\evidence.dm"
-#include "code\modules\detectivework\footprints_and_rag.dm"
#include "code\modules\detectivework\scanner.dm"
#include "code\modules\emoji\emoji_parse.dm"
#include "code\modules\error_handler\error_handler.dm"
@@ -1713,6 +1723,7 @@
#include "code\modules\hydroponics\grown\citrus.dm"
#include "code\modules\hydroponics\grown\cocoa_vanilla.dm"
#include "code\modules\hydroponics\grown\corn.dm"
+#include "code\modules\hydroponics\grown\cotton.dm"
#include "code\modules\hydroponics\grown\eggplant.dm"
#include "code\modules\hydroponics\grown\flowers.dm"
#include "code\modules\hydroponics\grown\grass_carpet.dm"
@@ -1722,6 +1733,7 @@
#include "code\modules\hydroponics\grown\mushrooms.dm"
#include "code\modules\hydroponics\grown\nettle.dm"
#include "code\modules\hydroponics\grown\onion.dm"
+#include "code\modules\hydroponics\grown\peach.dm"
#include "code\modules\hydroponics\grown\peanuts.dm"
#include "code\modules\hydroponics\grown\pineapple.dm"
#include "code\modules\hydroponics\grown\potato.dm"
@@ -2501,6 +2513,7 @@
#include "code\modules\reagents\reagent_containers\medspray.dm"
#include "code\modules\reagents\reagent_containers\patch.dm"
#include "code\modules\reagents\reagent_containers\pill.dm"
+#include "code\modules\reagents\reagent_containers\rags.dm"
#include "code\modules\reagents\reagent_containers\spray.dm"
#include "code\modules\reagents\reagent_containers\syringes.dm"
#include "code\modules\recycling\conveyor2.dm"
@@ -2832,6 +2845,7 @@
#include "modular_citadel\code\_onclick\item_attack.dm"
#include "modular_citadel\code\_onclick\other_mobs.dm"
#include "modular_citadel\code\_onclick\hud\screen_objects.dm"
+#include "modular_citadel\code\_onclick\hud\sprint.dm"
#include "modular_citadel\code\_onclick\hud\stamina.dm"
#include "modular_citadel\code\controllers\configuration\entries\general.dm"
#include "modular_citadel\code\controllers\subsystem\job.dm"
@@ -2885,7 +2899,6 @@
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm"
#include "modular_citadel\code\game\objects\items\balls.dm"
#include "modular_citadel\code\game\objects\items\boombox.dm"
-#include "modular_citadel\code\game\objects\items\handcuffs.dm"
#include "modular_citadel\code\game\objects\items\holy_weapons.dm"
#include "modular_citadel\code\game\objects\items\honk.dm"
#include "modular_citadel\code\game\objects\items\meat.dm"
@@ -2896,10 +2909,8 @@
#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm"
-#include "modular_citadel\code\game\objects\items\melee\energy.dm"
#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm"
#include "modular_citadel\code\game\objects\items\melee\misc.dm"
-#include "modular_citadel\code\game\objects\items\melee\transforming.dm"
#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm"
#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
#include "modular_citadel\code\game\objects\structures\tables_racks.dm"
@@ -2927,13 +2938,13 @@
#include "modular_citadel\code\modules\arousal\toys\dildos.dm"
#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm"
#include "modular_citadel\code\modules\cargo\console.dm"
-#include "modular_citadel\code\modules\cargo\packs.dm"
#include "modular_citadel\code\modules\client\client_defines.dm"
#include "modular_citadel\code\modules\client\client_procs.dm"
#include "modular_citadel\code\modules\client\preferences.dm"
#include "modular_citadel\code\modules\client\preferences_savefile.dm"
#include "modular_citadel\code\modules\client\preferences_toggles.dm"
#include "modular_citadel\code\modules\client\loadout\__donator.dm"
+#include "modular_citadel\code\modules\client\loadout\_loadout.dm"
#include "modular_citadel\code\modules\client\loadout\_medical.dm"
#include "modular_citadel\code\modules\client\loadout\_security.dm"
#include "modular_citadel\code\modules\client\loadout\_service.dm"
@@ -2942,7 +2953,6 @@
#include "modular_citadel\code\modules\client\loadout\gloves.dm"
#include "modular_citadel\code\modules\client\loadout\hands.dm"
#include "modular_citadel\code\modules\client\loadout\head.dm"
-#include "modular_citadel\code\modules\client\loadout\loadout.dm"
#include "modular_citadel\code\modules\client\loadout\mask.dm"
#include "modular_citadel\code\modules\client\loadout\neck.dm"
#include "modular_citadel\code\modules\client\loadout\shoes.dm"
@@ -2961,7 +2971,6 @@
#include "modular_citadel\code\modules\clothing\under\trek_under.dm"
#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm"
#include "modular_citadel\code\modules\clothing\under\under.dm"
-#include "modular_citadel\code\modules\crafting\recipes.dm"
#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
@@ -2986,16 +2995,15 @@
#include "modular_citadel\code\modules\mentor\mentorhelp.dm"
#include "modular_citadel\code\modules\mentor\mentorpm.dm"
#include "modular_citadel\code\modules\mentor\mentorsay.dm"
-#include "modular_citadel\code\modules\mining\mine_items.dm"
#include "modular_citadel\code\modules\mining\mining_ruins.dm"
#include "modular_citadel\code\modules\mob\cit_emotes.dm"
#include "modular_citadel\code\modules\mob\mob.dm"
#include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm"
#include "modular_citadel\code\modules\mob\living\damage_procs.dm"
#include "modular_citadel\code\modules\mob\living\living.dm"
-#include "modular_citadel\code\modules\mob\living\status_procs.dm"
#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm"
#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\life.dm"
#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
@@ -3005,6 +3013,7 @@
#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\ai\vox_sounds.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"
@@ -3022,7 +3031,6 @@
#include "modular_citadel\code\modules\projectiles\bullets\bullets\smg.dm"
#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm"
#include "modular_citadel\code\modules\projectiles\guns\toys.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\flechette.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm"
#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm"
@@ -3055,7 +3063,6 @@
#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm"
#include "modular_citadel\code\modules\research\designs\weapon_designs\weapon_designs.dm"
#include "modular_citadel\code\modules\research\techweb\_techweb.dm"
-#include "modular_citadel\code\modules\research\techweb\all_nodes.dm"
#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm"
#include "modular_citadel\code\modules\vehicles\secway.dm"
#include "modular_citadel\code\modules\vore\hook-defs_vr.dm"
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index 8af16f52bf..3599ece4f4 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,21 +1,21 @@
require=function(){function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var p="function"==typeof require&&require;if(!s&&p)return p(o,!0);if(i)return i(o,!0);var u=Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n||t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o=0;--a){var r=this.tryEntries[a],i=r.completion;if("root"===r.tryLoc)return e("end");if(r.tryLoc<=this.prev){var o=b.call(r,"catchLoc"),s=b.call(r,"finallyLoc");if(o&&s){if(this.prev=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&b.call(a,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),d(n),O}},"catch":function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var a=n.completion;if("throw"===a.type){var r=a.arg;d(n)}return r}}throw Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:h(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=g),O}}}("object"==typeof t?t:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(t,e,n){t(129),e.exports=t(24).RegExp.escape},{129:129,24:24}],4:[function(t,e,n){e.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],5:[function(t,e,n){var a=t(19);e.exports=function(t,e){if("number"!=typeof t&&"Number"!=a(t))throw TypeError(e);return+t}},{19:19}],6:[function(t,e,n){var a=t(127)("unscopables"),r=Array.prototype;void 0==r[a]&&t(43)(r,a,{}),e.exports=function(t){r[a][t]=!0}},{127:127,43:43}],7:[function(t,e,n){e.exports=function(t,e,n,a){if(!(t instanceof e)||void 0!==a&&a in t)throw TypeError(n+": incorrect invocation!");return t}},{}],8:[function(t,e,n){var a=t(52);e.exports=function(t){if(!a(t))throw TypeError(t+" is not an object!");return t}},{52:52}],9:[function(t,e,n){"use strict";var a=t(117),r=t(112),i=t(116);e.exports=[].copyWithin||function(t,e){var n=a(this),o=i(n.length),s=r(t,o),p=r(e,o),u=arguments.length>2?arguments[2]:void 0,c=Math.min((void 0===u?o:r(u,o))-p,o-s),l=1;for(s>p&&p+c>s&&(l=-1,p+=c-1,s+=c-1);c-- >0;)p in n?n[s]=n[p]:delete n[s],s+=l,p+=l;return n}},{112:112,116:116,117:117}],10:[function(t,e,n){"use strict";var a=t(117),r=t(112),i=t(116);e.exports=function(t){for(var e=a(this),n=i(e.length),o=arguments.length,s=r(o>1?arguments[1]:void 0,n),p=o>2?arguments[2]:void 0,u=void 0===p?n:r(p,n);u>s;)e[s++]=t;return e}},{112:112,116:116,117:117}],11:[function(t,e,n){var a=t(40);e.exports=function(t,e){var n=[];return a(t,!1,n.push,n,e),n}},{40:40}],12:[function(t,e,n){var a=t(115),r=t(116),i=t(112);e.exports=function(t){return function(e,n,o){var s,p=a(e),u=r(p.length),c=i(o,u);if(t&&n!=n){for(;u>c;)if(s=p[c++],s!=s)return!0}else for(;u>c;c++)if((t||c in p)&&p[c]===n)return t||c||0;return!t&&-1}}},{112:112,115:115,116:116}],13:[function(t,e,n){var a=t(26),r=t(48),i=t(117),o=t(116),s=t(16);e.exports=function(t,e){var n=1==t,p=2==t,u=3==t,c=4==t,l=6==t,d=5==t||l,f=e||s;return function(e,s,h){for(var m,g,v=i(e),b=r(v),y=a(s,h,3),_=o(b.length),x=0,w=n?f(e,_):p?f(e,0):void 0;_>x;x++)if((d||x in b)&&(m=b[x],g=y(m,x,v),t))if(n)w[x]=g;else if(g)switch(t){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(c)return!1;return l?-1:u||c?c:w}}},{116:116,117:117,16:16,26:26,48:48}],14:[function(t,e,n){var a=t(4),r=t(117),i=t(48),o=t(116);e.exports=function(t,e,n,s,p){a(e);var u=r(t),c=i(u),l=o(u.length),d=p?l-1:0,f=p?-1:1;if(2>n)for(;;){if(d in c){s=c[d],d+=f;break}if(d+=f,p?0>d:d>=l)throw TypeError("Reduce of empty array with no initial value")}for(;p?d>=0:l>d;d+=f)d in c&&(s=e(s,c[d],d,u));return s}},{116:116,117:117,4:4,48:48}],15:[function(t,e,n){var a=t(52),r=t(50),i=t(127)("species");e.exports=function(t){var e;return r(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!r(e.prototype)||(e=void 0),a(e)&&(e=e[i],null===e&&(e=void 0))),void 0===e?Array:e}},{127:127,50:50,52:52}],16:[function(t,e,n){var a=t(15);e.exports=function(t,e){return new(a(t))(e)}},{15:15}],17:[function(t,e,n){"use strict";var a=t(4),r=t(52),i=t(47),o=[].slice,s={},p=function(t,e,n){if(!(e in s)){for(var a=[],r=0;e>r;r++)a[r]="a["+r+"]";s[e]=Function("F,a","return new F("+a.join(",")+")")}return s[e](t,n)};e.exports=Function.bind||function(t){var e=a(this),n=o.call(arguments,1),s=function(){var a=n.concat(o.call(arguments));return this instanceof s?p(e,a.length,a):i(e,a,t)};return r(e.prototype)&&(s.prototype=e.prototype),s}},{4:4,47:47,52:52}],18:[function(t,e,n){var a=t(19),r=t(127)("toStringTag"),i="Arguments"==a(function(){return arguments}()),o=function(t,e){try{return t[e]}catch(n){}};e.exports=function(t){var e,n,s;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=o(e=Object(t),r))?n:i?a(e):"Object"==(s=a(e))&&"function"==typeof e.callee?"Arguments":s}},{127:127,19:19}],19:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],20:[function(t,e,n){"use strict";var a=t(72).f,r=t(71),i=t(91),o=t(26),s=t(7),p=t(40),u=t(56),c=t(58),l=t(98),d=t(30),f=t(66).fastKey,h=t(124),m=d?"_s":"size",g=function(t,e){var n,a=f(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,u){var c=t(function(t,a){s(t,c,e,"_i"),t._t=e,t._i=r(null),t._f=void 0,t._l=void 0,t[m]=0,void 0!=a&&p(a,n,t[u],t)});return i(c.prototype,{clear:function(){for(var t=h(this,e),n=t._i,a=t._f;a;a=a.n)a.r=!0,a.p&&(a.p=a.p.n=void 0),delete n[a.i];t._f=t._l=void 0,t[m]=0},"delete":function(t){var n=h(this,e),a=g(n,t);if(a){var r=a.n,i=a.p;delete n._i[a.i],a.r=!0,i&&(i.n=r),r&&(r.p=i),n._f==a&&(n._f=r),n._l==a&&(n._l=i),n[m]--}return!!a},forEach:function(t){h(this,e);for(var n,a=o(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(a(n.v,n.k,this);n&&n.r;)n=n.p},has:function(t){return!!g(h(this,e),t)}}),d&&a(c.prototype,"size",{get:function(){return h(this,e)[m]}}),c},def:function(t,e,n){var a,r,i=g(t,e);return i?i.v=n:(t._l=i={i:r=f(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[m]++,"F"!==r&&(t._i[r]=i)),t},getEntry:g,setStrong:function(t,e,n){u(t,e,function(t,n){this._t=h(t,e),this._k=n,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?c(0,n.k):"values"==e?c(0,n.v):c(0,[n.k,n.v]):(t._t=void 0,c(1))},n?"entries":"values",!n,!0),l(e)}}},{124:124,26:26,30:30,40:40,56:56,58:58,66:66,7:7,71:71,72:72,91:91,98:98}],21:[function(t,e,n){var a=t(18),r=t(11);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");return r(this)}}},{11:11,18:18}],22:[function(t,e,n){"use strict";var a=t(91),r=t(66).getWeak,i=t(8),o=t(52),s=t(7),p=t(40),u=t(13),c=t(42),l=t(124),d=u(5),f=u(6),h=0,m=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},v=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=v(this,t);return e?e[1]:void 0},has:function(t){return!!v(this,t)},set:function(t,e){var n=v(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=f(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,i){var u=t(function(t,a){s(t,u,e,"_i"),t._t=e,t._i=h++,t._l=void 0,void 0!=a&&p(a,n,t[i],t)});return a(u.prototype,{"delete":function(t){if(!o(t))return!1;var n=r(t);return n===!0?m(l(this,e))["delete"](t):n&&c(n,this._i)&&delete n[this._i]},has:function(t){if(!o(t))return!1;var n=r(t);return n===!0?m(l(this,e)).has(t):n&&c(n,this._i)}}),u},def:function(t,e,n){var a=r(i(e),!0);return a===!0?m(t).set(e,n):a[t._i]=n,t},ufstore:m}},{124:124,13:13,40:40,42:42,52:52,66:66,7:7,8:8,91:91}],23:[function(t,e,n){"use strict";var a=t(41),r=t(34),i=t(92),o=t(91),s=t(66),p=t(40),u=t(7),c=t(52),l=t(36),d=t(57),f=t(99),h=t(46);e.exports=function(t,e,n,m,g,v){var b=a[t],y=b,_=g?"set":"add",x=y&&y.prototype,w={},k=function(t){var e=x[t];i(x,t,"delete"==t?function(t){return v&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return v&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return v&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof y&&(v||x.forEach&&!l(function(){(new y).entries().next()}))){var S=new y,E=S[_](v?{}:-0,1)!=S,C=l(function(){S.has(1)}),P=d(function(t){new y(t)}),A=!v&&l(function(){for(var t=new y,e=5;e--;)t[_](e,e);return!t.has(-0)});P||(y=e(function(e,n){u(e,y,t);var a=h(new b,e,y);return void 0!=n&&p(n,g,a[_],a),a}),y.prototype=x,x.constructor=y),(C||A)&&(k("delete"),k("has"),g&&k("get")),(A||E)&&k(_),v&&x.clear&&delete x.clear}else y=m.getConstructor(e,t,g,_),o(y.prototype,n),s.NEED=!0;return f(y,t),w[t]=y,r(r.G+r.W+r.F*(y!=b),w),v||m.setStrong(y,t,g),y}},{34:34,36:36,40:40,41:41,46:46,52:52,57:57,66:66,7:7,91:91,92:92,99:99}],24:[function(t,e,n){var a=e.exports={version:"2.5.6"};"number"==typeof __e&&(__e=a)},{}],25:[function(t,e,n){"use strict";var a=t(72),r=t(90);e.exports=function(t,e,n){e in t?a.f(t,e,r(0,n)):t[e]=n}},{72:72,90:90}],26:[function(t,e,n){var a=t(4);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}return function(){return t.apply(e,arguments)}}},{4:4}],27:[function(t,e,n){"use strict";var a=t(36),r=Date.prototype.getTime,i=Date.prototype.toISOString,o=function(t){return t>9?t:"0"+t};e.exports=a(function(){return"0385-07-25T07:06:39.999Z"!=i.call(new Date(-5e13-1))})||!a(function(){i.call(new Date(NaN))})?function(){if(!isFinite(r.call(this)))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),n=t.getUTCMilliseconds(),a=0>e?"-":e>9999?"+":"";return a+("00000"+Math.abs(e)).slice(a?-6:-4)+"-"+o(t.getUTCMonth()+1)+"-"+o(t.getUTCDate())+"T"+o(t.getUTCHours())+":"+o(t.getUTCMinutes())+":"+o(t.getUTCSeconds())+"."+(n>99?n:"0"+o(n))+"Z"}:i},{36:36}],28:[function(t,e,n){"use strict";var a=t(8),r=t(118),i="number";e.exports=function(t){if("string"!==t&&t!==i&&"default"!==t)throw TypeError("Incorrect hint");return r(a(this),t!=i)}},{118:118,8:8}],29:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],30:[function(t,e,n){e.exports=!t(36)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{36:36}],31:[function(t,e,n){var a=t(52),r=t(41).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{41:41,52:52}],32:[function(t,e,n){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],33:[function(t,e,n){var a=t(81),r=t(78),i=t(82);e.exports=function(t){var e=a(t),n=r.f;if(n)for(var o,s=n(t),p=i.f,u=0;s.length>u;)p.call(t,o=s[u++])&&e.push(o);return e}},{78:78,81:81,82:82}],34:[function(t,e,n){var a=t(41),r=t(24),i=t(43),o=t(92),s=t(26),p="prototype",u=function(t,e,n){var c,l,d,f,h=t&u.F,m=t&u.G,g=t&u.S,v=t&u.P,b=t&u.B,y=m?a:g?a[e]||(a[e]={}):(a[e]||{})[p],_=m?r:r[e]||(r[e]={}),x=_[p]||(_[p]={});m&&(n=e);for(c in n)l=!h&&y&&void 0!==y[c],d=(l?y:n)[c],f=b&&l?s(d,a):v&&"function"==typeof d?s(Function.call,d):d,y&&o(y,c,d,t&u.U),_[c]!=d&&i(_,c,f),v&&x[c]!=d&&(x[c]=d)};a.core=r,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},{24:24,26:26,41:41,43:43,92:92}],35:[function(t,e,n){var a=t(127)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}return!0}},{127:127}],36:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],37:[function(t,e,n){"use strict";var a=t(43),r=t(92),i=t(36),o=t(29),s=t(127);e.exports=function(t,e,n){var p=s(t),u=n(o,p,""[t]),c=u[0],l=u[1];i(function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,c),a(RegExp.prototype,p,2==e?function(t,e){return l.call(t,this,e)}:function(t){return l.call(t,this)}))}},{127:127,29:29,36:36,43:43,92:92}],38:[function(t,e,n){"use strict";var a=t(8);e.exports=function(){var t=a(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{8:8}],39:[function(t,e,n){"use strict";function a(t,e,n,u,c,l,d,f){for(var h,m,g=c,v=0,b=d?s(d,f,3):!1;u>v;){if(v in n){if(h=b?b(n[v],v,e):n[v],m=!1,i(h)&&(m=h[p],m=void 0!==m?!!m:r(h)),m&&l>0)g=a(t,e,h,o(h.length),g,l-1)-1;else{if(g>=9007199254740991)throw TypeError();t[g]=h}g++}v++}return g}var r=t(50),i=t(52),o=t(116),s=t(26),p=t(127)("isConcatSpreadable");e.exports=a},{116:116,127:127,26:26,50:50,52:52}],40:[function(t,e,n){var a=t(26),r=t(54),i=t(49),o=t(8),s=t(116),p=t(128),u={},c={},n=e.exports=function(t,e,n,l,d){var f,h,m,g,v=d?function(){return t}:p(t),b=a(n,l,e?2:1),y=0;if("function"!=typeof v)throw TypeError(t+" is not iterable!");if(i(v)){for(f=s(t.length);f>y;y++)if(g=e?b(o(h=t[y])[0],h[1]):b(t[y]),g===u||g===c)return g}else for(m=v.call(t);!(h=m.next()).done;)if(g=r(m,b,h.value,e),g===u||g===c)return g};n.BREAK=u,n.RETURN=c},{116:116,128:128,26:26,49:49,54:54,8:8}],41:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],42:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],43:[function(t,e,n){var a=t(72),r=t(90);e.exports=t(30)?function(t,e,n){return a.f(t,e,r(1,n))}:function(t,e,n){return t[e]=n,t}},{30:30,72:72,90:90}],44:[function(t,e,n){var a=t(41).document;e.exports=a&&a.documentElement},{41:41}],45:[function(t,e,n){e.exports=!t(30)&&!t(36)(function(){return 7!=Object.defineProperty(t(31)("div"),"a",{get:function(){return 7}}).a})},{30:30,31:31,36:36}],46:[function(t,e,n){var a=t(52),r=t(97).set;e.exports=function(t,e,n){var i,o=e.constructor;return o!==n&&"function"==typeof o&&(i=o.prototype)!==n.prototype&&a(i)&&r&&r(t,i),t}},{52:52,97:97}],47:[function(t,e,n){e.exports=function(t,e,n){var a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],48:[function(t,e,n){var a=t(19);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{19:19}],49:[function(t,e,n){var a=t(59),r=t(127)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{127:127,59:59}],50:[function(t,e,n){var a=t(19);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{19:19}],51:[function(t,e,n){var a=t(52),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(t)===t}},{52:52}],52:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],53:[function(t,e,n){var a=t(52),r=t(19),i=t(127)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{127:127,19:19,52:52}],54:[function(t,e,n){var a=t(8);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{8:8}],55:[function(t,e,n){"use strict";var a=t(71),r=t(90),i=t(99),o={};t(43)(o,t(127)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a(o,{next:r(1,n)}),i(t,e+" Iterator")}},{127:127,43:43,71:71,90:90,99:99}],56:[function(t,e,n){"use strict";var a=t(60),r=t(34),i=t(92),o=t(43),s=t(59),p=t(55),u=t(99),c=t(79),l=t(127)("iterator"),d=!([].keys&&"next"in[].keys()),f="@@iterator",h="keys",m="values",g=function(){return this};e.exports=function(t,e,n,v,b,y,_){p(n,e,v);var x,w,k,S=function(t){if(!d&&t in A)return A[t];switch(t){case h:return function(){return new n(this,t)};case m:return function(){return new n(this,t)}}return function(){return new n(this,t)}},E=e+" Iterator",C=b==m,P=!1,A=t.prototype,O=A[l]||A[f]||b&&A[b],T=O||S(b),R=b?C?S("entries"):T:void 0,M="Array"==e?A.entries||O:O;if(M&&(k=c(M.call(new t)),k!==Object.prototype&&k.next&&(u(k,E,!0),a||"function"==typeof k[l]||o(k,l,g))),C&&O&&O.name!==m&&(P=!0,T=function(){return O.call(this)}),a&&!_||!d&&!P&&A[l]||o(A,l,T),s[e]=T,s[E]=g,b)if(x={values:C?T:S(m),keys:y?T:S(h),entries:R},_)for(w in x)w in A||i(A,w,x[w]);else r(r.P+r.F*(d||P),e,x);return x}},{127:127,34:34,43:43,55:55,59:59,60:60,79:79,92:92,99:99}],57:[function(t,e,n){var a=t(127)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=function(){return o},t(i)}catch(s){}return n}},{127:127}],58:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],59:[function(t,e,n){e.exports={}},{}],60:[function(t,e,n){e.exports=!1},{}],61:[function(t,e,n){var a=Math.expm1;e.exports=!a||a(10)>22025.465794806718||a(10)<22025.465794806718||-2e-17!=a(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}:a},{}],62:[function(t,e,n){var a=t(65),r=Math.pow,i=r(2,-52),o=r(2,-23),s=r(2,127)*(2-o),p=r(2,-126),u=function(t){return t+1/i-1/i};e.exports=Math.fround||function(t){var e,n,r=Math.abs(t),c=a(t);return p>r?c*u(r/p/o)*p*o:(e=(1+o/i)*r,n=e-(e-r),n>s||n!=n?c*(1/0):c*n)}},{65:65}],63:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],64:[function(t,e,n){e.exports=Math.scale||function(t,e,n,a,r){return 0===arguments.length||t!=t||e!=e||n!=n||a!=a||r!=r?NaN:t===1/0||t===-(1/0)?t:(t-e)*(r-a)/(n-e)+a}},{}],65:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],66:[function(t,e,n){var a=t(122)("meta"),r=t(52),i=t(42),o=t(72).f,s=0,p=Object.isExtensible||function(){return!0},u=!t(36)(function(){return p(Object.preventExtensions({}))}),c=function(t){o(t,a,{value:{i:"O"+ ++s,w:{}}})},l=function(t,e){if(!r(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,a)){if(!p(t))return"F";if(!e)return"E";c(t)}return t[a].i},d=function(t,e){if(!i(t,a)){if(!p(t))return!0;if(!e)return!1;c(t)}return t[a].w},f=function(t){return u&&h.NEED&&p(t)&&!i(t,a)&&c(t),t},h=e.exports={KEY:a,NEED:!1,fastKey:l,getWeak:d,onFreeze:f}},{122:122,36:36,42:42,52:52,72:72}],67:[function(t,e,n){var a=t(159),r=t(34),i=t(101)("metadata"),o=i.store||(i.store=new(t(265))),s=function(t,e,n){var r=o.get(t);if(!r){if(!n)return;o.set(t,r=new a)}var i=r.get(e);if(!i){if(!n)return;r.set(e,i=new a)}return i},p=function(t,e,n){var a=s(e,n,!1);return void 0===a?!1:a.has(t)},u=function(t,e,n){var a=s(e,n,!1);return void 0===a?void 0:a.get(t)},c=function(t,e,n,a){s(n,a,!0).set(t,e)},l=function(t,e){var n=s(t,e,!1),a=[];return n&&n.forEach(function(t,e){a.push(e)}),a},d=function(t){return void 0===t||"symbol"==typeof t?t:t+""},f=function(t){r(r.S,"Reflect",t)};e.exports={store:o,map:s,has:p,get:u,set:c,keys:l,key:d,exp:f}},{101:101,159:159,265:265,34:34}],68:[function(t,e,n){var a=t(41),r=t(111).set,i=a.MutationObserver||a.WebKitMutationObserver,o=a.process,s=a.Promise,p="process"==t(19)(o);e.exports=function(){var t,e,n,u=function(){var a,r;for(p&&(a=o.domain)&&a.exit();t;){r=t.fn,t=t.next;try{r()}catch(i){throw t?n():e=void 0,i}}e=void 0,a&&a.enter()};if(p)n=function(){o.nextTick(u)};else if(!i||a.navigator&&a.navigator.standalone)if(s&&s.resolve){var c=s.resolve(void 0);n=function(){c.then(u)}}else n=function(){r.call(a,u)};else{var l=!0,d=document.createTextNode("");new i(u).observe(d,{characterData:!0}),n=function(){d.data=l=!l}}return function(a){var r={fn:a,next:void 0};e&&(e.next=r),t||(t=r,n()),e=r}}},{111:111,19:19,41:41}],69:[function(t,e,n){"use strict";function a(t){var e,n;this.promise=new t(function(t,a){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=a}),this.resolve=r(e),this.reject=r(n)}var r=t(4);e.exports.f=function(t){return new a(t)}},{4:4}],70:[function(t,e,n){"use strict";var a=t(81),r=t(78),i=t(82),o=t(117),s=t(48),p=Object.assign;e.exports=!p||t(36)(function(){var t={},e={},n=Symbol(),a="abcdefghijklmnopqrst";return t[n]=7,a.split("").forEach(function(t){e[t]=t}),7!=p({},t)[n]||Object.keys(p({},e)).join("")!=a})?function(t,e){for(var n=o(t),p=arguments.length,u=1,c=r.f,l=i.f;p>u;)for(var d,f=s(arguments[u++]),h=c?a(f).concat(c(f)):a(f),m=h.length,g=0;m>g;)l.call(f,d=h[g++])&&(n[d]=f[d]);return n}:p},{117:117,36:36,48:48,78:78,81:81,82:82}],71:[function(t,e,n){var a=t(8),r=t(73),i=t(32),o=t(100)("IE_PROTO"),s=function(){},p="prototype",u=function(){var e,n=t(31)("iframe"),a=i.length,r="<",o=">";for(n.style.display="none",t(44).appendChild(n),n.src="javascript:",e=n.contentWindow.document,e.open(),e.write(r+"script"+o+"document.F=Object"+r+"/script"+o),e.close(),u=e.F;a--;)delete u[p][i[a]];return u()};e.exports=Object.create||function(t,e){var n;return null!==t?(s[p]=a(t),n=new s,s[p]=null,n[o]=t):n=u(),void 0===e?n:r(n,e)}},{100:100,31:31,32:32,44:44,73:73,8:8}],72:[function(t,e,n){var a=t(8),r=t(45),i=t(118),o=Object.defineProperty;n.f=t(30)?Object.defineProperty:function(t,e,n){if(a(t),e=i(e,!0),a(n),r)try{return o(t,e,n)}catch(s){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},{118:118,30:30,45:45,8:8}],73:[function(t,e,n){var a=t(72),r=t(8),i=t(81);e.exports=t(30)?Object.defineProperties:function(t,e){r(t);for(var n,o=i(e),s=o.length,p=0;s>p;)a.f(t,n=o[p++],e[n]);return t}},{30:30,72:72,8:8,81:81}],74:[function(t,e,n){"use strict";e.exports=t(60)||!t(36)(function(){var e=Math.random();__defineSetter__.call(null,e,function(){}),delete t(41)[e]})},{36:36,41:41,60:60}],75:[function(t,e,n){var a=t(82),r=t(90),i=t(115),o=t(118),s=t(42),p=t(45),u=Object.getOwnPropertyDescriptor;n.f=t(30)?u:function(t,e){if(t=i(t),e=o(e,!0),p)try{return u(t,e)}catch(n){}return s(t,e)?r(!a.f.call(t,e),t[e]):void 0}},{115:115,118:118,30:30,42:42,45:45,82:82,90:90}],76:[function(t,e,n){var a=t(115),r=t(77).f,i={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.f=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{115:115,77:77}],77:[function(t,e,n){var a=t(80),r=t(32).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return a(t,r)}},{32:32,80:80}],78:[function(t,e,n){n.f=Object.getOwnPropertySymbols},{}],79:[function(t,e,n){var a=t(42),r=t(117),i=t(100)("IE_PROTO"),o=Object.prototype;e.exports=Object.getPrototypeOf||function(t){return t=r(t),a(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?o:null}},{100:100,117:117,42:42}],80:[function(t,e,n){var a=t(42),r=t(115),i=t(12)(!1),o=t(100)("IE_PROTO");e.exports=function(t,e){var n,s=r(t),p=0,u=[];for(n in s)n!=o&&a(s,n)&&u.push(n);for(;e.length>p;)a(s,n=e[p++])&&(~i(u,n)||u.push(n));return u}},{100:100,115:115,12:12,42:42}],81:[function(t,e,n){var a=t(80),r=t(32);e.exports=Object.keys||function(t){return a(t,r)}},{32:32,80:80}],82:[function(t,e,n){n.f={}.propertyIsEnumerable},{}],83:[function(t,e,n){var a=t(34),r=t(24),i=t(36);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{24:24,34:34,36:36}],84:[function(t,e,n){var a=t(81),r=t(115),i=t(82).f;e.exports=function(t){return function(e){for(var n,o=r(e),s=a(o),p=s.length,u=0,c=[];p>u;)i.call(o,n=s[u++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{115:115,81:81,82:82}],85:[function(t,e,n){var a=t(77),r=t(78),i=t(8),o=t(41).Reflect;e.exports=o&&o.ownKeys||function(t){var e=a.f(i(t)),n=r.f;return n?e.concat(n(t)):e}},{41:41,77:77,78:78,8:8}],86:[function(t,e,n){var a=t(41).parseFloat,r=t(109).trim;e.exports=1/a(t(110)+"-0")!==-(1/0)?function(t){var e=r(t+"",3),n=a(e);return 0===n&&"-"==e.charAt(0)?-0:n}:a},{109:109,110:110,41:41}],87:[function(t,e,n){var a=t(41).parseInt,r=t(109).trim,i=t(110),o=/^[-+]?0[xX]/;e.exports=8!==a(i+"08")||22!==a(i+"0x16")?function(t,e){var n=r(t+"",3);return a(n,e>>>0||(o.test(n)?16:10))}:a},{109:109,110:110,41:41}],88:[function(t,e,n){e.exports=function(t){try{return{e:!1,v:t()}}catch(e){return{e:!0,v:e}}}},{}],89:[function(t,e,n){var a=t(8),r=t(52),i=t(69);e.exports=function(t,e){if(a(t),r(e)&&e.constructor===t)return e;var n=i.f(t),o=n.resolve;return o(e),n.promise}},{52:52,69:69,8:8}],90:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],91:[function(t,e,n){var a=t(92);e.exports=function(t,e,n){for(var r in e)a(t,r,e[r],n);return t}},{92:92}],92:[function(t,e,n){var a=t(41),r=t(43),i=t(42),o=t(122)("src"),s="toString",p=Function[s],u=(""+p).split(s);t(24).inspectSource=function(t){return p.call(t)},(e.exports=function(t,e,n,s){var p="function"==typeof n;p&&(i(n,"name")||r(n,"name",e)),t[e]!==n&&(p&&(i(n,o)||r(n,o,t[e]?""+t[e]:u.join(e+""))),t===a?t[e]=n:s?t[e]?t[e]=n:r(t,e,n):(delete t[e],r(t,e,n)))})(Function.prototype,s,function(){
-return"function"==typeof this&&this[o]||p.call(this)})},{122:122,24:24,41:41,42:42,43:43}],93:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],94:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],95:[function(t,e,n){"use strict";var a=t(34),r=t(4),i=t(26),o=t(40);e.exports=function(t){a(a.S,t,{from:function(t){var e,n,a,s,p=arguments[1];return r(this),e=void 0!==p,e&&r(p),void 0==t?new this:(n=[],e?(a=0,s=i(p,arguments[2],2),o(t,!1,function(t){n.push(s(t,a++))})):o(t,!1,n.push,n),new this(n))}})}},{26:26,34:34,4:4,40:40}],96:[function(t,e,n){"use strict";var a=t(34);e.exports=function(t){a(a.S,t,{of:function(){for(var t=arguments.length,e=Array(t);t--;)e[t]=arguments[t];return new this(e)}})}},{34:34}],97:[function(t,e,n){var a=t(52),r=t(8),i=function(t,e){if(r(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(26)(Function.call,t(75).f(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(r){n=!0}return function(t,e){return i(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:i}},{26:26,52:52,75:75,8:8}],98:[function(t,e,n){"use strict";var a=t(41),r=t(72),i=t(30),o=t(127)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.f(e,o,{configurable:!0,get:function(){return this}})}},{127:127,30:30,41:41,72:72}],99:[function(t,e,n){var a=t(72).f,r=t(42),i=t(127)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{127:127,42:42,72:72}],100:[function(t,e,n){var a=t(101)("keys"),r=t(122);e.exports=function(t){return a[t]||(a[t]=r(t))}},{101:101,122:122}],101:[function(t,e,n){var a=t(24),r=t(41),i="__core-js_shared__",o=r[i]||(r[i]={});(e.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:a.version,mode:t(60)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},{24:24,41:41,60:60}],102:[function(t,e,n){var a=t(8),r=t(4),i=t(127)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(n)}},{127:127,4:4,8:8}],103:[function(t,e,n){"use strict";var a=t(36);e.exports=function(t,e){return!!t&&a(function(){e?t.call(null,function(){},1):t.call(null)})}},{36:36}],104:[function(t,e,n){var a=t(114),r=t(29);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",p=a(n),u=s.length;return 0>p||p>=u?t?"":void 0:(i=s.charCodeAt(p),55296>i||i>56319||p+1===u||(o=s.charCodeAt(p+1))<56320||o>57343?t?s.charAt(p):i:t?s.slice(p,p+2):(i-55296<<10)+(o-56320)+65536)}}},{114:114,29:29}],105:[function(t,e,n){var a=t(53),r=t(29);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{29:29,53:53}],106:[function(t,e,n){var a=t(34),r=t(36),i=t(29),o=/"/g,s=function(t,e,n,a){var r=i(t)+"",s="<"+e;return""!==n&&(s+=" "+n+'="'+(a+"").replace(o,""")+'"'),s+">"+r+""+e+">"};e.exports=function(t,e){var n={};n[t]=e(s),a(a.P+a.F*r(function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}),"String",n)}},{29:29,34:34,36:36}],107:[function(t,e,n){var a=t(116),r=t(108),i=t(29);e.exports=function(t,e,n,o){var s=i(t)+"",p=s.length,u=void 0===n?" ":n+"",c=a(e);if(p>=c||""==u)return s;var l=c-p,d=r.call(u,Math.ceil(l/u.length));return d.length>l&&(d=d.slice(0,l)),o?d+s:s+d}},{108:108,116:116,29:29}],108:[function(t,e,n){"use strict";var a=t(114),r=t(29);e.exports=function(t){var e=r(this)+"",n="",i=a(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{114:114,29:29}],109:[function(t,e,n){var a=t(34),r=t(29),i=t(36),o=t(110),s="["+o+"]",p="
",u=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e,n){var r={},s=i(function(){return!!o[t]()||p[t]()!=p}),u=r[t]=s?e(d):o[t];n&&(r[n]=u),a(a.P+a.F*s,"String",r)},d=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(u,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{110:110,29:29,34:34,36:36}],110:[function(t,e,n){e.exports=" \n\x0B\f\r \u2028\u2029\ufeff"},{}],111:[function(t,e,n){var a,r,i,o=t(26),s=t(47),p=t(44),u=t(31),c=t(41),l=c.process,d=c.setImmediate,f=c.clearImmediate,h=c.MessageChannel,m=c.Dispatch,g=0,v={},b="onreadystatechange",y=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},_=function(t){y.call(t.data)};d&&f||(d=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++g]=function(){s("function"==typeof t?t:Function(t),e)},a(g),g},f=function(t){delete v[t]},"process"==t(19)(l)?a=function(t){l.nextTick(o(y,t,1))}:m&&m.now?a=function(t){m.now(o(y,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=_,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",_,!1)):a=b in u("script")?function(t){p.appendChild(u("script"))[b]=function(){p.removeChild(this),y.call(t)}}:function(t){setTimeout(o(y,t,1),0)}),e.exports={set:d,clear:f}},{19:19,26:26,31:31,41:41,44:44,47:47}],112:[function(t,e,n){var a=t(114),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{114:114}],113:[function(t,e,n){var a=t(114),r=t(116);e.exports=function(t){if(void 0===t)return 0;var e=a(t),n=r(e);if(e!==n)throw RangeError("Wrong length!");return n}},{114:114,116:116}],114:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],115:[function(t,e,n){var a=t(48),r=t(29);e.exports=function(t){return a(r(t))}},{29:29,48:48}],116:[function(t,e,n){var a=t(114),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{114:114}],117:[function(t,e,n){var a=t(29);e.exports=function(t){return Object(a(t))}},{29:29}],118:[function(t,e,n){var a=t(52);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{52:52}],119:[function(t,e,n){"use strict";if(t(30)){var a=t(60),r=t(41),i=t(36),o=t(34),s=t(121),p=t(120),u=t(26),c=t(7),l=t(90),d=t(43),f=t(91),h=t(114),m=t(116),g=t(113),v=t(112),b=t(118),y=t(42),_=t(18),x=t(52),w=t(117),k=t(49),S=t(71),E=t(79),C=t(77).f,P=t(128),A=t(122),O=t(127),T=t(13),R=t(12),M=t(102),L=t(140),j=t(59),D=t(57),N=t(98),F=t(10),I=t(9),B=t(72),q=t(75),U=B.f,V=q.f,G=r.RangeError,z=r.TypeError,W=r.Uint8Array,H="ArrayBuffer",K="Shared"+H,Q="BYTES_PER_ELEMENT",Y="prototype",$=Array[Y],J=p.ArrayBuffer,X=p.DataView,Z=T(0),tt=T(2),et=T(3),nt=T(4),at=T(5),rt=T(6),it=R(!0),ot=R(!1),st=L.values,pt=L.keys,ut=L.entries,ct=$.lastIndexOf,lt=$.reduce,dt=$.reduceRight,ft=$.join,ht=$.sort,mt=$.slice,gt=$.toString,vt=$.toLocaleString,bt=O("iterator"),yt=O("toStringTag"),_t=A("typed_constructor"),xt=A("def_constructor"),wt=s.CONSTR,kt=s.TYPED,St=s.VIEW,Et="Wrong length!",Ct=T(1,function(t,e){return Rt(M(t,t[xt]),e)}),Pt=i(function(){return 1===new W(new Uint16Array([1]).buffer)[0]}),At=!!W&&!!W[Y].set&&i(function(){new W(1).set({})}),Ot=function(t,e){var n=h(t);if(0>n||n%e)throw G("Wrong offset!");return n},Tt=function(t){if(x(t)&&kt in t)return t;throw z(t+" is not a typed array!")},Rt=function(t,e){if(!(x(t)&&_t in t))throw z("It is not a typed array constructor!");return new t(e)},Mt=function(t,e){return Lt(M(t,t[xt]),e)},Lt=function(t,e){for(var n=0,a=e.length,r=Rt(t,a);a>n;)r[n]=e[n++];return r},jt=function(t,e,n){U(t,e,{get:function(){return this._d[n]}})},Dt=function(t){var e,n,a,r,i,o,s=w(t),p=arguments.length,c=p>1?arguments[1]:void 0,l=void 0!==c,d=P(s);if(void 0!=d&&!k(d)){for(o=d.call(s),a=[],e=0;!(i=o.next()).done;e++)a.push(i.value);s=a}for(l&&p>2&&(c=u(c,arguments[2],2)),e=0,n=m(s.length),r=Rt(this,n);n>e;e++)r[e]=l?c(s[e],e):s[e];return r},Nt=function(){for(var t=0,e=arguments.length,n=Rt(this,e);e>t;)n[t]=arguments[t++];return n},Ft=!!W&&i(function(){vt.call(new W(1))}),It=function(){return vt.apply(Ft?mt.call(Tt(this)):Tt(this),arguments)},Bt={copyWithin:function(t,e){return I.call(Tt(this),t,e,arguments.length>2?arguments[2]:void 0)},every:function(t){return nt(Tt(this),t,arguments.length>1?arguments[1]:void 0)},fill:function(t){return F.apply(Tt(this),arguments)},filter:function(t){return Mt(this,tt(Tt(this),t,arguments.length>1?arguments[1]:void 0))},find:function(t){return at(Tt(this),t,arguments.length>1?arguments[1]:void 0)},findIndex:function(t){return rt(Tt(this),t,arguments.length>1?arguments[1]:void 0)},forEach:function(t){Z(Tt(this),t,arguments.length>1?arguments[1]:void 0)},indexOf:function(t){return ot(Tt(this),t,arguments.length>1?arguments[1]:void 0)},includes:function(t){return it(Tt(this),t,arguments.length>1?arguments[1]:void 0)},join:function(t){return ft.apply(Tt(this),arguments)},lastIndexOf:function(t){return ct.apply(Tt(this),arguments)},map:function(t){return Ct(Tt(this),t,arguments.length>1?arguments[1]:void 0)},reduce:function(t){return lt.apply(Tt(this),arguments)},reduceRight:function(t){return dt.apply(Tt(this),arguments)},reverse:function(){for(var t,e=this,n=Tt(e).length,a=Math.floor(n/2),r=0;a>r;)t=e[r],e[r++]=e[--n],e[n]=t;return e},some:function(t){return et(Tt(this),t,arguments.length>1?arguments[1]:void 0)},sort:function(t){return ht.call(Tt(this),t)},subarray:function(t,e){var n=Tt(this),a=n.length,r=v(t,a);return new(M(n,n[xt]))(n.buffer,n.byteOffset+r*n.BYTES_PER_ELEMENT,m((void 0===e?a:v(e,a))-r))}},qt=function(t,e){return Mt(this,mt.call(Tt(this),t,e))},Ut=function(t){Tt(this);var e=Ot(arguments[1],1),n=this.length,a=w(t),r=m(a.length),i=0;if(r+e>n)throw G(Et);for(;r>i;)this[e+i]=a[i++]},Vt={entries:function(){return ut.call(Tt(this))},keys:function(){return pt.call(Tt(this))},values:function(){return st.call(Tt(this))}},Gt=function(t,e){return x(t)&&t[kt]&&"symbol"!=typeof e&&e in t&&+e+""==e+""},zt=function(t,e){return Gt(t,e=b(e,!0))?l(2,t[e]):V(t,e)},Wt=function(t,e,n){return!(Gt(t,e=b(e,!0))&&x(n)&&y(n,"value"))||y(n,"get")||y(n,"set")||n.configurable||y(n,"writable")&&!n.writable||y(n,"enumerable")&&!n.enumerable?U(t,e,n):(t[e]=n.value,t)};wt||(q.f=zt,B.f=Wt),o(o.S+o.F*!wt,"Object",{getOwnPropertyDescriptor:zt,defineProperty:Wt}),i(function(){gt.call({})})&&(gt=vt=function(){return ft.call(this)});var Ht=f({},Bt);f(Ht,Vt),d(Ht,bt,Vt.values),f(Ht,{slice:qt,set:Ut,constructor:function(){},toString:gt,toLocaleString:It}),jt(Ht,"buffer","b"),jt(Ht,"byteOffset","o"),jt(Ht,"byteLength","l"),jt(Ht,"length","e"),U(Ht,yt,{get:function(){return this[kt]}}),e.exports=function(t,e,n,p){p=!!p;var u=t+(p?"Clamped":"")+"Array",l="get"+t,f="set"+t,h=r[u],v=h||{},b=h&&E(h),y=!h||!s.ABV,w={},k=h&&h[Y],P=function(t,n){var a=t._d;return a.v[l](n*e+a.o,Pt)},A=function(t,n,a){var r=t._d;p&&(a=(a=Math.round(a))<0?0:a>255?255:255&a),r.v[f](n*e+r.o,a,Pt)},O=function(t,e){U(t,e,{get:function(){return P(this,e)},set:function(t){return A(this,e,t)},enumerable:!0})};y?(h=n(function(t,n,a,r){c(t,h,u,"_d");var i,o,s,p,l=0,f=0;if(x(n)){if(!(n instanceof J||(p=_(n))==H||p==K))return kt in n?Lt(h,n):Dt.call(h,n);i=n,f=Ot(a,e);var v=n.byteLength;if(void 0===r){if(v%e)throw G(Et);if(o=v-f,0>o)throw G(Et)}else if(o=m(r)*e,o+f>v)throw G(Et);s=o/e}else s=g(n),o=s*e,i=new J(o);for(d(t,"_d",{b:i,o:f,l:o,e:s,v:new X(i)});s>l;)O(t,l++)}),k=h[Y]=S(Ht),d(k,"constructor",h)):i(function(){h(1)})&&i(function(){new h(-1)})&&D(function(t){new h,new h(null),new h(1.5),new h(t)},!0)||(h=n(function(t,n,a,r){c(t,h,u);var i;return x(n)?n instanceof J||(i=_(n))==H||i==K?void 0!==r?new v(n,Ot(a,e),r):void 0!==a?new v(n,Ot(a,e)):new v(n):kt in n?Lt(h,n):Dt.call(h,n):new v(g(n))}),Z(b!==Function.prototype?C(v).concat(C(b)):C(v),function(t){t in h||d(h,t,v[t])}),h[Y]=k,a||(k.constructor=h));var T=k[bt],R=!!T&&("values"==T.name||void 0==T.name),M=Vt.values;d(h,_t,!0),d(k,kt,u),d(k,St,!0),d(k,xt,h),(p?new h(1)[yt]==u:yt in k)||U(k,yt,{get:function(){return u}}),w[u]=h,o(o.G+o.W+o.F*(h!=v),w),o(o.S,u,{BYTES_PER_ELEMENT:e}),o(o.S+o.F*i(function(){v.of.call(h,1)}),u,{from:Dt,of:Nt}),Q in k||d(k,Q,e),o(o.P,u,Bt),N(u),o(o.P+o.F*At,u,{set:Ut}),o(o.P+o.F*!R,u,Vt),a||k.toString==gt||(k.toString=gt),o(o.P+o.F*i(function(){new h(1).slice()}),u,{slice:qt}),o(o.P+o.F*(i(function(){return[1,2].toLocaleString()!=new h([1,2]).toLocaleString()})||!i(function(){k.toLocaleString.call([1,2])})),u,{toLocaleString:It}),j[u]=R?T:M,a||R||d(k,bt,M)}}else e.exports=function(){}},{10:10,102:102,112:112,113:113,114:114,116:116,117:117,118:118,12:12,120:120,121:121,122:122,127:127,128:128,13:13,140:140,18:18,26:26,30:30,34:34,36:36,41:41,42:42,43:43,49:49,52:52,57:57,59:59,60:60,7:7,71:71,72:72,75:75,77:77,79:79,9:9,90:90,91:91,98:98}],120:[function(t,e,n){"use strict";function a(t,e,n){var a,r,i,o=Array(n),s=8*n-e-1,p=(1<>1,c=23===e?U(2,-24)-U(2,-77):0,l=0,d=0>t||0===t&&0>1/t?1:0;for(t=q(t),t!=t||t===I?(r=t!=t?1:0,a=p):(a=V(G(t)/z),t*(i=U(2,-a))<1&&(a--,i*=2),t+=a+u>=1?c/i:c*U(2,1-u),t*i>=2&&(a++,i/=2),a+u>=p?(r=0,a=p):a+u>=1?(r=(t*i-1)*U(2,e),a+=u):(r=t*U(2,u-1)*U(2,e),a=0));e>=8;o[l++]=255&r,r/=256,e-=8);for(a=a<0;o[l++]=255&a,a/=256,s-=8);return o[--l]|=128*d,o}function r(t,e,n){var a,r=8*n-e-1,i=(1<>1,s=r-7,p=n-1,u=t[p--],c=127&u;for(u>>=7;s>0;c=256*c+t[p],p--,s-=8);for(a=c&(1<<-s)-1,c>>=-s,s+=e;s>0;a=256*a+t[p],p--,s-=8);if(0===c)c=1-o;else{if(c===i)return a?NaN:u?-I:I;a+=U(2,e),c-=o}return(u?-1:1)*a*U(2,c-e)}function i(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function o(t){return[255&t]}function s(t){return[255&t,t>>8&255]}function p(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function u(t){return a(t,52,8)}function c(t){return a(t,23,4)}function l(t,e,n){C(t[R],e,{get:function(){return this[n]}})}function d(t,e,n,a){var r=+n,i=S(r);if(i+e>t[Y])throw F(L);var o=t[Q]._b,s=i+t[$],p=o.slice(s,s+e);return a?p:p.reverse()}function f(t,e,n,a,r,i){var o=+n,s=S(o);if(s+e>t[Y])throw F(L);for(var p=t[Q]._b,u=s+t[$],c=a(+r),l=0;e>l;l++)p[u+l]=c[i?l:e-l-1]}var h=t(41),m=t(30),g=t(60),v=t(121),b=t(43),y=t(91),_=t(36),x=t(7),w=t(114),k=t(116),S=t(113),E=t(77).f,C=t(72).f,P=t(10),A=t(99),O="ArrayBuffer",T="DataView",R="prototype",M="Wrong length!",L="Wrong index!",j=h[O],D=h[T],N=h.Math,F=h.RangeError,I=h.Infinity,B=j,q=N.abs,U=N.pow,V=N.floor,G=N.log,z=N.LN2,W="buffer",H="byteLength",K="byteOffset",Q=m?"_b":W,Y=m?"_l":H,$=m?"_o":K;if(v.ABV){if(!_(function(){j(1)})||!_(function(){new j(-1)})||_(function(){return new j,new j(1.5),new j(NaN),j.name!=O})){j=function(t){return x(this,j),new B(S(t))};for(var J,X=j[R]=B[R],Z=E(B),tt=0;Z.length>tt;)(J=Z[tt++])in j||b(j,J,B[J]);g||(X.constructor=j)}var et=new D(new j(2)),nt=D[R].setInt8;et.setInt8(0,2147483648),et.setInt8(1,2147483649),(et.getInt8(0)||!et.getInt8(1))&&y(D[R],{setInt8:function(t,e){nt.call(this,t,e<<24>>24)},setUint8:function(t,e){nt.call(this,t,e<<24>>24)}},!0)}else j=function(t){x(this,j,O);var e=S(t);this._b=P.call(Array(e),0),this[Y]=e},D=function(t,e,n){x(this,D,T),x(t,j,T);var a=t[Y],r=w(e);if(0>r||r>a)throw F("Wrong offset!");if(n=void 0===n?a-r:k(n),r+n>a)throw F(M);this[Q]=t,this[$]=r,this[Y]=n},m&&(l(j,H,"_l"),l(D,W,"_b"),l(D,H,"_l"),l(D,K,"_o")),y(D[R],{getInt8:function(t){return d(this,1,t)[0]<<24>>24},getUint8:function(t){return d(this,1,t)[0]},getInt16:function(t){var e=d(this,2,t,arguments[1]);return(e[1]<<8|e[0])<<16>>16},getUint16:function(t){var e=d(this,2,t,arguments[1]);return e[1]<<8|e[0]},getInt32:function(t){return i(d(this,4,t,arguments[1]))},getUint32:function(t){return i(d(this,4,t,arguments[1]))>>>0},getFloat32:function(t){return r(d(this,4,t,arguments[1]),23,4)},getFloat64:function(t){return r(d(this,8,t,arguments[1]),52,8)},setInt8:function(t,e){f(this,1,t,o,e)},setUint8:function(t,e){f(this,1,t,o,e)},setInt16:function(t,e){f(this,2,t,s,e,arguments[2])},setUint16:function(t,e){f(this,2,t,s,e,arguments[2])},setInt32:function(t,e){f(this,4,t,p,e,arguments[2])},setUint32:function(t,e){f(this,4,t,p,e,arguments[2])},setFloat32:function(t,e){f(this,4,t,c,e,arguments[2])},setFloat64:function(t,e){f(this,8,t,u,e,arguments[2])}});A(j,O),A(D,T),b(D[R],v.VIEW,!0),n[O]=j,n[T]=D},{10:10,113:113,114:114,116:116,121:121,30:30,36:36,41:41,43:43,60:60,7:7,72:72,77:77,91:91,99:99}],121:[function(t,e,n){for(var a,r=t(41),i=t(43),o=t(122),s=o("typed_array"),p=o("view"),u=!(!r.ArrayBuffer||!r.DataView),c=u,l=0,d=9,f="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");d>l;)(a=r[f[l++]])?(i(a.prototype,s,!0),i(a.prototype,p,!0)):c=!1;e.exports={ABV:u,CONSTR:c,TYPED:s,VIEW:p}},{122:122,41:41,43:43}],122:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],123:[function(t,e,n){var a=t(41),r=a.navigator;e.exports=r&&r.userAgent||""},{41:41}],124:[function(t,e,n){var a=t(52);e.exports=function(t,e){if(!a(t)||t._t!==e)throw TypeError("Incompatible receiver, "+e+" required!");return t}},{52:52}],125:[function(t,e,n){var a=t(41),r=t(24),i=t(60),o=t(126),s=t(72).f;e.exports=function(t){var e=r.Symbol||(r.Symbol=i?{}:a.Symbol||{});"_"==t.charAt(0)||t in e||s(e,t,{value:o.f(t)})}},{126:126,24:24,41:41,60:60,72:72}],126:[function(t,e,n){n.f=t(127)},{127:127}],127:[function(t,e,n){var a=t(101)("wks"),r=t(122),i=t(41).Symbol,o="function"==typeof i,s=e.exports=function(t){return a[t]||(a[t]=o&&i[t]||(o?i:r)("Symbol."+t))};s.store=a},{101:101,122:122,41:41}],128:[function(t,e,n){var a=t(18),r=t(127)("iterator"),i=t(59);e.exports=t(24).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{127:127,18:18,24:24,59:59}],129:[function(t,e,n){var a=t(34),r=t(93)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(t){return r(t)}})},{34:34,93:93}],130:[function(t,e,n){var a=t(34);a(a.P,"Array",{copyWithin:t(9)}),t(6)("copyWithin")},{34:34,6:6,9:9}],131:[function(t,e,n){"use strict";var a=t(34),r=t(13)(4);a(a.P+a.F*!t(103)([].every,!0),"Array",{every:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],132:[function(t,e,n){var a=t(34);a(a.P,"Array",{fill:t(10)}),t(6)("fill")},{10:10,34:34,6:6}],133:[function(t,e,n){"use strict";var a=t(34),r=t(13)(2);a(a.P+a.F*!t(103)([].filter,!0),"Array",{filter:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],134:[function(t,e,n){"use strict";var a=t(34),r=t(13)(6),i="findIndex",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)(i)},{13:13,34:34,6:6}],135:[function(t,e,n){"use strict";var a=t(34),r=t(13)(5),i="find",o=!0;i in[]&&Array(1)[i](function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)(i)},{13:13,34:34,6:6}],136:[function(t,e,n){"use strict";var a=t(34),r=t(13)(0),i=t(103)([].forEach,!0);a(a.P+a.F*!i,"Array",{forEach:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],137:[function(t,e,n){"use strict";var a=t(26),r=t(34),i=t(117),o=t(54),s=t(49),p=t(116),u=t(25),c=t(128);r(r.S+r.F*!t(57)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,r,l,d=i(t),f="function"==typeof this?this:Array,h=arguments.length,m=h>1?arguments[1]:void 0,g=void 0!==m,v=0,b=c(d);if(g&&(m=a(m,h>2?arguments[2]:void 0,2)),void 0==b||f==Array&&s(b))for(e=p(d.length),n=new f(e);e>v;v++)u(n,v,g?m(d[v],v):d[v]);else for(l=b.call(d),n=new f;!(r=l.next()).done;v++)u(n,v,g?o(l,m,[r.value,v],!0):r.value);return n.length=v,n}})},{116:116,117:117,128:128,25:25,26:26,34:34,49:49,54:54,57:57}],138:[function(t,e,n){"use strict";var a=t(34),r=t(12)(!1),i=[].indexOf,o=!!i&&1/[1].indexOf(1,-0)<0;a(a.P+a.F*(o||!t(103)(i)),"Array",{indexOf:function(t){return o?i.apply(this,arguments)||0:r(this,t,arguments[1])}})},{103:103,12:12,34:34}],139:[function(t,e,n){var a=t(34);a(a.S,"Array",{isArray:t(50)})},{34:34,50:50}],140:[function(t,e,n){"use strict";var a=t(6),r=t(58),i=t(59),o=t(115);e.exports=t(56)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,r(1)):"keys"==e?r(0,n):"values"==e?r(0,t[n]):r(0,[n,t[n]])},"values"),i.Arguments=i.Array,a("keys"),a("values"),a("entries")},{115:115,56:56,58:58,59:59,6:6}],141:[function(t,e,n){"use strict";var a=t(34),r=t(115),i=[].join;a(a.P+a.F*(t(48)!=Object||!t(103)(i)),"Array",{join:function(t){return i.call(r(this),void 0===t?",":t)}})},{103:103,115:115,34:34,48:48}],142:[function(t,e,n){"use strict";var a=t(34),r=t(115),i=t(114),o=t(116),s=[].lastIndexOf,p=!!s&&1/[1].lastIndexOf(1,-0)<0;a(a.P+a.F*(p||!t(103)(s)),"Array",{lastIndexOf:function(t){if(p)return s.apply(this,arguments)||0;var e=r(this),n=o(e.length),a=n-1;for(arguments.length>1&&(a=Math.min(a,i(arguments[1]))),0>a&&(a=n+a);a>=0;a--)if(a in e&&e[a]===t)return a||0;return-1}})},{103:103,114:114,115:115,116:116,34:34}],143:[function(t,e,n){"use strict";var a=t(34),r=t(13)(1);a(a.P+a.F*!t(103)([].map,!0),"Array",{map:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],144:[function(t,e,n){"use strict";var a=t(34),r=t(25);a(a.S+a.F*t(36)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,e=arguments.length,n=new("function"==typeof this?this:Array)(e);e>t;)r(n,t,arguments[t++]);return n.length=e,n}})},{25:25,34:34,36:36}],145:[function(t,e,n){"use strict";var a=t(34),r=t(14);a(a.P+a.F*!t(103)([].reduceRight,!0),"Array",{reduceRight:function(t){return r(this,t,arguments.length,arguments[1],!0)}})},{103:103,14:14,34:34}],146:[function(t,e,n){"use strict";var a=t(34),r=t(14);a(a.P+a.F*!t(103)([].reduce,!0),"Array",{reduce:function(t){return r(this,t,arguments.length,arguments[1],!1)}})},{103:103,14:14,34:34}],147:[function(t,e,n){"use strict";var a=t(34),r=t(44),i=t(19),o=t(112),s=t(116),p=[].slice;a(a.P+a.F*t(36)(function(){r&&p.call(r)}),"Array",{slice:function(t,e){var n=s(this.length),a=i(this);if(e=void 0===e?n:e,"Array"==a)return p.call(this,t,e);for(var r=o(t,n),u=o(e,n),c=s(u-r),l=Array(c),d=0;c>d;d++)l[d]="String"==a?this.charAt(r+d):this[r+d];return l}})},{112:112,116:116,19:19,34:34,36:36,44:44}],148:[function(t,e,n){"use strict";var a=t(34),r=t(13)(3);a(a.P+a.F*!t(103)([].some,!0),"Array",{some:function(t){return r(this,t,arguments[1])}})},{103:103,13:13,34:34}],149:[function(t,e,n){"use strict";var a=t(34),r=t(4),i=t(117),o=t(36),s=[].sort,p=[1,2,3];a(a.P+a.F*(o(function(){p.sort(void 0)})||!o(function(){p.sort(null)})||!t(103)(s)),"Array",{sort:function(t){return void 0===t?s.call(i(this)):s.call(i(this),r(t))}})},{103:103,117:117,34:34,36:36,4:4}],150:[function(t,e,n){t(98)("Array")},{98:98}],151:[function(t,e,n){var a=t(34);a(a.S,"Date",{now:function(){return(new Date).getTime()}})},{34:34}],152:[function(t,e,n){var a=t(34),r=t(27);a(a.P+a.F*(Date.prototype.toISOString!==r),"Date",{toISOString:r})},{27:27,34:34}],153:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118);a(a.P+a.F*t(36)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(t){var e=r(this),n=i(e);return"number"!=typeof n||isFinite(n)?e.toISOString():null}})},{117:117,118:118,34:34,36:36}],154:[function(t,e,n){var a=t(127)("toPrimitive"),r=Date.prototype;a in r||t(43)(r,a,t(28))},{127:127,28:28,43:43}],155:[function(t,e,n){var a=Date.prototype,r="Invalid Date",i="toString",o=a[i],s=a.getTime;new Date(NaN)+""!=r&&t(92)(a,i,function(){var t=s.call(this);return t===t?o.call(this):r})},{92:92}],156:[function(t,e,n){var a=t(34);a(a.P,"Function",{bind:t(17)})},{17:17,34:34}],157:[function(t,e,n){"use strict";var a=t(52),r=t(79),i=t(127)("hasInstance"),o=Function.prototype;i in o||t(72).f(o,i,{value:function(t){if("function"!=typeof this||!a(t))return!1;if(!a(this.prototype))return t instanceof this;for(;t=r(t);)if(this.prototype===t)return!0;return!1}})},{127:127,52:52,72:72,79:79}],158:[function(t,e,n){var a=t(72).f,r=Function.prototype,i=/^\s*function ([^ (]*)/,o="name";o in r||t(30)&&a(r,o,{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(t){return""}}})},{30:30,72:72}],159:[function(t,e,n){"use strict";var a=t(20),r=t(124),i="Map";e.exports=t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var e=a.getEntry(r(this,i),t);return e&&e.v},set:function(t,e){return a.def(r(this,i),0===t?0:t,e)}},a,!0)},{124:124,20:20,23:23}],160:[function(t,e,n){var a=t(34),r=t(63),i=Math.sqrt,o=Math.acosh;a(a.S+a.F*!(o&&710==Math.floor(o(Number.MAX_VALUE))&&o(1/0)==1/0),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:r(t-1+i(t-1)*i(t+1))}})},{34:34,63:63}],161:[function(t,e,n){function a(t){return isFinite(t=+t)&&0!=t?0>t?-a(-t):Math.log(t+Math.sqrt(t*t+1)):t}var r=t(34),i=Math.asinh;r(r.S+r.F*!(i&&1/i(0)>0),"Math",{asinh:a})},{34:34}],162:[function(t,e,n){var a=t(34),r=Math.atanh;a(a.S+a.F*!(r&&1/r(-0)<0),"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{34:34}],163:[function(t,e,n){var a=t(34),r=t(65);a(a.S,"Math",{cbrt:function(t){return r(t=+t)*Math.pow(Math.abs(t),1/3)}})},{34:34,65:65}],164:[function(t,e,n){var a=t(34);a(a.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{34:34}],165:[function(t,e,n){var a=t(34),r=Math.exp;a(a.S,"Math",{cosh:function(t){return(r(t=+t)+r(-t))/2}})},{34:34}],166:[function(t,e,n){var a=t(34),r=t(61);a(a.S+a.F*(r!=Math.expm1),"Math",{expm1:r})},{34:34,61:61}],167:[function(t,e,n){var a=t(34);a(a.S,"Math",{fround:t(62)})},{34:34,62:62}],168:[function(t,e,n){var a=t(34),r=Math.abs;a(a.S,"Math",{hypot:function(t,e){for(var n,a,i=0,o=0,s=arguments.length,p=0;s>o;)n=r(arguments[o++]),n>p?(a=p/n,i=i*a*a+1,p=n):n>0?(a=n/p,i+=a*a):i+=n;return p===1/0?1/0:p*Math.sqrt(i)}})},{34:34}],169:[function(t,e,n){var a=t(34),r=Math.imul;a(a.S+a.F*t(36)(function(){return-5!=r(4294967295,5)||2!=r.length}),"Math",{imul:function(t,e){var n=65535,a=+t,r=+e,i=n&a,o=n&r;return 0|i*o+((n&a>>>16)*o+i*(n&r>>>16)<<16>>>0)}})},{34:34,36:36}],170:[function(t,e,n){var a=t(34);a(a.S,"Math",{log10:function(t){return Math.log(t)*Math.LOG10E}})},{34:34}],171:[function(t,e,n){var a=t(34);a(a.S,"Math",{log1p:t(63)})},{34:34,63:63}],172:[function(t,e,n){var a=t(34);a(a.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{34:34}],173:[function(t,e,n){var a=t(34);a(a.S,"Math",{sign:t(65)})},{34:34,65:65}],174:[function(t,e,n){var a=t(34),r=t(61),i=Math.exp;a(a.S+a.F*t(36)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(r(t)-r(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{34:34,36:36,61:61}],175:[function(t,e,n){var a=t(34),r=t(61),i=Math.exp;a(a.S,"Math",{tanh:function(t){var e=r(t=+t),n=r(-t);return e==1/0?1:n==1/0?-1:(e-n)/(i(t)+i(-t))}})},{34:34,61:61}],176:[function(t,e,n){var a=t(34);a(a.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{34:34}],177:[function(t,e,n){"use strict";var a=t(41),r=t(42),i=t(19),o=t(46),s=t(118),p=t(36),u=t(77).f,c=t(75).f,l=t(72).f,d=t(109).trim,f="Number",h=a[f],m=h,g=h.prototype,v=i(t(71)(g))==f,b="trim"in String.prototype,y=function(t){var e=s(t,!1);if("string"==typeof e&&e.length>2){e=b?e.trim():d(e,3);var n,a,r,i=e.charCodeAt(0);if(43===i||45===i){if(n=e.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:a=2,r=49;break;case 79:case 111:a=8,r=55;break;default:return+e}for(var o,p=e.slice(2),u=0,c=p.length;c>u;u++)if(o=p.charCodeAt(u),48>o||o>r)return NaN;return parseInt(p,a)}}return+e};if(!h(" 0o1")||!h("0b1")||h("+0x1")){h=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof h&&(v?p(function(){g.valueOf.call(n)}):i(n)!=f)?o(new m(y(e)),n,h):y(e)};for(var _,x=t(30)?u(m):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;x.length>w;w++)r(m,_=x[w])&&!r(h,_)&&l(h,_,c(m,_));h.prototype=g,g.constructor=h,t(92)(a,f,h)}},{109:109,118:118,19:19,30:30,36:36,41:41,42:42,46:46,71:71,72:72,75:75,77:77,92:92}],178:[function(t,e,n){var a=t(34);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},{34:34}],179:[function(t,e,n){var a=t(34),r=t(41).isFinite;a(a.S,"Number",{isFinite:function(t){return"number"==typeof t&&r(t)}})},{34:34,41:41}],180:[function(t,e,n){var a=t(34);a(a.S,"Number",{isInteger:t(51)})},{34:34,51:51}],181:[function(t,e,n){var a=t(34);a(a.S,"Number",{isNaN:function(t){return t!=t}})},{34:34}],182:[function(t,e,n){var a=t(34),r=t(51),i=Math.abs;a(a.S,"Number",{isSafeInteger:function(t){return r(t)&&i(t)<=9007199254740991}})},{34:34,51:51}],183:[function(t,e,n){var a=t(34);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{34:34}],184:[function(t,e,n){var a=t(34);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{34:34}],185:[function(t,e,n){var a=t(34),r=t(86);a(a.S+a.F*(Number.parseFloat!=r),"Number",{parseFloat:r})},{34:34,86:86}],186:[function(t,e,n){var a=t(34),r=t(87);a(a.S+a.F*(Number.parseInt!=r),"Number",{parseInt:r})},{34:34,87:87}],187:[function(t,e,n){"use strict";var a=t(34),r=t(114),i=t(5),o=t(108),s=1..toFixed,p=Math.floor,u=[0,0,0,0,0,0],c="Number.toFixed: incorrect invocation!",l="0",d=function(t,e){for(var n=-1,a=e;++n<6;)a+=t*u[n],u[n]=a%1e7,a=p(a/1e7)},f=function(t){for(var e=6,n=0;--e>=0;)n+=u[e],u[e]=p(n/t),n=n%t*1e7},h=function(){for(var t=6,e="";--t>=0;)if(""!==e||0===t||0!==u[t]){var n=u[t]+"";e=""===e?n:e+o.call(l,7-n.length)+n}return e},m=function(t,e,n){return 0===e?n:e%2===1?m(t,e-1,n*t):m(t*t,e/2,n)},g=function(t){for(var e=0,n=t;n>=4096;)e+=12,n/=4096;for(;n>=2;)e+=1,n/=2;return e};a(a.P+a.F*(!!s&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==0xde0b6b3a7640080.toFixed(0))||!t(36)(function(){s.call({})})),"Number",{toFixed:function(t){var e,n,a,s,p=i(this,c),u=r(t),v="",b=l;if(0>u||u>20)throw RangeError(c);if(p!=p)return"NaN";if(-1e21>=p||p>=1e21)return p+"";if(0>p&&(v="-",p=-p),p>1e-21)if(e=g(p*m(2,69,1))-69,n=0>e?p*m(2,-e,1):p/m(2,e,1),n*=4503599627370496,e=52-e,e>0){for(d(0,n),a=u;a>=7;)d(1e7,0),a-=7;for(d(m(10,a,1),0),a=e-1;a>=23;)f(1<<23),a-=23;f(1<0?(s=b.length,b=v+(u>=s?"0."+o.call(l,u-s)+b:b.slice(0,s-u)+"."+b.slice(s-u))):b=v+b,b}})},{108:108,114:114,34:34,36:36,5:5}],188:[function(t,e,n){"use strict";var a=t(34),r=t(36),i=t(5),o=1..toPrecision;a(a.P+a.F*(r(function(){return"1"!==o.call(1,void 0)})||!r(function(){o.call({})})),"Number",{toPrecision:function(t){var e=i(this,"Number#toPrecision: incorrect invocation!");return void 0===t?o.call(e):o.call(e,t)}})},{34:34,36:36,5:5}],189:[function(t,e,n){var a=t(34);a(a.S+a.F,"Object",{assign:t(70)})},{34:34,70:70}],190:[function(t,e,n){var a=t(34);a(a.S,"Object",{create:t(71)})},{34:34,71:71}],191:[function(t,e,n){var a=t(34);a(a.S+a.F*!t(30),"Object",{defineProperties:t(73)})},{30:30,34:34,73:73}],192:[function(t,e,n){var a=t(34);a(a.S+a.F*!t(30),"Object",{defineProperty:t(72).f})},{30:30,34:34,72:72}],193:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("freeze",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],194:[function(t,e,n){var a=t(115),r=t(75).f;t(83)("getOwnPropertyDescriptor",function(){return function(t,e){return r(a(t),e)}})},{115:115,75:75,83:83}],195:[function(t,e,n){t(83)("getOwnPropertyNames",function(){return t(76).f})},{76:76,83:83}],196:[function(t,e,n){var a=t(117),r=t(79);t(83)("getPrototypeOf",function(){return function(t){return r(a(t))}})},{117:117,79:79,83:83}],197:[function(t,e,n){var a=t(52);t(83)("isExtensible",function(t){return function(e){return a(e)?t?t(e):!0:!1}});
-},{52:52,83:83}],198:[function(t,e,n){var a=t(52);t(83)("isFrozen",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{52:52,83:83}],199:[function(t,e,n){var a=t(52);t(83)("isSealed",function(t){return function(e){return a(e)?t?t(e):!1:!0}})},{52:52,83:83}],200:[function(t,e,n){var a=t(34);a(a.S,"Object",{is:t(94)})},{34:34,94:94}],201:[function(t,e,n){var a=t(117),r=t(81);t(83)("keys",function(){return function(t){return r(a(t))}})},{117:117,81:81,83:83}],202:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("preventExtensions",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],203:[function(t,e,n){var a=t(52),r=t(66).onFreeze;t(83)("seal",function(t){return function(e){return t&&a(e)?t(r(e)):e}})},{52:52,66:66,83:83}],204:[function(t,e,n){var a=t(34);a(a.S,"Object",{setPrototypeOf:t(97).set})},{34:34,97:97}],205:[function(t,e,n){"use strict";var a=t(18),r={};r[t(127)("toStringTag")]="z",r+""!="[object z]"&&t(92)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},{127:127,18:18,92:92}],206:[function(t,e,n){var a=t(34),r=t(86);a(a.G+a.F*(parseFloat!=r),{parseFloat:r})},{34:34,86:86}],207:[function(t,e,n){var a=t(34),r=t(87);a(a.G+a.F*(parseInt!=r),{parseInt:r})},{34:34,87:87}],208:[function(t,e,n){"use strict";var a,r,i,o,s=t(60),p=t(41),u=t(26),c=t(18),l=t(34),d=t(52),f=t(4),h=t(7),m=t(40),g=t(102),v=t(111).set,b=t(68)(),y=t(69),_=t(88),x=t(123),w=t(89),k="Promise",S=p.TypeError,E=p.process,C=E&&E.versions,P=C&&C.v8||"",A=p[k],O="process"==c(E),T=function(){},R=r=y.f,M=!!function(){try{var e=A.resolve(1),n=(e.constructor={})[t(127)("species")]=function(t){t(T,T)};return(O||"function"==typeof PromiseRejectionEvent)&&e.then(T)instanceof n&&0!==P.indexOf("6.6")&&-1===x.indexOf("Chrome/66")}catch(a){}}(),L=function(t){var e;return d(t)&&"function"==typeof(e=t.then)?e:!1},j=function(t,e){if(!t._n){t._n=!0;var n=t._c;b(function(){for(var a=t._v,r=1==t._s,i=0,o=function(e){var n,i,o,s=r?e.ok:e.fail,p=e.resolve,u=e.reject,c=e.domain;try{s?(r||(2==t._h&&F(t),t._h=1),s===!0?n=a:(c&&c.enter(),n=s(a),c&&(c.exit(),o=!0)),n===e.promise?u(S("Promise-chain cycle")):(i=L(n))?i.call(n,p,u):p(n)):u(a)}catch(l){c&&!o&&c.exit(),u(l)}};n.length>i;)o(n[i++]);t._c=[],t._n=!1,e&&!t._h&&D(t)})}},D=function(t){v.call(p,function(){var e,n,a,r=t._v,i=N(t);if(i&&(e=_(function(){O?E.emit("unhandledRejection",r,t):(n=p.onunhandledrejection)?n({promise:t,reason:r}):(a=p.console)&&a.error&&a.error("Unhandled promise rejection",r)}),t._h=O||N(t)?2:1),t._a=void 0,i&&e.e)throw e.v})},N=function(t){return 1!==t._h&&0===(t._a||t._c).length},F=function(t){v.call(p,function(){var e;O?E.emit("rejectionHandled",t):(e=p.onrejectionhandled)&&e({promise:t,reason:t._v})})},I=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),j(e,!0))},B=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw S("Promise can't be resolved itself");(e=L(t))?b(function(){var a={_w:n,_d:!1};try{e.call(t,u(B,a,1),u(I,a,1))}catch(r){I.call(a,r)}}):(n._v=t,n._s=1,j(n,!1))}catch(a){I.call({_w:n,_d:!1},a)}}};M||(A=function(t){h(this,A,k,"_h"),f(t),a.call(this);try{t(u(B,this,1),u(I,this,1))}catch(e){I.call(this,e)}},a=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},a.prototype=t(91)(A.prototype,{then:function(t,e){var n=R(g(this,A));return n.ok="function"==typeof t?t:!0,n.fail="function"==typeof e&&e,n.domain=O?E.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&j(this,!1),n.promise},"catch":function(t){return this.then(void 0,t)}}),i=function(){var t=new a;this.promise=t,this.resolve=u(B,t,1),this.reject=u(I,t,1)},y.f=R=function(t){return t===A||t===o?new i(t):r(t)}),l(l.G+l.W+l.F*!M,{Promise:A}),t(99)(A,k),t(98)(k),o=t(24)[k],l(l.S+l.F*!M,k,{reject:function(t){var e=R(this),n=e.reject;return n(t),e.promise}}),l(l.S+l.F*(s||!M),k,{resolve:function(t){return w(s&&this===o?A:this,t)}}),l(l.S+l.F*!(M&&t(57)(function(t){A.all(t)["catch"](T)})),k,{all:function(t){var e=this,n=R(e),a=n.resolve,r=n.reject,i=_(function(){var n=[],i=0,o=1;m(t,!1,function(t){var s=i++,p=!1;n.push(void 0),o++,e.resolve(t).then(function(t){p||(p=!0,n[s]=t,--o||a(n))},r)}),--o||a(n)});return i.e&&r(i.v),n.promise},race:function(t){var e=this,n=R(e),a=n.reject,r=_(function(){m(t,!1,function(t){e.resolve(t).then(n.resolve,a)})});return r.e&&a(r.v),n.promise}})},{102:102,111:111,123:123,127:127,18:18,24:24,26:26,34:34,4:4,40:40,41:41,52:52,57:57,60:60,68:68,69:69,7:7,88:88,89:89,91:91,98:98,99:99}],209:[function(t,e,n){var a=t(34),r=t(4),i=t(8),o=(t(41).Reflect||{}).apply,s=Function.apply;a(a.S+a.F*!t(36)(function(){o(function(){})}),"Reflect",{apply:function(t,e,n){var a=r(t),p=i(n);return o?o(a,e,p):s.call(a,e,p)}})},{34:34,36:36,4:4,41:41,8:8}],210:[function(t,e,n){var a=t(34),r=t(71),i=t(4),o=t(8),s=t(52),p=t(36),u=t(17),c=(t(41).Reflect||{}).construct,l=p(function(){function t(){}return!(c(function(){},[],t)instanceof t)}),d=!p(function(){c(function(){})});a(a.S+a.F*(l||d),"Reflect",{construct:function(t,e){i(t),o(e);var n=arguments.length<3?t:i(arguments[2]);if(d&&!l)return c(t,e,n);if(t==n){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var a=[null];return a.push.apply(a,e),new(u.apply(t,a))}var p=n.prototype,f=r(s(p)?p:Object.prototype),h=Function.apply.call(t,f,e);return s(h)?h:f}})},{17:17,34:34,36:36,4:4,41:41,52:52,71:71,8:8}],211:[function(t,e,n){var a=t(72),r=t(34),i=t(8),o=t(118);r(r.S+r.F*t(36)(function(){Reflect.defineProperty(a.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t),e=o(e,!0),i(n);try{return a.f(t,e,n),!0}catch(r){return!1}}})},{118:118,34:34,36:36,72:72,8:8}],212:[function(t,e,n){var a=t(34),r=t(75).f,i=t(8);a(a.S,"Reflect",{deleteProperty:function(t,e){var n=r(i(t),e);return n&&!n.configurable?!1:delete t[e]}})},{34:34,75:75,8:8}],213:[function(t,e,n){"use strict";var a=t(34),r=t(8),i=function(t){this._t=r(t),this._i=0;var e,n=this._k=[];for(e in t)n.push(e)};t(55)(i,"Object",function(){var t,e=this,n=e._k;do if(e._i>=n.length)return{value:void 0,done:!0};while(!((t=n[e._i++])in e._t));return{value:t,done:!1}}),a(a.S,"Reflect",{enumerate:function(t){return new i(t)}})},{34:34,55:55,8:8}],214:[function(t,e,n){var a=t(75),r=t(34),i=t(8);r(r.S,"Reflect",{getOwnPropertyDescriptor:function(t,e){return a.f(i(t),e)}})},{34:34,75:75,8:8}],215:[function(t,e,n){var a=t(34),r=t(79),i=t(8);a(a.S,"Reflect",{getPrototypeOf:function(t){return r(i(t))}})},{34:34,79:79,8:8}],216:[function(t,e,n){function a(t,e){var n,s,c=arguments.length<3?t:arguments[2];return u(t)===c?t[e]:(n=r.f(t,e))?o(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:p(s=i(t))?a(s,e,c):void 0}var r=t(75),i=t(79),o=t(42),s=t(34),p=t(52),u=t(8);s(s.S,"Reflect",{get:a})},{34:34,42:42,52:52,75:75,79:79,8:8}],217:[function(t,e,n){var a=t(34);a(a.S,"Reflect",{has:function(t,e){return e in t}})},{34:34}],218:[function(t,e,n){var a=t(34),r=t(8),i=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(t){return r(t),i?i(t):!0}})},{34:34,8:8}],219:[function(t,e,n){var a=t(34);a(a.S,"Reflect",{ownKeys:t(85)})},{34:34,85:85}],220:[function(t,e,n){var a=t(34),r=t(8),i=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(t){r(t);try{return i&&i(t),!0}catch(e){return!1}}})},{34:34,8:8}],221:[function(t,e,n){var a=t(34),r=t(97);r&&a(a.S,"Reflect",{setPrototypeOf:function(t,e){r.check(t,e);try{return r.set(t,e),!0}catch(n){return!1}}})},{34:34,97:97}],222:[function(t,e,n){function a(t,e,n){var p,d,f=arguments.length<4?t:arguments[3],h=i.f(c(t),e);if(!h){if(l(d=o(t)))return a(d,e,n,f);h=u(0)}if(s(h,"value")){if(h.writable===!1||!l(f))return!1;if(p=i.f(f,e)){if(p.get||p.set||p.writable===!1)return!1;p.value=n,r.f(f,e,p)}else r.f(f,e,u(0,n));return!0}return void 0===h.set?!1:(h.set.call(f,n),!0)}var r=t(72),i=t(75),o=t(79),s=t(42),p=t(34),u=t(90),c=t(8),l=t(52);p(p.S,"Reflect",{set:a})},{34:34,42:42,52:52,72:72,75:75,79:79,8:8,90:90}],223:[function(t,e,n){var a=t(41),r=t(46),i=t(72).f,o=t(77).f,s=t(53),p=t(38),u=a.RegExp,c=u,l=u.prototype,d=/a/g,f=/a/g,h=new u(d)!==d;if(t(30)&&(!h||t(36)(function(){return f[t(127)("match")]=!1,u(d)!=d||u(f)==f||"/a/i"!=u(d,"i")}))){u=function(t,e){var n=this instanceof u,a=s(t),i=void 0===e;return!n&&a&&t.constructor===u&&i?t:r(h?new c(a&&!i?t.source:t,e):c((a=t instanceof u)?t.source:t,a&&i?p.call(t):e),n?this:l,u)};for(var m=(function(t){t in u||i(u,t,{configurable:!0,get:function(){return c[t]},set:function(e){c[t]=e}})}),g=o(c),v=0;g.length>v;)m(g[v++]);l.constructor=u,u.prototype=l,t(92)(a,"RegExp",u)}t(98)("RegExp")},{127:127,30:30,36:36,38:38,41:41,46:46,53:53,72:72,77:77,92:92,98:98}],224:[function(t,e,n){t(30)&&"g"!=/./g.flags&&t(72).f(RegExp.prototype,"flags",{configurable:!0,get:t(38)})},{30:30,38:38,72:72}],225:[function(t,e,n){t(37)("match",1,function(t,e,n){return[function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")},n]})},{37:37}],226:[function(t,e,n){t(37)("replace",2,function(t,e,n){return[function(a,r){"use strict";var i=t(this),o=void 0==a?void 0:a[e];return void 0!==o?o.call(a,i,r):n.call(i+"",a,r)},n]})},{37:37}],227:[function(t,e,n){t(37)("search",1,function(t,e,n){return[function(n){"use strict";var a=t(this),r=void 0==n?void 0:n[e];return void 0!==r?r.call(n,a):RegExp(n)[e](a+"")},n]})},{37:37}],228:[function(t,e,n){t(37)("split",2,function(e,n,a){"use strict";var r=t(53),i=a,o=[].push,s="split",p="length",u="lastIndex";if("c"=="abbc"[s](/(b)*/)[1]||4!="test"[s](/(?:)/,-1)[p]||2!="ab"[s](/(?:ab)*/)[p]||4!="."[s](/(.?)(.?)/)[p]||"."[s](/()()/)[p]>1||""[s](/.?/)[p]){var c=void 0===/()??/.exec("")[1];a=function(t,e){var n=this+"";if(void 0===t&&0===e)return[];if(!r(t))return i.call(n,t,e);var a,s,l,d,f,h=[],m=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),g=0,v=void 0===e?4294967295:e>>>0,b=RegExp(t.source,m+"g");for(c||(a=RegExp("^"+b.source+"$(?!\\s)",m));(s=b.exec(n))&&(l=s.index+s[0][p],!(l>g&&(h.push(n.slice(g,s.index)),!c&&s[p]>1&&s[0].replace(a,function(){for(f=1;f1&&s.index=v)));)b[u]===s.index&&b[u]++;return g===n[p]?(d||!b.test(""))&&h.push(""):h.push(n.slice(g)),h[p]>v?h.slice(0,v):h}}else"0"[s](void 0,0)[p]&&(a=function(t,e){return void 0===t&&0===e?[]:i.call(this,t,e)});return[function(t,r){var i=e(this),o=void 0==t?void 0:t[n];return void 0!==o?o.call(t,i,r):a.call(i+"",t,r)},a]})},{37:37,53:53}],229:[function(t,e,n){"use strict";t(224);var a=t(8),r=t(38),i=t(30),o="toString",s=/./[o],p=function(e){t(92)(RegExp.prototype,o,e,!0)};t(36)(function(){return"/a/b"!=s.call({source:"a",flags:"b"})})?p(function(){var t=a(this);return"/".concat(t.source,"/","flags"in t?t.flags:!i&&t instanceof RegExp?r.call(t):void 0)}):s.name!=o&&p(function(){return s.call(this)})},{224:224,30:30,36:36,38:38,8:8,92:92}],230:[function(t,e,n){"use strict";var a=t(20),r=t(124),i="Set";e.exports=t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(r(this,i),t=0===t?0:t,t)}},a)},{124:124,20:20,23:23}],231:[function(t,e,n){"use strict";t(106)("anchor",function(t){return function(e){return t(this,"a","name",e)}})},{106:106}],232:[function(t,e,n){"use strict";t(106)("big",function(t){return function(){return t(this,"big","","")}})},{106:106}],233:[function(t,e,n){"use strict";t(106)("blink",function(t){return function(){return t(this,"blink","","")}})},{106:106}],234:[function(t,e,n){"use strict";t(106)("bold",function(t){return function(){return t(this,"b","","")}})},{106:106}],235:[function(t,e,n){"use strict";var a=t(34),r=t(104)(!1);a(a.P,"String",{codePointAt:function(t){return r(this,t)}})},{104:104,34:34}],236:[function(t,e,n){"use strict";var a=t(34),r=t(116),i=t(105),o="endsWith",s=""[o];a(a.P+a.F*t(35)(o),"String",{endsWith:function(t){var e=i(this,t,o),n=arguments.length>1?arguments[1]:void 0,a=r(e.length),p=void 0===n?a:Math.min(r(n),a),u=t+"";return s?s.call(e,u,p):e.slice(p-u.length,p)===u}})},{105:105,116:116,34:34,35:35}],237:[function(t,e,n){"use strict";t(106)("fixed",function(t){return function(){return t(this,"tt","","")}})},{106:106}],238:[function(t,e,n){"use strict";t(106)("fontcolor",function(t){return function(e){return t(this,"font","color",e)}})},{106:106}],239:[function(t,e,n){"use strict";t(106)("fontsize",function(t){return function(e){return t(this,"font","size",e)}})},{106:106}],240:[function(t,e,n){var a=t(34),r=t(112),i=String.fromCharCode,o=String.fromCodePoint;a(a.S+a.F*(!!o&&1!=o.length),"String",{fromCodePoint:function(t){for(var e,n=[],a=arguments.length,o=0;a>o;){if(e=+arguments[o++],r(e,1114111)!==e)throw RangeError(e+" is not a valid code point");n.push(65536>e?i(e):i(((e-=65536)>>10)+55296,e%1024+56320))}return n.join("")}})},{112:112,34:34}],241:[function(t,e,n){"use strict";var a=t(34),r=t(105),i="includes";a(a.P+a.F*t(35)(i),"String",{includes:function(t){return!!~r(this,t,i).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},{105:105,34:34,35:35}],242:[function(t,e,n){"use strict";t(106)("italics",function(t){return function(){return t(this,"i","","")}})},{106:106}],243:[function(t,e,n){"use strict";var a=t(104)(!0);t(56)(String,"String",function(t){this._t=t+"",this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=a(e,n),this._i+=t.length,{value:t,done:!1})})},{104:104,56:56}],244:[function(t,e,n){"use strict";t(106)("link",function(t){return function(e){return t(this,"a","href",e)}})},{106:106}],245:[function(t,e,n){var a=t(34),r=t(115),i=t(116);a(a.S,"String",{raw:function(t){for(var e=r(t.raw),n=i(e.length),a=arguments.length,o=[],s=0;n>s;)o.push(e[s++]+""),a>s&&o.push(arguments[s]+"");return o.join("")}})},{115:115,116:116,34:34}],246:[function(t,e,n){var a=t(34);a(a.P,"String",{repeat:t(108)})},{108:108,34:34}],247:[function(t,e,n){"use strict";t(106)("small",function(t){return function(){return t(this,"small","","")}})},{106:106}],248:[function(t,e,n){"use strict";var a=t(34),r=t(116),i=t(105),o="startsWith",s=""[o];a(a.P+a.F*t(35)(o),"String",{startsWith:function(t){var e=i(this,t,o),n=r(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),a=t+"";return s?s.call(e,a,n):e.slice(n,n+a.length)===a}})},{105:105,116:116,34:34,35:35}],249:[function(t,e,n){"use strict";t(106)("strike",function(t){return function(){return t(this,"strike","","")}})},{106:106}],250:[function(t,e,n){"use strict";t(106)("sub",function(t){return function(){return t(this,"sub","","")}})},{106:106}],251:[function(t,e,n){"use strict";t(106)("sup",function(t){return function(){return t(this,"sup","","")}})},{106:106}],252:[function(t,e,n){"use strict";t(109)("trim",function(t){return function(){return t(this,3)}})},{109:109}],253:[function(t,e,n){"use strict";var a=t(41),r=t(42),i=t(30),o=t(34),s=t(92),p=t(66).KEY,u=t(36),c=t(101),l=t(99),d=t(122),f=t(127),h=t(126),m=t(125),g=t(33),v=t(50),b=t(8),y=t(52),_=t(115),x=t(118),w=t(90),k=t(71),S=t(76),E=t(75),C=t(72),P=t(81),A=E.f,O=C.f,T=S.f,R=a.Symbol,M=a.JSON,L=M&&M.stringify,j="prototype",D=f("_hidden"),N=f("toPrimitive"),F={}.propertyIsEnumerable,I=c("symbol-registry"),B=c("symbols"),q=c("op-symbols"),U=Object[j],V="function"==typeof R,G=a.QObject,z=!G||!G[j]||!G[j].findChild,W=i&&u(function(){return 7!=k(O({},"a",{get:function(){return O(this,"a",{value:7}).a}})).a})?function(t,e,n){var a=A(U,e);a&&delete U[e],O(t,e,n),a&&t!==U&&O(U,e,a)}:O,H=function(t){var e=B[t]=k(R[j]);return e._k=t,e},K=V&&"symbol"==typeof R.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof R},Q=function(t,e,n){return t===U&&Q(q,e,n),b(t),e=x(e,!0),b(n),r(B,e)?(n.enumerable?(r(t,D)&&t[D][e]&&(t[D][e]=!1),n=k(n,{enumerable:w(0,!1)})):(r(t,D)||O(t,D,w(1,{})),t[D][e]=!0),W(t,e,n)):O(t,e,n)},Y=function(t,e){b(t);for(var n,a=g(e=_(e)),r=0,i=a.length;i>r;)Q(t,n=a[r++],e[n]);return t},$=function(t,e){return void 0===e?k(t):Y(k(t),e)},J=function(t){var e=F.call(this,t=x(t,!0));return this===U&&r(B,t)&&!r(q,t)?!1:e||!r(this,t)||!r(B,t)||r(this,D)&&this[D][t]?e:!0},X=function(t,e){if(t=_(t),e=x(e,!0),t!==U||!r(B,e)||r(q,e)){var n=A(t,e);return!n||!r(B,e)||r(t,D)&&t[D][e]||(n.enumerable=!0),n}},Z=function(t){for(var e,n=T(_(t)),a=[],i=0;n.length>i;)r(B,e=n[i++])||e==D||e==p||a.push(e);return a},tt=function(t){for(var e,n=t===U,a=T(n?q:_(t)),i=[],o=0;a.length>o;)r(B,e=a[o++])&&(n?r(U,e):!0)&&i.push(B[e]);return i};V||(R=function(){if(this instanceof R)throw TypeError("Symbol is not a constructor!");var t=d(arguments.length>0?arguments[0]:void 0),e=function(n){this===U&&e.call(q,n),r(this,D)&&r(this[D],t)&&(this[D][t]=!1),W(this,t,w(1,n))};return i&&z&&W(U,t,{configurable:!0,set:e}),H(t)},s(R[j],"toString",function(){return this._k}),E.f=X,C.f=Q,t(77).f=S.f=Z,t(82).f=J,t(78).f=tt,i&&!t(60)&&s(U,"propertyIsEnumerable",J,!0),h.f=function(t){return H(f(t))}),o(o.G+o.W+o.F*!V,{Symbol:R});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)f(et[nt++]);for(var at=P(f.store),rt=0;at.length>rt;)m(at[rt++]);o(o.S+o.F*!V,"Symbol",{"for":function(t){return r(I,t+="")?I[t]:I[t]=R(t)},keyFor:function(t){if(!K(t))throw TypeError(t+" is not a symbol!");for(var e in I)if(I[e]===t)return e},useSetter:function(){z=!0},useSimple:function(){z=!1}}),o(o.S+o.F*!V,"Object",{create:$,defineProperty:Q,defineProperties:Y,getOwnPropertyDescriptor:X,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),M&&o(o.S+o.F*(!V||u(function(){var t=R();return"[null]"!=L([t])||"{}"!=L({a:t})||"{}"!=L(Object(t))})),"JSON",{stringify:function(t){for(var e,n,a=[t],r=1;arguments.length>r;)a.push(arguments[r++]);return n=e=a[1],!y(e)&&void 0===t||K(t)?void 0:(v(e)||(e=function(t,e){return"function"==typeof n&&(e=n.call(this,t,e)),K(e)?void 0:e}),a[1]=e,L.apply(M,a))}}),R[j][N]||t(43)(R[j],N,R[j].valueOf),l(R,"Symbol"),l(Math,"Math",!0),l(a.JSON,"JSON",!0)},{101:101,115:115,118:118,122:122,125:125,126:126,127:127,30:30,33:33,34:34,36:36,41:41,42:42,43:43,50:50,52:52,60:60,66:66,71:71,72:72,75:75,76:76,77:77,78:78,8:8,81:81,82:82,90:90,92:92,99:99}],254:[function(t,e,n){"use strict";var a=t(34),r=t(121),i=t(120),o=t(8),s=t(112),p=t(116),u=t(52),c=t(41).ArrayBuffer,l=t(102),d=i.ArrayBuffer,f=i.DataView,h=r.ABV&&c.isView,m=d.prototype.slice,g=r.VIEW,v="ArrayBuffer";a(a.G+a.W+a.F*(c!==d),{ArrayBuffer:d}),a(a.S+a.F*!r.CONSTR,v,{isView:function(t){return h&&h(t)||u(t)&&g in t}}),a(a.P+a.U+a.F*t(36)(function(){return!new d(2).slice(1,void 0).byteLength}),v,{slice:function(t,e){if(void 0!==m&&void 0===e)return m.call(o(this),t);for(var n=o(this).byteLength,a=s(t,n),r=s(void 0===e?n:e,n),i=new(l(this,d))(p(r-a)),u=new f(this),c=new f(i),h=0;r>a;)c.setUint8(h++,u.getUint8(a++));return i}}),t(98)(v)},{102:102,112:112,116:116,120:120,121:121,34:34,36:36,41:41,52:52,8:8,98:98}],255:[function(t,e,n){var a=t(34);a(a.G+a.W+a.F*!t(121).ABV,{DataView:t(120).DataView})},{120:120,121:121,34:34}],256:[function(t,e,n){t(119)("Float32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],257:[function(t,e,n){t(119)("Float64",8,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],258:[function(t,e,n){t(119)("Int16",2,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],259:[function(t,e,n){t(119)("Int32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],260:[function(t,e,n){t(119)("Int8",1,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],261:[function(t,e,n){t(119)("Uint16",2,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],262:[function(t,e,n){t(119)("Uint32",4,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],263:[function(t,e,n){t(119)("Uint8",1,function(t){return function(e,n,a){return t(this,e,n,a)}})},{119:119}],264:[function(t,e,n){t(119)("Uint8",1,function(t){return function(e,n,a){return t(this,e,n,a)}},!0)},{119:119}],265:[function(t,e,n){"use strict";var a,r=t(13)(0),i=t(92),o=t(66),s=t(70),p=t(22),u=t(52),c=t(36),l=t(124),d="WeakMap",f=o.getWeak,h=Object.isExtensible,m=p.ufstore,g={},v=function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},b={get:function(t){if(u(t)){var e=f(t);return e===!0?m(l(this,d)).get(t):e?e[this._i]:void 0}},set:function(t,e){return p.def(l(this,d),t,e)}},y=e.exports=t(23)(d,v,b,p,!0,!0);c(function(){return 7!=(new y).set((Object.freeze||Object)(g),7).get(g)})&&(a=p.getConstructor(v,d),s(a.prototype,b),o.NEED=!0,r(["delete","has","get","set"],function(t){var e=y.prototype,n=e[t];i(e,t,function(e,r){if(u(e)&&!h(e)){this._f||(this._f=new a);var i=this._f[t](e,r);return"set"==t?this:i}return n.call(this,e,r)})}))},{124:124,13:13,22:22,23:23,36:36,52:52,66:66,70:70,92:92}],266:[function(t,e,n){"use strict";var a=t(22),r=t(124),i="WeakSet";t(23)(i,function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return a.def(r(this,i),t,!0)}},a,!1,!0)},{124:124,22:22,23:23}],267:[function(t,e,n){"use strict";var a=t(34),r=t(39),i=t(117),o=t(116),s=t(4),p=t(16);a(a.P,"Array",{flatMap:function(t){var e,n,a=i(this);return s(t),e=o(a.length),n=p(a,0),r(n,a,a,e,0,1,t,arguments[1]),n}}),t(6)("flatMap")},{116:116,117:117,16:16,34:34,39:39,4:4,6:6}],268:[function(t,e,n){"use strict";var a=t(34),r=t(39),i=t(117),o=t(116),s=t(114),p=t(16);a(a.P,"Array",{flatten:function(){var t=arguments[0],e=i(this),n=o(e.length),a=p(e,0);return r(a,e,e,n,0,void 0===t?1:s(t)),a}}),t(6)("flatten")},{114:114,116:116,117:117,16:16,34:34,39:39,6:6}],269:[function(t,e,n){"use strict";var a=t(34),r=t(12)(!0);a(a.P,"Array",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),t(6)("includes")},{12:12,34:34,6:6}],270:[function(t,e,n){var a=t(34),r=t(68)(),i=t(41).process,o="process"==t(19)(i);a(a.G,{asap:function(t){var e=o&&i.domain;r(e?e.bind(t):t)}})},{19:19,34:34,41:41,68:68}],271:[function(t,e,n){var a=t(34),r=t(19);a(a.S,"Error",{isError:function(t){return"Error"===r(t)}})},{19:19,34:34}],272:[function(t,e,n){var a=t(34);a(a.G,{global:t(41)})},{34:34,41:41}],273:[function(t,e,n){t(95)("Map")},{95:95}],274:[function(t,e,n){t(96)("Map")},{96:96}],275:[function(t,e,n){var a=t(34);a(a.P+a.R,"Map",{toJSON:t(21)("Map")})},{21:21,34:34}],276:[function(t,e,n){var a=t(34);a(a.S,"Math",{clamp:function(t,e,n){return Math.min(n,Math.max(e,t))}})},{34:34}],277:[function(t,e,n){var a=t(34);a(a.S,"Math",{DEG_PER_RAD:Math.PI/180})},{34:34}],278:[function(t,e,n){var a=t(34),r=180/Math.PI;a(a.S,"Math",{degrees:function(t){return t*r}})},{34:34}],279:[function(t,e,n){var a=t(34),r=t(64),i=t(62);a(a.S,"Math",{fscale:function(t,e,n,a,o){return i(r(t,e,n,a,o))}})},{34:34,62:62,64:64}],280:[function(t,e,n){var a=t(34);a(a.S,"Math",{iaddh:function(t,e,n,a){var r=t>>>0,i=e>>>0,o=n>>>0;return i+(a>>>0)+((r&o|(r|o)&~(r+o>>>0))>>>31)|0}})},{34:34}],281:[function(t,e,n){var a=t(34);a(a.S,"Math",{imulh:function(t,e){var n=65535,a=+t,r=+e,i=a&n,o=r&n,s=a>>16,p=r>>16,u=(s*o>>>0)+(i*o>>>16);return s*p+(u>>16)+((i*p>>>0)+(u&n)>>16)}})},{34:34}],282:[function(t,e,n){var a=t(34);a(a.S,"Math",{isubh:function(t,e,n,a){var r=t>>>0,i=e>>>0,o=n>>>0;return i-(a>>>0)-((~r&o|~(r^o)&r-o>>>0)>>>31)|0}})},{34:34}],283:[function(t,e,n){var a=t(34);a(a.S,"Math",{RAD_PER_DEG:180/Math.PI})},{34:34}],284:[function(t,e,n){var a=t(34),r=Math.PI/180;a(a.S,"Math",{radians:function(t){return t*r}})},{34:34}],285:[function(t,e,n){var a=t(34);a(a.S,"Math",{scale:t(64)})},{34:34,64:64}],286:[function(t,e,n){var a=t(34);a(a.S,"Math",{signbit:function(t){return(t=+t)!=t?t:0==t?1/t==1/0:t>0}})},{34:34}],287:[function(t,e,n){var a=t(34);a(a.S,"Math",{umulh:function(t,e){var n=65535,a=+t,r=+e,i=a&n,o=r&n,s=a>>>16,p=r>>>16,u=(s*o>>>0)+(i*o>>>16);return s*p+(u>>>16)+((i*p>>>0)+(u&n)>>>16)}})},{34:34}],288:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(4),o=t(72);t(30)&&a(a.P+t(74),"Object",{__defineGetter__:function(t,e){o.f(r(this),t,{get:i(e),enumerable:!0,configurable:!0})}})},{117:117,30:30,34:34,4:4,72:72,74:74}],289:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(4),o=t(72);t(30)&&a(a.P+t(74),"Object",{__defineSetter__:function(t,e){o.f(r(this),t,{set:i(e),enumerable:!0,configurable:!0})}})},{117:117,30:30,34:34,4:4,72:72,74:74}],290:[function(t,e,n){var a=t(34),r=t(84)(!0);a(a.S,"Object",{entries:function(t){return r(t)}})},{34:34,84:84}],291:[function(t,e,n){var a=t(34),r=t(85),i=t(115),o=t(75),s=t(25);a(a.S,"Object",{getOwnPropertyDescriptors:function(t){for(var e,n,a=i(t),p=o.f,u=r(a),c={},l=0;u.length>l;)n=p(a,e=u[l++]),void 0!==n&&s(c,e,n);return c}})},{115:115,25:25,34:34,75:75,85:85}],292:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118),o=t(79),s=t(75).f;t(30)&&a(a.P+t(74),"Object",{__lookupGetter__:function(t){var e,n=r(this),a=i(t,!0);do if(e=s(n,a))return e.get;while(n=o(n))}})},{117:117,118:118,30:30,34:34,74:74,75:75,79:79}],293:[function(t,e,n){"use strict";var a=t(34),r=t(117),i=t(118),o=t(79),s=t(75).f;t(30)&&a(a.P+t(74),"Object",{__lookupSetter__:function(t){var e,n=r(this),a=i(t,!0);do if(e=s(n,a))return e.set;while(n=o(n))}})},{117:117,118:118,30:30,34:34,74:74,75:75,79:79}],294:[function(t,e,n){var a=t(34),r=t(84)(!1);a(a.S,"Object",{values:function(t){return r(t)}})},{34:34,84:84}],295:[function(t,e,n){"use strict";var a=t(34),r=t(41),i=t(24),o=t(68)(),s=t(127)("observable"),p=t(4),u=t(8),c=t(7),l=t(91),d=t(43),f=t(40),h=f.RETURN,m=function(t){return null==t?void 0:p(t)},g=function(t){var e=t._c;e&&(t._c=void 0,e())},v=function(t){return void 0===t._o},b=function(t){v(t)||(t._o=void 0,g(t))},y=function(t,e){u(t),this._c=void 0,this._o=t,t=new _(this);try{var n=e(t),a=n;null!=n&&("function"==typeof n.unsubscribe?n=function(){a.unsubscribe()}:p(n),this._c=n)}catch(r){return void t.error(r)}v(this)&&g(this)};y.prototype=l({},{unsubscribe:function(){b(this)}});var _=function(t){this._s=t};_.prototype=l({},{next:function(t){var e=this._s;if(!v(e)){var n=e._o;try{var a=m(n.next);if(a)return a.call(n,t)}catch(r){try{b(e)}finally{throw r}}}},error:function(t){var e=this._s;if(v(e))throw t;var n=e._o;e._o=void 0;try{var a=m(n.error);if(!a)throw t;t=a.call(n,t)}catch(r){try{g(e)}finally{throw r}}return g(e),t},complete:function(t){var e=this._s;if(!v(e)){var n=e._o;e._o=void 0;try{var a=m(n.complete);t=a?a.call(n,t):void 0}catch(r){try{g(e)}finally{throw r}}return g(e),t}}});var x=function(t){c(this,x,"Observable","_f")._f=p(t)};l(x.prototype,{subscribe:function(t){return new y(t,this._f)},forEach:function(t){var e=this;return new(i.Promise||r.Promise)(function(n,a){p(t);var r=e.subscribe({next:function(e){try{return t(e)}catch(n){a(n),r.unsubscribe()}},error:a,complete:n})})}}),l(x,{from:function(t){var e="function"==typeof this?this:x,n=m(u(t)[s]);if(n){var a=u(n.call(t));return a.constructor===e?a:new e(function(t){return a.subscribe(t)})}return new e(function(e){var n=!1;return o(function(){if(!n){try{if(f(t,!1,function(t){return e.next(t),n?h:void 0})===h)return}catch(a){if(n)throw a;return void e.error(a)}e.complete()}}),function(){n=!0}})},of:function(){for(var t=0,e=arguments.length,n=Array(e);e>t;)n[t]=arguments[t++];return new("function"==typeof this?this:x)(function(t){var e=!1;return o(function(){if(!e){for(var a=0;a1?arguments[1]:void 0,!1)}})},{107:107,123:123,34:34}],313:[function(t,e,n){"use strict";var a=t(34),r=t(107),i=t(123);a(a.P+a.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(i),"String",{padStart:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0,!0)}})},{107:107,123:123,34:34}],314:[function(t,e,n){"use strict";t(109)("trimLeft",function(t){return function(){return t(this,1)}},"trimStart")},{109:109}],315:[function(t,e,n){"use strict";t(109)("trimRight",function(t){return function(){return t(this,2)}},"trimEnd")},{109:109}],316:[function(t,e,n){t(125)("asyncIterator")},{125:125}],317:[function(t,e,n){t(125)("observable")},{125:125}],318:[function(t,e,n){var a=t(34);a(a.S,"System",{global:t(41)
-})},{34:34,41:41}],319:[function(t,e,n){t(95)("WeakMap")},{95:95}],320:[function(t,e,n){t(96)("WeakMap")},{96:96}],321:[function(t,e,n){t(95)("WeakSet")},{95:95}],322:[function(t,e,n){t(96)("WeakSet")},{96:96}],323:[function(t,e,n){for(var a=t(140),r=t(81),i=t(92),o=t(41),s=t(43),p=t(59),u=t(127),c=u("iterator"),l=u("toStringTag"),d=p.Array,f={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=r(f),m=0;m2,r=a?o.call(arguments,2):!1;return t(a?function(){("function"==typeof e?e:Function(e)).apply(this,r)}:e,n)}};r(r.G+r.B+r.F*s,{setTimeout:p(a.setTimeout),setInterval:p(a.setInterval)})},{123:123,34:34,41:41}],326:[function(t,e,n){t(253),t(190),t(192),t(191),t(194),t(196),t(201),t(195),t(193),t(203),t(202),t(198),t(199),t(197),t(189),t(200),t(204),t(205),t(156),t(158),t(157),t(207),t(206),t(177),t(187),t(188),t(178),t(179),t(180),t(181),t(182),t(183),t(184),t(185),t(186),t(160),t(161),t(162),t(163),t(164),t(165),t(166),t(167),t(168),t(169),t(170),t(171),t(172),t(173),t(174),t(175),t(176),t(240),t(245),t(252),t(243),t(235),t(236),t(241),t(246),t(248),t(231),t(232),t(233),t(234),t(237),t(238),t(239),t(242),t(244),t(247),t(249),t(250),t(251),t(151),t(153),t(152),t(155),t(154),t(139),t(137),t(144),t(141),t(147),t(149),t(136),t(143),t(133),t(148),t(131),t(146),t(145),t(138),t(142),t(130),t(132),t(135),t(134),t(150),t(140),t(223),t(229),t(224),t(225),t(226),t(227),t(228),t(208),t(159),t(230),t(265),t(266),t(254),t(255),t(260),t(263),t(264),t(258),t(261),t(259),t(262),t(256),t(257),t(209),t(210),t(211),t(212),t(213),t(216),t(214),t(215),t(217),t(218),t(219),t(220),t(222),t(221),t(269),t(267),t(268),t(310),t(313),t(312),t(314),t(315),t(311),t(316),t(317),t(291),t(294),t(290),t(288),t(289),t(292),t(293),t(275),t(309),t(274),t(308),t(320),t(322),t(273),t(307),t(319),t(321),t(272),t(318),t(271),t(276),t(277),t(278),t(279),t(280),t(282),t(281),t(283),t(284),t(285),t(287),t(286),t(296),t(297),t(298),t(299),t(301),t(300),t(303),t(302),t(304),t(305),t(306),t(270),t(295),t(325),t(324),t(323),e.exports=t(24)},{130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,188:188,189:189,190:190,191:191,192:192,193:193,194:194,195:195,196:196,197:197,198:198,199:199,200:200,201:201,202:202,203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,216:216,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,24:24,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,307:307,308:308,309:309,310:310,311:311,312:312,313:313,314:314,315:315,316:316,317:317,318:318,319:319,320:320,321:321,322:322,323:323,324:324,325:325}],327:[function(t,e,n){!function(t){"use strict";function e(){return c.createDocumentFragment()}function n(t){return c.createElement(t)}function a(t){if(1===t.length)return r(t[0]);for(var n=e(),a=B.call(t),i=0;i-1}}([].indexOf||function(t){for(q=this.length;q--&&this[q]!==t;);return q}),item:function(t){return this[t]||null},remove:function(){for(var t,e=0;e=p?e(i):document.fonts.load(u(i,i.family),s).then(function(e){1<=e.length?t(i):setTimeout(d,25)},function(){e(i)})};d()}else n(function(){function n(){var e;(e=-1!=g&&-1!=v||-1!=g&&-1!=b||-1!=v&&-1!=b)&&((e=g!=v&&g!=b&&v!=b)||(null===l&&(e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),l=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))),e=l&&(g==y&&v==y&&b==y||g==_&&v==_&&b==_||g==x&&v==x&&b==x)),e=!e),e&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),t(i))}function d(){if((new Date).getTime()-c>=p)null!==w.parentNode&&w.parentNode.removeChild(w),e(i);else{var t=document.hidden;(!0===t||void 0===t)&&(g=f.a.offsetWidth,v=h.a.offsetWidth,b=m.a.offsetWidth,n()),k=setTimeout(d,50)}}var f=new a(s),h=new a(s),m=new a(s),g=-1,v=-1,b=-1,y=-1,_=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",r(f,u(i,"sans-serif")),r(h,u(i,"serif")),r(m,u(i,"monospace")),w.appendChild(f.a),w.appendChild(h.a),w.appendChild(m.a),document.body.appendChild(w),y=f.a.offsetWidth,_=h.a.offsetWidth,x=m.a.offsetWidth,d(),o(f,function(t){g=t,n()}),r(f,u(i,'"'+i.family+'",sans-serif')),o(h,function(t){v=t,n()}),r(h,u(i,'"'+i.family+'",serif')),o(m,function(t){b=t,n()}),r(m,u(i,'"'+i.family+'",monospace'))})})},window.FontFaceObserver=s,window.FontFaceObserver.prototype.check=s.prototype.a,void 0!==e&&(e.exports=window.FontFaceObserver)}()},{}],330:[function(t,e,n){!function(t,n){function a(t,e){var n=t.createElement("p"),a=t.getElementsByTagName("head")[0]||t.documentElement;return n.innerHTML="x",a.insertBefore(n.lastChild,a.firstChild)}function r(){var t=_.elements;return"string"==typeof t?t.split(" "):t}function i(t,e){var n=_.elements;"string"!=typeof n&&(n=n.join(" ")),"string"!=typeof t&&(t=t.join(" ")),_.elements=n+" "+t,c(e)}function o(t){var e=y[t[v]];return e||(e={},b++,t[v]=b,y[b]=e),e}function s(t,e,a){if(e||(e=n),d)return e.createElement(t);a||(a=o(e));var r;return r=a.cache[t]?a.cache[t].cloneNode():g.test(t)?(a.cache[t]=a.createElem(t)).cloneNode():a.createElem(t),!r.canHaveChildren||m.test(t)||r.tagUrn?r:a.frag.appendChild(r)}function p(t,e){if(t||(t=n),d)return t.createDocumentFragment();e=e||o(t);for(var a=e.frag.cloneNode(),i=0,s=r(),p=s.length;p>i;i++)a.createElement(s[i]);return a}function u(t,e){e.cache||(e.cache={},e.createElem=t.createElement,e.createFrag=t.createDocumentFragment,e.frag=e.createFrag()),t.createElement=function(n){return _.shivMethods?s(n,t,e):e.createElem(n)},t.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+r().join().replace(/[\w\-:]+/g,function(t){return e.createElem(t),e.frag.createElement(t),'c("'+t+'")'})+");return n}")(_,e.frag)}function c(t){t||(t=n);var e=o(t);return!_.shivCSS||l||e.hasCSS||(e.hasCSS=!!a(t,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),d||u(t,e),t}var l,d,f="3.7.3-pre",h=t.html5||{},m=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,g=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",b=0,y={};!function(){try{var t=n.createElement("a");t.innerHTML="",l="hidden"in t,d=1==t.childNodes.length||function(){n.createElement("a");var t=n.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(e){l=!0,d=!0}}();var _={elements:h.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:f,shivCSS:h.shivCSS!==!1,supportsUnknownElements:d,shivMethods:h.shivMethods!==!1,type:"default",shivDocument:c,createElement:s,createDocumentFragment:p,addElements:i};t.html5=_,c(n),"object"==typeof e&&e.exports&&(e.exports=_)}("undefined"!=typeof window?window:this,document)},{}],331:[function(t,e,n){(function(t){(function(t){!function(t){function e(t,e,n,a){for(var i,o,s=n.slice(),p=r(e,t),u=0,c=s.length;c>u&&(i=s[u],"object"==typeof i?"function"==typeof i.handleEvent&&i.handleEvent(p):i.call(t,p),!p.stoppedImmediatePropagation);u++);return o=!p.stoppedPropagation,a&&o&&t.parentNode?t.parentNode.dispatchEvent(p):!p.defaultPrevented}function n(t,e){return{configurable:!0,get:t,set:e}}function a(t,e,a){var r=y(e||t,a);v(t,"textContent",n(function(){return r.get.call(this)},function(t){r.set.call(this,t)}))}function r(t,e){return t.currentTarget=e,t.eventPhase=t.target===t.currentTarget?2:3,t}function i(t,e){for(var n=t.length;n--&&t[n]!==e;);return n}function o(){if("BR"===this.tagName)return"\n";for(var t=this.firstChild,e=[];t;)8!==t.nodeType&&7!==t.nodeType&&e.push(t.textContent),t=t.nextSibling;return e.join("")}function s(t){var e=document.createEvent("Event");e.initEvent("input",!0,!0),(t.srcElement||t.fromElement||document).dispatchEvent(e)}function p(t){!f&&S.test(document.readyState)&&(f=!f,document.detachEvent(h,p),t=document.createEvent("Event"),t.initEvent(m,!0,!0),document.dispatchEvent(t))}function u(t){return function(){return P[t]||document.body&&document.body[t]||0}}function c(t){for(var e;e=this.lastChild;)this.removeChild(e);null!=t&&this.appendChild(document.createTextNode(t))}function l(e,n){return n||(n=t.event),n.target||(n.target=n.srcElement||n.fromElement||document),n.timeStamp||(n.timeStamp=(new Date).getTime()),n}if(!document.createEvent){var d=!0,f=!1,h="onreadystatechange",m="DOMContentLoaded",g="__IE8__"+Math.random(),v=Object.defineProperty||function(t,e,n){t[e]=n.value},b=Object.defineProperties||function(e,n){for(var a in n)if(_.call(n,a))try{v(e,a,n[a])}catch(r){t.console&&console.log(a+" failed on object:",e,r.message)}},y=Object.getOwnPropertyDescriptor,_=Object.prototype.hasOwnProperty,x=t.Element.prototype,w=t.Text.prototype,k=/^[a-z]+$/,S=/loaded|complete/,E={},C=document.createElement("div"),P=document.documentElement,A=P.removeAttribute,O=P.setAttribute,T=function(t){return{enumerable:!0,writable:!0,configurable:!0,value:t}};a(t.HTMLCommentElement.prototype,x,"nodeValue"),a(t.HTMLScriptElement.prototype,null,"text"),a(w,null,"nodeValue"),a(t.HTMLTitleElement.prototype,null,"text"),v(t.HTMLStyleElement.prototype,"textContent",function(t){return n(function(){return t.get.call(this.styleSheet)},function(e){t.set.call(this.styleSheet,e)})}(y(t.CSSStyleSheet.prototype,"cssText")));var R=/\b\s*alpha\s*\(\s*opacity\s*=\s*(\d+)\s*\)/;v(t.CSSStyleDeclaration.prototype,"opacity",{get:function(){var t=this.filter.match(R);return t?""+t[1]/100:""},set:function(t){this.zoom=1;var e=!1;t=1>t?" alpha(opacity="+Math.round(100*t)+")":"",this.filter=this.filter.replace(R,function(){return e=!0,t}),!e&&t&&(this.filter+=t)}}),b(x,{textContent:{get:o,set:c},firstElementChild:{get:function(){for(var t=this.childNodes||[],e=0,n=t.length;n>e;e++)if(1==t[e].nodeType)return t[e]}},lastElementChild:{get:function(){for(var t=this.childNodes||[],e=t.length;e--;)if(1==t[e].nodeType)return t[e]}},oninput:{get:function(){return this._oninput||null},set:function(t){this._oninput&&(this.removeEventListener("input",this._oninput),this._oninput=t,t&&this.addEventListener("input",t))}},previousElementSibling:{get:function(){for(var t=this.previousSibling;t&&1!=t.nodeType;)t=t.previousSibling;return t}},nextElementSibling:{get:function(){for(var t=this.nextSibling;t&&1!=t.nodeType;)t=t.nextSibling;return t}},childElementCount:{get:function(){for(var t=0,e=this.childNodes||[],n=e.length;n--;t+=1==e[n].nodeType);return t}},addEventListener:T(function(t,n,a){if("function"==typeof n||"object"==typeof n){var r,o,p=this,u="on"+t,c=p[g]||v(p,g,{value:{}})[g],d=c[u]||(c[u]={}),f=d.h||(d.h=[]);if(!_.call(d,"w")){if(d.w=function(t){return t[g]||e(p,l(p,t),f,!1)},!_.call(E,u))if(k.test(t)){try{r=document.createEventObject(),r[g]=!0,9!=p.nodeType&&(null==p.parentNode&&C.appendChild(p),(o=p.getAttribute(u))&&A.call(p,u)),p.fireEvent(u,r),E[u]=!0}catch(h){for(E[u]=!1;C.hasChildNodes();)C.removeChild(C.firstChild)}null!=o&&O.call(p,u,o)}else E[u]=!1;(d.n=E[u])&&p.attachEvent(u,d.w)}i(f,n)<0&&f[a?"unshift":"push"](n),"input"===t&&p.attachEvent("onkeyup",s)}}),dispatchEvent:T(function(t){var n,a=this,r="on"+t.type,i=a[g],o=i&&i[r],s=!!o;return t.target||(t.target=a),s?o.n?a.fireEvent(r,t):e(a,t,o.h,!0):(n=a.parentNode)?n.dispatchEvent(t):!0,!t.defaultPrevented}),removeEventListener:T(function(t,e,n){if("function"==typeof e||"object"==typeof e){var a=this,r="on"+t,o=a[g],s=o&&o[r],p=s&&s.h,u=p?i(p,e):-1;u>-1&&p.splice(u,1)}})}),b(w,{addEventListener:T(x.addEventListener),dispatchEvent:T(x.dispatchEvent),removeEventListener:T(x.removeEventListener)}),b(t.XMLHttpRequest.prototype,{addEventListener:T(function(t,e,n){var a=this,r="on"+t,o=a[g]||v(a,g,{value:{}})[g],s=o[r]||(o[r]={}),p=s.h||(s.h=[]);i(p,e)<0&&(a[r]||(a[r]=function(){var e=document.createEvent("Event");e.initEvent(t,!0,!0),a.dispatchEvent(e)}),p[n?"unshift":"push"](e))}),dispatchEvent:T(function(t){var n=this,a="on"+t.type,r=n[g],i=r&&r[a],o=!!i;return o&&(i.n?n.fireEvent(a,t):e(n,t,i.h,!0))}),removeEventListener:T(x.removeEventListener)});var M=y(Event.prototype,"button").get;b(t.Event.prototype,{bubbles:T(!0),cancelable:T(!0),preventDefault:T(function(){this.cancelable&&(this.returnValue=!1)}),stopPropagation:T(function(){this.stoppedPropagation=!0,this.cancelBubble=!0}),stopImmediatePropagation:T(function(){this.stoppedImmediatePropagation=!0,this.stopPropagation()}),initEvent:T(function(t,e,n){this.type=t,this.bubbles=!!e,this.cancelable=!!n,this.bubbles||this.stopPropagation()}),pageX:{get:function(){return this._pageX||(this._pageX=this.clientX+t.scrollX-(P.clientLeft||0))}},pageY:{get:function(){return this._pageY||(this._pageY=this.clientY+t.scrollY-(P.clientTop||0))}},which:{get:function(){return this.keyCode?this.keyCode:isNaN(this.button)?void 0:this.button+1}},charCode:{get:function(){return this.keyCode&&"keypress"==this.type?this.keyCode:0}},buttons:{get:function(){return M.call(this)}},button:{get:function(){var t=this.buttons;return 1&t?0:2&t?2:4&t?1:void 0}},defaultPrevented:{get:function(){var t,e=this.returnValue;return!(e===t||e)}},relatedTarget:{get:function(){var t=this.type;return"mouseover"===t?this.fromElement:"mouseout"===t?this.toElement:null}}}),b(t.HTMLDocument.prototype,{defaultView:{get:function(){return this.parentWindow}},textContent:{get:function(){return 11===this.nodeType?o.call(this):null},set:function(t){11===this.nodeType&&c.call(this,t)}},addEventListener:T(function(e,n,a){var r=this;x.addEventListener.call(r,e,n,a),d&&e===m&&!S.test(r.readyState)&&(d=!1,r.attachEvent(h,p),t==top&&!function i(t){try{r.documentElement.doScroll("left"),p()}catch(e){setTimeout(i,50)}}())}),dispatchEvent:T(x.dispatchEvent),removeEventListener:T(x.removeEventListener),createEvent:T(function(t){var e;if("Event"!==t)throw Error("unsupported "+t);return e=document.createEventObject(),e.timeStamp=(new Date).getTime(),e})}),b(t.Window.prototype,{getComputedStyle:T(function(){function t(t){this._=t}function e(){}var n=/^(?:[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|))(?!px)[a-z%]+$/,a=/^(top|right|bottom|left)$/,r=/\-([a-z])/g,i=function(t,e){return e.toUpperCase()};return t.prototype.getPropertyValue=function(t){var e,o,s,p=this._,u=p.style,c=p.currentStyle,l=p.runtimeStyle;return"opacity"==t?u.opacity||"1":(t=("float"===t?"style-float":t).replace(r,i),e=c?c[t]:u[t],n.test(e)&&!a.test(t)&&(o=u.left,s=l&&l.left,s&&(l.left=c.left),u.left="fontSize"===t?"1em":e,e=u.pixelLeft+"px",u.left=o,s&&(l.left=s)),null==e?e:e+""||"auto")},e.prototype.getPropertyValue=function(){return null},function(n,a){return a?new e(n):new t(n)}}()),addEventListener:T(function(n,a,r){var o,s=t,p="on"+n;s[p]||(s[p]=function(t){return e(s,l(s,t),o,!1)&&void 0}),o=s[p][g]||(s[p][g]=[]),i(o,a)<0&&o[r?"unshift":"push"](a)}),dispatchEvent:T(function(e){var n=t["on"+e.type];return n?n.call(t,e)!==!1&&!e.defaultPrevented:!0}),removeEventListener:T(function(e,n,a){var r="on"+e,o=(t[r]||Object)[g],s=o?i(o,n):-1;s>-1&&o.splice(s,1)}),pageXOffset:{get:u("scrollLeft")},pageYOffset:{get:u("scrollTop")},scrollX:{get:u("scrollLeft")},scrollY:{get:u("scrollTop")},innerWidth:{get:u("clientWidth")},innerHeight:{get:u("clientHeight")}}),t.HTMLElement=t.Element,function(t,e,n){for(n=0;na;a++)e.appendChild(n[a].cloneNode(!0));return e},n.cloneRange=function(){var t=new e;return t._start=this._start,t._end=this._end,t},n.deleteContents=function(){for(var e=this._start.parentNode,n=t(this._start,this._end),a=0,r=n.length;r>a;a++)e.removeChild(n[a])},n.extractContents=function(){for(var e=this._start.ownerDocument.createDocumentFragment(),n=t(this._start,this._end),a=0,r=n.length;r>a;a++)e.appendChild(n[a]);return e},n.setEndAfter=function(t){this._end=t},n.setEndBefore=function(t){this._end=t.previousSibling},n.setStartAfter=function(t){this._start=t.nextSibling},n.setStartBefore=function(t){this._start=t}}}()}}(this.window||t)}).call(this,void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],332:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e=s)return(0,p["default"])({points:n});for(var l=1;s-1>=l;l++)i.push((0,u.times)(a,(0,u.minus)(n[l],n[l-1])));for(var d=[(0,u.plus)(n[0],c(i[0],i[1]))],l=1;s-2>=l;l++)d.push((0,u.minus)(n[l],(0,u.average)([i[l],i[l-1]])));d.push((0,u.minus)(n[s-1],c(i[s-2],i[s-3])));var f=d[0],h=d[1],m=n[0],g=n[1],v=(e=(0,o["default"])()).moveto.apply(e,r(m)).curveto(f[0],f[1],h[0],h[1],g[0],g[1]);return{path:(0,u.range)(2,s).reduce(function(t,e){var a=d[e],r=n[e];return t.smoothcurveto(a[0],a[1],r[0],r[1])},v),centroid:(0,u.average)(n)}},e.exports=n["default"]},{335:335,336:336,337:337}],333:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(n,"__esModule",{value:!0});var r=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t(334),o=a(i),s=t(335),p=1e-5,u=function(t,e){var n=t.map(e),a=n.sort(function(t,e){var n=r(t,2),a=n[0],i=(n[1],r(e,2)),o=i[0];i[1];return a-o}),i=a.length,o=a[0][0],u=a[i-1][0],c=(0,s.minBy)(a,function(t){return t[1]}),l=(0,s.maxBy)(a,function(t){return t[1]});return o==u&&(u+=p),c==l&&(l+=p),{points:a,xmin:o,xmax:u,ymin:c,ymax:l}};n["default"]=function(t){var e=t.data,n=t.xaccessor,a=t.yaccessor,i=t.width,p=t.height,c=t.closed,l=t.min,d=t.max;n||(n=function(t){var e=r(t,2),n=e[0];e[1];return n}),a||(a=function(t){var e=r(t,2),n=(e[0],e[1]);return n});var f=function(t){return[n(t),a(t)]},h=e.map(function(t){return u(t,f)}),m=(0,s.minBy)(h,function(t){return t.xmin}),g=(0,s.maxBy)(h,function(t){return t.xmax}),v=null==l?(0,s.minBy)(h,function(t){return t.ymin}):l,b=null==d?(0,s.maxBy)(h,function(t){return t.ymax}):d;c&&(v=Math.min(v,0),b=Math.max(b,0));var y=c?0:v,_=(0,o["default"])([m,g],[0,i]),x=(0,o["default"])([v,b],[p,0]),w=function(t){var e=r(t,2),n=e[0],a=e[1];return[_(n),x(a)]};return{arranged:h,scale:w,xscale:_,yscale:x,base:y}},e.exports=n["default"]},{334:334,335:335}],334:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t,e){var n=a(t,2),r=n[0],o=n[1],s=a(e,2),p=s[0],u=s[1],c=function(t){return p+(u-p)*(t-r)/(o-r)};return c.inverse=function(){return i([p,u],[r,o])},c};n["default"]=r,e.exports=n["default"]},{}],335:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function(t){return t.reduce(function(t,e){return t+e},0)},i=function(t){return t.reduce(function(t,e){return Math.min(t,e)})},o=function(t){return t.reduce(function(t,e){return Math.max(t,e)})},s=function(t,e){return t.reduce(function(t,n){return t+e(n)},0)},p=function(t,e){return t.reduce(function(t,n){return Math.min(t,e(n))},1/0)},u=function(t,e){return t.reduce(function(t,n){return Math.max(t,e(n))},-(1/0))},c=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return[r+s,i+p]},l=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return[r-s,i-p]},d=function(t,e){var n=a(e,2),r=n[0],i=n[1];return[t*r,t*i]},f=function(t){var e=a(t,2),n=e[0],r=e[1];return Math.sqrt(n*n+r*r)},h=function(t){return t.reduce(c,[0,0])},m=function(t){return d(1/t.length,t.reduce(c))},g=function(t,e){return d(t,[Math.sin(e),-Math.cos(e)])},v=function(t,e){var n=t||{};for(var a in n){var r=n[a];e[a]=r(e.index,e.item,e.group)}return e},b=function(t,e,n){for(var a=[],r=t;e>r;r++)a.push(r);return n&&a.push(e),a},y=function(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=Object.keys(t)[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var p=o.value,u=t[p];n.push(e(p,u))}}catch(c){r=!0,i=c}finally{
-try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n},_=function(t){return y(t,function(t,e){return[t,e]})},x=function(t){return t};n.sum=r,n.min=i,n.max=o,n.sumBy=s,n.minBy=p,n.maxBy=u,n.plus=c,n.minus=l,n.times=d,n.id=x,n.length=f,n.sumVectors=h,n.average=m,n.onCircle=g,n.enhance=v,n.range=b,n.mapObject=y,n.pairs=_,n["default"]={sum:r,min:i,max:o,sumBy:s,minBy:p,maxBy:u,plus:c,minus:l,times:d,id:x,length:f,sumVectors:h,average:m,onCircle:g,enhance:v,range:b,mapObject:y,pairs:_}},{}],336:[function(t,e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(p){r=!0,i=p}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),r=function i(t){var e=t||[],n=function(t,e){var n=t.slice(0,t.length);return n.push(e),n},r=function(t,e){var n=a(t,2),r=n[0],i=n[1],o=a(e,2),s=o[0],p=o[1];return r===s&&i===p},o=function(t,e){for(var n=t.length;"0"===t.charAt(n-1);)n-=1;return"."===t.charAt(n-1)&&(n-=1),t.substr(0,n)},s=function(t,e){var n=t.toFixed(e);return o(n)},p=function(t){var e=t.command,n=t.params,a=n.map(function(t){return s(t,6)});return e+" "+a.join(" ")},u=function(t,e){var n=t.command,r=t.params,i=a(e,2),o=i[0],s=i[1];switch(n){case"M":return[r[0],r[1]];case"L":return[r[0],r[1]];case"H":return[r[0],s];case"V":return[o,r[0]];case"Z":return null;case"C":return[r[4],r[5]];case"S":return[r[2],r[3]];case"Q":return[r[2],r[3]];case"T":return[r[0],r[1]];case"A":return[r[5],r[6]]}},c=function(t,e){return function(n){var a="object"==typeof n?t.map(function(t){return n[t]}):arguments;return e.apply(null,a)}},l=function(t){return i(n(e,t))};return{moveto:c(["x","y"],function(t,e){return l({command:"M",params:[t,e]})}),lineto:c(["x","y"],function(t,e){return l({command:"L",params:[t,e]})}),hlineto:c(["x"],function(t){return l({command:"H",params:[t]})}),vlineto:c(["y"],function(t){return l({command:"V",params:[t]})}),closepath:function(){return l({command:"Z",params:[]})},curveto:c(["x1","y1","x2","y2","x","y"],function(t,e,n,a,r,i){return l({command:"C",params:[t,e,n,a,r,i]})}),smoothcurveto:c(["x2","y2","x","y"],function(t,e,n,a){return l({command:"S",params:[t,e,n,a]})}),qcurveto:c(["x1","y1","x","y"],function(t,e,n,a){return l({command:"Q",params:[t,e,n,a]})}),smoothqcurveto:c(["x","y"],function(t,e){return l({command:"T",params:[t,e]})}),arc:c(["rx","ry","xrot","largeArcFlag","sweepFlag","x","y"],function(t,e,n,a,r,i,o){return l({command:"A",params:[t,e,n,a,r,i,o]})}),print:function(){return e.map(p).join(" ")},points:function(){var t=[],n=[0,0],a=!0,r=!1,i=void 0;try{for(var o,s=e[Symbol.iterator]();!(a=(o=s.next()).done);a=!0){var p=o.value,c=u(p,n);n=c,c&&t.push(c)}}catch(l){r=!0,i=l}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}return t},instructions:function(){return e.slice(0,e.length)},connect:function(t){var e=this.points(),n=e[e.length-1],a=t.points()[0],o=t.instructions().slice(1);return r(n,a)||o.unshift({command:"L",params:a}),i(this.instructions().concat(o))}}};n["default"]=function(){return r()},e.exports=n["default"]},{}],337:[function(t,e,n){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];for(var r,i;i=n.shift();)for(r in i)Mo.call(i,r)&&(t[r]=i[r]);return t}function r(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];return n.forEach(function(e){for(var n in e)!e.hasOwnProperty(n)||n in t||(t[n]=e[n])}),t}function i(t){return"[object Array]"===Lo.call(t)}function o(t){return jo.test(Lo.call(t))}function s(t,e){return null===t&&null===e?!0:"object"==typeof t||"object"==typeof e?!1:t===e}function p(t){return!isNaN(parseFloat(t))&&isFinite(t)}function u(t){return t&&"[object Object]"===Lo.call(t)}function c(t,e){return t.replace(/%s/g,function(){return e.shift()})}function l(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];throw t=c(t,n),Error(t)}function d(){Mg.DEBUG&&Oo.apply(null,arguments)}function f(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),To(t,n)}function h(t){for(var e=arguments.length,n=Array(e>1?e-1:0),a=1;e>a;a++)n[a-1]=arguments[a];t=c(t,n),Do[t]||(Do[t]=!0,To(t,n))}function m(){Mg.DEBUG&&f.apply(null,arguments)}function g(){Mg.DEBUG&&h.apply(null,arguments)}function v(t,e,n){var a=b(t,e,n);return a?a[t][n]:null}function b(t,e,n){for(;e;){if(n in e[t])return e;if(e.isolated)return null;e=e.parent}}function y(t){return function(){return t}}function _(t){var e,n,a,r,i,o;for(e=t.split("."),(n=zo[e.length])||(n=x(e.length)),i=[],a=function(t,n){return t?"*":e[n]},r=n.length;r--;)o=n[r].map(a).join("."),i.hasOwnProperty(o)||(i.push(o),i[o]=!0);return i}function x(t){var e,n,a,r,i,o,s,p,u="";if(!zo[t]){for(a=[];u.length=i;i+=1){for(n=i.toString(2);n.lengtho;o++)p.push(r(n[o]));a[i]=p}zo[t]=a}return zo[t]}function w(t,e,n,a){var r=t[e];if(!r||!r.equalsOrStartsWith(a)&&r.equalsOrStartsWith(n))return t[e]=r?r.replace(n,a):a,!0}function k(t){var e=t.slice(2);return"i"===t[1]&&p(e)?+e:e}function S(t){return null==t?t:(Ko.hasOwnProperty(t)||(Ko[t]=new Qo(t)),Ko[t])}function E(t,e){function n(e,n){var a,r,o;return n.isRoot?o=[].concat(Object.keys(t.viewmodel.data),Object.keys(t.viewmodel.mappings),Object.keys(t.viewmodel.computations)):(a=t.viewmodel.wrapped[n.str],r=a?a.get():t.viewmodel.get(n),o=r?Object.keys(r):null),o&&o.forEach(function(t){"_ractive"===t&&i(r)||e.push(n.join(t))}),e}var a,r,o;for(a=e.str.split("."),o=[$o];r=a.shift();)"*"===r?o=o.reduce(n,[]):o[0]===$o?o[0]=S(r):o=o.map(C(r));return o}function C(t){return function(e){return e.join(t)}}function P(t){return t?t.replace(Wo,".$1"):""}function A(t,e,n){if("string"!=typeof e||!p(n))throw Error("Bad arguments");var a=void 0,r=void 0;if(/\*/.test(e))return r={},E(t,S(P(e))).forEach(function(e){var a=t.viewmodel.get(e);if(!p(a))throw Error(Xo);r[e.str]=a+n}),t.set(r);if(a=t.get(e),!p(a))throw Error(Xo);return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function T(t){this.event=t,this.method="on"+t,this.deprecate=as[t]}function R(t,e){var n=t.indexOf(e);-1===n&&t.push(e)}function M(t,e){for(var n=0,a=t.length;a>n;n++)if(t[n]==e)return!0;return!1}function L(t,e){var n;if(!i(t)||!i(e))return!1;if(t.length!==e.length)return!1;for(n=t.length;n--;)if(t[n]!==e[n])return!1;return!0}function j(t){return"string"==typeof t?[t]:void 0===t?[]:t}function D(t){return t[t.length-1]}function N(t,e){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}function F(t){for(var e=[],n=t.length;n--;)e[n]=t[n];return e}function I(t){setTimeout(t,0)}function B(t,e){return function(){for(var n;n=t.shift();)n(e)}}function q(t,e,n,a){var r;if(e===t)throw new TypeError("A promise's fulfillment handler cannot return the same promise");if(e instanceof rs)e.then(n,a);else if(!e||"object"!=typeof e&&"function"!=typeof e)n(e);else{try{r=e.then}catch(i){return void a(i)}if("function"==typeof r){var o,s,p;s=function(e){o||(o=!0,q(t,e,n,a))},p=function(t){o||(o=!0,a(t))};try{r.call(e,s,p)}catch(i){if(!o)return a(i),void(o=!0)}}else n(e)}}function U(t,e,n){var a;return e=P(e),"~/"===e.substr(0,2)?(a=S(e.substring(2)),z(t,a.firstKey,n)):"."===e[0]?(a=V(cs(n),e),a&&z(t,a.firstKey,n)):a=G(t,S(e),n),a}function V(t,e){var n;if(void 0!=t&&"string"!=typeof t&&(t=t.str),"."===e)return S(t);if(n=t?t.split("."):[],"../"===e.substr(0,3)){for(;"../"===e.substr(0,3);){if(!n.length)throw Error('Could not resolve reference - too many "../" prefixes');n.pop(),e=e.substring(3)}return n.push(e),S(n.join("."))}return S(t?t+e.replace(/^\.\//,"."):e.replace(/^\.\/?/,""))}function G(t,e,n,a){var r,i,o,s,p;if(e.isRoot)return e;for(i=e.firstKey;n;)if(r=n.context,n=n.parent,r&&(s=!0,o=t.viewmodel.get(r),o&&("object"==typeof o||"function"==typeof o)&&i in o))return r.join(e.str);return W(t.viewmodel,i)?e:t.parent&&!t.isolated&&(s=!0,n=t.component.parentFragment,i=S(i),p=G(t.parent,i,n,!0))?(t.viewmodel.map(i,{origin:t.parent.viewmodel,keypath:p}),e):a||s?void 0:(t.viewmodel.set(e,void 0),e)}function z(t,e){var n;!t.parent||t.isolated||W(t.viewmodel,e)||(e=S(e),(n=G(t.parent,e,t.component.parentFragment,!0))&&t.viewmodel.map(e,{origin:t.parent.viewmodel,keypath:n}))}function W(t,e){return""===e||e in t.data||e in t.computations||e in t.mappings}function H(t){t.teardown()}function K(t){t.unbind()}function Q(t){t.unrender()}function Y(t){t.cancel()}function $(t){t.detach()}function J(t){t.detachNodes()}function X(t){!t.ready||t.outros.length||t.outroChildren||(t.outrosComplete||(t.parent?t.parent.decrementOutros(t):t.detachNodes(),t.outrosComplete=!0),t.intros.length||t.totalChildren||("function"==typeof t.callback&&t.callback(),t.parent&&t.parent.decrementTotal()))}function Z(){for(var t,e,n;fs.ractives.length;)e=fs.ractives.pop(),n=e.viewmodel.applyChanges(),n&&vs.fire(e,n);for(tt(),t=0;t=0;i--)r=t._subs[e[i]],r&&(s=vt(t,r,n,a)&&s);if(Gs.dequeue(t),t.parent&&s){if(o&&t.component){var p=t.component.name+"."+e[e.length-1];e=S(p).wildcardMatches(),n&&(n.component=t)}gt(t.parent,e,n,a)}}function vt(t,e,n,a){var r=null,i=!1;n&&!n._noArg&&(a=[n].concat(a)),e=e.slice();for(var o=0,s=e.length;s>o;o+=1)e[o].apply(t,a)===!1&&(i=!0);return n&&!n._noArg&&i&&(r=n.original)&&(r.preventDefault&&r.preventDefault(),r.stopPropagation&&r.stopPropagation()),!i}function bt(t){var e={args:Array.prototype.slice.call(arguments,1)};zs(this,t,e)}function yt(t){var e;return t=S(P(t)),e=this.viewmodel.get(t,Ks),void 0===e&&this.parent&&!this.isolated&&ls(this,t.str,this.component.parentFragment)&&(e=this.viewmodel.get(t)),e}function _t(e,n){if(!this.fragment.rendered)throw Error("The API has changed - you must call `ractive.render(target[, anchor])` to render your Ractive instance. Once rendered you can use `ractive.insert()`.");if(e=t(e),n=t(n)||null,!e)throw Error("You must specify a valid target to insert into");e.insertBefore(this.detach(),n),this.el=e,(e.__ractive_instances__||(e.__ractive_instances__=[])).push(this),this.detached=null,xt(this)}function xt(t){Ys.fire(t),t.findAllComponents("*").forEach(function(t){xt(t.instance)})}function wt(t,e,n){var a,r;return t=S(P(t)),a=this.viewmodel.get(t),i(a)&&i(e)?(r=bs.start(this,!0),this.viewmodel.merge(t,a,e,n),bs.end(),r):this.set(t,e,n&&n.complete)}function kt(t,e){var n,a;return n=E(t,e),a={},n.forEach(function(e){a[e.str]=t.get(e.str)}),a}function St(t,e,n,a){var r,i,o;e=S(P(e)),a=a||cp,e.isPattern?(r=new pp(t,e,n,a),t.viewmodel.patternObservers.push(r),i=!0):r=new Zs(t,e,n,a),r.init(a.init),t.viewmodel.register(e,r,i?"patternObservers":"observers"),r.ready=!0;var s={cancel:function(){var n;o||(i?(n=t.viewmodel.patternObservers.indexOf(r),t.viewmodel.patternObservers.splice(n,1),t.viewmodel.unregister(e,r,"patternObservers")):t.viewmodel.unregister(e,r,"observers"),o=!0)}};return t._observers.push(s),s}function Et(t,e,n){var a,r,i,o;if(u(t)){n=e,r=t,a=[];for(t in r)r.hasOwnProperty(t)&&(e=r[t],a.push(this.observe(t,e,n)));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}if("function"==typeof t)return n=e,e=t,t="",up(this,t,e,n);if(i=t.split(" "),1===i.length)return up(this,t,e,n);for(a=[],o=i.length;o--;)t=i[o],t&&a.push(up(this,t,e,n));return{cancel:function(){for(;a.length;)a.pop().cancel()}}}function Ct(t,e,n){var a=this.observe(t,function(){e.apply(this,arguments),a.cancel()},{init:!1,defer:n&&n.defer});return a}function Pt(t,e){var n,a=this;if(t)n=t.split(" ").map(fp).filter(hp),n.forEach(function(t){var n,r;(n=a._subs[t])&&(e?(r=n.indexOf(e),-1!==r&&n.splice(r,1)):a._subs[t]=[])});else for(t in this._subs)delete this._subs[t];return this}function At(t,e){var n,a,r,i=this;if("object"==typeof t){n=[];for(a in t)t.hasOwnProperty(a)&&n.push(this.on(a,t[a]));return{cancel:function(){for(var t;t=n.pop();)t.cancel()}}}return r=t.split(" ").map(fp).filter(hp),r.forEach(function(t){(i._subs[t]||(i._subs[t]=[])).push(e)}),{cancel:function(){return i.off(t,e)}}}function Ot(t,e){var n=this.on(t,function(){e.apply(this,arguments),n.cancel()});return n}function Tt(t,e,n){var a,r,i,o,s,p,u=[];if(a=Rt(t,e,n),!a)return null;for(r=t.length,s=a.length-2-a[1],i=Math.min(r,a[0]),o=i+a[1],p=0;i>p;p+=1)u.push(p);for(;o>p;p+=1)u.push(-1);for(;r>p;p+=1)u.push(p+s);return 0!==s?u.touchedFrom=a[0]:u.touchedFrom=t.length,u}function Rt(t,e,n){switch(e){case"splice":for(void 0!==n[0]&&n[0]<0&&(n[0]=t.length+Math.max(n[0],-t.length));n.length<2;)n.push(0);return n[1]=Math.min(n[1],t.length-n[0]),n;case"sort":case"reverse":return null;case"pop":return t.length?[t.length-1,1]:[0,0];case"push":return[t.length,0].concat(n);case"shift":return[0,t.length?1:0];case"unshift":return[0,0].concat(n)}}function Mt(e,n){var a,r,i,o=this;if(i=this.transitionsEnabled,this.noIntro&&(this.transitionsEnabled=!1),a=bs.start(this,!0),bs.scheduleTask(function(){return Rp.fire(o)},!0),this.fragment.rendered)throw Error("You cannot call ractive.render() on an already rendered instance! Call ractive.unrender() first");if(e=t(e)||this.el,n=t(n)||this.anchor,this.el=e,this.anchor=n,!this.append&&e){var s=e.__ractive_instances__;s&&s.length&&Lt(s),e.innerHTML=""}return this.cssId&&Op.apply(),e&&((r=e.__ractive_instances__)?r.push(this):e.__ractive_instances__=[this],n?e.insertBefore(this.fragment.render(),n):e.appendChild(this.fragment.render())),bs.end(),this.transitionsEnabled=i,a.then(function(){return Mp.fire(o)})}function Lt(t){t.splice(0,t.length).forEach(H)}function jt(t,e){for(var n=t.slice(),a=e.length;a--;)~n.indexOf(e[a])||n.push(e[a]);return n}function Dt(t,e){var n,a,r;return a='[data-ractive-css~="{'+e+'}"]',r=function(t){var e,n,r,i,o,s,p,u=[];for(e=[];n=Ip.exec(t);)e.push({str:n[0],base:n[1],modifiers:n[2]});for(i=e.map(Ft),p=e.length;p--;)s=i.slice(),r=e[p],s[p]=r.base+a+r.modifiers||"",o=i.slice(),o[p]=a+" "+o[p],u.push(s.join(" "),o.join(" "));return u.join(", ")},n=qp.test(t)?t.replace(qp,a):t.replace(Fp,"").replace(Np,function(t,e){var n,a;return Bp.test(e)?t:(n=e.split(",").map(Nt),a=n.map(r).join(", ")+" ",t.replace(e,a))})}function Nt(t){return t.trim?t.trim():t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ft(t){return t.str}function It(t){t&&t.constructor!==Object&&("function"==typeof t||("object"!=typeof t?l("data option must be an object or a function, `"+t+"` is not valid"):m("If supplied, options.data should be a plain JavaScript object - using a non-POJO as the root object may work, but is discouraged")))}function Bt(t,e){It(e);var n="function"==typeof t,a="function"==typeof e;return e||n||(e={}),n||a?function(){var r=a?qt(e,this):e,i=n?qt(t,this):t;return Ut(r,i)}:Ut(e,t)}function qt(t,e){var n=t.call(e);if(n)return"object"!=typeof n&&l("Data function must return an object"),n.constructor!==Object&&g("Data function returned something other than a plain JavaScript object. This might work, but is strongly discouraged"),n}function Ut(t,e){if(t&&e){for(var n in e)n in t||(t[n]=e[n]);return t}return t||e}function Vt(t){var e=So(Qp);return e.parse=function(e,n){return Gt(e,n||t)},e}function Gt(t,e){if(!Hp)throw Error("Missing Ractive.parse - cannot parse template. Either preparse or use the version that includes the parser");return Hp(t,e||this.options)}function zt(t,e){var n;if(!Xi){if(e&&e.noThrow)return;throw Error("Cannot retrieve template #"+t+" as Ractive is not running in a browser.")}if(Wt(t)&&(t=t.substring(1)),!(n=document.getElementById(t))){if(e&&e.noThrow)return;throw Error("Could not find template element with id #"+t)}if("SCRIPT"!==n.tagName.toUpperCase()){if(e&&e.noThrow)return;throw Error("Template element with id #"+t+", must be a