diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm
index de7f707ac56..9788c70cc6a 100644
--- a/code/modules/reagents/Chemistry-Recipes_vr.dm
+++ b/code/modules/reagents/Chemistry-Recipes_vr.dm
@@ -1,286 +1,140 @@
-///////////////////////////////////////////////////////////////////////////////////
-/// Micro/Macro chemicals
-/datum/chemical_reaction/sizeoxadone
- name = "sizeoxadone"
- id = "sizeoxadone"
- result = "sizeoxadone"
- required_reagents = list("clonexadone" = 1, "tramadol" = 3, "phoron" = 1)
- catalysts = list("phoron" = 5)
- result_amount = 5
+////////////////////////////
+/// NW's shrinking serum ///
+////////////////////////////
-/datum/chemical_reaction/macrocillin
+/datum/reagent/macrocillin
name = "Macrocillin"
id = "macrocillin"
- result = "macrocillin"
- // POLARISTODO requires_heating = 1
- required_reagents = list("sizeoxadone" = 20, "diethylamine" = 20)
- result_amount = 1
+ description = "Glowing yellow liquid."
+ reagent_state = LIQUID
+ color = "#FFFF00" // rgb: 255, 255, 0
+ metabolism = 0.01
-/datum/chemical_reaction/microcillin
+/datum/reagent/macrocillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(M.size_multiplier < RESIZE_HUGE)
+ M.resize(M.size_multiplier+0.01)//Incrrease 1% per tick.
+ return
+
+/datum/reagent/microcillin
name = "Microcillin"
id = "microcillin"
- result = "microcillin"
- // POLARISTODO requires_heating = 1
- required_reagents = list("sizeoxadone" = 20, "sodiumchloride" = 20)
- result_amount = 1
+ description = "Murky purple liquid."
+ reagent_state = LIQUID
+ color = "#800080"
+ metabolism = 0.01
-/datum/chemical_reaction/normalcillin
+/datum/reagent/microcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(M.size_multiplier > RESIZE_TINY)
+ M.resize(M.size_multiplier-0.01) //Decrease 1% per tick.
+ return
+
+
+/datum/reagent/normalcillin
name = "Normalcillin"
id = "normalcillin"
- result = "normalcillin"
- // POLARISTODO requires_heating = 1
- required_reagents = list("sizeoxadone" = 20, "leporazine" = 20)
- result_amount = 1
+ description = "Translucent cyan liquid."
+ reagent_state = LIQUID
+ color = "#00FFFF"
+ metabolism = 0.01 //One unit will be just enough to bring someone from 200% to 100%
-/datum/chemical_reaction/dontcrossthebeams
- name = "Don't Cross The Beams"
- id = "dontcrossthebeams"
- result = null
- required_reagents = list("microcillin" = 1, "macrocillin" = 1)
+/datum/reagent/normalcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ if(M.size_multiplier > RESIZE_NORMAL)
+ M.resize(M.size_multiplier-0.01) //Decrease by 1% size per tick.
+ else if(M.size_multiplier < RESIZE_NORMAL)
+ M.resize(M.size_multiplier+0.01) //Increase 1% per tick.
+ return
-/datum/chemical_reaction/dontcrossthebeams/on_reaction(var/datum/reagents/holder, var/created_volume)
- 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()
- holder.clear_reagents()
-///////////////////////////////////////////////////////////////////////////////////
-/// Vore Drugs
+/datum/reagent/sizeoxadone
+ name = "Sizeoxadone"
+ id = "sizeoxadone"
+ description = "A volatile liquid used as a precursor to size-altering chemicals. Causes dizziness if taken unprocessed."
+ reagent_state = LIQUID
+ color = "#1E90FF"
+ overdose = REAGENTS_OVERDOSE
-/datum/chemical_reaction/ickypak
+/datum/reagent/sizeoxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ M.make_dizzy(1)
+ if(!M.confused) M.confused = 1
+ M.confused = max(M.confused, 20)
+ return
+
+
+////////////////////////// Anti-Noms Drugs //////////////////////////
+
+/datum/reagent/ickypak
name = "Ickypak"
id = "ickypak"
- result = "ickypak"
- required_reagents = list("hyperzine" = 4, "fluorosurfactant" = 1)
- result_amount = 5
+ description = "A foul-smelling green liquid, for inducing muscle contractions to expel accidentally ingested things."
+ reagent_state = LIQUID
+ color = "#0E900E"
+ overdose = REAGENTS_OVERDOSE
-/datum/chemical_reaction/unsorbitol
+/datum/reagent/ickypak/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ M.make_dizzy(1)
+ M.adjustHalLoss(2)
+
+ for(var/I in M.vore_organs)
+ var/datum/belly/B = M.vore_organs[I]
+ for(var/atom/movable/A in B.internal_contents)
+ if(isliving(A))
+ var/mob/living/P = A
+ if(P.absorbed)
+ continue
+ if(prob(5))
+ playsound(M, 'sound/effects/splat.ogg', 50, 1)
+ B.release_specific_contents(A)
+ return
+
+
+/datum/reagent/unsorbitol
name = "Unsorbitol"
id = "unsorbitol"
- result = "unsorbitol"
- required_reagents = list("mutagen" = 3, "lipozine" = 2)
- result_amount = 5
+ description = "A frothy pink liquid, for causing cellular-level hetrogenous structure separation."
+ reagent_state = LIQUID
+ color = "#EF77E5"
+ overdose = REAGENTS_OVERDOSE
-///////////////////////////////////////////////////////////////////////////////////
-/// Other Drugs
-/datum/chemical_reaction/adranol
- name = "Adranol"
- id = "adranol"
- result = "adranol"
- required_reagents = list("milk" = 2, "hydrogen" = 1, "potassium" = 1)
- result_amount = 3
+/datum/reagent/unsorbitol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ M.make_dizzy(1)
+ M.adjustHalLoss(1)
+ if(!M.confused) M.confused = 1
+ M.confused = max(M.confused, 20)
+ M.hallucination += 15
-///////////////////////////////
-//SLIME CORES BELOW HERE///////
-///////////////////////////////
+ for(var/I in M.vore_organs)
+ var/datum/belly/B = M.vore_organs[I]
+ if(B.digest_mode == DM_ABSORB) //Turn off absorbing on bellies
+ B.digest_mode = DM_HOLD
+ for(var/mob/living/P in B.internal_contents)
+ if(!P.absorbed)
+ continue
-/datum/chemical_reaction/slime_food
- name = "Slime Bork"
- id = "m_tele2"
- result = null
- required_reagents = list("phoron" = 10, "slimejelly" = 10, "nutriment" = 10)
- result_amount = 1
- on_reaction(var/datum/reagents/holder)
+ else if(prob(1))
+ playsound(M, 'sound/vore/schlorp.ogg', 50, 1)
+ P.absorbed = 0
+ M.visible_message("Something spills into [M]'s [lowertext(B.name)]!")
+ return
- var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks // BORK BORK BORK
+//Special toxins for solargrubs
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-/* Removed at some point, unsure what to replace with
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- if(M:eyecheck() <= 0)
- flick("e_flash", M.flash)
-*/
- 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))
+/datum/reagent/grubshock
+ name = "200 V" //in other words a painful shock
+ id = "shockchem"
+ description = "A liquid that quickly dissapates to deliver a painful shock."
+ reagent_state = LIQUID
+ color = "#E4EC2F"
+ metabolism = 2.50
+ var/power = 11
-
-
-
-/datum/chemical_reaction/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
- 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(get_turf(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(get_turf(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, /obj/item/stack/material/cyborg, /obj/item/stack/material/cyborg/plastic, /obj/item/stack/material/cyborg/plasteel, /obj/item/stack/material/cyborg/glass/reinforced, /obj/item/stack/material/cyborg/wood, /obj/item/stack/material/animalhide/human, /obj/item/stack/material/animalhide/corgi, /obj/item/stack/material/animalhide/cat, /obj/item/stack/material/animalhide/monkey, /obj/item/stack/material/animalhide/lizard , /obj/item/stack/material/animalhide/xeno, /obj/item/stack/material/cyborg, /obj/item/stack/material/cyborg/glass/reinforced)
- var/list/material = typesof(/obj/item/stack/material) - blocked
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-/* Removed at some point, unsure what to replace with
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- if(M:eyecheck() <= 0)
- flick("e_flash", M.flash)
-*/
- var/spawn_amount = rand(1,50)
- var/chosen = pick(material)
- var/obj/item/stack/material/C = new chosen
- C.amount = spawn_amount
- C.loc = get_turf(holder.my_atom)
-
-
-/datum/chemical_reaction/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
- 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)
-
-
-/datum/chemical_reaction/slimephoron
- name = "Slime Phoron"
- id = "m_plasma"
- result = null
- required_reagents = list("phoron" = 20, "uranium" = 20, "slimejelly" = 20)
- result_amount = 1
- on_reaction(var/datum/reagents/holder)
- var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron
- P.amount = 10
- P.loc = get_turf(holder.my_atom)
-
-/datum/chemical_reaction/slimefreeze
- name = "Slime Freeze"
- id = "m_freeze"
- result = null
- required_reagents = list("phoron" = 10, "coolant" = 10, "slimejelly" = 10)
- result_amount = 1
- 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(get_turf(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
- M << " You suddenly feel a chill!"
-
-
-
-
-/datum/chemical_reaction/slimefrost
- name = "Slime Frost Oil"
- id = "m_frostoil"
- result = "frostoil"
- required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 5, "coolant" = 5)
- result_amount = 10
-
-
-
-
-/datum/chemical_reaction/slimefire
- name = "Slime fire"
- id = "m_fire"
- result = null
- required_reagents = list("phoron" = 60, "slimejelly" = 30, "potassium" = 30)
- result_amount = 1
- 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)
-
-
-/datum/chemical_reaction/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
-
-
-
-
-
-/datum/chemical_reaction/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)
- on_reaction(var/datum/reagents/holder, var/created_volume)
- for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
- 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()
-
-/datum/chemical_reaction/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
-
-
-
-
-
-/datum/chemical_reaction/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
- on_reaction(var/datum/reagents/holder)
- var/mob_path = /mob/living/simple_animal
- var/blocked = list(
- /mob/living/simple_animal/hostile/mimic,
- /mob/living/simple_animal/hostile/alien/queen
- )//exclusion list for things you don't want the reaction to create.
- var/list/voremobs = typesof(mob_path) - mob_path - blocked // list of possible hostile mobs
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-/* Removed at some point, unsure what to replace with
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- if(M:eyecheck() <= 0)
- flick("e_flash", M.flash)
-*/
- var/spawn_count = rand(1,3)
- for(var/i = 1, i <= spawn_count, i++)
- var/chosen = pick(voremobs)
- var/mob/living/simple_animal/hostile/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))
+/datum/reagent/grubshock/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.take_organ_damage(0, removed * power * 0.2)