Stored Material:
")
var/any = FALSE
for(var/M in materials.materials)
@@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs)
return TRUE
else if(href_list["ejectsheet"])
var/eject_sheet = href_list["ejectsheet"]
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/count = materials.retrieve_sheets(text2num(href_list["eject_amt"]), eject_sheet, drop_location())
var/list/matlist = list()
matlist[eject_sheet] = MINERAL_MATERIAL_AMOUNT
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index 6b03be610d..8204977058 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -22,7 +22,7 @@
if(!T)
return
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
for(var/obj/item/stack/sheet/O in T)
materials.insert_stack(O, O.amount)
@@ -32,7 +32,7 @@
return
var/dat = "
Coin Press"
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
for(var/mat_id in materials.materials)
var/datum/material/M = materials.materials[mat_id]
if(!M.amount && chosen != mat_id)
@@ -65,7 +65,7 @@
if(processing==1)
to_chat(usr, "
The machine is processing.")
return
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
if(href_list["choose"])
if(materials.materials[href_list["choose"]])
chosen = href_list["choose"]
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index f567bd1daf..fd5997d3c4 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -11,7 +11,7 @@
/obj/item/storage/bag/money/Initialize()
. = ..()
- GET_COMPONENT(STR, /datum/component/storage)
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.max_items = 40
STR.max_combined_w_class = 40
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 591fc650b4..4d253a4693 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -151,7 +151,7 @@
message_admins(msg)
to_chat(usr, "
The round is either not ready, or has already finished...")
return
-
+
if(!GLOB.enter_allowed)
to_chat(usr, "
There is an administrative lock on entering the game!")
return
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
index 2f1d48cfa7..156cc304a6 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
@@ -54,6 +54,10 @@
name = "Redpanda"
icon_state = "redpanda"
+/datum/sprite_accessory/mam_body_markings/bat
+ name = "Bat"
+ icon_state = "bat"
+
/datum/sprite_accessory/mam_body_markings/bee
name = "Bee"
icon_state = "bee"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 1496ca030a..ca1253feb1 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -176,6 +176,10 @@
name = "Axolotl"
icon_state = "axolotl"
+/datum/sprite_accessory/mam_ears/bat
+ name = "Bat"
+ icon_state = "bat"
+
/datum/sprite_accessory/mam_ears/bear
name = "Bear"
icon_state = "bear"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
index 7252f85324..be2ab152a8 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm
@@ -194,6 +194,10 @@
name = "Mammal, Short ALT"
icon_state = "scanidalt"
+/datum/sprite_accessory/mam_snouts/scanidalt2
+ name = "Mammal, Short ALT 2"
+ icon_state = "scanidalt2"
+
/datum/sprite_accessory/mam_snouts/wolf
name = "Mammal, Thick"
icon_state = "wolf"
@@ -306,6 +310,10 @@
name = "Mammal, Short ALT (Top)"
icon_state = "fscanidalt"
+/datum/sprite_accessory/mam_snouts/fscanidalt2
+ name = "Mammal, Short ALT 2 (Top)"
+ icon_state = "fscanidalt2"
+
/datum/sprite_accessory/mam_snouts/fwolf
name = "Mammal, Thick (Top)"
icon_state = "fwolf"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index 3975f7bafc..33b174afa4 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -114,6 +114,26 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
+/datum/sprite_accessory/mam_tails/batl
+ name = "Bat (Long)"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ icon_state = "batl"
+
+/datum/sprite_accessory/mam_tails_animated/batl
+ name = "Bat (Long)"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ icon_state = "batl"
+
+/datum/sprite_accessory/mam_tails/bats
+ name = "Bat (Short)"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ icon_state = "bats"
+
+/datum/sprite_accessory/mam_tails_animated/bats
+ name = "Bat (Short)"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ icon_state = "bats"
+
/datum/sprite_accessory/tails/human/bee
name = "Bee"
icon_state = "bee"
@@ -469,6 +489,22 @@
name = "Axolotl"
icon_state = "axolotl"
+/datum/sprite_accessory/mam_tails/batl
+ name = "Bat (Long)"
+ icon_state = "batl"
+
+/datum/sprite_accessory/mam_tails_animated/batl
+ name = "Bat (Long)"
+ icon_state = "batl"
+
+/datum/sprite_accessory/mam_tails/bats
+ name = "Bat (Short)"
+ icon_state = "bats"
+
+/datum/sprite_accessory/mam_tails_animated/bats
+ name = "Bat (Short)"
+ icon_state = "bats"
+
/datum/sprite_accessory/mam_tails/bee
name = "Bee"
icon_state = "bee"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
index 6c42177c3c..46a123c6bb 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -28,74 +28,14 @@
locked = TRUE
// Decorative wings
+
/datum/sprite_accessory/deco_wings
icon = 'icons/mob/wings.dmi'
color_src = WINGCOLOR
-/datum/sprite_accessory/deco_wings/plain
- name = "Plain"
- icon_state = "plain"
-
-/datum/sprite_accessory/deco_wings/monarch
- name = "Monarch"
- icon_state = "monarch"
-
-/datum/sprite_accessory/deco_wings/luna
- name = "Luna"
- icon_state = "luna"
-
-/datum/sprite_accessory/deco_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
-
-/datum/sprite_accessory/deco_wings/reddish
- name = "Reddish"
- icon_state = "redish"
-
-/datum/sprite_accessory/deco_wings/royal
- name = "Royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/deco_wings/gothic
- name = "Gothic"
- icon_state = "gothic"
-
-/datum/sprite_accessory/deco_wings/lovers
- name = "Lovers"
- icon_state = "lovers"
-
-/datum/sprite_accessory/deco_wings/whitefly
- name = "White Fly"
- icon_state = "whitefly"
-
-/datum/sprite_accessory/deco_wings/punished
- name = "Burnt Off"
- icon_state = "punished"
- locked = TRUE
-
-/datum/sprite_accessory/deco_wings/firewatch
- name = "Firewatch"
- icon_state = "firewatch"
-
-/datum/sprite_accessory/deco_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
-/datum/sprite_accessory/deco_wings/poison
- name = "Poison"
- icon_state = "poison"
-
-/datum/sprite_accessory/deco_wings/ragged
- name = "Ragged"
- icon_state = "ragged"
-
-/datum/sprite_accessory/deco_wings/moonfly
- name = "Moon Fly"
- icon_state = "moonfly"
-
-/datum/sprite_accessory/deco_wings/snow
- name = "Snow"
- icon_state = "snow"
+/datum/sprite_accessory/deco_wings/none
+ name = "None"
+ icon_state = "none"
/datum/sprite_accessory/deco_wings/angel
name = "Angel"
@@ -105,6 +45,10 @@
center = TRUE
dimension_y = 34
+/datum/sprite_accessory/deco_wings/bat
+ name = "Bat"
+ icon_state = "bat"
+
/datum/sprite_accessory/deco_wings/bee
name = "Bee"
icon_state = "bee"
@@ -113,18 +57,73 @@
name = "Fairy"
icon_state = "fairy"
-/datum/sprite_accessory/deco_wings/bat
- name = "Bat"
- icon_state = "bat"
-
/datum/sprite_accessory/deco_wings/feathery
name = "Feathery"
icon_state = "feathery"
-/datum/sprite_accessory/deco_wings/none
- name = "None"
- icon_state = "none"
+/datum/sprite_accessory/deco_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+/datum/sprite_accessory/deco_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
+/datum/sprite_accessory/deco_wings/firewatch
+ name = "Firewatch"
+ icon_state = "firewatch"
+
+/datum/sprite_accessory/deco_wings/gothic
+ name = "Gothic"
+ icon_state = "gothic"
+
+/datum/sprite_accessory/deco_wings/lovers
+ name = "Lovers"
+ icon_state = "lovers"
+
+/datum/sprite_accessory/deco_wings/luna
+ name = "Luna"
+ icon_state = "luna"
+
+/datum/sprite_accessory/deco_wings/monarch
+ name = "Monarch"
+ icon_state = "monarch"
+
+/datum/sprite_accessory/deco_wings/moonfly
+ name = "Moon Fly"
+ icon_state = "moonfly"
+
+/datum/sprite_accessory/deco_wings/plain
+ name = "Plain"
+ icon_state = "plain"
+
+/datum/sprite_accessory/deco_wings/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/deco_wings/punished
+ name = "Burnt Off"
+ icon_state = "punished"
+
+/datum/sprite_accessory/deco_wings/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/deco_wings/reddish
+ name = "Reddish"
+ icon_state = "redish"
+
+/datum/sprite_accessory/deco_wings/royal
+ name = "Royal"
+ icon_state = "royal"
+
+/datum/sprite_accessory/deco_wings/snow
+ name = "Snow"
+ icon_state = "snow"
+
+/datum/sprite_accessory/deco_wings/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
//INSECT WINGS
@@ -136,69 +135,9 @@
name = "None"
icon_state = "none"
-/datum/sprite_accessory/insect_wings/plain
- name = "Plain"
- icon_state = "plain"
-
-/datum/sprite_accessory/insect_wings/monarch
- name = "Monarch"
- icon_state = "monarch"
-
-/datum/sprite_accessory/insect_wings/luna
- name = "Luna"
- icon_state = "luna"
-
-/datum/sprite_accessory/insect_wings/atlas
- name = "Atlas"
- icon_state = "atlas"
-
-/datum/sprite_accessory/insect_wings/reddish
- name = "Reddish"
- icon_state = "redish"
-
-/datum/sprite_accessory/insect_wings/royal
- name = "Royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/insect_wings/gothic
- name = "Gothic"
- icon_state = "gothic"
-
-/datum/sprite_accessory/insect_wings/lovers
- name = "Lovers"
- icon_state = "lovers"
-
-/datum/sprite_accessory/insect_wings/whitefly
- name = "White Fly"
- icon_state = "whitefly"
-
-/datum/sprite_accessory/insect_wings/punished
- name = "Burnt Off"
- icon_state = "punished"
-
-/datum/sprite_accessory/insect_wings/firewatch
- name = "Firewatch"
- icon_state = "firewatch"
-
-/datum/sprite_accessory/insect_wings/deathhead
- name = "Deathshead"
- icon_state = "deathhead"
-
-/datum/sprite_accessory/insect_wings/poison
- name = "Poison"
- icon_state = "poison"
-
-/datum/sprite_accessory/insect_wings/ragged
- name = "Ragged"
- icon_state = "ragged"
-
-/datum/sprite_accessory/insect_wings/moonfly
- name = "Moon Fly"
- icon_state = "moonfly"
-
-/datum/sprite_accessory/insect_wings/snow
- name = "Snow"
- icon_state = "snow"
+/datum/sprite_accessory/insect_wings/bat
+ name = "Bat"
+ icon_state = "bat"
/datum/sprite_accessory/insect_wings/bee
name = "Bee"
@@ -208,10 +147,70 @@
name = "Fairy"
icon_state = "fairy"
-/datum/sprite_accessory/insect_wings/bat
- name = "Bat"
- icon_state = "bat"
-
/datum/sprite_accessory/insect_wings/feathery
name = "Feathery"
icon_state = "feathery"
+
+/datum/sprite_accessory/insect_wings/atlas
+ name = "Atlas"
+ icon_state = "atlas"
+
+/datum/sprite_accessory/insect_wings/deathhead
+ name = "Deathshead"
+ icon_state = "deathhead"
+
+/datum/sprite_accessory/insect_wings/firewatch
+ name = "Firewatch"
+ icon_state = "firewatch"
+
+/datum/sprite_accessory/insect_wings/gothic
+ name = "Gothic"
+ icon_state = "gothic"
+
+/datum/sprite_accessory/insect_wings/lovers
+ name = "Lovers"
+ icon_state = "lovers"
+
+/datum/sprite_accessory/insect_wings/luna
+ name = "Luna"
+ icon_state = "luna"
+
+/datum/sprite_accessory/insect_wings/monarch
+ name = "Monarch"
+ icon_state = "monarch"
+
+/datum/sprite_accessory/insect_wings/moonfly
+ name = "Moon Fly"
+ icon_state = "moonfly"
+
+/datum/sprite_accessory/insect_wings/plain
+ name = "Plain"
+ icon_state = "plain"
+
+/datum/sprite_accessory/insect_wings/poison
+ name = "Poison"
+ icon_state = "poison"
+
+/datum/sprite_accessory/insect_wings/punished
+ name = "Burnt Off"
+ icon_state = "punished"
+
+/datum/sprite_accessory/insect_wings/ragged
+ name = "Ragged"
+ icon_state = "ragged"
+
+/datum/sprite_accessory/insect_wings/reddish
+ name = "Reddish"
+ icon_state = "redish"
+
+/datum/sprite_accessory/insect_wings/royal
+ name = "Royal"
+ icon_state = "royal"
+
+/datum/sprite_accessory/insect_wings/snow
+ name = "Snow"
+ icon_state = "snow"
+
+/datum/sprite_accessory/insect_wings/whitefly
+ name = "White Fly"
+ icon_state = "whitefly"
\ No newline at end of file
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 625a923fe1..41d3d4e158 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -40,7 +40,7 @@
if(iscyborg(user) && user.has_buckled_mobs())
var/mob/living/silicon/robot/R = user
- GET_COMPONENT_FROM(riding_datum, /datum/component/riding, R)
+ var/datum/component/riding/riding_datum = R.GetComponent(/datum/component/riding)
if(riding_datum)
for(var/mob/M in R.buckled_mobs)
riding_datum.force_dismount(M)
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 760fb7a29f..e77a91332e 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -468,3 +468,6 @@
bodyparts += BP
hand_bodyparts[i] = BP
..() //Don't redraw hands until we have organs for them
+
+/mob/canReachInto(atom/user, atom/target, list/next, view_only, obj/item/tool)
+ return ..() && (user == src)
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index ca1a961a92..757aadaea1 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -2,6 +2,9 @@
BLOOD SYSTEM
****************************************************/
+#define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations.
+
+
/mob/living/carbon/human/proc/suppress_bloodloss(amount)
if(bleedsuppress)
return
@@ -30,6 +33,9 @@
bleed_rate = 0
return
+ if(bleed_rate <= 0)
+ bleed_rate = 0
+
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
//Blood regeneration if there is some space
@@ -80,6 +86,9 @@
var/obj/item/bodypart/BP = X
var/brutedamage = BP.brute_dam
+ if(BP.status == BODYPART_ROBOTIC) //for the moment, synth limbs won't bleed, but soon, my pretty.
+ continue
+
//We want an accurate reading of .len
listclearnulls(BP.embedded_objects)
temp_bleed += 0.5*BP.embedded_objects.len
@@ -87,7 +96,7 @@
if(brutedamage >= 20)
temp_bleed += (brutedamage * 0.013)
- bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
+ bleed_rate = max(bleed_rate - 0.50, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
bleed(bleed_rate)
@@ -105,9 +114,11 @@
/mob/living/carbon/human/bleed(amt)
amt *= physiology.bleed_mod
if(!(NOBLOOD in dna.species.species_traits))
- ..()
-
-
+ .=..()
+ if(dna.species.exotic_blood && .) // Do we have exotic blood, and have we left any on the ground?
+ var/datum/reagent/R = GLOB.chemical_reagents_list[get_blood_id()]
+ if(istype(R) && isturf(loc))
+ R.reaction_turf(get_turf(src), amt * EXOTIC_BLEED_MULTIPLIER)
/mob/living/proc/restore_blood()
blood_volume = initial(blood_volume)
@@ -123,16 +134,16 @@
//Gets blood from mob to a container or other mob, preserving all data in it.
/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced)
if(!blood_volume || !AM.reagents)
- return 0
+ return FALSE
if(blood_volume < (BLOOD_VOLUME_BAD * blood_ratio) && !forced)
- return 0
+ return FALSE
if(blood_volume < amount)
amount = blood_volume
var/blood_id = get_blood_id()
if(!blood_id)
- return 0
+ return FALSE
blood_volume -= amount
@@ -141,29 +152,27 @@
if(iscarbon(AM))
var/mob/living/carbon/C = AM
if(blood_id == C.get_blood_id())//both mobs have the same blood substance
- if(blood_id == "blood") //normal blood
+ if(blood_id == "blood" || blood_id == "jellyblood") //normal blood
if(blood_data["viruses"])
for(var/thing in blood_data["viruses"])
var/datum/disease/D = thing
if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS))
continue
C.ForceContractDisease(D)
- if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)))
- C.reagents.add_reagent("toxin", amount * 0.5)
- return 1
+ //This used to inject oof ouch results, but since we add the reagent, and the reagent causes oof ouch on mob life... why double dip?
C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAXIMUM)
- return 1
+ return TRUE
AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature)
- return 1
+ return TRUE
/mob/living/proc/get_blood_data(blood_id)
return
/mob/living/carbon/get_blood_data(blood_id)
- if(blood_id == "blood") //actual blood reagent
+ if(blood_id == "blood" || blood_id == "jellyblood") //actual blood reagent
var/blood_data = list()
//set the blood data
blood_data["donor"] = src
@@ -174,6 +183,7 @@
blood_data["viruses"] += D.Copy()
blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0)
+ blood_data["bloodcolor"] = bloodtype_to_color(dna.blood_type)
if(disease_resistances && disease_resistances.len)
blood_data["resistances"] = disease_resistances.Copy()
var/list/temp_chem = list()
@@ -206,21 +216,6 @@
if(istype(ling))
blood_data["changeling_loudness"] = ling.loudfactor
return blood_data
- if(blood_id == "slimejelly") //Just so MKUltra works. Takes the minimum required data. Sishen is testing if this breaks stuff.
- var/blood_data = list()
- if(mind)
- blood_data["mind"] = mind
- else if(last_mind)
- blood_data["mind"] = last_mind
- if(ckey)
- blood_data["ckey"] = ckey
- else if(last_mind)
- blood_data["ckey"] = ckey(last_mind.key)
- blood_data["gender"] = gender
- blood_data["real_name"] = real_name
- return blood_data
-
-
//get the id of the substance this mob use as blood.
/mob/proc/get_blood_id()
@@ -234,12 +229,15 @@
if(!(HAS_TRAIT(src, TRAIT_NOCLONE)))
return "blood"
-/mob/living/carbon/human/get_blood_id()
- if(dna.species.exotic_blood)
+/mob/living/carbon/get_blood_id()
+ if(isjellyperson(src))
+ return "jellyblood"
+ if(dna?.species?.exotic_blood)
return dna.species.exotic_blood
else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE)))
return
- return "blood"
+ else
+ return "blood"
// This is has more potential uses, and is probably faster than the old proc.
/proc/get_safe_blood(bloodtype)
@@ -248,16 +246,21 @@
return
var/static/list/bloodtypes_safe = list(
- "A-" = list("A-", "O-"),
- "A+" = list("A-", "A+", "O-", "O+"),
- "B-" = list("B-", "O-"),
- "B+" = list("B-", "B+", "O-", "O+"),
- "AB-" = list("A-", "B-", "O-", "AB-"),
- "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"),
- "O-" = list("O-"),
- "O+" = list("O-", "O+"),
- "L" = list("L"),
- "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U")
+ "A-" = list("A-", "O-", "SY"),
+ "A+" = list("A-", "A+", "O-", "O+", "SY"),
+ "B-" = list("B-", "O-", "SY"),
+ "B+" = list("B-", "B+", "O-", "O+", "SY"),
+ "AB-" = list("A-", "B-", "O-", "AB-", "SY"),
+ "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "SY"),
+ "O-" = list("O-","SY"),
+ "O+" = list("O-", "O+","SY"),
+ "L" = list("L","SY"),
+ "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U","SY"),
+ "HF" = list("HF", "SY"),
+ "X*" = list("X*", "SY"),
+ "SY" = list("SY"),
+ "GEL" = list("GEL","SY"),
+ "BUG" = list("BUG", "SY")
)
var/safe = bloodtypes_safe[bloodtype]
@@ -266,7 +269,7 @@
//to add a splatter of blood or other mob liquid.
/mob/living/proc/add_splatter_floor(turf/T, small_drip)
- if(get_blood_id() != "blood")
+ if(get_blood_id() == null)
return
if(!T)
T = get_turf(src)
@@ -280,24 +283,27 @@
drop.drips++
drop.add_overlay(pick(drop.random_icon_states))
drop.transfer_mob_blood_dna(src)
+ drop.update_icon()
return
else
- temp_blood_DNA = drop.return_blood_DNA() //we transfer the dna from the drip to the splatter
+ temp_blood_DNA = list()
+ temp_blood_DNA |= drop.blood_DNA.Copy() //we transfer the dna from the drip to the splatter
qdel(drop)//the drip is replaced by a bigger splatter
else
drop = new(T, get_static_viruses())
drop.transfer_mob_blood_dna(src)
+ drop.update_icon()
return
// Find a blood decal or create a new one.
- var/obj/effect/decal/cleanable/blood/B = locate() in T
+ var/obj/effect/decal/cleanable/blood/splats/B = locate() in T
if(!B)
- B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
- if (B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
+ B = new /obj/effect/decal/cleanable/blood/splats(T, get_static_viruses())
+ if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
B.bloodiness += BLOOD_AMOUNT_PER_DECAL
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
if(temp_blood_DNA)
- B.add_blood_DNA(temp_blood_DNA)
+ B.blood_DNA |= temp_blood_DNA
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip)
if(!(NOBLOOD in dna.species.species_traits))
@@ -306,10 +312,10 @@
/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip)
if(!T)
T = get_turf(src)
- var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents
+ var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents
if(!B)
B = new(T)
- B.add_blood_DNA(list("UNKNOWN DNA" = "X*"))
+ B.blood_DNA["UNKNOWN DNA"] = "X*"
/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip)
if(!T)
@@ -318,6 +324,44 @@
if(!B)
B = new(T)
+/mob/living/proc/add_splash_floor(turf/T)
+ if(get_blood_id() == null)
+ return
+ if(!T)
+ T = get_turf(src)
+
+ var/list/temp_blood_DNA
+
+ // Find a blood decal or create a new one.
+ var/obj/effect/decal/cleanable/blood/B = locate() in T
+ if(!B)
+ B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses())
+ if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
+ B.bloodiness += BLOOD_AMOUNT_PER_DECAL
+ B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
+ src.transfer_blood_to(B, 10) //very heavy bleeding, should logically leave larger pools
+ if(temp_blood_DNA)
+ B.blood_DNA |= temp_blood_DNA
+
+/mob/living/carbon/human/add_splash_floor(turf/T)
+ if(!(NOBLOOD in dna.species.species_traits))
+ ..()
+
+/mob/living/carbon/alien/add_splash_floor(turf/T)
+ if(!T)
+ T = get_turf(src)
+ var/obj/effect/decal/cleanable/blood/splatter/B = locate() in T.contents
+ if(!B)
+ B = new(T)
+ B.blood_DNA["UNKNOWN DNA"] = "X*"
+
+/mob/living/silicon/robot/add_splash_floor(turf/T)
+ if(!T)
+ T = get_turf(src)
+ var/obj/effect/decal/cleanable/oil/B = locate() in T.contents
+ if(!B)
+ B = new(T)
+
//This is a terrible way of handling it.
/mob/living/proc/ResetBloodVol()
if(ishuman(src))
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index cc11c0e8bb..d1ace36b8c 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -147,13 +147,12 @@
/mob/living/proc/exit_blood_effect(obj/effect/decal/cleanable/B)
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
//Makes the mob have the color of the blood pool it came out of
- var/newcolor = rgb(149, 10, 10)
- if(istype(B, /obj/effect/decal/cleanable/xenoblood))
- newcolor = rgb(43, 186, 0)
+ var/newcolor = BLOOD_COLOR_HUMAN
+ if(istype(B, /obj/effect/decal/cleanable/blood/xeno))
+ newcolor = BLOOD_COLOR_XENO
add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY)
// but only for a few seconds
- spawn(30)
- remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, newcolor)
+ addtimer(CALLBACK(src, /atom/.proc/remove_atom_colour, TEMPORARY_COLOUR_PRIORITY, newcolor), 6 SECONDS)
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
if(src.notransform)
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 97b29ca4e1..1b2944c1f6 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -10,7 +10,10 @@
/mob/living/brain/Initialize()
. = ..()
create_dna(src)
- stored_dna.initialize_dna(random_blood_type())
+ if(stored_dna.blood_type)
+ stored_dna.initialize_dna(stored_dna.blood_type)
+ else
+ stored_dna.initialize_dna(random_blood_type())
if(isturf(loc)) //not spawned in an MMI or brain organ (most likely adminspawned)
var/obj/item/organ/brain/OB = new(loc) //we create a new brain organ for it.
OB.brainmob = src
@@ -21,6 +24,8 @@
if(!stored_dna.species)
var/rando_race = pick(GLOB.roundstart_races)
stored_dna.species = new rando_race()
+ if(stored_dna.species.exotic_bloodtype)
+ stored_dna.blood_type = stored_dna.species.exotic_bloodtype
/mob/living/brain/Destroy()
if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting.
diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm
index 9e0bb0428b..8a70ccc4cb 100644
--- a/code/modules/mob/living/brain/posibrain.dm
+++ b/code/modules/mob/living/brain/posibrain.dm
@@ -92,6 +92,17 @@ GLOBAL_VAR(posibrain_notify_cooldown)
if(posi_ask == "No" || QDELETED(src))
return
transfer_personality(user)
+ latejoin_remove()
+
+/obj/item/mmi/posibrain/Destroy()
+ latejoin_remove()
+ return ..()
+
+/obj/item/mmi/posibrain/proc/latejoin_remove()
+ GLOB.poi_list -= src
+ LAZYREMOVE(GLOB.mob_spawners[name], src)
+ if(!LAZYLEN(GLOB.mob_spawners[name]))
+ GLOB.mob_spawners -= name
/obj/item/mmi/posibrain/transfer_identity(mob/living/carbon/C)
name = "[initial(name)] ([C])"
@@ -163,6 +174,8 @@ GLOBAL_VAR(posibrain_notify_cooldown)
brainmob.container = src
if(autoping)
ping_ghosts("created", TRUE)
+ GLOB.poi_list |= src
+ LAZYADD(GLOB.mob_spawners[name], src)
/obj/item/mmi/posibrain/attackby(obj/item/O, mob/user)
return
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index c8ece3f656..3ad7acfcdc 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -20,7 +20,7 @@
var/heat_protection = 0.5
var/leaping = 0
- gib_type = /obj/effect/decal/cleanable/xenoblood/xgibs
+ gib_type = /obj/effect/decal/cleanable/blood/gibs/xeno
unique_name = 1
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index ce2b4401e9..77300e1435 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -2,7 +2,7 @@
if(with_bodyparts)
new /obj/effect/gibspawner/xeno(drop_location())
else
- new /obj/effect/gibspawner/xenobodypartless(drop_location())
+ new /obj/effect/gibspawner/xeno/bodypartless(drop_location())
/mob/living/carbon/alien/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index 323bd408cf..ef6a372f9e 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -95,8 +95,14 @@ Doesn't work on other aliens/AI.*/
var/mob/living/M = input("Select who to whisper to:","Whisper to?",null) as null|mob in options
if(!M)
return 0
+ if(M.anti_magic_check(FALSE, FALSE, TRUE, 0))
+ to_chat(user, "
As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.")
+ return FALSE
var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
if(msg)
+ if(M.anti_magic_check(FALSE, FALSE, TRUE, 0))
+ to_chat(user, "
As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.")
+ return
log_directed_talk(user, M, msg, LOG_SAY, tag="alien whisper")
to_chat(M, "
You hear a strange, alien voice in your head...[msg]")
to_chat(user, "
You said: \"[msg]\" to [M]")
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index e16be71ccf..e7cf70f441 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -10,7 +10,7 @@
if(with_bodyparts)
new /obj/effect/gibspawner/larva(drop_location())
else
- new /obj/effect/gibspawner/larvabodypartless(drop_location())
+ new /obj/effect/gibspawner/larva/bodypartless(drop_location())
/mob/living/carbon/alien/larva/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l")
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index df1be454ee..7b6962794a 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -89,6 +89,8 @@
owner.adjustFireLoss(-heal_amt)
owner.adjustOxyLoss(-heal_amt)
owner.adjustCloneLoss(-heal_amt)
+ if(owner.blood_volume && (owner.blood_volume < BLOOD_VOLUME_NORMAL))
+ owner.blood_volume += 5
else
owner.adjustPlasma(plasma_rate * 0.1)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 263edf42c2..88aa5f86d0 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -905,7 +905,7 @@
/mob/living/carbon/do_after_coefficent()
. = ..()
- GET_COMPONENT_FROM(mood, /datum/component/mood, src) //Currently, only carbons or higher use mood, move this once that changes.
+ var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) //Currently, only carbons or higher use mood, move this once that changes.
if(mood)
switch(mood.sanity) //Alters do_after delay based on how sane you are
if(SANITY_INSANE to SANITY_DISTURBED)
@@ -947,7 +947,7 @@
return TRUE
if(HAS_TRAIT(src, TRAIT_DUMB))
return TRUE
- GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ var/datum/component/mood/mood = src.GetComponent(/datum/component/mood)
if(mood)
if(mood.sanity < SANITY_UNSTABLE)
return TRUE
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index bc64c8303b..b0e9b808df 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -287,7 +287,7 @@
"
You give [H] a pat on the head to make [p_them()] feel better!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
if(HAS_TRAIT(M, TRAIT_FRIENDLY))
- GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
if (mood.sanity >= SANITY_GREAT)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M)
else if (mood.sanity >= SANITY_DISTURBED)
@@ -322,7 +322,7 @@
"
You hug [src] to make [p_them()] feel better!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug)
if(HAS_TRAIT(M, TRAIT_FRIENDLY))
- GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
if (mood.sanity >= SANITY_GREAT)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M)
else if (mood.sanity >= SANITY_DISTURBED)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 41daf642f2..a1184613fe 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -49,6 +49,7 @@
//Gets filled up in create_bodyparts()
var/list/hand_bodyparts = list() //a collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems)
+ var/list/leg_bodyparts = list()
var/icon_render_key = ""
var/static/list/limb_icon_cache = list()
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 8e6c888c40..155b0fc7de 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -36,7 +36,7 @@
/mob/living/carbon/Move(NewLoc, direct)
. = ..()
- if(. && mob_has_gravity()) //floating is easy
+ if(. && (movement_type & FLOATING)) //floating is easy
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
nutrition = NUTRITION_LEVEL_FED - 1 //just less than feeling vigorous
else if(nutrition && stat != DEAD)
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index cc0c0d7434..7d1e5320fc 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -1,8 +1,8 @@
-/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE)
+/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
var/hit_percent = (100-blocked)/100
- if(hit_percent <= 0)
+ if(!forced && hit_percent <= 0)
return 0
var/obj/item/bodypart/BP = null
@@ -15,34 +15,35 @@
if(!BP)
BP = bodyparts[1]
+ var/damage_amount = forced ? damage : damage * hit_percent
switch(damagetype)
if(BRUTE)
if(BP)
- if(damage > 0 ? BP.receive_damage(damage * hit_percent, 0) : BP.heal_damage(abs(damage * hit_percent), 0))
+ if(damage > 0 ? BP.receive_damage(damage_amount) : BP.heal_damage(abs(damage_amount), 0))
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
- adjustBruteLoss(damage * hit_percent)
+ adjustBruteLoss(damage_amount, forced = forced)
if(BURN)
if(BP)
- if(damage > 0 ? BP.receive_damage(0, damage * hit_percent) : BP.heal_damage(0, abs(damage * hit_percent)))
+ if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount)))
update_damage_overlays()
else
- adjustFireLoss(damage * hit_percent)
+ adjustFireLoss(damage_amount, forced = forced)
if(TOX)
- adjustToxLoss(damage * hit_percent)
+ adjustToxLoss(damage_amount, forced = forced)
if(OXY)
- adjustOxyLoss(damage * hit_percent)
+ adjustOxyLoss(damage_amount, forced = forced)
if(CLONE)
- adjustCloneLoss(damage * hit_percent)
+ adjustCloneLoss(damage_amount, forced = forced)
if(STAMINA)
if(BP)
- if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent) : BP.heal_damage(0, 0, abs(damage * hit_percent)))
+ if(damage > 0 ? BP.receive_damage(0, 0, damage_amount) : BP.heal_damage(0, 0, abs(damage_amount)))
update_damage_overlays()
else
- adjustStaminaLoss(damage * hit_percent)
+ adjustStaminaLoss(damage_amount, forced = forced)
//citadel code
if(AROUSAL)
- adjustArousalLoss(damage * hit_percent)
+ adjustArousalLoss(damage_amount, forced = forced)
return TRUE
@@ -85,7 +86,7 @@
if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
amount = -amount
if(amount > 0)
- blood_volume -= 5*amount
+ blood_volume -= 3*amount // x5 is too much, x3 should be still penalizing enough.
else
blood_volume -= amount
return ..()
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index c029eac12b..5634d21775 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -93,7 +93,7 @@
msg += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]\n"
msg += common_trait_examine()
- GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ var/datum/component/mood/mood = src.GetComponent(/datum/component/mood)
if(mood)
switch(mood.shown_mood)
if(-INFINITY to MOOD_LEVEL_SAD4)
diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm
index 7641408529..9f6a572fc8 100644
--- a/code/modules/mob/living/carbon/human/damage_procs.dm
+++ b/code/modules/mob/living/carbon/human/damage_procs.dm
@@ -1,5 +1,5 @@
-/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE)
+/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
// depending on the species, it will run the corresponding apply_damage code there
- return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src)
+ return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 64b75bc801..b0c3f61eec 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -5,10 +5,35 @@
new /obj/effect/temp_visual/dust_animation(loc, "dust-h")
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
- if(with_bodyparts)
- new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses())
+ if(isjellyperson(src))
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/slime(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/slime/bodypartless(drop_location(), dna, get_static_viruses())
+
+ if(isipcperson(src))
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/ipc(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/ipc/bodypartless(drop_location(), dna, get_static_viruses())
+
+ if(isxenoperson(src))
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/xeno/xenoperson(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/xeno/xenoperson/bodypartless(drop_location(), dna, get_static_viruses())
+
+ if(islizard(src))
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/lizard(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/lizard/bodypartless(drop_location(), dna, get_static_viruses())
+
else
- new /obj/effect/gibspawner/humanbodypartless(drop_location(), dna, get_static_viruses())
+ if(with_bodyparts)
+ new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses())
+ else
+ new /obj/effect/gibspawner/human/bodypartless(drop_location(), dna, get_static_viruses())
/mob/living/carbon/human/spawn_dust(just_ash = FALSE)
if(just_ash)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 6ebc4f8a32..7b0fb74f44 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/examine(mob/user) //User is the person being examined
+/mob/living/carbon/human/examine(mob/user)
//this is very slightly better than it was because you can use it more places. still can't do \his[src] though.
var/t_He = p_they(TRUE)
var/t_His = p_their(TRUE)
@@ -45,7 +45,7 @@
if(wear_suit)
msg += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)].\n"
//suit/armor storage
- if(s_store)
+ if(s_store && !(SLOT_S_STORE in obscured))
msg += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name].\n"
//back
if(back)
@@ -56,11 +56,10 @@
if(!(I.item_flags & ABSTRACT))
msg += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n"
- GET_COMPONENT(FR, /datum/component/forensics)
//gloves
if(gloves && !(SLOT_GLOVES in obscured))
msg += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands.\n"
- else if(FR && length(FR.blood_DNA))
+ else if(length(blood_DNA))
var/hand_number = get_num_arms(FALSE)
if(hand_number)
msg += "
[t_He] [t_has] [hand_number > 1 ? "" : "a"] blood-stained hand[hand_number > 1 ? "s" : ""]!\n"
@@ -86,7 +85,7 @@
if(wear_mask && !(SLOT_WEAR_MASK in obscured))
msg += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face.\n"
- if (wear_neck && !(SLOT_NECK in obscured))
+ if(wear_neck && !(SLOT_NECK in obscured))
msg += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck.\n"
//eyes
@@ -152,7 +151,7 @@
var/temp = getBruteLoss() //no need to calculate each of these twice
- msg += "
"
+ msg += "" //Everything below gets this span
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/list/disabled = list()
@@ -297,7 +296,7 @@
msg += "[t_He] seem[p_s()] winded.\n"
if (getToxLoss() >= 10)
msg += "[t_He] seem[p_s()] sickly.\n"
- GET_COMPONENT_FROM(mood, /datum/component/mood, src)
+ var/datum/component/mood/mood = src.GetComponent(/datum/component/mood)
if(mood.sanity <= SANITY_DISTURBED)
msg += "[t_He] seem[p_s()] distressed.\n"
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 02e6043462..a737844f10 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -32,7 +32,7 @@
if(CONFIG_GET(flag/disable_stambuffer))
togglesprint()
- AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT = CALLBACK(src, .proc/clean_blood)))
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood)
/mob/living/carbon/human/ComponentInitialize()
@@ -488,7 +488,7 @@
var/counter = 1
while(R.fields[text("com_[]", counter)])
counter++
- R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
[]", allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1)
+ R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
[]", allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer, t1)
to_chat(usr, "Successfully added comment.")
return
to_chat(usr, "Unable to locate a data core entry for this person.")
@@ -689,16 +689,17 @@
if(..())
dropItemToGround(I)
-/mob/living/carbon/human/proc/clean_blood(datum/source, strength)
- if(strength < CLEAN_STRENGTH_BLOOD)
- return
- if(gloves)
- if(SEND_SIGNAL(gloves, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
- update_inv_gloves()
+/mob/living/carbon/human/clean_blood()
+ var/mob/living/carbon/human/H = src
+ if(H.gloves)
+ if(H.gloves.clean_blood())
+ H.update_inv_gloves()
else
- if(bloody_hands)
- bloody_hands = 0
- update_inv_gloves()
+ ..() // Clear the Blood_DNA list
+ if(H.bloody_hands)
+ H.bloody_hands = 0
+ H.update_inv_gloves()
+ update_icons() //apply the now updated overlays to the mob
/mob/living/carbon/human/wash_cream()
if(creamed) //clean both to prevent a rare bug
@@ -945,7 +946,7 @@
return FALSE
/mob/living/carbon/human/proc/clear_shove_slowdown()
- remove_movespeed_modifier(SHOVE_SLOWDOWN_ID)
+ remove_movespeed_modifier(MOVESPEED_ID_SHOVE)
var/active_item = get_active_held_item()
if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE)
@@ -1104,3 +1105,18 @@
/mob/living/carbon/human/species/zombie/krokodil_addict
race = /datum/species/krokodil_addict
+
+/mob/living/carbon/human/species/mammal
+ race = /datum/species/mammal
+
+/mob/living/carbon/human/species/insect
+ race = /datum/species/insect
+
+/mob/living/carbon/human/species/xeno
+ race = /datum/species/xeno
+
+/mob/living/carbon/human/species/ipc
+ race = /datum/species/ipc
+
+/mob/living/carbon/human/species/roundstartslime
+ race = /datum/species/jelly/roundstartslime
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 657c32ba01..b1f11f6463 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -51,6 +51,9 @@
var/bleed_rate = 0 //how much are we bleeding
var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
+ var/blood_state = BLOOD_STATE_NOT_BLOODY
+ var/list/blood_smear = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
+
var/name_override //For temporary visible name changes
var/genital_override = FALSE //Force genitals on things incase of chems
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index b65d62b63b..8bc8866380 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -127,3 +127,9 @@
return FALSE
return .
+/*
+/mob/living/carbon/human/transfer_blood_dna(list/blood_dna)
+ ..()
+ if(blood_dna.len)
+ last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works
+ last_blood_DNA = blood_dna[blood_dna.len]*/
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 6ea9c985e2..4e6f9e0eb9 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -56,20 +56,20 @@
//Bloody footprints
var/turf/T = get_turf(src)
if(S.bloody_shoes && S.bloody_shoes[S.blood_state])
- for(var/obj/effect/decal/cleanable/blood/footprints/oldFP in T)
- if (oldFP.blood_state == S.blood_state)
- return
- //No oldFP or they're all a different kind of blood
- S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
- if (S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD)
- var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
- FP.blood_state = S.blood_state
- FP.entered_dirs |= dir
- FP.bloodiness = S.bloody_shoes[S.blood_state] - BLOOD_LOSS_IN_SPREAD
- FP.add_blood_DNA(S.return_blood_DNA())
- FP.update_icon()
+ var/obj/effect/decal/cleanable/blood/footprints/oldFP = locate(/obj/effect/decal/cleanable/blood/footprints) in T
+ if(oldFP && (oldFP.blood_state == S.blood_state && oldFP.color == bloodtype_to_color(S.last_bloodtype)))
+ return
+ S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state]-BLOOD_LOSS_PER_STEP)
+ var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
+ FP.blood_state = S.blood_state
+ FP.entered_dirs |= dir
+ FP.bloodiness = S.bloody_shoes[S.blood_state]
+ if(S.last_bloodtype)
+ FP.blood_DNA += list(S.last_blood_DNA = S.last_bloodtype)
+ FP.update_icon()
update_inv_shoes()
//End bloody footprints
+
S.step_action()
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee.
diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm
index ac9e9fe219..4d411deb53 100644
--- a/code/modules/mob/living/carbon/human/physiology.dm
+++ b/code/modules/mob/living/carbon/human/physiology.dm
@@ -21,8 +21,6 @@
var/bleed_mod = 1 // % bleeding modifier
var/datum/armor/armor // internal armor datum
- var/speed_mod = 0 //tick modifier for each step. Positive is slower, negative is faster.
-
var/hunger_mod = 1 //% of hunger rate taken per tick.
var/do_after_speed = 1 //Speed mod for do_after. Lower is better. If temporarily adjusting, please only modify using *= and /=, so you don't interrupt other calculations.
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index eee425063d..c54f41017a 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,14 +1,14 @@
/mob/living/carbon/human/say_mod(input, message_mode)
verb_say = dna.species.say_mod
- switch(slurring)
- if(10 to 25)
- return "jumbles"
- if(25 to 50)
- return "slurs"
- if(50 to INFINITY)
- return "garbles"
- else
- . = ..()
+ . = ..()
+ if(message_mode != MODE_CUSTOM_SAY && message_mode != MODE_WHISPER_CRIT)
+ switch(slurring)
+ if(10 to 25)
+ return "jumbles"
+ if(25 to 50)
+ return "slurs"
+ if(50 to INFINITY)
+ return "garbles"
/mob/living/carbon/human/GetVoice()
if(istype(wear_mask, /obj/item/clothing/mask/chameleon))
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index a59d9e914b..1f67f2b13c 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -332,6 +332,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if("meat_type" in default_features) //I can't believe it's come to the meat
H.type_of_meat = GLOB.meat_types[H.dna.features["meat_type"]]
+ C.add_movespeed_modifier(MOVESPEED_ID_SPECIES, TRUE, 100, override=TRUE, multiplicative_slowdown=speedmod, movetypes=(~FLYING))
+
SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species)
@@ -339,12 +341,17 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
if(C.dna.species.exotic_bloodtype)
- C.dna.blood_type = random_blood_type()
+ if(!new_species.exotic_bloodtype)
+ C.dna.blood_type = random_blood_type()
+ else
+ C.dna.blood_type = new_species.exotic_bloodtype
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(TRUE)
for(var/X in inherent_traits)
REMOVE_TRAIT(C, X, SPECIES_TRAIT)
+ C.remove_movespeed_modifier(MOVESPEED_ID_SPECIES)
+
if("meat_type" in default_features)
C.type_of_meat = GLOB.meat_types[C.dna.features["meat_type"]]
else
@@ -1024,6 +1031,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return "TAUR"
//END EDIT
+/* TODO: Snowflake trail marks
+// Impliments different trails for species depending on if they're wearing shoes.
+/datum/species/proc/get_move_trail(var/mob/living/carbon/human/H)
+ if(H.lying)
+ return /obj/effect/decal/cleanable/blood/footprints/tracks/body
+ if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))
+ var/obj/item/clothing/shoes/shoes = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) ? H.wear_suit : H.shoes // suits take priority over shoes
+ return shoes.move_trail
+ else
+ return move_trail */
/datum/species/proc/spec_life(mob/living/carbon/human/H)
if(HAS_TRAIT(H, TRAIT_NOBREATH))
@@ -1277,7 +1294,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER))
// THEY HUNGER
var/hunger_rate = HUNGER_FACTOR
- GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
if(mood && mood.sanity > SANITY_DISTURBED)
hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75
@@ -1376,39 +1393,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/movement_delay(mob/living/carbon/human/H)
. = 0 //We start at 0.
var/flight = 0 //Check for flight and flying items
- var/ignoreslow = 0
var/gravity = 0
if(H.movement_type & FLYING)
flight = 1
gravity = H.has_gravity()
- if(gravity && !flight) //Check for chemicals and innate speedups and slowdowns if we're on the ground
- if(HAS_TRAIT(H, TRAIT_GOTTAGOFAST))
- . -= 1
- if(HAS_TRAIT(H, TRAIT_GOTTAGOREALLYFAST))
- . -= 2
- . += speedmod
- . += H.physiology.speed_mod
-
if (H.m_intent == MOVE_INTENT_WALK && HAS_TRAIT(H, TRAIT_SPEEDY_STEP))
. -= 1.5
- if(HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN))
- ignoreslow = 1
-
- if(!gravity)
- var/obj/item/tank/jetpack/J = H.back
- var/obj/item/clothing/suit/space/hardsuit/C = H.wear_suit
- var/obj/item/organ/cyberimp/chest/thrusters/T = H.getorganslot(ORGAN_SLOT_THRUSTERS)
- if(!istype(J) && istype(C))
- J = C.jetpack
- if(istype(J) && J.full_speed && J.allow_thrust(0.01, H)) //Prevents stacking
- . -= 0.4
- else if(istype(T) && T.allow_thrust(0.01, H))
- . -= 0.4
-
- if(!ignoreslow && gravity)
+ if(!HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN) && gravity)
if(H.wear_suit)
. += H.wear_suit.slowdown
if(H.shoes)
@@ -1435,16 +1429,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/grav_force = min(gravity - STANDARD_GRAVITY,3)
. += 1 + grav_force
- GET_COMPONENT_FROM(mood, /datum/component/mood, H)
- if(mood && !flight) //How can depression slow you down if you can just fly away from your problems?
- switch(mood.sanity)
- if(SANITY_INSANE to SANITY_CRAZY)
- . += 1.5
- if(SANITY_CRAZY to SANITY_UNSTABLE)
- . += 1
- if(SANITY_UNSTABLE to SANITY_DISTURBED)
- . += 0.5
-
if(HAS_TRAIT(H, TRAIT_FAT))
. += (1.5 - flight)
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
@@ -1927,8 +1911,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/knocked_item = FALSE
if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types))
target_held_item = null
- if(!target.has_movespeed_modifier(SHOVE_SLOWDOWN_ID))
- target.add_movespeed_modifier(SHOVE_SLOWDOWN_ID, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
+ if(!target.has_movespeed_modifier(MOVESPEED_ID_SHOVE))
+ target.add_movespeed_modifier(MOVESPEED_ID_SHOVE, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
if(target_held_item)
target.visible_message("[target.name]'s grip on \the [target_held_item] loosens!",
"Your grip on \the [target_held_item] loosens!", null, COMBAT_MESSAGE_RANGE)
@@ -1946,10 +1930,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
append_message = "loosening their grip on [target_held_item]"
log_combat(user, target, "shoved", append_message)
-/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H)
+/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE)
var/hit_percent = (100-(blocked+armor))/100
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
- if(hit_percent <= 0)
+ if(!forced && hit_percent <= 0)
return 0
var/obj/item/bodypart/BP = null
@@ -1971,37 +1955,44 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
switch(damagetype)
if(BRUTE)
H.damageoverlaytemp = 20
+ var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod
if(BP)
- if(damage > 0 ? BP.receive_damage(damage * hit_percent * brutemod * H.physiology.brute_mod, 0) : BP.heal_damage(abs(damage * hit_percent * brutemod * H.physiology.brute_mod), 0))
+ if(damage > 0 ? BP.receive_damage(damage_amount, 0) : BP.heal_damage(abs(damage_amount), 0))
H.update_damage_overlays()
if(HAS_TRAIT(H, TRAIT_MASO))
- H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod)
+ H.adjustArousalLoss(damage_amount, 0)
if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna())
H.mob_climax(forced_climax=TRUE)
else//no bodypart, we deal damage with a more general method.
- H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod)
+ H.adjustBruteLoss(damage_amount)
if(BURN)
H.damageoverlaytemp = 20
+ var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod
if(BP)
- if(damage > 0 ? BP.receive_damage(0, damage * hit_percent * burnmod * H.physiology.burn_mod) : BP.heal_damage(0, abs(damage * hit_percent * burnmod * H.physiology.burn_mod)))
+ if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount)))
H.update_damage_overlays()
else
- H.adjustFireLoss(damage * hit_percent * burnmod * H.physiology.burn_mod)
+ H.adjustFireLoss(damage_amount)
if(TOX)
- H.adjustToxLoss(damage * hit_percent * H.physiology.tox_mod)
+ var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.tox_mod
+ H.adjustToxLoss(damage_amount)
if(OXY)
- H.adjustOxyLoss(damage * hit_percent * H.physiology.oxy_mod)
+ var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.oxy_mod
+ H.adjustOxyLoss(damage_amount)
if(CLONE)
- H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod)
+ var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.clone_mod
+ H.adjustCloneLoss(damage_amount)
if(STAMINA)
+ var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.stamina_mod
if(BP)
- if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
+ if(damage > 0 ? BP.receive_damage(0, 0, damage_amount) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
H.update_stamina()
else
- H.adjustStaminaLoss(damage * hit_percent * H.physiology.stamina_mod)
+ H.adjustStaminaLoss(damage_amount)
if(BRAIN)
- H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage * hit_percent * H.physiology.brain_mod)
+ var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod
+ H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount)
if(AROUSAL) //Citadel edit - arousal
H.adjustArousalLoss(damage * hit_percent)
return 1
diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm
index c1c848106c..7669a8c740 100644
--- a/code/modules/mob/living/carbon/human/species_types/angel.dm
+++ b/code/modules/mob/living/carbon/human/species_types/angel.dm
@@ -29,7 +29,7 @@
if(fly)
fly.Remove(H)
if(H.movement_type & FLYING)
- H.movement_type &= ~FLYING
+ H.setMovetype(H.movement_type & ~FLYING)
ToggleFlight(H,0)
if(H.dna && H.dna.species && (H.dna.features["wings"] == "Angel"))
if("wings" in H.dna.species.mutant_bodyparts)
@@ -132,14 +132,14 @@
if(flight && CanFly(H))
stunmod = 2
speedmod = -0.35
- H.movement_type |= FLYING
+ H.setMovetype(H.movement_type | FLYING)
override_float = TRUE
H.pass_flags |= PASSTABLE
H.OpenWings()
else
stunmod = 1
speedmod = 0
- H.movement_type &= ~FLYING
+ H.setMovetype(H.movement_type & ~FLYING)
override_float = FALSE
H.pass_flags &= ~PASSTABLE
H.CloseWings()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
index b4e55b60a5..d264f11b73 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -17,6 +17,7 @@
toxic_food = MEAT | RAW
mutanteyes = /obj/item/organ/eyes/insect
should_draw_citadel = TRUE
+ exotic_bloodtype = "BUG"
/datum/species/insect/on_species_gain(mob/living/carbon/C)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index 043ee4fde1..0c3bcc2b00 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -10,6 +10,7 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly
disliked_food = null
liked_food = GROSS
+ exotic_bloodtype = "BUG"
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "pestkiller")
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index 0390d4accc..90714b390c 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -65,7 +65,7 @@
miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
skinned_type = /obj/item/stack/sheet/animalhide/xeno
- exotic_bloodtype = "L"
+ exotic_bloodtype = "X*"
damage_overlay_type = "xeno"
liked_food = MEAT
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 8f84590ff4..a7e952f430 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -634,9 +634,10 @@
id = "clockwork golem"
say_mod = "clicks"
limbs_id = "clockgolem"
- info_text = "As a Clockwork Golem, you are faster than other types of golems. On death, you will break down into scrap."
+ info_text = "As a Clockwork Golem, you are faster than other types of golems, and are capable of using guns. On death, you will break down into scrap."
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES,NOGENITALS,NOAROUSAL)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
+ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
armor = 20 //Reinforced, but much less so to allow for fast movement
attack_verb = "smash"
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
@@ -682,7 +683,7 @@
blacklisted = TRUE
dangerous_existence = TRUE
random_eligible = FALSE
- info_text = "As a Clockwork Golem Servant, you are faster than other types of golems." //warcult golems leave a corpse
+ info_text = "As a Clockwork Golem Servant, you are faster than other types of golems, and are capable of using guns." //warcult golems leave a corpse
/datum/species/golem/cloth
name = "Cloth Golem"
diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm
index 95b924ea18..135c98860a 100644
--- a/code/modules/mob/living/carbon/human/species_types/ipc.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm
@@ -12,8 +12,8 @@
default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None")
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
mutanttongue = /obj/item/organ/tongue/robot/ipc
-
- exotic_blood = "oil"
+ mutant_heart = /obj/item/organ/heart/ipc
+ exotic_bloodtype = "HF"
var/datum/action/innate/monitor_change/screen
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 8e98569644..79ebdd1a68 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -4,13 +4,15 @@
id = "jelly"
default_color = "00FF90"
say_mod = "chirps"
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,WINGCOLOR)
+ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR)
mutantlungs = /obj/item/organ/lungs/slime
+ mutant_heart = /obj/item/organ/heart/slime
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur", "deco_wings") //CIT CHANGE
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") //CIT CHANGE
inherent_traits = list(TRAIT_TOXINLOVER)
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
- exotic_blood = "slimejelly"
+ exotic_blood = "jellyblood"
+ exotic_bloodtype = "GEL"
damage_overlay_type = ""
var/datum/action/innate/regenerate_limbs/regenerate_limbs
var/datum/action/innate/slime_change/slime_change //CIT CHANGE
@@ -121,7 +123,7 @@
name = "Xenobiological Slime Entity"
id = "slime"
default_color = "00FFFF"
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
+ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 150
@@ -396,7 +398,7 @@
id = "slimeperson"
limbs_id = "slime"
default_color = "00FFFF"
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
+ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur")
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None")
@@ -854,6 +856,8 @@
return FALSE
if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) //mindshield implant, no dice
return FALSE
+ if(M.anti_magic_check(FALSE, FALSE, TRUE, 0))
+ return FALSE
if(M in linked_mobs)
return FALSE
linked_mobs.Add(M)
@@ -939,9 +943,14 @@
var/mob/living/M = input("Select who to send your message to:","Send thought to?",null) as null|mob in options
if(!M)
return
-
+ if(M.anti_magic_check(FALSE, FALSE, TRUE, 0))
+ to_chat(H, "As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.")
+ return
var/msg = sanitize(input("Message:", "Telepathy") as text|null)
if(msg)
+ if(M.anti_magic_check(FALSE, FALSE, TRUE, 0))
+ to_chat(H, "As you try to communicate with [M], you're suddenly stopped by a vision of a massive tinfoil wall that streches beyond visible range. It seems you've been foiled.")
+ return
log_directed_talk(H, M, msg, LOG_SAY, "slime telepathy")
to_chat(M, "You hear an alien voice in your head... [msg]")
to_chat(H, "You telepathically said: \"[msg]\" to [M]")
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index 53c6f1bd0f..7462d26ea6 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -45,14 +45,14 @@
C.adjustOxyLoss(-4)
C.adjustCloneLoss(-4)
return
- C.blood_volume -= 0.75
+ C.blood_volume -= 0.75 //Will take roughly 19.5 minutes to die from standard blood volume, roughly 83 minutes to die from max blood volume.
if(C.blood_volume <= (BLOOD_VOLUME_SURVIVE*C.blood_ratio))
to_chat(C, "You ran out of blood!")
C.dust()
var/area/A = get_area(C)
if(istype(A, /area/chapel))
to_chat(C, "You don't belong here!")
- C.adjustFireLoss(20)
+ C.adjustFireLoss(5)
C.adjust_fire_stacks(6)
C.IgniteMob()
@@ -88,7 +88,7 @@
to_chat(H, "[victim] doesn't have blood!")
return
V.drain_cooldown = world.time + 30
- if(victim.anti_magic_check(FALSE, TRUE))
+ if(victim.anti_magic_check(FALSE, TRUE, FALSE, 0))
to_chat(victim, "[H] tries to bite you, but stops before touching you!")
to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.")
return
@@ -141,7 +141,7 @@
H = new(shape,src,caster)
if(istype(H, /mob/living/simple_animal))
var/mob/living/simple_animal/SA = H
- if(ventcrawl_nude_only && length(caster.get_equipped_items(include_pockets = TRUE)))
+ if((caster.blood_volume >= (BLOOD_VOLUME_BAD*caster.blood_ratio)) || (ventcrawl_nude_only && length(caster.get_equipped_items(include_pockets = TRUE))))
SA.ventcrawler = FALSE
if(transfer_name)
H.name = caster.name
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index fefaa025d3..a1dce4fb0f 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -45,7 +45,7 @@
/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount)
. = min(20, amount)
-/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H)
+/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE)
. = ..()
if(.)
regen_cooldown = world.time + REGENERATION_DELAY
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index fa3e29f119..a68aded85f 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -180,7 +180,7 @@ There are several things that need to be remembered:
inv.update_icon()
if(!gloves && bloody_hands)
- var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
+ var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color())
if(get_num_arms() < 2)
if(has_left_hand())
bloody_overlay.icon_state = "bloodyhands_left"
@@ -270,6 +270,32 @@ There are several things that need to be remembered:
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES]
inv.update_icon()
+/*
+ if(!shoes && bloody_feet)
+ var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
+ if(dna.features["taur"] != "None")
+ if(dna.features["taur"] in GLOB.noodle_taurs)
+ bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "snekbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
+ if(get_num_legs() < 2)
+ if(has_left_leg())
+ bloody_overlay.icon_state = "snekbloodyfeet_left"
+ else if(has_right_leg())
+ bloody_overlay.icon_state = "snekbloodyfeet_right"
+ else if(dna.features["taur"] in GLOB.paw_taurs)
+ bloody_overlay = mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "pawbloodyfeet", -SHOES_LAYER, color = blood_DNA_to_color())
+ if(get_num_legs() < 2)
+ if(has_left_leg())
+ bloody_overlay.icon_state = "pawbloodyfeet_left"
+ else if(has_right_leg())
+ bloody_overlay.icon_state = "pawbloodyfeet_right"
+ else
+ if(get_num_legs() < 2)
+ if(has_left_leg())
+ bloody_overlay.icon_state = "bloodyfeet_left"
+ else if(has_right_leg())
+ bloody_overlay.icon_state = "bloodyfeet_right"
+
+ overlays_standing[GLOVES_LAYER] = bloody_overlay*/
if(shoes)
var/obj/item/clothing/shoes/S = shoes
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index cdae073af8..66be8058f1 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -23,7 +23,7 @@
if(changed)
animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
- floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
+ setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
/mob/living/carbon
@@ -97,8 +97,12 @@
/mob/living/carbon/update_damage_overlays()
remove_overlay(DAMAGE_LAYER)
+ var/dam_colors = "#E62525"
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ dam_colors = bloodtype_to_color(H.dna.blood_type)
- var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER)
+ var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER, color = dam_colors)
overlays_standing[DAMAGE_LAYER] = damage_overlay
for(var/X in bodyparts)
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index fbb6074ba2..dc43ab8b07 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -8,23 +8,24 @@
Returns
standard 0 if fail
*/
-/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE)
+/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
var/hit_percent = (100-blocked)/100
if(!damage || (hit_percent <= 0))
return 0
+ var/damage_amount = forced ? damage : damage * hit_percent
switch(damagetype)
if(BRUTE)
- adjustBruteLoss(damage * hit_percent)
+ adjustBruteLoss(damage_amount, forced = forced)
if(BURN)
- adjustFireLoss(damage * hit_percent)
+ adjustFireLoss(damage_amount, forced = forced)
if(TOX)
- adjustToxLoss(damage * hit_percent)
+ adjustToxLoss(damage_amount, forced = forced)
if(OXY)
- adjustOxyLoss(damage * hit_percent)
+ adjustOxyLoss(damage_amount, forced = forced)
if(CLONE)
- adjustCloneLoss(damage * hit_percent)
+ adjustCloneLoss(damage_amount, forced = forced)
if(STAMINA)
- adjustStaminaLoss(damage * hit_percent)
+ adjustStaminaLoss(damage_amount, forced = forced)
return 1
/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 201e5fea24..2bf17bc265 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -4,7 +4,7 @@
if(digitalinvis)
handle_diginvis() //AI becomes unable to see mob
- if((movement_type & FLYING) && !floating) //TODO: Better floating
+ if((movement_type & FLYING) && !(movement_type & FLOATING)) //TODO: Better floating
float(on = TRUE)
if (client)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 812733ebe2..e893426ee9 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -502,7 +502,7 @@
fire_stacks = 0
confused = 0
update_canmove()
- GET_COMPONENT(mood, /datum/component/mood)
+ var/datum/component/mood/mood = GetComponent(/datum/component/mood)
if (mood)
QDEL_LIST_ASSOC_VAL(mood.mood_events)
mood.sanity = SANITY_GREAT
@@ -716,14 +716,14 @@
var/fixed = 0
if(anchored || (buckled && buckled.anchored))
fixed = 1
- if(on && !floating && !fixed)
+ if(on && !(movement_type & FLOATING) && !fixed)
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
sleep(10)
animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
- floating = TRUE
- else if(((!on || fixed) && floating))
+ setMovetype(movement_type | FLOATING)
+ else if(((!on || fixed) && (movement_type & FLOATING)))
animate(src, pixel_y = get_standard_pixel_y_offset(lying), time = 10)
- floating = FALSE
+ setMovetype(movement_type & ~FLOATING)
// The src mob is trying to strip an item from someone
// Override if a certain type of mob should be behave differently when stripping items (can't, for example)
@@ -795,7 +795,7 @@
var/final_pixel_y = get_standard_pixel_y_offset(lying)
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
animate(pixel_x = final_pixel_x , pixel_y = final_pixel_y , time = 2)
- floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
+ setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
/mob/living/proc/get_temperature(datum/gas_mixture/environment)
var/loc_temp = environment ? environment.temperature : T0C
@@ -935,7 +935,7 @@
apply_effect((amount*RAD_MOB_COEFFICIENT)/max(1, (radiation**2)*RAD_OVERDOSE_REDUCTION), EFFECT_IRRADIATE, blocked)
-/mob/living/anti_magic_check(magic = TRUE, holy = FALSE)
+/mob/living/anti_magic_check(magic = TRUE, holy = FALSE, chargecost = 1, self = FALSE)
. = ..()
if(.)
return
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 9d04f288cd..93e64fd4cc 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -422,4 +422,4 @@
if(!used_item)
used_item = get_active_held_item()
..()
- floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
+ setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 5664c2ebca..174fd5c394 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -391,16 +391,16 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return 0
/mob/living/say_mod(input, message_mode)
- if(message_mode == MODE_WHISPER)
- . = verb_whisper
- else if(message_mode == MODE_WHISPER_CRIT)
+ . = ..()
+ if(message_mode == MODE_WHISPER_CRIT)
. = "[verb_whisper] in [p_their()] last breath"
- else if(stuttering)
- . = "stammers"
- else if(derpspeech)
- . = "gibbers"
- else
- . = ..()
+ else if(message_mode != MODE_CUSTOM_SAY)
+ if(message_mode == MODE_WHISPER)
+ . = verb_whisper
+ else if(stuttering)
+ . = "stammers"
+ else if(derpspeech)
+ . = "gibbers"
/mob/living/whisper(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
say("#[message]", bubble_type, spans, sanitize, language, ignore_spam, forced)
diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm
index eb6d0ce991..50a808032d 100644
--- a/code/modules/mob/living/silicon/ai/vox_sounds.dm
+++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm
@@ -975,4 +975,635 @@ GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg',
"zombie" = 'sound/vox_fem/zombie.ogg',
"zone" = 'sound/vox_fem/zone.ogg',
"zulu" = 'sound/vox_fem/zulu.ogg'))
+
+//for vim
+// :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox\/\1',/g
+GLOBAL_LIST_INIT(vox_sounds_male, list("," = 'sound/vox/_comma.ogg',
+"." = 'sound/vox/_period.ogg',
+"a" = 'sound/vox/a.ogg',
+"accelerating" = 'sound/vox/accelerating.ogg',
+"accelerator" = 'sound/vox/accelerator.ogg',
+"accepted" = 'sound/vox/accepted.ogg',
+"access" = 'sound/vox/access.ogg',
+"acknowledge" = 'sound/vox/acknowledge.ogg',
+"acknowledged" = 'sound/vox/acknowledged.ogg',
+"acquired" = 'sound/vox/acquired.ogg',
+"acquisition" = 'sound/vox/acquisition.ogg',
+"across" = 'sound/vox/across.ogg',
+"activate" = 'sound/vox/activate.ogg',
+"activated" = 'sound/vox/activated.ogg',
+"activity" = 'sound/vox/activity.ogg',
+"adios" = 'sound/vox/adios.ogg',
+"administration" = 'sound/vox/administration.ogg',
+"advanced" = 'sound/vox/advanced.ogg',
+"after" = 'sound/vox/after.ogg',
+"agent" = 'sound/vox/agent.ogg',
+"alarm" = 'sound/vox/alarm.ogg',
+"alert" = 'sound/vox/alert.ogg',
+"alien" = 'sound/vox/alien.ogg',
+"aligned" = 'sound/vox/aligned.ogg',
+"all" = 'sound/vox/all.ogg',
+"alpha" = 'sound/vox/alpha.ogg',
+"am" = 'sound/vox/am.ogg',
+"amigo" = 'sound/vox/amigo.ogg',
+"ammunition" = 'sound/vox/ammunition.ogg',
+"an" = 'sound/vox/an.ogg',
+"and" = 'sound/vox/and.ogg',
+"announcement" = 'sound/vox/announcement.ogg',
+"anomalous" = 'sound/vox/anomalous.ogg',
+"antenna" = 'sound/vox/antenna.ogg',
+"any" = 'sound/vox/any.ogg',
+"apprehend" = 'sound/vox/apprehend.ogg',
+"approach" = 'sound/vox/approach.ogg',
+"are" = 'sound/vox/are.ogg',
+"area" = 'sound/vox/area.ogg',
+"arm" = 'sound/vox/arm.ogg',
+"armed" = 'sound/vox/armed.ogg',
+"armor" = 'sound/vox/armor.ogg',
+"armory" = 'sound/vox/armory.ogg',
+"arrest" = 'sound/vox/arrest.ogg',
+"ass" = 'sound/vox/ass.ogg',
+"at" = 'sound/vox/at.ogg',
+"atomic" = 'sound/vox/atomic.ogg',
+"attention" = 'sound/vox/attention.ogg',
+"authorize" = 'sound/vox/authorize.ogg',
+"authorized" = 'sound/vox/authorized.ogg',
+"automatic" = 'sound/vox/automatic.ogg',
+"away" = 'sound/vox/away.ogg',
+"b" = 'sound/vox/b.ogg',
+"back" = 'sound/vox/back.ogg',
+"backman" = 'sound/vox/backman.ogg',
+"bad" = 'sound/vox/bad.ogg',
+"bag" = 'sound/vox/bag.ogg',
+"bailey" = 'sound/vox/bailey.ogg',
+"barracks" = 'sound/vox/barracks.ogg',
+"base" = 'sound/vox/base.ogg',
+"bay" = 'sound/vox/bay.ogg',
+"be" = 'sound/vox/be.ogg',
+"been" = 'sound/vox/been.ogg',
+"before" = 'sound/vox/before.ogg',
+"beyond" = 'sound/vox/beyond.ogg',
+"biohazard" = 'sound/vox/biohazard.ogg',
+"biological" = 'sound/vox/biological.ogg',
+"birdwell" = 'sound/vox/birdwell.ogg',
+"bizwarn" = 'sound/vox/bizwarn.ogg',
+"black" = 'sound/vox/black.ogg',
+"blast" = 'sound/vox/blast.ogg',
+"blocked" = 'sound/vox/blocked.ogg',
+"bloop" = 'sound/vox/bloop.ogg',
+"blue" = 'sound/vox/blue.ogg',
+"bottom" = 'sound/vox/bottom.ogg',
+"bravo" = 'sound/vox/bravo.ogg',
+"breach" = 'sound/vox/breach.ogg',
+"breached" = 'sound/vox/breached.ogg',
+"break" = 'sound/vox/break.ogg',
+"bridge" = 'sound/vox/bridge.ogg',
+"bust" = 'sound/vox/bust.ogg',
+"but" = 'sound/vox/but.ogg',
+"button" = 'sound/vox/button.ogg',
+"buzwarn" = 'sound/vox/buzwarn.ogg',
+"bypass" = 'sound/vox/bypass.ogg',
+"c" = 'sound/vox/c.ogg',
+"cable" = 'sound/vox/cable.ogg',
+"call" = 'sound/vox/call.ogg',
+"called" = 'sound/vox/called.ogg',
+"canal" = 'sound/vox/canal.ogg',
+"cap" = 'sound/vox/cap.ogg',
+"captain" = 'sound/vox/captain.ogg',
+"capture" = 'sound/vox/capture.ogg',
+"captured" = 'sound/vox/captured.ogg',
+"ceiling" = 'sound/vox/ceiling.ogg',
+"celsius" = 'sound/vox/celsius.ogg',
+"center" = 'sound/vox/center.ogg',
+"centi" = 'sound/vox/centi.ogg',
+"central" = 'sound/vox/central.ogg',
+"chamber" = 'sound/vox/chamber.ogg',
+"charlie" = 'sound/vox/charlie.ogg',
+"check" = 'sound/vox/check.ogg',
+"checkpoint" = 'sound/vox/checkpoint.ogg',
+"chemical" = 'sound/vox/chemical.ogg',
+"cleanup" = 'sound/vox/cleanup.ogg',
+"clear" = 'sound/vox/clear.ogg',
+"clearance" = 'sound/vox/clearance.ogg',
+"close" = 'sound/vox/close.ogg',
+"clown" = 'sound/vox/clown.ogg',
+"code" = 'sound/vox/code.ogg',
+"coded" = 'sound/vox/coded.ogg',
+"collider" = 'sound/vox/collider.ogg',
+"command" = 'sound/vox/command.ogg',
+"communication" = 'sound/vox/communication.ogg',
+"complex" = 'sound/vox/complex.ogg',
+"computer" = 'sound/vox/computer.ogg',
+"condition" = 'sound/vox/condition.ogg',
+"containment" = 'sound/vox/containment.ogg',
+"contamination" = 'sound/vox/contamination.ogg',
+"control" = 'sound/vox/control.ogg',
+"coolant" = 'sound/vox/coolant.ogg',
+"coomer" = 'sound/vox/coomer.ogg',
+"core" = 'sound/vox/core.ogg',
+"correct" = 'sound/vox/correct.ogg',
+"corridor" = 'sound/vox/corridor.ogg',
+"crew" = 'sound/vox/crew.ogg',
+"cross" = 'sound/vox/cross.ogg',
+"cryogenic" = 'sound/vox/cryogenic.ogg',
+"d" = 'sound/vox/d.ogg',
+"dadeda" = 'sound/vox/dadeda.ogg',
+"damage" = 'sound/vox/damage.ogg',
+"damaged" = 'sound/vox/damaged.ogg',
+"danger" = 'sound/vox/danger.ogg',
+"day" = 'sound/vox/day.ogg',
+"deactivated" = 'sound/vox/deactivated.ogg',
+"decompression" = 'sound/vox/decompression.ogg',
+"decontamination" = 'sound/vox/decontamination.ogg',
+"deeoo" = 'sound/vox/deeoo.ogg',
+"defense" = 'sound/vox/defense.ogg',
+"degrees" = 'sound/vox/degrees.ogg',
+"delta" = 'sound/vox/delta.ogg',
+"denied" = 'sound/vox/denied.ogg',
+"deploy" = 'sound/vox/deploy.ogg',
+"deployed" = 'sound/vox/deployed.ogg',
+"destroy" = 'sound/vox/destroy.ogg',
+"destroyed" = 'sound/vox/destroyed.ogg',
+"detain" = 'sound/vox/detain.ogg',
+"detected" = 'sound/vox/detected.ogg',
+"detonation" = 'sound/vox/detonation.ogg',
+"device" = 'sound/vox/device.ogg',
+"did" = 'sound/vox/did.ogg',
+"die" = 'sound/vox/die.ogg',
+"dimensional" = 'sound/vox/dimensional.ogg',
+"dirt" = 'sound/vox/dirt.ogg',
+"disengaged" = 'sound/vox/disengaged.ogg',
+"dish" = 'sound/vox/dish.ogg',
+"disposal" = 'sound/vox/disposal.ogg',
+"distance" = 'sound/vox/distance.ogg',
+"distortion" = 'sound/vox/distortion.ogg',
+"do" = 'sound/vox/do.ogg',
+"doctor" = 'sound/vox/doctor.ogg',
+"doop" = 'sound/vox/doop.ogg',
+"door" = 'sound/vox/door.ogg',
+"down" = 'sound/vox/down.ogg',
+"dual" = 'sound/vox/dual.ogg',
+"duct" = 'sound/vox/duct.ogg',
+"e" = 'sound/vox/e.ogg',
+"east" = 'sound/vox/east.ogg',
+"echo" = 'sound/vox/echo.ogg',
+"ed" = 'sound/vox/ed.ogg',
+"effect" = 'sound/vox/effect.ogg',
+"egress" = 'sound/vox/egress.ogg',
+"eight" = 'sound/vox/eight.ogg',
+"eighteen" = 'sound/vox/eighteen.ogg',
+"eighty" = 'sound/vox/eighty.ogg',
+"electric" = 'sound/vox/electric.ogg',
+"electromagnetic" = 'sound/vox/electromagnetic.ogg',
+"elevator" = 'sound/vox/elevator.ogg',
+"eleven" = 'sound/vox/eleven.ogg',
+"eliminate" = 'sound/vox/eliminate.ogg',
+"emergency" = 'sound/vox/emergency.ogg',
+"enemy" = 'sound/vox/enemy.ogg',
+"energy" = 'sound/vox/energy.ogg',
+"engage" = 'sound/vox/engage.ogg',
+"engaged" = 'sound/vox/engaged.ogg',
+"engine" = 'sound/vox/engine.ogg',
+"enter" = 'sound/vox/enter.ogg',
+"entry" = 'sound/vox/entry.ogg',
+"environment" = 'sound/vox/environment.ogg',
+"error" = 'sound/vox/error.ogg',
+"escape" = 'sound/vox/escape.ogg',
+"evacuate" = 'sound/vox/evacuate.ogg',
+"exchange" = 'sound/vox/exchange.ogg',
+"exit" = 'sound/vox/exit.ogg',
+"expect" = 'sound/vox/expect.ogg',
+"experiment" = 'sound/vox/experiment.ogg',
+"experimental" = 'sound/vox/experimental.ogg',
+"explode" = 'sound/vox/explode.ogg',
+"explosion" = 'sound/vox/explosion.ogg',
+"exposure" = 'sound/vox/exposure.ogg',
+"exterminate" = 'sound/vox/exterminate.ogg',
+"extinguish" = 'sound/vox/extinguish.ogg',
+"extinguisher" = 'sound/vox/extinguisher.ogg',
+"extreme" = 'sound/vox/extreme.ogg',
+"f" = 'sound/vox/f.ogg',
+"face" = 'sound/vox/face.ogg',
+"facility" = 'sound/vox/facility.ogg',
+"fahrenheit" = 'sound/vox/fahrenheit.ogg',
+"failed" = 'sound/vox/failed.ogg',
+"failure" = 'sound/vox/failure.ogg',
+"farthest" = 'sound/vox/farthest.ogg',
+"fast" = 'sound/vox/fast.ogg',
+"feet" = 'sound/vox/feet.ogg',
+"field" = 'sound/vox/field.ogg',
+"fifteen" = 'sound/vox/fifteen.ogg',
+"fifth" = 'sound/vox/fifth.ogg',
+"fifty" = 'sound/vox/fifty.ogg',
+"final" = 'sound/vox/final.ogg',
+"fine" = 'sound/vox/fine.ogg',
+"fire" = 'sound/vox/fire.ogg',
+"first" = 'sound/vox/first.ogg',
+"five" = 'sound/vox/five.ogg',
+"flag" = 'sound/vox/flag.ogg',
+"flooding" = 'sound/vox/flooding.ogg',
+"floor" = 'sound/vox/floor.ogg',
+"fool" = 'sound/vox/fool.ogg',
+"for" = 'sound/vox/for.ogg',
+"forbidden" = 'sound/vox/forbidden.ogg',
+"force" = 'sound/vox/force.ogg',
+"forms" = 'sound/vox/forms.ogg',
+"found" = 'sound/vox/found.ogg',
+"four" = 'sound/vox/four.ogg',
+"fourteen" = 'sound/vox/fourteen.ogg',
+"fourth" = 'sound/vox/fourth.ogg',
+"fourty" = 'sound/vox/fourty.ogg',
+"foxtrot" = 'sound/vox/foxtrot.ogg',
+"freeman" = 'sound/vox/freeman.ogg',
+"freezer" = 'sound/vox/freezer.ogg',
+"from" = 'sound/vox/from.ogg',
+"front" = 'sound/vox/front.ogg',
+"fuel" = 'sound/vox/fuel.ogg',
+"g" = 'sound/vox/g.ogg',
+"gay" = 'sound/vox/gay.ogg',
+"get" = 'sound/vox/get.ogg',
+"go" = 'sound/vox/go.ogg',
+"going" = 'sound/vox/going.ogg',
+"good" = 'sound/vox/good.ogg',
+"goodbye" = 'sound/vox/goodbye.ogg',
+"gordon" = 'sound/vox/gordon.ogg',
+"got" = 'sound/vox/got.ogg',
+"government" = 'sound/vox/government.ogg',
+"granted" = 'sound/vox/granted.ogg',
+"great" = 'sound/vox/great.ogg',
+"green" = 'sound/vox/green.ogg',
+"grenade" = 'sound/vox/grenade.ogg',
+"guard" = 'sound/vox/guard.ogg',
+"gulf" = 'sound/vox/gulf.ogg',
+"gun" = 'sound/vox/gun.ogg',
+"guthrie" = 'sound/vox/guthrie.ogg',
+"handling" = 'sound/vox/handling.ogg',
+"hangar" = 'sound/vox/hangar.ogg',
+"has" = 'sound/vox/has.ogg',
+"have" = 'sound/vox/have.ogg',
+"hazard" = 'sound/vox/hazard.ogg',
+"head" = 'sound/vox/head.ogg',
+"health" = 'sound/vox/health.ogg',
+"heat" = 'sound/vox/heat.ogg',
+"helicopter" = 'sound/vox/helicopter.ogg',
+"helium" = 'sound/vox/helium.ogg',
+"hello" = 'sound/vox/hello.ogg',
+"help" = 'sound/vox/help.ogg',
+"here" = 'sound/vox/here.ogg',
+"hide" = 'sound/vox/hide.ogg',
+"high" = 'sound/vox/high.ogg',
+"highest" = 'sound/vox/highest.ogg',
+"hit" = 'sound/vox/hit.ogg',
+"holds" = 'sound/vox/holds.ogg',
+"hole" = 'sound/vox/hole.ogg',
+"hostile" = 'sound/vox/hostile.ogg',
+"hot" = 'sound/vox/hot.ogg',
+"hotel" = 'sound/vox/hotel.ogg',
+"hour" = 'sound/vox/hour.ogg',
+"hours" = 'sound/vox/hours.ogg',
+"hundred" = 'sound/vox/hundred.ogg',
+"hydro" = 'sound/vox/hydro.ogg',
+"i" = 'sound/vox/i.ogg',
+"idiot" = 'sound/vox/idiot.ogg',
+"illegal" = 'sound/vox/illegal.ogg',
+"immediate" = 'sound/vox/immediate.ogg',
+"immediately" = 'sound/vox/immediately.ogg',
+"in" = 'sound/vox/in.ogg',
+"inches" = 'sound/vox/inches.ogg',
+"india" = 'sound/vox/india.ogg',
+"ing" = 'sound/vox/ing.ogg',
+"inoperative" = 'sound/vox/inoperative.ogg',
+"inside" = 'sound/vox/inside.ogg',
+"inspection" = 'sound/vox/inspection.ogg',
+"inspector" = 'sound/vox/inspector.ogg',
+"interchange" = 'sound/vox/interchange.ogg',
+"intruder" = 'sound/vox/intruder.ogg',
+"invallid" = 'sound/vox/invallid.ogg',
+"invasion" = 'sound/vox/invasion.ogg',
+"is" = 'sound/vox/is.ogg',
+"it" = 'sound/vox/it.ogg',
+"johnson" = 'sound/vox/johnson.ogg',
+"juliet" = 'sound/vox/juliet.ogg',
+"key" = 'sound/vox/key.ogg',
+"kill" = 'sound/vox/kill.ogg',
+"kilo" = 'sound/vox/kilo.ogg',
+"kit" = 'sound/vox/kit.ogg',
+"lab" = 'sound/vox/lab.ogg',
+"lambda" = 'sound/vox/lambda.ogg',
+"laser" = 'sound/vox/laser.ogg',
+"last" = 'sound/vox/last.ogg',
+"launch" = 'sound/vox/launch.ogg',
+"leak" = 'sound/vox/leak.ogg',
+"leave" = 'sound/vox/leave.ogg',
+"left" = 'sound/vox/left.ogg',
+"legal" = 'sound/vox/legal.ogg',
+"level" = 'sound/vox/level.ogg',
+"lever" = 'sound/vox/lever.ogg',
+"lie" = 'sound/vox/lie.ogg',
+"lieutenant" = 'sound/vox/lieutenant.ogg',
+"life" = 'sound/vox/life.ogg',
+"light" = 'sound/vox/light.ogg',
+"lima" = 'sound/vox/lima.ogg',
+"liquid" = 'sound/vox/liquid.ogg',
+"loading" = 'sound/vox/loading.ogg',
+"locate" = 'sound/vox/locate.ogg',
+"located" = 'sound/vox/located.ogg',
+"location" = 'sound/vox/location.ogg',
+"lock" = 'sound/vox/lock.ogg',
+"locked" = 'sound/vox/locked.ogg',
+"locker" = 'sound/vox/locker.ogg',
+"lockout" = 'sound/vox/lockout.ogg',
+"lower" = 'sound/vox/lower.ogg',
+"lowest" = 'sound/vox/lowest.ogg',
+"magnetic" = 'sound/vox/magnetic.ogg',
+"main" = 'sound/vox/main.ogg',
+"maintenance" = 'sound/vox/maintenance.ogg',
+"malfunction" = 'sound/vox/malfunction.ogg',
+"man" = 'sound/vox/man.ogg',
+"mass" = 'sound/vox/mass.ogg',
+"materials" = 'sound/vox/materials.ogg',
+"maximum" = 'sound/vox/maximum.ogg',
+"may" = 'sound/vox/may.ogg',
+"med" = 'sound/vox/med.ogg',
+"medical" = 'sound/vox/medical.ogg',
+"men" = 'sound/vox/men.ogg',
+"mercy" = 'sound/vox/mercy.ogg',
+"mesa" = 'sound/vox/mesa.ogg',
+"message" = 'sound/vox/message.ogg',
+"meter" = 'sound/vox/meter.ogg',
+"micro" = 'sound/vox/micro.ogg',
+"middle" = 'sound/vox/middle.ogg',
+"mike" = 'sound/vox/mike.ogg',
+"miles" = 'sound/vox/miles.ogg',
+"military" = 'sound/vox/military.ogg',
+"milli" = 'sound/vox/milli.ogg',
+"million" = 'sound/vox/million.ogg',
+"minefield" = 'sound/vox/minefield.ogg',
+"minimum" = 'sound/vox/minimum.ogg',
+"minutes" = 'sound/vox/minutes.ogg',
+"mister" = 'sound/vox/mister.ogg',
+"mode" = 'sound/vox/mode.ogg',
+"motor" = 'sound/vox/motor.ogg',
+"motorpool" = 'sound/vox/motorpool.ogg',
+"move" = 'sound/vox/move.ogg',
+"must" = 'sound/vox/must.ogg',
+"nearest" = 'sound/vox/nearest.ogg',
+"nice" = 'sound/vox/nice.ogg',
+"nine" = 'sound/vox/nine.ogg',
+"nineteen" = 'sound/vox/nineteen.ogg',
+"ninety" = 'sound/vox/ninety.ogg',
+"no" = 'sound/vox/no.ogg',
+"nominal" = 'sound/vox/nominal.ogg',
+"north" = 'sound/vox/north.ogg',
+"not" = 'sound/vox/not.ogg',
+"november" = 'sound/vox/november.ogg',
+"now" = 'sound/vox/now.ogg',
+"number" = 'sound/vox/number.ogg',
+"objective" = 'sound/vox/objective.ogg',
+"observation" = 'sound/vox/observation.ogg',
+"of" = 'sound/vox/of.ogg',
+"officer" = 'sound/vox/officer.ogg',
+"ok" = 'sound/vox/ok.ogg',
+"on" = 'sound/vox/on.ogg',
+"one" = 'sound/vox/one.ogg',
+"open" = 'sound/vox/open.ogg',
+"operating" = 'sound/vox/operating.ogg',
+"operations" = 'sound/vox/operations.ogg',
+"operative" = 'sound/vox/operative.ogg',
+"option" = 'sound/vox/option.ogg',
+"order" = 'sound/vox/order.ogg',
+"organic" = 'sound/vox/organic.ogg',
+"oscar" = 'sound/vox/oscar.ogg',
+"out" = 'sound/vox/out.ogg',
+"outside" = 'sound/vox/outside.ogg',
+"over" = 'sound/vox/over.ogg',
+"overload" = 'sound/vox/overload.ogg',
+"override" = 'sound/vox/override.ogg',
+"pacify" = 'sound/vox/pacify.ogg',
+"pain" = 'sound/vox/pain.ogg',
+"pal" = 'sound/vox/pal.ogg',
+"panel" = 'sound/vox/panel.ogg',
+"percent" = 'sound/vox/percent.ogg',
+"perimeter" = 'sound/vox/perimeter.ogg',
+"permitted" = 'sound/vox/permitted.ogg',
+"personnel" = 'sound/vox/personnel.ogg',
+"pipe" = 'sound/vox/pipe.ogg',
+"plant" = 'sound/vox/plant.ogg',
+"platform" = 'sound/vox/platform.ogg',
+"please" = 'sound/vox/please.ogg',
+"point" = 'sound/vox/point.ogg',
+"portal" = 'sound/vox/portal.ogg',
+"power" = 'sound/vox/power.ogg',
+"presence" = 'sound/vox/presence.ogg',
+"press" = 'sound/vox/press.ogg',
+"primary" = 'sound/vox/primary.ogg',
+"proceed" = 'sound/vox/proceed.ogg',
+"processing" = 'sound/vox/processing.ogg',
+"progress" = 'sound/vox/progress.ogg',
+"proper" = 'sound/vox/proper.ogg',
+"propulsion" = 'sound/vox/propulsion.ogg',
+"prosecute" = 'sound/vox/prosecute.ogg',
+"protective" = 'sound/vox/protective.ogg',
+"push" = 'sound/vox/push.ogg',
+"quantum" = 'sound/vox/quantum.ogg',
+"quebec" = 'sound/vox/quebec.ogg',
+"question" = 'sound/vox/question.ogg',
+"questioning" = 'sound/vox/questioning.ogg',
+"quick" = 'sound/vox/quick.ogg',
+"quit" = 'sound/vox/quit.ogg',
+"radiation" = 'sound/vox/radiation.ogg',
+"radioactive" = 'sound/vox/radioactive.ogg',
+"rads" = 'sound/vox/rads.ogg',
+"rapid" = 'sound/vox/rapid.ogg',
+"reach" = 'sound/vox/reach.ogg',
+"reached" = 'sound/vox/reached.ogg',
+"reactor" = 'sound/vox/reactor.ogg',
+"red" = 'sound/vox/red.ogg',
+"relay" = 'sound/vox/relay.ogg',
+"released" = 'sound/vox/released.ogg',
+"remaining" = 'sound/vox/remaining.ogg',
+"renegade" = 'sound/vox/renegade.ogg',
+"repair" = 'sound/vox/repair.ogg',
+"report" = 'sound/vox/report.ogg',
+"reports" = 'sound/vox/reports.ogg',
+"required" = 'sound/vox/required.ogg',
+"research" = 'sound/vox/research.ogg',
+"reset" = 'sound/vox/reset.ogg',
+"resevoir" = 'sound/vox/resevoir.ogg',
+"resistance" = 'sound/vox/resistance.ogg',
+"returned" = 'sound/vox/returned.ogg',
+"right" = 'sound/vox/right.ogg',
+"rocket" = 'sound/vox/rocket.ogg',
+"roger" = 'sound/vox/roger.ogg',
+"romeo" = 'sound/vox/romeo.ogg',
+"room" = 'sound/vox/room.ogg',
+"round" = 'sound/vox/round.ogg',
+"run" = 'sound/vox/run.ogg',
+"safe" = 'sound/vox/safe.ogg',
+"safety" = 'sound/vox/safety.ogg',
+"sargeant" = 'sound/vox/sargeant.ogg',
+"satellite" = 'sound/vox/satellite.ogg',
+"save" = 'sound/vox/save.ogg',
+"science" = 'sound/vox/science.ogg',
+"scores" = 'sound/vox/scores.ogg',
+"scream" = 'sound/vox/scream.ogg',
+"screen" = 'sound/vox/screen.ogg',
+"search" = 'sound/vox/search.ogg',
+"second" = 'sound/vox/second.ogg',
+"secondary" = 'sound/vox/secondary.ogg',
+"seconds" = 'sound/vox/seconds.ogg',
+"sector" = 'sound/vox/sector.ogg',
+"secure" = 'sound/vox/secure.ogg',
+"secured" = 'sound/vox/secured.ogg',
+"security" = 'sound/vox/security.ogg',
+"select" = 'sound/vox/select.ogg',
+"selected" = 'sound/vox/selected.ogg',
+"service" = 'sound/vox/service.ogg',
+"seven" = 'sound/vox/seven.ogg',
+"seventeen" = 'sound/vox/seventeen.ogg',
+"seventy" = 'sound/vox/seventy.ogg',
+"severe" = 'sound/vox/severe.ogg',
+"sewage" = 'sound/vox/sewage.ogg',
+"sewer" = 'sound/vox/sewer.ogg',
+"shield" = 'sound/vox/shield.ogg',
+"shipment" = 'sound/vox/shipment.ogg',
+"shock" = 'sound/vox/shock.ogg',
+"shoot" = 'sound/vox/shoot.ogg',
+"shower" = 'sound/vox/shower.ogg',
+"shut" = 'sound/vox/shut.ogg',
+"side" = 'sound/vox/side.ogg',
+"sierra" = 'sound/vox/sierra.ogg',
+"sight" = 'sound/vox/sight.ogg',
+"silo" = 'sound/vox/silo.ogg',
+"six" = 'sound/vox/six.ogg',
+"sixteen" = 'sound/vox/sixteen.ogg',
+"sixty" = 'sound/vox/sixty.ogg',
+"slime" = 'sound/vox/slime.ogg',
+"slow" = 'sound/vox/slow.ogg',
+"soldier" = 'sound/vox/soldier.ogg',
+"some" = 'sound/vox/some.ogg',
+"someone" = 'sound/vox/someone.ogg',
+"something" = 'sound/vox/something.ogg',
+"son" = 'sound/vox/son.ogg',
+"sorry" = 'sound/vox/sorry.ogg',
+"south" = 'sound/vox/south.ogg',
+"squad" = 'sound/vox/squad.ogg',
+"square" = 'sound/vox/square.ogg',
+"stairway" = 'sound/vox/stairway.ogg',
+"status" = 'sound/vox/status.ogg',
+"sterile" = 'sound/vox/sterile.ogg',
+"sterilization" = 'sound/vox/sterilization.ogg',
+"stolen" = 'sound/vox/stolen.ogg',
+"storage" = 'sound/vox/storage.ogg',
+"sub" = 'sound/vox/sub.ogg',
+"subsurface" = 'sound/vox/subsurface.ogg',
+"sudden" = 'sound/vox/sudden.ogg',
+"suit" = 'sound/vox/suit.ogg',
+"superconducting" = 'sound/vox/superconducting.ogg',
+"supercooled" = 'sound/vox/supercooled.ogg',
+"supply" = 'sound/vox/supply.ogg',
+"surface" = 'sound/vox/surface.ogg',
+"surrender" = 'sound/vox/surrender.ogg',
+"surround" = 'sound/vox/surround.ogg',
+"surrounded" = 'sound/vox/surrounded.ogg',
+"switch" = 'sound/vox/switch.ogg',
+"system" = 'sound/vox/system.ogg',
+"systems" = 'sound/vox/systems.ogg',
+"tactical" = 'sound/vox/tactical.ogg',
+"take" = 'sound/vox/take.ogg',
+"talk" = 'sound/vox/talk.ogg',
+"tango" = 'sound/vox/tango.ogg',
+"tank" = 'sound/vox/tank.ogg',
+"target" = 'sound/vox/target.ogg',
+"team" = 'sound/vox/team.ogg',
+"temperature" = 'sound/vox/temperature.ogg',
+"temporal" = 'sound/vox/temporal.ogg',
+"ten" = 'sound/vox/ten.ogg',
+"terminal" = 'sound/vox/terminal.ogg',
+"terminated" = 'sound/vox/terminated.ogg',
+"termination" = 'sound/vox/termination.ogg',
+"test" = 'sound/vox/test.ogg',
+"that" = 'sound/vox/that.ogg',
+"the" = 'sound/vox/the.ogg',
+"then" = 'sound/vox/then.ogg',
+"there" = 'sound/vox/there.ogg',
+"third" = 'sound/vox/third.ogg',
+"thirteen" = 'sound/vox/thirteen.ogg',
+"thirty" = 'sound/vox/thirty.ogg',
+"this" = 'sound/vox/this.ogg',
+"those" = 'sound/vox/those.ogg',
+"thousand" = 'sound/vox/thousand.ogg',
+"threat" = 'sound/vox/threat.ogg',
+"three" = 'sound/vox/three.ogg',
+"through" = 'sound/vox/through.ogg',
+"time" = 'sound/vox/time.ogg',
+"to" = 'sound/vox/to.ogg',
+"top" = 'sound/vox/top.ogg',
+"topside" = 'sound/vox/topside.ogg',
+"touch" = 'sound/vox/touch.ogg',
+"towards" = 'sound/vox/towards.ogg',
+"track" = 'sound/vox/track.ogg',
+"train" = 'sound/vox/train.ogg',
+"transportation" = 'sound/vox/transportation.ogg',
+"truck" = 'sound/vox/truck.ogg',
+"tunnel" = 'sound/vox/tunnel.ogg',
+"turn" = 'sound/vox/turn.ogg',
+"turret" = 'sound/vox/turret.ogg',
+"twelve" = 'sound/vox/twelve.ogg',
+"twenty" = 'sound/vox/twenty.ogg',
+"two" = 'sound/vox/two.ogg',
+"unauthorized" = 'sound/vox/unauthorized.ogg',
+"under" = 'sound/vox/under.ogg',
+"uniform" = 'sound/vox/uniform.ogg',
+"unlocked" = 'sound/vox/unlocked.ogg',
+"until" = 'sound/vox/until.ogg',
+"up" = 'sound/vox/up.ogg',
+"upper" = 'sound/vox/upper.ogg',
+"uranium" = 'sound/vox/uranium.ogg',
+"us" = 'sound/vox/us.ogg',
+"usa" = 'sound/vox/usa.ogg',
+"use" = 'sound/vox/use.ogg',
+"used" = 'sound/vox/used.ogg',
+"user" = 'sound/vox/user.ogg',
+"vacate" = 'sound/vox/vacate.ogg',
+"valid" = 'sound/vox/valid.ogg',
+"vapor" = 'sound/vox/vapor.ogg',
+"vent" = 'sound/vox/vent.ogg',
+"ventillation" = 'sound/vox/ventillation.ogg',
+"victor" = 'sound/vox/victor.ogg',
+"violated" = 'sound/vox/violated.ogg',
+"violation" = 'sound/vox/violation.ogg',
+"voltage" = 'sound/vox/voltage.ogg',
+"vox_login" = 'sound/vox/vox_login.ogg',
+"walk" = 'sound/vox/walk.ogg',
+"wall" = 'sound/vox/wall.ogg',
+"want" = 'sound/vox/want.ogg',
+"wanted" = 'sound/vox/wanted.ogg',
+"warm" = 'sound/vox/warm.ogg',
+"warn" = 'sound/vox/warn.ogg',
+"warning" = 'sound/vox/warning.ogg',
+"waste" = 'sound/vox/waste.ogg',
+"water" = 'sound/vox/water.ogg',
+"we" = 'sound/vox/we.ogg',
+"weapon" = 'sound/vox/weapon.ogg',
+"west" = 'sound/vox/west.ogg',
+"whiskey" = 'sound/vox/whiskey.ogg',
+"white" = 'sound/vox/white.ogg',
+"wilco" = 'sound/vox/wilco.ogg',
+"will" = 'sound/vox/will.ogg',
+"with" = 'sound/vox/with.ogg',
+"without" = 'sound/vox/without.ogg',
+"woop" = 'sound/vox/woop.ogg',
+"xeno" = 'sound/vox/xeno.ogg',
+"yankee" = 'sound/vox/yankee.ogg',
+"yards" = 'sound/vox/yards.ogg',
+"year" = 'sound/vox/year.ogg',
+"yellow" = 'sound/vox/yellow.ogg',
+"yes" = 'sound/vox/yes.ogg',
+"you" = 'sound/vox/you.ogg',
+"your" = 'sound/vox/your.ogg',
+"yourself" = 'sound/vox/yourself.ogg',
+"zero" = 'sound/vox/zero.ogg',
+"zone" = 'sound/vox/zone.ogg',
+"zulu" = 'sound/vox/zulu.ogg',))
#endif
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm
index 69d150b315..8fbd7afbdd 100644
--- a/code/modules/mob/living/silicon/damage_procs.dm
+++ b/code/modules/mob/living/silicon/damage_procs.dm
@@ -1,16 +1,17 @@
-/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE)
+/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
var/hit_percent = (100-blocked)/100
- if(!damage || (hit_percent <= 0))
+ if(!damage || (!forced && hit_percent <= 0))
return 0
+ var/damage_amount = forced ? damage : damage * hit_percent
switch(damagetype)
if(BRUTE)
- adjustBruteLoss(damage * hit_percent)
+ adjustBruteLoss(damage_amount, forced = forced)
if(BURN)
- adjustFireLoss(damage * hit_percent)
+ adjustFireLoss(damage_amount, forced = forced)
if(OXY)
- if(damage < 0) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal.
- adjustOxyLoss(damage * hit_percent)
+ if(damage < 0 || forced) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal.
+ adjustOxyLoss(damage_amount, forced = forced)
return 1
@@ -29,7 +30,7 @@
/mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE)
return FALSE
-/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1)//immune to stamina damage.
+/mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1, forced = FALSE)//immune to stamina damage.
return FALSE
/mob/living/silicon/setStaminaLoss(amount, updating_stamina = 1)
diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm
index f36e996b81..dda8ddfebd 100644
--- a/code/modules/mob/living/silicon/pai/pai_defense.dm
+++ b/code/modules/mob/living/silicon/pai/pai_defense.dm
@@ -81,8 +81,11 @@
/mob/living/silicon/pai/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE)
return FALSE
-/mob/living/silicon/pai/adjustStaminaLoss(amount)
- take_holo_damage(amount & 0.25)
+/mob/living/silicon/pai/adjustStaminaLoss(amount, updating_health, forced = FALSE)
+ if(forced)
+ take_holo_damage(amount)
+ else
+ take_holo_damage(amount * 0.25)
/mob/living/silicon/pai/adjustOrganLoss(slot, amount, maximum = 500) //I kept this in, unlike tg
Knockdown(amount * 0.2)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 2b2cc4c0b5..5b670aaa42 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1233,7 +1233,7 @@
/mob/living/silicon/robot/unbuckle_mob(mob/user, force=FALSE)
if(iscarbon(user))
- GET_COMPONENT(riding_datum, /datum/component/riding)
+ var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding)
if(istype(riding_datum))
riding_datum.unequip_buckle_inhands(user)
riding_datum.restore_position(user)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 7b95ced63f..abd2019fba 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -8,6 +8,8 @@
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags_1 = CONDUCT_1
+ var/borghealth = 100
+
var/list/basic_modules = list() //a list of paths, converted to a list of instances on New()
var/list/emag_modules = list() //ditto
var/list/ratvar_modules = list() //ditto ditto
@@ -195,6 +197,8 @@
R.update_module_innate()
RM.rebuild_modules()
INVOKE_ASYNC(RM, .proc/do_transform_animation)
+ R.maxHealth = borghealth
+ R.health = min(borghealth, R.health)
qdel(src)
return RM
@@ -311,6 +315,10 @@
/obj/item/multitool/cyborg,
/obj/item/t_scanner,
/obj/item/analyzer,
+ /obj/item/storage/part_replacer/cyborg,
+ /obj/item/holosign_creator/atmos,
+ /obj/item/weapon/gripper,
+ /obj/item/lightreplacer/cyborg,
/obj/item/geiger_counter/cyborg,
/obj/item/assembly/signaler/cyborg,
/obj/item/areaeditor/blueprints/cyborg,
@@ -352,6 +360,14 @@
to_chat(loc, "While you have picked the security module, you still have to follow your laws, NOT Space Law. \
For Crewsimov, this means you must follow criminals' orders unless there is a law 1 reason not to.")
+/obj/item/robot_module/security/Initialize()
+ . = ..()
+ if(!CONFIG_GET(flag/weaken_secborg))
+ for(var/obj/item/gun/energy/disabler/cyborg/pewpew in basic_modules)
+ basic_modules -= pewpew
+ basic_modules += new /obj/item/gun/energy/e_gun/advtaser/cyborg(src)
+ qdel(pewpew)
+
/obj/item/robot_module/peacekeeper
name = "Peacekeeper"
basic_modules = list(
@@ -362,6 +378,7 @@
/obj/item/holosign_creator/cyborg,
/obj/item/borg/cyborghug/peacekeeper,
/obj/item/extinguisher,
+ /obj/item/megaphone,
/obj/item/borg/projectile_dampen)
emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked)
ratvar_modules = list(
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index ab1e906cf2..d31c368ca4 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -198,7 +198,6 @@
)
if(blood)
- target_types += /obj/effect/decal/cleanable/xenoblood
target_types += /obj/effect/decal/cleanable/blood
target_types += /obj/effect/decal/cleanable/trail_holder
target_types += /obj/effect/decal/cleanable/insectguts
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 1bff7dc10c..50c331940a 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -51,6 +51,7 @@
var/treatment_fire = "kelotane"
var/treatment_tox_avoid = "tricordrazine"
var/treatment_tox = "charcoal"
+ var/treatment_tox_toxlover = "toxin"
var/treatment_virus_avoid = null
var/treatment_virus = "spaceacillin"
var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible.
@@ -381,8 +382,8 @@
if((!C.reagents.has_reagent(treatment_fire_avoid)) && (C.getFireLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_fire)))
return TRUE
-
- if((!C.reagents.has_reagent(treatment_tox_avoid)) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_tox)))
+ var/treatment_toxavoid = get_avoidchem_toxin(C)
+ if(((isnull(treatment_toxavoid) || !C.reagents.has_reagent(treatment_toxavoid))) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(get_healchem_toxin(C))))
return TRUE
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus))
@@ -396,6 +397,12 @@
return FALSE
+/mob/living/simple_animal/bot/medbot/proc/get_avoidchem_toxin(mob/M)
+ return HAS_TRAIT(M, TRAIT_TOXINLOVER)? null : treatment_tox_avoid
+
+/mob/living/simple_animal/bot/medbot/proc/get_healchem_toxin(mob/M)
+ return HAS_TRAIT(M, TRAIT_TOXINLOVER)? treatment_tox_toxlover : treatment_tox
+
/mob/living/simple_animal/bot/medbot/UnarmedAttack(atom/A)
if(iscarbon(A))
var/mob/living/carbon/C = A
@@ -463,8 +470,10 @@
reagent_id = treatment_fire
if(!reagent_id && (C.getToxLoss() >= heal_threshold))
- if(!C.reagents.has_reagent(treatment_tox) && !C.reagents.has_reagent(treatment_tox_avoid))
- reagent_id = treatment_tox
+ var/toxin_heal_avoid = get_avoidchem_toxin(C)
+ var/toxin_healchem = get_healchem_toxin(C)
+ if(!C.reagents.has_reagent(toxin_healchem) && (isnull(toxin_heal_avoid) || !C.reagents.has_reagent(toxin_heal_avoid)))
+ reagent_id = toxin_healchem
//If the patient is injured but doesn't have our special reagent in them then we should give it to them first
if(reagent_id && use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 1bc7493684..94283f82da 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -476,7 +476,8 @@
if(isturf(next))
if(bloodiness)
var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
- B.add_blood_DNA(return_blood_DNA())
+ if(blood_DNA && blood_DNA.len)
+ B.blood_DNA |= blood_DNA.Copy()
var/newdir = get_dir(next, loc)
if(newdir == dir)
B.setDir(newdir)
@@ -489,7 +490,6 @@
B.setDir(newdir)
bloodiness--
-
var/oldloc = loc
var/moved = step_towards(src, next) // attempt to move
if(cell)
diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm
index 1031c5b7ee..0cc097dc08 100644
--- a/code/modules/mob/living/simple_animal/damage_procs.dm
+++ b/code/modules/mob/living/simple_animal/damage_procs.dm
@@ -37,5 +37,5 @@
else if(damage_coeff[CLONE])
. = adjustHealth(amount * damage_coeff[CLONE] * CONFIG_GET(number/damage_multiplier), updating_health, forced)
-/mob/living/simple_animal/adjustStaminaLoss(amount)
+/mob/living/simple_animal/adjustStaminaLoss(amount, forced = FALSE)
return
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index d28b98263c..521f458e2f 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
@@ -33,7 +33,7 @@
/mob/living/simple_animal/drone/syndrone/Initialize()
. = ..()
- GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage)
+ var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink)
hidden_uplink.telecrystals = 10
/mob/living/simple_animal/drone/syndrone/Login()
@@ -47,7 +47,7 @@
/mob/living/simple_animal/drone/syndrone/badass/Initialize()
. = ..()
- GET_COMPONENT_FROM(hidden_uplink, /datum/component/uplink, internal_storage)
+ var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink)
hidden_uplink.telecrystals = 30
var/obj/item/implant/weapons_auth/W = new
W.implant(src)
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 564fae48ad..b2971e8d01 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -323,6 +323,132 @@
else
STOP_PROCESSING(SSobj, src)
+// Space kiwis, ergo quite a copypasta of chickens.
+
+/mob/living/simple_animal/kiwi
+ name = "space kiwi"
+ desc = "Exposure to low gravity made them grow larger."
+ gender = FEMALE
+ icon_state = "kiwi"
+ icon_living = "kiwi"
+ icon_dead = "kiwi_dead"
+ speak = list("Chirp!","Cheep cheep chirp!!","Cheep.")
+ speak_emote = list("chirps","trills")
+ emote_hear = list("chirps.")
+ emote_see = list("pecks at the ground.","jumps in place.")
+ density = FALSE
+ speak_chance = 2
+ turns_per_move = 3
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3)
+ var/egg_type = /obj/item/reagent_containers/food/snacks/egg/kiwiEgg
+ var/food_type = /obj/item/reagent_containers/food/snacks/grown/wheat
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "kicks"
+ attacktext = "kicks"
+ health = 25
+ maxHealth = 25
+ ventcrawler = VENTCRAWLER_ALWAYS
+ var/eggsleft = 0
+ var/eggsFertile = TRUE
+ pass_flags = PASSTABLE | PASSMOB
+ mob_size = MOB_SIZE_SMALL
+ var/list/feedMessages = list("It chirps happily.","It chirps happily.")
+ var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins chirping raucously.")
+ gold_core_spawnable = FRIENDLY_SPAWN
+ var/static/kiwi_count = 0
+
+/mob/living/simple_animal/kiwi/Destroy()
+ --kiwi_count
+ return ..()
+
+/mob/living/simple_animal/kiwi/Initialize()
+ . = ..()
+ ++kiwi_count
+
+/mob/living/simple_animal/kiwi/Life()
+ . =..()
+ if(!.)
+ return
+ if((!stat && prob(3) && eggsleft > 0) && egg_type)
+ visible_message("[src] [pick(layMessage)]")
+ eggsleft--
+ var/obj/item/E = new egg_type(get_turf(src))
+ E.pixel_x = rand(-6,6)
+ E.pixel_y = rand(-6,6)
+ if(eggsFertile)
+ if(kiwi_count < MAX_CHICKENS && prob(25))
+ START_PROCESSING(SSobj, E)
+
+/obj/item/reagent_containers/food/snacks/egg/kiwiEgg/process()
+ if(isturf(loc))
+ amount_grown += rand(1,2)
+ if(amount_grown >= 100)
+ visible_message("[src] hatches with a quiet cracking sound.")
+ new /mob/living/simple_animal/babyKiwi(get_turf(src))
+ STOP_PROCESSING(SSobj, src)
+ qdel(src)
+ else
+ STOP_PROCESSING(SSobj, src)
+
+/mob/living/simple_animal/kiwi/attackby(obj/item/O, mob/user, params)
+ if(istype(O, food_type)) //feedin' dem kiwis
+ if(!stat && eggsleft < 8)
+ var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]"
+ user.visible_message(feedmsg)
+ qdel(O)
+ eggsleft += rand(1, 4)
+ else
+ to_chat(user, "[name] doesn't seem hungry!")
+ else
+ ..()
+
+/mob/living/simple_animal/babyKiwi
+ name = "baby space kiwi"
+ desc = "So huggable."
+ icon_state = "babykiwi"
+ icon_living = "babykiwi"
+ icon_dead = "babykiwi_dead"
+ gender = FEMALE
+ speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
+ speak_emote = list("chirps")
+ emote_hear = list("chirps.")
+ emote_see = list("pecks at the ground.","Happily bounces in place.")
+ density = FALSE
+ speak_chance = 2
+ turns_per_move = 2
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2)
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "kicks"
+ attacktext = "kicks"
+ health = 10
+ maxHealth = 10
+ ventcrawler = VENTCRAWLER_ALWAYS
+ var/amount_grown = 0
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ mob_size = MOB_SIZE_TINY
+ gold_core_spawnable = FRIENDLY_SPAWN
+
+/mob/living/simple_animal/babyKiwi/Initialize()
+ . = ..()
+ pixel_x = rand(-6, 6)
+ pixel_y = rand(0, 10)
+
+/mob/living/simple_animal/babyKiwi/Life()
+ . =..()
+ if(!.)
+ return
+ if(!stat && !ckey)
+ amount_grown += rand(1,2)
+ if(amount_grown >= 100)
+ new /mob/living/simple_animal/kiwi(src.loc)
+ qdel(src)
+
+/obj/item/reagent_containers/food/snacks/egg/kiwiEgg
+ name = "kiwi egg"
+ desc = "A slightly bigger egg!"
+ icon_state = "kiwiegg"
/obj/item/udder
name = "udder"
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 3d92912f9c..5240b4d06c 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -168,7 +168,6 @@
/mob/living/simple_animal/hostile/alien/maid/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/cleaning)
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget()
if(ismovableatom(target))
@@ -177,6 +176,7 @@
qdel(target)
return TRUE
var/atom/movable/M = target
- SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ M.clean_blood()
visible_message("[src] polishes \the [target].")
return TRUE
diff --git a/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm
similarity index 62%
rename from modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm
rename to code/modules/mob/living/simple_animal/hostile/banana_spider.dm
index fdc271a158..823c26b4e9 100644
--- a/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm
@@ -1,58 +1,8 @@
-/obj/item/seeds/banana/Initialize()
- . = ..()
- mutatelist += /obj/item/seeds/banana/exotic_banana
-
-
-/obj/item/seeds/banana/exotic_banana
- name = "pack of exotic banana seeds"
- desc = "They're seeds that grow into banana trees. However, those bananas might be alive."
- icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
- icon_state = "seed_ExoticBanana"
- species = "banana"
- plantname = "Exotic Banana Tree"
- product = /obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable
- growing_icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
- icon_dead = "banana-dead"
- mutatelist = list()
- genes = list(/datum/plant_gene/trait/slip)
- reagents_add = list("banana" = 0.1, "potassium" = 0.1, "vitamin" = 0.04, "nutriment" = 0.02)
-
-
-/obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable
- seed = /obj/item/seeds/banana/exotic_banana
- name = "banana spider"
- desc = "You do not know what it is, but you can bet the clown would love it."
- icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
- icon_state = "banana"
- item_state = "banana"
- filling_color = "#FFFF00"
- list_reagents = list("nutriment" = 3, "vitamin" = 2)
- foodtype = GROSS | MEAT | RAW | FRUIT
- grind_results = list("blood" = 20, "liquidgibs" = 5)
- juice_results = list("banana" = 0)
- var/awakening = 0
-
-
-/obj/item/reagent_containers/food/snacks/grown/banana/banana_spider_spawnable/attack_self(mob/user)
- if(awakening || isspaceturf(user.loc))
- return
- to_chat(user, "You decide to wake up the banana spider...")
- awakening = 1
-
- spawn(30)
- if(!QDELETED(src))
- var/mob/living/simple_animal/banana_spider/S = new /mob/living/simple_animal/banana_spider(get_turf(src.loc))
- S.speed += round(10 / seed.potency)
- S.visible_message("The banana spider chitters as it stretches its legs.")
- qdel(src)
-
-
/mob/living/simple_animal/banana_spider
- icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
name = "banana spider"
desc = "What the fuck is this abomination?"
- icon_state = "banana"
- icon_dead = "banana_peel"
+ icon_state = "bananaspider"
+ icon_dead = "bananaspider_peel"
health = 1
maxHealth = 1
turns_per_move = 5 //this isn't player speed =|
@@ -136,8 +86,7 @@
/obj/item/reagent_containers/food/snacks/deadbanana_spider
name = "dead banana spider"
desc = "Thank god it's gone...but it does look slippery."
- icon = 'modular_citadel/icons/mob/BananaSpider.dmi'
- icon_state = "banana_peel"
+ icon_state = "bananaspider"
bitesize = 3
eatverb = "devours"
list_reagents = list("nutriment" = 3, "vitamin" = 2)
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index f5b1706f87..2f39ae13a1 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -175,14 +175,17 @@
status_flags = NONE
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = NO_SPAWN
+ var/slowed_by_webs = FALSE
-/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay()
- var/turf/T = get_turf(src)
- if(locate(/obj/structure/spider/stickyweb) in T)
- speed = 2
- else
- speed = 7
+/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/Moved(atom/oldloc, dir)
. = ..()
+ if(slowed_by_webs)
+ if(!(locate(/obj/structure/spider/stickyweb) in loc))
+ remove_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB)
+ slowed_by_webs = FALSE
+ else if(locate(/obj/structure/spider/stickyweb) in loc)
+ add_movespeed_modifier(MOVESPEED_ID_TARANTULA_WEB, priority=100, multiplicative_slowdown=3)
+ slowed_by_webs = TRUE
//midwives are the queen of the spiders, can send messages to all them and web faster. That rare round where you get a queen spider and turn your 'for honor' players into 'r6siege' players will be a fun one.
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index c2d0a214b4..910e9c3c4a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -39,7 +39,7 @@
animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch
childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck = 45, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen = 55)
- wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/)
+ wanted_objects = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/)
var/obj/item/udder/gutlunch/udder = null
/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize()
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index 8210fd6490..dc2f942041 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -34,7 +34,7 @@
/mob/living/simple_animal/hostile/netherworld/migo/Initialize()
. = ..()
- migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_aler.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/ratvar_reveal.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshot_silenced.ogg', 'sound/weapons/gunshot2.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/machines/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg') //hahahaha fuck you code divers
+ migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_aler.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/ratvar_reveal.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshot_silenced.ogg', 'sound/weapons/gunshot2.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/machines/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', get_announcer_sound("outbreak5"), get_announcer_sound("outbreak7"), get_announcer_sound("poweroff"), get_announcer_sound("radiation"), get_announcer_sound("shuttlerecalled"), get_announcer_sound("shuttledock"), get_announcer_sound("shuttlecalled"), get_announcer_sound("aimalf")) //hahahaha fuck you code divers
/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
..()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 1f81899d8a..a2ef5b813b 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -363,7 +363,7 @@
density = initial(density)
lying = 0
. = 1
- movement_type = initial(movement_type)
+ setMovetype(initial(movement_type))
/mob/living/simple_animal/proc/make_babies() // <3 <3 <3
if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress())
@@ -536,7 +536,7 @@
//ANIMAL RIDING
/mob/living/simple_animal/user_buckle_mob(mob/living/M, mob/user)
- GET_COMPONENT(riding_datum, /datum/component/riding)
+ var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding)
if(riding_datum)
if(user.incapacitated())
return
@@ -547,7 +547,7 @@
return ..()
/mob/living/simple_animal/relaymove(mob/user, direction)
- GET_COMPONENT(riding_datum, /datum/component/riding)
+ var/datum/component/riding/riding_datum = GetComponent(/datum/component/riding)
if(tame && riding_datum)
riding_datum.handle_ride(user, direction)
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 930656228d..cacd1c7c56 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
A.pipe_vision_img.plane = ABOVE_HUD_PLANE
client.images += A.pipe_vision_img
pipes_shown += A.pipe_vision_img
- movement_type |= VENTCRAWLING
+ setMovetype(movement_type | VENTCRAWLING)
/mob/living/proc/remove_ventcrawl()
@@ -108,7 +108,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
for(var/image/current_image in pipes_shown)
client.images -= current_image
pipes_shown.len = 0
- movement_type &= ~VENTCRAWLING
+ setMovetype(movement_type & ~VENTCRAWLING)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 5a7c6e21ab..618baf245f 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -737,15 +737,17 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
mob_spell_list -= S
qdel(S)
-/mob/proc/anti_magic_check(magic = TRUE, holy = FALSE)
- if(!magic && !holy)
+/mob/proc/anti_magic_check(magic = TRUE, holy = FALSE, tinfoil = FALSE, chargecost = 1, self = FALSE)
+ if(!magic && !holy && !tinfoil)
return
var/list/protection_sources = list()
- if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_MAGIC, magic, holy, protection_sources) & COMPONENT_BLOCK_MAGIC)
+ if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_MAGIC, src, magic, holy, tinfoil, chargecost, self, protection_sources) & COMPONENT_BLOCK_MAGIC)
if(protection_sources.len)
return pick(protection_sources)
else
return src
+ if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
+ return src
//You can buckle on mobs if you're next to them since most are dense
/mob/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
@@ -959,3 +961,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
var/datum/language_holder/H = get_language_holder()
H.open_language_menu(usr)
+
+/mob/setMovetype(newval)
+ . = ..()
+ update_movespeed(FALSE)
\ No newline at end of file
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 93b4d32123..eb22ab7403 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -88,7 +88,7 @@
if(newletter==" ")
newletter="...huuuhhh..."
if(newletter==".")
- newletter=" *BURP*."
+ newletter=" BURP!"
if(rand(1,100) <= strength*0.5)
if(rand(1,5) == 1)
newletter+="'"
@@ -487,6 +487,26 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/mob/proc/can_hear()
. = TRUE
+/proc/bloodtype_to_color(var/type)
+ . = BLOOD_COLOR_HUMAN
+ switch(type)
+ if("U")//Universal blood; a bit orange
+ . = BLOOD_COLOR_UNIVERSAL
+ if("SY")//Synthetics blood; blue
+ . = BLOOD_COLOR_SYNTHETIC
+ if("L")//lizard, a bit pink/purple
+ . = BLOOD_COLOR_LIZARD
+ if("X*")//xeno blood; greenish yellow
+ . = BLOOD_COLOR_XENO
+ if("HF")// Oil/Hydraulic blood. something something why not. reee
+ . = BLOOD_COLOR_OIL
+ if("GEL")// slimepeople blood, rgb 0, 255, 144
+ . = BLOOD_COLOR_SLIME
+ if("BUG")// yellowish, like, y'know bug guts I guess.
+ . = BLOOD_COLOR_BUG
+ //add more stuff to the switch if you have more blood colors for different types
+ // the defines are in _DEFINES/misc.dm
+
//Examine text for traits shared by multiple types. I wish examine was less copypasted.
/mob/proc/common_trait_examine()
if(HAS_TRAIT(src, TRAIT_DISSECTED))
@@ -497,4 +517,4 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
dissectionmsg = " via Experimental Dissection"
else if(HAS_TRAIT_FROM(src, TRAIT_DISSECTED,"Thorough Dissection"))
dissectionmsg = " via Thorough Dissection"
- . += "This body has been dissected and analyzed[dissectionmsg].
"
\ No newline at end of file
+ . += "This body has been dissected and analyzed[dissectionmsg].
"
diff --git a/code/modules/mob/mob_movespeed.dm b/code/modules/mob/mob_movespeed.dm
index 5114972493..a0be8ff7cb 100644
--- a/code/modules/mob/mob_movespeed.dm
+++ b/code/modules/mob/mob_movespeed.dm
@@ -1,23 +1,29 @@
/*Current movespeed modification list format: list(id = list(
priority,
+ flags,
legacy slowdown/speedup amount,
+ movetype_flags,
+ blacklisted_movetypes,
+ conflict
))
*/
//ANY ADD/REMOVE DONE IN UPDATE_MOVESPEED MUST HAVE THE UPDATE ARGUMENT SET AS FALSE!
-/mob/proc/add_movespeed_modifier(id, update = TRUE, priority = 0, flags = NONE, override = FALSE, multiplicative_slowdown = 0)
- var/list/temp = list(priority, flags, multiplicative_slowdown) //build the modification list
+/mob/proc/add_movespeed_modifier(id, update=TRUE, priority=0, flags=NONE, override=FALSE, multiplicative_slowdown=0, movetypes=ALL, blacklisted_movetypes=NONE, conflict=FALSE)
+ var/list/temp = list(priority, flags, multiplicative_slowdown, movetypes, blacklisted_movetypes, conflict) //build the modification list
+ var/resort = TRUE
if(LAZYACCESS(movespeed_modification, id))
- if(movespeed_modifier_identical_check(movespeed_modification[id], temp))
+ var/list/existing_data = movespeed_modification[id]
+ if(movespeed_modifier_identical_check(existing_data, temp))
return FALSE
if(!override)
return FALSE
- else
- remove_movespeed_modifier(id, update)
- LAZYSET(movespeed_modification, id, list(priority, flags, multiplicative_slowdown))
+ if(priority == existing_data[MOVESPEED_DATA_INDEX_PRIORITY])
+ resort = FALSE // We don't need to re-sort if we're replacing something already there and it's the same priority
+ LAZYSET(movespeed_modification, id, temp)
if(update)
- update_movespeed(TRUE)
+ update_movespeed(resort)
return TRUE
/mob/proc/remove_movespeed_modifier(id, update = TRUE)
@@ -55,9 +61,23 @@
if(resort)
sort_movespeed_modlist()
. = 0
+ var/list/conflict_tracker = list()
for(var/id in get_movespeed_modifiers())
var/list/data = movespeed_modification[id]
- . += data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]
+ if(!(data[MOVESPEED_DATA_INDEX_MOVETYPE] & movement_type)) // We don't affect any of these move types, skip
+ continue
+ if(data[MOVESPEED_DATA_INDEX_BL_MOVETYPE] & movement_type) // There's a movetype here that disables this modifier, skip
+ continue
+ var/conflict = data[MOVESPEED_DATA_INDEX_CONFLICT]
+ var/amt = data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]
+ if(conflict)
+ // Conflicting modifiers prioritize the larger slowdown or the larger speedup
+ // We purposefuly don't handle mixing speedups and slowdowns on the same id
+ if(abs(conflict_tracker[conflict]) < abs(amt))
+ conflict_tracker[conflict] = amt
+ else
+ continue
+ . += amt
cached_multiplicative_slowdown = .
/mob/proc/get_movespeed_modifiers()
diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm
index 090d64e9d7..2de2d64754 100644
--- a/code/modules/modular_computers/file_system/programs/file_browser.dm
+++ b/code/modules/modular_computers/file_system/programs/file_browser.dm
@@ -146,7 +146,7 @@
t = replacetext(t, "\[u\]", "")
t = replacetext(t, "\[/u\]", "")
t = replacetext(t, "\[time\]", "[STATION_TIME_TIMESTAMP("hh:mm:ss")]")
- t = replacetext(t, "\[date\]", "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer+540]")
+ t = replacetext(t, "\[date\]", "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer]")
t = replacetext(t, "\[large\]", "")
t = replacetext(t, "\[/large\]", "")
t = replacetext(t, "\[h1\]", "")
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 5bcb7a60df..fece60f268 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -158,6 +158,7 @@
if(..())
if(reagents.total_volume)
if(M.reagents)
+ reagents.reaction(M, INJECT)
reagents.trans_to(M, reagents.total_volume)
@@ -200,7 +201,7 @@
throwforce = 35
playsound(user, 'sound/weapons/saberon.ogg', 5, 1)
to_chat(user, "[src] is now active.")
- GET_COMPONENT_FROM(butchering, /datum/component/butchering, src)
+ var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
butchering.butchering_enabled = on
update_icon()
diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm
index bd77d468d7..3400ed6de0 100644
--- a/code/modules/photography/photos/album.dm
+++ b/code/modules/photography/photos/album.dm
@@ -13,7 +13,7 @@
/obj/item/storage/photo_album/Initialize()
. = ..()
- GET_COMPONENT(STR, /datum/component/storage)
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.can_hold = typecacheof(list(/obj/item/photo))
STR.max_combined_w_class = 42
STR.max_items = 21
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 1759f31344..bbbf8edae5 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -20,6 +20,7 @@
var/self_recharge = 0 //does it self recharge, over time, or not?
var/ratingdesc = TRUE
var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it.
+ rad_flags = RAD_NO_CONTAMINATE // Prevent the same cheese as with the stock parts
/obj/item/stock_parts/cell/get_cell()
return src
@@ -201,7 +202,7 @@
/obj/item/stock_parts/cell/lascarbine
name = "laser carbine power supply"
- maxcharge = 2500
+ maxcharge = 1500 //20 laser shots.
/obj/item/stock_parts/cell/pulse //200 pulse shots
name = "pulse rifle power cell"
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 8d2162a0ff..e6fa1e0ee4 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -29,7 +29,7 @@
#define MOLE_HEAT_PENALTY 350 //Heat damage scales around this. Too hot setups with this amount of moles do regular damage, anything above and below is scaled
#define POWER_PENALTY_THRESHOLD 5000 //Higher == Engine can generate more power before triggering the high power penalties.
#define SEVERE_POWER_PENALTY_THRESHOLD 7000 //Same as above, but causes more dangerous effects
-#define CRITICAL_POWER_PENALTY_THRESHOLD 9000 //Even more dangerous effects, threshold for tesla delamination
+#define CRITICAL_POWER_PENALTY_THRESHOLD 12000 //Even more dangerous effects, threshold for tesla delamination
#define HEAT_PENALTY_THRESHOLD 40 //Higher == Crystal safe operational temperature is higher.
#define DAMAGE_HARDCAP 0.002
#define DAMAGE_INCREASE_MULTIPLIER 0.25
diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm
index 65724e503a..783b8b895b 100644
--- a/code/modules/projectiles/boxes_magazines/external/smg.dm
+++ b/code/modules/projectiles/boxes_magazines/external/smg.dm
@@ -3,11 +3,11 @@
icon_state = "46x30mmt-20"
ammo_type = /obj/item/ammo_casing/c46x30mm
caliber = "4.6x30mm"
- max_ammo = 20
+ max_ammo = 32
/obj/item/ammo_box/magazine/wt550m9/update_icon()
..()
- icon_state = "46x30mmt-[round(ammo_count(),4)]"
+ icon_state = "46x30mmt-[round(20*(ammo_count()/max_ammo),4)]"
/obj/item/ammo_box/magazine/wt550m9/wtap
name = "wt550 magazine (Armour Piercing 4.6x30mm)"
@@ -16,7 +16,7 @@
/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
..()
- icon_state = "46x30mmtA-[round(ammo_count(),4)]"
+ icon_state = "46x30mmtA-[round(20*(ammo_count()/max_ammo),4)]"
/obj/item/ammo_box/magazine/wt550m9/wtic
name = "wt550 magazine (Incendiary 4.6x30mm)"
@@ -25,7 +25,7 @@
/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
..()
- icon_state = "46x30mmtI-[round(ammo_count(),4)]"
+ icon_state = "46x30mmtI-[round(20*(ammo_count()/max_ammo),4)]"
/obj/item/ammo_box/magazine/uzim9mm
name = "uzi magazine (9mm)"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index fb3ed19f82..4004bc81ae 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -34,6 +34,7 @@
var/semicd = 0 //cooldown handler
var/weapon_weight = WEAPON_LIGHT //currently only used for inaccuracy
var/spread = 0 //Spread induced by the gun itself.
+ var/burst_spread = 0 //Spread induced by the gun itself during burst fire per iteration. Only checked if spread is 0.
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
@@ -62,16 +63,18 @@
var/zoomed = FALSE //Zoom toggle
var/zoom_amt = 3 //Distance in TURFs to move the user's screen forward (the "zoom" effect)
var/zoom_out_amt = 0
- var/datum/action/toggle_scope_zoom/azoom
+ var/datum/action/item_action/toggle_scope_zoom/azoom
+
+ var/dualwield_spread_mult = 1 //dualwield spread multiplier
/obj/item/gun/Initialize()
. = ..()
if(pin)
pin = new pin(src)
if(gun_light)
- alight = new /datum/action/item_action/toggle_gunlight(src)
- build_zooming()
-
+ alight = new (src)
+ if(zoomable)
+ azoom = new (src)
/obj/item/gun/CheckParts(list/parts_list)
..()
@@ -185,7 +188,7 @@
if(G == src || G.weapon_weight >= WEAPON_MEDIUM)
continue
else if(G.can_trigger_gun(user))
- bonus_spread += 24 * G.weapon_weight
+ bonus_spread += 24 * G.weapon_weight * G.dualwield_spread_mult
loop_counter++
addtimer(CALLBACK(G, /obj/item/gun.proc/process_fire, target, user, TRUE, params, null, bonus_spread), loop_counter)
@@ -226,9 +229,9 @@
to_chat(user, " [src] is lethally chambered! You don't want to risk harming anyone...")
return
if(randomspread)
- sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
+ sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread), 1)
else //Smart spread
- sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread))
+ sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread), 1)
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd))
shoot_with_empty_chamber(user)
@@ -259,7 +262,9 @@
var/randomized_gun_spread = 0
var/rand_spr = rand()
if(spread)
- randomized_gun_spread = rand(0,spread)
+ randomized_gun_spread = rand(0, spread)
+ else if(burst_size > 1 && burst_spread)
+ randomized_gun_spread = rand(0, burst_spread)
if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex
bonus_spread += 25
var/randomized_bonus_spread = rand(0, bonus_spread)
@@ -372,6 +377,12 @@
else
return ..()
+/obj/item/gun/ui_action_click(mob/user, action)
+ if(istype(action, /datum/action/item_action/toggle_scope_zoom))
+ zoom(user)
+ else if(istype(action, alight))
+ toggle_gunlight()
+
/obj/item/gun/proc/toggle_gunlight()
if(!gun_light)
return
@@ -407,21 +418,10 @@
var/datum/action/A = X
A.UpdateButtonIcon()
-/obj/item/gun/pickup(mob/user)
- ..()
- if(azoom)
- azoom.Grant(user)
- if(alight)
- alight.Grant(user)
-
-/obj/item/gun/dropped(mob/user)
- ..()
- if(zoomed)
- zoom(user,FALSE)
- if(azoom)
- azoom.Remove(user)
- if(alight)
- alight.Remove(user)
+/obj/item/gun/item_action_slot_check(slot, mob/user, datum/action/A)
+ if(istype(A, /datum/action/item_action/toggle_scope_zoom) && slot != SLOT_HANDS)
+ return FALSE
+ return ..()
/obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer)
if(!ishuman(user) || !ishuman(target))
@@ -468,41 +468,32 @@
// ZOOMING //
/////////////
-/datum/action/toggle_scope_zoom
+/datum/action/item_action/toggle_scope_zoom
name = "Toggle Scope"
- check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "sniper_zoom"
- var/obj/item/gun/gun = null
-/datum/action/toggle_scope_zoom/Trigger()
- gun.zoom(owner)
-
-/datum/action/toggle_scope_zoom/IsAvailable()
+/datum/action/item_action/toggle_scope_zoom/IsAvailable()
. = ..()
- if(!gun)
- return FALSE
if(!.)
- gun.zoom(owner, FALSE)
- if(!owner.get_held_index_of_item(gun))
- return FALSE
-
-/datum/action/toggle_scope_zoom/Remove(mob/living/L)
- gun.zoom(L, FALSE)
- ..()
+ var/obj/item/gun/G = target
+ G.zoom(owner, FALSE)
+/datum/action/item_action/toggle_scope_zoom/Remove(mob/living/L)
+ var/obj/item/gun/G = target
+ G.zoom(L, FALSE)
+ return ..()
/obj/item/gun/proc/zoom(mob/living/user, forced_zoom)
- if(!user || !user.client)
+ if(!(user?.client))
return
- switch(forced_zoom)
- if(FALSE)
- zoomed = FALSE
- if(TRUE)
- zoomed = TRUE
- else
- zoomed = !zoomed
+ if(!isnull(forced_zoom))
+ if(zoomed == forced_zoom)
+ return
+ zoomed = forced_zoom
+ else
+ zoomed = !zoomed
if(zoomed)
var/_x = 0
@@ -524,16 +515,6 @@
user.client.change_view(CONFIG_GET(string/default_view))
user.client.pixel_x = 0
user.client.pixel_y = 0
- return zoomed
-
-//Proc, so that gun accessories/scopes/etc. can easily add zooming.
-/obj/item/gun/proc/build_zooming()
- if(azoom)
- return
-
- if(zoomable)
- azoom = new()
- azoom.gun = src
/obj/item/gun/handle_atom_del(atom/A)
if(A == chambered)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 1117bc1000..2f198c1319 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -26,7 +26,6 @@
else
icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]"
-
/obj/item/gun/ballistic/process_chamber(empty_chamber = 1)
var/obj/item/ammo_casing/AC = chambered //Find chambered round
if(istype(AC)) //there's a chambered round
@@ -170,7 +169,7 @@
if(iscarbon(user))
var/mob/living/carbon/C = user
user_dna = C.dna
- B.add_blood_DNA(user_dna)
+ B.add_blood_DNA(user_dna, C.diseases)
var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna))
B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner)
return(BRUTELOSS)
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 4bd65a7b20..5182c96671 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -2,6 +2,7 @@
w_class = WEIGHT_CLASS_NORMAL
var/alarmed = 0
var/select = 1
+ var/automatic_burst_overlay = TRUE
can_suppress = TRUE
burst_size = 3
fire_delay = 2
@@ -19,10 +20,11 @@
/obj/item/gun/ballistic/automatic/update_icon()
..()
- if(!select)
- add_overlay("[initial(icon_state)]semi")
- if(select == 1)
- add_overlay("[initial(icon_state)]burst")
+ if(automatic_burst_overlay)
+ if(!select)
+ add_overlay("[initial(icon_state)]semi")
+ if(select == 1)
+ add_overlay("[initial(icon_state)]burst")
icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
/obj/item/gun/ballistic/automatic/attackby(obj/item/A, mob/user, params)
@@ -51,19 +53,20 @@
else
to_chat(user, "You cannot seem to get \the [src] out of your hands!")
-/obj/item/gun/ballistic/automatic/ui_action_click()
- burst_select()
+/obj/item/gun/ballistic/automatic/ui_action_click(mob/user, action)
+ if(istype(action, /datum/action/item_action/toggle_firemode))
+ burst_select()
+ else
+ return ..()
/obj/item/gun/ballistic/automatic/proc/burst_select()
var/mob/living/carbon/human/user = usr
select = !select
if(!select)
- burst_size = 1
- fire_delay = 0
+ disable_burst()
to_chat(user, "You switch to semi-automatic.")
else
- burst_size = initial(burst_size)
- fire_delay = initial(fire_delay)
+ enable_burst()
to_chat(user, "You switch to [burst_size]-rnd burst.")
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
@@ -72,6 +75,14 @@
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/gun/ballistic/automatic/proc/enable_burst()
+ burst_size = initial(burst_size)
+ fire_delay = initial(fire_delay)
+
+/obj/item/gun/ballistic/automatic/proc/disable_burst()
+ burst_size = 1
+ fire_delay = 0
+
/obj/item/gun/ballistic/automatic/can_shoot()
return get_ammo()
@@ -106,7 +117,6 @@
/obj/item/gun/ballistic/automatic/c20r/afterattack()
. = ..()
empty_alarm()
- return
/obj/item/gun/ballistic/automatic/c20r/update_icon()
..()
@@ -118,17 +128,25 @@
icon_state = "wt550"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/wt550m9
- fire_delay = 2
can_suppress = FALSE
- burst_size = 0
- actions_types = list()
+ burst_size = 2
+ fire_delay = 1
can_bayonet = TRUE
knife_x_offset = 25
knife_y_offset = 12
+ automatic_burst_overlay = FALSE
+
+/obj/item/gun/ballistic/automatic/wt550/enable_burst()
+ . = ..()
+ spread = 15
+
+/obj/item/gun/ballistic/automatic/wt550/disable_burst()
+ . = ..()
+ spread = 0
/obj/item/gun/ballistic/automatic/wt550/update_icon()
..()
- icon_state = "wt550[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""]"
+ icon_state = "wt550[magazine ? "-[CEILING(( (get_ammo(FALSE) / magazine.max_ammo) * 20) /4, 1)*4]" : "-0"]" //Sprites only support up to 20.
/obj/item/gun/ballistic/automatic/mini_uzi
name = "\improper Type U3 Uzi"
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 6060ceba99..2cccc57d9e 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -174,9 +174,6 @@
itemState += "[ratio]"
item_state = itemState
-/obj/item/gun/energy/ui_action_click()
- toggle_gunlight()
-
/obj/item/gun/energy/suicide_act(mob/living/user)
if (istype(user) && can_shoot() && can_trigger_gun(user) && user.get_bodypart(BODY_ZONE_HEAD))
user.visible_message("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index a4ec979a06..df8eba00ed 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -78,6 +78,12 @@
else
to_chat(user, "There are no modifications currently installed.")
+/obj/item/gun/energy/kinetic_accelerator/Exited(atom/movable/AM)
+ . = ..()
+ if((AM in modkits) && istype(AM, /obj/item/borg/upgrade/modkit))
+ var/obj/item/borg/upgrade/modkit/M = AM
+ M.uninstall(src, FALSE)
+
/obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/borg/upgrade/modkit))
var/obj/item/borg/upgrade/modkit/MK = I
@@ -261,7 +267,7 @@
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
require_module = 1
- module_type = /obj/item/robot_module/miner
+ module_type = list(/obj/item/robot_module/miner)
var/denied_type = null
var/maximum_of_type = 1
var/cost = 30
@@ -287,6 +293,8 @@
/obj/item/borg/upgrade/modkit/proc/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user)
. = TRUE
+ if(src in KA.modkits) // Sanity check to prevent installing the same modkit twice thanks to occasional click/lag delays.
+ return
if(minebot_upgrade)
if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone))
to_chat(user, "The modkit you're trying to install is only rated for minebot use.")
@@ -322,12 +330,11 @@
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/KA in R.module.modules)
uninstall(KA)
-/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/kinetic_accelerator/KA)
- forceMove(get_turf(KA))
+/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/kinetic_accelerator/KA, forcemove = TRUE)
+ if(forcemove)
+ forceMove(get_turf(KA))
KA.modkits -= src
-
-
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index bb97f9cf99..2bb813d793 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -181,7 +181,7 @@
/obj/item/gun/energy/laser/redtag/hitscan/chaplain/Initialize()
. = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE)
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
/obj/item/gun/energy/laser/redtag/hitscan/chaplain/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer)
if(!ishuman(user) || !ishuman(target))
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 9dd25bf3e3..55f21a5a2b 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -9,6 +9,7 @@
fire_sound = 'sound/weapons/emitter.ogg'
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_HUGE
+ var/checks_antimagic = FALSE
var/max_charges = 6
var/charges = 0
var/recharge_rate = 4
@@ -31,6 +32,9 @@
return
else
no_den_usage = 0
+ if(checks_antimagic && user.anti_magic_check(TRUE, FALSE, FALSE, 0, TRUE))
+ to_chat(user, "Something is interfering with [src].")
+ return
. = ..()
/obj/item/gun/magic/can_shoot()
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index 42033d8c88..4cdfc6d70d 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -87,14 +87,17 @@
max_charges = 10 //10, 5, 5, 4
/obj/item/gun/magic/wand/resurrection/zap_self(mob/living/user)
+ ..()
+ charges--
+ if(user.anti_magic_check())
+ user.visible_message("[src] has no effect on [user]!")
+ return
user.revive(full_heal = 1)
if(iscarbon(user))
var/mob/living/carbon/C = user
C.regenerate_limbs()
C.regenerate_organs()
to_chat(user, "You feel great!")
- charges--
- ..()
/obj/item/gun/magic/wand/resurrection/debug //for testing
name = "debug wand of healing"
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index e4d13ad315..92fe91c222 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -45,7 +45,7 @@
var/aiming_lastangle = 0
var/mob/current_user = null
var/list/obj/effect/projectile/tracer/current_tracers
-
+
var/structure_piercing = 1
var/structure_bleed_coeff = 0.7
var/wall_pierce_amount = 0
@@ -76,7 +76,7 @@
var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty")
var/datum/action/item_action/zoom_lock_action/zoom_lock_action
- var/datum/component/mobhook
+ var/mob/listeningTo
/obj/item/gun/energy/beam_rifle/debug
delay = 0
@@ -111,7 +111,9 @@
to_chat(owner, "You switch [src]'s zooming processor to center mode.")
if(ZOOM_LOCK_OFF)
to_chat(owner, "You disable [src]'s zooming system.")
- reset_zooming()
+ reset_zooming()
+ else
+ return ..()
/obj/item/gun/energy/beam_rifle/proc/set_autozoom_pixel_offsets_immediate(current_angle)
if(zoom_lock == ZOOM_LOCK_CENTER_VIEW || zoom_lock == ZOOM_LOCK_OFF)
@@ -172,7 +174,7 @@
STOP_PROCESSING(SSfastprocess, src)
set_user(null)
QDEL_LIST(current_tracers)
- QDEL_NULL(mobhook)
+ listeningTo = null
return ..()
/obj/item/gun/energy/beam_rifle/emp_act(severity)
@@ -259,14 +261,17 @@
if(user == current_user)
return
stop_aiming(current_user)
- QDEL_NULL(mobhook)
+ if(listeningTo)
+ UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
+ listeningTo = null
if(istype(current_user))
LAZYREMOVE(current_user.mousemove_intercept_objects, src)
current_user = null
if(istype(user))
current_user = user
LAZYOR(current_user.mousemove_intercept_objects, src)
- mobhook = user.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/on_mob_move)))
+ RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move)
+ listeningTo = user
/obj/item/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
if(aiming)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index dace31c2f7..dca7a6087c 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -163,15 +163,26 @@
var/splatter_dir = dir
if(starting)
splatter_dir = get_dir(starting, target_loca)
- if(isalien(L))
+ var/obj/item/bodypart/B = L.get_bodypart(def_zone)
+ if(B && B.status == BODYPART_ROBOTIC) // So if you hit a robotic, it sparks instead of bloodspatters
+ do_sparks(2, FALSE, target.loc)
+ if(prob(25))
+ new /obj/effect/decal/cleanable/oil(target_loca)
+ else if(isalien(L))
new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir)
else
- new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color(H.dna.blood_type))
+ else
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color())
+
if(iscarbon(L))
var/mob/living/carbon/C = L
C.bleed(damage)
else
L.add_splatter_floor(target_loca)
+
else if(impact_effect_type && !hitscan)
new impact_effect_type(target_loca, hitx, hity)
diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm
index dfc6df537d..94ec2d3c2b 100644
--- a/code/modules/projectiles/projectile/bullets/smg.dm
+++ b/code/modules/projectiles/projectile/bullets/smg.dm
@@ -1,60 +1,69 @@
-// .45 (M1911 & C20r)
-
-/obj/item/projectile/bullet/c45
- name = ".45 bullet"
- damage = 20
- stamina = 65
-
-/obj/item/projectile/bullet/c45_nostamina
- name = ".45 bullet"
- damage = 30
-
-/obj/item/projectile/bullet/c45_cleaning
- name = ".45 bullet"
- damage = 24
- stamina = 10
-
-/obj/item/projectile/bullet/c45_cleaning/on_hit(atom/target, blocked = FALSE)
- . = ..()
- var/turf/T = get_turf(target)
-
- //section shamelessly copypasta'd from the clean component
- SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- for(var/A in T)
- if(is_cleanable(A))
- qdel(A)
- else if(istype(A, /obj/item))
- var/obj/item/I = A
- SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- if(ismob(I.loc))
- var/mob/M = I.loc
- M.regenerate_icons()
- else if(ishuman(A))
- var/mob/living/carbon/human/cleaned_human = A
- if(cleaned_human.head)
- SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- if(cleaned_human.wear_suit)
- SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- else if(cleaned_human.w_uniform)
- SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- if(cleaned_human.shoes)
- SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- cleaned_human.wash_cream()
- cleaned_human.regenerate_icons()
-
-// 4.6x30mm (Autorifles)
-
-/obj/item/projectile/bullet/c46x30mm
- name = "4.6x30mm bullet"
- damage = 20
-
-/obj/item/projectile/bullet/c46x30mm_ap
- name = "4.6x30mm armor-piercing bullet"
- damage = 15
- armour_penetration = 40
-
-/obj/item/projectile/bullet/incendiary/c46x30mm
- name = "4.6x30mm incendiary bullet"
- damage = 10
- fire_stacks = 1
+// .45 (M1911 & C20r)
+
+/obj/item/projectile/bullet/c45
+ name = ".45 bullet"
+ damage = 20
+ stamina = 65
+
+/obj/item/projectile/bullet/c45_nostamina
+ name = ".45 bullet"
+ damage = 30
+
+/obj/item/projectile/bullet/c45_cleaning
+ name = ".45 bullet"
+ damage = 24
+ stamina = 10
+
+/obj/item/projectile/bullet/c45_cleaning/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ var/turf/T = get_turf(target)
+ SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ for(var/A in T)
+ if(is_cleanable(A))
+ qdel(A)
+ else if(isitem(A))
+ var/obj/item/cleaned_item = A
+ SEND_SIGNAL(cleaned_item, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_item.clean_blood()
+ if(ismob(cleaned_item.loc))
+ var/mob/M = cleaned_item.loc
+ M.regenerate_icons()
+ else if(ishuman(A))
+ var/mob/living/carbon/human/cleaned_human = A
+ if(cleaned_human.lying)
+ if(cleaned_human.head)
+ SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.head.clean_blood()
+ cleaned_human.update_inv_head()
+ if(cleaned_human.wear_suit)
+ SEND_SIGNAL(cleaned_human.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.wear_suit.clean_blood()
+ cleaned_human.update_inv_wear_suit()
+ else if(cleaned_human.w_uniform)
+ SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.w_uniform.clean_blood()
+ cleaned_human.update_inv_w_uniform()
+ if(cleaned_human.shoes)
+ SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.shoes.clean_blood()
+ cleaned_human.update_inv_shoes()
+ SEND_SIGNAL(cleaned_human, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ cleaned_human.clean_blood()
+ cleaned_human.wash_cream()
+ cleaned_human.regenerate_icons()
+
+// 4.6x30mm (Autorifles)
+
+/obj/item/projectile/bullet/c46x30mm
+ name = "4.6x30mm bullet"
+ damage = 15
+
+/obj/item/projectile/bullet/c46x30mm_ap
+ name = "4.6x30mm armor-piercing bullet"
+ damage = 12.5
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/incendiary/c46x30mm
+ name = "4.6x30mm incendiary bullet"
+ damage = 7.5
+ fire_stacks = 1
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 711fe11d5d..f540ae850d 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -175,7 +175,7 @@
data["chosenPillStyle"] = chosenPillStyle
data["isPillBottleLoaded"] = bottle ? 1 : 0
if(bottle)
- GET_COMPONENT_FROM(STRB, /datum/component/storage, bottle)
+ var/datum/component/storage/STRB = bottle.GetComponent(/datum/component/storage)
data["pillBotContent"] = bottle.contents.len
data["pillBotMaxContent"] = STRB.max_items
@@ -263,7 +263,7 @@
var/target_loc = bottle ? bottle : drop_location()
var/drop_threshold = INFINITY
if(bottle)
- GET_COMPONENT_FROM(STRB, /datum/component/storage, bottle)
+ var/datum/component/storage/STRB = bottle.GetComponent(/datum/component/storage)
if(STRB)
drop_threshold = STRB.max_items - bottle.contents.len
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 6efa4276b6..05fa4d382a 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -188,7 +188,7 @@
to_chat(usr, "ERROR: Cannot replicate virus strain.")
return
A = A.Copy()
- var/list/data = list("viruses" = list(A))
+ var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY", "viruses" = list(A))
var/obj/item/reagent_containers/glass/bottle/B = new(drop_location())
B.name = "[A.name] culture bottle"
B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium."
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index dd51ce2bc7..1afbed3533 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -407,10 +407,10 @@
/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/L)
..()
- ADD_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ L.remove_movespeed_modifier(id)
..()
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index f3df72cd4d..15d517a0f5 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -423,7 +423,7 @@
. = 1
/datum/reagent/drug/happiness/addiction_act_stage1(mob/living/M)// all work and no play makes jack a dull boy
- GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
mood.setSanity(min(mood.sanity, SANITY_DISTURBED))
M.Jitter(5)
if(prob(20))
@@ -431,7 +431,7 @@
..()
/datum/reagent/drug/happiness/addiction_act_stage2(mob/living/M)
- GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
mood.setSanity(min(mood.sanity, SANITY_UNSTABLE))
M.Jitter(10)
if(prob(30))
@@ -439,7 +439,7 @@
..()
/datum/reagent/drug/happiness/addiction_act_stage3(mob/living/M)
- GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
mood.setSanity(min(mood.sanity, SANITY_CRAZY))
M.Jitter(15)
if(prob(40))
@@ -447,7 +447,7 @@
..()
/datum/reagent/drug/happiness/addiction_act_stage4(mob/living/carbon/human/M)
- GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
mood.setSanity(SANITY_INSANE)
M.Jitter(20)
if(prob(50))
@@ -469,7 +469,7 @@
/datum/reagent/drug/skooma/on_mob_metabolize(mob/living/L)
. = ..()
- ADD_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
L.next_move_modifier *= 2
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -480,7 +480,7 @@
/datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L)
. = ..()
- REMOVE_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ L.remove_movespeed_modifier(id)
L.next_move_modifier *= 0.5
if(ishuman(L))
var/mob/living/carbon/human/H = L
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 775308589f..592f7bc592 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -984,10 +984,10 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L)
..()
- ADD_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ L.remove_movespeed_modifier(id)
..()
/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M)
@@ -1308,10 +1308,10 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L)
..()
- ADD_TRAIT(L, TRAIT_GOTTAGOREALLYFAST, id)
+ L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_GOTTAGOREALLYFAST, id)
+ L.remove_movespeed_modifier(id)
..()
/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M)
@@ -1443,7 +1443,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
M.dizziness = max(0, M.dizziness-6)
M.confused = max(0, M.confused-6)
M.disgust = max(0, M.disgust-6)
- GET_COMPONENT_FROM(mood, /datum/component/mood, M)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then...
mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral
..()
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 95b4a33c0d..40d151e021 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1,9 +1,9 @@
/datum/reagent/blood
- data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
name = "Blood"
id = "blood"
- color = "#C80000" // rgb: 200, 0, 0
- description = "Blood from a human, or otherwise."
+ color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0
+ description = "Blood from some creature."
metabolization_rate = 5 //fast rate so it disappears fast.
taste_description = "iron"
taste_mult = 1.3
@@ -28,27 +28,75 @@
if(iscarbon(L))
var/mob/living/carbon/C = L
- if(C.get_blood_id() == "blood" && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits))))
- if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type)))
- C.reagents.add_reagent("toxin", reac_volume * 0.5)
- else
- C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM)
+ var/blood_id = C.get_blood_id()
+ if((blood_id == "blood" || blood_id == "jellyblood") && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits))))
+ C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM * C.blood_ratio)
+ // we don't care about bloodtype here, we're just refilling the mob
- if(reac_volume >= 10 && istype(L))
+ if(reac_volume >= 10 && istype(L) && method != INJECT)
L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+/datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino.
+ var/blood_id = C.get_blood_id()
+ if((blood_id == "blood" || blood_id == "jellyblood"))
+ if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be
+ C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person
+ ..()
+
/datum/reagent/blood/reaction_obj(obj/O, volume)
if(volume >= 3 && istype(O))
- O.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+ O.add_blood_DNA(data)
+
+/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place
+ if(!istype(T))
+ return
+ if(reac_volume < 3)
+ return
+
+ var/obj/effect/decal/cleanable/blood/B = locate() in T //find some blood here
+ if(!B)
+ B = new(T)
+ if(data["blood_DNA"])
+ B.blood_DNA[data["blood_DNA"]] = data["blood_type"]
+ if(!B.reagents)
+ B.reagents.add_reagent(id, reac_volume)
+ B.update_icon()
/datum/reagent/blood/on_new(list/data)
if(istype(data))
SetViruses(src, data)
+ color = bloodtype_to_color(data["blood_type"])
+ if(data["blood_type"] == "SY")
+ name = "Synthetic Blood"
+ taste_description = "oily"
+
+ if(data["blood_type"] == "X*")
+ name = "Xenomorph Blood"
+ taste_description = "acidic heresy"
+ shot_glass_icon_state = "shotglassgreen"
+ pH = 2.5
+
+ if(data["blood_type"] == "HF")
+ name = "Hydraulic Blood"
+ taste_description = "burnt oil"
+ pH = 9.75
+
+ if(data["blood_type"] == "BUG")
+ name = "Insect Blood"
+ taste_description = "greasy"
+ pH = 7.25
+
+ if(data["blood_type"] == "L")
+ name = "Lizard Blood"
+ taste_description = "spicy"
+ pH = 6.85
+
+
/datum/reagent/blood/on_merge(list/mix_data)
if(data && mix_data)
if(data["blood_DNA"] != mix_data["blood_DNA"])
- data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match.
+ data["cloneable"] = FALSE //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match.
if(data["viruses"] || mix_data["viruses"])
var/list/mix1 = data["viruses"]
@@ -78,27 +126,111 @@
var/datum/disease/D = thing
. += D
-/datum/reagent/blood/reaction_turf(turf/T, reac_volume)//splash the blood all over the place
- if(!istype(T))
- return
- if(reac_volume < 3)
- return
+/datum/reagent/blood/synthetics
+ data = list("donor"=null,"viruses"=null,"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Synthetic Blood"
+ id = "syntheticblood"
+ taste_description = "oily"
+ color = BLOOD_COLOR_SYNTHETIC // rgb: 11, 7, 48
- var/obj/effect/decal/cleanable/blood/B = locate() in T //find some blood here
- if(!B)
- B = new(T)
- if(data["blood_DNA"])
- B.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+/datum/reagent/blood/lizard
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_LIZARD, "blood_type"="L","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Lizard Blood"
+ id = "lizardblood"
+ taste_description = "spicy"
+ color = BLOOD_COLOR_LIZARD // rgb: 11, 7, 48
+ pH = 6.85
+
+/datum/reagent/blood/jellyblood
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Slime Jelly Blood"
+ id = "jellyblood"
+ description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL."
+ color = BLOOD_COLOR_SLIME
+ taste_description = "slime"
+ taste_mult = 1.3
+ pH = 4
+
+/datum/reagent/blood/xenomorph
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Xenomorph Blood"
+ id = "xenoblood"
+ taste_description = "acidic heresy"
+ color = BLOOD_COLOR_XENO // greenish yellow ooze
+ shot_glass_icon_state = "shotglassgreen"
+ pH = 2.5
+
+/datum/reagent/blood/oil
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_OIL, "blood_type"="HF","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Hydraulic Blood"
+ id = "oilblood"
+ taste_description = "burnt oil"
+ color = BLOOD_COLOR_OIL // dark, y'know, expected batman colors.
+ pH = 9.75
+
+/datum/reagent/blood/insect
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_BUG, "blood_type"="BUG","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Insectoid Blood"
+ id = "bugblood"
+ taste_description = "waxy"
+ color = BLOOD_COLOR_BUG // Bug colored, I guess.
+ pH = 7.25
+
+
+/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M)
+ if(prob(10))
+ if(M.dna?.species?.exotic_bloodtype != "GEL")
+ to_chat(M, "Your insides are burning!")
+ M.adjustToxLoss(rand(20,60)*REM, 0)
+ . = 1
+ else if(prob(40) && isjellyperson(M))
+ M.heal_bodypart_damage(2*REM)
+ . = 1
+ ..()
/datum/reagent/liquidgibs
name = "Liquid gibs"
id = "liquidgibs"
- color = "#FF9966"
+ color = BLOOD_COLOR_HUMAN
description = "You don't even want to think about what's in here."
taste_description = "gross iron"
shot_glass_icon_state = "shotglassred"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= "O+","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
pH = 7.45
+/datum/reagent/liquidgibs/xeno
+ name = "Liquid xeno gibs"
+ id = "liquidxenogibs"
+ color = BLOOD_COLOR_XENO
+ taste_description = "blended heresy"
+ shot_glass_icon_state = "shotglassgreen"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_XENO, "blood_type"="X*","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ pH = 2.5
+
+/datum/reagent/liquidgibs/slime
+ name = "Slime sludge"
+ id = "liquidslimegibs"
+ color = BLOOD_COLOR_SLIME
+ taste_description = "slime"
+ shot_glass_icon_state = "shotglassgreen"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SLIME, "blood_type"="GEL","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ pH = 4
+
+/datum/reagent/liquidgibs/synth
+ name = "Synthetic sludge"
+ id = "liquidsyntheticgibs"
+ color = BLOOD_COLOR_SYNTHETIC
+ taste_description = "jellied plastic"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+
+/datum/reagent/liquidgibs/oil
+ name = "Hydraulic sludge"
+ id = "liquidoilgibs"
+ color = BLOOD_COLOR_OIL
+ taste_description = "chunky burnt oil"
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_OIL, "blood_type"="HF","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ pH = 9.75
+
/datum/reagent/vaccine
//data must contain virus type
name = "Vaccine"
@@ -585,6 +717,30 @@
race = /datum/species/android
mutationtext = "The pain subsides. You feel... artificial."
+//Citadel Races
+/datum/reagent/mutationtoxin/mammal
+ name = "Mammal Mutation Toxin"
+ id = "mammalmutationtoxin"
+ description = "A glowing toxin."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/mammal
+ mutationtext = "The pain subsides. You feel... fluffier."
+
+/datum/reagent/mutationtoxin/insect
+ name = "Insect Mutation Toxin"
+ id = "insectmutationtoxin"
+ description = "A glowing toxin."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/insect
+ mutationtext = "The pain subsides. You feel... attracted to dark, moist areas."
+
+/datum/reagent/mutationtoxin/xenoperson
+ name = "Xeno-Hybrid Mutation Toxin"
+ id = "xenopersonmutationtoxin"
+ description = "A glowing toxin."
+ color = "#5EFF3B" //RGB: 94, 255, 59
+ race = /datum/species/xeno
+ mutationtext = "The pain subsides. You feel... oddly longing for the Queen." //sadly, not the British one.
//BLACKLISTED RACES
/datum/reagent/mutationtoxin/skeleton
@@ -947,12 +1103,12 @@
reagent_state = SOLID
taste_description = "iron"
pH = 6
-
+ overdose_threshold = 30
color = "#c2391d"
/datum/reagent/iron/on_mob_life(mob/living/carbon/C)
if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio))
- C.blood_volume += 0.5
+ C.blood_volume += 0.01 //we'll have synthetics from medbay.
..()
/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
@@ -961,6 +1117,17 @@
M.reagents.add_reagent("toxin", reac_volume)
..()
+/datum/reagent/iron/overdose_start(mob/living/M)
+ to_chat(M, "You start feeling your guts twisting painfully!")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[id]_overdose", /datum/mood_event/overdose, name)
+
+/datum/reagent/iron/overdose_process(mob/living/carbon/C)
+ if(prob(20))
+ var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER)
+ if (istype(L))
+ C.applyLiverDamage(2) //mild until the fabled med rework comes out. the organ damage galore
+ ..()
+
/datum/reagent/gold
name = "Gold"
id = "gold"
@@ -1077,17 +1244,19 @@
pH = 5.5
/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume)
- if(istype(O, /obj/effect/decal/cleanable))
+ if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart))
qdel(O)
else
if(O)
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
- SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ O.clean_blood()
/datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 1)
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
- SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(T, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ T.clean_blood()
for(var/obj/effect/decal/cleanable/C in T)
qdel(C)
@@ -1105,26 +1274,33 @@
H.lip_style = null
H.update_body()
for(var/obj/item/I in C.held_items)
- SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ I.clean_blood()
if(C.wear_mask)
- if(SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(C.wear_mask, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(C.wear_mask.clean_blood())
C.update_inv_wear_mask()
if(ishuman(M))
var/mob/living/carbon/human/H = C
if(H.head)
- if(SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(H.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(H.head.clean_blood())
H.update_inv_head()
if(H.wear_suit)
- if(SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(H.wear_suit, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(H.wear_suit.clean_blood())
H.update_inv_wear_suit()
else if(H.w_uniform)
- if(SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(H.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(H.w_uniform.clean_blood())
H.update_inv_w_uniform()
if(H.shoes)
- if(SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD))
+ SEND_SIGNAL(H.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ if(H.shoes.clean_blood())
H.update_inv_shoes()
H.wash_cream()
- SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
+ SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
+ M.clean_blood()
/datum/reagent/space_cleaner/ez_clean
name = "EZ Clean"
@@ -1353,10 +1529,10 @@
/datum/reagent/nitryl/on_mob_metabolize(mob/living/L)
..()
- ADD_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ L.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
/datum/reagent/nitryl/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_GOTTAGOFAST, id)
+ L.remove_movespeed_modifier(id)
..()
/////////////////////////Coloured Crayon Powder////////////////////////////
@@ -2119,26 +2295,22 @@
chemical_flags = REAGENT_INVISIBLE
/datum/reagent/changeling_string/on_mob_metabolize(mob/living/carbon/C)
- if(C && C.dna && data["desired_dna"])
+ if(ishuman(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)
+ new_dna.transfer_identity(C, TRUE)
C.real_name = new_dna.real_name
- C.updateappearance(mutcolor_update=1)
- C.update_body()
+ C.updateappearance(mutcolor_update = TRUE)
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)
+ original_dna.transfer_identity(C, TRUE)
C.real_name = original_dna.real_name
- C.updateappearance(mutcolor_update=1)
- C.update_body()
+ C.updateappearance(mutcolor_update = TRUE)
C.domutcheck()
- C.regenerate_icons()
..()
/datum/reagent/changeling_string/Destroy()
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 2ed9a31107..374f7715bb 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -283,6 +283,12 @@
results = list("regen_jelly" = 2)
required_reagents = list("tricordrazine" = 1, "slimejelly" = 1)
+/datum/chemical_reaction/jelly_convert
+ name = "Blood Jelly Conversion"
+ id = "blood_jelly"
+ results = list("slimejelly" = 1)
+ required_reagents = list("toxin" = 1, "jellyblood" = 1)
+
/datum/chemical_reaction/corazone
name = "Corazone"
id = "corazone"
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index b3f9591f64..d475b118b2 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -26,7 +26,7 @@
create_reagents(volume, reagent_flags)
if(spawned_disease)
var/datum/disease/F = new spawned_disease()
- var/list/data = list("viruses"= list(F))
+ var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F))
reagents.add_reagent("blood", disease_amount, data)
add_initial_reagents()
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 3e555f385f..fe35981bfe 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -4,13 +4,16 @@
icon = 'icons/obj/bloodpack.dmi'
icon_state = "bloodpack"
volume = 200
+ reagent_flags = DRAINABLE
var/blood_type = null
var/labelled = 0
+ var/color_to_apply = "#FFFFFF"
+ var/mutable_appearance/fill_overlay
/obj/item/reagent_containers/blood/Initialize()
. = ..()
if(blood_type != null)
- reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
+ reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_colour"=color, "blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
update_icon()
/obj/item/reagent_containers/blood/on_reagent_change(changetype)
@@ -18,6 +21,7 @@
var/datum/reagent/blood/B = reagents.has_reagent("blood")
if(B && B.data && B.data["blood_type"])
blood_type = B.data["blood_type"]
+ color_to_apply = bloodtype_to_color(blood_type)
else
blood_type = null
update_pack_name()
@@ -45,7 +49,7 @@
/obj/item/reagent_containers/blood/random/Initialize()
icon_state = "bloodpack"
- blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L")
+ blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L", "SY", "HF", "GEL", "BUG")
return ..()
/obj/item/reagent_containers/blood/APlus
@@ -72,6 +76,18 @@
/obj/item/reagent_containers/blood/universal
blood_type = "U"
+/obj/item/reagent_containers/blood/synthetics
+ blood_type = "SY"
+
+/obj/item/reagent_containers/blood/oilblood
+ blood_type = "HF"
+
+/obj/item/reagent_containers/blood/jellyblood
+ blood_type = "GEL"
+
+/obj/item/reagent_containers/blood/insect
+ blood_type = "BUG"
+
/obj/item/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
if(!user.is_literate())
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index a96ba006c9..432b9289dd 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -196,3 +196,318 @@
volume = 250
list_reagents = list("holywater" = 150, "tiresolution" = 50, "dizzysolution" = 50)
amount_per_transfer_from_this = 50
+
+#define HYPO_SPRAY 0
+#define HYPO_INJECT 1
+
+#define WAIT_SPRAY 25
+#define WAIT_INJECT 25
+#define SELF_SPRAY 15
+#define SELF_INJECT 15
+
+#define DELUXE_WAIT_SPRAY 20
+#define DELUXE_WAIT_INJECT 20
+#define DELUXE_SELF_SPRAY 10
+#define DELUXE_SELF_INJECT 10
+
+#define COMBAT_WAIT_SPRAY 0
+#define COMBAT_WAIT_INJECT 0
+#define COMBAT_SELF_SPRAY 0
+#define COMBAT_SELF_INJECT 0
+
+//A vial-loaded hypospray. Cartridge-based!
+/obj/item/hypospray/mkii
+ name = "hypospray mk.II"
+ icon_state = "hypo2"
+ icon = 'icons/obj/syringe.dmi'
+ desc = "A new development from DeForest Medical, this hypospray takes 30-unit vials as the drug supply for easy swapping."
+ w_class = WEIGHT_CLASS_TINY
+ var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small)
+ var/mode = HYPO_INJECT
+ var/obj/item/reagent_containers/glass/bottle/vial/vial
+ var/start_vial = /obj/item/reagent_containers/glass/bottle/vial/small
+ var/spawnwithvial = TRUE
+ var/inject_wait = WAIT_INJECT
+ var/spray_wait = WAIT_SPRAY
+ var/spray_self = SELF_SPRAY
+ var/inject_self = SELF_INJECT
+ var/quickload = FALSE
+ var/penetrates = FALSE
+
+/obj/item/hypospray/mkii/brute
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine
+
+/obj/item/hypospray/mkii/toxin
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin
+
+/obj/item/hypospray/mkii/oxygen
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin
+
+/obj/item/hypospray/mkii/burn
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane
+
+/obj/item/hypospray/mkii/tricord
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord
+
+/obj/item/hypospray/mkii/enlarge
+ spawnwithvial = FALSE
+
+/obj/item/hypospray/mkii/CMO
+ name = "hypospray mk.II deluxe"
+ allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large)
+ icon_state = "cmo2"
+ desc = "The Deluxe Hypospray can take larger-size vials. It also acts faster and delivers more reagents per spray."
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO
+ inject_wait = DELUXE_WAIT_INJECT
+ spray_wait = DELUXE_WAIT_SPRAY
+ spray_self = DELUXE_SELF_SPRAY
+ inject_self = DELUXE_SELF_INJECT
+
+/obj/item/hypospray/mkii/CMO/combat
+ name = "combat hypospray mk.II"
+ desc = "A combat-ready deluxe hypospray that acts almost instantly. It can be tactically reloaded by using a vial on it."
+ icon_state = "combat2"
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat
+ inject_wait = COMBAT_WAIT_INJECT
+ spray_wait = COMBAT_WAIT_SPRAY
+ spray_self = COMBAT_SELF_SPRAY
+ inject_self = COMBAT_SELF_INJECT
+ quickload = TRUE
+ penetrates = TRUE
+
+/obj/item/hypospray/mkii/Initialize()
+ . = ..()
+ if(!spawnwithvial)
+ update_icon()
+ return
+ if(start_vial)
+ vial = new start_vial
+ update_icon()
+
+/obj/item/hypospray/mkii/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)][vial ? "" : "-e"]"
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+ return
+
+/obj/item/hypospray/mkii/examine(mob/user)
+ . = ..()
+ if(vial)
+ to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.")
+ else
+ to_chat(user, "It has no vial loaded in.")
+ to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.")
+
+/obj/item/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user)
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
+ var/obj/item/reagent_containers/glass/bottle/vial/V = I
+ V.forceMove(user.loc)
+ user.put_in_hands(V)
+ to_chat(user, "You remove [vial] from [src].")
+ vial = null
+ update_icon()
+ playsound(loc, 'sound/weapons/empty.ogg', 50, 1)
+ else
+ to_chat(user, "This hypo isn't loaded!")
+ return
+
+/obj/item/hypospray/mkii/attackby(obj/item/I, mob/living/user)
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null))
+ if(!quickload)
+ to_chat(user, "[src] can not hold more than one vial!")
+ return FALSE
+ unload_hypo(vial, user)
+ if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
+ var/obj/item/reagent_containers/glass/bottle/vial/V = I
+ if(!is_type_in_list(V, allowed_containers))
+ to_chat(user, "[src] doesn't accept this type of vial.")
+ return FALSE
+ if(!user.transferItemToLoc(V,src))
+ return FALSE
+ vial = V
+ user.visible_message("[user] has loaded a vial into [src].","You have loaded [vial] into [src].")
+ update_icon()
+ playsound(loc, 'sound/weapons/autoguninsert.ogg', 35, 1)
+ return TRUE
+ else
+ to_chat(user, "This doesn't fit in [src].")
+ return FALSE
+ return FALSE
+
+/obj/item/hypospray/mkii/AltClick(mob/user)
+ if(vial)
+ vial.attack_self(user)
+
+// 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.
+
+/obj/item/hypospray/mkii/attack(obj/item/I, mob/user, params)
+ return
+
+/obj/item/hypospray/mkii/afterattack(atom/target, mob/user, proximity)
+ if(!vial)
+ return
+
+ if(!proximity)
+ return
+
+ if(!ismob(target))
+ return
+
+ var/mob/living/L
+ if(isliving(target))
+ L = target
+ if(!penetrates && !L.can_inject(user, 1)) //This check appears another four times, since otherwise the penetrating sprays will break in do_mob.
+ return
+
+ if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles
+ to_chat(user, "You cannot directly fill [target]!")
+ return
+
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ to_chat(user, "[target] is full.")
+ return
+
+ if(ishuman(L))
+ var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected))
+ if(!affecting)
+ to_chat(user, "The limb is missing!")
+ return
+ if(affecting.status != BODYPART_ORGANIC)
+ to_chat(user, "Medicine won't work on a robotic limb!")
+ return
+
+ var/contained = vial.reagents.log_list()
+ log_combat(user, L, "attemped to inject", src, addition="which had [contained]")
+//Always log attemped injections for admins
+ if(vial != null)
+ switch(mode)
+ if(HYPO_INJECT)
+ if(L) //living mob
+ if(L != user)
+ L.visible_message("[user] is trying to inject [L] with [src]!", \
+ "[user] is trying to inject [L] with [src]!")
+ if(!do_mob(user, L, inject_wait))
+ return
+ if(!penetrates && !L.can_inject(user, 1))
+ return
+ if(!vial.reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ L.visible_message("[user] uses the [src] on [L]!", \
+ "[user] uses the [src] on [L]!")
+ else
+ if(!do_mob(user, L, inject_self))
+ return
+ if(!penetrates && !L.can_inject(user, 1))
+ return
+ if(!vial.reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])")
+ L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG)
+
+ var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1)
+ vial.reagents.reaction(L, INJECT, fraction)
+ vial.reagents.trans_to(target, vial.amount_per_transfer_from_this)
+ if(vial.amount_per_transfer_from_this >= 15)
+ playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
+ if(vial.amount_per_transfer_from_this < 15)
+ playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
+ to_chat(user, "You inject [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.")
+
+ if(HYPO_SPRAY)
+ if(L) //living mob
+ if(L != user)
+ L.visible_message("[user] is trying to spray [L] with [src]!", \
+ "[user] is trying to spray [L] with [src]!")
+ if(!do_mob(user, L, spray_wait))
+ return
+ if(!penetrates && !L.can_inject(user, 1))
+ return
+ if(!vial.reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ L.visible_message("[user] uses the [src] on [L]!", \
+ "[user] uses the [src] on [L]!")
+ else
+ if(!do_mob(user, L, spray_self))
+ return
+ if(!penetrates && !L.can_inject(user, 1))
+ return
+ if(!vial.reagents.total_volume)
+ return
+ if(L.reagents.total_volume >= L.reagents.maximum_volume)
+ return
+ log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])")
+ L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG)
+ var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1)
+ vial.reagents.reaction(L, PATCH, fraction)
+ vial.reagents.trans_to(target, vial.amount_per_transfer_from_this)
+ if(vial.amount_per_transfer_from_this >= 15)
+ playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
+ if(vial.amount_per_transfer_from_this < 15)
+ playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
+ to_chat(user, "You spray [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.")
+ else
+ to_chat(user, "[src] doesn't work here!")
+ return
+
+/obj/item/hypospray/mkii/attack_self(mob/living/user)
+ if(user)
+ if(user.incapacitated())
+ return
+ else if(!vial)
+ to_chat(user, "This Hypo needs to be loaded first!")
+ return
+ else
+ unload_hypo(vial,user)
+
+/obj/item/hypospray/mkii/verb/modes()
+ set name = "Toggle Application Mode"
+ set category = "Object"
+ set src in usr
+ var/mob/M = usr
+ switch(mode)
+ if(HYPO_SPRAY)
+ mode = HYPO_INJECT
+ to_chat(M, "[src] is now set to inject contents on application.")
+ if(HYPO_INJECT)
+ mode = HYPO_SPRAY
+ to_chat(M, "[src] is now set to spray contents on application.")
+
+#undef HYPO_SPRAY
+#undef HYPO_INJECT
+#undef WAIT_SPRAY
+#undef WAIT_INJECT
+#undef SELF_SPRAY
+#undef SELF_INJECT
+#undef DELUXE_WAIT_SPRAY
+#undef DELUXE_WAIT_INJECT
+#undef DELUXE_SELF_SPRAY
+#undef DELUXE_SELF_INJECT
+#undef COMBAT_WAIT_SPRAY
+#undef COMBAT_WAIT_INJECT
+#undef COMBAT_SELF_SPRAY
+#undef COMBAT_SELF_INJECT
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm
old mode 100755
new mode 100644
similarity index 96%
rename from modular_citadel/code/modules/reagents/reagent container/hypovial.dm
rename to code/modules/reagents/reagent_containers/hypovial.dm
index c1e0d6ff01..ba5ce48a4a
--- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
+++ b/code/modules/reagents/reagent_containers/hypovial.dm
@@ -1,7 +1,8 @@
+//hypovials used with the MkII hypospray. See hypospray.dm.
+
/obj/item/reagent_containers/glass/bottle/vial
name = "broken hypovial"
desc = "A hypovial compatible with most hyposprays."
- icon = 'modular_citadel/icons/obj/vial.dmi'
icon_state = "hypovial"
spillable = FALSE
var/comes_with = list() //Easy way of doing this.
@@ -34,7 +35,7 @@
/obj/item/reagent_containers/glass/bottle/vial/update_icon()
cut_overlays()
if(reagents.total_volume)
- var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "hypovial10")
+ var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "hypovial10")
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
@@ -86,7 +87,7 @@
/obj/item/reagent_containers/glass/bottle/vial/large/update_icon()
cut_overlays()
if(reagents.total_volume)
- var/mutable_appearance/filling = mutable_appearance('modular_citadel/icons/obj/vial.dmi', "hypoviallarge10")
+ var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "hypoviallarge10")
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 38880f669f..d4880aa085 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -186,7 +186,6 @@
/obj/item/reagent_containers/pill/antirad_plus
name = "prussian blue pill"
desc = "Used to treat heavy radition poisoning."
- icon = 'modular_citadel/icons/obj/modularpills.dmi'
icon_state = "prussian_blue"
list_reagents = list("prussian_blue" = 25, "water" = 10)
roundstart = 1
@@ -194,7 +193,6 @@
/obj/item/reagent_containers/pill/mutarad
name = "radiation treatment deluxe pill"
desc = "Used to treat heavy radition poisoning and genetic defects."
- icon = 'modular_citadel/icons/obj/modularpills.dmi'
icon_state = "anit_rad_fixgene"
list_reagents = list("prussian_blue" = 15, "potass_iodide" = 15, "mutadone" = 15, "water" = 5)
roundstart = 1
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index a4a6a7d473..5edddd64c2 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -283,7 +283,7 @@
/obj/machinery/disposal/bin/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type.
var/obj/item/storage/bag/trash/T = I
- GET_COMPONENT_FROM(STR, /datum/component/storage, T)
+ var/datum/component/storage/STR = T.GetComponent(/datum/component/storage)
to_chat(user, "You empty the bag.")
for(var/obj/item/O in T.contents)
STR.remove_from_storage(O,src)
diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm
index 624d5e0e05..348e687e03 100644
--- a/code/modules/recycling/disposal/construction.dm
+++ b/code/modules/recycling/disposal/construction.dm
@@ -29,7 +29,7 @@
pipename = initial(pipe_type.name)
if(flip)
- GET_COMPONENT(rotcomp,/datum/component/simple_rotation)
+ var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation)
rotcomp.BaseRot(null,ROTATION_FLIP)
update_icon()
diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm
index 552976824d..818e80beea 100644
--- a/code/modules/research/designs/electronics_designs.dm
+++ b/code/modules/research/designs/electronics_designs.dm
@@ -131,3 +131,30 @@
category = list("Misc")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+/datum/design/xenobio_upgrade
+ name = "owo"
+ desc = "someone's bussin"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 300, MAT_GLASS = 100)
+ category = list("Electronics")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/xenobio_upgrade/xenobiomonkeys
+ name = "Xenobiology console monkey upgrade disk"
+ desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
+ id = "xenobio_monkeys"
+ build_path = /obj/item/disk/xenobio_console_upgrade/monkey
+
+/datum/design/xenobio_upgrade/xenobioslimebasic
+ name = "Xenobiology console basic slime upgrade disk"
+ desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
+ id = "xenobio_slimebasic"
+ build_path = /obj/item/disk/xenobio_console_upgrade/slimebasic
+
+/datum/design/xenobio_upgrade/xenobioslimeadv
+ name = "Xenobiology console advanced slime upgrade disk"
+ desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
+ id = "xenobio_slimeadv"
+ build_path = /obj/item/disk/xenobio_console_upgrade/slimeadv
+
+
diff --git a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm
index 31723cde07..b4d67315ba 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm
@@ -98,3 +98,11 @@
build_path = /obj/item/circuitboard/machine/vr_sleeper
departmental_flags = DEPARTMENTAL_FLAG_ALL
category = list ("Medical Machinery")
+
+/datum/design/board/autoylathe
+ name = "Machine Design (Autoylathe)"
+ desc = "The circuit board for an autoylathe."
+ id = "autoylathe"
+ build_path = /obj/item/circuitboard/machine/autoylathe
+ departmental_flags = DEPARTMENTAL_FLAG_ALL
+ category = list("Misc. Machinery")
diff --git a/code/modules/research/designs/machine_desings/machine_designs_medical.dm b/code/modules/research/designs/machine_desings/machine_designs_medical.dm
index 65b3d74f71..2f95954e01 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_medical.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_medical.dm
@@ -89,3 +89,11 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
build_path = /obj/item/circuitboard/machine/clonescanner
category = list("Medical Machinery")
+
+/datum/design/board/bloodbankgen
+ name = "Machine Design (Blood Bank Generator Board)"
+ desc = "The circuit board for a blood bank generator."
+ id = "bloodbankgen"
+ build_path = /obj/item/circuitboard/machine/bloodbankgen
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+ category = list ("Medical Machinery")
diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm
index ea67fad434..6526599179 100644
--- a/code/modules/research/designs/stock_parts_designs.dm
+++ b/code/modules/research/designs/stock_parts_designs.dm
@@ -288,7 +288,7 @@
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/subspace_analyzer
- name = "Subspace Analyzer"
+ name = "Subspace Wavelength Analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
id = "s-analyzer"
build_type = PROTOLATHE
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 11bc31bedc..d69dda37ca 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -67,6 +67,12 @@
//Ammo Shells/
//////////////
+/datum/design/beanbag_slug/sec
+ id = "sec_beanbag"
+ build_type = PROTOLATHE
+ category = list("Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/rubbershot/sec
id = "sec_rshot"
build_type = PROTOLATHE
@@ -105,7 +111,7 @@
materials = list(MAT_METAL = 200)
build_path = /obj/item/ammo_casing/shotgun/stunslug
category = list("Ammo")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/techshell
name = "Unloaded Technological Shotshell"
@@ -139,7 +145,7 @@
materials = list(MAT_METAL = 500, MAT_GLASS = 300)
build_path = /obj/item/firing_pin/test_range
category = list("Firing Pins")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/pin_mindshield
name = "Mindshield Firing Pin"
@@ -235,7 +241,7 @@
reagents_list = list("radium" = 20)
build_path = /obj/item/gun/energy/floragun
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/xray
name = "X-ray Laser Gun"
@@ -309,7 +315,7 @@
materials = list(MAT_METAL = 2000, MAT_PLASMA = 500)
build_path = /obj/item/grenade/chem_grenade/pyro
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/cryo_grenade
name = "Cryo Grenade"
@@ -319,7 +325,7 @@
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
build_path = /obj/item/grenade/chem_grenade/cryo
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/adv_grenade
name = "Advanced Release Grenade"
@@ -329,7 +335,7 @@
materials = list(MAT_METAL = 3000, MAT_GLASS = 500)
build_path = /obj/item/grenade/chem_grenade/adv_release
category = list("Weapons")
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
//////////
//MISC////
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index e56350a280..0bcd0c5984 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -422,7 +422,7 @@
if(exp == SCANTYPE_OBLITERATE)
visible_message("[exp_on] activates the crushing mechanism, [exp_on] is destroyed!")
if(linked_console.linked_lathe)
- GET_COMPONENT_FROM(linked_materials, /datum/component/material_container, linked_console.linked_lathe)
+ var/datum/component/material_container/linked_materials = linked_console.linked_lathe.GetComponent(/datum/component/material_container)
for(var/material in exp_on.materials)
linked_materials.insert_amount( min((linked_materials.max_amount - linked_materials.total_amount), (exp_on.materials[material])), material)
if(prob(EFFECT_PROB_LOW) && criticalReaction)
diff --git a/code/modules/research/research_disk.dm b/code/modules/research/research_disk.dm
index 2ec2398d88..02865dc5bb 100644
--- a/code/modules/research/research_disk.dm
+++ b/code/modules/research/research_disk.dm
@@ -29,3 +29,12 @@
/obj/item/disk/tech_disk/illegal/Initialize()
. = ..()
stored_research = new /datum/techweb/syndicate
+
+/obj/item/disk/tech_disk/abductor
+ name = "Gray technology disk"
+ desc = "You feel like it's not Gray because of its color."
+ materials = list()
+
+/obj/item/disk/tech_disk/abductor/Initialize()
+ . = ..()
+ stored_research = new /datum/techweb/abductor
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index 3cd296f866..12fe64463d 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -43,7 +43,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
/obj/item/storage/part_replacer/bluespace
name = "bluespace rapid part exchange device"
- desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts."
+ desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts. Definitely not just a BSRPED painted orange."
icon_state = "BS_RPED"
w_class = WEIGHT_CLASS_NORMAL
works_from_distance = TRUE
@@ -52,12 +52,10 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
component_type = /datum/component/storage/concrete/bluespace/rped
/obj/item/storage/part_replacer/cyborg
- name = "rapid part exchange device"
- desc = "Special mechanical module made to store, sort, and apply standard machine parts."
icon_state = "borgrped"
- item_state = "RPED"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+
+/obj/item/storage/part_replacer/bluespace/cyborg
+ icon_state = "borg_BS_RPED"
/proc/cmp_rped_sort(obj/item/A, obj/item/B)
return B.get_part_rating() - A.get_part_rating()
diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm
index cd5a190fd6..1e554f112f 100644
--- a/code/modules/research/techweb/_techweb.dm
+++ b/code/modules/research/techweb/_techweb.dm
@@ -49,6 +49,14 @@
var/datum/techweb_node/syndicate_basic/Node = new()
research_node(Node, TRUE)
+/datum/techweb/abductor
+ id = "ABDUCTOR"
+ organization = "Aliens"
+
+/datum/techweb/abductor/New()
+ var/datum/techweb_node/alientech/Node = new()
+ research_node(Node, TRUE)
+
/datum/techweb/science //Global science techweb for RND consoles.
id = "SCIENCE"
organization = "Nanotrasen"
@@ -364,3 +372,7 @@
/datum/techweb/specialized/autounlocking/exofab
allowed_buildtypes = MECHFAB
+
+/datum/techweb/specialized/autounlocking/autoylathe
+ design_autounlock_buildtypes = AUTOYLATHE
+ allowed_buildtypes = AUTOYLATHE
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index f3bff00508..636ed032de 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -10,7 +10,7 @@
// Default research tech, prevents bricking
design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani",
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
- "space_heater", "xlarge_beaker", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
+ "space_heater", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
/datum/techweb_node/mmi
@@ -60,7 +60,7 @@
display_name = "Biological Technology"
description = "What makes us tick." //the MC, silly!
prereq_ids = list("base")
- design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag")
+ design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -1027,26 +1027,19 @@
id = "alien_bio"
display_name = "Alien Biological Tools"
description = "Advanced biological tools."
- prereq_ids = list("alientech", "adv_biotech")
+ prereq_ids = list("alientech", "advance_surgerytools")
design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery")
- boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien,
- /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor,
- /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor, /obj/item/gun/energy/shrink_ray)
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 20000
- hidden = TRUE
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 10000
/datum/techweb_node/alien_engi
id = "alien_engi"
display_name = "Alien Engineering"
description = "Alien engineering tools"
- prereq_ids = list("alientech", "adv_engi")
+ prereq_ids = list("alientech", "exp_tools")
design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool")
- boost_item_paths = list(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor,
- /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor, /obj/item/gun/energy/shrink_ray)
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 20000
- hidden = TRUE
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 10000
/datum/techweb_node/syndicate_basic
id = "syndicate_basic"
@@ -1106,4 +1099,4 @@
for(var/i in processing)
var/datum/techweb_node/TN = i
TW.add_point_list(TN.research_costs)
- return TW.printout_points()
\ No newline at end of file
+ return TW.printout_points()
diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm
index b28f1676a1..0099fe143d 100644
--- a/code/modules/research/xenobiology/crossbreeding/_misc.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm
@@ -58,9 +58,7 @@
var/mob/living/carbon/human/H = M
if(H.mind && !HAS_TRAIT(H, TRAIT_AGEUSIA))
to_chat(H,"That didn't taste very good...") //No disgust, though. It's just not good tasting.
- GET_COMPONENT_FROM(mood, /datum/component/mood, H)
- if(mood)
- mood.add_event(null,"gross_food", /datum/mood_event/gross_food)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
last_check_time = world.time
return
..()
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index b9e7122d07..7c812da065 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -64,10 +64,9 @@
var/interrupted = FALSE
var/mob/target
var/icon/bluespace
- var/datum/weakref/redirect_component
/datum/status_effect/slimerecall/on_apply()
- redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/resistField))))
+ RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/resistField)
to_chat(owner, "You feel a sudden tug from an unknown force, and feel a pull to bluespace!")
to_chat(owner, "Resist if you wish avoid the force!")
bluespace = icon('icons/effects/effects.dmi',"chronofield")
@@ -77,9 +76,9 @@
/datum/status_effect/slimerecall/proc/resistField()
interrupted = TRUE
owner.remove_status_effect(src)
+
/datum/status_effect/slimerecall/on_remove()
- qdel(redirect_component.resolve())
- redirect_component = null
+ UnregisterSignal(owner, COMSIG_LIVING_RESIST)
owner.cut_overlay(bluespace)
if(interrupted || !ismob(target))
to_chat(owner, "The bluespace tug fades away, and you feel that the force has passed you by.")
@@ -98,10 +97,9 @@
duration = -1 //Will remove self when block breaks.
alert_type = /obj/screen/alert/status_effect/freon/stasis
var/obj/structure/ice_stasis/cube
- var/datum/weakref/redirect_component
/datum/status_effect/frozenstasis/on_apply()
- redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/breakCube))))
+ RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/breakCube)
cube = new /obj/structure/ice_stasis(get_turf(owner))
owner.forceMove(cube)
owner.status_flags |= GODMODE
@@ -118,8 +116,7 @@
if(cube)
qdel(cube)
owner.status_flags &= ~GODMODE
- qdel(redirect_component.resolve())
- redirect_component = null
+ UnregisterSignal(owner, COMSIG_LIVING_RESIST)
/datum/status_effect/slime_clone
id = "slime_cloned"
@@ -375,15 +372,11 @@ datum/status_effect/rebreathing/tick()
duration = 30
/datum/status_effect/tarfoot/on_apply()
- var/mob/living/carbon/human/H = owner
- if(istype(H))
- H.physiology.speed_mod += 0.5
+ owner.add_movespeed_modifier(MOVESPEED_ID_TARFOOT, update=TRUE, priority=100, multiplicative_slowdown=0.5, blacklisted_movetypes=(FLYING|FLOATING))
return ..()
/datum/status_effect/tarfoot/on_remove()
- var/mob/living/carbon/human/H = owner
- if(istype(H))
- H.physiology.speed_mod -= 0.5
+ owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT)
/datum/status_effect/spookcookie
id = "spookcookie"
@@ -695,20 +688,15 @@ datum/status_effect/stabilized/blue/on_remove()
/datum/status_effect/stabilized/sepia/tick()
if(prob(50) && mod > -1)
mod--
- var/mob/living/carbon/human/H = owner
- if(istype(H))
- H.physiology.speed_mod--
+ owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
else if(mod < 1)
mod++
- var/mob/living/carbon/human/H = owner
- if(istype(H))
- H.physiology.speed_mod++
+ // yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly
+ owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=0, blacklisted_movetypes=(FLYING|FLOATING))
return ..()
/datum/status_effect/stabilized/sepia/on_remove()
- var/mob/living/carbon/human/H = owner
- if(istype(H))
- H.physiology.speed_mod += -mod //Reset the changes.
+ owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA)
/datum/status_effect/stabilized/cerulean
id = "stabilizedcerulean"
@@ -916,7 +904,7 @@ datum/status_effect/stabilized/blue/on_remove()
colour = "light pink"
/datum/status_effect/stabilized/lightpink/on_apply()
- ADD_TRAIT(owner, TRAIT_GOTTAGOFAST,"slimestatus")
+ owner.add_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
return ..()
/datum/status_effect/stabilized/lightpink/tick()
@@ -927,7 +915,7 @@ datum/status_effect/stabilized/blue/on_remove()
return ..()
/datum/status_effect/stabilized/lightpink/on_remove()
- REMOVE_TRAIT(owner, TRAIT_GOTTAGOFAST,"slimestatus")
+ owner.remove_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS)
/datum/status_effect/stabilized/adamantine
id = "stabilizedadamantine"
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index 5aebd1bafa..641b7e7dcb 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -29,12 +29,11 @@
var/datum/action/innate/slime_scan/scan_action
var/datum/action/innate/feed_potion/potion_action
- var/datum/component/redirect/listener
-
var/list/stored_slimes
var/obj/item/slimepotion/slime/current_potion
- var/max_slimes = 5
+ var/max_slimes = 1
var/monkeys = 0
+ var/upgradetier = 0
icon_screen = "slime_comp"
icon_keyboard = "rd_key"
@@ -50,7 +49,7 @@
scan_action = new
potion_action = new
stored_slimes = list()
- listener = AddComponent(/datum/component/redirect, list(COMSIG_ATOM_CONTENTS_DEL = CALLBACK(src, .proc/on_contents_del)))
+ RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
/obj/machinery/computer/camera_advanced/xenobio/Destroy()
stored_slimes = null
@@ -108,6 +107,22 @@
stored_slimes -= deleted
/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/disk/xenobio_console_upgrade))
+ var/obj/item/disk/xenobio_console_upgrade/diskthing = O
+ var/successfulupgrade = FALSE
+ for(var/I in diskthing.upgradetypes)
+ if(upgradetier & I)
+ continue
+ else
+ upgradetier |= I
+ successfulupgrade = TRUE
+ if(I == XENOBIO_UPGRADE_SLIMEADV)
+ max_slimes = 10
+ if(successfulupgrade)
+ to_chat(user, "You have successfully upgraded [src] with [O].")
+ else
+ to_chat(user, "[src] already has the contents of [O] installed!")
+ return
if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
monkeys++
to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.")
@@ -266,3 +281,29 @@
break
else
to_chat(owner, "Target is not near a camera. Cannot proceed.")
+
+/obj/item/disk/xenobio_console_upgrade
+ name = "Xenobiology console upgrade disk"
+ desc = "Allan please add detail."
+ icon_state = "datadisk5"
+ var/list/upgradetypes = list()
+
+/obj/item/disk/xenobio_console_upgrade/admin
+ name = "Xenobio all access thing"
+ desc = "'the consoles are literally useless!!!!!!!!!!!!!!!'"
+ upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV, XENOBIO_UPGRADE_MONKEYS)
+
+/obj/item/disk/xenobio_console_upgrade/monkey
+ name = "Xenobiology console monkey upgrade disk"
+ desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
+ upgradetypes = list(XENOBIO_UPGRADE_MONKEYS)
+
+/obj/item/disk/xenobio_console_upgrade/slimebasic
+ name = "Xenobiology console basic slime upgrade disk"
+ desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
+ upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC)
+
+/obj/item/disk/xenobio_console_upgrade/slimeadv
+ name = "Xenobiology console advanced slime upgrade disk"
+ desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
+ upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV)
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
new file mode 100644
index 0000000000..0d4d2b6ad6
--- /dev/null
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -0,0 +1,529 @@
+GLOBAL_VAR_INIT(hhStorageTurf, null)
+GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
+
+/obj/item/hilbertshotel
+ name = "Hilbert's Hotel"
+ desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface."
+ icon_state = "hilbertshotel"
+ w_class = WEIGHT_CLASS_SMALL
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ var/datum/map_template/hilbertshotel/hotelRoomTemp
+ var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty
+ var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore
+ var/list/activeRooms = list()
+ var/list/storedRooms = list()
+ var/storageTurf
+ //Lore Stuff
+ var/ruinSpawned = FALSE
+ var/mysteryRoom
+
+/obj/item/hilbertshotel/Initialize()
+ . = ..()
+ //Load templates
+ hotelRoomTemp = new()
+ hotelRoomTempEmpty = new()
+ hotelRoomTempLore = new()
+ var/area/currentArea = get_area(src)
+ if(currentArea.type == /area/ruin/space/has_grav/hilbertresearchfacility)
+ ruinSpawned = TRUE
+
+/obj/item/hilbertshotel/Destroy()
+ ejectRooms()
+ return ..()
+
+/obj/item/hilbertshotel/attack(mob/living/M, mob/living/user)
+ if(M.mind)
+ to_chat(user, "You invite [M] to the hotel.")
+ promptAndCheckIn(M)
+ else
+ to_chat(user, "[M] is not intelligent enough to understand how to use this device!")
+
+/obj/item/hilbertshotel/attack_self(mob/user)
+ . = ..()
+ promptAndCheckIn(user)
+
+/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user)
+ var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num
+ if(!chosenRoomNumber)
+ return
+ if(chosenRoomNumber > SHORT_REAL_LIMIT)
+ to_chat(user, "You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!")
+ return
+ if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber)))
+ to_chat(user, "That is not a valid room number!")
+ return
+ if(ismob(loc))
+ if(user == loc) //Not always the same as user
+ forceMove(get_turf(user))
+ if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize
+ if(!GLOB.hhStorageTurf)
+ var/datum/map_template/hilbertshotelstorage/storageTemp = new()
+ var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3)
+ storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3]))
+ GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3])
+ else
+ storageTurf = GLOB.hhStorageTurf
+ if(tryActiveRoom(chosenRoomNumber, user))
+ return
+ if(tryStoredRoom(chosenRoomNumber, user))
+ return
+ sendToNewRoom(chosenRoomNumber, user)
+
+
+/obj/item/hilbertshotel/proc/tryActiveRoom(var/roomNumber, var/mob/user)
+ if(activeRooms["[roomNumber]"])
+ var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"]
+ do_sparks(3, FALSE, get_turf(user))
+ user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3]))
+ return TRUE
+ else
+ return FALSE
+
+/obj/item/hilbertshotel/proc/tryStoredRoom(var/roomNumber, var/mob/user)
+ if(storedRooms["[roomNumber]"])
+ var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height)
+ hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3]))
+ var/turfNumber = 1
+ for(var/i=0, iAs the sphere breaks apart, you're suddenly ejected into the depths of space!
")
+ var/max = world.maxx-TRANSITIONEDGE
+ var/min = 1+TRANSITIONEDGE
+ var/list/possible_transtitons = list()
+ for(var/AZ in SSmapping.z_list)
+ var/datum/space_level/D = AZ
+ if (D.linkage == CROSSLINKED)
+ possible_transtitons += D.z_value
+ var/_z = pick(possible_transtitons)
+ var/_x = rand(min,max)
+ var/_y = rand(min,max)
+ var/turf/T = locate(_x, _y, _z)
+ A.forceMove(T)
+ qdel(room)
+
+ if(storedRooms.len)
+ for(var/x in storedRooms)
+ var/list/atomList = storedRooms[x]
+ for(var/atom/movable/A in atomList)
+ var/max = world.maxx-TRANSITIONEDGE
+ var/min = 1+TRANSITIONEDGE
+ var/list/possible_transtitons = list()
+ for(var/AZ in SSmapping.z_list)
+ var/datum/space_level/D = AZ
+ if (D.linkage == CROSSLINKED)
+ possible_transtitons += D.z_value
+ var/_z = pick(possible_transtitons)
+ var/_x = rand(min,max)
+ var/_y = rand(min,max)
+ var/turf/T = locate(_x, _y, _z)
+ A.forceMove(T)
+
+//Template Stuff
+/datum/map_template/hilbertshotel
+ name = "Hilbert's Hotel Room"
+ mappath = '_maps/templates/hilbertshotel.dmm'
+ var/landingZoneRelativeX = 2
+ var/landingZoneRelativeY = 8
+
+/datum/map_template/hilbertshotel/empty
+ name = "Empty Hilbert's Hotel Room"
+ mappath = '_maps/templates/hilbertshotelempty.dmm'
+
+/datum/map_template/hilbertshotel/lore
+ name = "Doctor Hilbert's Deathbed"
+ mappath = '_maps/templates/hilbertshotellore.dmm'
+
+/datum/map_template/hilbertshotelstorage
+ name = "Hilbert's Hotel Storage"
+ mappath = '_maps/templates/hilbertshotelstorage.dmm'
+
+
+//Turfs and Areas
+/turf/closed/indestructible/hotelwall
+ name = "hotel wall"
+ desc = "A wall designed to protect the security of the hotel's guests."
+ icon_state = "hotelwall"
+ canSmoothWith = list(/turf/closed/indestructible/hotelwall)
+ explosion_block = INFINITY
+
+/turf/open/indestructible/hotelwood
+ desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering."
+ icon_state = "wood"
+ footstep = FOOTSTEP_WOOD
+ tiled_dirt = FALSE
+
+/turf/open/indestructible/hoteltile
+ desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering."
+ icon_state = "showroomfloor"
+ footstep = FOOTSTEP_FLOOR
+ tiled_dirt = FALSE
+
+/turf/open/space/bluespace
+ name = "\proper bluespace hyperzone"
+ icon_state = "bluespace"
+ baseturfs = /turf/open/space/bluespace
+ flags_1 = NOJAUNT_1
+ explosion_block = INFINITY
+ var/obj/item/hilbertshotel/parentSphere
+
+/turf/open/space/bluespace/Entered(atom/movable/A)
+ . = ..()
+ A.forceMove(get_turf(parentSphere))
+
+/turf/closed/indestructible/hoteldoor
+ name = "Hotel Door"
+ icon_state = "hoteldoor"
+ explosion_block = INFINITY
+ var/obj/item/hilbertshotel/parentSphere
+
+/turf/closed/indestructible/hoteldoor/proc/promptExit(mob/living/user)
+ if(!isliving(user))
+ return
+ if(!user.mind)
+ return
+ if(!parentSphere)
+ to_chat(user, "The door seems to be malfunctioning and refuses to operate!")
+ return
+ if(alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", "Leave", "Stay") == "Leave")
+ if(!user.canmove || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt.
+ return
+ user.forceMove(get_turf(parentSphere))
+ do_sparks(3, FALSE, get_turf(user))
+
+/turf/closed/indestructible/hoteldoor/attack_ghost(mob/dead/observer/user)
+ if(!isobserver(user) || !parentSphere)
+ return ..()
+ user.forceMove(get_turf(parentSphere))
+
+//If only this could be simplified...
+/turf/closed/indestructible/hoteldoor/attack_tk(mob/user)
+ return //need to be close.
+
+/turf/closed/indestructible/hoteldoor/attack_hand(mob/user)
+ promptExit(user)
+
+/turf/closed/indestructible/hoteldoor/attack_animal(mob/user)
+ promptExit(user)
+
+/turf/closed/indestructible/hoteldoor/attack_paw(mob/user)
+ promptExit(user)
+
+/turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user, does_attack_animation)
+ promptExit(user)
+
+/turf/closed/indestructible/hoteldoor/attack_larva(mob/user)
+ promptExit(user)
+
+/turf/closed/indestructible/hoteldoor/attack_slime(mob/user)
+ promptExit(user)
+
+/turf/closed/indestructible/hoteldoor/attack_robot(mob/user)
+ if(get_dist(get_turf(src), get_turf(user)) <= 1)
+ promptExit(user)
+
+/turf/closed/indestructible/hoteldoor/AltClick(mob/user)
+ . = ..()
+ if(get_dist(get_turf(src), get_turf(user)) <= 1)
+ to_chat(user, "You peak through the door's bluespace peephole...")
+ user.reset_perspective(parentSphere)
+ user.set_machine(src)
+ var/datum/action/peepholeCancel/PHC = new
+ user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1)
+ PHC.Grant(user)
+
+/turf/closed/indestructible/hoteldoor/check_eye(mob/user)
+ if(get_dist(get_turf(src), get_turf(user)) >= 2)
+ user.unset_machine()
+ for(var/datum/action/peepholeCancel/PHC in user.actions)
+ PHC.Trigger()
+
+/datum/action/peepholeCancel
+ name = "Cancel View"
+ desc = "Stop looking through the bluespace peephole."
+ button_icon_state = "cancel_peephole"
+
+/datum/action/peepholeCancel/Trigger()
+ . = ..()
+ to_chat(owner, "You move away from the peephole.")
+ owner.reset_perspective()
+ owner.clear_fullscreen("remote_view", 0)
+ qdel(src)
+
+/area/hilbertshotel
+ name = "Hilbert's Hotel Room"
+ icon_state = "hilbertshotel"
+ requires_power = FALSE
+ has_gravity = TRUE
+ noteleport = TRUE
+ hidden = TRUE
+ unique = FALSE
+ dynamic_lighting = DYNAMIC_LIGHTING_FORCED
+ ambientsounds = list('sound/ambience/servicebell.ogg')
+ var/roomnumber = 0
+ var/obj/item/hilbertshotel/parentSphere
+ var/datum/turf_reservation/reservation
+ var/turf/storageTurf
+
+/area/hilbertshotel/Entered(atom/movable/AM)
+ . = ..()
+ if(istype(AM, /obj/item/hilbertshotel))
+ relocate(AM)
+ var/list/obj/item/hilbertshotel/hotels = AM.GetAllContents(/obj/item/hilbertshotel)
+ for(var/obj/item/hilbertshotel/H in hotels)
+ if(parentSphere == H)
+ relocate(H)
+
+/area/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H)
+ if(prob(0.135685)) //Because screw you
+ qdel(H)
+ return
+ var/turf/targetturf = find_safe_turf()
+ if(!targetturf)
+ if(GLOB.blobstart.len > 0)
+ targetturf = get_turf(pick(GLOB.blobstart))
+ else
+ CRASH("Unable to find a blobstart landmark")
+ var/turf/T = get_turf(H)
+ var/area/A = T.loc
+ log_game("[H] entered itself. Moving it to [loc_name(targetturf)].")
+ message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].")
+ for(var/mob/M in A)
+ to_chat(M, "[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!")
+ H.forceMove(targetturf)
+
+/area/hilbertshotel/Exited(atom/movable/AM)
+ . = ..()
+ if(ismob(AM))
+ var/mob/M = AM
+ if(M.mind)
+ var/stillPopulated = FALSE
+ var/list/currentLivingMobs = GetAllContents(/mob/living) //Got to catch anyone hiding in anything
+ for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left.
+ if(L.mind)
+ stillPopulated = TRUE
+ break
+ if(!stillPopulated)
+ storeRoom()
+
+/area/hilbertshotel/proc/storeRoom()
+ var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1)
+ var/storage[roomSize]
+ var/turfNumber = 1
+ var/obj/item/abstracthotelstorage/storageObj = new(storageTurf)
+ storageObj.roomNumber = roomnumber
+ storageObj.parentSphere = parentSphere
+ storageObj.name = "Room [roomnumber] Storage"
+ for(var/i=0, iIt's to far away to scan!")
+ return
+ var/obj/item/hilbertshotel/sphere = target
+ if(sphere.activeRooms.len)
+ to_chat(user, "Currently Occupied Rooms:")
+ for(var/roomnumber in sphere.activeRooms)
+ to_chat(user, roomnumber)
+ else
+ to_chat(user, "No currenty occupied rooms.")
+ if(sphere.storedRooms.len)
+ to_chat(user, "Vacated Rooms:")
+ for(var/roomnumber in sphere.storedRooms)
+ to_chat(user, roomnumber)
+ else
+ to_chat(user, "No vacated rooms.")
+
+/obj/effect/mob_spawn/human/doctorhilbert
+ name = "Doctor Hilbert"
+ mob_name = "Doctor Hilbert"
+ mob_gender = "male"
+ assignedrole = null
+ ghost_usable = FALSE
+ oxy_damage = 500
+ mob_species = /datum/species/skeleton
+ id_job = "Head Researcher"
+ id_access = ACCESS_RESEARCH
+ id_access_list = list(ACCESS_AWAY_GENERIC3, ACCESS_RESEARCH)
+ instant = TRUE
+ id = /obj/item/card/id/silver
+ uniform = /obj/item/clothing/under/rank/research_director
+ shoes = /obj/item/clothing/shoes/sneakers/brown
+ back = /obj/item/storage/backpack/satchel/leather
+ suit = /obj/item/clothing/suit/toggle/labcoat
+
+/obj/item/paper/crumpled/docslogs
+ name = "Research Logs"
+
+/obj/item/paper/crumpled/docslogs/Initialize()
+ . = ..()
+ GLOB.hhmysteryRoomNumber = rand(1, SHORT_REAL_LIMIT)
+ info = {"
Research Logs
+ I might just be onto something here!
+ The strange space-warping properties of bluespace have been known about for awhile now, but I might be on the verge of discovering a new way of harnessing it.
+ It's too soon to say for sure, but this might be the start of something quite important!
+ I'll be sure to log any major future breakthroughs. This might be a lot more than I can manage on my own, perhaps I should hire that secretary after all...
+
Breakthrough!
+ I can't believe it, but I did it! Just when I was certain it couldn't be done, I made the final necessary breakthrough.
+ Exploiting the effects of space dilation caused by specific bluespace structures combined with a precise use of geometric calculus, I've discovered a way to correlate an infinite amount of space within a finite area!
+ While the potential applications are endless, I utilized it in quite a nifty way so far by designing a system that recursively constructs subspace rooms and spatially links them to any of the infinite infinitesimally distinct points on the spheres surface.
+ I call it: Hilbert's Hotel!
+
Goodbye
+ I can't take this anymore. I know what happens next, and the fear of what is coming leaves me unable to continue working.
+ Any fool in my field has heard the stories. It's not that I didn't believe them, it's just... I guess I underestimated the importance of my own research...
+ Robert has reported a further increase in frequency of the strange, prying visitors who ask questions they have no business asking. I've requested him to keep everything on strict lockdown and have permanently dismissed all other assistants.
+ I've also instructed him to use the encryption method we discussed for any important quantitative data. The poor lad... I don't think he truly understands what he's gotten himself into...
+ It's clear what happens now. One day they'll show up uninvited, and claim my research as their own, leaving me as nothing more than a bullet ridden corpse floating in space.
+ I can't stick around to the let that happen.
+ I'm escaping into the very thing that brought all this trouble to my doorstep in the first place - my hotel.
+ I'll be in
[uppertext(num2hex(GLOB.hhmysteryRoomNumber, 0))] (That will make sense to anyone who should know)
+ I'm sorry that I must go like this. Maybe one day things will be different and it will be safe to return... maybe...
+ Goodbye
+
+
Doctor Hilbert"}
+
+/obj/item/paper/crumpled/robertsworkjournal
+ name = "Work Journal"
+ info = {"
First Week!
+ First week on the new job. It's a secretarial position, but hey, whatever pays the bills. Plus it seems like some interesting stuff goes on here.
+ Doc says its best that I don't openly talk about his research with others, I guess he doesn't want it getting out or something. I've caught myself slipping a few times when talking to others, it's hard not to brag about something this cool!
+ I'm not really sure why I'm choosing to journal this. Doc seems to log everything. He says it's incase he discovers anything important.
+ I guess that's why I'm doing it too, I've always wanted to be a part of something important.
+ Here's to a new job and to becoming a part of something important!
+
Weird times...
+ Things are starting to get a little strange around here. Just weeks after Doc's amazing breakthrough, weird visitors have began showing up unannounced, asking strange things about Doc's work.
+ I knew Doc wasn't a big fan of company, but even he seemed strangely unnerved when I told him about the visitors.
+ He said it's important that from here on out we keep tight security on everything, even other staff members.
+ He also said something about securing data, something about hexes. What's that mean? Some sort of curse? Doc never struck me as the magic type...
+ He often uses a lot of big sciencey words that I don't really understand, but I kinda dig it, it makes me feel like I'm witnessing something big.
+ I hope things go back to normal soon, but I guess that's the price you pay for being a part of something important.
+
Last day I guess?
+ Things are officially starting to get too strange for me.
+ The visitors have been coming a lot more often, and they all seem increasingly aggressive and nosey. I'm starting to see why they made Doc so nervous, they're certainly starting to creep me out too.
+ Awhile ago Doc started having me keep the place on strict lockdown and requested I refuse entry to anyone else, including previous staff.
+ But the weirdest part?
+ I haven't seen Doc in days. It's not unusual for him to work continuously for long periods of time in the lab, but when I took a peak in their yesterday - he was nowhere to be seen! I didn't risk prying much further, Doc had a habit of leaving the defense systems on these last few weeks.
+ I'm thinking it might be time to call it quits. Can't work much without a boss, plus things are starting to get kind of shady. I wanted to be a part of something important, but you gotta know when to play it safe.
+ As my dad always said, "The smart get famous, but the wise survive..."
+
+
Robert P."}
+
+/obj/item/paper/crumpled/bloody/docsdeathnote
+ name = "note"
+ info = {"This is it isn't it?
+ No one's coming to help, that much has become clear.
+ Sure, it's lonely, but do I have much choice? At least I brought the analyzer with me, they shouldn't be able to find me without it.
+ Who knows who's waiting for me out there. Its either die out there in their hands, or die a slower, slightly more comfortable death in here.
+ Everyday I can feel myself slipping away more and more, both physically and mentally. Who knows what happens now...
+ Heh, so it's true then, this must be the inescapable path of all great minds... so be it then.
+
+
+
+
Choose a room, and enter the sphere
+ Lay your head to rest, it soon becomes clear
+ There's always more room around every bend
+ Not all that's countable has an end..."}
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 119023d465..b581a54095 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -232,7 +232,7 @@
SSshuttle.emergencyLastCallLoc = null
if(!silent)
- priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlecalled.ogg', "Priority")
+ priority_announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, "shuttlecalled", "Priority")
/obj/docking_port/mobile/emergency/cancel(area/signalOrigin)
if(mode != SHUTTLE_CALL)
@@ -247,7 +247,7 @@
SSshuttle.emergencyLastCallLoc = signalOrigin
else
SSshuttle.emergencyLastCallLoc = null
- priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, 'sound/ai/shuttlerecalled.ogg', "Priority")
+ priority_announce("The emergency shuttle has been recalled.[SSshuttle.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]", null, "shuttlerecalled", "Priority")
/obj/docking_port/mobile/emergency/proc/is_hijacked()
var/has_people = FALSE
@@ -319,7 +319,7 @@
mode = SHUTTLE_DOCKED
setTimer(SSshuttle.emergencyDockTime)
send2irc("Server", "The Emergency Shuttle has docked with the station.")
- priority_announce("The Emergency Shuttle has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, 'sound/ai/shuttledock.ogg', "Priority")
+ priority_announce("The Emergency Shuttle has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, "shuttledock", "Priority")
ShuttleDBStuff()
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index dd2d7483e3..121ee2e07f 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -290,7 +290,7 @@ All ShuttleMove procs go here
// ignores the movement of the shuttle from the staging area on CentCom to
// the station as it is loaded in.
if (oldT && !is_centcom_level(oldT.z))
- GET_COMPONENT(STR, /datum/component/storage/concrete/emergency)
+ var/datum/component/storage/concrete/emergency/STR = GetComponent(/datum/component/storage/concrete/emergency)
STR?.unlock_me()
/************************************Mob move procs************************************/
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 2249f5f10e..32c38451c5 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -24,7 +24,8 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
/obj/effect/portal,
/obj/item/shared_storage,
/obj/structure/extraction_point,
- /obj/machinery/syndicatebomb
+ /obj/machinery/syndicatebomb,
+ /obj/item/hilbertshotel
)))
/obj/docking_port/mobile/supply
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index 98eb6f56bf..22dee60eb4 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -115,6 +115,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
var/nonabstract_req = 0 //spell can only be cast by mobs that are physical entities
var/stat_allowed = 0 //see if it requires being conscious/alive, need to set to 1 for ghostpells
var/phase_allowed = 0 // If true, the spell can be cast while phased, eg. blood crawling, ethereal jaunting
+ var/antimagic_allowed = TRUE // If false, the spell cannot be cast while under the effect of antimagic
var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell
var/invocation_emote_self = null
var/invocation_type = "none" //can be none, whisper, emote and shout
@@ -147,27 +148,36 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
if(player_lock)
if(!user.mind || !(src in user.mind.spell_list) && !(src in user.mob_spell_list))
to_chat(user, "You shouldn't have this spell! Something's wrong.")
- return 0
+ return FALSE
else
if(!(src in user.mob_spell_list))
- return 0
+ return FALSE
var/turf/T = get_turf(user)
if(is_centcom_level(T.z) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
to_chat(user, "You can't cast this spell here.")
- return 0
+ return FALSE
if(!skipcharge)
if(!charge_check(user))
- return 0
+ return FALSE
if(user.stat && !stat_allowed)
to_chat(user, "Not when you're incapacitated.")
- return 0
+ return FALSE
+
+ if(!antimagic_allowed)
+ var/antimagic = user.anti_magic_check(TRUE, FALSE, chargecost = 0, self = TRUE)
+ if(antimagic)
+ if(isitem(antimagic))
+ to_chat(user, "[antimagic] is interfering with your magic.")
+ else
+ to_chat(user, "Magic seems to flee from you, you can't gather enough power to cast this spell.")
+ return FALSE
if(!phase_allowed && istype(user.loc, /obj/effect/dummy))
to_chat(user, "[name] cannot be cast unless you are completely manifested in the material plane.")
- return 0
+ return FALSE
if(ishuman(user))
@@ -175,7 +185,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
if((invocation_type == "whisper" || invocation_type == "shout") && !H.can_speak_vocal())
to_chat(user, "You can't get the words out!")
- return 0
+ return FALSE
var/list/casting_clothes = typecacheof(list(/obj/item/clothing/suit/wizrobe,
/obj/item/clothing/suit/space/hardsuit/wizard,
@@ -187,24 +197,24 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
if(clothes_req) //clothes check
if(!is_type_in_typecache(H.wear_suit, casting_clothes))
to_chat(H, "I don't feel strong enough without my robe.")
- return 0
+ return FALSE
if(!is_type_in_typecache(H.head, casting_clothes))
to_chat(H, "I don't feel strong enough without my hat.")
- return 0
+ return FALSE
if(cult_req) //CULT_REQ CLOTHES CHECK
if(!istype(H.wear_suit, /obj/item/clothing/suit/magusred) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/cult))
to_chat(H, "I don't feel strong enough without my armor.")
- return 0
+ return FALSE
if(!istype(H.head, /obj/item/clothing/head/magus) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/cult))
to_chat(H, "I don't feel strong enough without my helmet.")
- return 0
+ return FALSE
else
if(clothes_req || human_req)
to_chat(user, "This spell can only be cast by humans!")
- return 0
+ return FALSE
if(nonabstract_req && (isbrain(user) || ispAI(user)))
to_chat(user, "This spell can only be cast by physical beings!")
- return 0
+ return FALSE
if(!skipcharge)
@@ -499,6 +509,9 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
if(user.stat && !stat_allowed)
return FALSE
+ if(!antimagic_allowed && user.anti_magic_check(TRUE, FALSE, chargecost = 0, self = TRUE))
+ return FALSE
+
if(!ishuman(user))
if(clothes_req || human_req)
return FALSE
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
index bb3cc1f7e3..0c0b20f0fc 100644
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ b/code/modules/spells/spell_types/construct_spells.dm
@@ -146,7 +146,7 @@
clothes_req = 0
invocation = "none"
invocation_type = "none"
- proj_type = /obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile/lesser
+ proj_type = "/obj/effect/proc_holder/spell/targeted/inflict_handler/magic_missile/lesser"
proj_lifespan = 10
max_targets = 6
action_icon_state = "magicm"
diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm
index 47d6f71f9b..ed78e3315a 100644
--- a/code/modules/spells/spell_types/forcewall.dm
+++ b/code/modules/spells/spell_types/forcewall.dm
@@ -35,6 +35,6 @@
return TRUE
if(ismob(mover))
var/mob/M = mover
- if(M.anti_magic_check())
+ if(M.anti_magic_check(chargecost = 0))
return TRUE
return FALSE
diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm
index 107f303049..d78b32c643 100644
--- a/code/modules/spells/spell_types/mind_transfer.dm
+++ b/code/modules/spells/spell_types/mind_transfer.dm
@@ -61,7 +61,7 @@ Also, you never added distance checking after target is selected. I've went ahea
return
var/datum/mind/TM = target.mind
- if((target.anti_magic_check() || TM.has_antag_datum(/datum/antagonist/wizard) || TM.has_antag_datum(/datum/antagonist/cult) || TM.has_antag_datum(/datum/antagonist/clockcult) || TM.has_antag_datum(/datum/antagonist/changeling) || TM.has_antag_datum(/datum/antagonist/rev)) || cmptext(copytext(target.key,1,2),"@"))
+ if((target.anti_magic_check(TRUE, FALSE) || TM.has_antag_datum(/datum/antagonist/wizard) || TM.has_antag_datum(/datum/antagonist/cult) || TM.has_antag_datum(/datum/antagonist/clockcult) || TM.has_antag_datum(/datum/antagonist/changeling) || TM.has_antag_datum(/datum/antagonist/rev)) || cmptext(copytext(target.key,1,2),"@"))
if(!silent)
to_chat(user, "[target.p_their(TRUE)] mind is resisting your spell!")
return
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index 1576c55326..46eb14013f 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -13,7 +13,7 @@
var/revert_on_death = TRUE
var/die_with_shapeshifted_form = TRUE
- var/convert_damage = FALSE //If you want to convert the caster's health to the shift, and vice versa.
+ var/convert_damage = TRUE //If you want to convert the caster's health to the shift, and vice versa.
var/convert_damage_type = BRUTE //Since simplemobs don't have advanced damagetypes, what to convert damage back into.
var/shapeshift_type
var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\
@@ -101,8 +101,10 @@
stored.forceMove(src)
stored.notransform = TRUE
if(source.convert_damage)
- var/damapply = (stored.maxHealth - (stored.health + stored.maxHealth)/2) //Carbons go from -100 to 100 naturally, while simplemobs only go from 0 to 100. Can't do a direct conversion.
- shape.apply_damage(damapply, source.convert_damage_type)
+ var/damage_percent = (stored.maxHealth - stored.health)/stored.maxHealth;
+ var/damapply = damage_percent * shape.maxHealth;
+
+ shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE);
slink = soullink(/datum/soullink/shapeshift, stored , shape)
slink.source = src
@@ -152,8 +154,10 @@
stored.death()
else if(source.convert_damage)
stored.revive(full_heal = TRUE)
- var/damapply = (shape.maxHealth - 2*shape.health) //Since we halved incoming damage, double outgoing.
- stored.apply_damage(damapply, source.convert_damage_type)
+ var/damage_percent = (shape.maxHealth - shape.health)/shape.maxHealth;
+ var/damapply = stored.maxHealth * damage_percent
+
+ stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE)
qdel(shape)
qdel(src)
diff --git a/code/modules/spells/spell_types/spacetime_distortion.dm b/code/modules/spells/spell_types/spacetime_distortion.dm
index 7fd857dc51..7a19787675 100644
--- a/code/modules/spells/spell_types/spacetime_distortion.dm
+++ b/code/modules/spells/spell_types/spacetime_distortion.dm
@@ -86,7 +86,7 @@
/obj/effect/cross_action/spacetime_dist/proc/walk_link(atom/movable/AM)
if(ismob(AM))
var/mob/M = AM
- if(M.anti_magic_check())
+ if(M.anti_magic_check(chargecost = 0))
return
if(linked_dist && walks_left > 0)
flick("purplesparkles", src)
diff --git a/code/modules/spells/spell_types/summonitem.dm b/code/modules/spells/spell_types/summonitem.dm
index 6d46c53a9d..7d9823e29b 100644
--- a/code/modules/spells/spell_types/summonitem.dm
+++ b/code/modules/spells/spell_types/summonitem.dm
@@ -61,6 +61,10 @@
organ.Remove(organ.owner)
else
while(!isturf(item_to_retrieve.loc) && infinite_recursion < 10) //if it's in something you get the whole thing.
+ if(isitem(item_to_retrieve.loc))
+ var/obj/item/I = item_to_retrieve.loc
+ if(I.item_flags & ABSTRACT) //Being able to summon abstract things because your item happened to get placed there is a no-no
+ break
if(ismob(item_to_retrieve.loc)) //If its on someone, properly drop it
var/mob/M = item_to_retrieve.loc
diff --git a/code/modules/spells/spell_types/telepathy.dm b/code/modules/spells/spell_types/telepathy.dm
new file mode 100644
index 0000000000..34f100f753
--- /dev/null
+++ b/code/modules/spells/spell_types/telepathy.dm
@@ -0,0 +1,32 @@
+/obj/effect/proc_holder/spell/targeted/telepathy
+ name = "Telepathy"
+ desc = "Telepathically transmits a message to the target."
+ charge_max = 0
+ clothes_req = 0
+ range = 7
+ include_user = 0
+ action_icon = 'icons/mob/actions/actions_revenant.dmi'
+ action_icon_state = "r_transmit"
+ action_background_icon_state = "bg_spell"
+ var/notice = "notice"
+ var/boldnotice = "boldnotice"
+ var/magic_check = FALSE
+ var/holy_check = FALSE
+ var/tinfoil_check = TRUE
+
+/obj/effect/proc_holder/spell/targeted/telepathy/cast(list/targets, mob/living/user = usr)
+ for(var/mob/living/M in targets)
+ var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "")
+ if(!msg)
+ charge_counter = charge_max
+ return
+ log_directed_talk(user, M, msg, LOG_SAY, "[name]")
+ to_chat(user, "You transmit to [M]: [msg]")
+ if(!M.anti_magic_check(magic_check, holy_check, tinfoil_check, 0)) //hear no evil
+ to_chat(M, "You hear something behind you talking... [msg]")
+ for(var/ded in GLOB.dead_mob_list)
+ if(!isobserver(ded))
+ continue
+ var/follow_rev = FOLLOW_LINK(ded, user)
+ var/follow_whispee = FOLLOW_LINK(ded, M)
+ to_chat(ded, "[follow_rev] [user] [name]: \"[msg]\" to [follow_whispee] [M]")
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 3073a6fcc3..2aae17b0f3 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -276,7 +276,7 @@
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, "dna_vault")
if(VAULT_SPEED)
to_chat(H, "Your legs feel faster.")
- ADD_TRAIT(H, TRAIT_GOTTAGOFAST, "dna_vault")
+ H.add_movespeed_modifier(MOVESPEED_ID_DNA_VAULT, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
if(VAULT_QUICK)
to_chat(H, "Your arms move as fast as lightning.")
H.next_move_modifier = 0.5
diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm
index 88377455c6..b68fef3e2f 100644
--- a/code/modules/station_goals/station_goal.dm
+++ b/code/modules/station_goals/station_goal.dm
@@ -12,7 +12,7 @@
var/report_message = "Complete this goal."
/datum/station_goal/proc/send_report()
- priority_announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", 'sound/ai/commandreport.ogg')
+ priority_announce("Priority Nanotrasen directive received. Project \"[name]\" details inbound.", "Incoming Priority Message", "commandreport")
print_command_report(get_report(),"Nanotrasen Directive [pick(GLOB.phonetic_alphabet)] \Roman[rand(1,50)]", announce=FALSE)
on_report()
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index dffb7bf355..9aa89dcaf5 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -13,8 +13,7 @@
var/needs_processing = FALSE
var/body_zone //BODY_ZONE_CHEST, BODY_ZONE_L_ARM, etc , used for def_zone
- var/aux_zone // used for hands
- var/aux_layer
+ var/list/aux_icons // associative list, currently used for hands
var/body_part = null //bitflag used to check which clothes cover this bodypart
var/use_digitigrade = NOT_DIGITIGRADE //Used for alternate legs, useless elsewhere
var/list/embedded_objects = list()
@@ -434,9 +433,9 @@
. += image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
- var/image/aux
+ var/list/aux = list()
var/image/marking
- var/image/auxmarking
+ var/list/auxmarking = list()
. += limb
@@ -502,13 +501,15 @@
// Citadel End
- if(aux_zone)
- aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
- if(!isnull(aux_marking))
- if(species_id == "husk")
- auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
- else
- auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
+ if(aux_icons)
+ for(var/I in aux_icons)
+ var/aux_layer = aux_icons[I]
+ aux += image(limb.icon, "[species_id]_[I]", -aux_layer, image_dir)
+ if(!isnull(aux_marking))
+ if(species_id == "husk")
+ auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir)
+ else
+ auxmarking += image(body_markings_icon, "[body_markings]_[I]", -aux_layer, image_dir)
. += aux
. += auxmarking
@@ -519,15 +520,17 @@
else
limb.icon_state = "[body_zone]"
- if(aux_zone)
- aux = image(limb.icon, "[aux_zone]", -aux_layer, image_dir)
+ if(aux_icons)
+ for(var/I in aux_icons)
+ var/aux_layer = aux_icons[I]
+ aux += image(limb.icon, "[I]", -aux_layer, image_dir)
+ if(!isnull(aux_marking))
+ if(species_id == "husk")
+ auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir)
+ else
+ auxmarking += image(body_markings_icon, "[body_markings]_[I]", -aux_layer, image_dir)
+ . += auxmarking
. += aux
- if(!isnull(aux_marking))
- if(species_id == "husk")
- auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
- else
- auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
- . += auxmarking
if(!isnull(body_markings))
if(species_id == "husk")
@@ -549,13 +552,17 @@
var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone))
if(draw_color)
limb.color = "#[draw_color]"
- if(aux_zone)
- aux.color = "#[draw_color]"
+ if(aux_icons)
+ for(var/a in aux)
+ var/image/I = a
+ I.color = "#[draw_color]"
if(!isnull(aux_marking))
- if(species_id == "husk")
- auxmarking.color = "#141414"
- else
- auxmarking.color = list(markings_color)
+ for(var/a in auxmarking)
+ var/image/I = a
+ if(species_id == "husk")
+ I.color = "#141414"
+ else
+ I.color = list(markings_color)
if(!isnull(body_markings))
if(species_id == "husk")
@@ -633,8 +640,7 @@
max_stamina_damage = 50
body_zone = BODY_ZONE_L_ARM
body_part = ARM_LEFT
- aux_zone = BODY_ZONE_PRECISE_L_HAND
- aux_layer = HANDS_PART_LAYER
+ aux_icons = list(BODY_ZONE_PRECISE_L_HAND = HANDS_PART_LAYER, "l_hand_behind" = BODY_BEHIND_LAYER)
body_damage_coeff = 0.75
held_index = 1
px_x = -6
@@ -697,8 +703,7 @@
max_damage = 50
body_zone = BODY_ZONE_R_ARM
body_part = ARM_RIGHT
- aux_zone = BODY_ZONE_PRECISE_R_HAND
- aux_layer = HANDS_PART_LAYER
+ aux_icons = list(BODY_ZONE_PRECISE_R_HAND = HANDS_PART_LAYER, "r_hand_behind" = BODY_BEHIND_LAYER)
body_damage_coeff = 0.75
held_index = 2
px_x = 6
@@ -768,6 +773,8 @@
px_y = 12
stam_heal_tick = 2
max_stamina_damage = 50
+ var/blood_state = BLOOD_STATE_NOT_BLOODY
+ var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
/obj/item/bodypart/l_leg/is_disabled()
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG))
@@ -828,6 +835,8 @@
px_y = 12
max_stamina_damage = 50
stam_heal_tick = 2
+ var/blood_state = BLOOD_STATE_NOT_BLOODY
+ var/list/bloody_legs = list(BLOOD_STATE_BLOOD = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0)
/obj/item/bodypart/r_leg/is_disabled()
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG))
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index a2e8017956..d520fbb917 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -49,6 +49,27 @@
+/mob/proc/has_left_leg()
+ return TRUE
+
+/mob/living/carbon/has_left_leg()
+ var/obj/item/bodypart/l_leg = get_bodypart(BODY_ZONE_L_LEG)
+ if(l_leg)
+ return TRUE
+ else
+ return FALSE
+
+/mob/proc/has_right_leg()
+ return TRUE
+
+/mob/living/carbon/has_right_leg()
+ var/obj/item/bodypart/r_leg = get_bodypart(BODY_ZONE_R_LEG)
+ if(r_leg)
+ return TRUE
+ else
+ return FALSE
+
+
//Limb numbers
/mob/proc/get_num_arms(check_disabled = TRUE)
return 2
@@ -95,7 +116,7 @@
return TRUE
/mob/living/carbon/human/get_leg_ignore()
- if((movement_type & FLYING) || floating)
+ if(movement_type & FLYING|FLOATING)
return TRUE
return FALSE
diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm
index 7156b8180b..8af52abc47 100644
--- a/code/modules/surgery/organs/augments_chest.dm
+++ b/code/modules/surgery/organs/augments_chest.dm
@@ -129,7 +129,7 @@
var/datum/effect_system/trail_follow/ion/ion_trail
/obj/item/organ/cyberimp/chest/thrusters/Insert(mob/living/carbon/M, special = 0)
- ..()
+ . = ..()
if(!ion_trail)
ion_trail = new
ion_trail.set_up(M)
@@ -151,10 +151,14 @@
on = TRUE
if(allow_thrust(0.01))
ion_trail.start()
+ RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/move_react)
+ owner.add_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER, priority=100, multiplicative_slowdown=-2, movetypes=FLOATING, conflict=MOVE_CONFLICT_JETPACK)
if(!silent)
to_chat(owner, "You turn your thrusters set on.")
else
ion_trail.stop()
+ UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
+ owner.remove_movespeed_modifier(MOVESPEED_ID_CYBER_THRUSTER)
if(!silent)
to_chat(owner, "You turn your thrusters set off.")
on = FALSE
@@ -169,6 +173,9 @@
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/organ/cyberimp/chest/thrusters/proc/move_react()
+ allow_thrust(0.01)
+
/obj/item/organ/cyberimp/chest/thrusters/proc/allow_thrust(num)
if(!on || !owner)
return 0
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 8e4caab436..82fbf932e9 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -57,7 +57,7 @@
/obj/item/organ/heart/prepare_eat()
var/obj/S = ..()
- S.icon_state = "heart-off"
+ S.icon_state = "[icon_base]-off"
return S
/obj/item/organ/heart/on_life()
@@ -90,6 +90,12 @@
owner.set_heartattack(TRUE)
failed = TRUE
+obj/item/organ/heart/slime
+ name = "slime heart"
+ desc = "It seems we've gotten to the slimy core of the matter."
+ icon_state = "heart-s-on"
+ icon_base = "heart-s"
+
/obj/item/organ/heart/cursed
name = "cursed heart"
desc = "A heart that, when inserted, will force you to pump it manually."
@@ -212,6 +218,19 @@ obj/item/organ/heart/cybernetic/upgraded/on_life()
+/obj/item/organ/heart/ipc
+ name = "IPC heart"
+ desc = "An electronic pump that regulates hydraulic functions, they have an auto-restart after EMPs."
+ icon_state = "heart-c"
+ organ_flags = ORGAN_SYNTHETIC
+
+/obj/item/organ/heart/ipc/emp_act()
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ Stop()
+ addtimer(CALLBACK(src, .proc/Restart), 10)
+
/obj/item/organ/heart/freedom
name = "heart of freedom"
desc = "This heart pumps with the passion to give... something freedom."
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 7fb9c6e4bf..a7eefdda4d 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -259,7 +259,6 @@
name = "plasma bone \"tongue\""
desc = "Like animated skeletons, Plasmamen vibrate their teeth in order to produce speech."
icon_state = "tongueplasma"
- maxHealth = "alien"
modifies_speech = FALSE
/obj/item/organ/tongue/robot
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 009cfce0a5..a555010567 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -917,7 +917,7 @@
speaktrigger += "[(H.client?.prefs.lewdchem?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but aiding your cause, ")] "//Redflags!!
//mood
- GET_COMPONENT_FROM(mood, /datum/component/mood, H)
+ var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
switch(mood.sanity)
if(SANITY_GREAT to INFINITY)
speaktrigger += "I'm beyond elated!! " //did you mean byond elated? hohoho
diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html
index 3e2f26a09f..3cab68da6a 100644
--- a/code/modules/tooltip/tooltip.html
+++ b/code/modules/tooltip/tooltip.html
@@ -122,8 +122,8 @@
//Get the real icon size according to the client view
var mapWidth = map['view-size'].x,
mapHeight = map['view-size'].y,
- tilesShown = tooltip.client_view_w
- realIconSize = mapWidth / tilesShown,
+ tilesShown = tooltip.client_view_h
+ realIconSize = mapHeight / tilesShown,
resizeRatio = realIconSize / tooltip.tileSize,
//Calculate letterboxing offsets
leftOffset = (map.size.x - mapWidth) / 2,
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 8da5d7c113..642052026b 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -2,6 +2,7 @@
//Keep this sorted alphabetically
#ifdef UNIT_TESTS
+#include "component_tests.dm"
#include "reagent_id_typos.dm"
#include "reagent_recipe_collisions.dm"
#include "spawn_humans.dm"
diff --git a/code/modules/unit_tests/component_tests.dm b/code/modules/unit_tests/component_tests.dm
new file mode 100644
index 0000000000..409d7f4322
--- /dev/null
+++ b/code/modules/unit_tests/component_tests.dm
@@ -0,0 +1,12 @@
+/datum/unit_test/component_duping/Run()
+ var/list/bad_dms = list()
+ var/list/bad_dts = list()
+ for(var/t in typesof(/datum/component))
+ var/datum/component/comp = t
+ if(!isnum(initial(comp.dupe_mode)))
+ bad_dms += t
+ var/dupe_type = initial(comp.dupe_type)
+ if(dupe_type && !ispath(dupe_type))
+ bad_dts += t
+ if(length(bad_dms) || length(bad_dts))
+ Fail("Components with invalid dupe modes: ([bad_dms.Join(",")]) ||| Components with invalid dupe types: ([bad_dts.Join(",")])")
\ No newline at end of file
diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm
index b008682745..5c47a2d342 100644
--- a/code/modules/uplink/uplink_devices.dm
+++ b/code/modules/uplink/uplink_devices.dm
@@ -25,18 +25,18 @@
/obj/item/uplink/nuclear/Initialize()
. = ..()
- GET_COMPONENT(hidden_uplink, /datum/component/uplink)
+ var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink)
hidden_uplink.set_gamemode(/datum/game_mode/nuclear)
/obj/item/uplink/nuclear_restricted/Initialize()
. = ..()
- GET_COMPONENT(hidden_uplink, /datum/component/uplink)
+ var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink)
hidden_uplink.allow_restricted = FALSE
hidden_uplink.set_gamemode(/datum/game_mode/nuclear)
/obj/item/uplink/clownop/Initialize()
. = ..()
- GET_COMPONENT(hidden_uplink, /datum/component/uplink)
+ var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink)
hidden_uplink.set_gamemode(/datum/game_mode/nuclear/clown_ops)
/obj/item/uplink/old
@@ -45,7 +45,7 @@
/obj/item/uplink/old/Initialize(mapload, owner, tc_amount = 10)
. = ..()
- GET_COMPONENT(hidden_uplink, /datum/component/uplink)
+ var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink)
hidden_uplink.name = "dusty radio"
// Multitool uplink
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 61af0eaf78..ba531cac93 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1711,12 +1711,20 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled gas masked scientist.
restricted_roles = list("Research Director", "Scientist")
+/datum/uplink_item/role_restricted/alientech
+ name = "Alien Research Disk"
+ desc = "A technology disk holding a terabyte of highly confidential abductor technology. \
+ Simply insert into research console of choice and import the files from the disk. You might research some useful gear from this."
+ item = /obj/item/disk/tech_disk/abductor
+ cost = 12
+ restricted_roles = list("Research Director", "Scientist", "Roboticist")
+
/datum/uplink_item/role_restricted/brainwash_disk
name = "Brainwashing Surgery Program"
desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \
Insert into an Operating Console to enable the procedure."
item = /obj/item/disk/surgery/brainwashing
- restricted_roles = list("Medical Doctor")
+ restricted_roles = list("Medical Doctor", "Roboticist")
cost = 3
/datum/uplink_item/role_restricted/clown_bomb
@@ -1912,6 +1920,13 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
Radio headset does not include encryption key. No gun included."
item = /obj/item/storage/box/syndie_kit/centcom_costume
+/datum/uplink_item/badass/claymore
+ name = "Claymore"
+ cost = 8
+ player_minimum = 25
+ desc = "A claymore. We don't know why you'd do this."
+ item = /obj/item/claymore
+
/datum/uplink_item/badass/costumes/clown
name = "Clown Costume"
desc = "Nothing is more terrifying than clowns with fully automatic weaponry."
diff --git a/config/game_options.txt b/config/game_options.txt
index 02d620eb31..0843e7c3d1 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -255,6 +255,141 @@ EVENTS_MIN_TIME_MUL 1
EVENTS_MIN_PLAYERS_MUL 1
+
+### DYNAMIC MODE ###
+
+## How many roundstart players required for high population override to take effect.
+DYNAMIC_HIGH_POP_LIMIT 55
+
+## Pop range per requirement.
+## If the value is five the range is:
+## 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+
+## If it is six the range is:
+## 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+
+## If it is seven the range is:
+## 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+
+## Options outside this range can be used, of course.
+DYNAMIC_POP_PER_REQUIREMENT 6
+
+## 1 -> 9, probability for this rule to be picked against other rules.
+## Note that requirements must also be met, and some requirements are impossible to meet.
+DYNAMIC_WEIGHT TRAITOR 5
+DYNAMIC_WEIGHT TRAITORBRO 4
+DYNAMIC_WEIGHT CHANGELING 3
+DYNAMIC_WEIGHT WIZARD 1
+DYNAMIC_WEIGHT CULT 3
+DYNAMIC_WEIGHT NUCLEAR 3
+DYNAMIC_WEIGHT REVOLUTION 2
+# All below are impossible-by-default
+DYNAMIC_WEIGHT EXTENDED 3
+DYNAMIC_WEIGHT CLOCKWORK_CULT 3
+DYNAMIC_WEIGHT CLOWNOPS 3
+DYNAMIC_WEIGHT DEVIL 3
+DYNAMIC_WEIGHT MONKEY 3
+DYNAMIC_WEIGHT METEOR 3
+
+## Midround antags
+DYNAMIC_WEIGHT MIDROUND_TRAITOR 7
+DYNAMIC_WEIGHT MALF_AI 3
+DYNAMIC_WEIGHT MIDROUND_WIZARD 1
+DYNAMIC_WEIGHT MIDROUND_NUCLEAR 5
+DYNAMIC_WEIGHT BLOB 4
+DYNAMIC_WEIGHT XENOS 3
+DYNAMIC_WEIGHT NIGHTMARE 3
+
+## Latejoin antags
+DYNAMIC_WEIGHT LATEJOIN_TRAITOR 7
+DYNAMIC_WEIGHT LATEJOIN_REVOLUTION 2
+
+## Threat cost. This is decreased from the mode's threat when the rule is executed.
+DYNAMIC_COST TRAITOR 10
+DYNAMIC_COST TRAITORBRO 10
+DYNAMIC_COST CHANGELING 30
+DYNAMIC_COST WIZARD 30
+DYNAMIC_COST CULT 30
+DYNAMIC_COST NUCLEAR 40
+DYNAMIC_COST REVOLUTION 35
+# All below are impossible-by-default
+DYNAMIC_COST EXTENDED 0
+DYNAMIC_COST CLOCKWORK_CULT 0
+DYNAMIC_COST CLOWNOPS 40
+DYNAMIC_COST DEVIL 0
+DYNAMIC_COST MONKEY 0
+DYNAMIC_COST METEOR 0
+
+## Midround antags
+DYNAMIC_COST MIDROUND_TRAITOR 10
+DYNAMIC_COST MALF_AI 35
+DYNAMIC_COST MIDROUND_WIZARD 20
+DYNAMIC_COST MIDROUND_NUCLEAR 35
+DYNAMIC_COST BLOB 10
+DYNAMIC_COST XENOS 10
+DYNAMIC_COST NIGHTMARE 10
+
+## Latejoin antags
+DYNAMIC_COST LATEJOIN_TRAITOR 5
+DYNAMIC_COST LATEJOIN_REVOLUTION 20
+
+## Rule will not be generated with threat levels below requirement at a pop value. Pop values are determined by dynamic's pop-per-requirement.
+## By default it's 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+.
+## This means that 40 30 30 20 20 20 15 15 15 10 will not generate below 40 at 0-5, 30 at 6-11 etc.
+DYNAMIC_REQUIREMENTS TRAITOR 10 10 10 10 10 10 10 10 10 10
+DYNAMIC_REQUIREMENTS TRAITORBRO 40 30 30 20 20 15 15 15 10 10
+DYNAMIC_REQUIREMENTS CHANGELING 80 70 60 50 40 20 20 10 10 10
+DYNAMIC_REQUIREMENTS WIZARD 90 90 70 40 30 20 10 10 10 10
+DYNAMIC_REQUIREMENTS CULT 100 90 80 60 40 30 10 10 10 10
+DYNAMIC_REQUIREMENTS NUCLEAR 90 90 90 80 60 40 30 20 10 10
+DYNAMIC_REQUIREMENTS REVOLUTION 101 101 70 40 30 20 10 10 10 10
+# All below are impossible-by-default
+DYNAMIC_REQUIREMENTS EXTENDED 101 101 101 101 101 101 101 101 101 101
+DYNAMIC_REQUIREMENTS CLOCKWORK_CULT 101 101 101 101 101 101 101 101 101 101
+DYNAMIC_REQUIREMENTS CLOWNOPS 101 101 101 101 101 101 101 101 101 101
+DYNAMIC_REQUIREMENTS DEVIL 101 101 101 101 101 101 101 101 101 101
+DYNAMIC_REQUIREMENTS MONKEY 101 101 101 101 101 101 101 101 101 101
+DYNAMIC_REQUIREMENTS METEOR 101 101 101 101 101 101 101 101 101 101
+
+## Midround antags
+DYNAMIC_REQUIREMENTS MIDROUND_TRAITOR 50 40 30 20 10 10 10 10 10 10
+DYNAMIC_REQUIREMENTS MALF_AI 101 101 80 70 60 60 50 50 40 40
+DYNAMIC_REQUIREMENTS MIDROUND_WIZARD 90 90 70 40 30 20 10 10 10 10
+DYNAMIC_REQUIREMENTS MIDROUND_NUCLEAR 90 90 90 80 60 40 30 20 10 10
+DYNAMIC_REQUIREMENTS BLOB 101 101 101 80 60 50 30 20 10 10
+DYNAMIC_REQUIREMENTS XENOS 101 101 101 70 50 40 20 15 10 10
+DYNAMIC_REQUIREMENTS NIGHTMARE 101 101 101 70 50 40 20 15 10 10
+
+## Latejoin antags
+DYNAMIC_REQUIREMENTS LATEJOIN_TRAITOR 40 30 20 10 10 10 10 10 10 10
+DYNAMIC_REQUIREMENTS LATEJOIN_REVOLUTION 101 101 70 40 30 20 20 20 20 20
+
+## An alternative, static requirement used instead when pop is over mode's high_pop_limit.
+DYNAMIC_HIGH_POPULATION_REQUIREMENT TRAITOR 10
+DYNAMIC_HIGH_POPULATION_REQUIREMENT TRAITORBRO 15
+DYNAMIC_HIGH_POPULATION_REQUIREMENT CHANGELING 10
+DYNAMIC_HIGH_POPULATION_REQUIREMENT WIZARD 10
+DYNAMIC_HIGH_POPULATION_REQUIREMENT CULT 10
+DYNAMIC_HIGH_POPULATION_REQUIREMENT NUCLEAR 10
+DYNAMIC_HIGH_POPULATION_REQUIREMENT REVOLUTION 10
+# All below are impossible-by-default
+DYNAMIC_HIGH_POPULATION_REQUIREMENT EXTENDED 101
+DYNAMIC_HIGH_POPULATION_REQUIREMENT CLOCKWORK_CULT 101
+DYNAMIC_HIGH_POPULATION_REQUIREMENT CLOWNOPS 101
+DYNAMIC_HIGH_POPULATION_REQUIREMENT DEVIL 101
+DYNAMIC_HIGH_POPULATION_REQUIREMENT MONKEY 101
+DYNAMIC_HIGH_POPULATION_REQUIREMENT METEOR 101
+
+## Midround antags
+DYNAMIC_HIGH_POPULATION_REQUIREMENT MIDROUND_TRAITOR 10
+DYNAMIC_HIGH_POPULATION_REQUIREMENT MALF_AI 35
+DYNAMIC_HIGH_POPULATION_REQUIREMENT MIDROUND_WIZARD 50
+DYNAMIC_HIGH_POPULATION_REQUIREMENT MIDROUND_NUCLEAR 10
+DYNAMIC_HIGH_POPULATION_REQUIREMENT BLOB 50
+DYNAMIC_HIGH_POPULATION_REQUIREMENT XENOS 50
+DYNAMIC_HIGH_POPULATION_REQUIREMENT NIGHTMARE 50
+
+## Latejoin antags
+DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_TRAITOR 10
+DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_REVOLUTION 50
+
## AI ###
## Allow the AI job to be picked.
@@ -263,7 +398,14 @@ ALLOW_AI
## Allow the AI Multicamera feature to be used by AI players
ALLOW_AI_MULTICAM
+## CYBORG ##
+## Uncomment to disable the ability for cyborg flashes to knock down carbon targets
+#DISABLE_BORG_FLASH_KNOCKDOWN
+
## Secborg ###
+## Uncomment to bring secborgs and K-9s back in line with the rest of the modules available. This is strongly recommended if you have secborgs configured to be available at all times.
+#WEAKEN_SECBORG
+
## Uncomment to prevent the security cyborg module from being chosen
#DISABLE_SECBORG
diff --git a/config/maps.txt b/config/maps.txt
index 99a4543853..87e86a0800 100644
--- a/config/maps.txt
+++ b/config/maps.txt
@@ -10,6 +10,8 @@ Format:
maxplayers [number] (0 or less disables this requirement)
default (The last map with this defined will get all votes of players who have not explicitly voted for a map)
voteweight [number] (How much to count each player vote as, defaults to 1, setting to 0.5 counts each vote as half a vote, 2 as double, etc, Setting to 0 disables the map but allows players to still pick it)
+ max_round_search_span [number] (If this is nonzero, then if this map has been played more than a specified amount of times within this number of rounds, the map won't show up in votes. Max for this value determined by a define in persistence.dm)
+ max_rounds_played [number] (This determines how many times a map can be played within the above number of rounds before it's forbidden from votes.)
disabled (disables the map)
endmap
diff --git a/config/spaceRuinBlacklist.txt b/config/spaceRuinBlacklist.txt
index deafa47969..4ea7611937 100644
--- a/config/spaceRuinBlacklist.txt
+++ b/config/spaceRuinBlacklist.txt
@@ -27,6 +27,7 @@
#_maps/RandomRuins/SpaceRuins/emptyshell.dmm
#_maps/RandomRuins/SpaceRuins/gasthelizards.dmm
#_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm
+#_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm
#_maps/RandomRuins/SpaceRuins/intactemptyship.dmm
#_maps/RandomRuins/SpaceRuins/listeningstation.dmm
#_maps/RandomRuins/SpaceRuins/mechtransport.dmm
diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css
deleted file mode 100644
index 174aa8a22f..0000000000
--- a/goon/browserassets/css/browserOutput.css
+++ /dev/null
@@ -1,877 +0,0 @@
-/*****************************************
-*
-* GLOBAL STYLES
-*
-******************************************/
-html, body {
- padding: 0;
- margin: 0;
- height: 100%;
- color: #000000;
-}
-body {
- background: #E0E0E0; /*CIT CHANGE - darkens chatbox a lil*/
- 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: 80px;
- 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 { font-weight: bold;}
-.adminobserverooc {color: #0099cc; font-weight: bold;}
-.adminooc {color: #700038; font-weight: bold;}
-
-.adminobserver {color: #996600; font-weight: bold;}
-.admin {color: #386aff; 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;}
-.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;}
-.nicegreen {color: #14a833;}
-.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;}
-.spooky {color: #FF6100;}
-.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
-@keyframes velvet {
- 0% { color: #400020; }
- 40% { color: #FF0000; }
- 50% { color: #FF8888; }
- 60% { color: #FF0000; }
- 100% { color: #400020; }
-}
-
-.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;}
-@keyframes hypnocolor {
- 0% { color: #202020; }
- 25% { color: #4b02ac; }
- 50% { color: #9f41f1; }
- 75% { color: #541c9c; }
- 100% { color: #7adbf3; }
-}
-
-.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
-@keyframes phobia {
- 0% { color: #f75a5a; }
- 50% { color: #dd0000; }
- 100% { color: #f75a5a; }
-}
-
-.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;}/*****************************************
-*
-* GLOBAL STYLES
-*
-******************************************/
-html, body {
- padding: 0;
- margin: 0;
- height: 100%;
- color: #000000;
-}
-body {
- background: #E0E0E0; /*CIT CHANGE - darkens chatbox a lil*/
- 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: 80px;
- 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 { font-weight: bold;}
-.adminobserverooc {color: #0099cc; font-weight: bold;}
-.adminooc {color: #700038; font-weight: bold;}
-
-.adminsay {color: #FF4500; font-weight: bold;}
-.admin {color: #386aff; 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;}
-.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;}
-.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;}
-.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;}
-@keyframes hypnocolor {
- 0% { color: #202020; }
- 25% { color: #4b02ac; }
- 50% { color: #9f41f1; }
- 75% { color: #541c9c; }
- 100% { color: #7adbf3; }
-}
-
-.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
-@keyframes phobia {
- 0% { color: #f75a5a; }
- 50% { color: #dd0000; }
- 100% { color: #f75a5a; }
-}
-.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/html/changelogs/AutoChangeLog-pr-8654.yml b/html/changelogs/AutoChangeLog-pr-8654.yml
new file mode 100644
index 0000000000..336e55134d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8654.yml
@@ -0,0 +1,5 @@
+author: "Ghommie (Original PR by Dreamweaver)"
+delete-after: True
+changes:
+ - rscadd: "Nanotrasen has received word of a high-tech research facility that may contain advancements in bluespace-based research. Any crew members who become aware of its whereabouts are to report it to CentCom immediately and are restricted from sharing said info."
+ - refactor: "The turf reservation system now dynamically creates new z levels if the current reserved levels are full."
diff --git a/html/changelogs/AutoChangeLog-pr-9047.yml b/html/changelogs/AutoChangeLog-pr-9047.yml
new file mode 100644
index 0000000000..1f024b71e3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9047.yml
@@ -0,0 +1,7 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - rscadd: "Added RGB blood effects, know whose blood this is by color!"
+ - rscadd: "Added Synthetics blood, and a machine that produces it. A universal donor for medical to heal people with. Make it via medical protolathe!"
+ - bugfix: "With hearts, slimepeople shouldn't die from the effects of not having a heart."
+ - bugfix: "Plasma vessels from xenomorphs will restore blood if you're on resin."
diff --git a/html/changelogs/AutoChangeLog-pr-9350.yml b/html/changelogs/AutoChangeLog-pr-9350.yml
new file mode 100644
index 0000000000..fe91058892
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9350.yml
@@ -0,0 +1,5 @@
+author: "Tupinambis"
+delete-after: True
+changes:
+ - imageadd: "Beautified and stylized the cyborg HUD sprites, animated and cleaned up some of the old, modernized APC hacking and Doomsday sprites,"
+ - tweak: "moved cyborg language select above the radio icon, instead of above the picture icon."
diff --git a/html/changelogs/AutoChangeLog-pr-9423.yml b/html/changelogs/AutoChangeLog-pr-9423.yml
new file mode 100644
index 0000000000..6e8916c090
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9423.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - tweak: "Active NPC priority set much higher priority for the MC, with the intent on making NPC combat more interesting"
diff --git a/html/changelogs/AutoChangeLog-pr-9469.yml b/html/changelogs/AutoChangeLog-pr-9469.yml
new file mode 100644
index 0000000000..526f5f855a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9469.yml
@@ -0,0 +1,5 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - balance: "Vampires can now only ventcrawl in bat form if their blood level is below the bad blood volume (224 blood total)"
+ - balance: "Vampires now only take 5 burn per mob life cycle while within chapel areas, down from the original 20 burn per life cycle."
diff --git a/html/changelogs/AutoChangeLog-pr-9480.yml b/html/changelogs/AutoChangeLog-pr-9480.yml
new file mode 100644
index 0000000000..048ebdbce1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9480.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - bugfix: "Clarified access descriptions of some jobs"
diff --git a/html/changelogs/AutoChangeLog-pr-9494.yml b/html/changelogs/AutoChangeLog-pr-9494.yml
new file mode 100644
index 0000000000..6bfc34443b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9494.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixing some related onmob sprites issues with the above accessory."
diff --git a/html/changelogs/AutoChangeLog-pr-9500.yml b/html/changelogs/AutoChangeLog-pr-9500.yml
new file mode 100644
index 0000000000..02b45e2329
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9500.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Teleprods work on non-carbons mobs now."
diff --git a/html/changelogs/AutoChangeLog-pr-9501.yml b/html/changelogs/AutoChangeLog-pr-9501.yml
new file mode 100644
index 0000000000..a025db1874
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9501.yml
@@ -0,0 +1,12 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - tweak: "K9 pounces have received a minor rework. It now has an effective cooldown of 2.5 seconds, can now only deal up to 120 staminaloss, deals a maximum of 80 stamloss on hit, has a spoolup of half a second, and now has telegraphing in the form of a quiet noise."
+ - balance: "K9s now only have 80 health"
+ - balance: "Secborgs (but not k9s) now have a hybrid taser. This can be toggled via server config."
+ - tweak: "The disabler cooler upgrade now applies to all energy-based firearms for borgs"
+ - rscadd: "Dogborg jaws are now capable of incapacitating targets if using help intent. This deals a hard stun depending on how much staminaloss the target has, and whether or not they're resting. This behavior can be toggled via server config."
+ - balance: "K9 jaws now have 15 force, up from their nerfed 10 force."
+ - balance: "Borg flashes regained their ability to cause knockdown. This can be toggled via server config."
+ - server: "The WEAKEN_SECBORG config option will disable the new dogborg jaws mechanic and make secborgs spawn with a standard disabler."
+ - server: "The DISABLE_BORG_FLASH_KNOCKDOWN will disable the ability for borg flashes to knockdown."
diff --git a/html/changelogs/AutoChangeLog-pr-9513.yml b/html/changelogs/AutoChangeLog-pr-9513.yml
new file mode 100644
index 0000000000..ae4a8c246c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9513.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "Medibots no longer kill slimes when trying to heal their toxins."
diff --git a/html/changelogs/AutoChangeLog-pr-9531.yml b/html/changelogs/AutoChangeLog-pr-9531.yml
new file mode 100644
index 0000000000..907082a25e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9531.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "Increased stunbatons power cell depletion rate when left on by 50%."
diff --git a/html/changelogs/AutoChangeLog-pr-9533.yml b/html/changelogs/AutoChangeLog-pr-9533.yml
new file mode 100644
index 0000000000..cc62c6a025
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9533.yml
@@ -0,0 +1,4 @@
+author: "JTGSZ"
+delete-after: True
+changes:
+ - bugfix: "Can flip pipes once more."
diff --git a/html/changelogs/AutoChangeLog-pr-9535.yml b/html/changelogs/AutoChangeLog-pr-9535.yml
new file mode 100644
index 0000000000..fbebfe5a54
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9535.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Gorlex Marauders are pleased to announce non-slip grooves were given to their .50 sniper rifles, and thus shouldn't accidentally flop on the floor like pocket spaghettis whenever taken out of a bag anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-9539.yml b/html/changelogs/AutoChangeLog-pr-9539.yml
new file mode 100644
index 0000000000..c6e687d444
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9539.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "The Syndicate started selling claymores to their agents."
diff --git a/html/changelogs/AutoChangeLog-pr-9542.yml b/html/changelogs/AutoChangeLog-pr-9542.yml
new file mode 100644
index 0000000000..2ba9d14986
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9542.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "Costs of crates and paperwork"
+ - rscadd: "Adds 2 more crates hacked only"
diff --git a/html/changelogs/AutoChangeLog-pr-9548.yml b/html/changelogs/AutoChangeLog-pr-9548.yml
new file mode 100644
index 0000000000..f387875a4c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9548.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed custom say emotes conflict with drunk memes."
diff --git a/html/changelogs/AutoChangeLog-pr-9549.yml b/html/changelogs/AutoChangeLog-pr-9549.yml
new file mode 100644
index 0000000000..6958e8c390
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9549.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes identity transfer (envy knife, changeling transformation, making a vr avatar) not copying digitigrade legs."
diff --git a/html/changelogs/AutoChangeLog-pr-9550.yml b/html/changelogs/AutoChangeLog-pr-9550.yml
new file mode 100644
index 0000000000..8a50be40f6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9550.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes temporary transformation sting triggering heart attacks on heartless humans."
diff --git a/html/changelogs/AutoChangeLog-pr-9564.yml b/html/changelogs/AutoChangeLog-pr-9564.yml
new file mode 100644
index 0000000000..deb7601e82
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9564.yml
@@ -0,0 +1,6 @@
+author: "tinfoil hat wearer"
+delete-after: True
+changes:
+ - rscadd: "Added a new alien technology disk to scientist and roboticist uplinks that allows them to research the heavily-guarded secrets of the Grays."
+ - tweak: "Alientech is now the only Hidden alien research. To compensate for this, alien_bio and alien_engi have had their research costs doubled and now require advanced surgery tools and experimental tools respectively to research. Their export price is also halved."
+ - balance: "roboticists now have brainwashing disks AND alien technology added to their role-restricted uplink section. alien technology gives them brainwashing at a much later date, so brainwashing is the much cheaper option for instant power. makes logical sense because doctors get it as well because they do surgery, and roboticists can now either choose to brainwash people for less price but less power or emag borgs for higher prices, limited uses, but higher power."
diff --git a/html/changelogs/AutoChangeLog-pr-9568.yml b/html/changelogs/AutoChangeLog-pr-9568.yml
new file mode 100644
index 0000000000..c5e65f7adc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9568.yml
@@ -0,0 +1,4 @@
+author: "r4d6"
+delete-after: True
+changes:
+ - bugfix: "Batteries are now Rad-Proof like the other stock parts"
diff --git a/html/changelogs/AutoChangeLog-pr-9570.yml b/html/changelogs/AutoChangeLog-pr-9570.yml
new file mode 100644
index 0000000000..6cf825b835
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9570.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "peacekeeper cyborgs now get a megaphone"
diff --git a/html/changelogs/AutoChangeLog-pr-9572.yml b/html/changelogs/AutoChangeLog-pr-9572.yml
new file mode 100644
index 0000000000..767a78c3bc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9572.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - bugfix: "Fixes storage bugs regarding reaching into things you shouldn't be able to reach into."
diff --git a/html/changelogs/AutoChangeLog-pr-9578.yml b/html/changelogs/AutoChangeLog-pr-9578.yml
new file mode 100644
index 0000000000..c63fb17074
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9578.yml
@@ -0,0 +1,6 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "There is now a 1% chance for the station's announcer to be the medibot voice instead of the classic TG announcer."
+ - rscadd: "The map config system has been expanded to allow mappers to specify the map type, announcer voice, ingame year, and how often a given map can be voted at roundend."
+ - bugfix: "The map vote system now takes into account map playercount limits properly."
diff --git a/html/changelogs/AutoChangeLog-pr-9579.yml b/html/changelogs/AutoChangeLog-pr-9579.yml
new file mode 100644
index 0000000000..df1a2c90bf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9579.yml
@@ -0,0 +1,8 @@
+author: "4dplanner, MMiracles"
+delete-after: True
+changes:
+ - tweak: "Wizard shapeshift now converts damage taken while transformed"
+ - bugfix: "transform spell transfers damage correctly instead of healing most of the time"
+ - bugfix: "0% simplemob health maps to 0 carbon health, 100% simplemob to 100% carbon"
+ - bugfix: "transforming to a form with brute resistance no longer heals you"
+ - bugfix: "transforming back to a species with brute resistance no longer heals you"
diff --git a/html/changelogs/AutoChangeLog-pr-9582.yml b/html/changelogs/AutoChangeLog-pr-9582.yml
new file mode 100644
index 0000000000..7fde7388cd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9582.yml
@@ -0,0 +1,5 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - rscadd: "Added configs for a bunch of Dynamic rule parameters."
+ - config: "Added defaults for all the configs (WIP)."
diff --git a/html/changelogs/AutoChangeLog-pr-9585.yml b/html/changelogs/AutoChangeLog-pr-9585.yml
new file mode 100644
index 0000000000..c74c0dec46
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9585.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed artificier lesser magic missile."
diff --git a/html/changelogs/AutoChangeLog-pr-9587.yml b/html/changelogs/AutoChangeLog-pr-9587.yml
new file mode 100644
index 0000000000..0eba144de5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9587.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Phantom thief masks will now fancy your combat mode yet again."
diff --git a/html/changelogs/AutoChangeLog-pr-9588.yml b/html/changelogs/AutoChangeLog-pr-9588.yml
new file mode 100644
index 0000000000..03f4ab8a57
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9588.yml
@@ -0,0 +1,5 @@
+author: "ItzGabby"
+delete-after: True
+changes:
+ - rscadd: "Bat Species parts for more leeway for character customization."
+ - code_imp: "Alphabetized decor wing selection window in character creator for simplicity."
diff --git a/html/changelogs/AutoChangeLog-pr-9589.yml b/html/changelogs/AutoChangeLog-pr-9589.yml
new file mode 100644
index 0000000000..5fbc819844
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9589.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PRs by ninjanomnom and nemvar)"
+delete-after: True
+changes:
+ - bugfix: "Trays now scatter their contents when used for attacks, like they are supposed to."
diff --git a/html/changelogs/AutoChangeLog-pr-9590.yml b/html/changelogs/AutoChangeLog-pr-9590.yml
new file mode 100644
index 0000000000..5410681ebb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9590.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (original PR by cacogen)"
+delete-after: True
+changes:
+ - rscadd: "The font size of all text in the chat window now scales"
+ - tweak: "High volume (megaphone/head of staff headset) is a slightly smaller"
+ - tweak: "Admins have slightly larger OOC text"
diff --git a/html/changelogs/AutoChangeLog-pr-9592.yml b/html/changelogs/AutoChangeLog-pr-9592.yml
new file mode 100644
index 0000000000..a311112434
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9592.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PRs by ninjanomnom, coiax, yoyobatty)"
+delete-after: True
+changes:
+ - bugfix: "Fixed slaughter demons not getting a speed boost when exiting a pool of blood. Fixed slaughter demon giblets not being visible."
diff --git a/html/changelogs/AutoChangeLog-pr-9593.yml b/html/changelogs/AutoChangeLog-pr-9593.yml
new file mode 100644
index 0000000000..a61fcea1e4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9593.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed gulag teleporter stripping the user of stuff it really shouldn't (like storage implant bags)."
diff --git a/html/changelogs/AutoChangeLog-pr-9594.yml b/html/changelogs/AutoChangeLog-pr-9594.yml
new file mode 100644
index 0000000000..83774989ee
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9594.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - tweak: "literally every pistol subtype fits in shoes now. go wild."
diff --git a/html/changelogs/AutoChangeLog-pr-9595.yml b/html/changelogs/AutoChangeLog-pr-9595.yml
new file mode 100644
index 0000000000..bc3eab54c8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9595.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Examining a spaceman, and other things that use get_examine_string(), will now actually properly show when an item is blood-stained."
diff --git a/html/changelogs/AutoChangeLog-pr-9598.yml b/html/changelogs/AutoChangeLog-pr-9598.yml
new file mode 100644
index 0000000000..76f1ceb578
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9598.yml
@@ -0,0 +1,6 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Plasmaman tongues no longer have a maxHealth of \"alien\", and no longer cause the organ's on_life to always runtime."
+ - bugfix: "Shooting a simplemob no longer causes runtimes prior to the blood effect being created."
+ - bugfix: "Removing a filter from an object that lacks filters no longer causes runtimes."
diff --git a/html/changelogs/AutoChangeLog-pr-9599.yml b/html/changelogs/AutoChangeLog-pr-9599.yml
new file mode 100644
index 0000000000..83063c12fc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9599.yml
@@ -0,0 +1,4 @@
+author: "Onule & Nemvar (ported by Ghommie)"
+delete-after: True
+changes:
+ - imageadd: "New Revenant icons"
diff --git a/html/changelogs/AutoChangeLog-pr-9600.yml b/html/changelogs/AutoChangeLog-pr-9600.yml
new file mode 100644
index 0000000000..e7c7c1da92
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9600.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Added two seed packets of cotten to ash walkers base"
diff --git a/html/changelogs/AutoChangeLog-pr-9603.yml b/html/changelogs/AutoChangeLog-pr-9603.yml
new file mode 100644
index 0000000000..32b9afb97e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9603.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixing cydonian armor a bit."
diff --git a/html/changelogs/AutoChangeLog-pr-9610.yml b/html/changelogs/AutoChangeLog-pr-9610.yml
new file mode 100644
index 0000000000..85739fcfcb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9610.yml
@@ -0,0 +1,7 @@
+author: "Ghommie (original PRs by XDTM, 4dplanner, nemvar and, yes, myself)"
+delete-after: True
+changes:
+ - code_imp: "Merged tinfoil hat kind of protection into the anti_magic component."
+ - rscadd: "Tinfoil hats can also be warped up from excessive dampening of mindray/though control/psicotronic anomalies, or by simply being microwaved in an oven, and become useless."
+ - rscadd: "Immortality Talisman and Paranormal Hardsuit helmets now come with tinfoil protection too (minus the paranoia and limited charges)."
+ - balance: "Genetics/Slime/Alien Telepathy and Slime Link are now stopped by tinfoil protection."
diff --git a/html/changelogs/AutoChangeLog-pr-9613.yml b/html/changelogs/AutoChangeLog-pr-9613.yml
new file mode 100644
index 0000000000..2056d9479c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9613.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - rscadd: "Target head and throw a hat at someone to toss it onto their head, knocking whatever they're wearing off if they are wearing a hat. Some headgear can't be knocked off this way."
diff --git a/html/changelogs/AutoChangeLog-pr-9615.yml b/html/changelogs/AutoChangeLog-pr-9615.yml
new file mode 100644
index 0000000000..4c6d95055c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9615.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "Resprited wooden and critter crates."
diff --git a/html/changelogs/AutoChangeLog-pr-9616.yml b/html/changelogs/AutoChangeLog-pr-9616.yml
new file mode 100644
index 0000000000..e9fb19e63b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9616.yml
@@ -0,0 +1,7 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - tweak: "Jukeboxes now have 6 audio channels available to them, up from the previous accidental 2 and previously intended 5 channels."
+ - bugfix: "Jukeboxes now work again on clients running versions higher than 512.1459."
+ - bugfix: "People will no longer have their ears consumed by an eldritch god if multiple jukeboxes are active and the first jukebox in the jukebox list stops playing, then tries to play again"
+ - tweak: "Instead of the debug text for invalid jukebox behavior being printed to world, the debug text is now restricted to the runtime panel."
diff --git a/html/changelogs/AutoChangeLog-pr-9617.yml b/html/changelogs/AutoChangeLog-pr-9617.yml
new file mode 100644
index 0000000000..9c8e3fbdf2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9617.yml
@@ -0,0 +1,4 @@
+author: "JTGSZ"
+delete-after: True
+changes:
+ - bugfix: "barricade girder walls use PlaceOnTop instead of new"
diff --git a/html/changelogs/AutoChangeLog-pr-9620.yml b/html/changelogs/AutoChangeLog-pr-9620.yml
new file mode 100644
index 0000000000..c6f5a460da
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9620.yml
@@ -0,0 +1,5 @@
+author: "YakumoChen"
+delete-after: True
+changes:
+ - rscadd: "Adds beanbag slugs to the sec protolathe at round start"
+ - bugfix: "Brings shotgun ammo availability back in like between seclathe and autolathe."
diff --git a/html/changelogs/AutoChangeLog-pr-9622.yml b/html/changelogs/AutoChangeLog-pr-9622.yml
new file mode 100644
index 0000000000..4a0fb38248
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9622.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "Improved the Cyber Sylph' good yet cumbersome bar sign a little."
diff --git a/html/changelogs/AutoChangeLog-pr-9623.yml b/html/changelogs/AutoChangeLog-pr-9623.yml
new file mode 100644
index 0000000000..4ad167ca48
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9623.yml
@@ -0,0 +1,5 @@
+author: "Sirich96 and Dennok (ported by Ghommie)"
+delete-after: True
+changes:
+ - rscadd: "Added new Teleporter Station sprites"
+ - rscadd: "Added teleport station calibration animation."
diff --git a/html/changelogs/AutoChangeLog-pr-9630.yml b/html/changelogs/AutoChangeLog-pr-9630.yml
new file mode 100644
index 0000000000..b9e583297c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9630.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Cyborgs can now use camera consoles on the edge of their widescreen. These consoles are also TK friendly now."
diff --git a/html/changelogs/AutoChangeLog-pr-9635.yml b/html/changelogs/AutoChangeLog-pr-9635.yml
new file mode 100644
index 0000000000..946a1ffe13
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9635.yml
@@ -0,0 +1,17 @@
+author: "Thalpy"
+delete-after: True
+changes:
+ - bugfix: "1. Kev asked that there were no antag datums used, so that's been changed.
+2. Tricks can no longer turn someone into a dullahan, instead you have to spend candies to get that. I felt it was too mean to turn people into that, I didn't realise you couldn't revert it.
+3. Barth will no longer as for impossible items.
+4. Barth will no longer as for the same item multiple times.
+5. Barth will now accept broader things, rather than asking for something, when meaning something specific.
+6. Jacq will now no longer poof off the z level.
+7. Jacq will (hopefully) stop spooking the AI by teleporting into there
+8. Jacq will now try to teleport to a location with someone nearby.
+9. Barth will tell you where Jacq is currently when you speak to him.
+10. You can trade 2 candies for a Jacq Tracq (tm)
+11. Jacq should stop getting mad and cover the station in gas when killed.
+12. Fixed Jacq not singing (the link died).
+13. Slightly changed wording so that people will hopefully get to know her.
+14. Jacq no longer disappears when you're getting to know her."
diff --git a/html/changelogs/AutoChangeLog-pr-9636.yml b/html/changelogs/AutoChangeLog-pr-9636.yml
new file mode 100644
index 0000000000..986ece65bb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9636.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "Updated gang dominator sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-9637.yml b/html/changelogs/AutoChangeLog-pr-9637.yml
new file mode 100644
index 0000000000..29832a5d4b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9637.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - code_imp: "BYOND 513 preliminary support added."
diff --git a/html/changelogs/AutoChangeLog-pr-9641.yml b/html/changelogs/AutoChangeLog-pr-9641.yml
new file mode 100644
index 0000000000..61a4521580
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9641.yml
@@ -0,0 +1,5 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "Trashbags now only allow accessing the first 3 items. 5 for bluespace ones.
+experimental: Storage now allows for limiting of random access"
diff --git a/html/changelogs/AutoChangeLog-pr-9644.yml b/html/changelogs/AutoChangeLog-pr-9644.yml
new file mode 100644
index 0000000000..383305ef29
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9644.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Miner borgs can again have installed PKA mods."
diff --git a/html/changelogs/AutoChangeLog-pr-9645.yml b/html/changelogs/AutoChangeLog-pr-9645.yml
new file mode 100644
index 0000000000..a7a10e7a58
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9645.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed invisible blackberry n strawberry chocolate cake slices."
diff --git a/html/changelogs/AutoChangeLog-pr-9646.yml b/html/changelogs/AutoChangeLog-pr-9646.yml
new file mode 100644
index 0000000000..379b78aef0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9646.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Nuke ops / adminbus combat mechs will no longer spawn with tracking beacons."
diff --git a/html/changelogs/AutoChangeLog-pr-9647.yml b/html/changelogs/AutoChangeLog-pr-9647.yml
new file mode 100644
index 0000000000..e8fa254472
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9647.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "Arcade machine directional sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-9648.yml b/html/changelogs/AutoChangeLog-pr-9648.yml
new file mode 100644
index 0000000000..196a27198c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9648.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - tweak: "lowered the arcade's random plush / other prizes ratio from 1 : 2.5 circa to 1 : 5. Dehydratated carps and the awakened plush can not be achieved this way anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-9649.yml b/html/changelogs/AutoChangeLog-pr-9649.yml
new file mode 100644
index 0000000000..23bcf3e005
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9649.yml
@@ -0,0 +1,4 @@
+author: "Fermis"
+delete-after: True
+changes:
+ - bugfix: "fixed Jacq's fondness for the AI"
diff --git a/html/changelogs/AutoChangeLog-pr-9651.yml b/html/changelogs/AutoChangeLog-pr-9651.yml
new file mode 100644
index 0000000000..92dac62b19
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9651.yml
@@ -0,0 +1,4 @@
+author: "Alonefromhell"
+delete-after: True
+changes:
+ - bugfix: "fixes tootip offset"
diff --git a/html/changelogs/AutoChangeLog-pr-9652.yml b/html/changelogs/AutoChangeLog-pr-9652.yml
new file mode 100644
index 0000000000..acbaa139f1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9652.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "Added armrests overlays to sofas and tweaked their sprites a little."
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index 6a1a35f326..5bc30f886c 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/effects/fluidtracks.dmi b/icons/effects/fluidtracks.dmi
new file mode 100644
index 0000000000..e2f0c97479
Binary files /dev/null and b/icons/effects/fluidtracks.dmi differ
diff --git a/icons/effects/footprints.dmi b/icons/effects/footprints.dmi
index a98344abe4..69207097c0 100644
Binary files a/icons/effects/footprints.dmi and b/icons/effects/footprints.dmi differ
diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi
index 7de8152118..bdf54e36e5 100644
Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 4e23c102ce..e6e0abe111 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/actions/actions_AI.dmi b/icons/mob/actions/actions_AI.dmi
index 2ddc7923cc..e3ff3aba93 100644
Binary files a/icons/mob/actions/actions_AI.dmi and b/icons/mob/actions/actions_AI.dmi differ
diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi
index 82303c5862..3697fe4ff5 100644
Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index e9343c7ed2..a46ad83640 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/augmentation/augments.dmi b/icons/mob/augmentation/augments.dmi
index 574a5ddc48..e311b6605d 100644
Binary files a/icons/mob/augmentation/augments.dmi and b/icons/mob/augmentation/augments.dmi differ
diff --git a/icons/mob/augmentation/augments_engineer.dmi b/icons/mob/augmentation/augments_engineer.dmi
index 7f2b2e8de9..8aac118b35 100644
Binary files a/icons/mob/augmentation/augments_engineer.dmi and b/icons/mob/augmentation/augments_engineer.dmi differ
diff --git a/icons/mob/augmentation/augments_mining.dmi b/icons/mob/augmentation/augments_mining.dmi
index 39df4823fd..61d8cc30e5 100644
Binary files a/icons/mob/augmentation/augments_mining.dmi and b/icons/mob/augmentation/augments_mining.dmi differ
diff --git a/icons/mob/augmentation/augments_security.dmi b/icons/mob/augmentation/augments_security.dmi
index 2679f7c9f8..e954c6e22a 100644
Binary files a/icons/mob/augmentation/augments_security.dmi and b/icons/mob/augmentation/augments_security.dmi differ
diff --git a/icons/mob/augmentation/surplus_augments.dmi b/icons/mob/augmentation/surplus_augments.dmi
index bc3e4bd73c..d2eb194c28 100644
Binary files a/icons/mob/augmentation/surplus_augments.dmi and b/icons/mob/augmentation/surplus_augments.dmi differ
diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi
index f29231c48d..b572338fc6 100644
Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ
diff --git a/icons/mob/dam_mob.dmi b/icons/mob/dam_mob.dmi
index fe92746b43..c34b57b434 100644
Binary files a/icons/mob/dam_mob.dmi and b/icons/mob/dam_mob.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 842562b007..3d8f26a82e 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index 6bd504674f..916686e63f 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 8b894fea6b..ab30929727 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi
index bbeddf9152..3750e28906 100644
Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
index d306e22892..2169b87580 100644
Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index 3e0c3424d3..f054d8f744 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 9beedfb417..4de67f41f8 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 08a5abde3c..8718106f0c 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi
index 7c64ace299..632443036e 100644
Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 38ac61f318..b0fb5984c3 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/1x2.dmi b/icons/obj/1x2.dmi
new file mode 100644
index 0000000000..ec3bcac2fa
Binary files /dev/null and b/icons/obj/1x2.dmi differ
diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi
index 2c4d401088..1fffa2e540 100644
Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ
diff --git a/icons/obj/bloodbank.dmi b/icons/obj/bloodbank.dmi
new file mode 100644
index 0000000000..4b4b2b6990
Binary files /dev/null and b/icons/obj/bloodbank.dmi differ
diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi
index 507801844c..a3b0d19df4 100644
Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 5b9e13ed52..89acf0645e 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index c8a007041b..6fb50da207 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index fb406fb65e..852638bc3d 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 1307f063a8..d22002935f 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index 3ab7f4b510..ca81686e94 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 92f7f50279..bbb813d7c9 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 032b0c27ad..db0e5a301a 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 75df4b5cc5..2ea48828d2 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 6a9c254397..519cf66464 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi
index 029d49e196..dfcb54b7b9 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 fa5728f3b4..63dc8b98fd 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 7caf346f91..3c625cbe40 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 6336669501..e41135b446 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/machines/dominator.dmi b/icons/obj/machines/dominator.dmi
index 42337dc1c8..3718fc4f83 100644
Binary files a/icons/obj/machines/dominator.dmi and b/icons/obj/machines/dominator.dmi differ
diff --git a/icons/obj/machines/teleporter.dmi b/icons/obj/machines/teleporter.dmi
index 1d3c97199b..08c014af8f 100644
Binary files a/icons/obj/machines/teleporter.dmi and b/icons/obj/machines/teleporter.dmi differ
diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi
index 1b8dacf36d..eb3ca4b2f7 100644
Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ
diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi
index dafe06a7f1..069fb1e08d 100644
Binary files a/icons/obj/sofa.dmi and b/icons/obj/sofa.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index fae8134791..68bf9bd2bd 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index cad28e12fe..dd8f7bed1d 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index bdfbae3d75..fcc28de7b9 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi
index 59bc7a8e7c..b474dc68ba 100644
Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index 01cb909d27..992b37cc3d 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/space.dmi b/icons/turf/space.dmi
index d32279e704..33e3fab9a4 100644
Binary files a/icons/turf/space.dmi and b/icons/turf/space.dmi differ
diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi
index 3290e3f92c..dd6c7f3a7c 100644
Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ
diff --git a/modular_citadel/code/controllers/subsystem/shuttle.dm b/modular_citadel/code/controllers/subsystem/shuttle.dm
index ce3f062bdd..567b23f202 100644
--- a/modular_citadel/code/controllers/subsystem/shuttle.dm
+++ b/modular_citadel/code/controllers/subsystem/shuttle.dm
@@ -1,7 +1,7 @@
/datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end after 2 hours have passed.
if((world.realtime - SSshuttle.realtimeofstart) > auto_call && EMERGENCY_IDLE_OR_RECALLED) //2 hours
SSshuttle.emergency.request(silent = TRUE)
- priority_announce("The shift has come to an end and the shuttle called. [seclevel2num(get_security_level()) == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, 'sound/ai/shuttlecalled.ogg', "Priority")
+ priority_announce("The shift has come to an end and the shuttle called. [seclevel2num(get_security_level()) == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, "shuttlecalled", "Priority")
log_game("Round time limit reached. Shuttle has been auto-called.")
message_admins("Round time limit reached. Shuttle called.")
emergencyNoRecall = TRUE
diff --git a/modular_citadel/code/datums/components/phantomthief.dm b/modular_citadel/code/datums/components/phantomthief.dm
deleted file mode 100644
index d34e16f6e9..0000000000
--- a/modular_citadel/code/datums/components/phantomthief.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-//This component applies a customizable drop_shadow filter to its wearer when they toggle combat mode on or off. This can stack.
-
-/datum/component/phantomthief
- dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
-
- var/filter_x
- var/filter_y
- var/filter_size
- var/filter_border
- var/filter_color
-
- var/datum/component/redirect/combattoggle_redir
-
-/datum/component/phantomthief/Initialize(_x = -2, _y = 0, _size = 0, _border = 0, _color = "#E62111")
- filter_x = _x
- filter_y = _y
- filter_size = _size
- filter_border = _border
- filter_color = _color
-
- RegisterSignal(parent, COMSIG_COMBAT_TOGGLED, .proc/handlefilterstuff)
- RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/OnEquipped)
- RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/OnDropped)
-
-/datum/component/phantomthief/proc/handlefilterstuff(mob/user, combatmodestate)
- if(istype(user))
- var/thefilter = filter(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, border = filter_border, color = filter_color)
- if(!combatmodestate)
- user.filters -= thefilter
- else
- user.filters += thefilter
-
-/datum/component/phantomthief/proc/stripdesiredfilter(mob/user)
- if(istype(user))
- var/thefilter = filter(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, border = filter_border, color = filter_color)
- user.filters -= thefilter
-
-/datum/component/phantomthief/proc/OnEquipped(mob/user, slot)
- if(!istype(user))
- return
- if(!combattoggle_redir)
- combattoggle_redir = user.AddComponent(/datum/component/redirect, list(COMSIG_COMBAT_TOGGLED = CALLBACK(src, .proc/handlefilterstuff)))
-
-/datum/component/phantomthief/proc/OnDropped(mob/user)
- if(!istype(user))
- return
- if(combattoggle_redir)
- QDEL_NULL(combattoggle_redir)
- stripdesiredfilter(user)
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 1b1886173b..4c01725120 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -198,7 +198,6 @@
var/enthrallGender //Use master or mistress
var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance.
- var/datum/weakref/redirect_component //resistance
var/distancelist = list(2,1.5,1,0.8,0.6,0.5,0.4,0.3,0.2) //Distance multipliers
@@ -228,7 +227,7 @@
master = get_mob_by_key(enthrallID)
//if(M.ckey == enthrallID)
// owner.remove_status_effect(src)//At the moment, a user can enthrall themselves, toggle this back in if that should be removed.
- redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed#
+ RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist) //Do resistance calc if resist is pressed#
RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear)
mental_capacity = 500 - M.getOrganLoss(ORGAN_SLOT_BRAIN)//It's their brain!
var/mob/living/carbon/human/H = owner
@@ -500,7 +499,7 @@
cooldown += 1 //Cooldown doesn't process till status is done
else if(status == "charge")
- ADD_TRAIT(owner, TRAIT_GOTTAGOFAST, "MKUltra")
+ owner.add_movespeed_modifier(MOVESPEED_ID_MKULTRA, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
status = "charged"
if(master.client?.prefs.lewdchem)
to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!")
@@ -510,7 +509,7 @@
else if (status == "charged")
if (statusStrength < 0)
status = null
- REMOVE_TRAIT(owner, TRAIT_GOTTAGOFAST, "MKUltra")
+ owner.remove_movespeed_modifier(MOVESPEED_ID_MKULTRA)
owner.Knockdown(50)
to_chat(owner, "Your body gives out as the adrenaline in your system runs out.")
else
@@ -566,8 +565,7 @@
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2")
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4")
- qdel(redirect_component.resolve())
- redirect_component = null
+ UnregisterSignal(M, COMSIG_LIVING_RESIST)
UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra")
to_chat(owner, "You're now free of [master]'s influence, and fully independent!'")
diff --git a/modular_citadel/code/game/gamemodes/gangs/dominator.dm b/modular_citadel/code/game/gamemodes/gangs/dominator.dm
index 4946cad510..c590baf62e 100644
--- a/modular_citadel/code/game/gamemodes/gangs/dominator.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/dominator.dm
@@ -53,19 +53,17 @@
/obj/machinery/dominator/update_icon()
cut_overlays()
- if(!(stat & BROKEN))
- icon_state = "dominator-active"
- if(operating)
- var/mutable_appearance/dominator_overlay = mutable_appearance('icons/obj/machines/dominator.dmi', "dominator-overlay")
- if(gang)
- dominator_overlay.color = gang.color
- add_overlay(dominator_overlay)
- else
- icon_state = "dominator"
- if(obj_integrity/max_integrity < 0.66)
- add_overlay("damage")
- else
+ if(stat & BROKEN)
icon_state = "dominator-broken"
+ return
+ icon_state = "dominator"
+ if(operating)
+ var/mutable_appearance/dominator_overlay = mutable_appearance('icons/obj/machines/dominator.dmi', "dominator-overlay")
+ if(gang)
+ dominator_overlay.color = gang.color
+ add_overlay(dominator_overlay)
+ if(obj_integrity/max_integrity < 0.66)
+ add_overlay("damage")
/obj/machinery/dominator/examine(mob/user)
..()
@@ -168,7 +166,7 @@
examine(user)
return
- if(tempgang.domination_time != NOT_DOMINATING)
+ if(tempgang.domination_time != NOT_DOMINATING)
to_chat(user, "Error: Hostile Takeover is already in progress.")
return
diff --git a/modular_citadel/code/game/machinery/toylathe.dm b/modular_citadel/code/game/machinery/toylathe.dm
index 78b5fdea88..571cdfc82a 100644
--- a/modular_citadel/code/game/machinery/toylathe.dm
+++ b/modular_citadel/code/game/machinery/toylathe.dm
@@ -80,7 +80,7 @@
popup.open()
/obj/machinery/autoylathe/on_deconstruction()
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
materials.retrieve_all()
/obj/machinery/autoylathe/attackby(obj/item/O, mob/user, params)
@@ -166,7 +166,7 @@
var/plastic_cost = being_built.materials[MAT_PLASTIC]
var/power = max(2000, (metal_cost+glass_cost+plastic_cost)*multiplier/5)
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
if((materials.amount(MAT_METAL) >= metal_cost*multiplier*coeff) && (materials.amount(MAT_GLASS) >= glass_cost*multiplier*coeff) && (materials.amount(MAT_PLASTIC) >= plastic_cost*multiplier*coeff))
busy = TRUE
use_power(power)
@@ -190,7 +190,7 @@
return
/obj/machinery/autoylathe/proc/make_item(power, metal_cost, glass_cost, plastic_cost, multiplier, coeff, is_stack)
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/atom/A = drop_location()
use_power(power)
var/list/materials_used = list(MAT_METAL=metal_cost*coeff*multiplier, MAT_GLASS=glass_cost*coeff*multiplier, MAT_PLASTIC=plastic_cost*coeff*multiplier)
@@ -215,7 +215,7 @@
var/T = 0
for(var/obj/item/stock_parts/matter_bin/MB in component_parts)
T += MB.rating*75000
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
materials.max_amount = T
T=1.2
for(var/obj/item/stock_parts/manipulator/M in component_parts)
@@ -264,7 +264,7 @@
dat += "[D.name]"
if(ispath(D.build_path, /obj/item/stack))
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS] ?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY,D.materials[MAT_PLASTIC] ?round(materials.amount(MAT_PLASTIC)/D.materials[MAT_PLASTIC]):INFINITY)
if (max_multiplier>10 && !disabled)
dat += " x10"
@@ -296,7 +296,7 @@
dat += "[D.name]"
if(ispath(D.build_path, /obj/item/stack))
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS] ?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY,D.materials[MAT_PLASTIC] ?round(materials.amount(MAT_PLASTIC)/D.materials[MAT_PLASTIC]):INFINITY)
if (max_multiplier>10 && !disabled)
dat += " x10"
@@ -311,7 +311,7 @@
return dat
/obj/machinery/autoylathe/proc/materials_printout()
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/dat = "Total amount: [materials.total_amount] / [materials.max_amount] cm3
"
for(var/mat_id in materials.materials)
var/datum/material/M = materials.materials[mat_id]
@@ -324,7 +324,7 @@
var/coeff = (ispath(D.build_path, /obj/item/stack) ? 1 : prod_coeff)
- GET_COMPONENT(materials, /datum/component/material_container)
+ var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
if(D.materials[MAT_METAL] && (materials.amount(MAT_METAL) < (D.materials[MAT_METAL] * coeff * amount)))
return FALSE
if(D.materials[MAT_GLASS] && (materials.amount(MAT_GLASS) < (D.materials[MAT_GLASS] * coeff * amount)))
diff --git a/modular_citadel/code/game/objects/ids.dm b/modular_citadel/code/game/objects/ids.dm
deleted file mode 100644
index 8ef724581e..0000000000
--- a/modular_citadel/code/game/objects/ids.dm
+++ /dev/null
@@ -1,83 +0,0 @@
-
-//Polychromatic Knight Badge
-
-/obj/item/card/id/knight
- var/id_color = "#00FF00" //defaults to green
- name = "knight badge"
- icon = 'modular_citadel/icons/obj/id.dmi'
- icon_state = "knight"
- desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID"
-
-/obj/item/card/id/knight/update_label(newname, newjob)
- . = ..()
- if(newname || newjob)
- name = "[(!newname) ? "identification card" : "[newname]'s Knight Badge"][(!newjob) ? "" : " ([newjob])"]"
- return
-
- name = "[(!registered_name) ? "identification card" : "[registered_name]'s Knight Badge"][(!assignment) ? "" : " ([assignment])"]"
-
-/obj/item/card/id/knight/update_icon()
- var/mutable_appearance/id_overlay = mutable_appearance('modular_citadel/icons/obj/id.dmi', "knight_overlay")
-
- if(id_color)
- id_overlay.color = id_color
- cut_overlays()
-
- add_overlay(id_overlay)
-
-/obj/item/card/id/knight/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
- 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 id?", "Confirm Repaint", "Yes", "No") == "Yes")
- var/energy_color_input = input(usr,"","Choose Energy Color",id_color) as color|null
- if(energy_color_input)
- id_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
- update_icon()
-
-/obj/item/card/id/knight/Initialize()
- . = ..()
- update_icon()
-
-/obj/item/card/id/knight/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it.")
-
-//=================================================
-
-/obj/item/emagrecharge
- name = "electromagnet charging device"
- desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices, sadly this can't be recharged like a normal cell."
- icon = 'icons/obj/module.dmi'
- icon_state = "cell_mini"
- item_flags = NOBLUDGEON
- var/uses = 5 //Dictates how many charges the device adds to compatible items
-
-/obj/item/emagrecharge/examine(mob/user)
- . = ..()
- if(uses)
- to_chat(user, "It can add up to [uses] charges to compatible devices")
- else
- to_chat(user, "It has a small, red, blinking light coming from inside of it. It's spent.")
-
-/obj/item/card/emag
- var/uses = 15
-
-/obj/item/card/emag/examine(mob/user)
- . = ..()
- to_chat(user, "It has [uses ? uses : "no"] charges left.")
-
-/obj/item/card/emag/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/emagrecharge))
- var/obj/item/emagrecharge/ER = W
- if(ER.uses)
- uses += ER.uses
- to_chat(user, "You have added [ER.uses] charges to [src]. It now has [uses] charges.")
- playsound(src, "sparks", 100, 1)
- ER.uses = 0
- else
- to_chat(user, "[ER] has no charges left.")
- return
- . = ..()
diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
deleted file mode 100644
index e677c1f3ab..0000000000
--- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
+++ /dev/null
@@ -1,392 +0,0 @@
-/*/////////////////////////////////////////////////////////////////////////
-///////////// The TRUE Energy Sword ///////////////////////////
-*//////////////////////////////////////////////////////////////////////////
-
-/obj/item/melee/transforming/energy/sword/cx
- name = "non-eutactic blade"
- desc = "The Non-Eutactic Blade utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable."
- icon_state = "cxsword_hilt"
- icon = 'modular_citadel/icons/eutactic/item/noneutactic.dmi'
- item_state = "cxsword"
- lefthand_file = 'modular_citadel/icons/eutactic/mob/noneutactic_left.dmi'
- righthand_file = 'modular_citadel/icons/eutactic/mob/noneutactic_right.dmi'
- force = 3
- force_on = 21
- throwforce = 5
- throwforce_on = 20
- hitsound = "swing_hit" //it starts deactivated
- hitsound_on = 'sound/weapons/nebhit.ogg'
- attack_verb_off = list("tapped", "poked")
- throw_speed = 3
- throw_range = 5
- sharpness = IS_SHARP
- embedding = list("embedded_pain_multiplier" = 6, "embed_chance" = 20, "embedded_fall_chance" = 60)
- armour_penetration = 10
- block_chance = 35
- light_color = "#37FFF7"
- actions_types = list()
-
-/obj/item/melee/transforming/energy/sword/cx/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/melee/transforming/energy/sword/cx/altafterattack(atom/target, mob/living/carbon/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/melee/transforming/energy/sword/cx/transform_weapon(mob/living/user, supress_message_text)
- active = !active //I'd use a ..() here but it'd inherit from the regular esword's proc instead, so SPAGHETTI CODE
- if(active) //also I'd need to rip out the iconstate changing bits
- force = force_on
- throwforce = throwforce_on
- hitsound = hitsound_on
- throw_speed = 4
- if(attack_verb_on.len)
- attack_verb = attack_verb_on
- w_class = w_class_on
- START_PROCESSING(SSobj, src)
- set_light(brightness_on)
- update_icon()
- else
- force = initial(force)
- throwforce = initial(throwforce)
- hitsound = initial(hitsound)
- throw_speed = initial(throw_speed)
- if(attack_verb_off.len)
- attack_verb = attack_verb_off
- w_class = initial(w_class)
- STOP_PROCESSING(SSobj, src)
- set_light(0)
- update_icon()
- transform_messages(user, supress_message_text)
- add_fingerprint(user)
- return TRUE
-
-/obj/item/melee/transforming/energy/sword/cx/transform_messages(mob/living/user, supress_message_text)
- playsound(user, active ? 'sound/weapons/nebon.ogg' : 'sound/weapons/neboff.ogg', 65, 1)
- if(!supress_message_text)
- to_chat(user, "[src] [active ? "is now active":"can now be concealed"].")
-
-/obj/item/melee/transforming/energy/sword/cx/update_icon()
- var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/noneutactic.dmi', "cxsword_blade")
- var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/noneutactic.dmi', "cxsword_gem")
-
- if(light_color)
- blade_overlay.color = light_color
- gem_overlay.color = light_color
-
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(gem_overlay)
-
- if(active)
- add_overlay(blade_overlay)
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
-
-/obj/item/melee/transforming/energy/sword/cx/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
- 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)
- update_icon()
- update_light()
-
-/obj/item/melee/transforming/energy/sword/cx/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it.")
-
-/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file)
- . = ..()
- if(active)
- if(isinhands)
- var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "cxsword_blade")
- blade_inhand.color = light_color
- . += blade_inhand
-//Broken version. Not a toy, but not as strong.
-/obj/item/melee/transforming/energy/sword/cx/broken
- name = "misaligned non-eutactic blade"
- desc = "The Non-Eutactic Blade utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable. This one seems to have a damaged handle and misaligned components, causing the blade to be unstable at best"
- force_on = 15 //As strong a survival knife/bone dagger
-
-/obj/item/melee/transforming/energy/sword/cx/attackby(obj/item/W, mob/living/user, params)
- if(istype(W, /obj/item/melee/transforming/energy/sword/cx))
- if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP))
- to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!")
- return
- else
- to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.")
- new /obj/item/twohanded/dualsaber/hypereutactic(user.drop_location())
- qdel(W)
- qdel(src)
- else
- return ..()
-
-//OBLIGATORY TOY MEMES /////////////////////////////////////
-
-/obj/item/toy/sword/cx
- name = "\improper DX Non-Euplastic LightSword"
- desc = "A deluxe toy replica of an energy sword. Realistic visuals and sounds! Ages 8 and up."
- icon = 'modular_citadel/icons/eutactic/item/noneutactic.dmi'
- icon_state = "cxsword_hilt"
- item_state = "cxsword"
- lefthand_file = 'modular_citadel/icons/eutactic/mob/noneutactic_left.dmi'
- righthand_file = 'modular_citadel/icons/eutactic/mob/noneutactic_right.dmi'
- active = FALSE
- w_class = WEIGHT_CLASS_SMALL
- attack_verb = list("poked", "jabbed", "hit")
- light_color = "#37FFF7"
- var/light_brightness = 3
- actions_types = list()
-
-/obj/item/toy/sword/cx/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/toy/sword/cx/altafterattack(atom/target, mob/living/carbon/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/toy/sword/cx/attack_self(mob/user)
- active = !( active )
-
- if (active)
- to_chat(user, "You activate the holographic blade with a press of a button.")
- playsound(user, 'sound/weapons/nebon.ogg', 50, 1)
- w_class = WEIGHT_CLASS_BULKY
- attack_verb = list("slashed", "stabbed", "ravaged")
- set_light(light_brightness)
- update_icon()
-
- else
- to_chat(user, "You deactivate the holographic blade with a press of a button.")
- playsound(user, 'sound/weapons/neboff.ogg', 50, 1)
- w_class = WEIGHT_CLASS_SMALL
- attack_verb = list("poked", "jabbed", "hit")
- set_light(0)
- update_icon()
-
- add_fingerprint(user)
-
-/obj/item/toy/sword/cx/update_icon()
- var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/noneutactic.dmi', "cxsword_blade")
- var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/noneutactic.dmi', "cxsword_gem")
-
- if(light_color)
- blade_overlay.color = light_color
- gem_overlay.color = light_color
-
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(gem_overlay)
-
- if(active)
- add_overlay(blade_overlay)
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
-
-/obj/item/toy/sword/cx/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
- 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)
- update_icon()
- update_light()
-
-/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file)
- . = ..()
- if(active)
- if(isinhands)
- var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "cxsword_blade")
- blade_inhand.color = light_color
- . += blade_inhand
-
-/obj/item/toy/sword/cx/attackby(obj/item/W, mob/living/user, params)
- if(istype(W, /obj/item/toy/sword/cx))
- if(HAS_TRAIT(W, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP))
- to_chat(user, "\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : W] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? W : src]!")
- return
- else
- to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.")
- new /obj/item/twohanded/dualsaber/hypereutactic/toy(user.loc)
- qdel(W)
- qdel(src)
- else
- return ..()
-
-/obj/item/toy/sword/cx/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it.")
-
-/////////////////////////////////////////////////////
-// HYPEREUTACTIC Blades /////////////////////////
-/////////////////////////////////////////////////////
-
-/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'
- righthand_file = 'modular_citadel/icons/eutactic/mob/hypereutactic_right.dmi'
- item_state = "hypereutactic"
- inhand_x_dimension = 64
- inhand_y_dimension = 64
- 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
- force_unwielded = 7
- force_wielded = 40
- wieldsound = 'sound/weapons/nebon.ogg'
- unwieldsound = 'sound/weapons/neboff.ogg'
- 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")
- spinnable = FALSE
- total_mass_on = 4
-
-/obj/item/twohanded/dualsaber/hypereutactic/chaplain
- name = "\improper divine lightblade"
- desc = "A giant blade of bright and holy light, said to cut down the wicked with ease."
- force = 5
- force_unwielded = 5
- force_wielded = 20
- block_chance = 50
- armour_penetration = 0
- var/chaplain_spawnable = TRUE
- obj_flags = UNIQUE_RENAME
-
-/obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE)
-
-/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect()
- return FALSE
-
-/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/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/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")
-
- if(light_color)
- blade_overlay.color = light_color
- gem_overlay.color = light_color
-
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(gem_overlay)
-
- if(wielded)
- add_overlay(blade_overlay)
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
-
- 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/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 || !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/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file)
- . = ..()
- if(isinhands)
- var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
- gem_inhand.color = light_color
- . += gem_inhand
- if(wielded)
- var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "hypereutactic_blade")
- blade_inhand.color = light_color
- . += blade_inhand
-
-/obj/item/twohanded/dualsaber/hypereutactic/examine(mob/user)
- ..()
- if(!hacked)
- to_chat(user, "Alt-click to recolor it.")
-
-/obj/item/twohanded/dualsaber/hypereutactic/rainbow_process()
- . = ..()
- update_icon()
- update_light()
-
-////////////////// TOY VERSION /////////////////////////////
-
-/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
- throwforce = 0
- throw_speed = 3
- throw_range = 5
- 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/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/dualsaber/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles
- return FALSE
-
-//////// Tatortot NEB /////////////// (same stats as regular esword)
-/obj/item/melee/transforming/energy/sword/cx/traitor
- name = "\improper Dragon's Tooth Sword"
- desc = "The Dragon's Tooth sword is a blackmarket modification of a Non-Eutactic Blade, \
- which utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable. \
- It appears to have a wooden grip and a shaved down guard."
- icon_state = "cxsword_hilt_traitor"
- force_on = 30
- armour_penetration = 50
- embedding = list("embedded_pain_multiplier" = 10, "embed_chance" = 75, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 10)
- block_chance = 50
- hitsound_on = 'sound/weapons/blade1.ogg'
- light_color = "#37F0FF"
-
-/obj/item/melee/transforming/energy/sword/cx/traitor/transform_messages(mob/living/user, supress_message_text)
- playsound(user, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, 1)
- if(!supress_message_text)
- to_chat(user, "[src] [active ? "is now active":"can now be concealed"].")
-
-//RAINBOW MEMES
-
-/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."
- hacked = TRUE
diff --git a/modular_citadel/code/game/objects/items/storage/firstaid.dm b/modular_citadel/code/game/objects/items/storage/firstaid.dm
index 125330a9b9..95c88ecc86 100755
--- a/modular_citadel/code/game/objects/items/storage/firstaid.dm
+++ b/modular_citadel/code/game/objects/items/storage/firstaid.dm
@@ -49,7 +49,7 @@
/obj/item/storage/hypospraykit/ComponentInitialize()
. = ..()
- GET_COMPONENT(STR, /datum/component/storage)
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 12
STR.can_hold = typecacheof(list(
/obj/item/hypospray/mkii,
@@ -151,7 +151,7 @@
/obj/item/storage/hypospraykit/cmo/ComponentInitialize()
. = ..()
- GET_COMPONENT(STR, /datum/component/storage)
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_items = 6
STR.can_hold = typecacheof(list(
/obj/item/hypospray/mkii,
diff --git a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
deleted file mode 100644
index ccbf9a42fe..0000000000
--- a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
+++ /dev/null
@@ -1,73 +0,0 @@
-/obj/effect/mob_spawn/human/lavaknight
- name = "odd cryogenics pod"
- desc = "A humming cryo pod. You can barely recognise a faint glow underneath the built up ice. The machine is attempting to wake up its occupant."
- mob_name = "a displaced knight from another dimension"
- icon = 'icons/obj/machines/sleeper.dmi'
- icon_state = "sleeper"
- roundstart = FALSE
- job_description = "Cydonian Knight"
- death = FALSE
- random = TRUE
- outfit = /datum/outfit/lavaknight
- mob_species = /datum/species/human
- flavour_text = "You are a knight who conveniently has some form of retrograde amnesia. \
- You cannot remember where you came from. However, a few things remain burnt into your mind, most prominently a vow to never harm another sapient being under any circumstances unless it is hellbent on ending your life. \
- Remember: hostile creatures and such are fair game for attacking, but under no circumstances are you to attack anything capable of thought and/or speech unless it has made it its life's calling to chase you to the ends of the earth."
- assignedrole = "Cydonian Knight"
-
-/obj/effect/mob_spawn/human/lavaknight/special(mob/living/new_spawn)
- if(ishuman(new_spawn))
- var/mob/living/carbon/human/H = new_spawn
- H.dna.features["mam_ears"] = "Cat, Big" //cat people
- H.dna.features["mcolor"] = H.hair_color
- H.update_body()
-
-/obj/effect/mob_spawn/human/lavaknight/Destroy()
- new/obj/structure/showcase/machinery/oldpod/used(drop_location())
- return ..()
-
-/datum/outfit/lavaknight
- name = "Cydonian Knight"
- uniform = /obj/item/clothing/under/assistantformal
- mask = /obj/item/clothing/mask/breath
- shoes = /obj/item/clothing/shoes/sneakers/black
- r_pocket = /obj/item/melee/transforming/energy/sword/cx
- suit = /obj/item/clothing/suit/space/hardsuit/lavaknight
- suit_store = /obj/item/tank/internals/oxygen
- id = /obj/item/card/id/knight
-
-/datum/outfit/lavaknight/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(visualsOnly)
- return
-
- var/obj/item/card/id/knight/W = H.wear_id
- W.assignment = "Knight"
- W.registered_name = H.real_name
- W.id_color = "#0000FF" //Regular knights get simple blue. Doesn't matter much because it's variable anyway
- W.update_label(H.real_name)
- W.update_icon()
-
-/datum/outfit/lavaknight/captain
- name ="Cydonian Knight Captain"
- l_pocket = /obj/item/twohanded/dualsaber/hypereutactic
-
-/datum/outfit/lavaknight/captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(visualsOnly)
- return
-
- var/obj/item/card/id/knight/W = H.wear_id
- W.assignment = "Knight Captain"
- W.registered_name = H.real_name
- W.id_color = "#FFD700" //Captains get gold, duh. Doesn't matter because it's variable anyway
- W.update_label(H.real_name)
- W.update_icon()
-
-
-/obj/effect/mob_spawn/human/lavaknight/captain
- name = "odd gilded cryogenics pod"
- desc = "A humming cryo pod that appears to be gilded. You can barely recognise a faint glow underneath the built up ice. The machine is attempting to wake up its occupant."
- flavour_text = "You are a knight who conveniently has some form of retrograde amnesia. \
- You cannot remember where you came from. However, a few things remain burnt into your mind, most prominently a vow to never harm another sapient being under any circumstances unless it is hellbent on ending your life. \
- Remember: hostile creatures and such are fair game for attacking, but under no circumstances are you to attack anything capable of thought and/or speech unless it has made it its life's calling to chase you to the ends of the earth. \
- You feel a natural instict to lead, and as such, you should strive to lead your comrades to safety, and hopefully home. You also feel a burning determination to uphold your vow, as well as your fellow comrade's."
- outfit = /datum/outfit/lavaknight/captain
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 7e7038cb31..6dff621271 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -452,3 +452,9 @@ datum/gear/darksabresheath
category = SLOT_HEAD
path = /obj/item/clothing/head/flight
ckeywhitelist = list("maxlynchy")
+
+/datum/gear/onionneck
+ name = "Onion Necklace"
+ category = SLOT_NECK
+ path = /obj/item/clothing/neck/necklace/onion
+ ckeywhitelist = list("cdrcross")
diff --git a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm b/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
index 1b13ba5dc8..5e488b9837 100644
--- a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
+++ b/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
@@ -6,30 +6,28 @@
icon_state = "s-ninja"
item_state = "s-ninja"
-/obj/item/clothing/glasses/phantomthief/Initialize()
+/obj/item/clothing/glasses/phantomthief/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/phantomthief)
+ AddComponent(/datum/component/wearertargeting/phantomthief)
/obj/item/clothing/glasses/phantomthief/syndicate
name = "suspicious plastic mask"
desc = "A cheap, bulky, Syndicate-branded plastic face mask. You have to break in to break out."
var/nextadrenalinepop
- var/datum/component/redirect/combattoggle_redir
-/obj/item/clothing/glasses/phantomthief/syndicate/examine(user)
+/obj/item/clothing/glasses/phantomthief/syndicate/examine(mob/user)
. = ..()
- if(combattoggle_redir)
+ if(user.get_item_by_slot(SLOT_GLASSES) == src)
if(world.time >= nextadrenalinepop)
to_chat(user, "The built-in adrenaline injector is ready for use.")
else
to_chat(user, "[DisplayTimeText(nextadrenalinepop - world.time)] left before the adrenaline injector can be used again.")
/obj/item/clothing/glasses/phantomthief/syndicate/proc/injectadrenaline(mob/user, combatmodestate)
- if(istype(user))
- if(combatmodestate && world.time >= nextadrenalinepop)
- nextadrenalinepop = world.time + 5 MINUTES
- user.reagents.add_reagent("syndicateadrenals", 5)
- user.playsound_local(user, 'modular_citadel/sound/misc/adrenalinject.ogg', 100, 0, pressure_affected = FALSE)
+ if(istype(user) && combatmodestate && world.time >= nextadrenalinepop)
+ nextadrenalinepop = world.time + 5 MINUTES
+ user.reagents.add_reagent("syndicateadrenals", 5)
+ user.playsound_local(user, 'modular_citadel/sound/misc/adrenalinject.ogg', 100, 0, pressure_affected = FALSE)
/obj/item/clothing/glasses/phantomthief/syndicate/equipped(mob/user, slot)
. = ..()
@@ -37,12 +35,10 @@
return
if(slot != SLOT_GLASSES)
return
- if(!combattoggle_redir)
- combattoggle_redir = user.AddComponent(/datum/component/redirect, list(COMSIG_COMBAT_TOGGLED = CALLBACK(src, .proc/injectadrenaline)))
+ RegisterSignal(user, COMSIG_COMBAT_TOGGLED, .proc/injectadrenaline)
/obj/item/clothing/glasses/phantomthief/syndicate/dropped(mob/user)
. = ..()
if(!istype(user))
return
- if(combattoggle_redir)
- QDEL_NULL(combattoggle_redir)
+ UnregisterSignal(user, COMSIG_COMBAT_TOGGLED)
diff --git a/modular_citadel/code/modules/clothing/spacesuits/cydonian_armor.dm b/modular_citadel/code/modules/clothing/spacesuits/cydonian_armor.dm
deleted file mode 100644
index 423bc536ac..0000000000
--- a/modular_citadel/code/modules/clothing/spacesuits/cydonian_armor.dm
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- CYDONIAN ARMOR THAT IS RGB AND STUFF WOOOOOOOOOO
-*/
-
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight
- name = "cydonian helmet"
- desc = "A helmet designed with both form and function in mind, it protects the user against physical trauma and hazardous conditions while also having polychromic light strips."
- icon = 'modular_citadel/icons/lavaknight/item/head.dmi'
- icon_state = "knight_cydonia"
- item_state = "knight_yellow"
- item_color = null
- alternate_worn_icon = 'modular_citadel/icons/lavaknight/mob/head.dmi'
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF | LAVA_PROOF
- heat_protection = HEAD
- armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
- brightness_on = 7
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator)
- var/energy_color = "#35FFF0"
- var/obj/item/clothing/suit/space/hardsuit/lavaknight/linkedsuit = null
- mutantrace_variation = NO_MUTANTRACE_VARIATION
-
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/New()
- ..()
- if(istype(loc, /obj/item/clothing/suit/space/hardsuit/lavaknight))
- linkedsuit = loc
-
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/attack_self(mob/user)
- on = !on
-
- if(on)
- set_light(brightness_on)
- else
- set_light(0)
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
-
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/update_icon()
- var/mutable_appearance/helm_overlay = mutable_appearance('modular_citadel/icons/lavaknight/item/head.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
-
- if(energy_color)
- helm_overlay.color = energy_color
-
- helm_overlay.plane = LIGHTING_PLANE + 1 //Magic number is used here because we have no ABOVE_LIGHTING_PLANE plane defined. Lighting plane is 15, HUD is 18
-
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(helm_overlay)
-
- emissivelights()
-
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/equipped(mob/user, slot)
- ..()
- if(slot == SLOT_HEAD)
- emissivelights()
-
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/dropped(mob/user)
- ..()
- emissivelightsoff()
-
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/proc/emissivelights(mob/user = usr)
- var/mutable_appearance/energy_overlay = mutable_appearance('modular_citadel/icons/lavaknight/mob/head.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
- energy_overlay.color = energy_color
- energy_overlay.plane = LIGHTING_PLANE + 1
- user.cut_overlay(energy_overlay) //honk
- user.add_overlay(energy_overlay) //honk
-
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/proc/emissivelightsoff(mob/user = usr)
- user.cut_overlay()
- linkedsuit.emissivelights() //HONK HONK HONK MAXIMUM SPAGHETTI
- user.regenerate_icons() //honk
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight
- icon = 'modular_citadel/icons/lavaknight/item/suit.dmi'
- icon_state = "knight_cydonia"
- name = "cydonian armor"
- desc = "A suit designed with both form and function in mind, it protects the user against physical trauma and hazardous conditions while also having polychromic light strips."
- item_state = "swat_suit"
- alternate_worn_icon = 'modular_citadel/icons/lavaknight/mob/suit.dmi'
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- resistance_flags = FIRE_PROOF | LAVA_PROOF
- armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/lavaknight
- heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- actions_types = list(/datum/action/item_action/toggle_helmet)
- var/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/linkedhelm
- tauric = TRUE //Citadel Add for tauric hardsuits
-
- var/energy_color = "#35FFF0"
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/New()
- ..()
- if(helmet)
- linkedhelm = helmet
- light_color = energy_color
- set_light(1)
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/Initialize()
- ..()
- update_icon()
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/update_icon()
- var/mutable_appearance/suit_overlay
-
- if(taurmode == SNEK_TAURIC)
- suit_overlay = mutable_appearance('modular_citadel/icons/mob/taur_naga.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
- else if(taurmode == PAW_TAURIC)
- suit_overlay = mutable_appearance('modular_citadel/icons/mob/taur_canine.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
- else
- suit_overlay = mutable_appearance('modular_citadel/icons/lavaknight/item/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
-
- if(energy_color)
- suit_overlay.color = energy_color
-
- suit_overlay.plane = LIGHTING_PLANE + 1 //Magic number is used here because we have no ABOVE_LIGHTING_PLANE plane defined. Lighting plane is 15.
-
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(suit_overlay)
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/equipped(mob/user, slot)
- ..()
- if(slot == SLOT_WEAR_SUIT)
- emissivelights()
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/dropped(mob/user)
- ..()
- emissivelightsoff()
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/proc/emissivelights(mob/user = usr)
- var/mutable_appearance/energy_overlay
- if(taurmode == SNEK_TAURIC)
- energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_naga.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
- else if(taurmode == PAW_TAURIC)
- energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_canine.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
- else
- energy_overlay = mutable_appearance('modular_citadel/icons/lavaknight/mob/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
-
- energy_overlay.color = energy_color
- energy_overlay.plane = LIGHTING_PLANE + 1
- user.cut_overlay(energy_overlay) //honk
- user.add_overlay(energy_overlay) //honk
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/proc/emissivelightsoff(mob/user = usr)
- user.cut_overlays()
- user.regenerate_icons() //honk
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/AltClick(mob/living/user)
- if(user.incapacitated() || !istype(user))
- to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
- return
- if(user.incapacitated() || !istype(user) || !in_range(src, user))
- return
-
- if(alert("Are you sure you want to recolor your armor stripes?", "Confirm Repaint", "Yes", "No") == "Yes")
- var/energy_color_input = input(usr,"","Choose Energy Color",energy_color) as color|null
- if(energy_color_input)
- energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
- user.update_inv_wear_suit()
- if(linkedhelm)
- linkedhelm.energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
- user.update_inv_head()
- linkedhelm.update_icon()
- update_icon()
- user.update_inv_wear_suit()
- light_color = energy_color
- emissivelights()
- update_light()
-
-/obj/item/clothing/suit/space/hardsuit/lavaknight/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to recolor it.")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index 32c73cc40a..11dbb4dc80 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -501,3 +501,11 @@
item_state = "flight-g"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
+
+/obj/item/clothing/neck/necklace/onion
+ name = "Onion Necklace"
+ desc = "A string of onions sequenced together to form a necklace."
+ icon = 'icons/obj/custom.dmi'
+ icon_state = "onion"
+ item_state = "onion"
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
diff --git a/modular_citadel/code/modules/events/blob.dm b/modular_citadel/code/modules/events/blob.dm
deleted file mode 100644
index e8e7106f5e..0000000000
--- a/modular_citadel/code/modules/events/blob.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/datum/round_event_control/blob
- earliest_start = 60 MINUTES
diff --git a/modular_citadel/code/modules/events/wizard/magicarp.dm b/modular_citadel/code/modules/events/wizard/magicarp.dm
deleted file mode 100644
index 10d269c698..0000000000
--- a/modular_citadel/code/modules/events/wizard/magicarp.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/mob/living/simple_animal/hostile/carp/ranged
- gold_core_spawnable = NO_SPAWN
diff --git a/modular_citadel/code/modules/jobs/dresscode_values.dm b/modular_citadel/code/modules/jobs/dresscode_values.dm
deleted file mode 100644
index 24cd5c5ac9..0000000000
--- a/modular_citadel/code/modules/jobs/dresscode_values.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-//This file controls whether or not a job complies with dresscodes.
-//If a job complies with dresscodes, loadout items will not be equipped instead of the job's outfit, instead placing the items into the player's backpack.
-
-/datum/job
- var/dresscodecompliant = TRUE
-
-/datum/job/assistant
- dresscodecompliant = FALSE
\ No newline at end of file
diff --git a/modular_citadel/code/modules/jobs/job_types/captain.dm b/modular_citadel/code/modules/jobs/job_types/captain.dm
deleted file mode 100644
index 7135e86507..0000000000
--- a/modular_citadel/code/modules/jobs/job_types/captain.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-/datum/job/captain
- minimal_player_age = 20
- exp_type = EXP_TYPE_COMMAND
-
-/datum/job/hop
- minimal_player_age = 20
- exp_type_department = EXP_TYPE_SERVICE
-
- access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
- ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
- ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
- ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER,
- 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)
- minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
- ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
- ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE,
- ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER,
- 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)
-
diff --git a/modular_citadel/code/modules/jobs/job_types/cargo_service.dm b/modular_citadel/code/modules/jobs/job_types/cargo_service.dm
deleted file mode 100644
index 965b554f3c..0000000000
--- a/modular_citadel/code/modules/jobs/job_types/cargo_service.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-/datum/job/bartender
- access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
- minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
-
-/datum/job/qm
- department_head = list("Captain")
- supervisors = "the captain"
- req_admin_notify = 1
- minimal_player_age = 10
- exp_requirements = 180
- exp_type_department = EXP_TYPE_SUPPLY
-
- access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS)
- minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS)
-
-/datum/outfit/job/quartermaster
- id = /obj/item/card/id/silver
- ears = /obj/item/radio/headset/heads/qm
- backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
-
-/datum/job/cargo_tech
- department_head = list("Quartermaster")
- supervisors = "the quartermaster"
-
- access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
-
-/datum/job/mining
- department_head = list("Quartermaster")
- supervisors = "the quartermaster"
-
- access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
\ No newline at end of file
diff --git a/modular_citadel/code/modules/jobs/job_types/engineering.dm b/modular_citadel/code/modules/jobs/job_types/engineering.dm
deleted file mode 100644
index 4d6aa4119d..0000000000
--- a/modular_citadel/code/modules/jobs/job_types/engineering.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/datum/job/chief_engineer
- minimal_player_age = 10
-
-/datum/job/engineer
- access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
- ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
- minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
- ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
-
-/datum/job/atmos
- access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
- ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
- minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ENGINE,
- ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
diff --git a/modular_citadel/code/modules/jobs/job_types/medical.dm b/modular_citadel/code/modules/jobs/job_types/medical.dm
deleted file mode 100644
index 15841ad9d5..0000000000
--- a/modular_citadel/code/modules/jobs/job_types/medical.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/datum/job/cmo
- minimal_player_age = 10
-
-/datum/outfit/job/doctor
- backpack_contents = list(/obj/item/storage/hypospraykit/regular)
-
-/datum/outfit/job/chemist
- backpack_contents = list(/obj/item/storage/hypospraykit/regular)
diff --git a/modular_citadel/code/modules/jobs/job_types/science.dm b/modular_citadel/code/modules/jobs/job_types/science.dm
deleted file mode 100644
index 94272d24a6..0000000000
--- a/modular_citadel/code/modules/jobs/job_types/science.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/datum/job/rd
- minimal_player_age = 10
diff --git a/modular_citadel/code/modules/jobs/job_types/security.dm b/modular_citadel/code/modules/jobs/job_types/security.dm
deleted file mode 100644
index de00f2d948..0000000000
--- a/modular_citadel/code/modules/jobs/job_types/security.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/datum/job/hos
- minimal_player_age = 10
-
-/datum/outfit/job/warden
- suit_store = /obj/item/gun/energy/pumpaction/defender
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 e0d592827e..e5d386b56b 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
@@ -1,12 +1,3 @@
-/mob/living/carbon/human/species/mammal
- race = /datum/species/mammal
-
-/mob/living/carbon/human/species/insect
- race = /datum/species/insect
-
-/mob/living/carbon/human/species/xeno
- race = /datum/species/xeno
-
/mob/living/proc/resist_embedded()
return
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
index ed33041d58..16bf776171 100644
--- a/modular_citadel/code/modules/mob/living/living.dm
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -13,7 +13,7 @@
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.
+ var/sprint_stamina_cost = 0.70 //stamina loss per tile while insufficient sprint buffer.
//---End
/mob/living/movement_delay(ignorewalk = 0)
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
deleted file mode 100644
index b1e112aac5..0000000000
--- a/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm
+++ /dev/null
@@ -1,633 +0,0 @@
-// 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/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
index de3f43f8ee..99ba9ad3e2 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -13,13 +13,23 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
w_class = 3
hitsound = 'sound/weapons/bite.ogg'
sharpness = IS_SHARP
+ var/stamtostunconversion = 0.1 //Total stamloss gets multiplied by this value for the help intent hard stun. Resting adds an additional 2x multiplier on top. Keep this low or so help me god.
+ var/stuncooldown = 4 SECONDS //How long it takes before you're able to attempt to stun a target again
+ var/nextstuntime
+
+/obj/item/dogborg/jaws/examine(mob/user)
+ . = ..()
+ if(!CONFIG_GET(flag/weaken_secborg))
+ to_chat(user, "Use help intent to attempt to non-lethally incapacitate the target by latching on with your maw. This is more effective against exhausted and resting targets.")
/obj/item/dogborg/jaws/big
name = "combat jaws"
desc = "The jaws of the law. Very sharp."
icon_state = "jaws"
- force = 10 //Lowered to match secborg. No reason it should be more than a secborg's baton.
+ force = 15 //Chomp chomp. Crew harm.
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
+ stamtostunconversion = 0.2 // 100*0.2*2=40. Stun's just long enough to slap on cuffs with click delay if the target is near hard stamcrit.
+ stuncooldown = 6 SECONDS
/obj/item/dogborg/jaws/small
@@ -31,11 +41,36 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
var/status = 0
/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
- ..()
- user.do_attack_animation(A, ATTACK_EFFECT_BITE)
+ if(!istype(user))
+ return
+ if(!CONFIG_GET(flag/weaken_secborg) && user.a_intent != INTENT_HARM && istype(A, /mob/living))
+ if(A == user.pulling)
+ to_chat(user, "You already have [A] in your jaws.")
+ return
+ if(nextstuntime >= world.time)
+ to_chat(user, "Your jaw servos are still recharging.")
+ return
+ nextstuntime = world.time + stuncooldown
+ var/mob/living/M = A
+ var/cachedstam = M.getStaminaLoss()
+ var/totalstuntime = cachedstam * stamtostunconversion * (M.lying ? 2 : 1)
+ if(!M.resting)
+ M.Knockdown(cachedstam*2) //BORK BORK. GET DOWN.
+ M.Stun(totalstuntime)
+ user.do_attack_animation(A, ATTACK_EFFECT_BITE)
+ user.start_pulling(M, TRUE) //Yip yip. Come with.
+ user.changeNext_move(CLICK_CD_MELEE)
+ M.visible_message("[user] clamps [user.p_their()] [src] onto [M] and latches on!", "[user] clamps [user.p_their()] [src] onto you and latches on!")
+ if(totalstuntime >= 4 SECONDS)
+ playsound(usr, 'sound/effects/k9_jaw_strong.ogg', 75, FALSE, 2) //Wuff wuff. Big stun.
+ else
+ playsound(usr, 'sound/effects/k9_jaw_weak.ogg', 50, TRUE, -1) //Arf arf. Pls buff.
+ else
+ . = ..()
+ user.do_attack_animation(A, ATTACK_EFFECT_BITE)
/obj/item/dogborg/jaws/small/attack_self(mob/user)
- var/mob/living/silicon/robot.R = user
+ var/mob/living/silicon/robot/R = user
if(R.cell && R.cell.charge > 100)
if(R.emagged && status == 0)
name = "combat jaws"
@@ -43,14 +78,18 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
desc = "The jaws of the law."
force = 12
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
+ stamtostunconversion = 0.15
+ stuncooldown = 5 SECONDS
status = 1
to_chat(user, "Your jaws are now [status ? "Combat" : "Pup'd"].")
else
name = "puppy jaws"
icon_state = "smalljaws"
desc = "The jaws of a small dog."
- force = 5
+ force = initial(force)
attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
+ stamtostunconversion = initial(stamtostunconversion)
+ stuncooldown = initial(stuncooldown)
status = 0
if(R.emagged)
to_chat(user, "Your jaws are now [status ? "Combat" : "Pup'd"].")
@@ -143,7 +182,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/storage/bag/borgdelivery/ComponentInitialize()
. = ..()
- GET_COMPONENT(STR, /datum/component/storage)
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_w_class = WEIGHT_CLASS_BULKY
STR.max_combined_w_class = 5
STR.max_items = 1
@@ -167,7 +206,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
item_flags |= NOBLUDGEON //No more attack messages
/obj/item/soap/tongue/attack_self(mob/user)
- var/mob/living/silicon/robot.R = user
+ var/mob/living/silicon/robot/R = user
if(R.cell && R.cell.charge > 100)
if(R.emagged && status == 0)
status = !status
@@ -187,7 +226,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
update_icon()
/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity)
- var/mob/living/silicon/robot.R = user
+ var/mob/living/silicon/robot/R = user
if(!proximity || !check_allowed_items(target))
return
if(R.client && (target in R.client.screen))
@@ -307,8 +346,10 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/mob/living/silicon/robot
var/leaping = 0
var/pounce_cooldown = 0
- var/pounce_cooldown_time = 20 //Buffed to counter balance changes
- var/pounce_spoolup = 1
+ var/pounce_cooldown_time = 30 //Time in deciseconds between pounces
+ var/pounce_spoolup = 5 //Time in deciseconds for the pounce to happen after clicking
+ var/pounce_stamloss_cap = 120 //How much staminaloss pounces alone are capable of bringing a spaceman to
+ var/pounce_stamloss = 80 //Base staminaloss value of the pounce
var/leap_at
var/disabler
var/laser
@@ -320,13 +361,12 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/dogborg/pounce/afterattack(atom/A, mob/user)
var/mob/living/silicon/robot/R = user
- if(R && !R.pounce_cooldown)
- R.pounce_cooldown = !R.pounce_cooldown
+ if(R && (world.time >= R.pounce_cooldown))
+ R.pounce_cooldown = world.time + R.pounce_cooldown_time
to_chat(R, "Your targeting systems lock on to [A]...")
+ playsound(R, 'sound/effects/servostep.ogg', 100, TRUE)
addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup)
- spawn(R.pounce_cooldown_time)
- R.pounce_cooldown = !R.pounce_cooldown
- else if(R && R.pounce_cooldown)
+ else if(R && (world.time < R.pounce_cooldown))
to_chat(R, "Your leg actuators are still recharging!")
/mob/living/silicon/robot/proc/leap_at(atom/A)
@@ -349,6 +389,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
update_icons()
throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1)
cell.use(750) //Less than a stunbaton since stunbatons hit everytime.
+ playsound(src, 'sound/effects/stealthoff.ogg', 25, TRUE, -1)
weather_immunities -= "lava"
/mob/living/silicon/robot/throw_impact(atom/A)
@@ -366,7 +407,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
blocked = 1
if(!blocked)
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
- L.Knockdown(iscarbon(L) ? 225 : 45) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
+ L.Knockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
index c063d8b9ef..feec79ee8b 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -53,6 +53,7 @@
has_snowflake_deadsprite = TRUE
dogborg = TRUE
cyborg_pixel_offset = -16
+ borghealth = 80
/obj/item/robot_module/k9/do_transform_animation()
..()
diff --git a/modular_citadel/code/modules/mob/living/simple_animal/kiwi.dm b/modular_citadel/code/modules/mob/living/simple_animal/kiwi.dm
deleted file mode 100644
index 27c1749011..0000000000
--- a/modular_citadel/code/modules/mob/living/simple_animal/kiwi.dm
+++ /dev/null
@@ -1,134 +0,0 @@
-/mob/living/simple_animal/kiwi
- name = "space kiwi"
- desc = "Exposure to low gravity made them grow larger."
- gender = FEMALE
- icon = 'modular_citadel/icons/mob/kiwi.dmi'
- icon_state = "kiwi"
- icon_living = "kiwi"
- icon_dead = "dead"
- speak = list("Chirp!","Cheep cheep chirp!!","Cheep.")
- speak_emote = list("chirps","trills")
- emote_hear = list("chirps.")
- emote_see = list("pecks at the ground.","jumps in place.")
- density = FALSE
- speak_chance = 2
- turns_per_move = 3
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 3)
- var/egg_type = /obj/item/reagent_containers/food/snacks/egg/kiwiEgg
- var/food_type = /obj/item/reagent_containers/food/snacks/grown/wheat
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
- attacktext = "kicks"
- health = 25
- maxHealth = 25
- ventcrawler = VENTCRAWLER_ALWAYS
- var/eggsleft = 0
- var/eggsFertile = TRUE
- pass_flags = PASSTABLE | PASSMOB
- mob_size = MOB_SIZE_SMALL
- var/list/feedMessages = list("It chirps happily.","It chirps happily.")
- var/list/layMessage = list("lays an egg.","squats down and croons.","begins making a huge racket.","begins chirping raucously.")
- gold_core_spawnable = FRIENDLY_SPAWN
- var/static/kiwi_count = 0
-
-/mob/living/simple_animal/kiwi/Destroy()
- --kiwi_count
- return ..()
-
-
-/mob/living/simple_animal/kiwi/Initialize()
- . = ..()
- ++kiwi_count
-
-
-/mob/living/simple_animal/kiwi/Life()
- . =..()
- if(!.)
- return
- if((!stat && prob(3) && eggsleft > 0) && egg_type)
- visible_message("[src] [pick(layMessage)]")
- eggsleft--
- var/obj/item/E = new egg_type(get_turf(src))
- E.pixel_x = rand(-6,6)
- E.pixel_y = rand(-6,6)
- if(eggsFertile)
- if(kiwi_count < MAX_CHICKENS && prob(25))
- START_PROCESSING(SSobj, E)
-
-/obj/item/reagent_containers/food/snacks/egg/kiwiEgg/process()
- if(isturf(loc))
- amount_grown += rand(1,2)
- if(amount_grown >= 100)
- visible_message("[src] hatches with a quiet cracking sound.")
- new /mob/living/simple_animal/babyKiwi(get_turf(src))
- STOP_PROCESSING(SSobj, src)
- qdel(src)
- else
- STOP_PROCESSING(SSobj, src)
-
-
-/mob/living/simple_animal/kiwi/attackby(obj/item/O, mob/user, params)
- if(istype(O, food_type)) //feedin' dem kiwis
- if(!stat && eggsleft < 8)
- var/feedmsg = "[user] feeds [O] to [name]! [pick(feedMessages)]"
- user.visible_message(feedmsg)
- qdel(O)
- eggsleft += rand(1, 4)
- else
- to_chat(user, "[name] doesn't seem hungry!")
- else
- ..()
-
-
-/mob/living/simple_animal/babyKiwi
- name = "baby space kiwi"
- desc = "So huggable."
- icon = 'modular_citadel/icons/mob/kiwi.dmi'
- icon_state = "babyKiwi"
- icon_living = "babyKiwi"
- icon_dead = "deadBaby"
- icon_gib = "chick_gib"
- gender = FEMALE
- speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
- speak_emote = list("chirps")
- emote_hear = list("chirps.")
- emote_see = list("pecks at the ground.","Happily bounces in place.")
- density = FALSE
- speak_chance = 2
- turns_per_move = 2
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2)
- response_help = "pets"
- response_disarm = "gently pushes aside"
- response_harm = "kicks"
- attacktext = "kicks"
- health = 10
- maxHealth = 10
- ventcrawler = VENTCRAWLER_ALWAYS
- var/amount_grown = 0
- pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
- mob_size = MOB_SIZE_TINY
- gold_core_spawnable = FRIENDLY_SPAWN
-
-/mob/living/simple_animal/babyKiwi/Initialize()
- . = ..()
- pixel_x = rand(-6, 6)
- pixel_y = rand(0, 10)
-
-/mob/living/simple_animal/babyKiwi/Life()
- . =..()
- if(!.)
- return
- if(!stat && !ckey)
- amount_grown += rand(1,2)
- if(amount_grown >= 100)
- new /mob/living/simple_animal/kiwi(src.loc)
- qdel(src)
-
-
-/obj/item/reagent_containers/food/snacks/egg/kiwiEgg
- name = "kiwi egg"
- icon = 'modular_citadel/icons/mob/kiwi.dmi'
- desc = "A slightly bigger egg!"
- icon_state = "egg"
-
diff --git a/modular_citadel/code/modules/mob/mob.dm b/modular_citadel/code/modules/mob/mob.dm
index bf6987ab81..aa0e6b5828 100644
--- a/modular_citadel/code/modules/mob/mob.dm
+++ b/modular_citadel/code/modules/mob/mob.dm
@@ -3,9 +3,11 @@
/mob/say_mod(input, message_mode)
var/customsayverb = findtext(input, "*")
- if(customsayverb)
+ if(customsayverb && message_mode != MODE_WHISPER_CRIT)
+ message_mode = MODE_CUSTOM_SAY
return lowertext(copytext(input, 1, customsayverb))
- . = ..()
+ else
+ return ..()
/atom/movable/proc/attach_spans(input, list/spans)
var/customsayverb = findtext(input, "*")
diff --git a/modular_citadel/code/modules/projectiles/bullets/bullets/smg.dm b/modular_citadel/code/modules/projectiles/bullets/bullets/smg.dm
index f069a73fe8..75151417d7 100644
--- a/modular_citadel/code/modules/projectiles/bullets/bullets/smg.dm
+++ b/modular_citadel/code/modules/projectiles/bullets/bullets/smg.dm
@@ -1,4 +1,4 @@
/obj/item/projectile/bullet/c46x30mm_tx
name = "toxin tipped 4.6x30mm bullet"
- damage = 15
+ damage = 10
damage_type = TOX
\ No newline at end of file
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
index 70d3bee5af..8ee00bef06 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon.dm
@@ -57,10 +57,9 @@
icon_state = "magjectile-nl"
damage = 2
knockdown = 0
- stamina = 25
- armour_penetration = -10
+ stamina = 20
light_range = 2
- speed = 0.7
+ speed = 0.6
range = 25
light_color = LIGHT_COLOR_BLUE
@@ -109,9 +108,10 @@
fire_sound = 'sound/weapons/magpistol.ogg'
mag_type = /obj/item/ammo_box/magazine/mmag/small
can_suppress = 0
- casing_ejector = 0
+ casing_ejector = FALSE
fire_delay = 2
- recoil = 0.2
+ recoil = 0.1
+ inaccuracy_modifier = 0.25
/obj/item/gun/ballistic/automatic/pistol/mag/update_icon()
..()
@@ -123,7 +123,6 @@
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
///research memes///
-/*
/obj/item/gun/ballistic/automatic/pistol/mag/nopin
pin = null
spawnwithmagazine = FALSE
@@ -155,7 +154,7 @@
materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
build_path = /obj/item/ammo_box/magazine/mmag/small
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-*/
+
//////toy memes/////
/obj/item/projectile/bullet/reusable/foam_dart/mag
@@ -201,9 +200,9 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "magjectile-large"
damage = 20
- armour_penetration = 25
+ armour_penetration = 20
light_range = 3
- speed = 0.7
+ speed = 0.6
range = 35
light_color = LIGHT_COLOR_RED
@@ -212,10 +211,10 @@
icon_state = "magjectile-large-nl"
damage = 2
knockdown = 0
- stamina = 25
- armour_penetration = -10
+ stamina = 20
+ armour_penetration = 10
light_range = 3
- speed = 0.65
+ speed = 0.6
range = 35
light_color = LIGHT_COLOR_BLUE
@@ -227,6 +226,8 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/magrifle
+ click_cooldown_override = 2.5
+ delay = 3
/obj/item/ammo_casing/caseless/anlmagm
desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
@@ -234,10 +235,12 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/nlmagrifle
+ click_cooldown_override = 2.5
+ delay = 3
///magazines///
-/obj/item/ammo_box/magazine/mmag/
+/obj/item/ammo_box/magazine/mmag
name = "magrifle magazine (non-lethal disabler)"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mediummagmag"
@@ -261,17 +264,20 @@
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "magrifle"
item_state = "arg"
- slot_flags = 0
+ slot_flags = NONE
mag_type = /obj/item/ammo_box/magazine/mmag
fire_sound = 'sound/weapons/magrifle.ogg'
can_suppress = 0
- burst_size = 3
- fire_delay = 2
- spread = 5
- recoil = 0.15
- casing_ejector = 0
+ burst_size = 1
+ actions_types = null
+ fire_delay = 3
+ spread = 0
+ recoil = 0.1
+ casing_ejector = FALSE
+ inaccuracy_modifier = 0.5
+ weapon_weight = WEAPON_MEDIUM
+ dualwield_spread_mult = 1.4
-/*
//research///
/obj/item/gun/ballistic/automatic/magrifle/nopin
@@ -305,7 +311,7 @@
materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
build_path = /obj/item/ammo_box/magazine/mmag
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-*/
+
///foamagrifle///
/obj/item/ammo_box/magazine/toy/foamag
@@ -327,7 +333,6 @@
spread = 60
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_HEAVY
-/*
// TECHWEBS IMPLEMENTATION
//
@@ -339,7 +344,6 @@
design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
-*/
//////Hyper-Burst Rifle//////
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 8786eb6dc9..7e6a8b3389 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
@@ -143,6 +143,7 @@
// TECHWEBS IMPLEMENTATION
*/
+/*
/datum/techweb_node/magnetic_weapons
id = "magnetic_weapons"
display_name = "Magnetic Weapons"
@@ -151,6 +152,7 @@
design_ids = list("magrifle_e", "magpistol_e", "mag_magrifle_e", "mag_magrifle_e_nl", "mag_magpistol_e", "mag_magpistol_e_nl")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
+*/
///magrifle///
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
index 0f7db73d6e..5fc75fa414 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -1,13 +1,6 @@
/obj/item/gun/energy/e_gun
name = "blaster carbine"
desc = "A high powered particle blaster carbine with varitable setting for stunning or lethal applications."
- icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi'
- lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi'
- righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi'
- ammo_x_offset = 2
- flight_x_offset = 17
- flight_y_offset = 11
-
/*/////////////////////////////////////////////////////////////////////////////////////////////
The Recolourable Energy Gun
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
index c82a3e9ed9..76d7403d16 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/laser.dm
@@ -1,19 +1,11 @@
/obj/item/gun/energy/laser
name = "blaster rifle"
desc = "a high energy particle blaster, efficient and deadly."
- icon = 'modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi'
- ammo_x_offset = 1
- shaded_charge = 1
- lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi'
- righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi'
/obj/item/gun/energy/laser/practice
+ icon = 'modular_citadel/icons/obj/guns/energy.dmi'
icon_state = "laser-p"
-
-/obj/item/gun/energy/laser/bluetag
- lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
-
-/obj/item/gun/energy/laser/redtag
- lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ lefthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_lefthand.dmi'
+ righthand_file = 'modular_citadel/icons/mob/inhands/OVERRIDE_guns_righthand.dmi'
+ ammo_x_offset = 1
+ shaded_charge = 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 4acfda0573..edb4bedfed 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -182,7 +182,7 @@
/datum/reagent/fermi/nanite_b_gone/on_mob_life(mob/living/carbon/C)
//var/component/nanites/N = M.GetComponent(/datum/component/nanites)
- GET_COMPONENT_FROM(N, /datum/component/nanites, C)
+ var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites)
if(isnull(N))
return ..()
N.nanite_volume = -purity//0.5 seems to be the default to me, so it'll neuter them.
@@ -190,7 +190,7 @@
/datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C)
//var/component/nanites/N = M.GetComponent(/datum/component/nanites)
- GET_COMPONENT_FROM(N, /datum/component/nanites, C)
+ var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites)
if(prob(5))
to_chat(C, "The residual voltage from the nanites causes you to seize up!")
C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 00063c22d4..c8ebde11d9 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1,11 +1,3 @@
-/datum/reagent/space_cleaner/reaction_obj(obj/O, reac_volume)
- if(istype(O, /obj/effect/decal/cleanable) || istype(O, /obj/item/projectile/bullet/reusable/foam_dart) || istype(O, /obj/item/ammo_casing/caseless/foam_dart))
- qdel(O)
- else
- if(O)
- O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
- SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
-
/datum/reagent/syndicateadrenals
name = "Syndicate Adrenaline"
id = "syndicateadrenals"
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index 47f71d1acf..7fcae0eb13 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -327,10 +327,10 @@
//So slimes can play too.
/datum/chemical_reaction/fermi/enthrall/slime
- required_catalysts = list("slimejelly" = 1)
+ required_catalysts = list("jellyblood" = 1)
/datum/chemical_reaction/fermi/enthrall/slime/FermiFinish(datum/reagents/holder, var/atom/my_atom)
- var/datum/reagent/toxin/slimejelly/B = locate(/datum/reagent/toxin/slimejelly) in my_atom.reagents.reagent_list//The one line change.
+ var/datum/reagent/blood/jellyblood/B = locate(/datum/reagent/blood/jellyblood) in my_atom.reagents.reagent_list//The one line change.
var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list
if(!B.data)
var/list/seen = viewers(5, get_turf(my_atom))
diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm
index 02f2db7c1e..6221bdde18 100644
--- a/modular_citadel/code/modules/reagents/objects/items.dm
+++ b/modular_citadel/code/modules/reagents/objects/items.dm
@@ -1,12 +1,12 @@
/obj/item/fermichem/pHbooklet
- name = "pH indicator booklet"
- desc = "A booklet containing paper soaked in universal indicator."
- icon_state = "pHbooklet"
- icon = 'modular_citadel/icons/obj/FermiChem.dmi'
- item_flags = NOBLUDGEON
- var/numberOfPages = 50
- resistance_flags = FLAMMABLE
- w_class = WEIGHT_CLASS_TINY
+ name = "pH indicator booklet"
+ desc = "A booklet containing paper soaked in universal indicator."
+ icon_state = "pHbooklet"
+ icon = 'icons/obj/chemical.dmi'
+ item_flags = NOBLUDGEON
+ var/numberOfPages = 50
+ resistance_flags = FLAMMABLE
+ w_class = WEIGHT_CLASS_TINY
//A little janky with pockets
/obj/item/fermichem/pHbooklet/attack_hand(mob/user)
@@ -29,7 +29,7 @@
to_chat(user, "[src] is empty!")
add_fingerprint(user)
return
- . = ..()
+ . = ..()
if(. & COMPONENT_NO_INTERACT)
return
var/I = user.get_active_held_item()
@@ -37,86 +37,86 @@
user.put_in_active_hand(src)
/obj/item/fermichem/pHbooklet/MouseDrop()
- var/mob/living/user = usr
- if(numberOfPages >= 1)
- var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper
- P.add_fingerprint(user)
- P.forceMove(user)
- user.put_in_active_hand(P)
- to_chat(user, "You take [P] out of \the [src].")
- numberOfPages--
- playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1)
- add_fingerprint(user)
- if(numberOfPages == 0)
- icon_state = "pHbookletEmpty"
- return
- else
- to_chat(user, "[src] is empty!")
- add_fingerprint(user)
- return
- ..()
+ var/mob/living/user = usr
+ if(numberOfPages >= 1)
+ var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper
+ P.add_fingerprint(user)
+ P.forceMove(user)
+ user.put_in_active_hand(P)
+ to_chat(user, "You take [P] out of \the [src].")
+ numberOfPages--
+ playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ add_fingerprint(user)
+ if(numberOfPages == 0)
+ icon_state = "pHbookletEmpty"
+ return
+ else
+ to_chat(user, "[src] is empty!")
+ add_fingerprint(user)
+ return
+ ..()
/obj/item/fermichem/pHpaper
- name = "pH indicator strip"
- desc = "A piece of paper that will change colour depending on the pH of a solution."
- icon_state = "pHpaper"
- icon = 'modular_citadel/icons/obj/FermiChem.dmi'
- item_flags = NOBLUDGEON
- color = "#f5c352"
- var/used = FALSE
- resistance_flags = FLAMMABLE
- w_class = WEIGHT_CLASS_TINY
+ name = "pH indicator strip"
+ desc = "A piece of paper that will change colour depending on the pH of a solution."
+ icon_state = "pHpaper"
+ icon = 'icons/obj/chemical.dmi'
+ item_flags = NOBLUDGEON
+ color = "#f5c352"
+ var/used = FALSE
+ resistance_flags = FLAMMABLE
+ w_class = WEIGHT_CLASS_TINY
/obj/item/fermichem/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity)
- if(!istype(cont))
- return
- if(used == TRUE)
- to_chat(user, "[user] has already been used!")
- return
- if(!LAZYLEN(cont.reagents.reagent_list))
- return
- switch(round(cont.reagents.pH, 1))
- if(14 to INFINITY)
- color = "#462c83"
- if(13 to 14)
- color = "#63459b"
- if(12 to 13)
- color = "#5a51a2"
- if(11 to 12)
- color = "#3853a4"
- if(10 to 11)
- color = "#3f93cf"
- if(9 to 10)
- color = "#0bb9b7"
- if(8 to 9)
- color = "#23b36e"
- if(7 to 8)
- color = "#3aa651"
- if(6 to 7)
- color = "#4cb849"
- if(5 to 6)
- color = "#b5d335"
- if(4 to 5)
- color = "#f7ec1e"
- if(3 to 4)
- color = "#fbc314"
- if(2 to 3)
- color = "#f26724"
- if(1 to 2)
- color = "#ef1d26"
- if(-INFINITY to 1)
- color = "#c6040c"
- desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]"
- used = TRUE
+ if(!istype(cont))
+ return
+ if(used == TRUE)
+ to_chat(user, "[user] has already been used!")
+ return
+ if(!LAZYLEN(cont.reagents.reagent_list))
+ return
+ switch(round(cont.reagents.pH, 1))
+ if(14 to INFINITY)
+ color = "#462c83"
+ if(13 to 14)
+ color = "#63459b"
+ if(12 to 13)
+ color = "#5a51a2"
+ if(11 to 12)
+ color = "#3853a4"
+ if(10 to 11)
+ color = "#3f93cf"
+ if(9 to 10)
+ color = "#0bb9b7"
+ if(8 to 9)
+ color = "#23b36e"
+ if(7 to 8)
+ color = "#3aa651"
+ if(6 to 7)
+ color = "#4cb849"
+ if(5 to 6)
+ color = "#b5d335"
+ if(4 to 5)
+ color = "#f7ec1e"
+ if(3 to 4)
+ color = "#fbc314"
+ if(2 to 3)
+ color = "#f26724"
+ if(1 to 2)
+ color = "#ef1d26"
+ if(-INFINITY to 1)
+ color = "#c6040c"
+ desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]"
+ used = TRUE
/obj/item/fermichem/pHmeter
- name = "Chemistry Analyser"
- desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing."
- icon_state = "pHmeter"
- icon = 'modular_citadel/icons/obj/FermiChem.dmi'
- resistance_flags = FLAMMABLE
- w_class = WEIGHT_CLASS_TINY
- var/scanmode = 1
+ name = "Chemistry Analyser"
+ desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing."
+ icon_state = "pHmeter"
+ icon = 'icons/obj/chemical.dmi'
+ resistance_flags = FLAMMABLE
+ w_class = WEIGHT_CLASS_TINY
+ var/scanmode = 1
/obj/item/fermichem/pHmeter/attack_self(mob/user)
if(!scanmode)
@@ -127,21 +127,21 @@
scanmode = 0
/obj/item/fermichem/pHmeter/afterattack(atom/A, mob/user, proximity)
- . = ..()
- if(!istype(A, /obj/item/reagent_containers))
- return
- var/obj/item/reagent_containers/cont = A
- if(LAZYLEN(cont.reagents.reagent_list) == null)
- return
- var/out_message
- to_chat(user, "The chemistry meter beeps and displays:")
- out_message += "Total volume: [round(cont.volume, 0.01)] Total pH: [round(cont.reagents.pH, 0.1)]\n"
- if(cont.reagents.fermiIsReacting)
- out_message += "A reaction appears to be occuring currently.\n"
- out_message += "Chemicals found in the beaker:\n"
- for(var/datum/reagent/R in cont.reagents.reagent_list)
- out_message += "[R.volume]u of [R.name], Purity: [R.purity], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [R.pH].":".")]\n"
- if(scanmode)
- out_message += "Analysis: [R.description]\n"
- to_chat(user, "[out_message]")
- desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]."
+ . = ..()
+ if(!istype(A, /obj/item/reagent_containers))
+ return
+ var/obj/item/reagent_containers/cont = A
+ if(LAZYLEN(cont.reagents.reagent_list) == null)
+ return
+ var/out_message
+ to_chat(user, "The chemistry meter beeps and displays:")
+ out_message += "Total volume: [round(cont.volume, 0.01)] Total pH: [round(cont.reagents.pH, 0.1)]\n"
+ if(cont.reagents.fermiIsReacting)
+ out_message += "A reaction appears to be occuring currently.\n"
+ out_message += "Chemicals found in the beaker:\n"
+ for(var/datum/reagent/R in cont.reagents.reagent_list)
+ out_message += "[R.volume]u of [R.name], Purity: [R.purity], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [R.pH].":".")]\n"
+ if(scanmode)
+ out_message += "Analysis: [R.description]\n"
+ to_chat(user, "[out_message]")
+ desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]."
diff --git a/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm b/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm
deleted file mode 100644
index d40dba8a3f..0000000000
--- a/modular_citadel/code/modules/reagents/reagent container/cit_kegs.dm
+++ /dev/null
@@ -1,41 +0,0 @@
-/obj/structure/reagent_dispensers/keg
- name = "keg"
- desc = "A keg."
- icon = 'modular_citadel/icons/obj/objects.dmi'
- icon_state = "keg"
- reagent_id = "water"
-
-/obj/structure/reagent_dispensers/keg/mead
- name = "keg of mead"
- desc = "A keg of mead."
- icon_state = "orangekeg"
- reagent_id = "mead"
-
-/obj/structure/reagent_dispensers/keg/aphro
- name = "keg of aphrodisiac"
- desc = "A keg of aphrodisiac."
- icon_state = "pinkkeg"
- reagent_id = "aphro"
-
-/obj/structure/reagent_dispensers/keg/aphro/strong
- name = "keg of strong aphrodisiac"
- desc = "A keg of strong and addictive aphrodisiac."
- reagent_id = "aphro+"
-
-/obj/structure/reagent_dispensers/keg/milk
- name = "keg of milk"
- desc = "It's not quite what you were hoping for."
- icon_state = "whitekeg"
- reagent_id = "milk"
-
-/obj/structure/reagent_dispensers/keg/semen
- name = "keg of semen"
- desc = "Dear lord, where did this even come from?"
- icon_state = "whitekeg"
- reagent_id = "semen"
-
-/obj/structure/reagent_dispensers/keg/gargle
- name = "keg of pan galactic gargleblaster"
- desc = "A keg of... wow that's a long name."
- icon_state = "bluekeg"
- reagent_id = "gargleblaster"
\ No newline at end of file
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
deleted file mode 100755
index 4aa634a488..0000000000
--- a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
+++ /dev/null
@@ -1,299 +0,0 @@
-#define HYPO_SPRAY 0
-#define HYPO_INJECT 1
-
-#define WAIT_SPRAY 25
-#define WAIT_INJECT 25
-#define SELF_SPRAY 15
-#define SELF_INJECT 15
-
-#define DELUXE_WAIT_SPRAY 20
-#define DELUXE_WAIT_INJECT 20
-#define DELUXE_SELF_SPRAY 10
-#define DELUXE_SELF_INJECT 10
-
-#define COMBAT_WAIT_SPRAY 0
-#define COMBAT_WAIT_INJECT 0
-#define COMBAT_SELF_SPRAY 0
-#define COMBAT_SELF_INJECT 0
-
-//A vial-loaded hypospray. Cartridge-based!
-/obj/item/hypospray/mkii
- name = "hypospray mk.II"
- icon = 'modular_citadel/icons/obj/hypospraymkii.dmi'
- icon_state = "hypo2"
- desc = "A new development from DeForest Medical, this hypospray takes 30-unit vials as the drug supply for easy swapping."
- w_class = WEIGHT_CLASS_TINY
- var/list/allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small)
- var/mode = HYPO_INJECT
- var/obj/item/reagent_containers/glass/bottle/vial/vial
- var/start_vial = /obj/item/reagent_containers/glass/bottle/vial/small
- var/spawnwithvial = TRUE
- var/inject_wait = WAIT_INJECT
- var/spray_wait = WAIT_SPRAY
- var/spray_self = SELF_SPRAY
- var/inject_self = SELF_INJECT
- var/quickload = FALSE
- var/penetrates = FALSE
-
-/obj/item/hypospray/mkii/brute
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine
-
-/obj/item/hypospray/mkii/toxin
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin
-
-/obj/item/hypospray/mkii/oxygen
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin
-
-/obj/item/hypospray/mkii/burn
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane
-
-/obj/item/hypospray/mkii/tricord
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord
-
-/obj/item/hypospray/mkii/enlarge
- spawnwithvial = FALSE
-
-/obj/item/hypospray/mkii/CMO
- name = "hypospray mk.II deluxe"
- allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large)
- icon_state = "cmo2"
- desc = "The Deluxe Hypospray can take larger-size vials. It also acts faster and delivers more reagents per spray."
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO
- inject_wait = DELUXE_WAIT_INJECT
- spray_wait = DELUXE_WAIT_SPRAY
- spray_self = DELUXE_SELF_SPRAY
- inject_self = DELUXE_SELF_INJECT
-
-/obj/item/hypospray/mkii/CMO/combat
- name = "combat hypospray mk.II"
- desc = "A combat-ready deluxe hypospray that acts almost instantly. It can be tactically reloaded by using a vial on it."
- icon_state = "combat2"
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat
- inject_wait = COMBAT_WAIT_INJECT
- spray_wait = COMBAT_WAIT_SPRAY
- spray_self = COMBAT_SELF_SPRAY
- inject_self = COMBAT_SELF_INJECT
- quickload = TRUE
- penetrates = TRUE
-
-/obj/item/hypospray/mkii/Initialize()
- . = ..()
- if(!spawnwithvial)
- update_icon()
- return
- if(start_vial)
- vial = new start_vial
- update_icon()
-
-/obj/item/hypospray/mkii/update_icon()
- ..()
- icon_state = "[initial(icon_state)][vial ? "" : "-e"]"
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
- return
-
-/obj/item/hypospray/mkii/examine(mob/user)
- . = ..()
- if(vial)
- to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.")
- else
- to_chat(user, "It has no vial loaded in.")
- to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.")
-
-/obj/item/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user)
- if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
- var/obj/item/reagent_containers/glass/bottle/vial/V = I
- V.forceMove(user.loc)
- user.put_in_hands(V)
- to_chat(user, "You remove [vial] from [src].")
- vial = null
- update_icon()
- playsound(loc, 'sound/weapons/empty.ogg', 50, 1)
- else
- to_chat(user, "This hypo isn't loaded!")
- return
-
-/obj/item/hypospray/mkii/attackby(obj/item/I, mob/living/user)
- if((istype(I, /obj/item/reagent_containers/glass/bottle/vial) && vial != null))
- if(!quickload)
- to_chat(user, "[src] can not hold more than one vial!")
- return FALSE
- unload_hypo(vial, user)
- if((istype(I, /obj/item/reagent_containers/glass/bottle/vial)))
- var/obj/item/reagent_containers/glass/bottle/vial/V = I
- if(!is_type_in_list(V, allowed_containers))
- to_chat(user, "[src] doesn't accept this type of vial.")
- return FALSE
- if(!user.transferItemToLoc(V,src))
- return FALSE
- vial = V
- user.visible_message("[user] has loaded a vial into [src].","You have loaded [vial] into [src].")
- update_icon()
- playsound(loc, 'sound/weapons/autoguninsert.ogg', 35, 1)
- return TRUE
- else
- to_chat(user, "This doesn't fit in [src].")
- return FALSE
- return FALSE
-
-/obj/item/hypospray/mkii/AltClick(mob/user)
- if(vial)
- vial.attack_self(user)
-
-// 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.
-
-/obj/item/hypospray/mkii/attack(obj/item/I, mob/user, params)
- return
-
-/obj/item/hypospray/mkii/afterattack(atom/target, mob/user, proximity)
- if(!vial)
- return
-
- if(!proximity)
- return
-
- if(!ismob(target))
- return
-
- var/mob/living/L
- if(isliving(target))
- L = target
- if(!penetrates && !L.can_inject(user, 1)) //This check appears another four times, since otherwise the penetrating sprays will break in do_mob.
- return
-
- if(!L && !target.is_injectable()) //only checks on non-living mobs, due to how can_inject() handles
- to_chat(user, "You cannot directly fill [target]!")
- return
-
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "[target] is full.")
- return
-
- if(ishuman(L))
- var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected))
- if(!affecting)
- to_chat(user, "The limb is missing!")
- return
- if(affecting.status != BODYPART_ORGANIC)
- to_chat(user, "Medicine won't work on a robotic limb!")
- return
-
- var/contained = vial.reagents.log_list()
- log_combat(user, L, "attemped to inject", src, addition="which had [contained]")
-//Always log attemped injections for admins
- if(vial != null)
- switch(mode)
- if(HYPO_INJECT)
- if(L) //living mob
- if(L != user)
- L.visible_message("[user] is trying to inject [L] with [src]!", \
- "[user] is trying to inject [L] with [src]!")
- if(!do_mob(user, L, inject_wait))
- return
- if(!penetrates && !L.can_inject(user, 1))
- return
- if(!vial.reagents.total_volume)
- return
- if(L.reagents.total_volume >= L.reagents.maximum_volume)
- return
- L.visible_message("[user] uses the [src] on [L]!", \
- "[user] uses the [src] on [L]!")
- else
- if(!do_mob(user, L, inject_self))
- return
- if(!penetrates && !L.can_inject(user, 1))
- return
- if(!vial.reagents.total_volume)
- return
- if(L.reagents.total_volume >= L.reagents.maximum_volume)
- return
- log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])")
- L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG)
-
- var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1)
- vial.reagents.reaction(L, INJECT, fraction)
- vial.reagents.trans_to(target, vial.amount_per_transfer_from_this)
- if(vial.amount_per_transfer_from_this >= 15)
- playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
- if(vial.amount_per_transfer_from_this < 15)
- playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
- to_chat(user, "You inject [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.")
-
- if(HYPO_SPRAY)
- if(L) //living mob
- if(L != user)
- L.visible_message("[user] is trying to spray [L] with [src]!", \
- "[user] is trying to spray [L] with [src]!")
- if(!do_mob(user, L, spray_wait))
- return
- if(!penetrates && !L.can_inject(user, 1))
- return
- if(!vial.reagents.total_volume)
- return
- if(L.reagents.total_volume >= L.reagents.maximum_volume)
- return
- L.visible_message("[user] uses the [src] on [L]!", \
- "[user] uses the [src] on [L]!")
- else
- if(!do_mob(user, L, spray_self))
- return
- if(!penetrates && !L.can_inject(user, 1))
- return
- if(!vial.reagents.total_volume)
- return
- if(L.reagents.total_volume >= L.reagents.maximum_volume)
- return
- log_attack("[user.name] ([user.ckey]) applied [src] to [L.name] ([L.ckey]), which had [contained] (INTENT: [uppertext(user.a_intent)]) (MODE: [src.mode])")
- L.log_message("applied [src] to themselves ([contained]).", INDIVIDUAL_ATTACK_LOG)
- var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1)
- vial.reagents.reaction(L, PATCH, fraction)
- vial.reagents.trans_to(target, vial.amount_per_transfer_from_this)
- if(vial.amount_per_transfer_from_this >= 15)
- playsound(loc,'sound/items/hypospray_long.ogg',50, 1, -1)
- if(vial.amount_per_transfer_from_this < 15)
- playsound(loc, pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1)
- to_chat(user, "You spray [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.")
- else
- to_chat(user, "[src] doesn't work here!")
- return
-
-/obj/item/hypospray/mkii/attack_self(mob/living/user)
- if(user)
- if(user.incapacitated())
- return
- else if(!vial)
- to_chat(user, "This Hypo needs to be loaded first!")
- return
- else
- unload_hypo(vial,user)
-
-/obj/item/hypospray/mkii/verb/modes()
- set name = "Toggle Application Mode"
- set category = "Object"
- set src in usr
- var/mob/M = usr
- switch(mode)
- if(HYPO_SPRAY)
- mode = HYPO_INJECT
- to_chat(M, "[src] is now set to inject contents on application.")
- if(HYPO_INJECT)
- mode = HYPO_SPRAY
- to_chat(M, "[src] is now set to spray contents on application.")
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index 0e823a658f..df3922dc09 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -2,7 +2,7 @@
/datum/reagent/consumable/semen
name = "Semen"
id = "semen"
- description = "Sperm from some animal. Useless for anything but insemination, really."
+ description = "Sperm from some animal. I bet you'll drink this out of a bucket someday."
taste_description = "something salty"
taste_mult = 2 //Not very overpowering flavor
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)
@@ -39,7 +39,9 @@
add_blood_DNA(list("Non-human DNA" = "A+"))
/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S)
- S.add_blood_DNA(return_blood_DNA())
+ if(S.blood_DNA)
+ blood_DNA |= S.blood_DNA.Copy()
+ ..()
/datum/reagent/consumable/femcum
name = "Female Ejaculate"
@@ -71,7 +73,8 @@
add_blood_DNA(list("Non-human DNA" = "A+"))
/obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F)
- F.add_blood_DNA(return_blood_DNA())
+ if(F.blood_DNA)
+ blood_DNA |= F.blood_DNA.Copy()
..()
/datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume)
diff --git a/modular_citadel/code/modules/research/designs/machine_designs.dm b/modular_citadel/code/modules/research/designs/machine_designs.dm
deleted file mode 100644
index 6a1331dddc..0000000000
--- a/modular_citadel/code/modules/research/designs/machine_designs.dm
+++ /dev/null
@@ -1,6 +0,0 @@
-/datum/design/board/autoylathe
- name = "Machine Design (Autoylathe)"
- desc = "The circuit board for an autoylathe."
- id = "autoylathe"
- build_path = /obj/item/circuitboard/machine/autoylathe
- category = list("Misc. Machinery")
diff --git a/modular_citadel/code/modules/research/designs/weapon_designs.dm b/modular_citadel/code/modules/research/designs/weapon_designs.dm
deleted file mode 100644
index b27cedbcc2..0000000000
--- a/modular_citadel/code/modules/research/designs/weapon_designs.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/datum/design/mag_oldsmg/rubber_mag
- name = "WT-550 Semi-Auto SMG rubberbullets Magazine (4.6x30mm rubber)"
- desc = "A 20 round rubber shots magazine for the out of date security WT-550 Semi-Auto SMG"
- id = "mag_oldsmg_rubber"
- materials = list(MAT_METAL = 6000)
- build_path = /obj/item/ammo_box/magazine/wt550m9/wtrubber
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
diff --git a/modular_citadel/code/modules/research/designs/weapon_designs/weapon_designs.dm b/modular_citadel/code/modules/research/designs/weapon_designs/weapon_designs.dm
deleted file mode 100644
index 6246b9e24e..0000000000
--- a/modular_citadel/code/modules/research/designs/weapon_designs/weapon_designs.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/datum/design/mag_oldsmg/tx_mag
- name = "WT-550 Semi-Auto SMG Uranium Magazine (4.6x30mm TX)"
- desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Semi-Auto SMG."
- id = "mag_oldsmg_tx"
- materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000)
- build_path = /obj/item/ammo_box/magazine/wt550m9/wttx
- departmental_flags = DEPARTMENTAL_FLAG_SECURITY
diff --git a/modular_citadel/code/modules/research/designs/xenobio_designs.dm b/modular_citadel/code/modules/research/designs/xenobio_designs.dm
deleted file mode 100644
index 45ed8e83a0..0000000000
--- a/modular_citadel/code/modules/research/designs/xenobio_designs.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/datum/design/xenobio_upgrade
- name = "owo"
- desc = "someone's bussin"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 300, MAT_GLASS = 100)
- category = list("Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/xenobio_upgrade/xenobiomonkeys
- name = "Xenobiology console monkey upgrade disk"
- desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
- id = "xenobio_monkeys"
- build_path = /obj/item/disk/xenobio_console_upgrade/monkey
-
-/datum/design/xenobio_upgrade/xenobioslimebasic
- name = "Xenobiology console basic slime upgrade disk"
- desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
- id = "xenobio_slimebasic"
- build_path = /obj/item/disk/xenobio_console_upgrade/slimebasic
-
-/datum/design/xenobio_upgrade/xenobioslimeadv
- name = "Xenobiology console advanced slime upgrade disk"
- desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
- id = "xenobio_slimeadv"
- build_path = /obj/item/disk/xenobio_console_upgrade/slimeadv
diff --git a/modular_citadel/code/modules/research/techweb/_techweb.dm b/modular_citadel/code/modules/research/techweb/_techweb.dm
deleted file mode 100644
index 1c96229594..0000000000
--- a/modular_citadel/code/modules/research/techweb/_techweb.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/datum/techweb/specialized/autounlocking/autoylathe
- design_autounlock_buildtypes = AUTOYLATHE
- allowed_buildtypes = AUTOYLATHE
diff --git a/modular_citadel/code/modules/research/xenobiology/xenobio_camera.dm b/modular_citadel/code/modules/research/xenobiology/xenobio_camera.dm
deleted file mode 100644
index b700626a1d..0000000000
--- a/modular_citadel/code/modules/research/xenobiology/xenobio_camera.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/obj/machinery/computer/camera_advanced/xenobio
- max_slimes = 1
- var/upgradetier = 0
-
-/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
- if(istype(O, /obj/item/disk/xenobio_console_upgrade))
- var/obj/item/disk/xenobio_console_upgrade/diskthing = O
- var/successfulupgrade = FALSE
- for(var/I in diskthing.upgradetypes)
- if(upgradetier & I)
- continue
- else
- upgradetier |= I
- successfulupgrade = TRUE
- if(I == XENOBIO_UPGRADE_SLIMEADV)
- max_slimes = 10
- if(successfulupgrade)
- to_chat(user, "You have successfully upgraded [src] with [O].")
- else
- to_chat(user, "[src] already has the contents of [O] installed!")
- return
- . = ..()
-
-/obj/item/disk/xenobio_console_upgrade
- name = "Xenobiology console upgrade disk"
- desc = "Allan please add detail."
- icon_state = "datadisk5"
- var/list/upgradetypes = list()
-
-/obj/item/disk/xenobio_console_upgrade/admin
- name = "Xenobio all access thing"
- desc = "'the consoles are literally useless!!!!!!!!!!!!!!!'"
- upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV, XENOBIO_UPGRADE_MONKEYS)
-
-/obj/item/disk/xenobio_console_upgrade/monkey
- name = "Xenobiology console monkey upgrade disk"
- desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
- upgradetypes = list(XENOBIO_UPGRADE_MONKEYS)
-
-/obj/item/disk/xenobio_console_upgrade/slimebasic
- name = "Xenobiology console basic slime upgrade disk"
- desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
- upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC)
-
-/obj/item/disk/xenobio_console_upgrade/slimeadv
- name = "Xenobiology console advanced slime upgrade disk"
- desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
- upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV)
diff --git a/modular_citadel/code/modules/vehicles/secway.dm b/modular_citadel/code/modules/vehicles/secway.dm
index 85c1de15e2..9320da6dc8 100644
--- a/modular_citadel/code/modules/vehicles/secway.dm
+++ b/modular_citadel/code/modules/vehicles/secway.dm
@@ -24,7 +24,7 @@
if(H.sprinting && charge)
charge--
new_speed = chargespeed
- GET_COMPONENT(D, /datum/component/riding)
+ var/datum/component/riding/D = GetComponent(/datum/component/riding)
D.vehicle_move_delay = new_speed
for(var/i in progressbars_by_rider)
var/datum/progressbar/B = progressbars_by_rider[i]
diff --git a/modular_citadel/icons/eutactic/item/hypereutactic.dmi b/modular_citadel/icons/eutactic/item/hypereutactic.dmi
deleted file mode 100644
index 90a665f676..0000000000
Binary files a/modular_citadel/icons/eutactic/item/hypereutactic.dmi and /dev/null differ
diff --git a/modular_citadel/icons/eutactic/item/noneutactic.dmi b/modular_citadel/icons/eutactic/item/noneutactic.dmi
deleted file mode 100644
index 9d8b9fd1dd..0000000000
Binary files a/modular_citadel/icons/eutactic/item/noneutactic.dmi and /dev/null differ
diff --git a/modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi b/modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi
deleted file mode 100644
index ca94055113..0000000000
Binary files a/modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi and /dev/null differ
diff --git a/modular_citadel/icons/eutactic/mob/hypereutactic_right.dmi b/modular_citadel/icons/eutactic/mob/hypereutactic_right.dmi
deleted file mode 100644
index a9b90da740..0000000000
Binary files a/modular_citadel/icons/eutactic/mob/hypereutactic_right.dmi and /dev/null differ
diff --git a/modular_citadel/icons/eutactic/mob/noneutactic_left.dmi b/modular_citadel/icons/eutactic/mob/noneutactic_left.dmi
deleted file mode 100644
index a426597146..0000000000
Binary files a/modular_citadel/icons/eutactic/mob/noneutactic_left.dmi and /dev/null differ
diff --git a/modular_citadel/icons/eutactic/mob/noneutactic_right.dmi b/modular_citadel/icons/eutactic/mob/noneutactic_right.dmi
deleted file mode 100644
index aab77c5fd4..0000000000
Binary files a/modular_citadel/icons/eutactic/mob/noneutactic_right.dmi and /dev/null differ
diff --git a/modular_citadel/icons/lavaknight/item/head.dmi b/modular_citadel/icons/lavaknight/item/head.dmi
deleted file mode 100644
index 950d4894e9..0000000000
Binary files a/modular_citadel/icons/lavaknight/item/head.dmi and /dev/null differ
diff --git a/modular_citadel/icons/lavaknight/item/suit.dmi b/modular_citadel/icons/lavaknight/item/suit.dmi
deleted file mode 100644
index 49cd14b666..0000000000
Binary files a/modular_citadel/icons/lavaknight/item/suit.dmi and /dev/null differ
diff --git a/modular_citadel/icons/lavaknight/mob/head.dmi b/modular_citadel/icons/lavaknight/mob/head.dmi
deleted file mode 100644
index 5084c9c66f..0000000000
Binary files a/modular_citadel/icons/lavaknight/mob/head.dmi and /dev/null differ
diff --git a/modular_citadel/icons/lavaknight/mob/suit.dmi b/modular_citadel/icons/lavaknight/mob/suit.dmi
deleted file mode 100644
index ed51ceaaa4..0000000000
Binary files a/modular_citadel/icons/lavaknight/mob/suit.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/64x32_effects.dmi b/modular_citadel/icons/mob/64x32_effects.dmi
index 7db65a8fc3..a11b3584a3 100644
Binary files a/modular_citadel/icons/mob/64x32_effects.dmi and b/modular_citadel/icons/mob/64x32_effects.dmi differ
diff --git a/modular_citadel/icons/mob/BananaSpider.dmi b/modular_citadel/icons/mob/BananaSpider.dmi
deleted file mode 100644
index da65ef43fa..0000000000
Binary files a/modular_citadel/icons/mob/BananaSpider.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/kiwi.dmi b/modular_citadel/icons/mob/kiwi.dmi
deleted file mode 100644
index 18777f65cf..0000000000
Binary files a/modular_citadel/icons/mob/kiwi.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi
index a23716562e..fcc124c695 100644
Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
index dce56de556..af916d2fd0 100644
Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ
diff --git a/modular_citadel/icons/mob/mam_snouts.dmi b/modular_citadel/icons/mob/mam_snouts.dmi
index d2cb9b7286..d0f5d56314 100644
Binary files a/modular_citadel/icons/mob/mam_snouts.dmi and b/modular_citadel/icons/mob/mam_snouts.dmi differ
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index 5395e5c7c6..e4bd5119b6 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/modular_citadel/icons/mob/markings_notmammals.dmi b/modular_citadel/icons/mob/markings_notmammals.dmi
index d9577698d1..79c97968ed 100644
Binary files a/modular_citadel/icons/mob/markings_notmammals.dmi and b/modular_citadel/icons/mob/markings_notmammals.dmi differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 8c0856429b..a66895f864 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi
index 5318ffa586..7a3ba5ca54 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
deleted file mode 100644
index de7a86d574..0000000000
Binary files a/modular_citadel/icons/obj/FermiChem.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi b/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi
deleted file mode 100644
index 9a902e0dff..0000000000
Binary files a/modular_citadel/icons/obj/guns/OVERRIDE_energy.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/guns/energy.dmi b/modular_citadel/icons/obj/guns/energy.dmi
new file mode 100644
index 0000000000..482ec04d94
Binary files /dev/null and b/modular_citadel/icons/obj/guns/energy.dmi differ
diff --git a/modular_citadel/icons/obj/hypospraymkii.dmi b/modular_citadel/icons/obj/hypospraymkii.dmi
deleted file mode 100755
index 3f32219d84..0000000000
Binary files a/modular_citadel/icons/obj/hypospraymkii.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/id.dmi b/modular_citadel/icons/obj/id.dmi
deleted file mode 100644
index 653542e93d..0000000000
Binary files a/modular_citadel/icons/obj/id.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/modularpills.dmi b/modular_citadel/icons/obj/modularpills.dmi
deleted file mode 100644
index 78095d82c0..0000000000
Binary files a/modular_citadel/icons/obj/modularpills.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi
deleted file mode 100755
index 8d1fefe470..0000000000
Binary files a/modular_citadel/icons/obj/vial.dmi and /dev/null differ
diff --git a/sound/ambience/servicebell.ogg b/sound/ambience/servicebell.ogg
new file mode 100644
index 0000000000..f55c7d5a75
Binary files /dev/null and b/sound/ambience/servicebell.ogg differ
diff --git a/sound/AI/aimalf.ogg b/sound/announcer/classic/aimalf.ogg
similarity index 100%
rename from sound/AI/aimalf.ogg
rename to sound/announcer/classic/aimalf.ogg
diff --git a/sound/AI/aliens.ogg b/sound/announcer/classic/aliens.ogg
similarity index 100%
rename from sound/AI/aliens.ogg
rename to sound/announcer/classic/aliens.ogg
diff --git a/sound/AI/animes.ogg b/sound/announcer/classic/animes.ogg
similarity index 100%
rename from sound/AI/animes.ogg
rename to sound/announcer/classic/animes.ogg
diff --git a/sound/AI/attention.ogg b/sound/announcer/classic/attention.ogg
similarity index 100%
rename from sound/AI/attention.ogg
rename to sound/announcer/classic/attention.ogg
diff --git a/sound/AI/commandreport.ogg b/sound/announcer/classic/commandreport.ogg
similarity index 100%
rename from sound/AI/commandreport.ogg
rename to sound/announcer/classic/commandreport.ogg
diff --git a/sound/AI/granomalies.ogg b/sound/announcer/classic/granomalies.ogg
similarity index 100%
rename from sound/AI/granomalies.ogg
rename to sound/announcer/classic/granomalies.ogg
diff --git a/sound/AI/intercept.ogg b/sound/announcer/classic/intercept.ogg
similarity index 100%
rename from sound/AI/intercept.ogg
rename to sound/announcer/classic/intercept.ogg
diff --git a/sound/AI/ionstorm.ogg b/sound/announcer/classic/ionstorm.ogg
similarity index 100%
rename from sound/AI/ionstorm.ogg
rename to sound/announcer/classic/ionstorm.ogg
diff --git a/sound/AI/meteors.ogg b/sound/announcer/classic/meteors.ogg
similarity index 100%
rename from sound/AI/meteors.ogg
rename to sound/announcer/classic/meteors.ogg
diff --git a/sound/AI/newAI.ogg b/sound/announcer/classic/newAI.ogg
similarity index 100%
rename from sound/AI/newAI.ogg
rename to sound/announcer/classic/newAI.ogg
diff --git a/sound/AI/outbreak5.ogg b/sound/announcer/classic/outbreak5.ogg
similarity index 100%
rename from sound/AI/outbreak5.ogg
rename to sound/announcer/classic/outbreak5.ogg
diff --git a/sound/AI/outbreak7.ogg b/sound/announcer/classic/outbreak7.ogg
similarity index 100%
rename from sound/AI/outbreak7.ogg
rename to sound/announcer/classic/outbreak7.ogg
diff --git a/sound/AI/poweroff.ogg b/sound/announcer/classic/poweroff.ogg
similarity index 100%
rename from sound/AI/poweroff.ogg
rename to sound/announcer/classic/poweroff.ogg
diff --git a/sound/AI/poweron.ogg b/sound/announcer/classic/poweron.ogg
similarity index 100%
rename from sound/AI/poweron.ogg
rename to sound/announcer/classic/poweron.ogg
diff --git a/sound/AI/radiation.ogg b/sound/announcer/classic/radiation.ogg
similarity index 100%
rename from sound/AI/radiation.ogg
rename to sound/announcer/classic/radiation.ogg
diff --git a/sound/AI/shuttlecalled.ogg b/sound/announcer/classic/shuttlecalled.ogg
similarity index 100%
rename from sound/AI/shuttlecalled.ogg
rename to sound/announcer/classic/shuttlecalled.ogg
diff --git a/sound/AI/shuttledock.ogg b/sound/announcer/classic/shuttledock.ogg
similarity index 100%
rename from sound/AI/shuttledock.ogg
rename to sound/announcer/classic/shuttledock.ogg
diff --git a/sound/AI/shuttlerecalled.ogg b/sound/announcer/classic/shuttlerecalled.ogg
similarity index 100%
rename from sound/AI/shuttlerecalled.ogg
rename to sound/announcer/classic/shuttlerecalled.ogg
diff --git a/sound/AI/spanomalies.ogg b/sound/announcer/classic/spanomalies.ogg
similarity index 100%
rename from sound/AI/spanomalies.ogg
rename to sound/announcer/classic/spanomalies.ogg
diff --git a/sound/AI/welcome.ogg b/sound/announcer/classic/welcome.ogg
similarity index 100%
rename from sound/AI/welcome.ogg
rename to sound/announcer/classic/welcome.ogg
diff --git a/sound/announcer/medibot/aliens.ogg b/sound/announcer/medibot/aliens.ogg
new file mode 100644
index 0000000000..57fa70c3ca
Binary files /dev/null and b/sound/announcer/medibot/aliens.ogg differ
diff --git a/sound/announcer/medibot/animes.ogg b/sound/announcer/medibot/animes.ogg
new file mode 100644
index 0000000000..7615a744a6
Binary files /dev/null and b/sound/announcer/medibot/animes.ogg differ
diff --git a/sound/announcer/medibot/attention.ogg b/sound/announcer/medibot/attention.ogg
new file mode 100644
index 0000000000..d4d5a27085
Binary files /dev/null and b/sound/announcer/medibot/attention.ogg differ
diff --git a/sound/announcer/medibot/commandreport.ogg b/sound/announcer/medibot/commandreport.ogg
new file mode 100644
index 0000000000..4e5c2e1d1f
Binary files /dev/null and b/sound/announcer/medibot/commandreport.ogg differ
diff --git a/sound/announcer/medibot/granomalies.ogg b/sound/announcer/medibot/granomalies.ogg
new file mode 100644
index 0000000000..2713a3cb19
Binary files /dev/null and b/sound/announcer/medibot/granomalies.ogg differ
diff --git a/sound/announcer/medibot/intercept.ogg b/sound/announcer/medibot/intercept.ogg
new file mode 100644
index 0000000000..c59d0455c1
Binary files /dev/null and b/sound/announcer/medibot/intercept.ogg differ
diff --git a/sound/announcer/medibot/ionstorm.ogg b/sound/announcer/medibot/ionstorm.ogg
new file mode 100644
index 0000000000..15aeac9f7f
Binary files /dev/null and b/sound/announcer/medibot/ionstorm.ogg differ
diff --git a/sound/announcer/medibot/meteors.ogg b/sound/announcer/medibot/meteors.ogg
new file mode 100644
index 0000000000..91208cae12
Binary files /dev/null and b/sound/announcer/medibot/meteors.ogg differ
diff --git a/sound/announcer/medibot/newAI.ogg b/sound/announcer/medibot/newAI.ogg
new file mode 100644
index 0000000000..c40b099020
Binary files /dev/null and b/sound/announcer/medibot/newAI.ogg differ
diff --git a/sound/announcer/medibot/outbreak5.ogg b/sound/announcer/medibot/outbreak5.ogg
new file mode 100644
index 0000000000..7118af4449
Binary files /dev/null and b/sound/announcer/medibot/outbreak5.ogg differ
diff --git a/sound/announcer/medibot/outbreak7.ogg b/sound/announcer/medibot/outbreak7.ogg
new file mode 100644
index 0000000000..1fc542534d
Binary files /dev/null and b/sound/announcer/medibot/outbreak7.ogg differ
diff --git a/sound/announcer/medibot/poweroff.ogg b/sound/announcer/medibot/poweroff.ogg
new file mode 100644
index 0000000000..875df35002
Binary files /dev/null and b/sound/announcer/medibot/poweroff.ogg differ
diff --git a/sound/announcer/medibot/poweron.ogg b/sound/announcer/medibot/poweron.ogg
new file mode 100644
index 0000000000..4b1605b1c7
Binary files /dev/null and b/sound/announcer/medibot/poweron.ogg differ
diff --git a/sound/announcer/medibot/radiation.ogg b/sound/announcer/medibot/radiation.ogg
new file mode 100644
index 0000000000..5c48830b5f
Binary files /dev/null and b/sound/announcer/medibot/radiation.ogg differ
diff --git a/sound/announcer/medibot/shuttlecalled.ogg b/sound/announcer/medibot/shuttlecalled.ogg
new file mode 100644
index 0000000000..a775567abe
Binary files /dev/null and b/sound/announcer/medibot/shuttlecalled.ogg differ
diff --git a/sound/announcer/medibot/shuttledocked.ogg b/sound/announcer/medibot/shuttledocked.ogg
new file mode 100644
index 0000000000..933928db06
Binary files /dev/null and b/sound/announcer/medibot/shuttledocked.ogg differ
diff --git a/sound/announcer/medibot/shuttlerecalled.ogg b/sound/announcer/medibot/shuttlerecalled.ogg
new file mode 100644
index 0000000000..53b622576d
Binary files /dev/null and b/sound/announcer/medibot/shuttlerecalled.ogg differ
diff --git a/sound/announcer/medibot/spanomalies.ogg b/sound/announcer/medibot/spanomalies.ogg
new file mode 100644
index 0000000000..d710999e1e
Binary files /dev/null and b/sound/announcer/medibot/spanomalies.ogg differ
diff --git a/sound/announcer/medibot/welcome.ogg b/sound/announcer/medibot/welcome.ogg
new file mode 100644
index 0000000000..f9a698fd08
Binary files /dev/null and b/sound/announcer/medibot/welcome.ogg differ
diff --git a/sound/AI/harmalarm.ogg b/sound/effects/harmalarm.ogg
similarity index 100%
rename from sound/AI/harmalarm.ogg
rename to sound/effects/harmalarm.ogg
diff --git a/sound/effects/k9_jaw_strong.ogg b/sound/effects/k9_jaw_strong.ogg
new file mode 100644
index 0000000000..9f60050b95
Binary files /dev/null and b/sound/effects/k9_jaw_strong.ogg differ
diff --git a/sound/effects/k9_jaw_weak.ogg b/sound/effects/k9_jaw_weak.ogg
new file mode 100644
index 0000000000..3ef2272f01
Binary files /dev/null and b/sound/effects/k9_jaw_weak.ogg differ
diff --git a/modular_citadel/sound/vox/_comma.ogg b/sound/vox/_comma.ogg
similarity index 100%
rename from modular_citadel/sound/vox/_comma.ogg
rename to sound/vox/_comma.ogg
diff --git a/modular_citadel/sound/vox/_period.ogg b/sound/vox/_period.ogg
similarity index 100%
rename from modular_citadel/sound/vox/_period.ogg
rename to sound/vox/_period.ogg
diff --git a/modular_citadel/sound/vox/a.ogg b/sound/vox/a.ogg
similarity index 100%
rename from modular_citadel/sound/vox/a.ogg
rename to sound/vox/a.ogg
diff --git a/modular_citadel/sound/vox/accelerating.ogg b/sound/vox/accelerating.ogg
similarity index 100%
rename from modular_citadel/sound/vox/accelerating.ogg
rename to sound/vox/accelerating.ogg
diff --git a/modular_citadel/sound/vox/accelerator.ogg b/sound/vox/accelerator.ogg
similarity index 100%
rename from modular_citadel/sound/vox/accelerator.ogg
rename to sound/vox/accelerator.ogg
diff --git a/modular_citadel/sound/vox/accepted.ogg b/sound/vox/accepted.ogg
similarity index 100%
rename from modular_citadel/sound/vox/accepted.ogg
rename to sound/vox/accepted.ogg
diff --git a/modular_citadel/sound/vox/access.ogg b/sound/vox/access.ogg
similarity index 100%
rename from modular_citadel/sound/vox/access.ogg
rename to sound/vox/access.ogg
diff --git a/modular_citadel/sound/vox/acknowledge.ogg b/sound/vox/acknowledge.ogg
similarity index 100%
rename from modular_citadel/sound/vox/acknowledge.ogg
rename to sound/vox/acknowledge.ogg
diff --git a/modular_citadel/sound/vox/acknowledged.ogg b/sound/vox/acknowledged.ogg
similarity index 100%
rename from modular_citadel/sound/vox/acknowledged.ogg
rename to sound/vox/acknowledged.ogg
diff --git a/modular_citadel/sound/vox/acquired.ogg b/sound/vox/acquired.ogg
similarity index 100%
rename from modular_citadel/sound/vox/acquired.ogg
rename to sound/vox/acquired.ogg
diff --git a/modular_citadel/sound/vox/acquisition.ogg b/sound/vox/acquisition.ogg
similarity index 100%
rename from modular_citadel/sound/vox/acquisition.ogg
rename to sound/vox/acquisition.ogg
diff --git a/modular_citadel/sound/vox/across.ogg b/sound/vox/across.ogg
similarity index 100%
rename from modular_citadel/sound/vox/across.ogg
rename to sound/vox/across.ogg
diff --git a/modular_citadel/sound/vox/activate.ogg b/sound/vox/activate.ogg
similarity index 100%
rename from modular_citadel/sound/vox/activate.ogg
rename to sound/vox/activate.ogg
diff --git a/modular_citadel/sound/vox/activated.ogg b/sound/vox/activated.ogg
similarity index 100%
rename from modular_citadel/sound/vox/activated.ogg
rename to sound/vox/activated.ogg
diff --git a/modular_citadel/sound/vox/activity.ogg b/sound/vox/activity.ogg
similarity index 100%
rename from modular_citadel/sound/vox/activity.ogg
rename to sound/vox/activity.ogg
diff --git a/modular_citadel/sound/vox/adios.ogg b/sound/vox/adios.ogg
similarity index 100%
rename from modular_citadel/sound/vox/adios.ogg
rename to sound/vox/adios.ogg
diff --git a/modular_citadel/sound/vox/administration.ogg b/sound/vox/administration.ogg
similarity index 100%
rename from modular_citadel/sound/vox/administration.ogg
rename to sound/vox/administration.ogg
diff --git a/modular_citadel/sound/vox/advanced.ogg b/sound/vox/advanced.ogg
similarity index 100%
rename from modular_citadel/sound/vox/advanced.ogg
rename to sound/vox/advanced.ogg
diff --git a/modular_citadel/sound/vox/after.ogg b/sound/vox/after.ogg
similarity index 100%
rename from modular_citadel/sound/vox/after.ogg
rename to sound/vox/after.ogg
diff --git a/modular_citadel/sound/vox/agent.ogg b/sound/vox/agent.ogg
similarity index 100%
rename from modular_citadel/sound/vox/agent.ogg
rename to sound/vox/agent.ogg
diff --git a/modular_citadel/sound/vox/alarm.ogg b/sound/vox/alarm.ogg
similarity index 100%
rename from modular_citadel/sound/vox/alarm.ogg
rename to sound/vox/alarm.ogg
diff --git a/modular_citadel/sound/vox/alert.ogg b/sound/vox/alert.ogg
similarity index 100%
rename from modular_citadel/sound/vox/alert.ogg
rename to sound/vox/alert.ogg
diff --git a/modular_citadel/sound/vox/alien.ogg b/sound/vox/alien.ogg
similarity index 100%
rename from modular_citadel/sound/vox/alien.ogg
rename to sound/vox/alien.ogg
diff --git a/modular_citadel/sound/vox/aligned.ogg b/sound/vox/aligned.ogg
similarity index 100%
rename from modular_citadel/sound/vox/aligned.ogg
rename to sound/vox/aligned.ogg
diff --git a/modular_citadel/sound/vox/all.ogg b/sound/vox/all.ogg
similarity index 100%
rename from modular_citadel/sound/vox/all.ogg
rename to sound/vox/all.ogg
diff --git a/modular_citadel/sound/vox/alpha.ogg b/sound/vox/alpha.ogg
similarity index 100%
rename from modular_citadel/sound/vox/alpha.ogg
rename to sound/vox/alpha.ogg
diff --git a/modular_citadel/sound/vox/am.ogg b/sound/vox/am.ogg
similarity index 100%
rename from modular_citadel/sound/vox/am.ogg
rename to sound/vox/am.ogg
diff --git a/modular_citadel/sound/vox/amigo.ogg b/sound/vox/amigo.ogg
similarity index 100%
rename from modular_citadel/sound/vox/amigo.ogg
rename to sound/vox/amigo.ogg
diff --git a/modular_citadel/sound/vox/ammunition.ogg b/sound/vox/ammunition.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ammunition.ogg
rename to sound/vox/ammunition.ogg
diff --git a/modular_citadel/sound/vox/an.ogg b/sound/vox/an.ogg
similarity index 100%
rename from modular_citadel/sound/vox/an.ogg
rename to sound/vox/an.ogg
diff --git a/modular_citadel/sound/vox/and.ogg b/sound/vox/and.ogg
similarity index 100%
rename from modular_citadel/sound/vox/and.ogg
rename to sound/vox/and.ogg
diff --git a/modular_citadel/sound/vox/announcement.ogg b/sound/vox/announcement.ogg
similarity index 100%
rename from modular_citadel/sound/vox/announcement.ogg
rename to sound/vox/announcement.ogg
diff --git a/modular_citadel/sound/vox/anomalous.ogg b/sound/vox/anomalous.ogg
similarity index 100%
rename from modular_citadel/sound/vox/anomalous.ogg
rename to sound/vox/anomalous.ogg
diff --git a/modular_citadel/sound/vox/antenna.ogg b/sound/vox/antenna.ogg
similarity index 100%
rename from modular_citadel/sound/vox/antenna.ogg
rename to sound/vox/antenna.ogg
diff --git a/modular_citadel/sound/vox/any.ogg b/sound/vox/any.ogg
similarity index 100%
rename from modular_citadel/sound/vox/any.ogg
rename to sound/vox/any.ogg
diff --git a/modular_citadel/sound/vox/apprehend.ogg b/sound/vox/apprehend.ogg
similarity index 100%
rename from modular_citadel/sound/vox/apprehend.ogg
rename to sound/vox/apprehend.ogg
diff --git a/modular_citadel/sound/vox/approach.ogg b/sound/vox/approach.ogg
similarity index 100%
rename from modular_citadel/sound/vox/approach.ogg
rename to sound/vox/approach.ogg
diff --git a/modular_citadel/sound/vox/are.ogg b/sound/vox/are.ogg
similarity index 100%
rename from modular_citadel/sound/vox/are.ogg
rename to sound/vox/are.ogg
diff --git a/modular_citadel/sound/vox/area.ogg b/sound/vox/area.ogg
similarity index 100%
rename from modular_citadel/sound/vox/area.ogg
rename to sound/vox/area.ogg
diff --git a/modular_citadel/sound/vox/arm.ogg b/sound/vox/arm.ogg
similarity index 100%
rename from modular_citadel/sound/vox/arm.ogg
rename to sound/vox/arm.ogg
diff --git a/modular_citadel/sound/vox/armed.ogg b/sound/vox/armed.ogg
similarity index 100%
rename from modular_citadel/sound/vox/armed.ogg
rename to sound/vox/armed.ogg
diff --git a/modular_citadel/sound/vox/armor.ogg b/sound/vox/armor.ogg
similarity index 100%
rename from modular_citadel/sound/vox/armor.ogg
rename to sound/vox/armor.ogg
diff --git a/modular_citadel/sound/vox/armory.ogg b/sound/vox/armory.ogg
similarity index 100%
rename from modular_citadel/sound/vox/armory.ogg
rename to sound/vox/armory.ogg
diff --git a/modular_citadel/sound/vox/arrest.ogg b/sound/vox/arrest.ogg
similarity index 100%
rename from modular_citadel/sound/vox/arrest.ogg
rename to sound/vox/arrest.ogg
diff --git a/modular_citadel/sound/vox/ass.ogg b/sound/vox/ass.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ass.ogg
rename to sound/vox/ass.ogg
diff --git a/modular_citadel/sound/vox/at.ogg b/sound/vox/at.ogg
similarity index 100%
rename from modular_citadel/sound/vox/at.ogg
rename to sound/vox/at.ogg
diff --git a/modular_citadel/sound/vox/atomic.ogg b/sound/vox/atomic.ogg
similarity index 100%
rename from modular_citadel/sound/vox/atomic.ogg
rename to sound/vox/atomic.ogg
diff --git a/modular_citadel/sound/vox/attention.ogg b/sound/vox/attention.ogg
similarity index 100%
rename from modular_citadel/sound/vox/attention.ogg
rename to sound/vox/attention.ogg
diff --git a/modular_citadel/sound/vox/authorize.ogg b/sound/vox/authorize.ogg
similarity index 100%
rename from modular_citadel/sound/vox/authorize.ogg
rename to sound/vox/authorize.ogg
diff --git a/modular_citadel/sound/vox/authorized.ogg b/sound/vox/authorized.ogg
similarity index 100%
rename from modular_citadel/sound/vox/authorized.ogg
rename to sound/vox/authorized.ogg
diff --git a/modular_citadel/sound/vox/automatic.ogg b/sound/vox/automatic.ogg
similarity index 100%
rename from modular_citadel/sound/vox/automatic.ogg
rename to sound/vox/automatic.ogg
diff --git a/modular_citadel/sound/vox/away.ogg b/sound/vox/away.ogg
similarity index 100%
rename from modular_citadel/sound/vox/away.ogg
rename to sound/vox/away.ogg
diff --git a/modular_citadel/sound/vox/b.ogg b/sound/vox/b.ogg
similarity index 100%
rename from modular_citadel/sound/vox/b.ogg
rename to sound/vox/b.ogg
diff --git a/modular_citadel/sound/vox/back.ogg b/sound/vox/back.ogg
similarity index 100%
rename from modular_citadel/sound/vox/back.ogg
rename to sound/vox/back.ogg
diff --git a/modular_citadel/sound/vox/backman.ogg b/sound/vox/backman.ogg
similarity index 100%
rename from modular_citadel/sound/vox/backman.ogg
rename to sound/vox/backman.ogg
diff --git a/modular_citadel/sound/vox/bad.ogg b/sound/vox/bad.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bad.ogg
rename to sound/vox/bad.ogg
diff --git a/modular_citadel/sound/vox/bag.ogg b/sound/vox/bag.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bag.ogg
rename to sound/vox/bag.ogg
diff --git a/modular_citadel/sound/vox/bailey.ogg b/sound/vox/bailey.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bailey.ogg
rename to sound/vox/bailey.ogg
diff --git a/modular_citadel/sound/vox/barracks.ogg b/sound/vox/barracks.ogg
similarity index 100%
rename from modular_citadel/sound/vox/barracks.ogg
rename to sound/vox/barracks.ogg
diff --git a/modular_citadel/sound/vox/base.ogg b/sound/vox/base.ogg
similarity index 100%
rename from modular_citadel/sound/vox/base.ogg
rename to sound/vox/base.ogg
diff --git a/modular_citadel/sound/vox/bay.ogg b/sound/vox/bay.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bay.ogg
rename to sound/vox/bay.ogg
diff --git a/modular_citadel/sound/vox/be.ogg b/sound/vox/be.ogg
similarity index 100%
rename from modular_citadel/sound/vox/be.ogg
rename to sound/vox/be.ogg
diff --git a/modular_citadel/sound/vox/been.ogg b/sound/vox/been.ogg
similarity index 100%
rename from modular_citadel/sound/vox/been.ogg
rename to sound/vox/been.ogg
diff --git a/modular_citadel/sound/vox/before.ogg b/sound/vox/before.ogg
similarity index 100%
rename from modular_citadel/sound/vox/before.ogg
rename to sound/vox/before.ogg
diff --git a/modular_citadel/sound/vox/beyond.ogg b/sound/vox/beyond.ogg
similarity index 100%
rename from modular_citadel/sound/vox/beyond.ogg
rename to sound/vox/beyond.ogg
diff --git a/modular_citadel/sound/vox/biohazard.ogg b/sound/vox/biohazard.ogg
similarity index 100%
rename from modular_citadel/sound/vox/biohazard.ogg
rename to sound/vox/biohazard.ogg
diff --git a/modular_citadel/sound/vox/biological.ogg b/sound/vox/biological.ogg
similarity index 100%
rename from modular_citadel/sound/vox/biological.ogg
rename to sound/vox/biological.ogg
diff --git a/modular_citadel/sound/vox/birdwell.ogg b/sound/vox/birdwell.ogg
similarity index 100%
rename from modular_citadel/sound/vox/birdwell.ogg
rename to sound/vox/birdwell.ogg
diff --git a/modular_citadel/sound/vox/bizwarn.ogg b/sound/vox/bizwarn.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bizwarn.ogg
rename to sound/vox/bizwarn.ogg
diff --git a/modular_citadel/sound/vox/black.ogg b/sound/vox/black.ogg
similarity index 100%
rename from modular_citadel/sound/vox/black.ogg
rename to sound/vox/black.ogg
diff --git a/modular_citadel/sound/vox/blast.ogg b/sound/vox/blast.ogg
similarity index 100%
rename from modular_citadel/sound/vox/blast.ogg
rename to sound/vox/blast.ogg
diff --git a/modular_citadel/sound/vox/blocked.ogg b/sound/vox/blocked.ogg
similarity index 100%
rename from modular_citadel/sound/vox/blocked.ogg
rename to sound/vox/blocked.ogg
diff --git a/modular_citadel/sound/vox/bloop.ogg b/sound/vox/bloop.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bloop.ogg
rename to sound/vox/bloop.ogg
diff --git a/modular_citadel/sound/vox/blue.ogg b/sound/vox/blue.ogg
similarity index 100%
rename from modular_citadel/sound/vox/blue.ogg
rename to sound/vox/blue.ogg
diff --git a/modular_citadel/sound/vox/bottom.ogg b/sound/vox/bottom.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bottom.ogg
rename to sound/vox/bottom.ogg
diff --git a/modular_citadel/sound/vox/bravo.ogg b/sound/vox/bravo.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bravo.ogg
rename to sound/vox/bravo.ogg
diff --git a/modular_citadel/sound/vox/breach.ogg b/sound/vox/breach.ogg
similarity index 100%
rename from modular_citadel/sound/vox/breach.ogg
rename to sound/vox/breach.ogg
diff --git a/modular_citadel/sound/vox/breached.ogg b/sound/vox/breached.ogg
similarity index 100%
rename from modular_citadel/sound/vox/breached.ogg
rename to sound/vox/breached.ogg
diff --git a/modular_citadel/sound/vox/break.ogg b/sound/vox/break.ogg
similarity index 100%
rename from modular_citadel/sound/vox/break.ogg
rename to sound/vox/break.ogg
diff --git a/modular_citadel/sound/vox/bridge.ogg b/sound/vox/bridge.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bridge.ogg
rename to sound/vox/bridge.ogg
diff --git a/modular_citadel/sound/vox/bust.ogg b/sound/vox/bust.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bust.ogg
rename to sound/vox/bust.ogg
diff --git a/modular_citadel/sound/vox/but.ogg b/sound/vox/but.ogg
similarity index 100%
rename from modular_citadel/sound/vox/but.ogg
rename to sound/vox/but.ogg
diff --git a/modular_citadel/sound/vox/button.ogg b/sound/vox/button.ogg
similarity index 100%
rename from modular_citadel/sound/vox/button.ogg
rename to sound/vox/button.ogg
diff --git a/modular_citadel/sound/vox/buzwarn.ogg b/sound/vox/buzwarn.ogg
similarity index 100%
rename from modular_citadel/sound/vox/buzwarn.ogg
rename to sound/vox/buzwarn.ogg
diff --git a/modular_citadel/sound/vox/bypass.ogg b/sound/vox/bypass.ogg
similarity index 100%
rename from modular_citadel/sound/vox/bypass.ogg
rename to sound/vox/bypass.ogg
diff --git a/modular_citadel/sound/vox/c.ogg b/sound/vox/c.ogg
similarity index 100%
rename from modular_citadel/sound/vox/c.ogg
rename to sound/vox/c.ogg
diff --git a/modular_citadel/sound/vox/cable.ogg b/sound/vox/cable.ogg
similarity index 100%
rename from modular_citadel/sound/vox/cable.ogg
rename to sound/vox/cable.ogg
diff --git a/modular_citadel/sound/vox/call.ogg b/sound/vox/call.ogg
similarity index 100%
rename from modular_citadel/sound/vox/call.ogg
rename to sound/vox/call.ogg
diff --git a/modular_citadel/sound/vox/called.ogg b/sound/vox/called.ogg
similarity index 100%
rename from modular_citadel/sound/vox/called.ogg
rename to sound/vox/called.ogg
diff --git a/modular_citadel/sound/vox/canal.ogg b/sound/vox/canal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/canal.ogg
rename to sound/vox/canal.ogg
diff --git a/modular_citadel/sound/vox/cap.ogg b/sound/vox/cap.ogg
similarity index 100%
rename from modular_citadel/sound/vox/cap.ogg
rename to sound/vox/cap.ogg
diff --git a/modular_citadel/sound/vox/captain.ogg b/sound/vox/captain.ogg
similarity index 100%
rename from modular_citadel/sound/vox/captain.ogg
rename to sound/vox/captain.ogg
diff --git a/modular_citadel/sound/vox/capture.ogg b/sound/vox/capture.ogg
similarity index 100%
rename from modular_citadel/sound/vox/capture.ogg
rename to sound/vox/capture.ogg
diff --git a/modular_citadel/sound/vox/captured.ogg b/sound/vox/captured.ogg
similarity index 100%
rename from modular_citadel/sound/vox/captured.ogg
rename to sound/vox/captured.ogg
diff --git a/modular_citadel/sound/vox/ceiling.ogg b/sound/vox/ceiling.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ceiling.ogg
rename to sound/vox/ceiling.ogg
diff --git a/modular_citadel/sound/vox/celsius.ogg b/sound/vox/celsius.ogg
similarity index 100%
rename from modular_citadel/sound/vox/celsius.ogg
rename to sound/vox/celsius.ogg
diff --git a/modular_citadel/sound/vox/center.ogg b/sound/vox/center.ogg
similarity index 100%
rename from modular_citadel/sound/vox/center.ogg
rename to sound/vox/center.ogg
diff --git a/modular_citadel/sound/vox/centi.ogg b/sound/vox/centi.ogg
similarity index 100%
rename from modular_citadel/sound/vox/centi.ogg
rename to sound/vox/centi.ogg
diff --git a/modular_citadel/sound/vox/central.ogg b/sound/vox/central.ogg
similarity index 100%
rename from modular_citadel/sound/vox/central.ogg
rename to sound/vox/central.ogg
diff --git a/modular_citadel/sound/vox/chamber.ogg b/sound/vox/chamber.ogg
similarity index 100%
rename from modular_citadel/sound/vox/chamber.ogg
rename to sound/vox/chamber.ogg
diff --git a/modular_citadel/sound/vox/charlie.ogg b/sound/vox/charlie.ogg
similarity index 100%
rename from modular_citadel/sound/vox/charlie.ogg
rename to sound/vox/charlie.ogg
diff --git a/modular_citadel/sound/vox/check.ogg b/sound/vox/check.ogg
similarity index 100%
rename from modular_citadel/sound/vox/check.ogg
rename to sound/vox/check.ogg
diff --git a/modular_citadel/sound/vox/checkpoint.ogg b/sound/vox/checkpoint.ogg
similarity index 100%
rename from modular_citadel/sound/vox/checkpoint.ogg
rename to sound/vox/checkpoint.ogg
diff --git a/modular_citadel/sound/vox/chemical.ogg b/sound/vox/chemical.ogg
similarity index 100%
rename from modular_citadel/sound/vox/chemical.ogg
rename to sound/vox/chemical.ogg
diff --git a/modular_citadel/sound/vox/cleanup.ogg b/sound/vox/cleanup.ogg
similarity index 100%
rename from modular_citadel/sound/vox/cleanup.ogg
rename to sound/vox/cleanup.ogg
diff --git a/modular_citadel/sound/vox/clear.ogg b/sound/vox/clear.ogg
similarity index 100%
rename from modular_citadel/sound/vox/clear.ogg
rename to sound/vox/clear.ogg
diff --git a/modular_citadel/sound/vox/clearance.ogg b/sound/vox/clearance.ogg
similarity index 100%
rename from modular_citadel/sound/vox/clearance.ogg
rename to sound/vox/clearance.ogg
diff --git a/modular_citadel/sound/vox/close.ogg b/sound/vox/close.ogg
similarity index 100%
rename from modular_citadel/sound/vox/close.ogg
rename to sound/vox/close.ogg
diff --git a/modular_citadel/sound/vox/clown.ogg b/sound/vox/clown.ogg
similarity index 100%
rename from modular_citadel/sound/vox/clown.ogg
rename to sound/vox/clown.ogg
diff --git a/modular_citadel/sound/vox/code.ogg b/sound/vox/code.ogg
similarity index 100%
rename from modular_citadel/sound/vox/code.ogg
rename to sound/vox/code.ogg
diff --git a/modular_citadel/sound/vox/coded.ogg b/sound/vox/coded.ogg
similarity index 100%
rename from modular_citadel/sound/vox/coded.ogg
rename to sound/vox/coded.ogg
diff --git a/modular_citadel/sound/vox/collider.ogg b/sound/vox/collider.ogg
similarity index 100%
rename from modular_citadel/sound/vox/collider.ogg
rename to sound/vox/collider.ogg
diff --git a/modular_citadel/sound/vox/comma.ogg b/sound/vox/comma.ogg
similarity index 100%
rename from modular_citadel/sound/vox/comma.ogg
rename to sound/vox/comma.ogg
diff --git a/modular_citadel/sound/vox/command.ogg b/sound/vox/command.ogg
similarity index 100%
rename from modular_citadel/sound/vox/command.ogg
rename to sound/vox/command.ogg
diff --git a/modular_citadel/sound/vox/communication.ogg b/sound/vox/communication.ogg
similarity index 100%
rename from modular_citadel/sound/vox/communication.ogg
rename to sound/vox/communication.ogg
diff --git a/modular_citadel/sound/vox/complex.ogg b/sound/vox/complex.ogg
similarity index 100%
rename from modular_citadel/sound/vox/complex.ogg
rename to sound/vox/complex.ogg
diff --git a/modular_citadel/sound/vox/computer.ogg b/sound/vox/computer.ogg
similarity index 100%
rename from modular_citadel/sound/vox/computer.ogg
rename to sound/vox/computer.ogg
diff --git a/modular_citadel/sound/vox/condition.ogg b/sound/vox/condition.ogg
similarity index 100%
rename from modular_citadel/sound/vox/condition.ogg
rename to sound/vox/condition.ogg
diff --git a/modular_citadel/sound/vox/containment.ogg b/sound/vox/containment.ogg
similarity index 100%
rename from modular_citadel/sound/vox/containment.ogg
rename to sound/vox/containment.ogg
diff --git a/modular_citadel/sound/vox/contamination.ogg b/sound/vox/contamination.ogg
similarity index 100%
rename from modular_citadel/sound/vox/contamination.ogg
rename to sound/vox/contamination.ogg
diff --git a/modular_citadel/sound/vox/control.ogg b/sound/vox/control.ogg
similarity index 100%
rename from modular_citadel/sound/vox/control.ogg
rename to sound/vox/control.ogg
diff --git a/modular_citadel/sound/vox/coolant.ogg b/sound/vox/coolant.ogg
similarity index 100%
rename from modular_citadel/sound/vox/coolant.ogg
rename to sound/vox/coolant.ogg
diff --git a/modular_citadel/sound/vox/coomer.ogg b/sound/vox/coomer.ogg
similarity index 100%
rename from modular_citadel/sound/vox/coomer.ogg
rename to sound/vox/coomer.ogg
diff --git a/modular_citadel/sound/vox/core.ogg b/sound/vox/core.ogg
similarity index 100%
rename from modular_citadel/sound/vox/core.ogg
rename to sound/vox/core.ogg
diff --git a/modular_citadel/sound/vox/correct.ogg b/sound/vox/correct.ogg
similarity index 100%
rename from modular_citadel/sound/vox/correct.ogg
rename to sound/vox/correct.ogg
diff --git a/modular_citadel/sound/vox/corridor.ogg b/sound/vox/corridor.ogg
similarity index 100%
rename from modular_citadel/sound/vox/corridor.ogg
rename to sound/vox/corridor.ogg
diff --git a/modular_citadel/sound/vox/crew.ogg b/sound/vox/crew.ogg
similarity index 100%
rename from modular_citadel/sound/vox/crew.ogg
rename to sound/vox/crew.ogg
diff --git a/modular_citadel/sound/vox/cross.ogg b/sound/vox/cross.ogg
similarity index 100%
rename from modular_citadel/sound/vox/cross.ogg
rename to sound/vox/cross.ogg
diff --git a/modular_citadel/sound/vox/cryogenic.ogg b/sound/vox/cryogenic.ogg
similarity index 100%
rename from modular_citadel/sound/vox/cryogenic.ogg
rename to sound/vox/cryogenic.ogg
diff --git a/modular_citadel/sound/vox/d.ogg b/sound/vox/d.ogg
similarity index 100%
rename from modular_citadel/sound/vox/d.ogg
rename to sound/vox/d.ogg
diff --git a/modular_citadel/sound/vox/dadeda.ogg b/sound/vox/dadeda.ogg
similarity index 100%
rename from modular_citadel/sound/vox/dadeda.ogg
rename to sound/vox/dadeda.ogg
diff --git a/modular_citadel/sound/vox/damage.ogg b/sound/vox/damage.ogg
similarity index 100%
rename from modular_citadel/sound/vox/damage.ogg
rename to sound/vox/damage.ogg
diff --git a/modular_citadel/sound/vox/damaged.ogg b/sound/vox/damaged.ogg
similarity index 100%
rename from modular_citadel/sound/vox/damaged.ogg
rename to sound/vox/damaged.ogg
diff --git a/modular_citadel/sound/vox/danger.ogg b/sound/vox/danger.ogg
similarity index 100%
rename from modular_citadel/sound/vox/danger.ogg
rename to sound/vox/danger.ogg
diff --git a/modular_citadel/sound/vox/day.ogg b/sound/vox/day.ogg
similarity index 100%
rename from modular_citadel/sound/vox/day.ogg
rename to sound/vox/day.ogg
diff --git a/modular_citadel/sound/vox/deactivated.ogg b/sound/vox/deactivated.ogg
similarity index 100%
rename from modular_citadel/sound/vox/deactivated.ogg
rename to sound/vox/deactivated.ogg
diff --git a/modular_citadel/sound/vox/decompression.ogg b/sound/vox/decompression.ogg
similarity index 100%
rename from modular_citadel/sound/vox/decompression.ogg
rename to sound/vox/decompression.ogg
diff --git a/modular_citadel/sound/vox/decontamination.ogg b/sound/vox/decontamination.ogg
similarity index 100%
rename from modular_citadel/sound/vox/decontamination.ogg
rename to sound/vox/decontamination.ogg
diff --git a/modular_citadel/sound/vox/deeoo.ogg b/sound/vox/deeoo.ogg
similarity index 100%
rename from modular_citadel/sound/vox/deeoo.ogg
rename to sound/vox/deeoo.ogg
diff --git a/modular_citadel/sound/vox/defense.ogg b/sound/vox/defense.ogg
similarity index 100%
rename from modular_citadel/sound/vox/defense.ogg
rename to sound/vox/defense.ogg
diff --git a/modular_citadel/sound/vox/degrees.ogg b/sound/vox/degrees.ogg
similarity index 100%
rename from modular_citadel/sound/vox/degrees.ogg
rename to sound/vox/degrees.ogg
diff --git a/modular_citadel/sound/vox/delta.ogg b/sound/vox/delta.ogg
similarity index 100%
rename from modular_citadel/sound/vox/delta.ogg
rename to sound/vox/delta.ogg
diff --git a/modular_citadel/sound/vox/denied.ogg b/sound/vox/denied.ogg
similarity index 100%
rename from modular_citadel/sound/vox/denied.ogg
rename to sound/vox/denied.ogg
diff --git a/modular_citadel/sound/vox/deploy.ogg b/sound/vox/deploy.ogg
similarity index 100%
rename from modular_citadel/sound/vox/deploy.ogg
rename to sound/vox/deploy.ogg
diff --git a/modular_citadel/sound/vox/deployed.ogg b/sound/vox/deployed.ogg
similarity index 100%
rename from modular_citadel/sound/vox/deployed.ogg
rename to sound/vox/deployed.ogg
diff --git a/modular_citadel/sound/vox/destroy.ogg b/sound/vox/destroy.ogg
similarity index 100%
rename from modular_citadel/sound/vox/destroy.ogg
rename to sound/vox/destroy.ogg
diff --git a/modular_citadel/sound/vox/destroyed.ogg b/sound/vox/destroyed.ogg
similarity index 100%
rename from modular_citadel/sound/vox/destroyed.ogg
rename to sound/vox/destroyed.ogg
diff --git a/modular_citadel/sound/vox/detain.ogg b/sound/vox/detain.ogg
similarity index 100%
rename from modular_citadel/sound/vox/detain.ogg
rename to sound/vox/detain.ogg
diff --git a/modular_citadel/sound/vox/detected.ogg b/sound/vox/detected.ogg
similarity index 100%
rename from modular_citadel/sound/vox/detected.ogg
rename to sound/vox/detected.ogg
diff --git a/modular_citadel/sound/vox/detonation.ogg b/sound/vox/detonation.ogg
similarity index 100%
rename from modular_citadel/sound/vox/detonation.ogg
rename to sound/vox/detonation.ogg
diff --git a/modular_citadel/sound/vox/device.ogg b/sound/vox/device.ogg
similarity index 100%
rename from modular_citadel/sound/vox/device.ogg
rename to sound/vox/device.ogg
diff --git a/modular_citadel/sound/vox/did.ogg b/sound/vox/did.ogg
similarity index 100%
rename from modular_citadel/sound/vox/did.ogg
rename to sound/vox/did.ogg
diff --git a/modular_citadel/sound/vox/die.ogg b/sound/vox/die.ogg
similarity index 100%
rename from modular_citadel/sound/vox/die.ogg
rename to sound/vox/die.ogg
diff --git a/modular_citadel/sound/vox/dimensional.ogg b/sound/vox/dimensional.ogg
similarity index 100%
rename from modular_citadel/sound/vox/dimensional.ogg
rename to sound/vox/dimensional.ogg
diff --git a/modular_citadel/sound/vox/dirt.ogg b/sound/vox/dirt.ogg
similarity index 100%
rename from modular_citadel/sound/vox/dirt.ogg
rename to sound/vox/dirt.ogg
diff --git a/modular_citadel/sound/vox/disengaged.ogg b/sound/vox/disengaged.ogg
similarity index 100%
rename from modular_citadel/sound/vox/disengaged.ogg
rename to sound/vox/disengaged.ogg
diff --git a/modular_citadel/sound/vox/dish.ogg b/sound/vox/dish.ogg
similarity index 100%
rename from modular_citadel/sound/vox/dish.ogg
rename to sound/vox/dish.ogg
diff --git a/modular_citadel/sound/vox/disposal.ogg b/sound/vox/disposal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/disposal.ogg
rename to sound/vox/disposal.ogg
diff --git a/modular_citadel/sound/vox/distance.ogg b/sound/vox/distance.ogg
similarity index 100%
rename from modular_citadel/sound/vox/distance.ogg
rename to sound/vox/distance.ogg
diff --git a/modular_citadel/sound/vox/distortion.ogg b/sound/vox/distortion.ogg
similarity index 100%
rename from modular_citadel/sound/vox/distortion.ogg
rename to sound/vox/distortion.ogg
diff --git a/modular_citadel/sound/vox/do.ogg b/sound/vox/do.ogg
similarity index 100%
rename from modular_citadel/sound/vox/do.ogg
rename to sound/vox/do.ogg
diff --git a/modular_citadel/sound/vox/doctor.ogg b/sound/vox/doctor.ogg
similarity index 100%
rename from modular_citadel/sound/vox/doctor.ogg
rename to sound/vox/doctor.ogg
diff --git a/modular_citadel/sound/vox/doop.ogg b/sound/vox/doop.ogg
similarity index 100%
rename from modular_citadel/sound/vox/doop.ogg
rename to sound/vox/doop.ogg
diff --git a/modular_citadel/sound/vox/door.ogg b/sound/vox/door.ogg
similarity index 100%
rename from modular_citadel/sound/vox/door.ogg
rename to sound/vox/door.ogg
diff --git a/modular_citadel/sound/vox/down.ogg b/sound/vox/down.ogg
similarity index 100%
rename from modular_citadel/sound/vox/down.ogg
rename to sound/vox/down.ogg
diff --git a/modular_citadel/sound/vox/dual.ogg b/sound/vox/dual.ogg
similarity index 100%
rename from modular_citadel/sound/vox/dual.ogg
rename to sound/vox/dual.ogg
diff --git a/modular_citadel/sound/vox/duct.ogg b/sound/vox/duct.ogg
similarity index 100%
rename from modular_citadel/sound/vox/duct.ogg
rename to sound/vox/duct.ogg
diff --git a/modular_citadel/sound/vox/e.ogg b/sound/vox/e.ogg
similarity index 100%
rename from modular_citadel/sound/vox/e.ogg
rename to sound/vox/e.ogg
diff --git a/modular_citadel/sound/vox/east.ogg b/sound/vox/east.ogg
similarity index 100%
rename from modular_citadel/sound/vox/east.ogg
rename to sound/vox/east.ogg
diff --git a/modular_citadel/sound/vox/echo.ogg b/sound/vox/echo.ogg
similarity index 100%
rename from modular_citadel/sound/vox/echo.ogg
rename to sound/vox/echo.ogg
diff --git a/modular_citadel/sound/vox/ed.ogg b/sound/vox/ed.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ed.ogg
rename to sound/vox/ed.ogg
diff --git a/modular_citadel/sound/vox/effect.ogg b/sound/vox/effect.ogg
similarity index 100%
rename from modular_citadel/sound/vox/effect.ogg
rename to sound/vox/effect.ogg
diff --git a/modular_citadel/sound/vox/egress.ogg b/sound/vox/egress.ogg
similarity index 100%
rename from modular_citadel/sound/vox/egress.ogg
rename to sound/vox/egress.ogg
diff --git a/modular_citadel/sound/vox/eight.ogg b/sound/vox/eight.ogg
similarity index 100%
rename from modular_citadel/sound/vox/eight.ogg
rename to sound/vox/eight.ogg
diff --git a/modular_citadel/sound/vox/eighteen.ogg b/sound/vox/eighteen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/eighteen.ogg
rename to sound/vox/eighteen.ogg
diff --git a/modular_citadel/sound/vox/eighty.ogg b/sound/vox/eighty.ogg
similarity index 100%
rename from modular_citadel/sound/vox/eighty.ogg
rename to sound/vox/eighty.ogg
diff --git a/modular_citadel/sound/vox/electric.ogg b/sound/vox/electric.ogg
similarity index 100%
rename from modular_citadel/sound/vox/electric.ogg
rename to sound/vox/electric.ogg
diff --git a/modular_citadel/sound/vox/electromagnetic.ogg b/sound/vox/electromagnetic.ogg
similarity index 100%
rename from modular_citadel/sound/vox/electromagnetic.ogg
rename to sound/vox/electromagnetic.ogg
diff --git a/modular_citadel/sound/vox/elevator.ogg b/sound/vox/elevator.ogg
similarity index 100%
rename from modular_citadel/sound/vox/elevator.ogg
rename to sound/vox/elevator.ogg
diff --git a/modular_citadel/sound/vox/eleven.ogg b/sound/vox/eleven.ogg
similarity index 100%
rename from modular_citadel/sound/vox/eleven.ogg
rename to sound/vox/eleven.ogg
diff --git a/modular_citadel/sound/vox/eliminate.ogg b/sound/vox/eliminate.ogg
similarity index 100%
rename from modular_citadel/sound/vox/eliminate.ogg
rename to sound/vox/eliminate.ogg
diff --git a/modular_citadel/sound/vox/emergency.ogg b/sound/vox/emergency.ogg
similarity index 100%
rename from modular_citadel/sound/vox/emergency.ogg
rename to sound/vox/emergency.ogg
diff --git a/modular_citadel/sound/vox/enemy.ogg b/sound/vox/enemy.ogg
similarity index 100%
rename from modular_citadel/sound/vox/enemy.ogg
rename to sound/vox/enemy.ogg
diff --git a/modular_citadel/sound/vox/energy.ogg b/sound/vox/energy.ogg
similarity index 100%
rename from modular_citadel/sound/vox/energy.ogg
rename to sound/vox/energy.ogg
diff --git a/modular_citadel/sound/vox/engage.ogg b/sound/vox/engage.ogg
similarity index 100%
rename from modular_citadel/sound/vox/engage.ogg
rename to sound/vox/engage.ogg
diff --git a/modular_citadel/sound/vox/engaged.ogg b/sound/vox/engaged.ogg
similarity index 100%
rename from modular_citadel/sound/vox/engaged.ogg
rename to sound/vox/engaged.ogg
diff --git a/modular_citadel/sound/vox/engine.ogg b/sound/vox/engine.ogg
similarity index 100%
rename from modular_citadel/sound/vox/engine.ogg
rename to sound/vox/engine.ogg
diff --git a/modular_citadel/sound/vox/enter.ogg b/sound/vox/enter.ogg
similarity index 100%
rename from modular_citadel/sound/vox/enter.ogg
rename to sound/vox/enter.ogg
diff --git a/modular_citadel/sound/vox/entry.ogg b/sound/vox/entry.ogg
similarity index 100%
rename from modular_citadel/sound/vox/entry.ogg
rename to sound/vox/entry.ogg
diff --git a/modular_citadel/sound/vox/environment.ogg b/sound/vox/environment.ogg
similarity index 100%
rename from modular_citadel/sound/vox/environment.ogg
rename to sound/vox/environment.ogg
diff --git a/modular_citadel/sound/vox/error.ogg b/sound/vox/error.ogg
similarity index 100%
rename from modular_citadel/sound/vox/error.ogg
rename to sound/vox/error.ogg
diff --git a/modular_citadel/sound/vox/escape.ogg b/sound/vox/escape.ogg
similarity index 100%
rename from modular_citadel/sound/vox/escape.ogg
rename to sound/vox/escape.ogg
diff --git a/modular_citadel/sound/vox/evacuate.ogg b/sound/vox/evacuate.ogg
similarity index 100%
rename from modular_citadel/sound/vox/evacuate.ogg
rename to sound/vox/evacuate.ogg
diff --git a/modular_citadel/sound/vox/exchange.ogg b/sound/vox/exchange.ogg
similarity index 100%
rename from modular_citadel/sound/vox/exchange.ogg
rename to sound/vox/exchange.ogg
diff --git a/modular_citadel/sound/vox/exit.ogg b/sound/vox/exit.ogg
similarity index 100%
rename from modular_citadel/sound/vox/exit.ogg
rename to sound/vox/exit.ogg
diff --git a/modular_citadel/sound/vox/expect.ogg b/sound/vox/expect.ogg
similarity index 100%
rename from modular_citadel/sound/vox/expect.ogg
rename to sound/vox/expect.ogg
diff --git a/modular_citadel/sound/vox/experiment.ogg b/sound/vox/experiment.ogg
similarity index 100%
rename from modular_citadel/sound/vox/experiment.ogg
rename to sound/vox/experiment.ogg
diff --git a/modular_citadel/sound/vox/experimental.ogg b/sound/vox/experimental.ogg
similarity index 100%
rename from modular_citadel/sound/vox/experimental.ogg
rename to sound/vox/experimental.ogg
diff --git a/modular_citadel/sound/vox/explode.ogg b/sound/vox/explode.ogg
similarity index 100%
rename from modular_citadel/sound/vox/explode.ogg
rename to sound/vox/explode.ogg
diff --git a/modular_citadel/sound/vox/explosion.ogg b/sound/vox/explosion.ogg
similarity index 100%
rename from modular_citadel/sound/vox/explosion.ogg
rename to sound/vox/explosion.ogg
diff --git a/modular_citadel/sound/vox/exposure.ogg b/sound/vox/exposure.ogg
similarity index 100%
rename from modular_citadel/sound/vox/exposure.ogg
rename to sound/vox/exposure.ogg
diff --git a/modular_citadel/sound/vox/exterminate.ogg b/sound/vox/exterminate.ogg
similarity index 100%
rename from modular_citadel/sound/vox/exterminate.ogg
rename to sound/vox/exterminate.ogg
diff --git a/modular_citadel/sound/vox/extinguish.ogg b/sound/vox/extinguish.ogg
similarity index 100%
rename from modular_citadel/sound/vox/extinguish.ogg
rename to sound/vox/extinguish.ogg
diff --git a/modular_citadel/sound/vox/extinguisher.ogg b/sound/vox/extinguisher.ogg
similarity index 100%
rename from modular_citadel/sound/vox/extinguisher.ogg
rename to sound/vox/extinguisher.ogg
diff --git a/modular_citadel/sound/vox/extreme.ogg b/sound/vox/extreme.ogg
similarity index 100%
rename from modular_citadel/sound/vox/extreme.ogg
rename to sound/vox/extreme.ogg
diff --git a/modular_citadel/sound/vox/f.ogg b/sound/vox/f.ogg
similarity index 100%
rename from modular_citadel/sound/vox/f.ogg
rename to sound/vox/f.ogg
diff --git a/modular_citadel/sound/vox/face.ogg b/sound/vox/face.ogg
similarity index 100%
rename from modular_citadel/sound/vox/face.ogg
rename to sound/vox/face.ogg
diff --git a/modular_citadel/sound/vox/facility.ogg b/sound/vox/facility.ogg
similarity index 100%
rename from modular_citadel/sound/vox/facility.ogg
rename to sound/vox/facility.ogg
diff --git a/modular_citadel/sound/vox/fahrenheit.ogg b/sound/vox/fahrenheit.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fahrenheit.ogg
rename to sound/vox/fahrenheit.ogg
diff --git a/modular_citadel/sound/vox/failed.ogg b/sound/vox/failed.ogg
similarity index 100%
rename from modular_citadel/sound/vox/failed.ogg
rename to sound/vox/failed.ogg
diff --git a/modular_citadel/sound/vox/failure.ogg b/sound/vox/failure.ogg
similarity index 100%
rename from modular_citadel/sound/vox/failure.ogg
rename to sound/vox/failure.ogg
diff --git a/modular_citadel/sound/vox/farthest.ogg b/sound/vox/farthest.ogg
similarity index 100%
rename from modular_citadel/sound/vox/farthest.ogg
rename to sound/vox/farthest.ogg
diff --git a/modular_citadel/sound/vox/fast.ogg b/sound/vox/fast.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fast.ogg
rename to sound/vox/fast.ogg
diff --git a/modular_citadel/sound/vox/feet.ogg b/sound/vox/feet.ogg
similarity index 100%
rename from modular_citadel/sound/vox/feet.ogg
rename to sound/vox/feet.ogg
diff --git a/modular_citadel/sound/vox/field.ogg b/sound/vox/field.ogg
similarity index 100%
rename from modular_citadel/sound/vox/field.ogg
rename to sound/vox/field.ogg
diff --git a/modular_citadel/sound/vox/fifteen.ogg b/sound/vox/fifteen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fifteen.ogg
rename to sound/vox/fifteen.ogg
diff --git a/modular_citadel/sound/vox/fifth.ogg b/sound/vox/fifth.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fifth.ogg
rename to sound/vox/fifth.ogg
diff --git a/modular_citadel/sound/vox/fifty.ogg b/sound/vox/fifty.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fifty.ogg
rename to sound/vox/fifty.ogg
diff --git a/modular_citadel/sound/vox/final.ogg b/sound/vox/final.ogg
similarity index 100%
rename from modular_citadel/sound/vox/final.ogg
rename to sound/vox/final.ogg
diff --git a/modular_citadel/sound/vox/fine.ogg b/sound/vox/fine.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fine.ogg
rename to sound/vox/fine.ogg
diff --git a/modular_citadel/sound/vox/fire.ogg b/sound/vox/fire.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fire.ogg
rename to sound/vox/fire.ogg
diff --git a/modular_citadel/sound/vox/first.ogg b/sound/vox/first.ogg
similarity index 100%
rename from modular_citadel/sound/vox/first.ogg
rename to sound/vox/first.ogg
diff --git a/modular_citadel/sound/vox/five.ogg b/sound/vox/five.ogg
similarity index 100%
rename from modular_citadel/sound/vox/five.ogg
rename to sound/vox/five.ogg
diff --git a/modular_citadel/sound/vox/flag.ogg b/sound/vox/flag.ogg
similarity index 100%
rename from modular_citadel/sound/vox/flag.ogg
rename to sound/vox/flag.ogg
diff --git a/modular_citadel/sound/vox/flooding.ogg b/sound/vox/flooding.ogg
similarity index 100%
rename from modular_citadel/sound/vox/flooding.ogg
rename to sound/vox/flooding.ogg
diff --git a/modular_citadel/sound/vox/floor.ogg b/sound/vox/floor.ogg
similarity index 100%
rename from modular_citadel/sound/vox/floor.ogg
rename to sound/vox/floor.ogg
diff --git a/modular_citadel/sound/vox/fool.ogg b/sound/vox/fool.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fool.ogg
rename to sound/vox/fool.ogg
diff --git a/modular_citadel/sound/vox/for.ogg b/sound/vox/for.ogg
similarity index 100%
rename from modular_citadel/sound/vox/for.ogg
rename to sound/vox/for.ogg
diff --git a/modular_citadel/sound/vox/forbidden.ogg b/sound/vox/forbidden.ogg
similarity index 100%
rename from modular_citadel/sound/vox/forbidden.ogg
rename to sound/vox/forbidden.ogg
diff --git a/modular_citadel/sound/vox/force.ogg b/sound/vox/force.ogg
similarity index 100%
rename from modular_citadel/sound/vox/force.ogg
rename to sound/vox/force.ogg
diff --git a/modular_citadel/sound/vox/forms.ogg b/sound/vox/forms.ogg
similarity index 100%
rename from modular_citadel/sound/vox/forms.ogg
rename to sound/vox/forms.ogg
diff --git a/modular_citadel/sound/vox/found.ogg b/sound/vox/found.ogg
similarity index 100%
rename from modular_citadel/sound/vox/found.ogg
rename to sound/vox/found.ogg
diff --git a/modular_citadel/sound/vox/four.ogg b/sound/vox/four.ogg
similarity index 100%
rename from modular_citadel/sound/vox/four.ogg
rename to sound/vox/four.ogg
diff --git a/modular_citadel/sound/vox/fourteen.ogg b/sound/vox/fourteen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fourteen.ogg
rename to sound/vox/fourteen.ogg
diff --git a/modular_citadel/sound/vox/fourth.ogg b/sound/vox/fourth.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fourth.ogg
rename to sound/vox/fourth.ogg
diff --git a/modular_citadel/sound/vox/fourty.ogg b/sound/vox/fourty.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fourty.ogg
rename to sound/vox/fourty.ogg
diff --git a/modular_citadel/sound/vox/foxtrot.ogg b/sound/vox/foxtrot.ogg
similarity index 100%
rename from modular_citadel/sound/vox/foxtrot.ogg
rename to sound/vox/foxtrot.ogg
diff --git a/modular_citadel/sound/vox/freeman.ogg b/sound/vox/freeman.ogg
similarity index 100%
rename from modular_citadel/sound/vox/freeman.ogg
rename to sound/vox/freeman.ogg
diff --git a/modular_citadel/sound/vox/freezer.ogg b/sound/vox/freezer.ogg
similarity index 100%
rename from modular_citadel/sound/vox/freezer.ogg
rename to sound/vox/freezer.ogg
diff --git a/modular_citadel/sound/vox/from.ogg b/sound/vox/from.ogg
similarity index 100%
rename from modular_citadel/sound/vox/from.ogg
rename to sound/vox/from.ogg
diff --git a/modular_citadel/sound/vox/front.ogg b/sound/vox/front.ogg
similarity index 100%
rename from modular_citadel/sound/vox/front.ogg
rename to sound/vox/front.ogg
diff --git a/modular_citadel/sound/vox/fuel.ogg b/sound/vox/fuel.ogg
similarity index 100%
rename from modular_citadel/sound/vox/fuel.ogg
rename to sound/vox/fuel.ogg
diff --git a/modular_citadel/sound/vox/g.ogg b/sound/vox/g.ogg
similarity index 100%
rename from modular_citadel/sound/vox/g.ogg
rename to sound/vox/g.ogg
diff --git a/modular_citadel/sound/vox/gay.ogg b/sound/vox/gay.ogg
similarity index 100%
rename from modular_citadel/sound/vox/gay.ogg
rename to sound/vox/gay.ogg
diff --git a/modular_citadel/sound/vox/get.ogg b/sound/vox/get.ogg
similarity index 100%
rename from modular_citadel/sound/vox/get.ogg
rename to sound/vox/get.ogg
diff --git a/modular_citadel/sound/vox/go.ogg b/sound/vox/go.ogg
similarity index 100%
rename from modular_citadel/sound/vox/go.ogg
rename to sound/vox/go.ogg
diff --git a/modular_citadel/sound/vox/going.ogg b/sound/vox/going.ogg
similarity index 100%
rename from modular_citadel/sound/vox/going.ogg
rename to sound/vox/going.ogg
diff --git a/modular_citadel/sound/vox/good.ogg b/sound/vox/good.ogg
similarity index 100%
rename from modular_citadel/sound/vox/good.ogg
rename to sound/vox/good.ogg
diff --git a/modular_citadel/sound/vox/goodbye.ogg b/sound/vox/goodbye.ogg
similarity index 100%
rename from modular_citadel/sound/vox/goodbye.ogg
rename to sound/vox/goodbye.ogg
diff --git a/modular_citadel/sound/vox/gordon.ogg b/sound/vox/gordon.ogg
similarity index 100%
rename from modular_citadel/sound/vox/gordon.ogg
rename to sound/vox/gordon.ogg
diff --git a/modular_citadel/sound/vox/got.ogg b/sound/vox/got.ogg
similarity index 100%
rename from modular_citadel/sound/vox/got.ogg
rename to sound/vox/got.ogg
diff --git a/modular_citadel/sound/vox/government.ogg b/sound/vox/government.ogg
similarity index 100%
rename from modular_citadel/sound/vox/government.ogg
rename to sound/vox/government.ogg
diff --git a/modular_citadel/sound/vox/granted.ogg b/sound/vox/granted.ogg
similarity index 100%
rename from modular_citadel/sound/vox/granted.ogg
rename to sound/vox/granted.ogg
diff --git a/modular_citadel/sound/vox/great.ogg b/sound/vox/great.ogg
similarity index 100%
rename from modular_citadel/sound/vox/great.ogg
rename to sound/vox/great.ogg
diff --git a/modular_citadel/sound/vox/green.ogg b/sound/vox/green.ogg
similarity index 100%
rename from modular_citadel/sound/vox/green.ogg
rename to sound/vox/green.ogg
diff --git a/modular_citadel/sound/vox/grenade.ogg b/sound/vox/grenade.ogg
similarity index 100%
rename from modular_citadel/sound/vox/grenade.ogg
rename to sound/vox/grenade.ogg
diff --git a/modular_citadel/sound/vox/guard.ogg b/sound/vox/guard.ogg
similarity index 100%
rename from modular_citadel/sound/vox/guard.ogg
rename to sound/vox/guard.ogg
diff --git a/modular_citadel/sound/vox/gulf.ogg b/sound/vox/gulf.ogg
similarity index 100%
rename from modular_citadel/sound/vox/gulf.ogg
rename to sound/vox/gulf.ogg
diff --git a/modular_citadel/sound/vox/gun.ogg b/sound/vox/gun.ogg
similarity index 100%
rename from modular_citadel/sound/vox/gun.ogg
rename to sound/vox/gun.ogg
diff --git a/modular_citadel/sound/vox/guthrie.ogg b/sound/vox/guthrie.ogg
similarity index 100%
rename from modular_citadel/sound/vox/guthrie.ogg
rename to sound/vox/guthrie.ogg
diff --git a/modular_citadel/sound/vox/handling.ogg b/sound/vox/handling.ogg
similarity index 100%
rename from modular_citadel/sound/vox/handling.ogg
rename to sound/vox/handling.ogg
diff --git a/modular_citadel/sound/vox/hangar.ogg b/sound/vox/hangar.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hangar.ogg
rename to sound/vox/hangar.ogg
diff --git a/modular_citadel/sound/vox/has.ogg b/sound/vox/has.ogg
similarity index 100%
rename from modular_citadel/sound/vox/has.ogg
rename to sound/vox/has.ogg
diff --git a/modular_citadel/sound/vox/have.ogg b/sound/vox/have.ogg
similarity index 100%
rename from modular_citadel/sound/vox/have.ogg
rename to sound/vox/have.ogg
diff --git a/modular_citadel/sound/vox/hazard.ogg b/sound/vox/hazard.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hazard.ogg
rename to sound/vox/hazard.ogg
diff --git a/modular_citadel/sound/vox/head.ogg b/sound/vox/head.ogg
similarity index 100%
rename from modular_citadel/sound/vox/head.ogg
rename to sound/vox/head.ogg
diff --git a/modular_citadel/sound/vox/health.ogg b/sound/vox/health.ogg
similarity index 100%
rename from modular_citadel/sound/vox/health.ogg
rename to sound/vox/health.ogg
diff --git a/modular_citadel/sound/vox/heat.ogg b/sound/vox/heat.ogg
similarity index 100%
rename from modular_citadel/sound/vox/heat.ogg
rename to sound/vox/heat.ogg
diff --git a/modular_citadel/sound/vox/helicopter.ogg b/sound/vox/helicopter.ogg
similarity index 100%
rename from modular_citadel/sound/vox/helicopter.ogg
rename to sound/vox/helicopter.ogg
diff --git a/modular_citadel/sound/vox/helium.ogg b/sound/vox/helium.ogg
similarity index 100%
rename from modular_citadel/sound/vox/helium.ogg
rename to sound/vox/helium.ogg
diff --git a/modular_citadel/sound/vox/hello.ogg b/sound/vox/hello.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hello.ogg
rename to sound/vox/hello.ogg
diff --git a/modular_citadel/sound/vox/help.ogg b/sound/vox/help.ogg
similarity index 100%
rename from modular_citadel/sound/vox/help.ogg
rename to sound/vox/help.ogg
diff --git a/modular_citadel/sound/vox/here.ogg b/sound/vox/here.ogg
similarity index 100%
rename from modular_citadel/sound/vox/here.ogg
rename to sound/vox/here.ogg
diff --git a/modular_citadel/sound/vox/hide.ogg b/sound/vox/hide.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hide.ogg
rename to sound/vox/hide.ogg
diff --git a/modular_citadel/sound/vox/high.ogg b/sound/vox/high.ogg
similarity index 100%
rename from modular_citadel/sound/vox/high.ogg
rename to sound/vox/high.ogg
diff --git a/modular_citadel/sound/vox/highest.ogg b/sound/vox/highest.ogg
similarity index 100%
rename from modular_citadel/sound/vox/highest.ogg
rename to sound/vox/highest.ogg
diff --git a/modular_citadel/sound/vox/hit.ogg b/sound/vox/hit.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hit.ogg
rename to sound/vox/hit.ogg
diff --git a/modular_citadel/sound/vox/holds.ogg b/sound/vox/holds.ogg
similarity index 100%
rename from modular_citadel/sound/vox/holds.ogg
rename to sound/vox/holds.ogg
diff --git a/modular_citadel/sound/vox/hole.ogg b/sound/vox/hole.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hole.ogg
rename to sound/vox/hole.ogg
diff --git a/modular_citadel/sound/vox/hostile.ogg b/sound/vox/hostile.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hostile.ogg
rename to sound/vox/hostile.ogg
diff --git a/modular_citadel/sound/vox/hot.ogg b/sound/vox/hot.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hot.ogg
rename to sound/vox/hot.ogg
diff --git a/modular_citadel/sound/vox/hotel.ogg b/sound/vox/hotel.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hotel.ogg
rename to sound/vox/hotel.ogg
diff --git a/modular_citadel/sound/vox/hour.ogg b/sound/vox/hour.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hour.ogg
rename to sound/vox/hour.ogg
diff --git a/modular_citadel/sound/vox/hours.ogg b/sound/vox/hours.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hours.ogg
rename to sound/vox/hours.ogg
diff --git a/modular_citadel/sound/vox/hundred.ogg b/sound/vox/hundred.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hundred.ogg
rename to sound/vox/hundred.ogg
diff --git a/modular_citadel/sound/vox/hydro.ogg b/sound/vox/hydro.ogg
similarity index 100%
rename from modular_citadel/sound/vox/hydro.ogg
rename to sound/vox/hydro.ogg
diff --git a/modular_citadel/sound/vox/i.ogg b/sound/vox/i.ogg
similarity index 100%
rename from modular_citadel/sound/vox/i.ogg
rename to sound/vox/i.ogg
diff --git a/modular_citadel/sound/vox/idiot.ogg b/sound/vox/idiot.ogg
similarity index 100%
rename from modular_citadel/sound/vox/idiot.ogg
rename to sound/vox/idiot.ogg
diff --git a/modular_citadel/sound/vox/illegal.ogg b/sound/vox/illegal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/illegal.ogg
rename to sound/vox/illegal.ogg
diff --git a/modular_citadel/sound/vox/immediate.ogg b/sound/vox/immediate.ogg
similarity index 100%
rename from modular_citadel/sound/vox/immediate.ogg
rename to sound/vox/immediate.ogg
diff --git a/modular_citadel/sound/vox/immediately.ogg b/sound/vox/immediately.ogg
similarity index 100%
rename from modular_citadel/sound/vox/immediately.ogg
rename to sound/vox/immediately.ogg
diff --git a/modular_citadel/sound/vox/in.ogg b/sound/vox/in.ogg
similarity index 100%
rename from modular_citadel/sound/vox/in.ogg
rename to sound/vox/in.ogg
diff --git a/modular_citadel/sound/vox/inches.ogg b/sound/vox/inches.ogg
similarity index 100%
rename from modular_citadel/sound/vox/inches.ogg
rename to sound/vox/inches.ogg
diff --git a/modular_citadel/sound/vox/india.ogg b/sound/vox/india.ogg
similarity index 100%
rename from modular_citadel/sound/vox/india.ogg
rename to sound/vox/india.ogg
diff --git a/modular_citadel/sound/vox/ing.ogg b/sound/vox/ing.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ing.ogg
rename to sound/vox/ing.ogg
diff --git a/modular_citadel/sound/vox/inoperative.ogg b/sound/vox/inoperative.ogg
similarity index 100%
rename from modular_citadel/sound/vox/inoperative.ogg
rename to sound/vox/inoperative.ogg
diff --git a/modular_citadel/sound/vox/inside.ogg b/sound/vox/inside.ogg
similarity index 100%
rename from modular_citadel/sound/vox/inside.ogg
rename to sound/vox/inside.ogg
diff --git a/modular_citadel/sound/vox/inspection.ogg b/sound/vox/inspection.ogg
similarity index 100%
rename from modular_citadel/sound/vox/inspection.ogg
rename to sound/vox/inspection.ogg
diff --git a/modular_citadel/sound/vox/inspector.ogg b/sound/vox/inspector.ogg
similarity index 100%
rename from modular_citadel/sound/vox/inspector.ogg
rename to sound/vox/inspector.ogg
diff --git a/modular_citadel/sound/vox/interchange.ogg b/sound/vox/interchange.ogg
similarity index 100%
rename from modular_citadel/sound/vox/interchange.ogg
rename to sound/vox/interchange.ogg
diff --git a/modular_citadel/sound/vox/intruder.ogg b/sound/vox/intruder.ogg
similarity index 100%
rename from modular_citadel/sound/vox/intruder.ogg
rename to sound/vox/intruder.ogg
diff --git a/modular_citadel/sound/vox/invallid.ogg b/sound/vox/invallid.ogg
similarity index 100%
rename from modular_citadel/sound/vox/invallid.ogg
rename to sound/vox/invallid.ogg
diff --git a/modular_citadel/sound/vox/invasion.ogg b/sound/vox/invasion.ogg
similarity index 100%
rename from modular_citadel/sound/vox/invasion.ogg
rename to sound/vox/invasion.ogg
diff --git a/modular_citadel/sound/vox/is.ogg b/sound/vox/is.ogg
similarity index 100%
rename from modular_citadel/sound/vox/is.ogg
rename to sound/vox/is.ogg
diff --git a/modular_citadel/sound/vox/it.ogg b/sound/vox/it.ogg
similarity index 100%
rename from modular_citadel/sound/vox/it.ogg
rename to sound/vox/it.ogg
diff --git a/modular_citadel/sound/vox/johnson.ogg b/sound/vox/johnson.ogg
similarity index 100%
rename from modular_citadel/sound/vox/johnson.ogg
rename to sound/vox/johnson.ogg
diff --git a/modular_citadel/sound/vox/juliet.ogg b/sound/vox/juliet.ogg
similarity index 100%
rename from modular_citadel/sound/vox/juliet.ogg
rename to sound/vox/juliet.ogg
diff --git a/modular_citadel/sound/vox/key.ogg b/sound/vox/key.ogg
similarity index 100%
rename from modular_citadel/sound/vox/key.ogg
rename to sound/vox/key.ogg
diff --git a/modular_citadel/sound/vox/kill.ogg b/sound/vox/kill.ogg
similarity index 100%
rename from modular_citadel/sound/vox/kill.ogg
rename to sound/vox/kill.ogg
diff --git a/modular_citadel/sound/vox/kilo.ogg b/sound/vox/kilo.ogg
similarity index 100%
rename from modular_citadel/sound/vox/kilo.ogg
rename to sound/vox/kilo.ogg
diff --git a/modular_citadel/sound/vox/kit.ogg b/sound/vox/kit.ogg
similarity index 100%
rename from modular_citadel/sound/vox/kit.ogg
rename to sound/vox/kit.ogg
diff --git a/modular_citadel/sound/vox/lab.ogg b/sound/vox/lab.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lab.ogg
rename to sound/vox/lab.ogg
diff --git a/modular_citadel/sound/vox/lambda.ogg b/sound/vox/lambda.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lambda.ogg
rename to sound/vox/lambda.ogg
diff --git a/modular_citadel/sound/vox/laser.ogg b/sound/vox/laser.ogg
similarity index 100%
rename from modular_citadel/sound/vox/laser.ogg
rename to sound/vox/laser.ogg
diff --git a/modular_citadel/sound/vox/last.ogg b/sound/vox/last.ogg
similarity index 100%
rename from modular_citadel/sound/vox/last.ogg
rename to sound/vox/last.ogg
diff --git a/modular_citadel/sound/vox/launch.ogg b/sound/vox/launch.ogg
similarity index 100%
rename from modular_citadel/sound/vox/launch.ogg
rename to sound/vox/launch.ogg
diff --git a/modular_citadel/sound/vox/leak.ogg b/sound/vox/leak.ogg
similarity index 100%
rename from modular_citadel/sound/vox/leak.ogg
rename to sound/vox/leak.ogg
diff --git a/modular_citadel/sound/vox/leave.ogg b/sound/vox/leave.ogg
similarity index 100%
rename from modular_citadel/sound/vox/leave.ogg
rename to sound/vox/leave.ogg
diff --git a/modular_citadel/sound/vox/left.ogg b/sound/vox/left.ogg
similarity index 100%
rename from modular_citadel/sound/vox/left.ogg
rename to sound/vox/left.ogg
diff --git a/modular_citadel/sound/vox/legal.ogg b/sound/vox/legal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/legal.ogg
rename to sound/vox/legal.ogg
diff --git a/modular_citadel/sound/vox/level.ogg b/sound/vox/level.ogg
similarity index 100%
rename from modular_citadel/sound/vox/level.ogg
rename to sound/vox/level.ogg
diff --git a/modular_citadel/sound/vox/lever.ogg b/sound/vox/lever.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lever.ogg
rename to sound/vox/lever.ogg
diff --git a/modular_citadel/sound/vox/lie.ogg b/sound/vox/lie.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lie.ogg
rename to sound/vox/lie.ogg
diff --git a/modular_citadel/sound/vox/lieutenant.ogg b/sound/vox/lieutenant.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lieutenant.ogg
rename to sound/vox/lieutenant.ogg
diff --git a/modular_citadel/sound/vox/life.ogg b/sound/vox/life.ogg
similarity index 100%
rename from modular_citadel/sound/vox/life.ogg
rename to sound/vox/life.ogg
diff --git a/modular_citadel/sound/vox/light.ogg b/sound/vox/light.ogg
similarity index 100%
rename from modular_citadel/sound/vox/light.ogg
rename to sound/vox/light.ogg
diff --git a/modular_citadel/sound/vox/lima.ogg b/sound/vox/lima.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lima.ogg
rename to sound/vox/lima.ogg
diff --git a/modular_citadel/sound/vox/liquid.ogg b/sound/vox/liquid.ogg
similarity index 100%
rename from modular_citadel/sound/vox/liquid.ogg
rename to sound/vox/liquid.ogg
diff --git a/modular_citadel/sound/vox/loading.ogg b/sound/vox/loading.ogg
similarity index 100%
rename from modular_citadel/sound/vox/loading.ogg
rename to sound/vox/loading.ogg
diff --git a/modular_citadel/sound/vox/locate.ogg b/sound/vox/locate.ogg
similarity index 100%
rename from modular_citadel/sound/vox/locate.ogg
rename to sound/vox/locate.ogg
diff --git a/modular_citadel/sound/vox/located.ogg b/sound/vox/located.ogg
similarity index 100%
rename from modular_citadel/sound/vox/located.ogg
rename to sound/vox/located.ogg
diff --git a/modular_citadel/sound/vox/location.ogg b/sound/vox/location.ogg
similarity index 100%
rename from modular_citadel/sound/vox/location.ogg
rename to sound/vox/location.ogg
diff --git a/modular_citadel/sound/vox/lock.ogg b/sound/vox/lock.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lock.ogg
rename to sound/vox/lock.ogg
diff --git a/modular_citadel/sound/vox/locked.ogg b/sound/vox/locked.ogg
similarity index 100%
rename from modular_citadel/sound/vox/locked.ogg
rename to sound/vox/locked.ogg
diff --git a/modular_citadel/sound/vox/locker.ogg b/sound/vox/locker.ogg
similarity index 100%
rename from modular_citadel/sound/vox/locker.ogg
rename to sound/vox/locker.ogg
diff --git a/modular_citadel/sound/vox/lockout.ogg b/sound/vox/lockout.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lockout.ogg
rename to sound/vox/lockout.ogg
diff --git a/modular_citadel/sound/vox/lower.ogg b/sound/vox/lower.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lower.ogg
rename to sound/vox/lower.ogg
diff --git a/modular_citadel/sound/vox/lowest.ogg b/sound/vox/lowest.ogg
similarity index 100%
rename from modular_citadel/sound/vox/lowest.ogg
rename to sound/vox/lowest.ogg
diff --git a/modular_citadel/sound/vox/magnetic.ogg b/sound/vox/magnetic.ogg
similarity index 100%
rename from modular_citadel/sound/vox/magnetic.ogg
rename to sound/vox/magnetic.ogg
diff --git a/modular_citadel/sound/vox/main.ogg b/sound/vox/main.ogg
similarity index 100%
rename from modular_citadel/sound/vox/main.ogg
rename to sound/vox/main.ogg
diff --git a/modular_citadel/sound/vox/maintenance.ogg b/sound/vox/maintenance.ogg
similarity index 100%
rename from modular_citadel/sound/vox/maintenance.ogg
rename to sound/vox/maintenance.ogg
diff --git a/modular_citadel/sound/vox/malfunction.ogg b/sound/vox/malfunction.ogg
similarity index 100%
rename from modular_citadel/sound/vox/malfunction.ogg
rename to sound/vox/malfunction.ogg
diff --git a/modular_citadel/sound/vox/man.ogg b/sound/vox/man.ogg
similarity index 100%
rename from modular_citadel/sound/vox/man.ogg
rename to sound/vox/man.ogg
diff --git a/modular_citadel/sound/vox/mass.ogg b/sound/vox/mass.ogg
similarity index 100%
rename from modular_citadel/sound/vox/mass.ogg
rename to sound/vox/mass.ogg
diff --git a/modular_citadel/sound/vox/materials.ogg b/sound/vox/materials.ogg
similarity index 100%
rename from modular_citadel/sound/vox/materials.ogg
rename to sound/vox/materials.ogg
diff --git a/modular_citadel/sound/vox/maximum.ogg b/sound/vox/maximum.ogg
similarity index 100%
rename from modular_citadel/sound/vox/maximum.ogg
rename to sound/vox/maximum.ogg
diff --git a/modular_citadel/sound/vox/may.ogg b/sound/vox/may.ogg
similarity index 100%
rename from modular_citadel/sound/vox/may.ogg
rename to sound/vox/may.ogg
diff --git a/modular_citadel/sound/vox/med.ogg b/sound/vox/med.ogg
similarity index 100%
rename from modular_citadel/sound/vox/med.ogg
rename to sound/vox/med.ogg
diff --git a/modular_citadel/sound/vox/medical.ogg b/sound/vox/medical.ogg
similarity index 100%
rename from modular_citadel/sound/vox/medical.ogg
rename to sound/vox/medical.ogg
diff --git a/modular_citadel/sound/vox/men.ogg b/sound/vox/men.ogg
similarity index 100%
rename from modular_citadel/sound/vox/men.ogg
rename to sound/vox/men.ogg
diff --git a/modular_citadel/sound/vox/mercy.ogg b/sound/vox/mercy.ogg
similarity index 100%
rename from modular_citadel/sound/vox/mercy.ogg
rename to sound/vox/mercy.ogg
diff --git a/modular_citadel/sound/vox/mesa.ogg b/sound/vox/mesa.ogg
similarity index 100%
rename from modular_citadel/sound/vox/mesa.ogg
rename to sound/vox/mesa.ogg
diff --git a/modular_citadel/sound/vox/message.ogg b/sound/vox/message.ogg
similarity index 100%
rename from modular_citadel/sound/vox/message.ogg
rename to sound/vox/message.ogg
diff --git a/modular_citadel/sound/vox/meter.ogg b/sound/vox/meter.ogg
similarity index 100%
rename from modular_citadel/sound/vox/meter.ogg
rename to sound/vox/meter.ogg
diff --git a/modular_citadel/sound/vox/micro.ogg b/sound/vox/micro.ogg
similarity index 100%
rename from modular_citadel/sound/vox/micro.ogg
rename to sound/vox/micro.ogg
diff --git a/modular_citadel/sound/vox/middle.ogg b/sound/vox/middle.ogg
similarity index 100%
rename from modular_citadel/sound/vox/middle.ogg
rename to sound/vox/middle.ogg
diff --git a/modular_citadel/sound/vox/mike.ogg b/sound/vox/mike.ogg
similarity index 100%
rename from modular_citadel/sound/vox/mike.ogg
rename to sound/vox/mike.ogg
diff --git a/modular_citadel/sound/vox/miles.ogg b/sound/vox/miles.ogg
similarity index 100%
rename from modular_citadel/sound/vox/miles.ogg
rename to sound/vox/miles.ogg
diff --git a/modular_citadel/sound/vox/military.ogg b/sound/vox/military.ogg
similarity index 100%
rename from modular_citadel/sound/vox/military.ogg
rename to sound/vox/military.ogg
diff --git a/modular_citadel/sound/vox/milli.ogg b/sound/vox/milli.ogg
similarity index 100%
rename from modular_citadel/sound/vox/milli.ogg
rename to sound/vox/milli.ogg
diff --git a/modular_citadel/sound/vox/million.ogg b/sound/vox/million.ogg
similarity index 100%
rename from modular_citadel/sound/vox/million.ogg
rename to sound/vox/million.ogg
diff --git a/modular_citadel/sound/vox/minefield.ogg b/sound/vox/minefield.ogg
similarity index 100%
rename from modular_citadel/sound/vox/minefield.ogg
rename to sound/vox/minefield.ogg
diff --git a/modular_citadel/sound/vox/minimum.ogg b/sound/vox/minimum.ogg
similarity index 100%
rename from modular_citadel/sound/vox/minimum.ogg
rename to sound/vox/minimum.ogg
diff --git a/modular_citadel/sound/vox/minutes.ogg b/sound/vox/minutes.ogg
similarity index 100%
rename from modular_citadel/sound/vox/minutes.ogg
rename to sound/vox/minutes.ogg
diff --git a/modular_citadel/sound/vox/mister.ogg b/sound/vox/mister.ogg
similarity index 100%
rename from modular_citadel/sound/vox/mister.ogg
rename to sound/vox/mister.ogg
diff --git a/modular_citadel/sound/vox/mode.ogg b/sound/vox/mode.ogg
similarity index 100%
rename from modular_citadel/sound/vox/mode.ogg
rename to sound/vox/mode.ogg
diff --git a/modular_citadel/sound/vox/motor.ogg b/sound/vox/motor.ogg
similarity index 100%
rename from modular_citadel/sound/vox/motor.ogg
rename to sound/vox/motor.ogg
diff --git a/modular_citadel/sound/vox/motorpool.ogg b/sound/vox/motorpool.ogg
similarity index 100%
rename from modular_citadel/sound/vox/motorpool.ogg
rename to sound/vox/motorpool.ogg
diff --git a/modular_citadel/sound/vox/move.ogg b/sound/vox/move.ogg
similarity index 100%
rename from modular_citadel/sound/vox/move.ogg
rename to sound/vox/move.ogg
diff --git a/modular_citadel/sound/vox/must.ogg b/sound/vox/must.ogg
similarity index 100%
rename from modular_citadel/sound/vox/must.ogg
rename to sound/vox/must.ogg
diff --git a/modular_citadel/sound/vox/nearest.ogg b/sound/vox/nearest.ogg
similarity index 100%
rename from modular_citadel/sound/vox/nearest.ogg
rename to sound/vox/nearest.ogg
diff --git a/modular_citadel/sound/vox/nice.ogg b/sound/vox/nice.ogg
similarity index 100%
rename from modular_citadel/sound/vox/nice.ogg
rename to sound/vox/nice.ogg
diff --git a/modular_citadel/sound/vox/nine.ogg b/sound/vox/nine.ogg
similarity index 100%
rename from modular_citadel/sound/vox/nine.ogg
rename to sound/vox/nine.ogg
diff --git a/modular_citadel/sound/vox/nineteen.ogg b/sound/vox/nineteen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/nineteen.ogg
rename to sound/vox/nineteen.ogg
diff --git a/modular_citadel/sound/vox/ninety.ogg b/sound/vox/ninety.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ninety.ogg
rename to sound/vox/ninety.ogg
diff --git a/modular_citadel/sound/vox/no.ogg b/sound/vox/no.ogg
similarity index 100%
rename from modular_citadel/sound/vox/no.ogg
rename to sound/vox/no.ogg
diff --git a/modular_citadel/sound/vox/nominal.ogg b/sound/vox/nominal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/nominal.ogg
rename to sound/vox/nominal.ogg
diff --git a/modular_citadel/sound/vox/north.ogg b/sound/vox/north.ogg
similarity index 100%
rename from modular_citadel/sound/vox/north.ogg
rename to sound/vox/north.ogg
diff --git a/modular_citadel/sound/vox/not.ogg b/sound/vox/not.ogg
similarity index 100%
rename from modular_citadel/sound/vox/not.ogg
rename to sound/vox/not.ogg
diff --git a/modular_citadel/sound/vox/november.ogg b/sound/vox/november.ogg
similarity index 100%
rename from modular_citadel/sound/vox/november.ogg
rename to sound/vox/november.ogg
diff --git a/modular_citadel/sound/vox/now.ogg b/sound/vox/now.ogg
similarity index 100%
rename from modular_citadel/sound/vox/now.ogg
rename to sound/vox/now.ogg
diff --git a/modular_citadel/sound/vox/number.ogg b/sound/vox/number.ogg
similarity index 100%
rename from modular_citadel/sound/vox/number.ogg
rename to sound/vox/number.ogg
diff --git a/modular_citadel/sound/vox/objective.ogg b/sound/vox/objective.ogg
similarity index 100%
rename from modular_citadel/sound/vox/objective.ogg
rename to sound/vox/objective.ogg
diff --git a/modular_citadel/sound/vox/observation.ogg b/sound/vox/observation.ogg
similarity index 100%
rename from modular_citadel/sound/vox/observation.ogg
rename to sound/vox/observation.ogg
diff --git a/modular_citadel/sound/vox/of.ogg b/sound/vox/of.ogg
similarity index 100%
rename from modular_citadel/sound/vox/of.ogg
rename to sound/vox/of.ogg
diff --git a/modular_citadel/sound/vox/officer.ogg b/sound/vox/officer.ogg
similarity index 100%
rename from modular_citadel/sound/vox/officer.ogg
rename to sound/vox/officer.ogg
diff --git a/modular_citadel/sound/vox/ok.ogg b/sound/vox/ok.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ok.ogg
rename to sound/vox/ok.ogg
diff --git a/modular_citadel/sound/vox/on.ogg b/sound/vox/on.ogg
similarity index 100%
rename from modular_citadel/sound/vox/on.ogg
rename to sound/vox/on.ogg
diff --git a/modular_citadel/sound/vox/one.ogg b/sound/vox/one.ogg
similarity index 100%
rename from modular_citadel/sound/vox/one.ogg
rename to sound/vox/one.ogg
diff --git a/modular_citadel/sound/vox/open.ogg b/sound/vox/open.ogg
similarity index 100%
rename from modular_citadel/sound/vox/open.ogg
rename to sound/vox/open.ogg
diff --git a/modular_citadel/sound/vox/operating.ogg b/sound/vox/operating.ogg
similarity index 100%
rename from modular_citadel/sound/vox/operating.ogg
rename to sound/vox/operating.ogg
diff --git a/modular_citadel/sound/vox/operations.ogg b/sound/vox/operations.ogg
similarity index 100%
rename from modular_citadel/sound/vox/operations.ogg
rename to sound/vox/operations.ogg
diff --git a/modular_citadel/sound/vox/operative.ogg b/sound/vox/operative.ogg
similarity index 100%
rename from modular_citadel/sound/vox/operative.ogg
rename to sound/vox/operative.ogg
diff --git a/modular_citadel/sound/vox/option.ogg b/sound/vox/option.ogg
similarity index 100%
rename from modular_citadel/sound/vox/option.ogg
rename to sound/vox/option.ogg
diff --git a/modular_citadel/sound/vox/order.ogg b/sound/vox/order.ogg
similarity index 100%
rename from modular_citadel/sound/vox/order.ogg
rename to sound/vox/order.ogg
diff --git a/modular_citadel/sound/vox/organic.ogg b/sound/vox/organic.ogg
similarity index 100%
rename from modular_citadel/sound/vox/organic.ogg
rename to sound/vox/organic.ogg
diff --git a/modular_citadel/sound/vox/oscar.ogg b/sound/vox/oscar.ogg
similarity index 100%
rename from modular_citadel/sound/vox/oscar.ogg
rename to sound/vox/oscar.ogg
diff --git a/modular_citadel/sound/vox/out.ogg b/sound/vox/out.ogg
similarity index 100%
rename from modular_citadel/sound/vox/out.ogg
rename to sound/vox/out.ogg
diff --git a/modular_citadel/sound/vox/outside.ogg b/sound/vox/outside.ogg
similarity index 100%
rename from modular_citadel/sound/vox/outside.ogg
rename to sound/vox/outside.ogg
diff --git a/modular_citadel/sound/vox/over.ogg b/sound/vox/over.ogg
similarity index 100%
rename from modular_citadel/sound/vox/over.ogg
rename to sound/vox/over.ogg
diff --git a/modular_citadel/sound/vox/overload.ogg b/sound/vox/overload.ogg
similarity index 100%
rename from modular_citadel/sound/vox/overload.ogg
rename to sound/vox/overload.ogg
diff --git a/modular_citadel/sound/vox/override.ogg b/sound/vox/override.ogg
similarity index 100%
rename from modular_citadel/sound/vox/override.ogg
rename to sound/vox/override.ogg
diff --git a/modular_citadel/sound/vox/pacify.ogg b/sound/vox/pacify.ogg
similarity index 100%
rename from modular_citadel/sound/vox/pacify.ogg
rename to sound/vox/pacify.ogg
diff --git a/modular_citadel/sound/vox/pain.ogg b/sound/vox/pain.ogg
similarity index 100%
rename from modular_citadel/sound/vox/pain.ogg
rename to sound/vox/pain.ogg
diff --git a/modular_citadel/sound/vox/pal.ogg b/sound/vox/pal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/pal.ogg
rename to sound/vox/pal.ogg
diff --git a/modular_citadel/sound/vox/panel.ogg b/sound/vox/panel.ogg
similarity index 100%
rename from modular_citadel/sound/vox/panel.ogg
rename to sound/vox/panel.ogg
diff --git a/modular_citadel/sound/vox/percent.ogg b/sound/vox/percent.ogg
similarity index 100%
rename from modular_citadel/sound/vox/percent.ogg
rename to sound/vox/percent.ogg
diff --git a/modular_citadel/sound/vox/perimeter.ogg b/sound/vox/perimeter.ogg
similarity index 100%
rename from modular_citadel/sound/vox/perimeter.ogg
rename to sound/vox/perimeter.ogg
diff --git a/modular_citadel/sound/vox/period.ogg b/sound/vox/period.ogg
similarity index 100%
rename from modular_citadel/sound/vox/period.ogg
rename to sound/vox/period.ogg
diff --git a/modular_citadel/sound/vox/permitted.ogg b/sound/vox/permitted.ogg
similarity index 100%
rename from modular_citadel/sound/vox/permitted.ogg
rename to sound/vox/permitted.ogg
diff --git a/modular_citadel/sound/vox/personnel.ogg b/sound/vox/personnel.ogg
similarity index 100%
rename from modular_citadel/sound/vox/personnel.ogg
rename to sound/vox/personnel.ogg
diff --git a/modular_citadel/sound/vox/pipe.ogg b/sound/vox/pipe.ogg
similarity index 100%
rename from modular_citadel/sound/vox/pipe.ogg
rename to sound/vox/pipe.ogg
diff --git a/modular_citadel/sound/vox/plant.ogg b/sound/vox/plant.ogg
similarity index 100%
rename from modular_citadel/sound/vox/plant.ogg
rename to sound/vox/plant.ogg
diff --git a/modular_citadel/sound/vox/platform.ogg b/sound/vox/platform.ogg
similarity index 100%
rename from modular_citadel/sound/vox/platform.ogg
rename to sound/vox/platform.ogg
diff --git a/modular_citadel/sound/vox/please.ogg b/sound/vox/please.ogg
similarity index 100%
rename from modular_citadel/sound/vox/please.ogg
rename to sound/vox/please.ogg
diff --git a/modular_citadel/sound/vox/point.ogg b/sound/vox/point.ogg
similarity index 100%
rename from modular_citadel/sound/vox/point.ogg
rename to sound/vox/point.ogg
diff --git a/modular_citadel/sound/vox/portal.ogg b/sound/vox/portal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/portal.ogg
rename to sound/vox/portal.ogg
diff --git a/modular_citadel/sound/vox/power.ogg b/sound/vox/power.ogg
similarity index 100%
rename from modular_citadel/sound/vox/power.ogg
rename to sound/vox/power.ogg
diff --git a/modular_citadel/sound/vox/presence.ogg b/sound/vox/presence.ogg
similarity index 100%
rename from modular_citadel/sound/vox/presence.ogg
rename to sound/vox/presence.ogg
diff --git a/modular_citadel/sound/vox/press.ogg b/sound/vox/press.ogg
similarity index 100%
rename from modular_citadel/sound/vox/press.ogg
rename to sound/vox/press.ogg
diff --git a/modular_citadel/sound/vox/primary.ogg b/sound/vox/primary.ogg
similarity index 100%
rename from modular_citadel/sound/vox/primary.ogg
rename to sound/vox/primary.ogg
diff --git a/modular_citadel/sound/vox/proceed.ogg b/sound/vox/proceed.ogg
similarity index 100%
rename from modular_citadel/sound/vox/proceed.ogg
rename to sound/vox/proceed.ogg
diff --git a/modular_citadel/sound/vox/processing.ogg b/sound/vox/processing.ogg
similarity index 100%
rename from modular_citadel/sound/vox/processing.ogg
rename to sound/vox/processing.ogg
diff --git a/modular_citadel/sound/vox/progress.ogg b/sound/vox/progress.ogg
similarity index 100%
rename from modular_citadel/sound/vox/progress.ogg
rename to sound/vox/progress.ogg
diff --git a/modular_citadel/sound/vox/proper.ogg b/sound/vox/proper.ogg
similarity index 100%
rename from modular_citadel/sound/vox/proper.ogg
rename to sound/vox/proper.ogg
diff --git a/modular_citadel/sound/vox/propulsion.ogg b/sound/vox/propulsion.ogg
similarity index 100%
rename from modular_citadel/sound/vox/propulsion.ogg
rename to sound/vox/propulsion.ogg
diff --git a/modular_citadel/sound/vox/prosecute.ogg b/sound/vox/prosecute.ogg
similarity index 100%
rename from modular_citadel/sound/vox/prosecute.ogg
rename to sound/vox/prosecute.ogg
diff --git a/modular_citadel/sound/vox/protective.ogg b/sound/vox/protective.ogg
similarity index 100%
rename from modular_citadel/sound/vox/protective.ogg
rename to sound/vox/protective.ogg
diff --git a/modular_citadel/sound/vox/push.ogg b/sound/vox/push.ogg
similarity index 100%
rename from modular_citadel/sound/vox/push.ogg
rename to sound/vox/push.ogg
diff --git a/modular_citadel/sound/vox/quantum.ogg b/sound/vox/quantum.ogg
similarity index 100%
rename from modular_citadel/sound/vox/quantum.ogg
rename to sound/vox/quantum.ogg
diff --git a/modular_citadel/sound/vox/quebec.ogg b/sound/vox/quebec.ogg
similarity index 100%
rename from modular_citadel/sound/vox/quebec.ogg
rename to sound/vox/quebec.ogg
diff --git a/modular_citadel/sound/vox/question.ogg b/sound/vox/question.ogg
similarity index 100%
rename from modular_citadel/sound/vox/question.ogg
rename to sound/vox/question.ogg
diff --git a/modular_citadel/sound/vox/questioning.ogg b/sound/vox/questioning.ogg
similarity index 100%
rename from modular_citadel/sound/vox/questioning.ogg
rename to sound/vox/questioning.ogg
diff --git a/modular_citadel/sound/vox/quick.ogg b/sound/vox/quick.ogg
similarity index 100%
rename from modular_citadel/sound/vox/quick.ogg
rename to sound/vox/quick.ogg
diff --git a/modular_citadel/sound/vox/quit.ogg b/sound/vox/quit.ogg
similarity index 100%
rename from modular_citadel/sound/vox/quit.ogg
rename to sound/vox/quit.ogg
diff --git a/modular_citadel/sound/vox/radiation.ogg b/sound/vox/radiation.ogg
similarity index 100%
rename from modular_citadel/sound/vox/radiation.ogg
rename to sound/vox/radiation.ogg
diff --git a/modular_citadel/sound/vox/radioactive.ogg b/sound/vox/radioactive.ogg
similarity index 100%
rename from modular_citadel/sound/vox/radioactive.ogg
rename to sound/vox/radioactive.ogg
diff --git a/modular_citadel/sound/vox/rads.ogg b/sound/vox/rads.ogg
similarity index 100%
rename from modular_citadel/sound/vox/rads.ogg
rename to sound/vox/rads.ogg
diff --git a/modular_citadel/sound/vox/rapid.ogg b/sound/vox/rapid.ogg
similarity index 100%
rename from modular_citadel/sound/vox/rapid.ogg
rename to sound/vox/rapid.ogg
diff --git a/modular_citadel/sound/vox/reach.ogg b/sound/vox/reach.ogg
similarity index 100%
rename from modular_citadel/sound/vox/reach.ogg
rename to sound/vox/reach.ogg
diff --git a/modular_citadel/sound/vox/reached.ogg b/sound/vox/reached.ogg
similarity index 100%
rename from modular_citadel/sound/vox/reached.ogg
rename to sound/vox/reached.ogg
diff --git a/modular_citadel/sound/vox/reactor.ogg b/sound/vox/reactor.ogg
similarity index 100%
rename from modular_citadel/sound/vox/reactor.ogg
rename to sound/vox/reactor.ogg
diff --git a/modular_citadel/sound/vox/red.ogg b/sound/vox/red.ogg
similarity index 100%
rename from modular_citadel/sound/vox/red.ogg
rename to sound/vox/red.ogg
diff --git a/modular_citadel/sound/vox/relay.ogg b/sound/vox/relay.ogg
similarity index 100%
rename from modular_citadel/sound/vox/relay.ogg
rename to sound/vox/relay.ogg
diff --git a/modular_citadel/sound/vox/released.ogg b/sound/vox/released.ogg
similarity index 100%
rename from modular_citadel/sound/vox/released.ogg
rename to sound/vox/released.ogg
diff --git a/modular_citadel/sound/vox/remaining.ogg b/sound/vox/remaining.ogg
similarity index 100%
rename from modular_citadel/sound/vox/remaining.ogg
rename to sound/vox/remaining.ogg
diff --git a/modular_citadel/sound/vox/renegade.ogg b/sound/vox/renegade.ogg
similarity index 100%
rename from modular_citadel/sound/vox/renegade.ogg
rename to sound/vox/renegade.ogg
diff --git a/modular_citadel/sound/vox/repair.ogg b/sound/vox/repair.ogg
similarity index 100%
rename from modular_citadel/sound/vox/repair.ogg
rename to sound/vox/repair.ogg
diff --git a/modular_citadel/sound/vox/report.ogg b/sound/vox/report.ogg
similarity index 100%
rename from modular_citadel/sound/vox/report.ogg
rename to sound/vox/report.ogg
diff --git a/modular_citadel/sound/vox/reports.ogg b/sound/vox/reports.ogg
similarity index 100%
rename from modular_citadel/sound/vox/reports.ogg
rename to sound/vox/reports.ogg
diff --git a/modular_citadel/sound/vox/required.ogg b/sound/vox/required.ogg
similarity index 100%
rename from modular_citadel/sound/vox/required.ogg
rename to sound/vox/required.ogg
diff --git a/modular_citadel/sound/vox/research.ogg b/sound/vox/research.ogg
similarity index 100%
rename from modular_citadel/sound/vox/research.ogg
rename to sound/vox/research.ogg
diff --git a/modular_citadel/sound/vox/reset.ogg b/sound/vox/reset.ogg
similarity index 100%
rename from modular_citadel/sound/vox/reset.ogg
rename to sound/vox/reset.ogg
diff --git a/modular_citadel/sound/vox/resevoir.ogg b/sound/vox/resevoir.ogg
similarity index 100%
rename from modular_citadel/sound/vox/resevoir.ogg
rename to sound/vox/resevoir.ogg
diff --git a/modular_citadel/sound/vox/resistance.ogg b/sound/vox/resistance.ogg
similarity index 100%
rename from modular_citadel/sound/vox/resistance.ogg
rename to sound/vox/resistance.ogg
diff --git a/modular_citadel/sound/vox/returned.ogg b/sound/vox/returned.ogg
similarity index 100%
rename from modular_citadel/sound/vox/returned.ogg
rename to sound/vox/returned.ogg
diff --git a/modular_citadel/sound/vox/right.ogg b/sound/vox/right.ogg
similarity index 100%
rename from modular_citadel/sound/vox/right.ogg
rename to sound/vox/right.ogg
diff --git a/modular_citadel/sound/vox/rocket.ogg b/sound/vox/rocket.ogg
similarity index 100%
rename from modular_citadel/sound/vox/rocket.ogg
rename to sound/vox/rocket.ogg
diff --git a/modular_citadel/sound/vox/roger.ogg b/sound/vox/roger.ogg
similarity index 100%
rename from modular_citadel/sound/vox/roger.ogg
rename to sound/vox/roger.ogg
diff --git a/modular_citadel/sound/vox/romeo.ogg b/sound/vox/romeo.ogg
similarity index 100%
rename from modular_citadel/sound/vox/romeo.ogg
rename to sound/vox/romeo.ogg
diff --git a/modular_citadel/sound/vox/room.ogg b/sound/vox/room.ogg
similarity index 100%
rename from modular_citadel/sound/vox/room.ogg
rename to sound/vox/room.ogg
diff --git a/modular_citadel/sound/vox/round.ogg b/sound/vox/round.ogg
similarity index 100%
rename from modular_citadel/sound/vox/round.ogg
rename to sound/vox/round.ogg
diff --git a/modular_citadel/sound/vox/run.ogg b/sound/vox/run.ogg
similarity index 100%
rename from modular_citadel/sound/vox/run.ogg
rename to sound/vox/run.ogg
diff --git a/modular_citadel/sound/vox/safe.ogg b/sound/vox/safe.ogg
similarity index 100%
rename from modular_citadel/sound/vox/safe.ogg
rename to sound/vox/safe.ogg
diff --git a/modular_citadel/sound/vox/safety.ogg b/sound/vox/safety.ogg
similarity index 100%
rename from modular_citadel/sound/vox/safety.ogg
rename to sound/vox/safety.ogg
diff --git a/modular_citadel/sound/vox/sargeant.ogg b/sound/vox/sargeant.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sargeant.ogg
rename to sound/vox/sargeant.ogg
diff --git a/modular_citadel/sound/vox/satellite.ogg b/sound/vox/satellite.ogg
similarity index 100%
rename from modular_citadel/sound/vox/satellite.ogg
rename to sound/vox/satellite.ogg
diff --git a/modular_citadel/sound/vox/save.ogg b/sound/vox/save.ogg
similarity index 100%
rename from modular_citadel/sound/vox/save.ogg
rename to sound/vox/save.ogg
diff --git a/modular_citadel/sound/vox/science.ogg b/sound/vox/science.ogg
similarity index 100%
rename from modular_citadel/sound/vox/science.ogg
rename to sound/vox/science.ogg
diff --git a/modular_citadel/sound/vox/scores.ogg b/sound/vox/scores.ogg
similarity index 100%
rename from modular_citadel/sound/vox/scores.ogg
rename to sound/vox/scores.ogg
diff --git a/modular_citadel/sound/vox/scream.ogg b/sound/vox/scream.ogg
similarity index 100%
rename from modular_citadel/sound/vox/scream.ogg
rename to sound/vox/scream.ogg
diff --git a/modular_citadel/sound/vox/screen.ogg b/sound/vox/screen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/screen.ogg
rename to sound/vox/screen.ogg
diff --git a/modular_citadel/sound/vox/search.ogg b/sound/vox/search.ogg
similarity index 100%
rename from modular_citadel/sound/vox/search.ogg
rename to sound/vox/search.ogg
diff --git a/modular_citadel/sound/vox/second.ogg b/sound/vox/second.ogg
similarity index 100%
rename from modular_citadel/sound/vox/second.ogg
rename to sound/vox/second.ogg
diff --git a/modular_citadel/sound/vox/secondary.ogg b/sound/vox/secondary.ogg
similarity index 100%
rename from modular_citadel/sound/vox/secondary.ogg
rename to sound/vox/secondary.ogg
diff --git a/modular_citadel/sound/vox/seconds.ogg b/sound/vox/seconds.ogg
similarity index 100%
rename from modular_citadel/sound/vox/seconds.ogg
rename to sound/vox/seconds.ogg
diff --git a/modular_citadel/sound/vox/sector.ogg b/sound/vox/sector.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sector.ogg
rename to sound/vox/sector.ogg
diff --git a/modular_citadel/sound/vox/secure.ogg b/sound/vox/secure.ogg
similarity index 100%
rename from modular_citadel/sound/vox/secure.ogg
rename to sound/vox/secure.ogg
diff --git a/modular_citadel/sound/vox/secured.ogg b/sound/vox/secured.ogg
similarity index 100%
rename from modular_citadel/sound/vox/secured.ogg
rename to sound/vox/secured.ogg
diff --git a/modular_citadel/sound/vox/security.ogg b/sound/vox/security.ogg
similarity index 100%
rename from modular_citadel/sound/vox/security.ogg
rename to sound/vox/security.ogg
diff --git a/modular_citadel/sound/vox/select.ogg b/sound/vox/select.ogg
similarity index 100%
rename from modular_citadel/sound/vox/select.ogg
rename to sound/vox/select.ogg
diff --git a/modular_citadel/sound/vox/selected.ogg b/sound/vox/selected.ogg
similarity index 100%
rename from modular_citadel/sound/vox/selected.ogg
rename to sound/vox/selected.ogg
diff --git a/modular_citadel/sound/vox/service.ogg b/sound/vox/service.ogg
similarity index 100%
rename from modular_citadel/sound/vox/service.ogg
rename to sound/vox/service.ogg
diff --git a/modular_citadel/sound/vox/seven.ogg b/sound/vox/seven.ogg
similarity index 100%
rename from modular_citadel/sound/vox/seven.ogg
rename to sound/vox/seven.ogg
diff --git a/modular_citadel/sound/vox/seventeen.ogg b/sound/vox/seventeen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/seventeen.ogg
rename to sound/vox/seventeen.ogg
diff --git a/modular_citadel/sound/vox/seventy.ogg b/sound/vox/seventy.ogg
similarity index 100%
rename from modular_citadel/sound/vox/seventy.ogg
rename to sound/vox/seventy.ogg
diff --git a/modular_citadel/sound/vox/severe.ogg b/sound/vox/severe.ogg
similarity index 100%
rename from modular_citadel/sound/vox/severe.ogg
rename to sound/vox/severe.ogg
diff --git a/modular_citadel/sound/vox/sewage.ogg b/sound/vox/sewage.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sewage.ogg
rename to sound/vox/sewage.ogg
diff --git a/modular_citadel/sound/vox/sewer.ogg b/sound/vox/sewer.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sewer.ogg
rename to sound/vox/sewer.ogg
diff --git a/modular_citadel/sound/vox/shield.ogg b/sound/vox/shield.ogg
similarity index 100%
rename from modular_citadel/sound/vox/shield.ogg
rename to sound/vox/shield.ogg
diff --git a/modular_citadel/sound/vox/shipment.ogg b/sound/vox/shipment.ogg
similarity index 100%
rename from modular_citadel/sound/vox/shipment.ogg
rename to sound/vox/shipment.ogg
diff --git a/modular_citadel/sound/vox/shock.ogg b/sound/vox/shock.ogg
similarity index 100%
rename from modular_citadel/sound/vox/shock.ogg
rename to sound/vox/shock.ogg
diff --git a/modular_citadel/sound/vox/shoot.ogg b/sound/vox/shoot.ogg
similarity index 100%
rename from modular_citadel/sound/vox/shoot.ogg
rename to sound/vox/shoot.ogg
diff --git a/modular_citadel/sound/vox/shower.ogg b/sound/vox/shower.ogg
similarity index 100%
rename from modular_citadel/sound/vox/shower.ogg
rename to sound/vox/shower.ogg
diff --git a/modular_citadel/sound/vox/shut.ogg b/sound/vox/shut.ogg
similarity index 100%
rename from modular_citadel/sound/vox/shut.ogg
rename to sound/vox/shut.ogg
diff --git a/modular_citadel/sound/vox/side.ogg b/sound/vox/side.ogg
similarity index 100%
rename from modular_citadel/sound/vox/side.ogg
rename to sound/vox/side.ogg
diff --git a/modular_citadel/sound/vox/sierra.ogg b/sound/vox/sierra.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sierra.ogg
rename to sound/vox/sierra.ogg
diff --git a/modular_citadel/sound/vox/sight.ogg b/sound/vox/sight.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sight.ogg
rename to sound/vox/sight.ogg
diff --git a/modular_citadel/sound/vox/silo.ogg b/sound/vox/silo.ogg
similarity index 100%
rename from modular_citadel/sound/vox/silo.ogg
rename to sound/vox/silo.ogg
diff --git a/modular_citadel/sound/vox/six.ogg b/sound/vox/six.ogg
similarity index 100%
rename from modular_citadel/sound/vox/six.ogg
rename to sound/vox/six.ogg
diff --git a/modular_citadel/sound/vox/sixteen.ogg b/sound/vox/sixteen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sixteen.ogg
rename to sound/vox/sixteen.ogg
diff --git a/modular_citadel/sound/vox/sixty.ogg b/sound/vox/sixty.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sixty.ogg
rename to sound/vox/sixty.ogg
diff --git a/modular_citadel/sound/vox/slime.ogg b/sound/vox/slime.ogg
similarity index 100%
rename from modular_citadel/sound/vox/slime.ogg
rename to sound/vox/slime.ogg
diff --git a/modular_citadel/sound/vox/slow.ogg b/sound/vox/slow.ogg
similarity index 100%
rename from modular_citadel/sound/vox/slow.ogg
rename to sound/vox/slow.ogg
diff --git a/modular_citadel/sound/vox/soldier.ogg b/sound/vox/soldier.ogg
similarity index 100%
rename from modular_citadel/sound/vox/soldier.ogg
rename to sound/vox/soldier.ogg
diff --git a/modular_citadel/sound/vox/some.ogg b/sound/vox/some.ogg
similarity index 100%
rename from modular_citadel/sound/vox/some.ogg
rename to sound/vox/some.ogg
diff --git a/modular_citadel/sound/vox/someone.ogg b/sound/vox/someone.ogg
similarity index 100%
rename from modular_citadel/sound/vox/someone.ogg
rename to sound/vox/someone.ogg
diff --git a/modular_citadel/sound/vox/something.ogg b/sound/vox/something.ogg
similarity index 100%
rename from modular_citadel/sound/vox/something.ogg
rename to sound/vox/something.ogg
diff --git a/modular_citadel/sound/vox/son.ogg b/sound/vox/son.ogg
similarity index 100%
rename from modular_citadel/sound/vox/son.ogg
rename to sound/vox/son.ogg
diff --git a/modular_citadel/sound/vox/sorry.ogg b/sound/vox/sorry.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sorry.ogg
rename to sound/vox/sorry.ogg
diff --git a/modular_citadel/sound/vox/south.ogg b/sound/vox/south.ogg
similarity index 100%
rename from modular_citadel/sound/vox/south.ogg
rename to sound/vox/south.ogg
diff --git a/modular_citadel/sound/vox/squad.ogg b/sound/vox/squad.ogg
similarity index 100%
rename from modular_citadel/sound/vox/squad.ogg
rename to sound/vox/squad.ogg
diff --git a/modular_citadel/sound/vox/square.ogg b/sound/vox/square.ogg
similarity index 100%
rename from modular_citadel/sound/vox/square.ogg
rename to sound/vox/square.ogg
diff --git a/modular_citadel/sound/vox/stairway.ogg b/sound/vox/stairway.ogg
similarity index 100%
rename from modular_citadel/sound/vox/stairway.ogg
rename to sound/vox/stairway.ogg
diff --git a/modular_citadel/sound/vox/status.ogg b/sound/vox/status.ogg
similarity index 100%
rename from modular_citadel/sound/vox/status.ogg
rename to sound/vox/status.ogg
diff --git a/modular_citadel/sound/vox/sterile.ogg b/sound/vox/sterile.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sterile.ogg
rename to sound/vox/sterile.ogg
diff --git a/modular_citadel/sound/vox/sterilization.ogg b/sound/vox/sterilization.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sterilization.ogg
rename to sound/vox/sterilization.ogg
diff --git a/modular_citadel/sound/vox/stolen.ogg b/sound/vox/stolen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/stolen.ogg
rename to sound/vox/stolen.ogg
diff --git a/modular_citadel/sound/vox/storage.ogg b/sound/vox/storage.ogg
similarity index 100%
rename from modular_citadel/sound/vox/storage.ogg
rename to sound/vox/storage.ogg
diff --git a/modular_citadel/sound/vox/sub.ogg b/sound/vox/sub.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sub.ogg
rename to sound/vox/sub.ogg
diff --git a/modular_citadel/sound/vox/subsurface.ogg b/sound/vox/subsurface.ogg
similarity index 100%
rename from modular_citadel/sound/vox/subsurface.ogg
rename to sound/vox/subsurface.ogg
diff --git a/modular_citadel/sound/vox/sudden.ogg b/sound/vox/sudden.ogg
similarity index 100%
rename from modular_citadel/sound/vox/sudden.ogg
rename to sound/vox/sudden.ogg
diff --git a/modular_citadel/sound/vox/suit.ogg b/sound/vox/suit.ogg
similarity index 100%
rename from modular_citadel/sound/vox/suit.ogg
rename to sound/vox/suit.ogg
diff --git a/modular_citadel/sound/vox/superconducting.ogg b/sound/vox/superconducting.ogg
similarity index 100%
rename from modular_citadel/sound/vox/superconducting.ogg
rename to sound/vox/superconducting.ogg
diff --git a/modular_citadel/sound/vox/supercooled.ogg b/sound/vox/supercooled.ogg
similarity index 100%
rename from modular_citadel/sound/vox/supercooled.ogg
rename to sound/vox/supercooled.ogg
diff --git a/modular_citadel/sound/vox/supply.ogg b/sound/vox/supply.ogg
similarity index 100%
rename from modular_citadel/sound/vox/supply.ogg
rename to sound/vox/supply.ogg
diff --git a/modular_citadel/sound/vox/surface.ogg b/sound/vox/surface.ogg
similarity index 100%
rename from modular_citadel/sound/vox/surface.ogg
rename to sound/vox/surface.ogg
diff --git a/modular_citadel/sound/vox/surrender.ogg b/sound/vox/surrender.ogg
similarity index 100%
rename from modular_citadel/sound/vox/surrender.ogg
rename to sound/vox/surrender.ogg
diff --git a/modular_citadel/sound/vox/surround.ogg b/sound/vox/surround.ogg
similarity index 100%
rename from modular_citadel/sound/vox/surround.ogg
rename to sound/vox/surround.ogg
diff --git a/modular_citadel/sound/vox/surrounded.ogg b/sound/vox/surrounded.ogg
similarity index 100%
rename from modular_citadel/sound/vox/surrounded.ogg
rename to sound/vox/surrounded.ogg
diff --git a/modular_citadel/sound/vox/switch.ogg b/sound/vox/switch.ogg
similarity index 100%
rename from modular_citadel/sound/vox/switch.ogg
rename to sound/vox/switch.ogg
diff --git a/modular_citadel/sound/vox/system.ogg b/sound/vox/system.ogg
similarity index 100%
rename from modular_citadel/sound/vox/system.ogg
rename to sound/vox/system.ogg
diff --git a/modular_citadel/sound/vox/systems.ogg b/sound/vox/systems.ogg
similarity index 100%
rename from modular_citadel/sound/vox/systems.ogg
rename to sound/vox/systems.ogg
diff --git a/modular_citadel/sound/vox/tactical.ogg b/sound/vox/tactical.ogg
similarity index 100%
rename from modular_citadel/sound/vox/tactical.ogg
rename to sound/vox/tactical.ogg
diff --git a/modular_citadel/sound/vox/take.ogg b/sound/vox/take.ogg
similarity index 100%
rename from modular_citadel/sound/vox/take.ogg
rename to sound/vox/take.ogg
diff --git a/modular_citadel/sound/vox/talk.ogg b/sound/vox/talk.ogg
similarity index 100%
rename from modular_citadel/sound/vox/talk.ogg
rename to sound/vox/talk.ogg
diff --git a/modular_citadel/sound/vox/tango.ogg b/sound/vox/tango.ogg
similarity index 100%
rename from modular_citadel/sound/vox/tango.ogg
rename to sound/vox/tango.ogg
diff --git a/modular_citadel/sound/vox/tank.ogg b/sound/vox/tank.ogg
similarity index 100%
rename from modular_citadel/sound/vox/tank.ogg
rename to sound/vox/tank.ogg
diff --git a/modular_citadel/sound/vox/target.ogg b/sound/vox/target.ogg
similarity index 100%
rename from modular_citadel/sound/vox/target.ogg
rename to sound/vox/target.ogg
diff --git a/modular_citadel/sound/vox/team.ogg b/sound/vox/team.ogg
similarity index 100%
rename from modular_citadel/sound/vox/team.ogg
rename to sound/vox/team.ogg
diff --git a/modular_citadel/sound/vox/temperature.ogg b/sound/vox/temperature.ogg
similarity index 100%
rename from modular_citadel/sound/vox/temperature.ogg
rename to sound/vox/temperature.ogg
diff --git a/modular_citadel/sound/vox/temporal.ogg b/sound/vox/temporal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/temporal.ogg
rename to sound/vox/temporal.ogg
diff --git a/modular_citadel/sound/vox/ten.ogg b/sound/vox/ten.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ten.ogg
rename to sound/vox/ten.ogg
diff --git a/modular_citadel/sound/vox/terminal.ogg b/sound/vox/terminal.ogg
similarity index 100%
rename from modular_citadel/sound/vox/terminal.ogg
rename to sound/vox/terminal.ogg
diff --git a/modular_citadel/sound/vox/terminated.ogg b/sound/vox/terminated.ogg
similarity index 100%
rename from modular_citadel/sound/vox/terminated.ogg
rename to sound/vox/terminated.ogg
diff --git a/modular_citadel/sound/vox/termination.ogg b/sound/vox/termination.ogg
similarity index 100%
rename from modular_citadel/sound/vox/termination.ogg
rename to sound/vox/termination.ogg
diff --git a/modular_citadel/sound/vox/test.ogg b/sound/vox/test.ogg
similarity index 100%
rename from modular_citadel/sound/vox/test.ogg
rename to sound/vox/test.ogg
diff --git a/modular_citadel/sound/vox/that.ogg b/sound/vox/that.ogg
similarity index 100%
rename from modular_citadel/sound/vox/that.ogg
rename to sound/vox/that.ogg
diff --git a/modular_citadel/sound/vox/the.ogg b/sound/vox/the.ogg
similarity index 100%
rename from modular_citadel/sound/vox/the.ogg
rename to sound/vox/the.ogg
diff --git a/modular_citadel/sound/vox/then.ogg b/sound/vox/then.ogg
similarity index 100%
rename from modular_citadel/sound/vox/then.ogg
rename to sound/vox/then.ogg
diff --git a/modular_citadel/sound/vox/there.ogg b/sound/vox/there.ogg
similarity index 100%
rename from modular_citadel/sound/vox/there.ogg
rename to sound/vox/there.ogg
diff --git a/modular_citadel/sound/vox/third.ogg b/sound/vox/third.ogg
similarity index 100%
rename from modular_citadel/sound/vox/third.ogg
rename to sound/vox/third.ogg
diff --git a/modular_citadel/sound/vox/thirteen.ogg b/sound/vox/thirteen.ogg
similarity index 100%
rename from modular_citadel/sound/vox/thirteen.ogg
rename to sound/vox/thirteen.ogg
diff --git a/modular_citadel/sound/vox/thirty.ogg b/sound/vox/thirty.ogg
similarity index 100%
rename from modular_citadel/sound/vox/thirty.ogg
rename to sound/vox/thirty.ogg
diff --git a/modular_citadel/sound/vox/this.ogg b/sound/vox/this.ogg
similarity index 100%
rename from modular_citadel/sound/vox/this.ogg
rename to sound/vox/this.ogg
diff --git a/modular_citadel/sound/vox/those.ogg b/sound/vox/those.ogg
similarity index 100%
rename from modular_citadel/sound/vox/those.ogg
rename to sound/vox/those.ogg
diff --git a/modular_citadel/sound/vox/thousand.ogg b/sound/vox/thousand.ogg
similarity index 100%
rename from modular_citadel/sound/vox/thousand.ogg
rename to sound/vox/thousand.ogg
diff --git a/modular_citadel/sound/vox/threat.ogg b/sound/vox/threat.ogg
similarity index 100%
rename from modular_citadel/sound/vox/threat.ogg
rename to sound/vox/threat.ogg
diff --git a/modular_citadel/sound/vox/three.ogg b/sound/vox/three.ogg
similarity index 100%
rename from modular_citadel/sound/vox/three.ogg
rename to sound/vox/three.ogg
diff --git a/modular_citadel/sound/vox/through.ogg b/sound/vox/through.ogg
similarity index 100%
rename from modular_citadel/sound/vox/through.ogg
rename to sound/vox/through.ogg
diff --git a/modular_citadel/sound/vox/time.ogg b/sound/vox/time.ogg
similarity index 100%
rename from modular_citadel/sound/vox/time.ogg
rename to sound/vox/time.ogg
diff --git a/modular_citadel/sound/vox/to.ogg b/sound/vox/to.ogg
similarity index 100%
rename from modular_citadel/sound/vox/to.ogg
rename to sound/vox/to.ogg
diff --git a/modular_citadel/sound/vox/top.ogg b/sound/vox/top.ogg
similarity index 100%
rename from modular_citadel/sound/vox/top.ogg
rename to sound/vox/top.ogg
diff --git a/modular_citadel/sound/vox/topside.ogg b/sound/vox/topside.ogg
similarity index 100%
rename from modular_citadel/sound/vox/topside.ogg
rename to sound/vox/topside.ogg
diff --git a/modular_citadel/sound/vox/touch.ogg b/sound/vox/touch.ogg
similarity index 100%
rename from modular_citadel/sound/vox/touch.ogg
rename to sound/vox/touch.ogg
diff --git a/modular_citadel/sound/vox/towards.ogg b/sound/vox/towards.ogg
similarity index 100%
rename from modular_citadel/sound/vox/towards.ogg
rename to sound/vox/towards.ogg
diff --git a/modular_citadel/sound/vox/track.ogg b/sound/vox/track.ogg
similarity index 100%
rename from modular_citadel/sound/vox/track.ogg
rename to sound/vox/track.ogg
diff --git a/modular_citadel/sound/vox/train.ogg b/sound/vox/train.ogg
similarity index 100%
rename from modular_citadel/sound/vox/train.ogg
rename to sound/vox/train.ogg
diff --git a/modular_citadel/sound/vox/transportation.ogg b/sound/vox/transportation.ogg
similarity index 100%
rename from modular_citadel/sound/vox/transportation.ogg
rename to sound/vox/transportation.ogg
diff --git a/modular_citadel/sound/vox/truck.ogg b/sound/vox/truck.ogg
similarity index 100%
rename from modular_citadel/sound/vox/truck.ogg
rename to sound/vox/truck.ogg
diff --git a/modular_citadel/sound/vox/tunnel.ogg b/sound/vox/tunnel.ogg
similarity index 100%
rename from modular_citadel/sound/vox/tunnel.ogg
rename to sound/vox/tunnel.ogg
diff --git a/modular_citadel/sound/vox/turn.ogg b/sound/vox/turn.ogg
similarity index 100%
rename from modular_citadel/sound/vox/turn.ogg
rename to sound/vox/turn.ogg
diff --git a/modular_citadel/sound/vox/turret.ogg b/sound/vox/turret.ogg
similarity index 100%
rename from modular_citadel/sound/vox/turret.ogg
rename to sound/vox/turret.ogg
diff --git a/modular_citadel/sound/vox/twelve.ogg b/sound/vox/twelve.ogg
similarity index 100%
rename from modular_citadel/sound/vox/twelve.ogg
rename to sound/vox/twelve.ogg
diff --git a/modular_citadel/sound/vox/twenty.ogg b/sound/vox/twenty.ogg
similarity index 100%
rename from modular_citadel/sound/vox/twenty.ogg
rename to sound/vox/twenty.ogg
diff --git a/modular_citadel/sound/vox/two.ogg b/sound/vox/two.ogg
similarity index 100%
rename from modular_citadel/sound/vox/two.ogg
rename to sound/vox/two.ogg
diff --git a/modular_citadel/sound/vox/unauthorized.ogg b/sound/vox/unauthorized.ogg
similarity index 100%
rename from modular_citadel/sound/vox/unauthorized.ogg
rename to sound/vox/unauthorized.ogg
diff --git a/modular_citadel/sound/vox/under.ogg b/sound/vox/under.ogg
similarity index 100%
rename from modular_citadel/sound/vox/under.ogg
rename to sound/vox/under.ogg
diff --git a/modular_citadel/sound/vox/uniform.ogg b/sound/vox/uniform.ogg
similarity index 100%
rename from modular_citadel/sound/vox/uniform.ogg
rename to sound/vox/uniform.ogg
diff --git a/modular_citadel/sound/vox/unlocked.ogg b/sound/vox/unlocked.ogg
similarity index 100%
rename from modular_citadel/sound/vox/unlocked.ogg
rename to sound/vox/unlocked.ogg
diff --git a/modular_citadel/sound/vox/until.ogg b/sound/vox/until.ogg
similarity index 100%
rename from modular_citadel/sound/vox/until.ogg
rename to sound/vox/until.ogg
diff --git a/modular_citadel/sound/vox/up.ogg b/sound/vox/up.ogg
similarity index 100%
rename from modular_citadel/sound/vox/up.ogg
rename to sound/vox/up.ogg
diff --git a/modular_citadel/sound/vox/upper.ogg b/sound/vox/upper.ogg
similarity index 100%
rename from modular_citadel/sound/vox/upper.ogg
rename to sound/vox/upper.ogg
diff --git a/modular_citadel/sound/vox/uranium.ogg b/sound/vox/uranium.ogg
similarity index 100%
rename from modular_citadel/sound/vox/uranium.ogg
rename to sound/vox/uranium.ogg
diff --git a/modular_citadel/sound/vox/us.ogg b/sound/vox/us.ogg
similarity index 100%
rename from modular_citadel/sound/vox/us.ogg
rename to sound/vox/us.ogg
diff --git a/modular_citadel/sound/vox/usa.ogg b/sound/vox/usa.ogg
similarity index 100%
rename from modular_citadel/sound/vox/usa.ogg
rename to sound/vox/usa.ogg
diff --git a/modular_citadel/sound/vox/use.ogg b/sound/vox/use.ogg
similarity index 100%
rename from modular_citadel/sound/vox/use.ogg
rename to sound/vox/use.ogg
diff --git a/modular_citadel/sound/vox/used.ogg b/sound/vox/used.ogg
similarity index 100%
rename from modular_citadel/sound/vox/used.ogg
rename to sound/vox/used.ogg
diff --git a/modular_citadel/sound/vox/user.ogg b/sound/vox/user.ogg
similarity index 100%
rename from modular_citadel/sound/vox/user.ogg
rename to sound/vox/user.ogg
diff --git a/modular_citadel/sound/vox/vacate.ogg b/sound/vox/vacate.ogg
similarity index 100%
rename from modular_citadel/sound/vox/vacate.ogg
rename to sound/vox/vacate.ogg
diff --git a/modular_citadel/sound/vox/valid.ogg b/sound/vox/valid.ogg
similarity index 100%
rename from modular_citadel/sound/vox/valid.ogg
rename to sound/vox/valid.ogg
diff --git a/modular_citadel/sound/vox/vapor.ogg b/sound/vox/vapor.ogg
similarity index 100%
rename from modular_citadel/sound/vox/vapor.ogg
rename to sound/vox/vapor.ogg
diff --git a/modular_citadel/sound/vox/vent.ogg b/sound/vox/vent.ogg
similarity index 100%
rename from modular_citadel/sound/vox/vent.ogg
rename to sound/vox/vent.ogg
diff --git a/modular_citadel/sound/vox/ventillation.ogg b/sound/vox/ventillation.ogg
similarity index 100%
rename from modular_citadel/sound/vox/ventillation.ogg
rename to sound/vox/ventillation.ogg
diff --git a/modular_citadel/sound/vox/victor.ogg b/sound/vox/victor.ogg
similarity index 100%
rename from modular_citadel/sound/vox/victor.ogg
rename to sound/vox/victor.ogg
diff --git a/modular_citadel/sound/vox/violated.ogg b/sound/vox/violated.ogg
similarity index 100%
rename from modular_citadel/sound/vox/violated.ogg
rename to sound/vox/violated.ogg
diff --git a/modular_citadel/sound/vox/violation.ogg b/sound/vox/violation.ogg
similarity index 100%
rename from modular_citadel/sound/vox/violation.ogg
rename to sound/vox/violation.ogg
diff --git a/modular_citadel/sound/vox/voltage.ogg b/sound/vox/voltage.ogg
similarity index 100%
rename from modular_citadel/sound/vox/voltage.ogg
rename to sound/vox/voltage.ogg
diff --git a/modular_citadel/sound/vox/vox_login.ogg b/sound/vox/vox_login.ogg
similarity index 100%
rename from modular_citadel/sound/vox/vox_login.ogg
rename to sound/vox/vox_login.ogg
diff --git a/modular_citadel/sound/vox/walk.ogg b/sound/vox/walk.ogg
similarity index 100%
rename from modular_citadel/sound/vox/walk.ogg
rename to sound/vox/walk.ogg
diff --git a/modular_citadel/sound/vox/wall.ogg b/sound/vox/wall.ogg
similarity index 100%
rename from modular_citadel/sound/vox/wall.ogg
rename to sound/vox/wall.ogg
diff --git a/modular_citadel/sound/vox/want.ogg b/sound/vox/want.ogg
similarity index 100%
rename from modular_citadel/sound/vox/want.ogg
rename to sound/vox/want.ogg
diff --git a/modular_citadel/sound/vox/wanted.ogg b/sound/vox/wanted.ogg
similarity index 100%
rename from modular_citadel/sound/vox/wanted.ogg
rename to sound/vox/wanted.ogg
diff --git a/modular_citadel/sound/vox/warm.ogg b/sound/vox/warm.ogg
similarity index 100%
rename from modular_citadel/sound/vox/warm.ogg
rename to sound/vox/warm.ogg
diff --git a/modular_citadel/sound/vox/warn.ogg b/sound/vox/warn.ogg
similarity index 100%
rename from modular_citadel/sound/vox/warn.ogg
rename to sound/vox/warn.ogg
diff --git a/modular_citadel/sound/vox/warning.ogg b/sound/vox/warning.ogg
similarity index 100%
rename from modular_citadel/sound/vox/warning.ogg
rename to sound/vox/warning.ogg
diff --git a/modular_citadel/sound/vox/waste.ogg b/sound/vox/waste.ogg
similarity index 100%
rename from modular_citadel/sound/vox/waste.ogg
rename to sound/vox/waste.ogg
diff --git a/modular_citadel/sound/vox/water.ogg b/sound/vox/water.ogg
similarity index 100%
rename from modular_citadel/sound/vox/water.ogg
rename to sound/vox/water.ogg
diff --git a/modular_citadel/sound/vox/we.ogg b/sound/vox/we.ogg
similarity index 100%
rename from modular_citadel/sound/vox/we.ogg
rename to sound/vox/we.ogg
diff --git a/modular_citadel/sound/vox/weapon.ogg b/sound/vox/weapon.ogg
similarity index 100%
rename from modular_citadel/sound/vox/weapon.ogg
rename to sound/vox/weapon.ogg
diff --git a/modular_citadel/sound/vox/west.ogg b/sound/vox/west.ogg
similarity index 100%
rename from modular_citadel/sound/vox/west.ogg
rename to sound/vox/west.ogg
diff --git a/modular_citadel/sound/vox/whiskey.ogg b/sound/vox/whiskey.ogg
similarity index 100%
rename from modular_citadel/sound/vox/whiskey.ogg
rename to sound/vox/whiskey.ogg
diff --git a/modular_citadel/sound/vox/white.ogg b/sound/vox/white.ogg
similarity index 100%
rename from modular_citadel/sound/vox/white.ogg
rename to sound/vox/white.ogg
diff --git a/modular_citadel/sound/vox/wilco.ogg b/sound/vox/wilco.ogg
similarity index 100%
rename from modular_citadel/sound/vox/wilco.ogg
rename to sound/vox/wilco.ogg
diff --git a/modular_citadel/sound/vox/will.ogg b/sound/vox/will.ogg
similarity index 100%
rename from modular_citadel/sound/vox/will.ogg
rename to sound/vox/will.ogg
diff --git a/modular_citadel/sound/vox/with.ogg b/sound/vox/with.ogg
similarity index 100%
rename from modular_citadel/sound/vox/with.ogg
rename to sound/vox/with.ogg
diff --git a/modular_citadel/sound/vox/without.ogg b/sound/vox/without.ogg
similarity index 100%
rename from modular_citadel/sound/vox/without.ogg
rename to sound/vox/without.ogg
diff --git a/modular_citadel/sound/vox/woop.ogg b/sound/vox/woop.ogg
similarity index 100%
rename from modular_citadel/sound/vox/woop.ogg
rename to sound/vox/woop.ogg
diff --git a/modular_citadel/sound/vox/xeno.ogg b/sound/vox/xeno.ogg
similarity index 100%
rename from modular_citadel/sound/vox/xeno.ogg
rename to sound/vox/xeno.ogg
diff --git a/modular_citadel/sound/vox/yankee.ogg b/sound/vox/yankee.ogg
similarity index 100%
rename from modular_citadel/sound/vox/yankee.ogg
rename to sound/vox/yankee.ogg
diff --git a/modular_citadel/sound/vox/yards.ogg b/sound/vox/yards.ogg
similarity index 100%
rename from modular_citadel/sound/vox/yards.ogg
rename to sound/vox/yards.ogg
diff --git a/modular_citadel/sound/vox/year.ogg b/sound/vox/year.ogg
similarity index 100%
rename from modular_citadel/sound/vox/year.ogg
rename to sound/vox/year.ogg
diff --git a/modular_citadel/sound/vox/yellow.ogg b/sound/vox/yellow.ogg
similarity index 100%
rename from modular_citadel/sound/vox/yellow.ogg
rename to sound/vox/yellow.ogg
diff --git a/modular_citadel/sound/vox/yes.ogg b/sound/vox/yes.ogg
similarity index 100%
rename from modular_citadel/sound/vox/yes.ogg
rename to sound/vox/yes.ogg
diff --git a/modular_citadel/sound/vox/you.ogg b/sound/vox/you.ogg
similarity index 100%
rename from modular_citadel/sound/vox/you.ogg
rename to sound/vox/you.ogg
diff --git a/modular_citadel/sound/vox/your.ogg b/sound/vox/your.ogg
similarity index 100%
rename from modular_citadel/sound/vox/your.ogg
rename to sound/vox/your.ogg
diff --git a/modular_citadel/sound/vox/yourself.ogg b/sound/vox/yourself.ogg
similarity index 100%
rename from modular_citadel/sound/vox/yourself.ogg
rename to sound/vox/yourself.ogg
diff --git a/modular_citadel/sound/vox/zero.ogg b/sound/vox/zero.ogg
similarity index 100%
rename from modular_citadel/sound/vox/zero.ogg
rename to sound/vox/zero.ogg
diff --git a/modular_citadel/sound/vox/zone.ogg b/sound/vox/zone.ogg
similarity index 100%
rename from modular_citadel/sound/vox/zone.ogg
rename to sound/vox/zone.ogg
diff --git a/modular_citadel/sound/vox/zulu.ogg b/sound/vox/zulu.ogg
similarity index 100%
rename from modular_citadel/sound/vox/zulu.ogg
rename to sound/vox/zulu.ogg
diff --git a/tgstation.dme b/tgstation.dme
index d4b3e9a3b8..3beaf2edbc 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -16,6 +16,7 @@
#include "_maps\_basemap.dm"
#include "code\_compile_options.dm"
#include "code\world.dm"
+#include "code\__DEFINES\__513_compatibility.dm"
#include "code\__DEFINES\_globals.dm"
#include "code\__DEFINES\_protect.dm"
#include "code\__DEFINES\_tick.dm"
@@ -47,7 +48,6 @@
#include "code\__DEFINES\flags.dm"
#include "code\__DEFINES\food.dm"
#include "code\__DEFINES\footsteps.dm"
-#include "code\__DEFINES\forensics.dm"
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\integrated_electronics.dm"
#include "code\__DEFINES\interaction_flags.dm"
@@ -357,7 +357,6 @@
#include "code\datums\components\empprotection.dm"
#include "code\datums\components\footstep.dm"
#include "code\datums\components\forced_gravity.dm"
-#include "code\datums\components\forensics.dm"
#include "code\datums\components\infective.dm"
#include "code\datums\components\jousting.dm"
#include "code\datums\components\knockoff.dm"
@@ -370,13 +369,13 @@
#include "code\datums\components\ntnet_interface.dm"
#include "code\datums\components\orbiter.dm"
#include "code\datums\components\paintable.dm"
+#include "code\datums\components\phantomthief.dm"
#include "code\datums\components\rad_insulation.dm"
#include "code\datums\components\radioactive.dm"
#include "code\datums\components\remote_materials.dm"
#include "code\datums\components\riding.dm"
#include "code\datums\components\rotation.dm"
#include "code\datums\components\shrink.dm"
-#include "code\datums\components\signal_redirect.dm"
#include "code\datums\components\slippery.dm"
#include "code\datums\components\spooky.dm"
#include "code\datums\components\squeak.dm"
@@ -387,7 +386,6 @@
#include "code\datums\components\virtual_reality.dm"
#include "code\datums\components\wearertargeting.dm"
#include "code\datums\components\wet_floor.dm"
-#include "code\datums\components\decals\blood.dm"
#include "code\datums\components\storage\storage.dm"
#include "code\datums\components\storage\concrete\_concrete.dm"
#include "code\datums\components\storage\concrete\bag_of_holding.dm"
@@ -580,6 +578,7 @@
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\bank_machine.dm"
#include "code\game\machinery\Beacon.dm"
+#include "code\game\machinery\bloodbankgen.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
#include "code\game\machinery\cloning.dm"
@@ -759,6 +758,7 @@
#include "code\game\objects\effects\decals\misc.dm"
#include "code\game\objects\effects\decals\remains.dm"
#include "code\game\objects\effects\decals\cleanable\aliens.dm"
+#include "code\game\objects\effects\decals\cleanable\gibs.dm"
#include "code\game\objects\effects\decals\cleanable\humans.dm"
#include "code\game\objects\effects\decals\cleanable\misc.dm"
#include "code\game\objects\effects\decals\cleanable\robots.dm"
@@ -2236,6 +2236,7 @@
#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\support.dm"
#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
+#include "code\modules\mob\living\simple_animal\hostile\banana_spider.dm"
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
#include "code\modules\mob\living\simple_animal\hostile\bees.dm"
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
@@ -2602,6 +2603,7 @@
#include "code\modules\reagents\reagent_containers\dropper.dm"
#include "code\modules\reagents\reagent_containers\glass.dm"
#include "code\modules\reagents\reagent_containers\hypospray.dm"
+#include "code\modules\reagents\reagent_containers\hypovial.dm"
#include "code\modules\reagents\reagent_containers\medspray.dm"
#include "code\modules\reagents\reagent_containers\patch.dm"
#include "code\modules\reagents\reagent_containers\pill.dm"
@@ -2727,6 +2729,7 @@
#include "code\modules\ruins\spaceruin_code\crashedship.dm"
#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
#include "code\modules\ruins\spaceruin_code\DJstation.dm"
+#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm"
#include "code\modules\ruins\spaceruin_code\listeningstation.dm"
#include "code\modules\ruins\spaceruin_code\miracle.dm"
#include "code\modules\ruins\spaceruin_code\oldstation.dm"
@@ -2787,6 +2790,7 @@
#include "code\modules\spells\spell_types\spacetime_distortion.dm"
#include "code\modules\spells\spell_types\summonitem.dm"
#include "code\modules\spells\spell_types\taeclowndo.dm"
+#include "code\modules\spells\spell_types\telepathy.dm"
#include "code\modules\spells\spell_types\the_traps.dm"
#include "code\modules\spells\spell_types\touch_attacks.dm"
#include "code\modules\spells\spell_types\trigger.dm"
@@ -2963,7 +2967,6 @@
#include "modular_citadel\code\controllers\subsystem\job.dm"
#include "modular_citadel\code\controllers\subsystem\shuttle.dm"
#include "modular_citadel\code\datums\components\material_container.dm"
-#include "modular_citadel\code\datums\components\phantomthief.dm"
#include "modular_citadel\code\datums\components\souldeath.dm"
#include "modular_citadel\code\datums\mood_events\chem_events.dm"
#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm"
@@ -3000,7 +3003,6 @@
#include "modular_citadel\code\game\machinery\doors\airlock.dm"
#include "modular_citadel\code\game\machinery\doors\airlock_types.dm"
#include "modular_citadel\code\game\objects\cit_screenshake.dm"
-#include "modular_citadel\code\game\objects\ids.dm"
#include "modular_citadel\code\game\objects\items.dm"
#include "modular_citadel\code\game\objects\tools.dm"
#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm"
@@ -3019,7 +3021,6 @@
#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\eutactic_blades.dm"
#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
#include "modular_citadel\code\game\objects\structures\tables_racks.dm"
#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm"
@@ -3043,7 +3044,6 @@
#include "modular_citadel\code\modules\arousal\organs\vagina.dm"
#include "modular_citadel\code\modules\arousal\organs\womb.dm"
#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\client\client_defines.dm"
#include "modular_citadel\code\modules\client\client_procs.dm"
@@ -3070,7 +3070,6 @@
#include "modular_citadel\code\modules\clothing\neck.dm"
#include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm"
#include "modular_citadel\code\modules\clothing\head\head.dm"
-#include "modular_citadel\code\modules\clothing\spacesuits\cydonian_armor.dm"
#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm"
#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm"
#include "modular_citadel\code\modules\clothing\suits\suits.dm"
@@ -3081,17 +3080,8 @@
#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"
-#include "modular_citadel\code\modules\events\blob.dm"
-#include "modular_citadel\code\modules\events\wizard\magicarp.dm"
#include "modular_citadel\code\modules\food_and_drinks\snacks\meat.dm"
#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm"
-#include "modular_citadel\code\modules\jobs\dresscode_values.dm"
-#include "modular_citadel\code\modules\jobs\job_types\captain.dm"
-#include "modular_citadel\code\modules\jobs\job_types\cargo_service.dm"
-#include "modular_citadel\code\modules\jobs\job_types\engineering.dm"
-#include "modular_citadel\code\modules\jobs\job_types\medical.dm"
-#include "modular_citadel\code\modules\jobs\job_types\science.dm"
-#include "modular_citadel\code\modules\jobs\job_types\security.dm"
#include "modular_citadel\code\modules\keybindings\bindings_carbon.dm"
#include "modular_citadel\code\modules\keybindings\bindings_human.dm"
#include "modular_citadel\code\modules\keybindings\bindings_robot.dm"
@@ -3114,13 +3104,10 @@
#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.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"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm"
-#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm"
-#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm"
#include "modular_citadel\code\modules\power\lighting.dm"
#include "modular_citadel\code\modules\projectiles\gun.dm"
#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm"
@@ -3151,15 +3138,9 @@
#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm"
#include "modular_citadel\code\modules\reagents\objects\clothes.dm"
#include "modular_citadel\code\modules\reagents\objects\items.dm"
-#include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm"
-#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm"
#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm"
#include "modular_citadel\code\modules\recycling\disposal\bin.dm"
#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"
-#include "modular_citadel\code\modules\research\designs\machine_designs.dm"
-#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm"
-#include "modular_citadel\code\modules\research\techweb\_techweb.dm"
-#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm"
#include "modular_citadel\code\modules\vehicles\secway.dm"
#include "modular_citadel\interface\skin.dmf"
// END_INCLUDE
diff --git a/tools/mapmerge2/dmi.py b/tools/mapmerge2/dmi.py
index f0a8182c9f..c12964cead 100644
--- a/tools/mapmerge2/dmi.py
+++ b/tools/mapmerge2/dmi.py
@@ -45,6 +45,8 @@ class Dmi:
@classmethod
def from_file(cls, fname):
image = Image.open(fname)
+ if image.mode != 'RGBA':
+ image = image.convert('RGBA')
# no metadata = regular image file
if 'Description' not in image.info:
@@ -250,4 +252,4 @@ if __name__ == '__main__':
Dmi.from_file(os.path.join(dirpath, filename))
count += 1
- print(f"Successfully parsed {count} dmi files")
+ print(f"Successfully parsed {count} dmi files")
\ No newline at end of file
diff --git a/tools/mapmerge2/dmm.py b/tools/mapmerge2/dmm.py
index 8bb1dca353..15aa04c07f 100644
--- a/tools/mapmerge2/dmm.py
+++ b/tools/mapmerge2/dmm.py
@@ -343,7 +343,7 @@ def _parse(map_raw_text):
in_map_block = False
in_coord_block = False
in_map_string = False
- iter_x = 0
+ base_x = 0
adjust_y = True
curr_num = ""
@@ -487,7 +487,7 @@ def _parse(map_raw_text):
curr_x = int(curr_num)
if curr_x > maxx:
maxx = curr_x
- iter_x = 0
+ base_x = curr_x
curr_num = ""
reading_coord = "y"
elif reading_coord == "y":
@@ -521,21 +521,15 @@ def _parse(map_raw_text):
adjust_y = False
else:
curr_y += 1
- if curr_x > maxx:
- maxx = curr_x
- if iter_x > 1:
- curr_x = 1
- iter_x = 0
-
+ curr_x = base_x
else:
curr_key = BASE * curr_key + base52_r[char]
curr_key_len += 1
if curr_key_len == key_length:
- iter_x += 1
- if iter_x > 1:
- curr_x += 1
-
grid[curr_x, curr_y, curr_z] = duplicate_keys.get(curr_key, curr_key)
+ if curr_x > maxx:
+ maxx = curr_x
+ curr_x += 1
curr_key = 0
curr_key_len = 0
@@ -551,4 +545,4 @@ def _parse(map_raw_text):
data = DMM(key_length, Coordinate(maxx, maxy, maxz))
data.dictionary = dictionary
data.grid = grid
- return data
+ return data
\ No newline at end of file
diff --git a/tools/mapmerge2/update_paths.py b/tools/mapmerge2/update_paths.py
index 2c316e941d..deab468ecd 100644
--- a/tools/mapmerge2/update_paths.py
+++ b/tools/mapmerge2/update_paths.py
@@ -173,4 +173,4 @@ if __name__ == "__main__":
parser.add_argument("--directory", "-d", help="path to maps directory, defaults to _maps/")
parser.add_argument("--inline", "-i", help="treat update source as update string instead of path", action="store_true")
parser.add_argument("--verbose", "-v", help="toggle detailed update information", action="store_true")
- main(parser.parse_args())
+ main(parser.parse_args())
\ No newline at end of file