diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index 455732fa7c6..9373bc342c4 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -566,3 +566,252 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
var/global/list/weavable_structures = list()
var/global/list/weavable_items = list()
+
+
+var/global/list/xenobio_metal_materials_normal = list(
+ /obj/item/stack/material/steel = 20,
+ /obj/item/stack/material/glass = 15,
+ /obj/item/stack/material/plastic = 12,
+ /obj/item/stack/material/wood = 12,
+ /obj/item/stack/material/cardboard = 6,
+ /obj/item/stack/material/sandstone = 5,
+ /obj/item/stack/material/log = 5,
+ /obj/item/stack/material/lead = 5,
+ /obj/item/stack/material/iron = 5,
+ /obj/item/stack/material/graphite = 5,
+ /obj/item/stack/material/copper = 4,
+ /obj/item/stack/material/tin = 4,
+ /obj/item/stack/material/bronze = 4,
+ /obj/item/stack/material/aluminium = 4)
+
+var/global/list/xenobio_metal_materials_adv = list(
+ /obj/item/stack/material/glass/reinforced = 15,
+ /obj/item/stack/material/marble = 10,
+ /obj/item/stack/material/plasteel = 10,
+ /obj/item/stack/material/glass/phoronglass = 10,
+ /obj/item/stack/material/wood/sif = 5,
+ /obj/item/stack/material/wood/hard = 5,
+ /obj/item/stack/material/log/sif = 5,
+ /obj/item/stack/material/log/hard = 5,
+ /obj/item/stack/material/glass/phoronrglass = 5,
+ /obj/item/stack/material/glass/titanium = 3,
+ /obj/item/stack/material/glass/plastitanium = 3,
+ /obj/item/stack/material/durasteel = 2,
+ /obj/item/stack/material/painite = 1,
+ /obj/item/stack/material/void_opal = 1,
+ /obj/item/stack/material/quartz = 1)
+
+var/global/list/xenobio_metal_materials_weird = list(
+ /obj/item/stack/material/cloth = 10,
+ /obj/item/stack/material/leather = 5,
+ /obj/item/stack/material/fiber = 5,
+ /obj/item/stack/material/fur/wool = 7,
+ /obj/item/stack/material/snow = 3,
+ /obj/item/stack/material/snowbrick = 3,
+ /obj/item/stack/material/flint = 3,
+ /obj/item/stack/material/stick = 3,
+ /obj/item/stack/material/chitin = 1)
+
+var/global/list/xenobio_silver_materials_basic = list(
+ /obj/item/stack/material/silver = 10,
+ /obj/item/stack/material/uranium = 8,
+ /obj/item/stack/material/gold = 6,
+ /obj/item/stack/material/titanium = 4,
+ /obj/item/stack/material/phoron = 1)
+
+var/global/list/xenobio_silver_materials_adv = list(
+ /obj/item/stack/material/deuterium = 5,
+ /obj/item/stack/material/tritium = 5,
+ /obj/item/stack/material/osmium = 5,
+ /obj/item/stack/material/mhydrogen = 3,
+ /obj/item/stack/material/diamond = 2,
+ /obj/item/stack/material/verdantium = 1)
+
+var/global/list/xenobio_silver_materials_special = list(
+ /obj/item/stack/material/valhollide = 1,
+ /obj/item/stack/material/morphium = 1,
+ /obj/item/stack/material/supermatter = 1)
+
+var/global/list/xenobio_gold_mobs_hostile = list(
+ /mob/living/simple_mob/vore/alienanimals/space_jellyfish,
+ /mob/living/simple_mob/vore/alienanimals/skeleton,
+ /mob/living/simple_mob/vore/alienanimals/space_ghost,
+ /mob/living/simple_mob/vore/alienanimals/startreader,
+ /mob/living/simple_mob/animal/passive/mouse/operative,
+ /mob/living/simple_mob/animal/giant_spider,
+ /mob/living/simple_mob/animal/giant_spider/frost,
+ /mob/living/simple_mob/animal/giant_spider/electric,
+ /mob/living/simple_mob/animal/giant_spider/hunter,
+ /mob/living/simple_mob/animal/giant_spider/lurker,
+ /mob/living/simple_mob/animal/giant_spider/pepper,
+ /mob/living/simple_mob/animal/giant_spider/thermic,
+ /mob/living/simple_mob/animal/giant_spider/tunneler,
+ /mob/living/simple_mob/animal/giant_spider/webslinger,
+ /mob/living/simple_mob/animal/giant_spider/phorogenic,
+ /mob/living/simple_mob/animal/giant_spider/carrier,
+ /mob/living/simple_mob/animal/giant_spider/nurse,
+ /mob/living/simple_mob/animal/giant_spider/ion,
+ /mob/living/simple_mob/animal/giant_spider/nurse/queen,
+ /mob/living/simple_mob/animal/sif/diyaab,
+ /mob/living/simple_mob/animal/sif/duck,
+ /mob/living/simple_mob/animal/sif/frostfly,
+ /mob/living/simple_mob/animal/sif/glitterfly,
+ /mob/living/simple_mob/animal/sif/hooligan_crab,
+ /mob/living/simple_mob/animal/sif/kururak,
+ /mob/living/simple_mob/animal/sif/leech,
+ /mob/living/simple_mob/animal/sif/tymisian,
+ /mob/living/simple_mob/animal/sif/sakimm,
+ /mob/living/simple_mob/animal/sif/savik,
+ /mob/living/simple_mob/animal/sif/shantak,
+ /mob/living/simple_mob/animal/sif/siffet,
+ /mob/living/simple_mob/animal/space/alien,
+ /mob/living/simple_mob/animal/space/alien/drone,
+ /mob/living/simple_mob/animal/space/alien/sentinel,
+ /mob/living/simple_mob/animal/space/alien/sentinel/praetorian,
+ /mob/living/simple_mob/animal/space/alien/queen,
+ /mob/living/simple_mob/animal/space/alien/queen/empress,
+ /mob/living/simple_mob/animal/space/alien/queen/empress/mother,
+ /mob/living/simple_mob/animal/space/bats,
+ /mob/living/simple_mob/animal/space/bear,
+ /mob/living/simple_mob/animal/space/carp,
+ /mob/living/simple_mob/animal/space/carp/large,
+ /mob/living/simple_mob/animal/space/carp/large/huge,
+ /mob/living/simple_mob/animal/space/goose,
+ /mob/living/simple_mob/creature,
+ /mob/living/simple_mob/faithless,
+ /mob/living/simple_mob/tomato,
+ /mob/living/simple_mob/animal/space/tree,
+ /mob/living/simple_mob/vore/aggressive/corrupthound,
+ /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi,
+ /mob/living/simple_mob/vore/aggressive/deathclaw,
+ /mob/living/simple_mob/vore/aggressive/dino,
+ /mob/living/simple_mob/vore/aggressive/dragon,
+ /mob/living/simple_mob/vore/aggressive/frog,
+ /mob/living/simple_mob/otie,
+ /mob/living/simple_mob/otie/red,
+ /mob/living/simple_mob/vore/aggressive/panther,
+ /mob/living/simple_mob/vore/aggressive/rat,
+ /mob/living/simple_mob/vore/aggressive/giant_snake,
+ /mob/living/simple_mob/vore/sect_drone,
+ /mob/living/simple_mob/vore/sect_queen,
+ /mob/living/simple_mob/vore/weretiger,
+ /mob/living/simple_mob/animal/wolf,
+ /mob/living/simple_mob/vore/xeno_defanged)
+
+var/global/list/xenobio_gold_mobs_bosses = list(
+ /mob/living/simple_mob/animal/giant_spider/broodmother,
+ /mob/living/simple_mob/vore/leopardmander,
+ /mob/living/simple_mob/vore/leopardmander/blue,
+ /mob/living/simple_mob/vore/leopardmander/exotic,
+ /mob/living/simple_mob/vore/greatwolf,
+ /mob/living/simple_mob/vore/greatwolf/black,
+ /mob/living/simple_mob/vore/greatwolf/grey,
+ /mob/living/simple_mob/vore/bigdragon)
+
+var/global/list/xenobio_gold_mobs_safe = list(
+ /mob/living/simple_mob/vore/alienanimals/dustjumper,
+ /mob/living/simple_mob/vore/alienanimals/teppi,
+ /mob/living/simple_mob/animal/passive/chicken,
+ /mob/living/simple_mob/animal/passive/cow,
+ /mob/living/simple_mob/animal/goat,
+ /mob/living/simple_mob/animal/passive/crab,
+ /mob/living/simple_mob/animal/passive/mouse/jerboa,
+ /mob/living/simple_mob/animal/passive/lizard,
+ /mob/living/simple_mob/animal/passive/lizard/large,
+ /mob/living/simple_mob/animal/passive/yithian,
+ /mob/living/simple_mob/animal/passive/tindalos,
+ /mob/living/simple_mob/animal/passive/mouse,
+ /mob/living/simple_mob/animal/passive/penguin,
+ /mob/living/simple_mob/animal/passive/opossum,
+ /mob/living/simple_mob/animal/passive/cat,
+ /mob/living/simple_mob/animal/passive/dog/corgi,
+ /mob/living/simple_mob/animal/passive/dog/void_puppy,
+ /mob/living/simple_mob/animal/passive/dog/bullterrier,
+ /mob/living/simple_mob/animal/passive/dog/tamaskan,
+ /mob/living/simple_mob/animal/passive/dog/brittany,
+ /mob/living/simple_mob/animal/passive/fox,
+ /mob/living/simple_mob/animal/passive/fox/syndicate,
+ /mob/living/simple_mob/animal/passive/hare,
+ /mob/living/simple_mob/animal/passive/pillbug,
+ /mob/living/simple_mob/animal/passive/gaslamp,
+ /mob/living/simple_mob/animal/passive/snake,
+ /mob/living/simple_mob/animal/passive/snake/red,
+ /mob/living/simple_mob/animal/passive/snake/python,
+ /mob/living/simple_mob/vore/bee,
+ /mob/living/simple_mob/vore/fennec,
+ /mob/living/simple_mob/vore/fennix,
+ /mob/living/simple_mob/vore/hippo,
+ /mob/living/simple_mob/vore/horse,
+ /mob/living/simple_mob/animal/space/jelly,
+ /mob/living/simple_mob/vore/oregrub,
+ /mob/living/simple_mob/vore/oregrub/lava,
+ /mob/living/simple_mob/vore/rabbit,
+ /mob/living/simple_mob/vore/redpanda,
+ /mob/living/simple_mob/vore/sheep,
+ /mob/living/simple_mob/vore/solargrub)
+
+var/global/list/xenobio_gold_mobs_birds = list(/mob/living/simple_mob/animal/passive/bird/black_bird,
+ /mob/living/simple_mob/animal/passive/bird/azure_tit,
+ /mob/living/simple_mob/animal/passive/bird/european_robin,
+ /mob/living/simple_mob/animal/passive/bird/goldcrest,
+ /mob/living/simple_mob/animal/passive/bird/ringneck_dove,
+ /mob/living/simple_mob/animal/passive/bird/parrot,
+ /mob/living/simple_mob/animal/passive/bird/parrot/kea,
+ /mob/living/simple_mob/animal/passive/bird/parrot/eclectus,
+ /mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot,
+ /mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique,
+ /mob/living/simple_mob/animal/passive/bird/parrot/white_caique,
+ /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar,
+ /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue,
+ /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen,
+ /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel,
+ /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white,
+ /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish,
+ /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey,
+ /mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo,
+ /mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo,
+ /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo) //There's too dang many
+
+var/global/list/xenobio_cerulean_potions = list(
+ /obj/item/slimepotion/enhancer,
+ /obj/item/slimepotion/stabilizer,
+ /obj/item/slimepotion/mutator,
+ /obj/item/slimepotion/docility,
+ /obj/item/slimepotion/steroid,
+ /obj/item/slimepotion/unity,
+ /obj/item/slimepotion/loyalty,
+ /obj/item/slimepotion/friendship,
+ /obj/item/slimepotion/feeding,
+ /obj/item/slimepotion/infertility,
+ /obj/item/slimepotion/fertility,
+ /obj/item/slimepotion/shrink,
+ /obj/item/slimepotion/death,
+ /obj/item/slimepotion/ferality,
+ /obj/item/slimepotion/reinvigoration,
+ /obj/item/slimepotion/mimic,
+ /obj/item/slimepotion/sentience,
+ /obj/item/slimepotion/obedience)
+
+var/global/list/xenobio_rainbow_extracts = list(
+ /obj/item/slime_extract/grey = 2,
+ /obj/item/slime_extract/metal = 3,
+ /obj/item/slime_extract/blue = 3,
+ /obj/item/slime_extract/purple = 1,
+ /obj/item/slime_extract/orange = 3,
+ /obj/item/slime_extract/yellow = 3,
+ /obj/item/slime_extract/gold = 3,
+ /obj/item/slime_extract/silver = 3,
+ /obj/item/slime_extract/dark_purple = 2,
+ /obj/item/slime_extract/dark_blue = 3,
+ /obj/item/slime_extract/red = 3,
+ /obj/item/slime_extract/green = 3,
+ /obj/item/slime_extract/pink = 3,
+ /obj/item/slime_extract/oil = 3,
+ /obj/item/slime_extract/bluespace = 3,
+ /obj/item/slime_extract/cerulean = 1,
+ /obj/item/slime_extract/amber = 3,
+ /obj/item/slime_extract/sapphire = 3,
+ /obj/item/slime_extract/ruby = 3,
+ /obj/item/slime_extract/emerald = 3,
+ /obj/item/slime_extract/light_pink = 1,
+ /obj/item/slime_extract/rainbow = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 3b20ccbb5c2..f0ff01c05ad 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -486,30 +486,3 @@
light_range = 8
light_power = 0.1
light_color = "#49F37C"
-
-/*
- * Slime Extract
- */
-
-/obj/item/device/flashlight/slime
- gender = PLURAL
- name = "glowing slime extract"
- desc = "A slimy ball that appears to be glowing from bioluminesence."
- icon = 'icons/obj/lighting.dmi'
- icon_state = "floor1" //not a slime extract sprite but... something close enough!
- item_state = "slime"
- light_color = "#FFF423"
- w_class = ITEMSIZE_TINY
- light_range = 6
- on = 1 //Bio-luminesence has one setting, on.
- power_use = 0
-
-/obj/item/device/flashlight/slime/New()
- ..()
- set_light(light_range, light_power, light_color)
-
-/obj/item/device/flashlight/slime/update_brightness()
- return
-
-/obj/item/device/flashlight/slime/attack_self(mob/user)
- return //Bio-luminescence does not toggle.
diff --git a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm
index 563c9953e6d..bc4f9303e3b 100644
--- a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm
+++ b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm
@@ -76,6 +76,10 @@
if(amount > 0)
if(rabid)
return
+ if(my_slime.untamable)
+ holder.say("Grrr...")
+ holder.add_modifier(/datum/modifier/berserk, 30 SECONDS)
+ enrage()
var/justified = my_slime.is_justified_to_discipline() // This will also consider the AI-side of that proc.
remove_target() // Stop attacking.
@@ -95,13 +99,6 @@
discipline = between(0, discipline + amount, 10)
my_slime.update_mood()
-// This slime always enrages if disciplined.
-/datum/ai_holder/simple_mob/xenobio_slime/red/adjust_discipline(amount, silent)
- if(amount > 0 && !rabid)
- holder.say("Grrr...")
- holder.add_modifier(/datum/modifier/berserk, 30 SECONDS)
- enrage()
-
/datum/ai_holder/simple_mob/xenobio_slime/handle_special_strategical()
discipline_decay()
@@ -145,6 +142,16 @@
my_slime.update_mood()
my_slime.visible_message(span("danger", "\The [my_slime] enrages!"))
+// Called to relax from being rabid (when blue slime core was used).
+/datum/ai_holder/simple_mob/xenobio_slime/proc/relax()
+ var/mob/living/simple_mob/slime/xenobio/my_slime = holder
+ if(my_slime.harmless)
+ return
+ if(rabid)
+ rabid = FALSE
+ my_slime.update_mood()
+ my_slime.visible_message(span("danger", "\The [my_slime] calms down."))
+
// Called when using a pacification agent (or it's Kendrick being initalized).
/datum/ai_holder/simple_mob/xenobio_slime/proc/pacify()
remove_target() // So it stops trying to kill them.
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 72d32abb8c8..ed1e3fb8be4 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
@@ -489,6 +489,7 @@
slime_color = "red"
coretype = /obj/item/slime_extract/red
movement_cooldown = 0 // See above.
+ untamable = TRUE // Will enrage if disciplined.
description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go rabid and berserk."
@@ -499,7 +500,7 @@
/mob/living/simple_mob/slime/xenobio/orange
)
- ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/red // Will enrage if disciplined.
+ ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime
/mob/living/simple_mob/slime/xenobio/green
diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm
index dd22ad7fd0f..a5782f880cb 100644
--- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm
@@ -11,6 +11,9 @@
var/mob/living/victim = null // the person the slime is currently feeding on
var/rainbow_core_candidate = TRUE // If false, rainbow cores cannot make this type randomly.
var/mutation_chance = 25 // Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes.
+ var/split_amount = 4 // Amount of children we will normally have. Half of that for dead adult slimes. Is NOT carried across generations.
+ var/untamable = FALSE //Makes slime untamable via discipline.
+ var/untamable_inheirit = FALSE //Makes slime inheirit its untamability.
var/list/slime_mutation = list(
/mob/living/simple_mob/slime/xenobio/orange,
/mob/living/simple_mob/slime/xenobio/metal,
@@ -54,7 +57,6 @@
AI.resentment = max(previous_AI.resentment - 1, 0)
AI.rabid = previous_AI.rabid
-
/mob/living/simple_mob/slime/xenobio/update_icon()
icon_living = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"][victim ? " eating" : ""]"
icon_dead = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"] dead"
@@ -107,6 +109,21 @@
update_icon()
update_name()
+/mob/living/simple_mob/slime/xenobio/proc/make_baby()
+ if(!is_adult)
+ return
+
+ is_adult = FALSE
+ melee_damage_lower = round(melee_damage_lower / 2) // 20
+ melee_damage_upper = round(melee_damage_upper / 2) // 30
+ maxHealth = initial(maxHealth)
+ health = clamp(health, 0, maxHealth)
+ max_nutrition = initial(max_nutrition)
+ nutrition = 400
+ amount_grown = 0
+ update_icon()
+ update_name()
+
/mob/living/simple_mob/slime/xenobio/proc/update_name()
if(harmless) // Docile slimes are generally named, so we shouldn't mess with it.
return
@@ -142,6 +159,13 @@
var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder
AI.enrage()
+/mob/living/simple_mob/slime/xenobio/proc/relax()
+ if(harmless)
+ return
+ if(has_AI())
+ var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder
+ AI.relax()
+
/mob/living/simple_mob/slime/xenobio/proc/pacify()
harmless = TRUE
if(has_AI())
@@ -208,12 +232,12 @@
if(free)
free_tiles++
- if(free_tiles < 3) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies.
+ if(free_tiles < split_amount-1) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies.
to_chat(src, span("warning", "It is too cramped here to reproduce..."))
return
var/list/babies = list()
- for(var/i = 1 to 4)
+ for(var/i = 1 to split_amount)
babies.Add(make_new_slime())
var/mob/living/simple_mob/slime/new_slime = pick(babies)
@@ -245,6 +269,9 @@
if(!istype(baby, /mob/living/simple_mob/slime/xenobio/rainbow))
baby.unity = unity
+ if(untamable_inheirit)
+ baby.untamable = untamable
+ baby.untamable_inheirit = untamable_inheirit
baby.faction = faction
baby.friends = friends.Copy()
diff --git a/code/modules/reagents/reactions/instant/instant_vr.dm b/code/modules/reagents/reactions/instant/instant_vr.dm
index c9b3ad1dc77..bbc18fa3229 100644
--- a/code/modules/reagents/reactions/instant/instant_vr.dm
+++ b/code/modules/reagents/reactions/instant/instant_vr.dm
@@ -204,240 +204,17 @@
required_reagents = list("plantcolony" = 5, "virusfood" = 5)
result_amount = 60
+///////////////////////////////////////////////////////////////////////////////////
+/// Upstream Adjustments
+/decl/chemical_reaction/instant/biomass
+ result_amount = 6 // Roughly 120u per phoron sheet
+
///////////////////////////////
-//SLIME CORES BELOW HERE///////
+//SLIME-RELATED BELOW HERE///////
///////////////////////////////
-/decl/chemical_reaction/instant/slime_food
- name = "Slime Bork"
- id = "m_tele2"
- result = null
- required_reagents = list("phoron" = 10, "slimejelly" = 5, "nutriment" = 20)
- result_amount = 1
-
-/decl/chemical_reaction/instant/slime_food/on_reaction(var/datum/reagents/holder)
- var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks)
-
- playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/i = 1, i <= 4 + rand(1,2), i++)
- var/chosen = pick(borks)
- var/obj/B = new chosen
- if(B)
- B.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(B, pick(NORTH,SOUTH,EAST,WEST))
-
-/decl/chemical_reaction/instant/materials
- name = "Slime materials"
- id = "slimematerial"
- result = null
- required_reagents = list("phoron" = 20, "slimejelly" = 40, "aluminum" = 20) //Woah there! You have the possibility of making diamonds! 8 ground up slimes required for one of these, and you still have a 10% chance for it to fail.
- result_amount = 1
-
-/decl/chemical_reaction/instant/materials/on_reaction(var/datum/reagents/holder)
- var/fail_chance = rand(1,1000)
- if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials.
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The solution begins to vibrate violently!"), 1) // It was at this moment, the Xenobiologist knew... he fucked up.
- sleep(30)
- playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The reaction begins to rapidly sizzle and swell outwards!"), 1)
- sleep(20)
- explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person.
- empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast!
- return
-
- if(fail_chance < 101) // 10% chance of it not working at all.
- playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime core fizzles disappointingly."), 1)
- return
-
- var/blocked = list(
- /obj/item/stack/material, //Technical stacks
- /obj/item/stack/hairlesshide, //Useless leather production steps
- /obj/item/stack/wetleather,
- /obj/item/stack/material/algae/ten) //Why is this one even a separate thing
- blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs
- blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway
-
- var/rare_types = list(
- /obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create
- /obj/item/stack/material/morphium/hull,
- /obj/item/stack/material/valhollide,
- /obj/item/stack/material/supermatter)
-
- var/list/material = typesof(/obj/item/stack/material) - blocked
-
- playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
-
- var/spawn_amount = rand(1,50)
- var/chosen = pick(material)
- if(chosen in rare_types)
- spawn_amount = rand(1,15)
- new chosen(get_turf(holder.my_atom), spawn_amount)
-
-/decl/chemical_reaction/instant/slimelight
- name = "Slime Glow"
- id = "m_glow"
- result = null
- required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 10) //Takes 10 water so it doesn't mess with the frost oil.
- result_amount = 1
-
-/decl/chemical_reaction/instant/slimelight/on_reaction(var/datum/reagents/holder)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text(" The contents of the slime core harden and begin to emit a warm, bright light."), 1)
- var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
- F.loc = get_turf(holder.my_atom)
-
-
-/decl/chemical_reaction/instant/slimephoron
- name = "Slime Phoron"
- id = "m_plasma"
- result = null
- required_reagents = list("phoron" = 20, "uranium" = 20, "slimejelly" = 20)
- result_amount = 1
-
-/decl/chemical_reaction/instant/slimephoron/on_reaction(var/datum/reagents/holder)
- new /obj/item/stack/material/phoron(get_turf(holder.my_atom), 10)
-
-/decl/chemical_reaction/instant/slimefreeze
- name = "Slime Freeze"
- id = "m_freeze"
- result = null
- required_reagents = list("phoron" = 10, "coolant" = 10, "slimejelly" = 10)
- result_amount = 1
-
-/decl/chemical_reaction/instant/slimefreeze/on_reaction(var/datum/reagents/holder)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently!"), 1)
- sleep(50)
- playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
- for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
- M.bodytemperature -= 140
- to_chat(M, " You suddenly feel a chill!")
-
-/decl/chemical_reaction/instant/slimefrost
- name = "Slime Frost Oil"
- id = "m_frostoil"
- result = "frostoil"
- required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 5, "coolant" = 5)
- result_amount = 10
-
-/decl/chemical_reaction/instant/slimefire
- name = "Slime fire"
- id = "m_fire"
- result = null
- required_reagents = list("phoron" = 60, "slimejelly" = 30, "potassium" = 30)
- result_amount = 1
-
-/decl/chemical_reaction/instant/slimefire/on_reaction(var/datum/reagents/holder)
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently!"), 1)
- sleep(50)
- var/turf/location = get_turf(holder.my_atom.loc)
- for(var/turf/simulated/floor/target_tile in range(0,location))
- target_tile.assume_gas("phoron", 25, 1400)
- spawn (0) target_tile.hotspot_expose(700, 400)
-
/decl/chemical_reaction/instant/slimeify
name = "Advanced Mutation Toxin"
id = "advmutationtoxin2"
result = "advmutationtoxin"
required_reagents = list("phoron" = 15, "slimejelly" = 15, "mutationtoxin" = 15) //In case a xenobiologist wants to become a fully fledged slime person.
- result_amount = 1
-
-/decl/chemical_reaction/instant/slimeheal //A slime healing mixture. Why not.
- name = "Slime Health"
- id = "slimeheal"
- result = "null"
- required_reagents = list("phoron" = 10, "bicaridine" = 10, "kelotane" = 10, "inaprovaline" = 10, "slimejelly" = 10)
-
-/decl/chemical_reaction/instant/slimeheal/on_reaction(var/datum/reagents/holder, var/created_volume)
- for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
- to_chat(C, "A wave of energy suddenly invigorates you.")
- C.adjustBruteLoss(-25)
- C.adjustFireLoss(-25)
- C.adjustToxLoss(-25)
- C.adjustOxyLoss(-25)
- C.adjustBrainLoss(-25)
- C.adjustCloneLoss(-25)
- C.updatehealth()
-
-/decl/chemical_reaction/instant/slimejelly
- name = "Slime Jam"
- id = "m_jam"
- result = "slimejelly"
- required_reagents = list("phoron" = 20, "sugar" = 50, "lithium" = 50) //In case a xenobiologist is impatient and is willing to drain their dispenser resources, along with plasma!
- result_amount = 5
-
-/decl/chemical_reaction/instant/slimevore
- name = "Slime Vore" // Hostile vore mobs only
- id = "m_tele"
- result = null
- required_reagents = list("phoron" = 20, "nutriment" = 20, "sugar" = 20, "mutationtoxin" = 20) //Can't do slime jelly as it'll conflict with another, but mutation toxin will do.
- result_amount = 1
-
-/decl/chemical_reaction/instant/slimevore/on_reaction(var/datum/reagents/holder)
- var/mob_path = /mob/living/simple_mob
- var/blocked = list( //List of things we do NOT want to spawn
- /mob/living/simple_mob, //Technical parent mobs
- /mob/living/simple_mob/animal,
- /mob/living/simple_mob/animal/passive,
- /mob/living/simple_mob/animal/space,
- /mob/living/simple_mob/blob,
- /mob/living/simple_mob/mechanical,
- /mob/living/simple_mob/mechanical/mecha,
- /mob/living/simple_mob/slime,
- /mob/living/simple_mob/vore,
- /mob/living/simple_mob/vore/aggressive,
- /mob/living/simple_mob/illusion, //Other technical mobs
- /mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs
- /mob/living/simple_mob/animal/passive/cat/runtime,
- /mob/living/simple_mob/animal/passive/cat/bones,
- /mob/living/simple_mob/animal/passive/cat/tabiranth,
- /mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar,
- /mob/living/simple_mob/animal/passive/dog/corgi/Ian,
- /mob/living/simple_mob/animal/passive/dog/corgi/Lisa,
- /mob/living/simple_mob/animal/passive/dog/tamaskan/Spice,
- /mob/living/simple_mob/animal/passive/fox/renault,
- /mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter,
- /mob/living/simple_mob/animal/passive/bird/parrot/poly,
- /mob/living/simple_mob/animal/sif/fluffy,
- /mob/living/simple_mob/animal/sif/fluffy/silky,
- /mob/living/simple_mob/animal/passive/snake/python/noodle,
- /mob/living/simple_mob/slime/xenobio/rainbow/kendrick,
- /mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads
- /mob/living/simple_mob/animal/space/space_worm/head/severed,
- /mob/living/simple_mob/animal/borer, //Event/player-control-only mobs
- /mob/living/simple_mob/vore/hostile/morph
- )//exclusion list for things you don't want the reaction to create.
- blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities
- blocked += typesof(/mob/living/simple_mob/construct) //Should only exist
- blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled
- blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things
- var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs
-
- playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
- var/spawn_count = rand(1,3)
- for(var/i = 1, i <= spawn_count, i++)
- var/chosen = pick(voremobs)
- var/mob/living/simple_mob/C = new chosen
- C.faction = "slimesummon"
- C.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
-
-/decl/chemical_reaction/instant/slime/sapphire_mutation
- name = "Slime Mutation Toxins"
- id = "slime_mutation_tox"
- result = "mutationtoxin"
- required_reagents = list("blood" = 5)
- result_amount = 30
- required = /obj/item/slime_extract/sapphire
-
-/decl/chemical_reaction/instant/biomass
- result_amount = 6 // Roughly 120u per phoron sheet
+ result_amount = 1
\ No newline at end of file
diff --git a/code/modules/xenobio/items/extracts.dm b/code/modules/xenobio/items/extracts.dm
index dacebb203c7..188c8874c2f 100644
--- a/code/modules/xenobio/items/extracts.dm
+++ b/code/modules/xenobio/items/extracts.dm
@@ -1,3 +1,5 @@
+//VOREStation Note - we use different xenobio balance in extracts_vr, keep this unticked.
+
// Base
/obj/item/slime_extract
name = "slime extract"
diff --git a/code/modules/xenobio/items/extracts_vr.dm b/code/modules/xenobio/items/extracts_vr.dm
new file mode 100644
index 00000000000..239da388963
--- /dev/null
+++ b/code/modules/xenobio/items/extracts_vr.dm
@@ -0,0 +1,1648 @@
+// Base
+/obj/item/slime_extract
+ name = "slime extract"
+ desc = "Goo extracted from a slime, which can do different things depending on its color and what it is injected with."
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "grey slime extract"
+ force = 1
+ w_class = ITEMSIZE_TINY
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 6
+ origin_tech = list(TECH_BIO = 4)
+ var/uses = 1 // uses before it goes inert
+ var/enhanced = FALSE
+ var/slime_type
+ flags = OPENCONTAINER
+
+
+/obj/item/slime_extract/New()
+ ..()
+ create_reagents(60)
+
+/obj/item/slime_extract/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/slimepotion/enhancer))
+ if(enhanced)
+ to_chat(user, "You cannot enhance this extract further!")
+ return ..()
+ to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.")
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ uses += 2
+ enhanced = TRUE
+ name = initial(name) // To remove the 'inert' part of the name.
+ qdel(O)
+ else if(istype(O, /obj/item/slimepotion/reinvigoration))
+ to_chat(user, "You apply the reinvigorator to the slime extract. It rapidly expands, creating a brand new slime!")
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ new slime_type(get_turf(src))
+ qdel(O)
+ qdel(src)
+ ..()
+
+/obj/item/slime_extract/examine(mob/user)
+ . = ..()
+ if(uses)
+ . += "This extract has [uses] more use\s."
+ else
+ . += "This extract is inert."
+
+/decl/chemical_reaction/instant/slime
+ var/required = null
+
+/decl/chemical_reaction/instant/slime/can_happen(var/datum/reagents/holder)
+ if(holder.my_atom && istype(holder.my_atom, required))
+ var/obj/item/slime_extract/T = holder.my_atom
+ if(T.uses > 0)
+ return ..()
+ return FALSE
+
+/decl/chemical_reaction/instant/slime/on_reaction(var/datum/reagents/holder)
+ var/obj/item/slime_extract/T = holder.my_atom
+ T.uses--
+ if(T.uses <= 0)
+ T.visible_message("[bicon(T)]\The [T] goes inert.")
+ T.name = "inert [initial(T.name)]"
+
+
+// ***************
+// * Grey slimes *
+// ***************
+
+/obj/item/slime_extract/grey
+ name = "grey slime extract"
+ icon_state = "grey slime extract"
+ description_info = "This extract will create a new grey baby slime if injected with phoron, or some new monkey cubes if injected with blood."
+ slime_type = /mob/living/simple_mob/slime/xenobio
+
+
+/decl/chemical_reaction/instant/slime/grey_new_slime
+ name = "Slime Spawn"
+ id = "m_grey_spawn"
+ result = null
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/grey
+
+/decl/chemical_reaction/instant/slime/grey_new_slime/on_reaction(var/datum/reagents/holder)
+ holder.my_atom.visible_message("Infused with phoron, the core begins to quiver and grow, and soon a new baby slime emerges from it!")
+ new /mob/living/simple_mob/slime/xenobio(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/grey_monkey
+ name = "Slime Monkey"
+ id = "m_grey_monkey"
+ result = null
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/grey
+
+/decl/chemical_reaction/instant/slime/grey_monkey/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 4)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/grey_slimejelly
+ name = "Slime Jelly"
+ id = "m_grey_jelly"
+ result = "slimejelly"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/grey
+
+// ****************
+// * Metal slimes *
+// ****************
+
+/obj/item/slime_extract/metal
+ name = "metal slime extract"
+ icon_state = "metal slime extract"
+ description_info = "This extract will create a metamorphic liquid which will transform into metallic liquid it comes into contact with, when injected with phoron. \
+ It can also create a metallic binding liquid which will force metallic liquids to mix to form alloys when solified, when injected with water."
+ slime_type = /mob/living/simple_mob/slime/xenobio/metal
+
+
+/decl/chemical_reaction/instant/slime/metal_materials_basic
+ name = "Slime Basic Construction Materials"
+ id = "m_metal_basic"
+ result = null
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/metal
+
+/decl/chemical_reaction/instant/slime/metal_materials_basic/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 3)
+ var/type_to_spawn = pickweight(xenobio_metal_materials_normal)
+ new type_to_spawn(get_turf(holder.my_atom), 10)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/metal_materials_adv
+ name = "Slime Advanced Construction Materials"
+ id = "m_metal_adv"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/metal
+
+/decl/chemical_reaction/instant/slime/metal_materials_adv/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 2)
+ var/type_to_spawn = pickweight(xenobio_metal_materials_adv)
+ new type_to_spawn(get_turf(holder.my_atom), 10)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/metal_materials_weird
+ name = "Slime Weird Construction Materials"
+ id = "m_metal_weird"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/metal
+
+/decl/chemical_reaction/instant/slime/metal_materials_weird/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 3)
+ var/type_to_spawn = pickweight(xenobio_metal_materials_weird)
+ new type_to_spawn(get_turf(holder.my_atom), 5)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/metal_materials_steel
+ name = "Slime Weird Construction Materials"
+ id = "m_metal_steel"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/metal
+
+/decl/chemical_reaction/instant/slime/metal_materials_steel/on_reaction(var/datum/reagents/holder)
+ new /obj/item/stack/material/steel(get_turf(holder.my_atom), 25)
+ ..()
+
+// ***************
+// * Blue slimes *
+// ***************
+
+/obj/item/slime_extract/blue
+ name = "blue slime extract"
+ icon_state = "blue slime extract"
+ description_info = "This extract will create frost oil when injected with phoron, which can be used to solidify liquid metals. \
+ The extract can also create a slime stability agent when injected with blood, which reduces the odds of newly created slimes mutating into \
+ a different color when a slime reproduces."
+ slime_type = /mob/living/simple_mob/slime/xenobio/blue
+
+
+/decl/chemical_reaction/instant/slime/blue_frostoil
+ name = "Slime Frost Oil"
+ id = "m_blue_frostoil"
+ result = "frostoil"
+ required_reagents = list("phoron" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/blue
+
+
+/decl/chemical_reaction/instant/slime/blue_stability
+ name = "Slime Stability"
+ id = "m_blue_stability"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/blue
+
+/decl/chemical_reaction/instant/slime/blue_stability/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/stabilizer(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/blue_calm
+ name = "Slime Calm"
+ id = "m_blue_calm"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/blue
+
+/decl/chemical_reaction/instant/slime/blue_calm/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/simple_mob/slime/S in view(get_turf(holder.my_atom)))
+ if(S.stat)
+ continue
+
+ if(istype(S, /mob/living/simple_mob/slime/xenobio))
+ var/mob/living/simple_mob/slime/xenobio/X = S
+ if(X.harmless)
+ continue
+ if(!X.client)
+ X.relax()
+
+ S.remove_modifiers_of_type(/datum/modifier/berserk)
+
+ if(S.client) // Player slimes always have free will.
+ to_chat(S, "An intense wave of relaxing calm is felt from inside, but you remain in control of yourself.")
+
+ for(var/mob/living/carbon/human/H in view(get_turf(holder.my_atom)))
+ if(H.species.name == SPECIES_PROMETHEAN)
+ H.remove_modifiers_of_type(/datum/modifier/berserk)
+ to_chat(H, "An intense wave of relaxing calm is felt from inside, but you remain in control of yourself.")
+
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/blue_cryotoxin
+ name = "Slime Cryotoxin"
+ id = "m_blue_cryotoxin"
+ result = "cryotoxin"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/blue
+
+// *****************
+// * Purple slimes *
+// *****************
+
+/obj/item/slime_extract/purple
+ name = "purple slime extract"
+ icon_state = "purple slime extract"
+ description_info = "This extract can create a slime steroid agent when injected with phoron, which increases the amount of slime extracts the processor \
+ can extract from a slime specimen."
+ slime_type = /mob/living/simple_mob/slime/xenobio/purple
+
+
+/decl/chemical_reaction/instant/slime/purple_steroid
+ name = "Slime Steroid"
+ id = "m_purple_steroid"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/purple
+
+/decl/chemical_reaction/instant/slime/purple_steroid/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/steroid(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/purple_infertility
+ name = "Slime Infetility"
+ id = "m_purple_infertility"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/purple
+
+/decl/chemical_reaction/instant/slime/purple_infertility/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/infertility(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/purple_shrink
+ name = "Slime Shrink"
+ id = "m_purple_shrink"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/purple
+
+/decl/chemical_reaction/instant/slime/purple_shrink/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/shrink(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/purple_fertility
+ name = "Slime Fetility"
+ id = "m_purple_fertility"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/purple
+
+/decl/chemical_reaction/instant/slime/purple_fertility/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/fertility(get_turf(holder.my_atom))
+ ..()
+
+// *****************
+// * Orange slimes *
+// *****************
+
+/obj/item/slime_extract/orange
+ name = "orange slime extract"
+ icon_state = "orange slime extract"
+ description_info = "This extract creates a fire when injected with phoron, after a five second delay."
+ slime_type = /mob/living/simple_mob/slime/xenobio/orange
+
+
+/decl/chemical_reaction/instant/slime/orange_fire
+ name = "Slime Fire"
+ id = "m_orange_fire"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/orange
+
+/decl/chemical_reaction/instant/slime/orange_fire/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Orange extract reaction (fire) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ holder.my_atom.visible_message("\The [src] begins to vibrate violently!")
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ spawn(5 SECONDS)
+ if(holder && holder.my_atom)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(!istype(T))
+ return
+
+ for(var/turf/simulated/target_turf in view(2, T))
+ target_turf.assume_gas("volatile_fuel", 33, 1500+T0C)
+ target_turf.assume_gas("oxygen", 66, 1500+T0C)
+ spawn(0)
+ target_turf.hotspot_expose(1500+T0C, 400)
+
+ playsound(T, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/orange_heatwave
+ name = "Slime Heat Wave"
+ id = "m_orange_heatwave"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/orange
+
+/decl/chemical_reaction/instant/slime/orange_heatwave/on_reaction(var/datum/reagents/holder)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(!T) // Nullspace lacks zones.
+ return
+
+ if(!istype(T))
+ return
+
+ var/zone/Z = T.zone
+ if(!Z) // Paranoid.
+ return
+
+ log_and_message_admins("Orange extract reaction (heat wave) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+
+ var/list/nearby_things = view(T)
+
+ // Hurt mobs.
+ for(var/mob/living/L in nearby_things)
+ var/turf/simulated/their_turf = get_turf(L)
+ if(!istype(their_turf)) // Not simulated.
+ continue
+
+ if(!(their_turf in Z.contents)) // Not in the same zone.
+ continue
+
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ var/protection = H.get_heat_protection()
+
+ if(protection < 1)
+ var/cold_factor = abs(protection - 1)
+ H.bodytemperature = between(50, (H.bodytemperature - ((H.bodytemperature + 50) * cold_factor) ), H.bodytemperature)
+
+ if(protection < 0.7)
+ to_chat(L, "A scalding wave of heat overwhelms you!")
+ else
+ to_chat(L, "A scalding wave of heat passes by you, as your armor protects you from it.")
+ continue
+
+ // Now make it very cold.
+ var/datum/gas_mixture/env = T.return_air()
+ if(env)
+ // This is most likely physically impossible but when has that stopped slimes before?
+ env.add_thermal_energy(15 * 1000 * 1000)
+
+ playsound(T, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/orange_smoke
+ name = "Slime Smoke"
+ id = "m_orange_smoke"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/orange
+
+/decl/chemical_reaction/instant/slime/orange_smoke/on_reaction(var/datum/reagents/holder)
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem
+ S.attach(location)
+ S.set_up(holder, 120, 0, location)
+ playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
+ spawn(0)
+ S.start()
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/orange_pyrotoxin
+ name = "Slime Pyrotoxin"
+ id = "m_orange_pyrotoxin"
+ result = "thermite_v"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/orange
+
+// *****************
+// * Yellow slimes *
+// *****************
+
+/obj/item/slime_extract/yellow
+ name = "yellow slime extract"
+ icon_state = "yellow slime extract"
+ description_info = "This extract will create a special 10k capacity power cell that self recharges slowly over time, when injected with phoron. \
+ When injected with blood, it will create a glob of slime which glows brightly. If injected with water, it will emit a strong EMP, after a five second delay."
+ slime_type = /mob/living/simple_mob/slime/xenobio/yellow
+
+
+/decl/chemical_reaction/instant/slime/yellow_lightning
+ name = "Slime Lightning"
+ id = "m_yellow_lightning"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/yellow
+
+/decl/chemical_reaction/instant/slime/yellow_lightning/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Yellow extract reaction (lightning) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ holder.my_atom.visible_message("\The [src] begins to vibrate violently!")
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ spawn(5 SECONDS)
+ if(holder && holder.my_atom)
+ lightning_strike(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/yellow_flashlight
+ name = "Slime Flashlight"
+ id = "m_yellow_flashlight"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/yellow
+
+/decl/chemical_reaction/instant/slime/yellow_flashlight/on_reaction(var/datum/reagents/holder)
+ new /obj/item/device/flashlight/slime(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/yellow_emp
+ name = "Slime EMP"
+ id = "m_yellow_emp"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/yellow
+
+/decl/chemical_reaction/instant/slime/yellow_emp/on_reaction(var/datum/reagents/holder)
+ log_and_message_admins("Yellow extract reaction (emp) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+ holder.my_atom.visible_message("\The [src] begins to vibrate violently!")
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ spawn(5 SECONDS)
+ if(holder && holder.my_atom)
+ empulse(get_turf(holder.my_atom), 2, 4, 7, 10) // As strong as a normal EMP grenade.
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/yellow_battery
+ name = "Slime Cell"
+ id = "m_yellow_cell"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/yellow
+
+/decl/chemical_reaction/instant/slime/yellow_battery/on_reaction(var/datum/reagents/holder)
+ new /obj/item/weapon/cell/slime(get_turf(holder.my_atom))
+ ..()
+
+// ***************
+// * Gold slimes *
+// ***************
+
+/obj/item/slime_extract/gold
+ name = "gold slime extract"
+ icon_state = "gold slime extract"
+ description_info = "This extract will create 5u liquid gold when injected with phoron."
+ slime_type = /mob/living/simple_mob/slime/xenobio/gold
+
+
+/decl/chemical_reaction/instant/slime/gold_hostile_mob
+ name = "Slime Hostile Mob"
+ id = "m_gold_hostile_mob"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/gold
+
+/decl/chemical_reaction/instant/slime/gold_hostile_mob/on_reaction(var/datum/reagents/holder)
+ var/type_to_spawn = pickweight(xenobio_gold_mobs_hostile)
+ var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom))
+ for(var/l = 1, l <= rand(1, 3), l++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/gold_random_mobs
+ name = "Slime Random Mobs"
+ id = "m_gold_random_mobs"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/gold
+
+/decl/chemical_reaction/instant/slime/gold_random_mobs/on_reaction(var/datum/reagents/holder)
+ var/type_to_spawn
+ var/list/all_spawnable_types = list()
+ all_spawnable_types += xenobio_gold_mobs_safe
+ all_spawnable_types += xenobio_gold_mobs_hostile
+ all_spawnable_types += xenobio_gold_mobs_birds
+ for(var/j = 1, j <= 3, j++)
+ if(prob(1))
+ type_to_spawn = pickweight(xenobio_gold_mobs_bosses)
+ else
+ type_to_spawn = pickweight(all_spawnable_types)
+
+ var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom))
+ for(var/l = 1, l <= rand(1, 3), l++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/gold_safe_mob
+ name = "Slime Safe Mob"
+ id = "m_gold_safe_mob"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/gold
+
+/decl/chemical_reaction/instant/slime/gold_safe_mob/on_reaction(var/datum/reagents/holder)
+ var/type_to_spawn
+ if(prob(100/(xenobio_gold_mobs_safe.len + 1)))
+ type_to_spawn = pickweight(xenobio_gold_mobs_birds)
+ else
+ type_to_spawn = pickweight(xenobio_gold_mobs_safe)
+ var/mob/living/C = new type_to_spawn(get_turf(holder.my_atom))
+ for(var/l = 1, l <= rand(1, 3), l++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/gold_materials_gold
+ name = "Slime Gold"
+ id = "m_gold_gold"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/gold
+
+/decl/chemical_reaction/instant/slime/gold_materials_gold/on_reaction(var/datum/reagents/holder)
+ new /obj/item/stack/material/gold(get_turf(holder.my_atom), 10)
+ ..()
+
+// *****************
+// * Silver slimes *
+// *****************
+
+/obj/item/slime_extract/silver
+ name = "silver slime extract"
+ icon_state = "silver slime extract"
+ description_info = "This extract will create 5u liquid silver when injected with phoron."
+ slime_type = /mob/living/simple_mob/slime/xenobio/silver
+
+
+/decl/chemical_reaction/instant/slime/silver_materials_basic
+ name = "Slime Basic Science Materials"
+ id = "m_silver_basic"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/silver
+
+/decl/chemical_reaction/instant/slime/silver_materials_basic/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 2)
+ var/type_to_spawn = pickweight(xenobio_silver_materials_basic)
+ new type_to_spawn(get_turf(holder.my_atom), 5)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/silver_materials_adv
+ name = "Slime Advanced Science Materials"
+ id = "m_silver_adv"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/silver
+
+/decl/chemical_reaction/instant/slime/silver_materials_adv/on_reaction(var/datum/reagents/holder)
+ var/type_to_spawn = pickweight(xenobio_silver_materials_adv)
+ new type_to_spawn(get_turf(holder.my_atom), 3)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/silver_materials_random
+ name = "Slime Random Materials"
+ id = "m_silver_random"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/silver
+
+/decl/chemical_reaction/instant/slime/silver_materials_random/on_reaction(var/datum/reagents/holder)
+ var/type_to_spawn
+ var/amount = 5
+ var/all_spawnable_types = list()
+ all_spawnable_types += xenobio_metal_materials_normal
+ all_spawnable_types += xenobio_metal_materials_adv
+ all_spawnable_types += xenobio_metal_materials_weird
+ all_spawnable_types += xenobio_silver_materials_basic
+ all_spawnable_types += xenobio_silver_materials_adv
+ all_spawnable_types += xenobio_silver_materials_special
+ for(var/i = 1 to 3)
+ type_to_spawn = pickweight(all_spawnable_types)
+ if(type_to_spawn in xenobio_silver_materials_special)
+ amount = 1
+ new type_to_spawn(get_turf(holder.my_atom), amount)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/silver_materials_silver
+ name = "Slime Silver"
+ id = "m_silver_silver"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/silver
+
+/decl/chemical_reaction/instant/slime/silver_materials_silver/on_reaction(var/datum/reagents/holder)
+ new /obj/item/stack/material/silver(get_turf(holder.my_atom), 10)
+ ..()
+
+// **********************
+// * Dark Purple slimes *
+// **********************
+
+/obj/item/slime_extract/dark_purple
+ name = "dark purple slime extract"
+ icon_state = "dark purple slime extract"
+ description_info = "This extract will create 40u liquid phoron when injected with water."
+ slime_type = /mob/living/simple_mob/slime/xenobio/dark_purple
+
+
+/decl/chemical_reaction/instant/slime/dark_purple_phoron
+ name = "Slime Phoron"
+ id = "m_darkpurple_phoron"
+ result = "phoron"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/dark_purple
+
+
+/decl/chemical_reaction/instant/slime/dark_purple_blood
+ name = "Slime Blood"
+ id = "m_darkpurple_blood"
+ result = "blood"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/dark_purple
+
+// ********************
+// * Dark Blue slimes *
+// ********************
+
+/obj/item/slime_extract/dark_blue
+ name = "dark blue slime extract"
+ icon_state = "dark blue slime extract"
+ description_info = "This extract will massively lower the temperature of the surrounding atmosphere when injected with phoron. \
+ Slimes will suffer massive harm from the cold snap and most colors will die instantly. Other entities are also chilled, however \
+ cold-resistant armor like winter coats can protect from this. Note that the user is not immune to the extract's effects."
+ slime_type = /mob/living/simple_mob/slime/xenobio/dark_blue
+
+
+/decl/chemical_reaction/instant/slime/dark_blue_cold_snap
+ name = "Slime Cold Snap"
+ id = "m_darkblue_coldsnap"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/dark_blue
+
+// This iterates over a ZAS zone's contents, so that things seperated in other zones aren't subjected to the temperature drop.
+/decl/chemical_reaction/instant/slime/dark_blue_cold_snap/on_reaction(var/datum/reagents/holder)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(!T) // Nullspace lacks zones.
+ return
+
+ if(!istype(T))
+ return
+
+ var/zone/Z = T.zone
+ if(!Z) // Paranoid.
+ return
+
+ log_and_message_admins("Dark Blue extract reaction (cold snap) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+
+ var/list/nearby_things = view(T)
+
+ // Hurt mobs.
+ for(var/mob/living/L in nearby_things)
+ var/turf/simulated/their_turf = get_turf(L)
+ if(!istype(their_turf)) // Not simulated.
+ continue
+
+ if(!(their_turf in Z.contents)) // Not in the same zone.
+ continue
+
+ if(istype(L, /mob/living/simple_mob/slime))
+ var/mob/living/simple_mob/slime/S = L
+ if(S.cold_resist >= 1) // Immune to cold.
+ to_chat(S, "A chill is felt around you, however it cannot harm you.")
+ continue
+ if(S.client) // Don't instantly kill player slimes.
+ to_chat(S, "You feel your body crystalize as an intense chill overwhelms you!")
+ S.inflict_cold_damage(100)
+ else
+ S.inflict_cold_damage(200) // Metal slimes can survive this 'slime nuke'.
+ continue
+
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ var/protection = H.get_cold_protection()
+
+ if(protection < 1)
+ var/cold_factor = abs(protection - 1)
+ H.bodytemperature = between(50, (H.bodytemperature - ((H.bodytemperature - 50) * cold_factor) ), H.bodytemperature)
+
+ if(protection < 0.7)
+ to_chat(L, "A chilling wave of cold overwhelms you!")
+ else
+ to_chat(L, "A chilling wave of cold passes by you, as your armor protects you from it.")
+ continue
+
+ // Now make it very cold.
+ var/datum/gas_mixture/env = T.return_air()
+ if(env)
+ // This is most likely physically impossible but when has that stopped slimes before?
+ env.add_thermal_energy(-10 * 1000 * 1000) // For a moderately sized room this doesn't actually lower it that much.
+
+ playsound(T, 'sound/effects/phasein.ogg', 75, 1)
+
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/dark_blue_temp_resist
+ name = "Slime Temperature Resistance"
+ id = "m_darkblue_temperature_resist"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/dark_blue
+
+/decl/chemical_reaction/instant/slime/dark_blue_temp_resist/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/L in range(1, holder.my_atom))
+ L.add_modifier(/datum/modifier/slime_temp_resist, 5 MINUTES, src)
+ ..()
+
+/datum/modifier/slime_temp_resist
+ name = "slime temperature resistance"
+ desc = "You feel immune to heat and cold."
+ mob_overlay_state = "corona"
+
+ on_created_text = "A shield of goo surround you. It makes you feel protected against temperature."
+ on_expired_text = "The shield of goo has faded, and you feel vulnerable to temperature again."
+ stacks = MODIFIER_STACK_EXTEND
+
+ incoming_fire_damage_percent = 0.5
+ heat_protection = 1
+ cold_protection = 1
+
+
+/decl/chemical_reaction/instant/slime/dark_blue_ice
+ name = "Slime Ice"
+ id = "m_darkblue_ice"
+ result = "ice"
+ required_reagents = list("water" = 5)
+ result_amount = 5
+ required = /obj/item/slime_extract/dark_blue
+
+
+/decl/chemical_reaction/instant/slime/dark_blue_death
+ name = "Slime Death"
+ id = "m_darkblue_death"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/dark_blue
+
+/decl/chemical_reaction/instant/slime/dark_blue_death/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/death(get_turf(holder.my_atom))
+ ..()
+
+// **************
+// * Red slimes *
+// **************
+
+/obj/item/slime_extract/red
+ name = "red slime extract"
+ icon_state = "red slime extract"
+ description_info = "This extract will create a slime mutator agent when injected with phoron, which increases a slime's odds of mutating \
+ into a different color when reproducing by 12%. Injecting with blood causes all slimes that can see the user to enrage, becoming very violent and \
+ out of control."
+ slime_type = /mob/living/simple_mob/slime/xenobio/red
+
+
+/decl/chemical_reaction/instant/slime/red_mutation
+ name = "Slime Mutation"
+ id = "m_red_mutation"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/red
+
+/decl/chemical_reaction/instant/slime/red_mutation/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/mutator(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/red_enrage
+ name = "Slime Enrage"
+ id = "m_red_enrage"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/red
+
+/decl/chemical_reaction/instant/slime/red_enrage/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/simple_mob/slime/S in view(get_turf(holder.my_atom)))
+ if(S.stat)
+ continue
+
+ if(istype(S, /mob/living/simple_mob/slime/xenobio))
+ var/mob/living/simple_mob/slime/xenobio/X = S
+ if(X.harmless)
+ continue
+ if(!X.client)
+ X.enrage()
+
+ S.add_modifier(/datum/modifier/berserk, 30 SECONDS)
+
+ if(S.client) // Player slimes always have free will.
+ to_chat(S, "An intense wave of rage is felt from inside, but you remain in control of yourself.")
+
+ for(var/mob/living/carbon/human/H in view(get_turf(holder.my_atom)))
+ if(H.species.name == SPECIES_PROMETHEAN)
+ H.add_modifier(/datum/modifier/berserk, 30 SECONDS)
+ to_chat(H, "An intense wave of rage is felt from inside, but you remain in control of yourself.")
+
+ log_and_message_admins("Red extract reaction (enrage) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/red_hotsauce
+ name = "Slime Hot Sauce"
+ id = "m_red_hotsauce"
+ result = "capsaicin"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/red
+
+
+/decl/chemical_reaction/instant/slime/red_ferality
+ name = "Slime Ferality"
+ id = "m_red_ferality"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/red
+
+/decl/chemical_reaction/instant/slime/red_ferality/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/ferality(get_turf(holder.my_atom))
+ ..()
+
+// ***************
+// * Green slime *
+// ***************
+
+/obj/item/slime_extract/green
+ name = "green slime extract"
+ icon_state = "green slime extract"
+ description_info = "This extract will create 5u of liquid uranium when injected with phoron."
+ slime_type = /mob/living/simple_mob/slime/xenobio/green
+
+
+/decl/chemical_reaction/instant/slime/green_radpulse
+ name = "Slime Radiation Pulse"
+ id = "m_green_radpulse"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/green
+
+/decl/chemical_reaction/instant/slime/green_radpulse/on_reaction(var/datum/reagents/holder)
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ holder.my_atom.visible_message("\The [holder.my_atom] begins to vibrate violently!")
+ spawn(5 SECONDS)
+ SSradiation.flat_radiate(src, 30, 7, TRUE)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/green_emitter
+ name = "Slime Radiation Emitter"
+ id = "m_green_emitter"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/green
+
+/decl/chemical_reaction/instant/slime/green_emitter/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slime_irradiator(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/green_radium
+ name = "Slime Radium"
+ id = "m_green_radium"
+ result = "radium"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/green
+
+
+/decl/chemical_reaction/instant/slime/green_uranium
+ name = "Slime Uranium"
+ id = "m_green_uranium"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/green
+
+/decl/chemical_reaction/instant/slime/green_uranium/on_reaction(var/datum/reagents/holder)
+ new /obj/item/stack/material/uranium(get_turf(holder.my_atom), 10)
+ ..()
+
+// ***************
+// * Pink slimes *
+// ***************
+
+/obj/item/slime_extract/pink
+ name = "pink slime extract"
+ icon_state = "pink slime extract"
+ description_info = "This extract will create 30u of blood clotting agent if injected with blood. It can also create 30u of bone binding agent if injected \
+ with phoron. When injected with water, it will create an organ-mending agent. The slime medications have a very low threshold for overdosage, however."
+ slime_type = /mob/living/simple_mob/slime/xenobio/pink
+
+
+/decl/chemical_reaction/instant/slime/pink_bone_fix
+ name = "Slime Bone Med"
+ id = "m_pink_bone_fixer"
+ result = "slime_bone_fixer"
+ required_reagents = list("phoron" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/pink
+
+
+/decl/chemical_reaction/instant/slime/pink_clotting
+ name = "Slime Clotting Med"
+ id = "m_pink_clotting"
+ result = "slime_bleed_fixer"
+ required_reagents = list("blood" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/pink
+
+
+/decl/chemical_reaction/instant/slime/pink_organ_fix
+ name = "Slime Organ Med"
+ id = "m_pink_organ_fixer"
+ result = "slime_organ_fixer"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/pink
+
+
+/decl/chemical_reaction/instant/slime/pink_heal_pulse
+ name = "Slime Heal Pulse"
+ id = "m_pink_heal_pulse"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/pink
+
+/decl/chemical_reaction/instant/slime/pink_heal_pulse/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
+ to_chat(C, "A wave of energy suddenly invigorates you.")
+ C.adjustBruteLoss(-25)
+ C.adjustFireLoss(-25)
+ C.adjustToxLoss(-25)
+ C.adjustOxyLoss(-25)
+ C.adjustBrainLoss(-25)
+ C.adjustCloneLoss(-25)
+ C.updatehealth()
+ ..()
+
+// **************
+// * Oil slimes *
+// **************
+
+/obj/item/slime_extract/oil
+ name = "oil slime extract"
+ icon_state = "oil slime extract"
+ description_info = "This extract cause a moderately sized delayed explosion if injected with phoron. The delay is five seconds. Extract enhancers will \
+ increase the power of the explosion instead of allowing for multiple explosions."
+ slime_type = /mob/living/simple_mob/slime/xenobio/oil
+
+
+/decl/chemical_reaction/instant/slime/oil_fuel
+ name = "Slime Fuel"
+ id = "m_oil_fuel"
+ result = "fuel"
+ required_reagents = list("phoron" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/oil
+
+
+/decl/chemical_reaction/instant/slime/oil_oil
+ name = "Slime Oil"
+ id = "m_oil_oil"
+ result = "cookingoil"
+ required_reagents = list("blood" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/oil
+
+
+/decl/chemical_reaction/instant/slime/oil_fakesplosion
+ name = "Slime Fake Explosion"
+ id = "m_oil_fakeboom"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/oil
+
+/decl/chemical_reaction/instant/slime/oil_fakesplosion/on_reaction(var/datum/reagents/holder)
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ explosion(get_turf(holder.my_atom), 0, 0, 0)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/oil_explosion
+ name = "Slime Explosion"
+ id = "m_oil_boom"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/oil
+
+/decl/chemical_reaction/instant/slime/oil_explosion/on_reaction(var/datum/reagents/holder)
+ ..()
+ var/obj/item/slime_extract/E = holder.my_atom
+ var/power = 1
+ if(E.enhanced)
+ power++
+ E.uses = 0
+
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 75, 1)
+ holder.my_atom.visible_message("\The [holder.my_atom] begins to vibrate violently!")
+ log_and_message_admins("Oil extract reaction (explosion) has been activated in [get_area(holder.my_atom)]. Last fingerprints: [holder.my_atom.fingerprintslast]")
+
+ spawn(5 SECONDS)
+ if(holder && holder.my_atom)
+ explosion(get_turf(holder.my_atom), 1 * power, 3 * power, 6 * power)
+
+ if(holder && holder.my_atom) // Explosion may or may not have deleted the extract.
+ qdel(holder.my_atom)
+
+// ********************
+// * Bluespace slimes *
+// ********************
+
+/obj/item/slime_extract/bluespace
+ name = "bluespace slime extract"
+ icon_state = "bluespace slime extract"
+ description_info = "This extract creates slime crystals. When injected with water, it creates five 'lesser' slime crystals, which allow for limited \
+ short ranged, random teleporting. When injected with phoron, it creates one 'greater' slime crystal, which allows for a one time precise teleport to \
+ a specific area."
+ slime_type = /mob/living/simple_mob/slime/xenobio/bluespace
+
+
+/decl/chemical_reaction/instant/slime/bluespace_crystals
+ name = "Slime Bluespace Crystals"
+ id = "m_bs_crystals"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/bluespace
+
+/decl/chemical_reaction/instant/slime/bluespace_crystals/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to 5)
+ new /obj/item/slime_crystal(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/bluespace_pouch
+ name = "Slime Bluespace Pouch"
+ id = "m_bs_pouch"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/bluespace
+
+/decl/chemical_reaction/instant/slime/bluespace_pouch/on_reaction(var/datum/reagents/holder)
+ new /obj/item/weapon/storage/backpack/holding/slime(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/bluespace_chaotic_tele
+ name = "Slime Bluespace Chaos"
+ id = "m_bs_chaos"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/bluespace
+
+/decl/chemical_reaction/instant/slime/bluespace_chaotic_tele/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/M in range(2,get_turf(holder.my_atom)))
+ if(M.buckled)
+ M.buckled.unbuckle_mob()
+
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, get_turf(M))
+ sparks.start()
+
+ M.forceMove(pick(trange(50, get_turf(holder.my_atom))))
+
+ sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, M.loc)
+ sparks.start()
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/bluespace_teleporter
+ name = "Slime Bluespace Teleporter"
+ id = "m_bs_teleporter"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/bluespace
+
+/decl/chemical_reaction/instant/slime/bluespace_teleporter/on_reaction(var/datum/reagents/holder)
+ new /obj/item/weapon/disposable_teleporter/slime(get_turf(holder.my_atom))
+ ..()
+
+// *******************
+// * Cerulean slimes *
+// *******************
+
+/obj/item/slime_extract/cerulean
+ name = "cerulean slime extract"
+ icon_state = "cerulean slime extract"
+ description_info = "This extract creates a slime extract enhancer agent, when injected with phoron. The agent allows an extract to have more \
+ 'charges' before it goes inert."
+ slime_type = /mob/living/simple_mob/slime/xenobio/cerulean
+
+
+/decl/chemical_reaction/instant/slime/cerulean_enhancer
+ name = "Slime Enhancer"
+ id = "m_cerulean_enhancer"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/cerulean
+
+/decl/chemical_reaction/instant/slime/cerulean_enhancer/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/cerulean_reinvigoration
+ name = "Slime Reinvigoration"
+ id = "m_cerulean_reinvigoration"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/cerulean
+
+/decl/chemical_reaction/instant/slime/cerulean_reinvigoration/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/reinvigoration(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/cerulean_potion_mimic
+ name = "Slime Potion Mimic"
+ id = "m_cerulean_potion_mimic"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/cerulean
+
+/decl/chemical_reaction/instant/slime/cerulean_potion_mimic/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/mimic(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/cerulean_random_potion
+ name = "Slime Random Potion"
+ id = "m_cerulean_random_potion"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/cerulean
+
+/decl/chemical_reaction/instant/slime/cerulean_random_potion/on_reaction(var/datum/reagents/holder)
+ var/spawn_type = pickweight(xenobio_cerulean_potions)
+ new spawn_type(get_turf(holder.my_atom))
+ ..()
+
+// ****************
+// * Amber slimes *
+// ****************
+
+/obj/item/slime_extract/amber
+ name = "amber slime extract"
+ icon_state = "amber slime extract"
+ description_info = "This extract creates a slime feeding agent when injected with phoron, which will instantly feed the slime and make it reproduce. When \
+ injected with water, it will create a very delicious and filling product."
+ slime_type = /mob/living/simple_mob/slime/xenobio/amber
+
+
+/decl/chemical_reaction/instant/slime/amber_slimefood
+ name = "Slime Feeding"
+ id = "m_amber_slime_food"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/amber
+
+/decl/chemical_reaction/instant/slime/amber_slimefood/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/feeding(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/amber_random_food
+ name = "Slime Random Food"
+ id = "m_amber_random_food"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/amber
+
+/decl/chemical_reaction/instant/slime/amber_random_food/on_reaction(var/datum/reagents/holder)
+ var/list/edibles = subtypesof(/obj/item/weapon/reagent_containers/food/snacks)
+
+ playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/i = 1 to rand(2, 4))
+ var/chosen = pick(edibles)
+ var/obj/B = new chosen
+ if(B)
+ B.loc = get_turf(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(B, pick(NORTH,SOUTH,EAST,WEST))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/amber_snack
+ name = "Slime Snack"
+ id = "m_amber_snack"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/amber
+
+/decl/chemical_reaction/instant/slime/amber_snack/on_reaction(var/datum/reagents/holder)
+ for(var/i = 1 to rand(3, 5))
+ new /obj/item/weapon/reagent_containers/food/snacks/slime(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/amber_goop
+ name = "Slime Goop"
+ id = "m_amber_goop"
+ result = "slime_goop"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/amber
+
+// *******************
+// * Sapphire slimes *
+// *******************
+
+/obj/item/slime_extract/sapphire
+ name = "sapphire slime extract"
+ icon_state = "sapphire slime extract"
+ description_info = "This extract will create one 'slime cube' when injected with phoron. The slime cube is needed to create a Promethean."
+ slime_type = /mob/living/simple_mob/slime/xenobio/sapphire
+
+
+/decl/chemical_reaction/instant/slime/sapphire_promethean
+ name = "Slime Promethean"
+ id = "m_sapphire_promethean"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/sapphire
+
+/decl/chemical_reaction/instant/slime/sapphire_promethean/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slime_cube(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/sapphire_mutation
+ name = "Slime Mutation Toxins"
+ id = "m_sapphire_mutation_tox"
+ result = "mutationtoxin"
+ required_reagents = list("blood" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/sapphire
+
+
+/decl/chemical_reaction/instant/slime/sapphire_plushies
+ name = "Slime Plushies"
+ id = "m_sapphire_plushies"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/sapphire
+
+/decl/chemical_reaction/instant/slime/sapphire_plushies/on_reaction(var/datum/reagents/holder)
+ var/spawn_type
+ var/list/possible_types = subtypesof(/obj/item/toy/plushie)
+ possible_types -= subtypesof(/obj/item/toy/plushie/fluff)
+ possible_types -= subtypesof(/obj/item/toy/plushie/therapy)
+ for(var/i = 1 to rand(3, 5))
+ spawn_type = pickweight(possible_types)
+ new spawn_type(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/sapphire_sentience
+ name = "Slime Sentience"
+ id = "m_sapphire_sentience"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/sapphire
+
+/decl/chemical_reaction/instant/slime/sapphire_sentience/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/sentience(get_turf(holder.my_atom))
+ ..()
+
+// ***************
+// * Ruby slimes *
+// ***************
+
+/obj/item/slime_extract/ruby
+ name = "ruby slime extract"
+ icon_state = "ruby slime extract"
+ description_info = "This extract will cause all entities close to the extract to become stronger for ten minutes, when injected with phoron. \
+ When injected with blood, makes a slime loyalty agent which will make the slime fight other dangerous entities but not station crew."
+ slime_type = /mob/living/simple_mob/slime/xenobio/ruby
+
+/decl/chemical_reaction/instant/slime/ruby_swole
+ name = "Slime Strength"
+ id = "m_ruby_strength"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/ruby
+
+/decl/chemical_reaction/instant/slime/ruby_swole/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/L in range(1, holder.my_atom))
+ L.add_modifier(/datum/modifier/slime_strength, 10 MINUTES, src)
+ ..()
+
+/datum/modifier/slime_strength
+ name = "slime strength"
+ desc = "You feel much stronger than usual."
+ mob_overlay_state = "pink_sparkles"
+
+ on_created_text = "Twinkling spores of goo surround you. It makes you feel stronger and more robust."
+ on_expired_text = "The spores of goo have faded, and you feel your strength returning to what it was before."
+ stacks = MODIFIER_STACK_EXTEND
+
+ max_health_flat = 50
+ outgoing_melee_damage_percent = 2
+ disable_duration_percent = 0.5
+ incoming_damage_percent = 0.75
+
+
+/decl/chemical_reaction/instant/slime/ruby_pull
+ name = "Slime Pull"
+ id = "m_ruby_pull"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/ruby
+
+/decl/chemical_reaction/instant/slime/ruby_pull/on_reaction(var/datum/reagents/holder)
+ var/location = get_turf(holder.my_atom)
+ playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1)
+ var/datum/effect/effect/system/grav_pull/s = new /datum/effect/effect/system/grav_pull
+ s.set_up(3, 3, location)
+ s.start()
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/ruby_brute_juice
+ name = "Slime Brute Juice"
+ id = "m_ruby_brute_juice"
+ result = "berserkmed"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/ruby
+
+
+/decl/chemical_reaction/instant/slime/ruby_push
+ name = "Slime Push"
+ id = "m_ruby_push"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/ruby
+
+/decl/chemical_reaction/instant/slime/ruby_push/on_reaction(var/datum/reagents/holder)
+ var/location = get_turf(holder.my_atom)
+ for(var/X in orange(3, location))
+ var/atom/movable/AM = X
+ if(!ismovable(X) || istype(X, /obj/effect/overlay))
+ continue
+
+ if(isobj(X))
+ var/obj/O = X
+ if(O.anchored)
+ continue
+
+ var/throwdir = get_dir(location, AM)
+ AM.throw_at(get_edge_target_turf(AM, throwdir), 3, 1, src)
+
+ playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1)
+ ..()
+
+// *****************
+// * Emerald slime *
+// *****************
+
+/obj/item/slime_extract/emerald
+ name = "emerald slime extract"
+ icon_state = "emerald slime extract"
+ description_info = "This extract will cause all entities close to the extract to become more agile for ten minutes, when injected with phoron."
+ slime_type = /mob/living/simple_mob/slime/xenobio/emerald
+
+
+/decl/chemical_reaction/instant/slime/emerald_agility
+ name = "Slime Agility"
+ id = "m_emerald_agility"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/emerald
+
+/decl/chemical_reaction/instant/slime/emerald_agility/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/L in range(1, holder.my_atom))
+ L.add_modifier(/datum/modifier/slime_agility, 10 MINUTES, src)
+ ..()
+
+/datum/modifier/slime_agility
+ name = "slime agility"
+ desc = "You feel much more agile than usual."
+ mob_overlay_state = "green_sparkles"
+
+ on_created_text = "Twinkling spores of goo surround you. It makes you feel more agile."
+ on_expired_text = "The spores of goo have faded, and you feel your agility returning to what it was before."
+ stacks = MODIFIER_STACK_EXTEND
+
+ evasion = 45
+ attack_speed_percent = 0.5
+ disable_duration_percent = 0.5
+
+
+/decl/chemical_reaction/instant/slime/emerald_speed
+ name = "Slime Speed"
+ id = "m_emerald_speed"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/emerald
+
+/decl/chemical_reaction/instant/slime/emerald_speed/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/L in range(1, holder.my_atom))
+ L.add_modifier(/datum/modifier/slime_speed, 1 MINUTE, src)
+ ..()
+
+/datum/modifier/slime_speed
+ name = "slime speed"
+ desc = "You feel much faster than usual."
+ mob_overlay_state = "haste"
+
+ on_created_text = "Twinkling spores of goo surround you. It makes you feel very fast."
+ on_expired_text = "The spores of goo have faded, and you feel your speed returning to what it was before."
+ stacks = MODIFIER_STACK_EXTEND
+
+ slowdown = -3
+
+
+/decl/chemical_reaction/instant/slime/emerald_hyperzine
+ name = "Slime Hyperzine"
+ id = "m_emerald_hyperzine"
+ result = "hyperzine"
+ required_reagents = list("water" = 5)
+ result_amount = 30
+ required = /obj/item/slime_extract/emerald
+
+
+/decl/chemical_reaction/instant/slime/emerald_hell
+ name = "Slime Hell"
+ id = "m_emerald_hell"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/emerald
+
+/decl/chemical_reaction/instant/slime/emerald_hell/on_reaction(var/datum/reagents/holder)
+ for(var/turf/simulated/T in trange(5, get_turf(holder.my_atom)))
+ if(!istype(T))
+ continue
+ T.wet = 1
+ T.freeze_floor()
+ ..()
+
+// *********************
+// * Light Pink slimes *
+// *********************
+
+/obj/item/slime_extract/light_pink
+ name = "light pink slime extract"
+ icon_state = "light pink slime extract"
+ description_info = "This extract creates a slime docility agent when injected with water, which will make the slime be harmless forever. \
+ When injected with phoron, it instead creates a slime friendship agent, which makes the slime consider the user their ally. The agent \
+ might be useful on other specimens as well."
+ slime_type = /mob/living/simple_mob/slime/xenobio/light_pink
+
+
+/decl/chemical_reaction/instant/slime/light_pink_friendship
+ name = "Slime Friendship"
+ id = "m_lightpink_friendship"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/light_pink
+
+/decl/chemical_reaction/instant/slime/light_pink_friendship/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/friendship(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/light_pink_loyalty
+ name = "Slime Loyalty"
+ id = "m_lightpink_loyalty"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/light_pink
+
+/decl/chemical_reaction/instant/slime/light_pink_loyalty/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/loyalty(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/light_pink_docility
+ name = "Slime Docility"
+ id = "m_lightpink_docility"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/light_pink
+
+/decl/chemical_reaction/instant/slime/light_pink_docility/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/docility(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/light_pink_obedience
+ name = "Slime Obedience"
+ id = "m_lightpink_obedience"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/light_pink
+
+/decl/chemical_reaction/instant/slime/light_pink_obedience/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/obedience(get_turf(holder.my_atom))
+ ..()
+
+// ******************
+// * Rainbow slimes *
+// ******************
+
+
+/obj/item/slime_extract/rainbow
+ name = "rainbow slime extract"
+ icon_state = "rainbow slime extract"
+ description_info = "This extract will create a baby slime of a random color when injected with phoron, or a slime unification agent if injected with water, \
+ which makes slimes stop attacking other slime colors."
+ slime_type = /mob/living/simple_mob/slime/xenobio/rainbow
+
+
+/decl/chemical_reaction/instant/slime/rainbow_random_slime
+ name = "Slime Random Slime"
+ id = "m_rainow_random_slime"
+ required_reagents = list("phoron" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/rainbow
+
+/decl/chemical_reaction/instant/slime/rainbow_random_slime/on_reaction(var/datum/reagents/holder)
+ var/mob/living/simple_mob/slime/xenobio/S
+ var/list/slime_types = typesof(/mob/living/simple_mob/slime/xenobio)
+
+ while(slime_types.len)
+ S = pick(slime_types)
+ if(initial(S.rainbow_core_candidate) == TRUE)
+ break
+ else
+ slime_types -= S
+ S = null
+
+ if(S)
+ new S(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/rainbow_random_extract
+ name = "Slime Random Extract"
+ id = "m_rainow_random_extract"
+ required_reagents = list("blood" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/rainbow
+
+/decl/chemical_reaction/instant/slime/rainbow_random_extract/on_reaction(var/datum/reagents/holder)
+ var/spawn_type = pickweight(xenobio_rainbow_extracts)
+ new spawn_type(get_turf(holder.my_atom))
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/rainbow_colors
+ name = "Slime Colors"
+ id = "m_rainbow_colors"
+ required_reagents = list("water" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/rainbow
+
+/decl/chemical_reaction/instant/slime/rainbow_colors/on_reaction(var/datum/reagents/holder)
+ for(var/mob/living/carbon/human/H in range(3, holder.my_atom))
+ H.druggy = max(H.druggy, 30)
+ ..()
+
+
+/decl/chemical_reaction/instant/slime/rainbow_unity
+ name = "Slime Unity"
+ id = "m_rainbow_unity"
+ required_reagents = list("slimejelly" = 5)
+ result_amount = 1
+ required = /obj/item/slime_extract/rainbow
+
+/decl/chemical_reaction/instant/slime/rainbow_unity/on_reaction(var/datum/reagents/holder)
+ new /obj/item/slimepotion/unity(get_turf(holder.my_atom))
+ ..()
\ No newline at end of file
diff --git a/code/modules/xenobio/items/slime_objects.dm b/code/modules/xenobio/items/slime_objects.dm
index 9a945e00582..72cc0e01e31 100644
--- a/code/modules/xenobio/items/slime_objects.dm
+++ b/code/modules/xenobio/items/slime_objects.dm
@@ -67,7 +67,6 @@
qdel(src)
-
// More or less functionally identical to the telecrystal tele.
/obj/item/slime_crystal
name = "lesser slime cystal"
@@ -101,6 +100,7 @@
safe_blink(AM, 14)
qdel(src)
+
/obj/item/weapon/disposable_teleporter/slime
name = "greater slime crystal"
desc = "A larger, gooier crystal."
@@ -112,7 +112,6 @@
origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 4)
-
// Very filling food.
/obj/item/weapon/reagent_containers/food/snacks/slime
name = "slimy clump"
@@ -125,4 +124,95 @@
/obj/item/weapon/reagent_containers/food/snacks/slime/Initialize()
. = ..()
- bitesize = 5
\ No newline at end of file
+ bitesize = 5
+
+
+//Flashlight
+
+/obj/item/device/flashlight/slime
+ gender = PLURAL
+ name = "glowing slime extract"
+ desc = "A slimy ball that appears to be glowing from bioluminesence."
+ icon = 'icons/obj/lighting.dmi'
+ icon_state = "floor1" //not a slime extract sprite but... something close enough!
+ item_state = "slime"
+ light_color = "#FFF423"
+ w_class = ITEMSIZE_TINY
+ light_range = 6
+ on = 1 //Bio-luminesence has one setting, on.
+ power_use = 0
+
+/obj/item/device/flashlight/slime/New()
+ ..()
+ set_light(light_range, light_power, light_color)
+
+/obj/item/device/flashlight/slime/update_brightness()
+ return
+
+/obj/item/device/flashlight/slime/attack_self(mob/user)
+ return //Bio-luminescence does not toggle.
+
+
+//Radiation Emitter
+
+/obj/item/slime_irradiator
+ name = "glowing slime extract"
+ desc = "A slimy ball that appears to be glowing from bioluminesence."
+ icon = 'icons/mob/slimes_vr.dmi'
+ icon_state = "irradiator"
+ light_color = "#00FF00"
+ light_power = 0.4
+ light_range = 2
+ w_class = ITEMSIZE_TINY
+
+/obj/item/slime_irradiator/New()
+ START_PROCESSING(SSobj, src)
+ set_light(light_range, light_power, light_color)
+ return ..()
+
+/obj/item/slime_irradiator/process()
+ SSradiation.radiate(src, 5)
+
+/obj/item/slime_irradiator/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+
+//BS Pouch
+/obj/item/weapon/storage/backpack/holding/slime
+ name = "bluespace slime pouch"
+ desc = "A slimy pouch that opens into a localized pocket of bluespace."
+ icon_state = "slimepouch"
+
+
+
+//Slime Chems
+
+/datum/reagent/myelamine/slime
+ name = "Agent A"
+ id = "slime_bleed_fixer"
+ description = "A slimy liquid which appears to rapidly clot internal hemorrhages by increasing the effectiveness of platelets at low quantities. Toxic in high quantities."
+ taste_description = "slime"
+ overdose = 5
+
+/datum/reagent/osteodaxon/slime
+ name = "Agent B"
+ id = "slime_bone_fixer"
+ description = "A slimy liquid which can be used to heal bone fractures at low quantities. Toxic in high quantities."
+ taste_description = "slime"
+ overdose = 5
+
+/datum/reagent/peridaxon/slime
+ name = "Agent C"
+ id = "slime_organ_fixer"
+ description = "A slimy liquid which is used to encourage recovery of internal organs and nervous systems in low quantities. Toxic in high quantities."
+ taste_description = "slime"
+ overdose = 5
+
+/datum/reagent/nutriment/glucose/slime
+ name = "Slime Goop"
+ id = "slime_goop"
+ description = "A slimy liquid, with very compelling smell. Extremely nutritious."
+ color = "#FABA3A"
+ nutriment_factor = 30
+ taste_description = "slimy nectar"
\ No newline at end of file
diff --git a/code/modules/xenobio/items/slimepotions.dm b/code/modules/xenobio/items/slimepotions.dm
index 2a600fb8019..11d2d075715 100644
--- a/code/modules/xenobio/items/slimepotions.dm
+++ b/code/modules/xenobio/items/slimepotions.dm
@@ -11,7 +11,7 @@
/obj/item/slimepotion/enhancer
name = "extract enhancer agent"
desc = "A potent chemical mix that will give a slime extract an additional two uses."
- icon_state = "potpurple"
+ icon_state = "potcyan"
description_info = "This will even work on inert slime extracts, if it wasn't enhanced before. Extracts enhanced cannot be enhanced again."
// Makes slimes less likely to mutate.
@@ -64,7 +64,7 @@
// Makes the slime friendly forever.
/obj/item/slimepotion/docility
- name = "docility agent"
+ name = "slime docility agent"
desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame. It might also work on other creatures?"
icon_state = "potlightpink"
description_info = "The target needs to be alive, not already passive, and be an animal or slime type entity."
@@ -178,7 +178,7 @@
desc = "A potent chemical mix that makes an animal deeply loyal to the species of whoever applies this, and will attack threats to them."
description_info = "The slime or other animal needs to be alive for this to work. The slime this is applied to will have their 'faction' change to \
the user's faction, which means the slime will attack things that are hostile to the user's faction, such as carp, spiders, and other slimes."
- icon_state = "potred"
+ icon_state = "potlightpink"
/obj/item/slimepotion/loyalty/attack(mob/living/simple_mob/M, mob/user)
if(!istype(M))
@@ -247,7 +247,7 @@
name = "slime feeding agent"
desc = "A potent chemical mix that will instantly sediate the slime."
description_info = "The slime needs to be alive for this to work. It will instantly grow the slime enough to reproduce."
- icon_state = "potyellow"
+ icon_state = "potorange"
/obj/item/slimepotion/feeding/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
if(!istype(M))
diff --git a/code/modules/xenobio/items/slimepotions_vr.dm b/code/modules/xenobio/items/slimepotions_vr.dm
new file mode 100644
index 00000000000..efd1bdc9e96
--- /dev/null
+++ b/code/modules/xenobio/items/slimepotions_vr.dm
@@ -0,0 +1,190 @@
+/obj/item/slimepotion/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/slimepotion/mimic))
+ to_chat(user, "You apply the mimic to the slime potion as it copies it's effects.")
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ var/newtype = src.type
+ new newtype(get_turf(src))
+ qdel(O)
+ ..()
+
+
+/obj/item/slimepotion/infertility
+ name = "slime infertility agent"
+ desc = "A potent chemical mix that will reduce the amount of offspring this slime will have."
+ icon_state = "potpurple"
+ description_info = "The slime needs to be alive for this to work. It will reduce the amount of slime babies by 2 (to minimum of 2)."
+
+/obj/item/slimepotion/infertility/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
+ if(!istype(M))
+ to_chat(user, "The agent only works on slimes!")
+ return ..()
+ if(M.stat == DEAD)
+ to_chat(user, "The slime is dead!")
+ return ..()
+ if(M.split_amount <= 2)
+ to_chat(user, "The slime cannot get any less fertile!")
+ return ..()
+
+ to_chat(user, "You feed the slime the infertility agent. It will now have less offspring.")
+ M.split_amount = between(2, M.split_amount - 2, 6)
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ qdel(src)
+
+/obj/item/slimepotion/fertility
+ name = "slime fertility agent"
+ desc = "A potent chemical mix that will increase the amount of offspring this slime will have."
+ icon_state = "potpurple"
+ description_info = "The slime needs to be alive for this to work. It will increase the amount of slime babies by 2 (to maximum of 6)."
+
+/obj/item/slimepotion/fertility/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
+ if(!istype(M))
+ to_chat(user, "The agent only works on slimes!")
+ return ..()
+ if(M.stat == DEAD)
+ to_chat(user, "The slime is dead!")
+ return ..()
+ if(M.split_amount >= 6)
+ to_chat(user, "The slime cannot get any more fertile!")
+ return ..()
+
+ to_chat(user, "You feed the slime the infertility agent. It will now have less offspring.")
+ M.split_amount = between(2, M.split_amount + 2, 6)
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ qdel(src)
+
+/obj/item/slimepotion/shrink
+ name = "slime shrinking agent"
+ desc = "A potent chemical mix that will turn adult slime into a baby one."
+ icon_state = "potpurple"
+ description_info = "The slime needs to be alive for this to work."
+
+/obj/item/slimepotion/shrink/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
+ if(!istype(M))
+ to_chat(user, "The agent only works on slimes!")
+ return ..()
+ if(M.stat == DEAD)
+ to_chat(user, "The slime is dead!")
+ return ..()
+ if(!(M.is_adult))
+ to_chat(user, "The slime is already a baby!")
+ return ..()
+
+ to_chat(user, "You feed the slime the shrinking agent. It is now back to being a baby.")
+ M.make_baby()
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ qdel(src)
+
+/obj/item/slimepotion/death
+ name = "slime death agent"
+ desc = "A potent chemical mix that will instantly kill a slime."
+ icon_state = "potblue"
+ description_info = "The slime needs to be alive for this to work."
+
+/obj/item/slimepotion/death/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
+ if(!istype(M))
+ to_chat(user, "The agent only works on slimes!")
+ return ..()
+ if(M.stat == DEAD)
+ to_chat(user, "The slime is already dead!")
+ return ..()
+
+ to_chat(user, "You feed the slime the death agent. Its face flashes pain of betrayal before it goes still.")
+ M.adjustToxLoss(500)
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ qdel(src)
+
+/obj/item/slimepotion/ferality
+ name = "slime ferality agent"
+ desc = "A potent chemical mix that will make a slime untamable."
+ icon_state = "potred"
+ description_info = "The slime needs to be alive for this to work."
+
+/obj/item/slimepotion/ferality/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
+ if(!istype(M))
+ to_chat(user, "The agent only works on slimes!")
+ return ..()
+ if(M.stat == DEAD)
+ to_chat(user, "The slime is already dead!")
+ return ..()
+ if(M.untamable && M.untamable_inheirit)
+ to_chat(user, "The slime is already untamable!")
+ return ..()
+
+ to_chat(user, "You feed the slime the death agent. It will now only get angrier at taming attempts.")
+ M.untamable = TRUE
+ M.untamable_inheirit = TRUE
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ qdel(src)
+
+/obj/item/slimepotion/reinvigoration
+ name = "extract reinvigoration agent"
+ desc = "A potent chemical mix that will create a slime of appropriate type out of an extract."
+ icon_state = "potcyan"
+ description_info = "This will even work on inert extracts. Extract is destroyed in process."
+
+/obj/item/slimepotion/mimic
+ name = "mimic agent"
+ desc = "A potent chemical mix that will mimic effects of other slime-produced agents."
+ icon_state = "potsilver"
+ description_info = "Warning: avoid combining multiple doses of mimic agent."
+
+/obj/item/slimepotion/mimic/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/slimepotion/mimic))
+ to_chat(user, "You apply the mimic to the mimic, resulting a mimic that copies a mimic that copies a mimic that copies a mimic that-")
+ var/location = get_turf(src)
+ playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1)
+ var/datum/effect/effect/system/grav_pull/s = new /datum/effect/effect/system/grav_pull
+ s.set_up(3, 3, location)
+ s.start()
+ qdel(O)
+ qdel(src)
+ return
+ ..()
+
+/obj/item/slimepotion/sentience
+ name = "slime loyalty agent"
+ desc = "A potent chemical mix that makes an animal deeply loyal to the species of whoever applies this, and will attack threats to them."
+ description_info = "The slime or other animal needs to be alive for this to work. The slime this is applied to will have their 'faction' change to \
+ the user's faction, which means the slime will attack things that are hostile to the user's faction, such as carp, spiders, and other slimes."
+ icon_state = "potblue"
+
+/obj/item/slimepotion/sentience/attack(mob/living/simple_mob/M, mob/user)
+ if(!istype(M))
+ to_chat(user, "The agent only works on creatures!")
+ return ..()
+ if(M.stat == DEAD)
+ to_chat(user, "The creature is dead!")
+ return ..()
+ if(M.ghostjoin)
+ to_chat(user, "The creature is already developing sentience.")
+ return ..()
+ if(M.ckey)
+ to_chat(user, "The creature is already sentient!")
+ return ..()
+
+ to_chat(user, "You feed \the [M] the agent. It may now eventually develop proper sentience.")
+ M.ghostjoin = 1
+ active_ghost_pods |= M
+ M.ghostjoin_icon()
+ log_and_message_admins("[key_name_admin(user)] used a sentience potion on a simple mob: [M]. [ADMIN_FLW(src)]")
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ qdel(src)
+
+/obj/item/slimepotion/obedience
+ name = "slime obedience agent"
+ desc = "A potent chemical mix that makes slime extremely obedient."
+ icon_state = "potlightpink"
+ description_info = "The target needs to be alive and currently misbehaving. Effect is equivalent to very strong discipline."
+
+/obj/item/slimepotion/obedience/attack(mob/living/simple_mob/slime/xenobio/M, mob/user)
+ if(!istype(M))
+ to_chat(user, "The agent only works on slimes!")
+ return ..()
+ if(M.stat == DEAD)
+ to_chat(user, "The slime is dead!")
+ return ..()
+
+ to_chat(user, "You feed the slime the agent. It has been disciplined, for better or worse...")
+ M.adjust_discipline(10)
+ playsound(src, 'sound/effects/bubbles.ogg', 50, 1)
+ qdel(src)
\ No newline at end of file
diff --git a/icons/inventory/back/item.dmi b/icons/inventory/back/item.dmi
index daa2c464499..230b3950c8a 100644
Binary files a/icons/inventory/back/item.dmi and b/icons/inventory/back/item.dmi differ
diff --git a/icons/inventory/back/mob.dmi b/icons/inventory/back/mob.dmi
index 755a2d75d42..3f11cc9dc1a 100644
Binary files a/icons/inventory/back/mob.dmi and b/icons/inventory/back/mob.dmi differ
diff --git a/icons/mob/slimes_vr.dmi b/icons/mob/slimes_vr.dmi
new file mode 100644
index 00000000000..4f7b901cfd0
Binary files /dev/null and b/icons/mob/slimes_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index b98c312451d..2a2483e8f34 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -4051,9 +4051,10 @@
#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm"
#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm"
#include "code\modules\xenoarcheaology\tools\tools_vr.dm"
-#include "code\modules\xenobio\items\extracts.dm"
+#include "code\modules\xenobio\items\extracts_vr.dm"
#include "code\modules\xenobio\items\slime_objects.dm"
#include "code\modules\xenobio\items\slimepotions.dm"
+#include "code\modules\xenobio\items\slimepotions_vr.dm"
#include "code\modules\xenobio\items\weapons.dm"
#include "code\modules\xenobio\machinery\processor.dm"
#include "code\modules\xgm\xgm_gas_data.dm"