diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm
index 640b99121f..b2b9951cb6 100644
--- a/code/controllers/Processes/supply.dm
+++ b/code/controllers/Processes/supply.dm
@@ -224,9 +224,13 @@ var/datum/controller/supply/supply_controller = new()
if(SP.access)
if(isnum(SP.access))
A.req_access = list(SP.access)
- else if(islist(SP.access))
+ else if(islist(SP.access) && SP.one_access)
var/list/L = SP.access // access var is a plain var, we need a list
- A.req_one_access = L.Copy() //VOREStation Edit: Lets make sense
+ A.req_one_access = L.Copy()
+ A.req_access.Cut()
+ else if(islist(SP.access) && !SP.one_access)
+ var/list/L = SP.access
+ A.req_access = L.Copy()
else
log_debug("Supply pack with invalid access restriction [SP.access] encountered!")
diff --git a/code/datums/supplypacks/hydroponics_vr.dm b/code/datums/supplypacks/hydroponics_vr.dm
index 9ccbdf2d9e..c4003097a7 100644
--- a/code/datums/supplypacks/hydroponics_vr.dm
+++ b/code/datums/supplypacks/hydroponics_vr.dm
@@ -38,3 +38,14 @@
cost = 60 //considering a corgi crate is 50, and you get two fennecs
containertype = /obj/structure/largecrate/animal/fennec
containername = "Fennec crate"
+
+/datum/supply_pack/hydro/fish
+ name = "Fish supply crate"
+ contains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/lobster = 6,
+ /obj/item/weapon/reagent_containers/food/snacks/cuttlefish = 8,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish = 1
+ )
+ cost = 20
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Fish crate"
\ No newline at end of file
diff --git a/code/datums/supplypacks/supplypacks.dm b/code/datums/supplypacks/supplypacks.dm
index d29f03be6f..d419198af3 100644
--- a/code/datums/supplypacks/supplypacks.dm
+++ b/code/datums/supplypacks/supplypacks.dm
@@ -33,6 +33,7 @@ var/list/all_supply_groups = list("Atmospherics",
var/containertype = null
var/containername = null
var/access = null
+ var/one_access = FALSE
var/contraband = 0
var/num_contained = 0 //number of items picked to be contained in a /randomised crate
var/group = "Miscellaneous"
diff --git a/code/game/objects/items/trash_vr.dm b/code/game/objects/items/trash_vr.dm
index a738179c7f..43cadda3f7 100644
--- a/code/game/objects/items/trash_vr.dm
+++ b/code/game/objects/items/trash_vr.dm
@@ -29,4 +29,9 @@
/obj/item/trash/liquidprotein
name = "\improper \"LiquidProtein\" ration"
icon = 'icons/obj/trash_vr.dmi'
- icon_state = "liquidprotein"
\ No newline at end of file
+ icon_state = "liquidprotein"
+
+/obj/item/trash/fancyplate
+ name = "dirty fancy plate"
+ icon = 'icons/obj/trash_vr.dmi'
+ icon_state = "fancyplate"
diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm
index 70d6508202..f5ec2fe7cb 100644
--- a/code/game/objects/structures/props/puzzledoor.dm
+++ b/code/game/objects/structures/props/puzzledoor.dm
@@ -18,13 +18,17 @@
var/checkrange_mult = 1
/obj/machinery/door/blast/puzzle/proc/check_locks()
+ if(!locks || locks.len <= 0) // Puzzle doors with no locks will only listen to boring buttons.
+ return 0
+
for(var/obj/structure/prop/lock/L in locks)
if(!L.enabled)
return 0
return 1
/obj/machinery/door/blast/puzzle/bullet_act(var/obj/item/projectile/Proj)
- visible_message("\The [src] is completely unaffected by \the [Proj].")
+ if(!istype(Proj, /obj/item/projectile/test))
+ visible_message("\The [src] is completely unaffected by \the [Proj].")
qdel(Proj) //No piercing. No.
/obj/machinery/door/blast/puzzle/ex_act(severity)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 3a3713127a..5957005b89 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -1065,7 +1065,7 @@ var/list/admin_verbs_event_manager = list(
if(alert("Are you sure you want to tell them to man up?","Confirmation","Deal with it","No")=="No") return
T << "Man up and deal with it."
- T << "Move on."
+ T << "Move along."
log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.")
message_admins("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it.", 1)
@@ -1078,7 +1078,7 @@ var/list/admin_verbs_event_manager = list(
if(alert("Are you sure you want to tell the whole server up?","Confirmation","Deal with it","No")=="No") return
for (var/mob/T as mob in mob_list)
- T << "
Man up.
Deal with it.
Move on.
"
+ T << "
Man up.
Deal with it.
Move along.
"
T << 'sound/voice/ManUp1.ogg'
log_admin("[key_name(usr)] told everyone to man up and deal with it.")
diff --git a/code/modules/clothing/head/helmet_vr.dm b/code/modules/clothing/head/helmet_vr.dm
index 8f7ec139ca..edb2d9482a 100644
--- a/code/modules/clothing/head/helmet_vr.dm
+++ b/code/modules/clothing/head/helmet_vr.dm
@@ -26,4 +26,4 @@
desc = "Vendi, vidi, visa; I came, I saw, I realised this hat was too expensive."
icon_state = "ge_helmcent"
icon = 'icons/obj/clothing/hats_vr.dmi'
- icon_override = 'icons/mob/head_vr.dmi'
\ No newline at end of file
+ icon_override = 'icons/mob/head_vr.dmi'
diff --git a/code/modules/clothing/head/misc_vr.dm b/code/modules/clothing/head/misc_vr.dm
new file mode 100644
index 0000000000..82cae35465
--- /dev/null
+++ b/code/modules/clothing/head/misc_vr.dm
@@ -0,0 +1,7 @@
+/obj/item/clothing/head/fish
+ name = "fish skull"
+ desc = "You... you're not actually going to wear that, right?"
+ icon_state = "fishskull"
+ icon = 'icons/obj/clothing/hats_vr.dmi'
+ icon_override = 'icons/mob/head_vr.dmi'
+ flags_inv = HIDEEARS|BLOCKHAIR
diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm
index 6b08a2ac00..33539575a1 100644
--- a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm
@@ -35,13 +35,13 @@
)
/obj/item/clothing/head/helmet/space/rig
- species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI)
+ species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE)
/obj/item/clothing/gloves/gauntlets/rig
- species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI)
+ species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE)
/obj/item/clothing/shoes/magboots/rig
- species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI)
+ species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE)
/obj/item/clothing/suit/space/rig
- species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI)
+ species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE)
diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm
index 52f3752095..0321ca41bb 100644
--- a/code/modules/food/food/snacks_vr.dm
+++ b/code/modules/food/food/snacks_vr.dm
@@ -277,6 +277,113 @@
reagents.add_reagent("shockchem", 6)
bitesize = 7
+/obj/item/weapon/reagent_containers/food/snacks/lobster
+ name = "raw lobster"
+ desc = "a shifty lobster. You can try eating it, but its shell is extremely tough."
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "lobster_raw"
+ nutriment_amt = 5
+
+/obj/item/weapon/reagent_containers/food/snacks/lobster/Initialize()
+ ..()
+ bitesize = 0.1
+
+/obj/item/weapon/reagent_containers/food/snacks/lobstercooked
+ name = "cooked lobster"
+ desc = "a luxurious plate of cooked lobster, its taste accentuated by lemon juice. Reinvigorating!"
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "lobster_cooked"
+ trash = /obj/item/trash/plate
+ nutriment_amt = 20
+ nutriment_desc = list("lemon" = 2, "lobster" = 5, "salad" = 2)
+
+/obj/item/weapon/reagent_containers/food/snacks/lobstercooked/Initialize()
+ ..()
+ bitesize = 5
+ reagents.add_reagent("protein", 20)
+ reagents.add_reagent("tricordrazine", 5)
+ reagents.add_reagent("iron", 5)
+
+/obj/item/weapon/reagent_containers/food/snacks/cuttlefish
+ name = "raw cuttlefish"
+ desc = "it's an adorable squid! you can't possible be thinking about eating this right?"
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "cuttlefish_raw"
+ nutriment_amt = 5
+
+/obj/item/weapon/reagent_containers/food/snacks/cuttlefish/Initialize()
+ ..()
+ bitesize = 10
+
+/obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked
+ name = "cooked cuttlefish"
+ desc = "it's a roasted cuttlefish. rubbery, squishy, an acquired taste."
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "cuttlefish_cooked"
+ nutriment_amt = 20
+ nutriment_desc = list("cuttlefish" = 5, "rubber" = 5, "grease" = 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked/Initialize()
+ ..()
+ bitesize = 5
+ reagents.add_reagent("protein", 10)
+
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish
+ name = "extra large monkfish"
+ desc = "it's a huge monkfish. better clean it first, you can't possibly eat it like this."
+ icon = 'icons/obj/food48x48_vr.dmi'
+ icon_state = "monkfish_raw"
+ nutriment_amt = 30
+ w_class = ITEMSIZE_HUGE //Is that a monkfish in your pocket, or are you just happy to see me?
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/monkfishfillet
+ slices_num = 6
+ trash = /obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfishremains
+
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish/Initialize()
+ ..()
+ bitesize = 2
+
+/obj/item/weapon/reagent_containers/food/snacks/monkfishfillet
+ name = "monkfish fillet"
+ desc = "it's a fillet sliced from a monkfish."
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "monkfish_fillet"
+ nutriment_amt = 5
+
+/obj/item/weapon/reagent_containers/food/snacks/monkfishfillet/Initialize()
+ ..()
+ bitesize = 3
+ reagents.add_reagent("protein", 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/monkfishcooked
+ name = "seasoned monkfish"
+ desc = "a delicious slice of monkfish prepared with sweet chili and spring onion."
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "monkfish_cooked"
+ nutriment_amt = 10
+ nutriment_desc = list("fish" = 3, "oil" = 1, "sweet chili" = 3, "spring onion" = 2)
+ trash = /obj/item/trash/fancyplate
+
+/obj/item/weapon/reagent_containers/food/snacks/monkfishcooked/Initialize()
+ ..()
+ bitesize = 4
+ reagents.add_reagent("protein", 5)
+
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfishremains
+ name = "monkfish remains"
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "monkfish_remains"
+ desc = "the work of a madman."
+ w_class = ITEMSIZE_LARGE
+ nutriment_amt = 10
+ slice_path = /obj/item/clothing/head/fish
+ slices_num = 1
+
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfishremains/Initialize()
+ ..()
+ bitesize = 0.01 //impossible to eat
+ reagents.add_reagent("carbon", 5)
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/sobakacube
name = "sobaka cube"
monkey_type = "Sobaka"
diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm
index f9aadda69d..bc375d0d70 100644
--- a/code/modules/food/recipes_microwave_vr.dm
+++ b/code/modules/food/recipes_microwave_vr.dm
@@ -153,6 +153,26 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/makaroni
+/datum/recipe/lobster
+ fruit = list("lemon" = 1, "cabbage" = 1)
+ items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/lobster
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/lobstercooked
+
+/datum/recipe/cuttlefish
+ items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/cuttlefish
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked
+
+/datum/recipe/monkfish
+ fruit = list("chili" = 1, "onion" = 1)
+ items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/monkfishfillet
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/monkfishcooked
+
/datum/recipe/margheritapizzacargo
reagents = list()
items = list(
diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm
index 0e35d6b2b0..4958d60794 100644
--- a/code/modules/mob/living/bot/medbot.dm
+++ b/code/modules/mob/living/bot/medbot.dm
@@ -204,8 +204,8 @@
else if((href_list["adj_threshold"]) && (!locked || issilicon(usr)))
var/adjust_num = text2num(href_list["adj_threshold"])
heal_threshold += adjust_num
- if(heal_threshold < 5)
- heal_threshold = 5
+ if(heal_threshold <= 0)
+ heal_threshold = 0.1
if(heal_threshold > 75)
heal_threshold = 75
diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm
index b997dde35d..84af3fcc3c 100644
--- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm
@@ -1,7 +1,7 @@
// Handles hunger, starvation, growth, and eatting humans.
// Might be best to make this a /mob/living proc and override.
-/mob/living/simple_mob/slime/xenobio/proc/adjust_nutrition(input)
+/mob/living/simple_mob/slime/xenobio/proc/adjust_nutrition(input, var/heal = 1)
nutrition = between(0, nutrition + input, get_max_nutrition())
if(input > 0)
@@ -12,11 +12,12 @@
adjustToxLoss(-10)
// Heal 1 point of damage per 5 nutrition coming in.
- adjustBruteLoss(-input * 0.2)
- adjustFireLoss(-input * 0.2)
- adjustToxLoss(-input * 0.2)
- adjustOxyLoss(-input * 0.2)
- adjustCloneLoss(-input * 0.2)
+ if(heal)
+ adjustBruteLoss(-input * 0.2)
+ adjustFireLoss(-input * 0.2)
+ adjustToxLoss(-input * 0.2)
+ adjustOxyLoss(-input * 0.2)
+ adjustCloneLoss(-input * 0.2)
/mob/living/simple_mob/slime/xenobio/proc/get_max_nutrition() // Can't go above it
diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm
index cd8c840d1f..41eaccebc9 100644
--- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm
@@ -1,784 +1,784 @@
-// Here are where all the other colors of slime live.
-// They will generally fight each other if not Unified, meaning the xenobiologist has to seperate them.
-
-// Tier 1.
-
-/mob/living/simple_mob/slime/xenobio/purple
- desc = "This slime is rather toxic to handle, as it is poisonous."
- color = "#CC23FF"
- slime_color = "purple"
- coretype = /obj/item/slime_extract/purple
- reagent_injected = "toxin"
-
- description_info = "This slime spreads a toxin when it attacks. A biosuit or other thick armor can protect from the toxic attack."
- player_msg = "You inject a harmful toxin when attacking."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/dark_purple,
- /mob/living/simple_mob/slime/xenobio/dark_blue,
- /mob/living/simple_mob/slime/xenobio/green,
- /mob/living/simple_mob/slime/xenobio
- )
-
-/mob/living/simple_mob/slime/xenobio/orange
- desc = "This slime is known to be flammable and can ignite enemies."
- color = "#FFA723"
- slime_color = "orange"
- coretype = /obj/item/slime_extract/orange
- melee_damage_lower = 5
- melee_damage_upper = 5
- heat_resist = 1
-
- description_info = "The slime is immune to burning attacks, and attacks from this slime will burn you, and can ignite you. \
- A firesuit can protect from the burning attacks of this slime."
- player_msg = "You inflict burning attacks, which causes additional damage, makes the target more flammable, and has a chance to ignite them.
\
- You are also immune to burning attacks."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/dark_purple,
- /mob/living/simple_mob/slime/xenobio/yellow,
- /mob/living/simple_mob/slime/xenobio/red,
- /mob/living/simple_mob/slime/xenobio
- )
-
-/mob/living/simple_mob/slime/xenobio/orange/apply_melee_effects(atom/A)
- ..()
- if(isliving(A))
- var/mob/living/L = A
- L.inflict_heat_damage(is_adult ? 10 : 5)
- to_chat(src, span("span", "You burn \the [L]."))
- to_chat(L, span("danger", "You've been burned by \the [src]!"))
- L.adjust_fire_stacks(1)
- if(prob(12))
- L.IgniteMob()
-
-/mob/living/simple_mob/slime/xenobio/blue
- desc = "This slime produces 'cryotoxin' and uses it against their foes. Very deadly to other slimes."
- color = "#19FFFF"
- slime_color = "blue"
- coretype = /obj/item/slime_extract/blue
- reagent_injected = "cryotoxin"
- cold_resist = 0.50 // Not as strong as dark blue, which has immunity.
-
- description_info = "The slime is resistant to the cold, and attacks from this slime can inject cryotoxin into you. \
- A biosuit or other thick armor can protect from the injection."
- player_msg = "You inject cryotoxin on attack, which causes them to get very cold, slowing them down and harming them over time.
\
- You are also resistant to cold attacks."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/dark_blue,
- /mob/living/simple_mob/slime/xenobio/silver,
- /mob/living/simple_mob/slime/xenobio/pink,
- /mob/living/simple_mob/slime/xenobio
- )
-
-
-/mob/living/simple_mob/slime/xenobio/metal
- desc = "This slime is a lot more resilient than the others, due to having a metamorphic metallic and sloped surface."
- color = "#5F5F5F"
- slime_color = "metal"
- shiny = TRUE
- coretype = /obj/item/slime_extract/metal
-
- description_info = "This slime is a lot more durable and tough to damage than the others. It also seems to provoke others to attack it over others."
- player_msg = "You are more resilient and armored than more slimes. Your attacks will also encourage less intelligent enemies to focus on you."
-
- maxHealth = 250
- maxHealth_adult = 350
-
- // The sloped armor.
- // It's resistant to most weapons (but a spraybottle still kills it rather fast).
- armor = list(
- "melee" = 25,
- "bullet" = 25,
- "laser" = 25,
- "energy" = 50,
- "bomb" = 80,
- "bio" = 100,
- "rad" = 100
- )
-
- armor_soak = list(
- "melee" = 5,
- "bullet" = 5,
- "laser" = 5,
- "energy" = 0,
- "bomb" = 0,
- "bio" = 0,
- "rad" = 0
- )
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/silver,
- /mob/living/simple_mob/slime/xenobio/yellow,
- /mob/living/simple_mob/slime/xenobio/gold,
- /mob/living/simple_mob/slime/xenobio
- )
-
-/mob/living/simple_mob/slime/xenobio/metal/apply_melee_effects(atom/A)
- ..()
- if(isliving(A))
- var/mob/living/L = A
- L.taunt(src, TRUE) // We're the party tank now.
-
-// Tier 2
-
-/mob/living/simple_mob/slime/xenobio/yellow
- desc = "This slime is very conductive, and is known to use electricity as a means of defense moreso than usual for slimes."
- color = "#FFF423"
- slime_color = "yellow"
- coretype = /obj/item/slime_extract/yellow
- melee_damage_lower = 5
- melee_damage_upper = 5
- shock_resist = 1
-
- projectiletype = /obj/item/projectile/beam/lightning/slime
- projectilesound = 'sound/effects/lightningbolt.ogg'
- glow_toggle = TRUE
-
- description_info = "In addition to being immune to electrical shocks, this slime will fire ranged lightning attacks at \
- enemies if they are at range, inflict shocks upon entities they attack, and generate electricity for their stun \
- attack faster than usual. Insulative or reflective armor can protect from these attacks."
- player_msg = "You have a ranged electric attack. You also shock enemies you attack, and your electric stun attack charges passively.
\
- You are also immune to shocking attacks."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/bluespace,
- /mob/living/simple_mob/slime/xenobio/bluespace,
- /mob/living/simple_mob/slime/xenobio/metal,
- /mob/living/simple_mob/slime/xenobio/orange
- )
-
-/mob/living/simple_mob/slime/xenobio/yellow/apply_melee_effects(atom/A)
- ..()
- if(isliving(A))
- var/mob/living/L = A
- L.inflict_shock_damage(is_adult ? 10 : 5)
- to_chat(src, span("span", "You shock \the [L]."))
- to_chat(L, span("danger", "You've been shocked by \the [src]!"))
-
-/mob/living/simple_mob/slime/xenobio/yellow/handle_special()
- if(stat == CONSCIOUS)
- if(prob(25))
- power_charge = between(0, power_charge + 1, 10)
- ..()
-
-/obj/item/projectile/beam/lightning/slime
- power = 10
- fire_sound = 'sound/effects/lightningbolt.ogg'
-
-
-/mob/living/simple_mob/slime/xenobio/dark_purple
- desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it."
- color = "#660088"
- slime_color = "dark purple"
- coretype = /obj/item/slime_extract/dark_purple
- reagent_injected = "phoron"
-
- description_info = "This slime applies phoron to enemies it attacks. A biosuit or other thick armor can protect from the toxic attack. \
- If hit with a burning attack, it will erupt in flames."
- player_msg = "You inject phoron into enemies you attack.
\
- You will erupt into flames if harmed by fire!"
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/purple,
- /mob/living/simple_mob/slime/xenobio/orange,
- /mob/living/simple_mob/slime/xenobio/ruby,
- /mob/living/simple_mob/slime/xenobio/ruby
- )
-
-/mob/living/simple_mob/slime/xenobio/dark_purple/proc/ignite()
- visible_message(span("critical", "\The [src] erupts in an inferno!"))
- for(var/turf/simulated/target_turf in view(2, src))
- target_turf.assume_gas("phoron", 30, 1500+T0C)
- spawn(0)
- target_turf.hotspot_expose(1500+T0C, 400)
- qdel(src)
-
-/mob/living/simple_mob/slime/xenobio/dark_purple/ex_act(severity)
- log_and_message_admins("[src] ignited due to a chain reaction with an explosion.")
- ignite()
-
-/mob/living/simple_mob/slime/xenobio/dark_purple/fire_act(datum/gas_mixture/air, temperature, volume)
- log_and_message_admins("[src] ignited due to exposure to fire.")
- ignite()
-
-/mob/living/simple_mob/slime/xenobio/dark_purple/bullet_act(var/obj/item/projectile/P, var/def_zone)
- if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
- log_and_message_admins("[src] ignited due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
- ignite()
- else
- ..()
-
-/mob/living/simple_mob/slime/xenobio/dark_purple/attackby(var/obj/item/weapon/W, var/mob/user)
- if(istype(W) && W.force && W.damtype == BURN)
- log_and_message_admins("[src] ignited due to being hit with a burning weapon ([W]) by [key_name(user)].")
- ignite()
- else
- ..()
-
-
-
-/mob/living/simple_mob/slime/xenobio/dark_blue
- desc = "This slime makes other entities near it feel much colder, and is more resilient to the cold. It tends to kill other slimes rather quickly."
- color = "#2398FF"
- glow_toggle = TRUE
- slime_color = "dark blue"
- coretype = /obj/item/slime_extract/dark_blue
- melee_damage_lower = 5
- melee_damage_upper = 5
- cold_resist = 1
-
- description_info = "This slime is immune to the cold, however water will still kill it. Its presense, as well as its attacks, will \
- also cause you additional harm from the cold. A winter coat or other cold-resistant clothing can protect from this."
- player_msg = "You are immune to the cold, inflict additional cold damage on attack, and cause nearby entities to suffer from coldness."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/purple,
- /mob/living/simple_mob/slime/xenobio/blue,
- /mob/living/simple_mob/slime/xenobio/cerulean,
- /mob/living/simple_mob/slime/xenobio/cerulean
- )
-
- minbodytemp = 0
- cold_damage_per_tick = 0
-
-/mob/living/simple_mob/slime/xenobio/dark_blue/handle_special()
- if(stat != DEAD)
- cold_aura()
- ..()
-
-/mob/living/simple_mob/slime/xenobio/dark_blue/proc/cold_aura()
- for(var/mob/living/L in view(2, src))
- if(L == src)
- continue
- chill(L)
-
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/env = T.return_air()
- if(env)
- env.add_thermal_energy(-10 * 1000)
-
-/mob/living/simple_mob/slime/xenobio/dark_blue/apply_melee_effects(atom/A)
- ..()
- if(isliving(A))
- var/mob/living/L = A
- chill(L)
- to_chat(src, span("span", "You chill \the [L]."))
- to_chat(L, span("danger", "You've been chilled by \the [src]!"))
-
-
-/mob/living/simple_mob/slime/xenobio/dark_blue/proc/chill(mob/living/L)
- L.inflict_cold_damage(is_adult ? 10 : 5)
- if(L.get_cold_protection() < 1 && L.has_AI()) // Harmful auras will make the AI react to its bearer.
- L.ai_holder.react_to_attack(src)
-
-
-/mob/living/simple_mob/slime/xenobio/silver
- desc = "This slime is shiny, and can deflect lasers or other energy weapons directed at it."
- color = "#AAAAAA"
- slime_color = "silver"
- coretype = /obj/item/slime_extract/silver
- shiny = TRUE
-
- description_info = "Tasers, including the slime version, are ineffective against this slime. The slimebation still works."
- player_msg = "You automatically reflect lasers, beams, and tasers that hit you."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/metal,
- /mob/living/simple_mob/slime/xenobio/blue,
- /mob/living/simple_mob/slime/xenobio/amber,
- /mob/living/simple_mob/slime/xenobio/amber
- )
-
-/mob/living/simple_mob/slime/xenobio/silver/bullet_act(var/obj/item/projectile/P, var/def_zone)
- if(istype(P,/obj/item/projectile/beam) || istype(P, /obj/item/projectile/energy))
- visible_message(span("danger", "\The [src] reflects \the [P]!"))
-
- // Find a turf near or on the original location to bounce to
- var/new_x = P.starting.x + pick(0, 0, 0, -1, 1, -2, 2)
- var/new_y = P.starting.y + pick(0, 0, 0, -1, 1, -2, 2)
- var/turf/curloc = get_turf(src)
-
- // redirect the projectile
- P.redirect(new_x, new_y, curloc, src)
- P.reflected = TRUE
- return PROJECTILE_CONTINUE // complete projectile permutation
- else
- ..()
-
-
-// Tier 3
-
-/mob/living/simple_mob/slime/xenobio/bluespace
- desc = "Trapping this slime in a cell is generally futile, as it can teleport at will."
- color = null
- slime_color = "bluespace"
- icon_state_override = "bluespace"
- coretype = /obj/item/slime_extract/bluespace
-
- description_info = "This slime will teleport to attack something if it is within a range of seven tiles. The teleport has a cooldown of five seconds."
- player_msg = "You can teleport at will to a specific tile by clicking on it at range. This has a five second cooldown."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/bluespace,
- /mob/living/simple_mob/slime/xenobio/bluespace,
- /mob/living/simple_mob/slime/xenobio/yellow,
- /mob/living/simple_mob/slime/xenobio/yellow
- )
-
- special_attack_min_range = 3
- special_attack_max_range = 7
- special_attack_cooldown = 5 SECONDS
-
-/mob/living/simple_mob/slime/xenobio/bluespace/do_special_attack(atom/A)
- // Teleport attack.
- if(!A)
- to_chat(src, span("warning", "There's nothing to teleport to."))
- return FALSE
-
- var/list/nearby_things = range(1, A)
- var/list/valid_turfs = list()
-
- // All this work to just go to a non-dense tile.
- for(var/turf/potential_turf in nearby_things)
- var/valid_turf = TRUE
- if(potential_turf.density)
- continue
- for(var/atom/movable/AM in potential_turf)
- if(AM.density)
- valid_turf = FALSE
- if(valid_turf)
- valid_turfs.Add(potential_turf)
-
- var/turf/T = get_turf(src)
- var/turf/target_turf = pick(valid_turfs)
-
- if(!target_turf)
- to_chat(src, span("warning", "There wasn't an unoccupied spot to teleport to."))
- return FALSE
-
- var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread
- s1.set_up(5, 1, T)
- var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread
- s2.set_up(5, 1, target_turf)
-
-
- T.visible_message(span("notice", "\The [src] vanishes!"))
- s1.start()
-
- forceMove(target_turf)
- playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
- to_chat(src, span("notice", "You teleport to \the [target_turf]."))
-
- target_turf.visible_message(span("warning", "\The [src] appears!"))
- s2.start()
-
- if(Adjacent(A))
- attack_target(A)
-
-
-/mob/living/simple_mob/slime/xenobio/ruby
- desc = "This slime has great physical strength."
- color = "#FF3333"
- slime_color = "ruby"
- shiny = TRUE
- glow_toggle = TRUE
- coretype = /obj/item/slime_extract/ruby
-
- description_info = "This slime is unnaturally stronger, allowing it to hit much harder, take less damage, and be stunned for less time. \
- Their glomp attacks also send the victim flying."
- player_msg = "Your attacks knock back the target a fair distance.
\
- You also hit harder, take less damage, and stuns affect you for less time."
-
- melee_attack_delay = 1 SECOND
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/dark_purple,
- /mob/living/simple_mob/slime/xenobio/dark_purple,
- /mob/living/simple_mob/slime/xenobio/ruby,
- /mob/living/simple_mob/slime/xenobio/ruby
- )
-
-/mob/living/simple_mob/slime/xenobio/ruby/Initialize()
- add_modifier(/datum/modifier/slime_strength, null, src) // Slime is always swole.
- return ..()
-
-/mob/living/simple_mob/slime/xenobio/ruby/apply_melee_effects(atom/A)
- ..()
-
- if(isliving(A) && a_intent == I_HURT)
- var/mob/living/L = A
- if(L.mob_size <= MOB_MEDIUM)
- visible_message(span("danger", "\The [src] sends \the [L] flying with the impact!"))
- playsound(src, "punch", 50, 1)
- L.Weaken(1)
- var/throwdir = get_dir(src, L)
- L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
- else
- to_chat(L, span("warning", "\The [src] hits you with incredible force, but you remain in place."))
-
-
-/mob/living/simple_mob/slime/xenobio/amber
- desc = "This slime seems to be an expert in the culinary arts, as they create their own food to share with others. \
- They would probably be very important to other slimes, if the other colors didn't try to kill them."
- color = "#FFBB00"
- slime_color = "amber"
- shiny = TRUE
- glow_toggle = TRUE
- coretype = /obj/item/slime_extract/amber
-
- description_info = "This slime feeds nearby entities passively while it is alive. This can cause uncontrollable \
- slime growth and reproduction if not kept in check. The amber slime cannot feed itself, but can be fed by other amber slimes."
- player_msg = "You passively provide nutrition to nearby entities."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/silver,
- /mob/living/simple_mob/slime/xenobio/silver,
- /mob/living/simple_mob/slime/xenobio/amber,
- /mob/living/simple_mob/slime/xenobio/amber
- )
-
-/mob/living/simple_mob/slime/xenobio/amber/handle_special()
- if(stat != DEAD)
- feed_aura()
- ..()
-
-/mob/living/simple_mob/slime/xenobio/amber/proc/feed_aura()
- for(var/mob/living/L in view(2, src))
- if(L == src) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers.
- continue
- if(istype(L, /mob/living/simple_mob/slime/xenobio))
- var/mob/living/simple_mob/slime/xenobio/X = L
- X.adjust_nutrition(rand(15, 25))
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- if(H.isSynthetic())
- continue
- H.nutrition = between(0, H.nutrition + rand(15, 25), 800)
-
-/mob/living/simple_mob/slime/xenobio/cerulean
- desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none."
- color = "#4F7EAA"
- slime_color = "cerulean"
- coretype = /obj/item/slime_extract/cerulean
-
- // Less than the specialized slimes, but higher than the rest.
- maxHealth = 200
- maxHealth_adult = 250
-
- melee_damage_lower = 10
- melee_damage_upper = 30
-
- movement_cooldown = 0 // This actually isn't any faster due to AI limitations that hopefully the timer subsystem can fix in the future.
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/dark_blue,
- /mob/living/simple_mob/slime/xenobio/dark_blue,
- /mob/living/simple_mob/slime/xenobio/cerulean,
- /mob/living/simple_mob/slime/xenobio/cerulean
- )
-
-// Tier 4
-
-/mob/living/simple_mob/slime/xenobio/red
- desc = "This slime is full of energy, and very aggressive. 'The red ones go faster.' seems to apply here."
- color = "#FF3333"
- slime_color = "red"
- coretype = /obj/item/slime_extract/red
- movement_cooldown = 0 // See above.
-
- description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go rabid and berserk."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/red,
- /mob/living/simple_mob/slime/xenobio/oil,
- /mob/living/simple_mob/slime/xenobio/oil,
- /mob/living/simple_mob/slime/xenobio/orange
- )
-
- ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/red // Will enrage if disciplined.
-
-
-/mob/living/simple_mob/slime/xenobio/green
- desc = "This slime is radioactive."
- color = "#14FF20"
- slime_color = "green"
- coretype = /obj/item/slime_extract/green
- glow_toggle = TRUE
- reagent_injected = "radium"
- var/rads = 25
-
- description_info = "This slime will irradiate anything nearby passively, and will inject radium on attack. \
- A radsuit or other thick and radiation-hardened armor can protect from this. It will only radiate while alive."
- player_msg = "You passively irradiate your surroundings.
\
- You also inject radium on attack."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/purple,
- /mob/living/simple_mob/slime/xenobio/green,
- /mob/living/simple_mob/slime/xenobio/emerald,
- /mob/living/simple_mob/slime/xenobio/emerald
- )
-
-/mob/living/simple_mob/slime/xenobio/green/handle_special()
- if(stat != DEAD)
- irradiate()
- ..()
-
-/mob/living/simple_mob/slime/xenobio/green/proc/irradiate()
- radiation_repository.radiate(src, rads)
-
-
-
-/mob/living/simple_mob/slime/xenobio/pink
- desc = "This slime has regenerative properties."
- color = "#FF0080"
- slime_color = "pink"
- coretype = /obj/item/slime_extract/pink
- glow_toggle = TRUE
-
- description_info = "This slime will passively heal nearby entities within two tiles, including itself. It will only do this while alive."
- player_msg = "You passively heal yourself and nearby allies."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/blue,
- /mob/living/simple_mob/slime/xenobio/light_pink,
- /mob/living/simple_mob/slime/xenobio/light_pink,
- /mob/living/simple_mob/slime/xenobio/pink
- )
-
-/mob/living/simple_mob/slime/xenobio/pink/handle_special()
- if(stat != DEAD)
- heal_aura()
- ..()
-
-/mob/living/simple_mob/slime/xenobio/pink/proc/heal_aura()
- for(var/mob/living/L in view(src, 2))
- if(L.stat == DEAD || !IIsAlly(L))
- continue
- L.add_modifier(/datum/modifier/aura/slime_heal, null, src)
-
-/datum/modifier/aura/slime_heal
- name = "slime mending"
- desc = "You feel somewhat gooy."
- mob_overlay_state = "pink_sparkles"
- stacks = MODIFIER_STACK_FORBID
- aura_max_distance = 2
-
- on_created_text = "Twinkling spores of goo surround you. It makes you feel healthier."
- on_expired_text = "The spores of goo have faded, although you feel much healthier than before."
-
-/datum/modifier/aura/slime_heal/tick()
- if(holder.stat == DEAD)
- expire()
-
- if(ishuman(holder)) // Robolimbs need this code sadly.
- var/mob/living/carbon/human/H = holder
- for(var/obj/item/organ/external/E in H.organs)
- var/obj/item/organ/external/O = E
- O.heal_damage(2, 2, 0, 1)
- else
- holder.adjustBruteLoss(-2)
- holder.adjustFireLoss(-2)
-
- holder.adjustToxLoss(-2)
- holder.adjustOxyLoss(-2)
- holder.adjustCloneLoss(-1)
-
-
-/mob/living/simple_mob/slime/xenobio/gold
- desc = "This slime absorbs energy, and cannot be stunned by normal means."
- color = "#EEAA00"
- shiny = TRUE
- slime_color = "gold"
- coretype = /obj/item/slime_extract/gold
- description_info = "This slime is immune to the slimebaton and taser, and will actually charge the slime, however it will still discipline the slime."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/metal,
- /mob/living/simple_mob/slime/xenobio/gold,
- /mob/living/simple_mob/slime/xenobio/sapphire,
- /mob/living/simple_mob/slime/xenobio/sapphire
- )
-
-/mob/living/simple_mob/slime/xenobio/gold/slimebatoned(mob/living/user, amount)
- power_charge = between(0, power_charge + amount, 10)
-
-/mob/living/simple_mob/slime/xenobio/gold/get_description_interaction() // So it doesn't say to use a baton on them.
- return list()
-
-
-// Tier 5
-
-/mob/living/simple_mob/slime/xenobio/oil
- desc = "This slime is explosive and volatile. Smoking near it is probably a bad idea."
- color = "#333333"
- slime_color = "oil"
- shiny = TRUE
- coretype = /obj/item/slime_extract/oil
-
- description_info = "If this slime suffers damage from a fire or heat based source, or if it is caught inside \
- an explosion, it will explode. Oil slimes will also suicide-bomb themselves when fighting something that is not a monkey or slime."
- player_msg = "You will explode if struck by a burning attack, or if you hit an enemy with a melee attack that is not a monkey or another slime."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/oil,
- /mob/living/simple_mob/slime/xenobio/oil,
- /mob/living/simple_mob/slime/xenobio/red,
- /mob/living/simple_mob/slime/xenobio/red
- )
-
-/mob/living/simple_mob/slime/xenobio/oil/proc/explode()
- if(stat != DEAD)
- explosion(src.loc, 0, 2, 4) // A bit weaker since the suicide charger tended to gib the poor sod being targeted.
- if(src) // Delete ourselves if the explosion didn't do it.
- qdel(src)
-
-/mob/living/simple_mob/slime/xenobio/oil/apply_melee_effects(atom/A)
- if(isliving(A))
- var/mob/living/L = A
- if(ishuman(L))
- var/mob/living/carbon/human/H = A
- if(istype(H.species, /datum/species/monkey))
- return ..()// Don't blow up when just eatting monkeys.
-
- else if(isslime(L))
- return ..()
-
- // Otherwise blow ourselves up.
- say(pick("Sacrifice...!", "Sssss...", "Boom...!"))
- set_AI_busy(TRUE)
- sleep(2 SECONDS)
- log_and_message_admins("[src] has suicide-bombed themselves while trying to kill \the [L].")
- explode()
-
- return ..()
-
-/mob/living/simple_mob/slime/xenobio/oil/ex_act(severity)
- log_and_message_admins("[src] exploded due to a chain reaction with another explosion.")
- explode()
-
-/mob/living/simple_mob/slime/xenobio/oil/fire_act(datum/gas_mixture/air, temperature, volume)
- log_and_message_admins("[src] exploded due to exposure to fire.")
- explode()
-
-/mob/living/simple_mob/slime/xenobio/oil/bullet_act(obj/item/projectile/P, def_zone)
- if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
- log_and_message_admins("[src] exploded due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
- explode()
- else
- ..()
-
-/mob/living/simple_mob/slime/xenobio/oil/attackby(obj/item/weapon/W, mob/living/user)
- if(istype(W) && W.force && W.damtype == BURN)
- log_and_message_admins("[src] exploded due to being hit with a burning weapon ([W]) by [key_name(user)].")
- explode()
- else
- ..()
-
-
-/mob/living/simple_mob/slime/xenobio/sapphire
- desc = "This slime seems a bit brighter than the rest, both figuratively and literally."
- color = "#2398FF"
- slime_color = "sapphire"
- shiny = TRUE
- glow_toggle = TRUE
- coretype = /obj/item/slime_extract/sapphire
- ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/sapphire
-
- description_info = "This slime uses more robust tactics when fighting and won't hold back, so it is dangerous to be alone \
- with one if hostile, and especially dangerous if they outnumber you."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/sapphire,
- /mob/living/simple_mob/slime/xenobio/sapphire,
- /mob/living/simple_mob/slime/xenobio/gold,
- /mob/living/simple_mob/slime/xenobio/gold
- )
-
-
-/mob/living/simple_mob/slime/xenobio/emerald
- desc = "This slime is faster than usual, even more so than the red slimes."
- color = "#22FF22"
- shiny = TRUE
- glow_toggle = TRUE
- slime_color = "emerald"
- coretype = /obj/item/slime_extract/emerald
-
- description_info = "This slime will make everything around it, and itself, faster for a few seconds, if close by."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/green,
- /mob/living/simple_mob/slime/xenobio/green,
- /mob/living/simple_mob/slime/xenobio/emerald,
- /mob/living/simple_mob/slime/xenobio/emerald
- )
-
-/mob/living/simple_mob/slime/xenobio/emerald/handle_special()
- if(stat != DEAD)
- zoom_aura()
- ..()
-
-/mob/living/simple_mob/slime/xenobio/emerald/proc/zoom_aura()
- for(var/mob/living/L in view(src, 2))
- if(L.stat == DEAD || !IIsAlly(L))
- continue
- L.add_modifier(/datum/modifier/technomancer/haste, 5 SECONDS, src)
-
-
-/mob/living/simple_mob/slime/xenobio/light_pink
- desc = "This slime seems a lot more peaceful than the others."
- color = "#FF8888"
- slime_color = "light pink"
- coretype = /obj/item/slime_extract/light_pink
-
- description_info = "This slime is effectively always disciplined initially."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/pink,
- /mob/living/simple_mob/slime/xenobio/pink,
- /mob/living/simple_mob/slime/xenobio/light_pink,
- /mob/living/simple_mob/slime/xenobio/light_pink
- )
-
- ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/light_pink
-
-// Special
-/mob/living/simple_mob/slime/xenobio/rainbow
- desc = "This slime changes colors constantly."
- color = null // Uses a special icon_state.
- slime_color = "rainbow"
- coretype = /obj/item/slime_extract/rainbow
- icon_state_override = "rainbow"
- unity = TRUE
-
- description_info = "This slime is considered to be the same color as all other slime colors at the same time for the purposes of \
- other slimes being friendly to them, and therefore will never be harmed by another slime. \
- Attacking this slime will provoke the wrath of all slimes within range."
- player_msg = "You are considered to be the same color as every slime, \
- meaning that you are considered an ally to all slimes."
-
- slime_mutation = list(
- /mob/living/simple_mob/slime/xenobio/rainbow,
- /mob/living/simple_mob/slime/xenobio/rainbow,
- /mob/living/simple_mob/slime/xenobio/rainbow,
- /mob/living/simple_mob/slime/xenobio/rainbow
- )
-
-/mob/living/simple_mob/slime/xenobio/rainbow/Initialize()
- unify()
- return ..()
-
-// The RD's pet slime.
-/mob/living/simple_mob/slime/xenobio/rainbow/kendrick
- name = "Kendrick"
- desc = "The Research Director's pet slime. It shifts colors constantly."
- rainbow_core_candidate = FALSE
- // Doing pacify() in initialize() won't actually pacify the AI due to the ai_holder not existing due to parent initialize() not being called yet.
- // Instead lets just give them an ai_holder that does that for us.
- ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/passive
-
-/mob/living/simple_mob/slime/xenobio/rainbow/kendrick/Initialize()
- pacify() // So the physical mob also gets made harmless.
- return ..()
\ No newline at end of file
+// Here are where all the other colors of slime live.
+// They will generally fight each other if not Unified, meaning the xenobiologist has to seperate them.
+
+// Tier 1.
+
+/mob/living/simple_mob/slime/xenobio/purple
+ desc = "This slime is rather toxic to handle, as it is poisonous."
+ color = "#CC23FF"
+ slime_color = "purple"
+ coretype = /obj/item/slime_extract/purple
+ reagent_injected = "toxin"
+
+ description_info = "This slime spreads a toxin when it attacks. A biosuit or other thick armor can protect from the toxic attack."
+ player_msg = "You inject a harmful toxin when attacking."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/dark_purple,
+ /mob/living/simple_mob/slime/xenobio/dark_blue,
+ /mob/living/simple_mob/slime/xenobio/green,
+ /mob/living/simple_mob/slime/xenobio
+ )
+
+/mob/living/simple_mob/slime/xenobio/orange
+ desc = "This slime is known to be flammable and can ignite enemies."
+ color = "#FFA723"
+ slime_color = "orange"
+ coretype = /obj/item/slime_extract/orange
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ heat_resist = 1
+
+ description_info = "The slime is immune to burning attacks, and attacks from this slime will burn you, and can ignite you. \
+ A firesuit can protect from the burning attacks of this slime."
+ player_msg = "You inflict burning attacks, which causes additional damage, makes the target more flammable, and has a chance to ignite them.
\
+ You are also immune to burning attacks."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/dark_purple,
+ /mob/living/simple_mob/slime/xenobio/yellow,
+ /mob/living/simple_mob/slime/xenobio/red,
+ /mob/living/simple_mob/slime/xenobio
+ )
+
+/mob/living/simple_mob/slime/xenobio/orange/apply_melee_effects(atom/A)
+ ..()
+ if(isliving(A))
+ var/mob/living/L = A
+ L.inflict_heat_damage(is_adult ? 10 : 5)
+ to_chat(src, span("span", "You burn \the [L]."))
+ to_chat(L, span("danger", "You've been burned by \the [src]!"))
+ L.adjust_fire_stacks(1)
+ if(prob(12))
+ L.IgniteMob()
+
+/mob/living/simple_mob/slime/xenobio/blue
+ desc = "This slime produces 'cryotoxin' and uses it against their foes. Very deadly to other slimes."
+ color = "#19FFFF"
+ slime_color = "blue"
+ coretype = /obj/item/slime_extract/blue
+ reagent_injected = "cryotoxin"
+ cold_resist = 0.50 // Not as strong as dark blue, which has immunity.
+
+ description_info = "The slime is resistant to the cold, and attacks from this slime can inject cryotoxin into you. \
+ A biosuit or other thick armor can protect from the injection."
+ player_msg = "You inject cryotoxin on attack, which causes them to get very cold, slowing them down and harming them over time.
\
+ You are also resistant to cold attacks."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/dark_blue,
+ /mob/living/simple_mob/slime/xenobio/silver,
+ /mob/living/simple_mob/slime/xenobio/pink,
+ /mob/living/simple_mob/slime/xenobio
+ )
+
+
+/mob/living/simple_mob/slime/xenobio/metal
+ desc = "This slime is a lot more resilient than the others, due to having a metamorphic metallic and sloped surface."
+ color = "#5F5F5F"
+ slime_color = "metal"
+ shiny = TRUE
+ coretype = /obj/item/slime_extract/metal
+
+ description_info = "This slime is a lot more durable and tough to damage than the others. It also seems to provoke others to attack it over others."
+ player_msg = "You are more resilient and armored than more slimes. Your attacks will also encourage less intelligent enemies to focus on you."
+
+ maxHealth = 250
+ maxHealth_adult = 350
+
+ // The sloped armor.
+ // It's resistant to most weapons (but a spraybottle still kills it rather fast).
+ armor = list(
+ "melee" = 25,
+ "bullet" = 25,
+ "laser" = 25,
+ "energy" = 50,
+ "bomb" = 80,
+ "bio" = 100,
+ "rad" = 100
+ )
+
+ armor_soak = list(
+ "melee" = 5,
+ "bullet" = 5,
+ "laser" = 5,
+ "energy" = 0,
+ "bomb" = 0,
+ "bio" = 0,
+ "rad" = 0
+ )
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/silver,
+ /mob/living/simple_mob/slime/xenobio/yellow,
+ /mob/living/simple_mob/slime/xenobio/gold,
+ /mob/living/simple_mob/slime/xenobio
+ )
+
+/mob/living/simple_mob/slime/xenobio/metal/apply_melee_effects(atom/A)
+ ..()
+ if(isliving(A))
+ var/mob/living/L = A
+ L.taunt(src, TRUE) // We're the party tank now.
+
+// Tier 2
+
+/mob/living/simple_mob/slime/xenobio/yellow
+ desc = "This slime is very conductive, and is known to use electricity as a means of defense moreso than usual for slimes."
+ color = "#FFF423"
+ slime_color = "yellow"
+ coretype = /obj/item/slime_extract/yellow
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ shock_resist = 1
+
+ projectiletype = /obj/item/projectile/beam/lightning/slime
+ projectilesound = 'sound/effects/lightningbolt.ogg'
+ glow_toggle = TRUE
+
+ description_info = "In addition to being immune to electrical shocks, this slime will fire ranged lightning attacks at \
+ enemies if they are at range, inflict shocks upon entities they attack, and generate electricity for their stun \
+ attack faster than usual. Insulative or reflective armor can protect from these attacks."
+ player_msg = "You have a ranged electric attack. You also shock enemies you attack, and your electric stun attack charges passively.
\
+ You are also immune to shocking attacks."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/bluespace,
+ /mob/living/simple_mob/slime/xenobio/bluespace,
+ /mob/living/simple_mob/slime/xenobio/metal,
+ /mob/living/simple_mob/slime/xenobio/orange
+ )
+
+/mob/living/simple_mob/slime/xenobio/yellow/apply_melee_effects(atom/A)
+ ..()
+ if(isliving(A))
+ var/mob/living/L = A
+ L.inflict_shock_damage(is_adult ? 10 : 5)
+ to_chat(src, span("span", "You shock \the [L]."))
+ to_chat(L, span("danger", "You've been shocked by \the [src]!"))
+
+/mob/living/simple_mob/slime/xenobio/yellow/handle_special()
+ if(stat == CONSCIOUS)
+ if(prob(25))
+ power_charge = between(0, power_charge + 1, 10)
+ ..()
+
+/obj/item/projectile/beam/lightning/slime
+ power = 10
+ fire_sound = 'sound/effects/lightningbolt.ogg'
+
+
+/mob/living/simple_mob/slime/xenobio/dark_purple
+ desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it."
+ color = "#660088"
+ slime_color = "dark purple"
+ coretype = /obj/item/slime_extract/dark_purple
+ reagent_injected = "phoron"
+
+ description_info = "This slime applies phoron to enemies it attacks. A biosuit or other thick armor can protect from the toxic attack. \
+ If hit with a burning attack, it will erupt in flames."
+ player_msg = "You inject phoron into enemies you attack.
\
+ You will erupt into flames if harmed by fire!"
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/purple,
+ /mob/living/simple_mob/slime/xenobio/orange,
+ /mob/living/simple_mob/slime/xenobio/ruby,
+ /mob/living/simple_mob/slime/xenobio/ruby
+ )
+
+/mob/living/simple_mob/slime/xenobio/dark_purple/proc/ignite()
+ visible_message(span("critical", "\The [src] erupts in an inferno!"))
+ for(var/turf/simulated/target_turf in view(2, src))
+ target_turf.assume_gas("phoron", 30, 1500+T0C)
+ spawn(0)
+ target_turf.hotspot_expose(1500+T0C, 400)
+ qdel(src)
+
+/mob/living/simple_mob/slime/xenobio/dark_purple/ex_act(severity)
+ log_and_message_admins("[src] ignited due to a chain reaction with an explosion.")
+ ignite()
+
+/mob/living/simple_mob/slime/xenobio/dark_purple/fire_act(datum/gas_mixture/air, temperature, volume)
+ log_and_message_admins("[src] ignited due to exposure to fire.")
+ ignite()
+
+/mob/living/simple_mob/slime/xenobio/dark_purple/bullet_act(var/obj/item/projectile/P, var/def_zone)
+ if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
+ log_and_message_admins("[src] ignited due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
+ ignite()
+ else
+ ..()
+
+/mob/living/simple_mob/slime/xenobio/dark_purple/attackby(var/obj/item/weapon/W, var/mob/user)
+ if(istype(W) && W.force && W.damtype == BURN)
+ log_and_message_admins("[src] ignited due to being hit with a burning weapon ([W]) by [key_name(user)].")
+ ignite()
+ else
+ ..()
+
+
+
+/mob/living/simple_mob/slime/xenobio/dark_blue
+ desc = "This slime makes other entities near it feel much colder, and is more resilient to the cold. It tends to kill other slimes rather quickly."
+ color = "#2398FF"
+ glow_toggle = TRUE
+ slime_color = "dark blue"
+ coretype = /obj/item/slime_extract/dark_blue
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ cold_resist = 1
+
+ description_info = "This slime is immune to the cold, however water will still kill it. Its presense, as well as its attacks, will \
+ also cause you additional harm from the cold. A winter coat or other cold-resistant clothing can protect from this."
+ player_msg = "You are immune to the cold, inflict additional cold damage on attack, and cause nearby entities to suffer from coldness."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/purple,
+ /mob/living/simple_mob/slime/xenobio/blue,
+ /mob/living/simple_mob/slime/xenobio/cerulean,
+ /mob/living/simple_mob/slime/xenobio/cerulean
+ )
+
+ minbodytemp = 0
+ cold_damage_per_tick = 0
+
+/mob/living/simple_mob/slime/xenobio/dark_blue/handle_special()
+ if(stat != DEAD)
+ cold_aura()
+ ..()
+
+/mob/living/simple_mob/slime/xenobio/dark_blue/proc/cold_aura()
+ for(var/mob/living/L in view(2, src))
+ if(L == src)
+ continue
+ chill(L)
+
+ var/turf/T = get_turf(src)
+ var/datum/gas_mixture/env = T.return_air()
+ if(env)
+ env.add_thermal_energy(-10 * 1000)
+
+/mob/living/simple_mob/slime/xenobio/dark_blue/apply_melee_effects(atom/A)
+ ..()
+ if(isliving(A))
+ var/mob/living/L = A
+ chill(L)
+ to_chat(src, span("span", "You chill \the [L]."))
+ to_chat(L, span("danger", "You've been chilled by \the [src]!"))
+
+
+/mob/living/simple_mob/slime/xenobio/dark_blue/proc/chill(mob/living/L)
+ L.inflict_cold_damage(is_adult ? 10 : 5)
+ if(L.get_cold_protection() < 1 && L.has_AI()) // Harmful auras will make the AI react to its bearer.
+ L.ai_holder.react_to_attack(src)
+
+
+/mob/living/simple_mob/slime/xenobio/silver
+ desc = "This slime is shiny, and can deflect lasers or other energy weapons directed at it."
+ color = "#AAAAAA"
+ slime_color = "silver"
+ coretype = /obj/item/slime_extract/silver
+ shiny = TRUE
+
+ description_info = "Tasers, including the slime version, are ineffective against this slime. The slimebation still works."
+ player_msg = "You automatically reflect lasers, beams, and tasers that hit you."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/metal,
+ /mob/living/simple_mob/slime/xenobio/blue,
+ /mob/living/simple_mob/slime/xenobio/amber,
+ /mob/living/simple_mob/slime/xenobio/amber
+ )
+
+/mob/living/simple_mob/slime/xenobio/silver/bullet_act(var/obj/item/projectile/P, var/def_zone)
+ if(istype(P,/obj/item/projectile/beam) || istype(P, /obj/item/projectile/energy))
+ visible_message(span("danger", "\The [src] reflects \the [P]!"))
+
+ // Find a turf near or on the original location to bounce to
+ var/new_x = P.starting.x + pick(0, 0, 0, -1, 1, -2, 2)
+ var/new_y = P.starting.y + pick(0, 0, 0, -1, 1, -2, 2)
+ var/turf/curloc = get_turf(src)
+
+ // redirect the projectile
+ P.redirect(new_x, new_y, curloc, src)
+ P.reflected = TRUE
+ return PROJECTILE_CONTINUE // complete projectile permutation
+ else
+ ..()
+
+
+// Tier 3
+
+/mob/living/simple_mob/slime/xenobio/bluespace
+ desc = "Trapping this slime in a cell is generally futile, as it can teleport at will."
+ color = null
+ slime_color = "bluespace"
+ icon_state_override = "bluespace"
+ coretype = /obj/item/slime_extract/bluespace
+
+ description_info = "This slime will teleport to attack something if it is within a range of seven tiles. The teleport has a cooldown of five seconds."
+ player_msg = "You can teleport at will to a specific tile by clicking on it at range. This has a five second cooldown."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/bluespace,
+ /mob/living/simple_mob/slime/xenobio/bluespace,
+ /mob/living/simple_mob/slime/xenobio/yellow,
+ /mob/living/simple_mob/slime/xenobio/yellow
+ )
+
+ special_attack_min_range = 3
+ special_attack_max_range = 7
+ special_attack_cooldown = 5 SECONDS
+
+/mob/living/simple_mob/slime/xenobio/bluespace/do_special_attack(atom/A)
+ // Teleport attack.
+ if(!A)
+ to_chat(src, span("warning", "There's nothing to teleport to."))
+ return FALSE
+
+ var/list/nearby_things = range(1, A)
+ var/list/valid_turfs = list()
+
+ // All this work to just go to a non-dense tile.
+ for(var/turf/potential_turf in nearby_things)
+ var/valid_turf = TRUE
+ if(potential_turf.density)
+ continue
+ for(var/atom/movable/AM in potential_turf)
+ if(AM.density)
+ valid_turf = FALSE
+ if(valid_turf)
+ valid_turfs.Add(potential_turf)
+
+ var/turf/T = get_turf(src)
+ var/turf/target_turf = pick(valid_turfs)
+
+ if(!target_turf)
+ to_chat(src, span("warning", "There wasn't an unoccupied spot to teleport to."))
+ return FALSE
+
+ var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread
+ s1.set_up(5, 1, T)
+ var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread
+ s2.set_up(5, 1, target_turf)
+
+
+ T.visible_message(span("notice", "\The [src] vanishes!"))
+ s1.start()
+
+ forceMove(target_turf)
+ playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1)
+ to_chat(src, span("notice", "You teleport to \the [target_turf]."))
+
+ target_turf.visible_message(span("warning", "\The [src] appears!"))
+ s2.start()
+
+ if(Adjacent(A))
+ attack_target(A)
+
+
+/mob/living/simple_mob/slime/xenobio/ruby
+ desc = "This slime has great physical strength."
+ color = "#FF3333"
+ slime_color = "ruby"
+ shiny = TRUE
+ glow_toggle = TRUE
+ coretype = /obj/item/slime_extract/ruby
+
+ description_info = "This slime is unnaturally stronger, allowing it to hit much harder, take less damage, and be stunned for less time. \
+ Their glomp attacks also send the victim flying."
+ player_msg = "Your attacks knock back the target a fair distance.
\
+ You also hit harder, take less damage, and stuns affect you for less time."
+
+ melee_attack_delay = 1 SECOND
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/dark_purple,
+ /mob/living/simple_mob/slime/xenobio/dark_purple,
+ /mob/living/simple_mob/slime/xenobio/ruby,
+ /mob/living/simple_mob/slime/xenobio/ruby
+ )
+
+/mob/living/simple_mob/slime/xenobio/ruby/Initialize()
+ add_modifier(/datum/modifier/slime_strength, null, src) // Slime is always swole.
+ return ..()
+
+/mob/living/simple_mob/slime/xenobio/ruby/apply_melee_effects(atom/A)
+ ..()
+
+ if(isliving(A) && a_intent == I_HURT)
+ var/mob/living/L = A
+ if(L.mob_size <= MOB_MEDIUM)
+ visible_message(span("danger", "\The [src] sends \the [L] flying with the impact!"))
+ playsound(src, "punch", 50, 1)
+ L.Weaken(1)
+ var/throwdir = get_dir(src, L)
+ L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
+ else
+ to_chat(L, span("warning", "\The [src] hits you with incredible force, but you remain in place."))
+
+
+/mob/living/simple_mob/slime/xenobio/amber
+ desc = "This slime seems to be an expert in the culinary arts, as they create their own food to share with others. \
+ They would probably be very important to other slimes, if the other colors didn't try to kill them."
+ color = "#FFBB00"
+ slime_color = "amber"
+ shiny = TRUE
+ glow_toggle = TRUE
+ coretype = /obj/item/slime_extract/amber
+
+ description_info = "This slime feeds nearby entities passively while it is alive. This can cause uncontrollable \
+ slime growth and reproduction if not kept in check. The amber slime cannot feed itself, but can be fed by other amber slimes."
+ player_msg = "You passively provide nutrition to nearby entities."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/silver,
+ /mob/living/simple_mob/slime/xenobio/silver,
+ /mob/living/simple_mob/slime/xenobio/amber,
+ /mob/living/simple_mob/slime/xenobio/amber
+ )
+
+/mob/living/simple_mob/slime/xenobio/amber/handle_special()
+ if(stat != DEAD)
+ feed_aura()
+ ..()
+
+/mob/living/simple_mob/slime/xenobio/amber/proc/feed_aura()
+ for(var/mob/living/L in view(2, src))
+ if(L == src) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers.
+ continue
+ if(istype(L, /mob/living/simple_mob/slime/xenobio))
+ var/mob/living/simple_mob/slime/xenobio/X = L
+ X.adjust_nutrition(rand(15, 25), 0)
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.isSynthetic())
+ continue
+ H.nutrition = between(0, H.nutrition + rand(15, 25), 800)
+
+/mob/living/simple_mob/slime/xenobio/cerulean
+ desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none."
+ color = "#4F7EAA"
+ slime_color = "cerulean"
+ coretype = /obj/item/slime_extract/cerulean
+
+ // Less than the specialized slimes, but higher than the rest.
+ maxHealth = 200
+ maxHealth_adult = 250
+
+ melee_damage_lower = 10
+ melee_damage_upper = 30
+
+ movement_cooldown = 0 // This actually isn't any faster due to AI limitations that hopefully the timer subsystem can fix in the future.
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/dark_blue,
+ /mob/living/simple_mob/slime/xenobio/dark_blue,
+ /mob/living/simple_mob/slime/xenobio/cerulean,
+ /mob/living/simple_mob/slime/xenobio/cerulean
+ )
+
+// Tier 4
+
+/mob/living/simple_mob/slime/xenobio/red
+ desc = "This slime is full of energy, and very aggressive. 'The red ones go faster.' seems to apply here."
+ color = "#FF3333"
+ slime_color = "red"
+ coretype = /obj/item/slime_extract/red
+ movement_cooldown = 0 // See above.
+
+ description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go rabid and berserk."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/red,
+ /mob/living/simple_mob/slime/xenobio/oil,
+ /mob/living/simple_mob/slime/xenobio/oil,
+ /mob/living/simple_mob/slime/xenobio/orange
+ )
+
+ ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/red // Will enrage if disciplined.
+
+
+/mob/living/simple_mob/slime/xenobio/green
+ desc = "This slime is radioactive."
+ color = "#14FF20"
+ slime_color = "green"
+ coretype = /obj/item/slime_extract/green
+ glow_toggle = TRUE
+ reagent_injected = "radium"
+ var/rads = 25
+
+ description_info = "This slime will irradiate anything nearby passively, and will inject radium on attack. \
+ A radsuit or other thick and radiation-hardened armor can protect from this. It will only radiate while alive."
+ player_msg = "You passively irradiate your surroundings.
\
+ You also inject radium on attack."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/purple,
+ /mob/living/simple_mob/slime/xenobio/green,
+ /mob/living/simple_mob/slime/xenobio/emerald,
+ /mob/living/simple_mob/slime/xenobio/emerald
+ )
+
+/mob/living/simple_mob/slime/xenobio/green/handle_special()
+ if(stat != DEAD)
+ irradiate()
+ ..()
+
+/mob/living/simple_mob/slime/xenobio/green/proc/irradiate()
+ radiation_repository.radiate(src, rads)
+
+
+
+/mob/living/simple_mob/slime/xenobio/pink
+ desc = "This slime has regenerative properties."
+ color = "#FF0080"
+ slime_color = "pink"
+ coretype = /obj/item/slime_extract/pink
+ glow_toggle = TRUE
+
+ description_info = "This slime will passively heal nearby entities within two tiles, including itself. It will only do this while alive."
+ player_msg = "You passively heal yourself and nearby allies."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/blue,
+ /mob/living/simple_mob/slime/xenobio/light_pink,
+ /mob/living/simple_mob/slime/xenobio/light_pink,
+ /mob/living/simple_mob/slime/xenobio/pink
+ )
+
+/mob/living/simple_mob/slime/xenobio/pink/handle_special()
+ if(stat != DEAD)
+ heal_aura()
+ ..()
+
+/mob/living/simple_mob/slime/xenobio/pink/proc/heal_aura()
+ for(var/mob/living/L in view(src, 2))
+ if(L.stat == DEAD || !IIsAlly(L))
+ continue
+ L.add_modifier(/datum/modifier/aura/slime_heal, null, src)
+
+/datum/modifier/aura/slime_heal
+ name = "slime mending"
+ desc = "You feel somewhat gooy."
+ mob_overlay_state = "pink_sparkles"
+ stacks = MODIFIER_STACK_FORBID
+ aura_max_distance = 2
+
+ on_created_text = "Twinkling spores of goo surround you. It makes you feel healthier."
+ on_expired_text = "The spores of goo have faded, although you feel much healthier than before."
+
+/datum/modifier/aura/slime_heal/tick()
+ if(holder.stat == DEAD)
+ expire()
+
+ if(ishuman(holder)) // Robolimbs need this code sadly.
+ var/mob/living/carbon/human/H = holder
+ for(var/obj/item/organ/external/E in H.organs)
+ var/obj/item/organ/external/O = E
+ O.heal_damage(2, 2, 0, 1)
+ else
+ holder.adjustBruteLoss(-2)
+ holder.adjustFireLoss(-2)
+
+ holder.adjustToxLoss(-2)
+ holder.adjustOxyLoss(-2)
+ holder.adjustCloneLoss(-1)
+
+
+/mob/living/simple_mob/slime/xenobio/gold
+ desc = "This slime absorbs energy, and cannot be stunned by normal means."
+ color = "#EEAA00"
+ shiny = TRUE
+ slime_color = "gold"
+ coretype = /obj/item/slime_extract/gold
+ description_info = "This slime is immune to the slimebaton and taser, and will actually charge the slime, however it will still discipline the slime."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/metal,
+ /mob/living/simple_mob/slime/xenobio/gold,
+ /mob/living/simple_mob/slime/xenobio/sapphire,
+ /mob/living/simple_mob/slime/xenobio/sapphire
+ )
+
+/mob/living/simple_mob/slime/xenobio/gold/slimebatoned(mob/living/user, amount)
+ power_charge = between(0, power_charge + amount, 10)
+
+/mob/living/simple_mob/slime/xenobio/gold/get_description_interaction() // So it doesn't say to use a baton on them.
+ return list()
+
+
+// Tier 5
+
+/mob/living/simple_mob/slime/xenobio/oil
+ desc = "This slime is explosive and volatile. Smoking near it is probably a bad idea."
+ color = "#333333"
+ slime_color = "oil"
+ shiny = TRUE
+ coretype = /obj/item/slime_extract/oil
+
+ description_info = "If this slime suffers damage from a fire or heat based source, or if it is caught inside \
+ an explosion, it will explode. Oil slimes will also suicide-bomb themselves when fighting something that is not a monkey or slime."
+ player_msg = "You will explode if struck by a burning attack, or if you hit an enemy with a melee attack that is not a monkey or another slime."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/oil,
+ /mob/living/simple_mob/slime/xenobio/oil,
+ /mob/living/simple_mob/slime/xenobio/red,
+ /mob/living/simple_mob/slime/xenobio/red
+ )
+
+/mob/living/simple_mob/slime/xenobio/oil/proc/explode()
+ if(stat != DEAD)
+ explosion(src.loc, 0, 2, 4) // A bit weaker since the suicide charger tended to gib the poor sod being targeted.
+ if(src) // Delete ourselves if the explosion didn't do it.
+ qdel(src)
+
+/mob/living/simple_mob/slime/xenobio/oil/apply_melee_effects(atom/A)
+ if(isliving(A))
+ var/mob/living/L = A
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = A
+ if(istype(H.species, /datum/species/monkey))
+ return ..()// Don't blow up when just eatting monkeys.
+
+ else if(isslime(L))
+ return ..()
+
+ // Otherwise blow ourselves up.
+ say(pick("Sacrifice...!", "Sssss...", "Boom...!"))
+ set_AI_busy(TRUE)
+ sleep(2 SECONDS)
+ log_and_message_admins("[src] has suicide-bombed themselves while trying to kill \the [L].")
+ explode()
+
+ return ..()
+
+/mob/living/simple_mob/slime/xenobio/oil/ex_act(severity)
+ log_and_message_admins("[src] exploded due to a chain reaction with another explosion.")
+ explode()
+
+/mob/living/simple_mob/slime/xenobio/oil/fire_act(datum/gas_mixture/air, temperature, volume)
+ log_and_message_admins("[src] exploded due to exposure to fire.")
+ explode()
+
+/mob/living/simple_mob/slime/xenobio/oil/bullet_act(obj/item/projectile/P, def_zone)
+ if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security.
+ log_and_message_admins("[src] exploded due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].")
+ explode()
+ else
+ ..()
+
+/mob/living/simple_mob/slime/xenobio/oil/attackby(obj/item/weapon/W, mob/living/user)
+ if(istype(W) && W.force && W.damtype == BURN)
+ log_and_message_admins("[src] exploded due to being hit with a burning weapon ([W]) by [key_name(user)].")
+ explode()
+ else
+ ..()
+
+
+/mob/living/simple_mob/slime/xenobio/sapphire
+ desc = "This slime seems a bit brighter than the rest, both figuratively and literally."
+ color = "#2398FF"
+ slime_color = "sapphire"
+ shiny = TRUE
+ glow_toggle = TRUE
+ coretype = /obj/item/slime_extract/sapphire
+ ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/sapphire
+
+ description_info = "This slime uses more robust tactics when fighting and won't hold back, so it is dangerous to be alone \
+ with one if hostile, and especially dangerous if they outnumber you."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/sapphire,
+ /mob/living/simple_mob/slime/xenobio/sapphire,
+ /mob/living/simple_mob/slime/xenobio/gold,
+ /mob/living/simple_mob/slime/xenobio/gold
+ )
+
+
+/mob/living/simple_mob/slime/xenobio/emerald
+ desc = "This slime is faster than usual, even more so than the red slimes."
+ color = "#22FF22"
+ shiny = TRUE
+ glow_toggle = TRUE
+ slime_color = "emerald"
+ coretype = /obj/item/slime_extract/emerald
+
+ description_info = "This slime will make everything around it, and itself, faster for a few seconds, if close by."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/green,
+ /mob/living/simple_mob/slime/xenobio/green,
+ /mob/living/simple_mob/slime/xenobio/emerald,
+ /mob/living/simple_mob/slime/xenobio/emerald
+ )
+
+/mob/living/simple_mob/slime/xenobio/emerald/handle_special()
+ if(stat != DEAD)
+ zoom_aura()
+ ..()
+
+/mob/living/simple_mob/slime/xenobio/emerald/proc/zoom_aura()
+ for(var/mob/living/L in view(src, 2))
+ if(L.stat == DEAD || !IIsAlly(L))
+ continue
+ L.add_modifier(/datum/modifier/technomancer/haste, 5 SECONDS, src)
+
+
+/mob/living/simple_mob/slime/xenobio/light_pink
+ desc = "This slime seems a lot more peaceful than the others."
+ color = "#FF8888"
+ slime_color = "light pink"
+ coretype = /obj/item/slime_extract/light_pink
+
+ description_info = "This slime is effectively always disciplined initially."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/pink,
+ /mob/living/simple_mob/slime/xenobio/pink,
+ /mob/living/simple_mob/slime/xenobio/light_pink,
+ /mob/living/simple_mob/slime/xenobio/light_pink
+ )
+
+ ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/light_pink
+
+// Special
+/mob/living/simple_mob/slime/xenobio/rainbow
+ desc = "This slime changes colors constantly."
+ color = null // Uses a special icon_state.
+ slime_color = "rainbow"
+ coretype = /obj/item/slime_extract/rainbow
+ icon_state_override = "rainbow"
+ unity = TRUE
+
+ description_info = "This slime is considered to be the same color as all other slime colors at the same time for the purposes of \
+ other slimes being friendly to them, and therefore will never be harmed by another slime. \
+ Attacking this slime will provoke the wrath of all slimes within range."
+ player_msg = "You are considered to be the same color as every slime, \
+ meaning that you are considered an ally to all slimes."
+
+ slime_mutation = list(
+ /mob/living/simple_mob/slime/xenobio/rainbow,
+ /mob/living/simple_mob/slime/xenobio/rainbow,
+ /mob/living/simple_mob/slime/xenobio/rainbow,
+ /mob/living/simple_mob/slime/xenobio/rainbow
+ )
+
+/mob/living/simple_mob/slime/xenobio/rainbow/Initialize()
+ unify()
+ return ..()
+
+// The RD's pet slime.
+/mob/living/simple_mob/slime/xenobio/rainbow/kendrick
+ name = "Kendrick"
+ desc = "The Research Director's pet slime. It shifts colors constantly."
+ rainbow_core_candidate = FALSE
+ // Doing pacify() in initialize() won't actually pacify the AI due to the ai_holder not existing due to parent initialize() not being called yet.
+ // Instead lets just give them an ai_holder that does that for us.
+ ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/passive
+
+/mob/living/simple_mob/slime/xenobio/rainbow/kendrick/Initialize()
+ pacify() // So the physical mob also gets made harmless.
+ return ..()
diff --git a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm
index 3a9cab6bc2..156d67525b 100644
--- a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm
+++ b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm
@@ -29,7 +29,7 @@
var/supported = FALSE
for(var/obj/structure/table/S in loc)
supported = TRUE
- if(!supported)
+ if(!supported && !anchored)
to_chat(usr, "You will need a better supporting surface before opening \the [src]!")
return
//VOREStation Addition End
diff --git a/html/changelogs/chaoko99 - medibots.yml b/html/changelogs/chaoko99 - medibots.yml
new file mode 100644
index 0000000000..aefa9bce3a
--- /dev/null
+++ b/html/changelogs/chaoko99 - medibots.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Chaoko99
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "The medibot's minimum configurable threshhold has been lowered to 0, from 5. Perfect for silly-billies coming into medical with 2 brute boo boos, thanks to accidentally throwing something at themselves or.. something."
diff --git a/html/changelogs/chaoko99 - reconnect.yml b/html/changelogs/chaoko99 - reconnect.yml
new file mode 100644
index 0000000000..082e552457
--- /dev/null
+++ b/html/changelogs/chaoko99 - reconnect.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: chaoko99
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Adds the clientside 'ping' and 'reconnect' commands to the file menu."
diff --git a/icons/mob/head_vr.dmi b/icons/mob/head_vr.dmi
index 798bff510a..bf19238e2e 100644
Binary files a/icons/mob/head_vr.dmi and b/icons/mob/head_vr.dmi differ
diff --git a/icons/obj/clothing/hats_vr.dmi b/icons/obj/clothing/hats_vr.dmi
index f20d7c13d6..befa308d4b 100644
Binary files a/icons/obj/clothing/hats_vr.dmi and b/icons/obj/clothing/hats_vr.dmi differ
diff --git a/icons/obj/food48x48_vr.dmi b/icons/obj/food48x48_vr.dmi
new file mode 100644
index 0000000000..91d4307b37
Binary files /dev/null and b/icons/obj/food48x48_vr.dmi differ
diff --git a/icons/obj/food_vr.dmi b/icons/obj/food_vr.dmi
index 08c984102b..7a6d3c5226 100644
Binary files a/icons/obj/food_vr.dmi and b/icons/obj/food_vr.dmi differ
diff --git a/icons/obj/trash_vr.dmi b/icons/obj/trash_vr.dmi
index 6c9d7ea7d3..17004c289d 100644
Binary files a/icons/obj/trash_vr.dmi and b/icons/obj/trash_vr.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 218c3a48f3..ebde572420 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1075,6 +1075,16 @@ menu "menu"
group = ""
is-disabled = false
saved-params = "is-checked"
+ elem
+ name = "&Reconnect"
+ command = ".reconnect"
+ category = "&File"
+ saved-params = "is-checked"
+ elem
+ name = "&Check ping"
+ command = ".ping"
+ category = "&File"
+ saved-params = "is-checked"
elem
name = ""
command = ""
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index 75764756d8..2b2f4d5351 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -6005,6 +6005,21 @@
},
/turf/simulated/floor/tiled,
/area/rnd/hallway)
+"aki" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/catwalk,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/visible/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{
+ icon_state = "intact-scrubbers";
+ dir = 4
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/lower/research)
"akj" = (
/obj/structure/catwalk,
/obj/effect/decal/cleanable/dirt,
@@ -6014,6 +6029,17 @@
},
/turf/simulated/floor/plating,
/area/maintenance/lower/trash_pit)
+"akk" = (
+/obj/structure/catwalk,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/visible/supply{
+ dir = 4
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/lower/research)
"akm" = (
/obj/structure/grille,
/obj/structure/window/reinforced/full,
@@ -13834,14 +13860,6 @@
},
/turf/simulated/floor/tiled,
/area/storage/art)
-"aEZ" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/structure/catwalk,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
-/area/maintenance/lower/research)
"aFb" = (
/obj/structure/bed/chair/wood{
dir = 4
@@ -43152,7 +43170,7 @@ aBW
aDl
aDI
aEp
-aEZ
+aki
lVl
bEX
qaO
@@ -43294,7 +43312,7 @@ aCB
aDm
aDJ
aDL
-jRT
+akk
jso
xJz
xoJ
diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm
index fa40d5e3b7..e26ad41dae 100644
--- a/maps/tether/tether-06-station2.dmm
+++ b/maps/tether/tether-06-station2.dmm
@@ -3291,13 +3291,25 @@
/turf/simulated/floor/tiled,
/area/tether/exploration/hallway)
"eJ" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/door/firedoor/glass/hidden/steel{
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals9,
+/obj/effect/floor_decal/steeldecal/steel_decals9{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals9{
dir = 1
},
+/obj/effect/floor_decal/steeldecal/steel_decals9{
+ dir = 8
+ },
+/obj/machinery/vending/nifsoft_shop,
/turf/simulated/floor/tiled,
-/area/tether/station/stairs_two)
+/area/hallway/station/port)
"eK" = (
/obj/effect/floor_decal/borderfloor{
dir = 5
@@ -3334,29 +3346,28 @@
/turf/space,
/area/space)
"eN" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- pixel_y = 0
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/lightgrey/border{
- dir = 4
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
+/obj/machinery/vending/coffee,
+/obj/effect/floor_decal/corner/lightgrey{
dir = 9
},
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 10
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
},
-/obj/machinery/door/firedoor/glass/hidden/steel{
+/obj/effect/floor_decal/steeldecal/steel_decals9,
+/obj/effect/floor_decal/steeldecal/steel_decals9{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals9{
+ dir = 1
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals9{
dir = 8
},
+/obj/machinery/light{
+ dir = 1
+ },
/turf/simulated/floor/tiled,
-/area/tether/station/stairs_two)
+/area/hallway/station/port)
"eO" = (
/obj/machinery/alarm{
pixel_y = 22
@@ -10747,48 +10758,55 @@
/turf/simulated/floor/tiled,
/area/hallway/station/port)
"pQ" = (
-/obj/effect/floor_decal/corner/lightgrey{
- dir = 9
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
-/obj/effect/floor_decal/corner/lightgrey{
- dir = 6
- },
-/obj/effect/floor_decal/steeldecal/steel_decals9,
-/obj/effect/floor_decal/steeldecal/steel_decals9{
- dir = 4
- },
-/obj/effect/floor_decal/steeldecal/steel_decals9{
+/obj/effect/floor_decal/borderfloor{
dir = 1
},
-/obj/effect/floor_decal/steeldecal/steel_decals9{
- dir = 8
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
},
-/obj/machinery/vending/nifsoft_shop,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7,
/turf/simulated/floor/tiled,
-/area/hallway/station/starboard)
+/area/hallway/station/port)
"pR" = (
-/obj/machinery/vending/coffee,
-/obj/effect/floor_decal/corner/lightgrey{
- dir = 9
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
-/obj/effect/floor_decal/corner/lightgrey{
- dir = 6
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
},
-/obj/effect/floor_decal/steeldecal/steel_decals9,
-/obj/effect/floor_decal/steeldecal/steel_decals9{
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 10
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
dir = 4
},
-/obj/effect/floor_decal/steeldecal/steel_decals9{
- dir = 1
- },
-/obj/effect/floor_decal/steeldecal/steel_decals9{
- dir = 8
- },
-/obj/machinery/light{
- dir = 1
- },
+/obj/effect/floor_decal/steeldecal/steel_decals7,
/turf/simulated/floor/tiled,
-/area/hallway/station/starboard)
+/area/hallway/station/port)
"pS" = (
/turf/simulated/wall/r_wall,
/area/hallway/station/starboard)
@@ -11267,56 +11285,6 @@
/turf/simulated/floor/tiled,
/area/hallway/station/port)
"qC" = (
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 1
- },
-/obj/effect/floor_decal/corner/lightgrey/border{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 4
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7,
-/turf/simulated/floor/tiled,
-/area/hallway/station/starboard)
-"qD" = (
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0
- },
-/obj/effect/floor_decal/borderfloor{
- dir = 1
- },
-/obj/effect/floor_decal/corner/lightgrey/border{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 4
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7,
-/turf/simulated/floor/tiled,
-/area/hallway/station/starboard)
-"qE" = (
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -11337,7 +11305,22 @@
},
/obj/effect/floor_decal/steeldecal/steel_decals7,
/turf/simulated/floor/tiled,
-/area/hallway/station/starboard)
+/area/hallway/station/port)
+"qD" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/hallway/station/port)
+"qE" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
+/turf/simulated/floor/tiled,
+/area/hallway/station/port)
"qF" = (
/obj/structure/cable{
d1 = 1;
@@ -11737,15 +11720,6 @@
/turf/simulated/floor/tiled,
/area/hallway/station/port)
"rp" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
-/turf/simulated/floor/tiled,
-/area/hallway/station/starboard)
-"rq" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
@@ -11754,7 +11728,21 @@
},
/obj/machinery/door/firedoor/glass/hidden/steel,
/turf/simulated/floor/tiled,
-/area/hallway/station/starboard)
+/area/hallway/station/port)
+"rq" = (
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/obj/machinery/door/firedoor/glass/hidden/steel{
+ dir = 1
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 1
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/hallway/station/port)
"rr" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
@@ -12209,19 +12197,17 @@
/turf/simulated/floor/tiled,
/area/hallway/station/starboard)
"sd" = (
-/obj/effect/floor_decal/borderfloor,
-/obj/effect/floor_decal/corner/lightgrey/border,
/obj/machinery/door/firedoor/glass/hidden/steel{
dir = 1
},
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 1
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
},
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
},
/turf/simulated/floor/tiled,
-/area/hallway/station/starboard)
+/area/tether/station/stairs_two)
"se" = (
/obj/structure/flora/pottedplant/stoutbush,
/obj/effect/floor_decal/borderfloor{
@@ -12384,11 +12370,6 @@
/turf/simulated/floor/tiled/techfloor,
/area/ai_server_room)
"sz" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/tiled,
-/area/tether/station/stairs_two)
-"sA" = (
/obj/structure/cable{
d1 = 1;
d2 = 2;
@@ -12407,6 +12388,19 @@
/obj/effect/floor_decal/steeldecal/steel_decals7{
dir = 10
},
+/obj/machinery/door/firedoor/glass/hidden/steel{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 10
+ },
+/turf/simulated/floor/tiled,
+/area/tether/station/stairs_two)
+"sA" = (
+/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled,
/area/tether/station/stairs_two)
"sB" = (
@@ -13039,11 +13033,11 @@
/turf/simulated/floor/tiled,
/area/tether/station/stairs_two)
"tJ" = (
-/obj/structure/cable,
-/obj/machinery/power/apc{
- dir = 4;
- name = "east bump";
- pixel_x = 28
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
},
/obj/effect/floor_decal/borderfloor{
dir = 4
@@ -13057,6 +13051,8 @@
/obj/effect/floor_decal/steeldecal/steel_decals7{
dir = 10
},
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled,
/area/tether/station/stairs_two)
"tK" = (
@@ -13361,17 +13357,8 @@
/turf/simulated/floor/tiled,
/area/tether/station/stairs_two)
"up" = (
-/obj/effect/floor_decal/borderfloor{
- dir = 4
- },
-/obj/effect/floor_decal/corner/lightgrey/border{
- dir = 4
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 9
- },
-/obj/effect/floor_decal/steeldecal/steel_decals7{
- dir = 10
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
},
/turf/simulated/floor/tiled,
/area/tether/station/stairs_two)
@@ -13703,14 +13690,11 @@
/turf/simulated/floor/tiled,
/area/tether/station/stairs_two)
"uS" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/tiled,
-/area/tether/station/stairs_two)
-"uT" = (
-/obj/machinery/light{
+/obj/structure/cable,
+/obj/machinery/power/apc{
dir = 4;
- icon_state = "tube1"
+ name = "east bump";
+ pixel_x = 28
},
/obj/effect/floor_decal/borderfloor{
dir = 4
@@ -13724,14 +13708,16 @@
/obj/effect/floor_decal/steeldecal/steel_decals7{
dir = 10
},
-/obj/effect/floor_decal/borderfloor/corner2{
- dir = 5
- },
-/obj/effect/floor_decal/corner/lightgrey/bordercorner2{
- dir = 5
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
},
/turf/simulated/floor/tiled,
/area/tether/station/stairs_two)
+"uT" = (
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/turf/simulated/floor/tiled,
+/area/tether/station/stairs_two)
"uU" = (
/obj/machinery/alarm{
dir = 4;
@@ -19748,6 +19734,71 @@
/turf/simulated/floor/tiled,
/area/hallway/station/starboard)
"EA" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 9
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/tiled,
+/area/tether/station/stairs_two)
+"EB" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/tether/station/stairs_two)
+"EC" = (
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 4
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 9
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 10
+ },
+/obj/effect/floor_decal/borderfloor/corner2{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/lightgrey/bordercorner2{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 9
+ },
+/turf/simulated/floor/tiled,
+/area/tether/station/stairs_two)
+"ED" = (
+/obj/structure/table/rack{
+ dir = 8;
+ layer = 2.9
+ },
+/obj/random/maintenance/clean,
+/turf/simulated/floor,
+/area/maintenance/station/sec_lower)
+"EE" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8;
icon_state = "propulsion_l"
@@ -19757,7 +19808,7 @@
/area/shuttle/large_escape_pod1/station{
base_turf = /turf/simulated/mineral/floor/vacuum
})
-"EB" = (
+"EF" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8
},
@@ -19766,7 +19817,7 @@
/area/shuttle/large_escape_pod1/station{
base_turf = /turf/simulated/mineral/floor/vacuum
})
-"EC" = (
+"EG" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8;
icon_state = "propulsion_r"
@@ -19776,14 +19827,6 @@
/area/shuttle/large_escape_pod1/station{
base_turf = /turf/simulated/mineral/floor/vacuum
})
-"ED" = (
-/obj/structure/table/rack{
- dir = 8;
- layer = 2.9
- },
-/obj/random/maintenance/clean,
-/turf/simulated/floor,
-/area/maintenance/station/sec_lower)
"EH" = (
/obj/random/junk,
/obj/effect/floor_decal/techfloor{
@@ -29835,11 +29878,11 @@ pK
UU
rg
rT
-eJ
-sz
-sz
-sz
-uS
+sd
+sA
+up
+uT
+EB
vu
uP
sw
@@ -29977,11 +30020,11 @@ pL
qr
rh
rU
-eN
-sA
+sz
tJ
-up
-uT
+uS
+EA
+EC
vv
vv
sw
@@ -31535,10 +31578,10 @@ fu
fq
oR
kj
+eJ
pQ
-qC
-nU
-sc
+qD
+rP
sD
tk
tM
@@ -31677,10 +31720,10 @@ fu
fq
oS
kj
+eN
pR
-qD
-rp
-sc
+qE
+rP
sD
tl
tN
@@ -31819,10 +31862,10 @@ fw
fq
kj
kj
-pS
-qE
+pO
+qC
+rp
rq
-sd
sE
sE
sE
@@ -32554,11 +32597,11 @@ AN
Ci
Bw
yY
-EA
-EB
-EB
-EB
-EC
+EE
+EF
+EF
+EF
+EG
yY
ac
ac
diff --git a/vorestation.dme b/vorestation.dme
index 96a687412d..af93f3e9db 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1625,6 +1625,7 @@
#include "code\modules\clothing\head\jobs.dm"
#include "code\modules\clothing\head\misc.dm"
#include "code\modules\clothing\head\misc_special.dm"
+#include "code\modules\clothing\head\misc_vr.dm"
#include "code\modules\clothing\head\pilot_helmet.dm"
#include "code\modules\clothing\head\soft_caps.dm"
#include "code\modules\clothing\head\solgov.dm"