diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index 297e514e0d..97883c6cb9 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -242,6 +242,7 @@
prob(2);/obj/item/weapon/storage/box/syndie_kit/spy,
prob(2);/obj/item/weapon/grenade/anti_photon,
prob(2);/obj/item/clothing/under/hyperfiber/bluespace,
+ prob(2);/obj/item/weapon/reagent_containers/glass/beaker/vial/amorphorovir,
prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc,
prob(1);/obj/item/device/nif/bad,
prob(1);/obj/item/device/radio_jammer,
diff --git a/code/modules/reagents/reactions/instant/instant_vr.dm b/code/modules/reagents/reactions/instant/instant_vr.dm
index b2fef2977c..22f6ea9511 100644
--- a/code/modules/reagents/reactions/instant/instant_vr.dm
+++ b/code/modules/reagents/reactions/instant/instant_vr.dm
@@ -47,6 +47,58 @@
s.start()
holder.clear_reagents()
+///////////////////////////////////////////////////////////////////////////////////
+/// TF chemicals
+/decl/chemical_reaction/instant/amorphorovir
+ name = "Amorphorovir"
+ id = "amorphorovir"
+ result = "amorphorovir"
+ required_reagents = list("cryptobiolin" = 30, "biomass" = 30, "hyperzine" = 20)
+ catalysts = list("phoron" = 5)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/androrovir
+ name = "Androrovir"
+ id = "androrovir"
+ result = "androrovir"
+ required_reagents = list("amorphorovir" = 1, "bicaridine" = 20, "iron" = 20, "ethanol" = 20)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/gynorovir
+ name = "Gynorovir"
+ id = "gynorovir"
+ result = "gynorovir"
+ required_reagents = list("amorphorovir" = 1, "inaprovaline" = 20, "silicon" = 20, "sugar" = 20)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/androgynorovir
+ name = "Androgynorovir"
+ id = "androgynorovir"
+ result = "androgynorovir"
+ required_reagents = list("amorphorovir" = 1, "anti_toxin" = 20, "fluorine" = 20, "tungsten" = 20)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/androrovir_bootleg
+ name = "Bootleg Androrovir"
+ id = "androrovir_bootleg"
+ result = "androrovir"
+ required_reagents = list("amorphorovir" = 1, "protein" = 10, "capsaicin" = 10)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/gynorovir_bootleg
+ name = "Bootleg Gynorovir"
+ id = "gynorovir_bootleg"
+ result = "gynorovir"
+ required_reagents = list("amorphorovir" = 1, "soymilk" = 10, "sugar" = 10)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/androgynorovir_bootleg
+ name = "Bootleg Androgynorovir"
+ id = "androgynorovir_bootleg"
+ result = "androgynorovir"
+ required_reagents = list("amorphorovir" = 1, "cola" = 10, "berryjuice" = 10)
+ result_amount = 1
+
///////////////////////////////////////////////////////////////////////////////////
/// Miscellaneous Reactions
@@ -85,7 +137,7 @@
required_reagents = list("water" = 1)
catalysts = list("fluorine" = 10)
result_amount = 1
-
+
/decl/chemical_reaction/instant/firefightingfoamqol //Please don't abuse this and make us remove it. Seriously.
name = "Firefighting Foam EZ"
id = "firefighting foam ez"
diff --git a/code/modules/reagents/reagent_containers/glass_vr.dm b/code/modules/reagents/reagent_containers/glass_vr.dm
index 79c19b8288..86601ea777 100644
--- a/code/modules/reagents/reagent_containers/glass_vr.dm
+++ b/code/modules/reagents/reagent_containers/glass_vr.dm
@@ -49,6 +49,10 @@
name = "vial (hyronalin)"
prefill = list("hyronalin" = 30)
+/obj/item/weapon/reagent_containers/glass/beaker/vial/amorphorovir
+ name = "vial (amorphorovir)"
+ prefill = list("amorphorovir" = 1)
+
/obj/item/weapon/reagent_containers/glass/beaker/measuring_cup
name = "measuring cup"
desc = "A measuring cup."
diff --git a/code/modules/reagents/reagents/other_vr.dm b/code/modules/reagents/reagents/other_vr.dm
index b1146960ed..f0286667df 100644
--- a/code/modules/reagents/reagents/other_vr.dm
+++ b/code/modules/reagents/reagents/other_vr.dm
@@ -6,6 +6,8 @@
color = "#13BC5E"
/datum/reagent/advmutationtoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(!(M.allow_spontaneous_tf))
+ return
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.name != "Promethean")
@@ -119,3 +121,16 @@
if(nif.stat == NIF_TEMPFAIL)
nif.stat = NIF_INSTALLING
nif.durability = min(nif.durability + removed*0.1, initial(nif.durability))
+
+//Special toxins for solargrubs
+/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 = 9
+
+/datum/reagent/grubshock/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.take_organ_damage(0, removed * power * 0.2)
diff --git a/code/modules/reagents/reagents/vore_vr.dm b/code/modules/reagents/reagents/vore_vr.dm
index 20af3a57e3..a86c755c3d 100644
--- a/code/modules/reagents/reagents/vore_vr.dm
+++ b/code/modules/reagents/reagents/vore_vr.dm
@@ -117,16 +117,74 @@
P.absorbed = 0
M.visible_message("Something spills into [M]'s [lowertext(B.name)]!")
-//Special toxins for solargrubs
+////////////////////////// TF Drugs //////////////////////////
-/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."
+/datum/reagent/amorphorovir
+ name = "Amorphorovir"
+ id = "amorphorovir"
+ description = "A base medical concoction, capable of rapidly altering genetic and physical structure of the body. Requires extra processing to allow for a targeted transformation."
reagent_state = LIQUID
- color = "#E4EC2F"
- metabolism = 2.50
- var/power = 9
+ color = "#AAAAAA"
-/datum/reagent/grubshock/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.take_organ_damage(0, removed * power * 0.2)
+/datum/reagent/androrovir
+ name = "Androrovir"
+ id = "androrovir"
+ description = "A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems to realign the target's gender to be male."
+ reagent_state = LIQUID
+ color = "#00BBFF"
+
+/datum/reagent/androrovir/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(!(M.allow_spontaneous_tf))
+ return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(M.reagents.has_reagent("gynorovir") || M.reagents.has_reagent("androgynorovir"))
+ H.Confuse(1)
+ else
+ if(!(H.gender == MALE))
+ H.set_gender(MALE)
+ H.change_gender_identity(MALE)
+ H.visible_message("[H] suddenly twitches as some of their features seem to contort and reshape, adjusting... In the end, it seems they are now male.",
+ "Your body suddenly contorts, feeling very different in various ways... By the time the rushing feeling is over it seems you just became male.")
+
+/datum/reagent/gynorovir
+ name = "Gynorovir"
+ id = "gynorovir"
+ description = "A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems to realign the target's gender to be female."
+ reagent_state = LIQUID
+ color = "#FF00AA"
+
+/datum/reagent/gynorovir/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(!(M.allow_spontaneous_tf))
+ return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(M.reagents.has_reagent("androrovir") || M.reagents.has_reagent("androgynorovir"))
+ H.Confuse(1)
+ else
+ if(!(H.gender == FEMALE))
+ H.set_gender(FEMALE)
+ H.change_gender_identity(FEMALE)
+ H.visible_message("[H] suddenly twitches as some of their features seem to contort and reshape, adjusting... In the end, it seems they are now female.",
+ "Your body suddenly contorts, feeling very different in various ways... By the time the rushing feeling is over it seems you just became female.")
+
+/datum/reagent/androgynorovir
+ name = "Androgynorovir"
+ id = "androgynorovir"
+ description = "A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems to realign the target's gender to be mixed."
+ reagent_state = LIQUID
+ color = "#6600FF"
+
+/datum/reagent/androgynorovir/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(!(M.allow_spontaneous_tf))
+ return
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(M.reagents.has_reagent("gynorovir") || M.reagents.has_reagent("androrovir"))
+ H.Confuse(1)
+ else
+ if(!(H.gender == PLURAL))
+ H.set_gender(PLURAL)
+ H.change_gender_identity(PLURAL)
+ H.visible_message("[H] suddenly twitches as some of their features seem to contort and reshape, adjusting... In the end, it seems they are now of mixed gender.",
+ "Your body suddenly contorts, feeling very different in various ways... By the time the rushing feeling is over it seems you just became of mixed gender.")
\ No newline at end of file
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 37c3f27782..f2eb242256 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -28,6 +28,7 @@
var/permit_healbelly = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = TRUE // Mobs are pred by default.
+ var/allow_spontaneous_tf = FALSE // Obviously.
var/next_preyloop // For Fancy sound internal loop
var/adminbus_trash = FALSE // For abusing trash eater for event shenanigans.
var/adminbus_eat_minerals = FALSE // This creature subsists on a diet of pure adminium.
@@ -236,6 +237,7 @@
P.show_vore_fx = src.show_vore_fx
P.can_be_drop_prey = src.can_be_drop_prey
P.can_be_drop_pred = src.can_be_drop_pred
+ P.allow_spontaneous_tf = src.allow_spontaneous_tf
P.step_mechanics_pref = src.step_mechanics_pref
P.pickup_pref = src.pickup_pref
@@ -271,6 +273,7 @@
show_vore_fx = P.show_vore_fx
can_be_drop_prey = P.can_be_drop_prey
can_be_drop_pred = P.can_be_drop_pred
+ allow_spontaneous_tf = P.allow_spontaneous_tf
step_mechanics_pref = P.step_mechanics_pref
pickup_pref = P.pickup_pref
@@ -857,6 +860,7 @@
dispvoreprefs += "Healbelly permission: [permit_healbelly ? "Allowed" : "Disallowed"]
"
dispvoreprefs += "Spontaneous vore prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Spontaneous vore pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
"
+ dispvoreprefs += "Spontaneous transformation: [allow_spontaneous_tf ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Can be stepped on/over: [step_mechanics_pref ? "Allowed" : "Disallowed"]
"
dispvoreprefs += "Can be picked up: [pickup_pref ? "Allowed" : "Disallowed"]
"
user << browse("
Vore prefs: [src][dispvoreprefs]", "window=[name]mvp;size=200x300;can_resize=0;can_minimize=0")
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index 82df33ccf2..e3e7b9befa 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -49,6 +49,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/feeding = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = FALSE
+ var/allow_spontaneous_tf = FALSE
var/digest_leave_remains = FALSE
var/allowmobvore = TRUE
var/permit_healbelly = TRUE
@@ -136,6 +137,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
show_vore_fx = json_from_file["show_vore_fx"]
can_be_drop_prey = json_from_file["can_be_drop_prey"]
can_be_drop_pred = json_from_file["can_be_drop_pred"]
+ allow_spontaneous_tf = json_from_file["allow_spontaneous_tf"]
step_mechanics_pref = json_from_file["step_mechanics_pref"]
pickup_pref = json_from_file["pickup_pref"]
belly_prefs = json_from_file["belly_prefs"]
@@ -163,6 +165,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
can_be_drop_prey = FALSE
if(isnull(can_be_drop_pred))
can_be_drop_pred = FALSE
+ if(isnull(allow_spontaneous_tf))
+ allow_spontaneous_tf = FALSE
if(isnull(step_mechanics_pref))
step_mechanics_pref = TRUE
if(isnull(pickup_pref))
@@ -192,6 +196,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"show_vore_fx" = show_vore_fx,
"can_be_drop_prey" = can_be_drop_prey,
"can_be_drop_pred" = can_be_drop_pred,
+ "allow_spontaneous_tf" = allow_spontaneous_tf,
"step_mechanics_pref" = step_mechanics_pref,
"pickup_pref" = pickup_pref,
"belly_prefs" = belly_prefs,
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 27382bda45..249b3051cb 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -224,6 +224,7 @@
"show_vore_fx" = host.show_vore_fx,
"can_be_drop_prey" = host.can_be_drop_prey,
"can_be_drop_pred" = host.can_be_drop_pred,
+ "allow_spontaneous_tf" = host.allow_spontaneous_tf,
"step_mechanics_active" = host.step_mechanics_pref,
"pickup_mechanics_active" = host.pickup_pref,
"noisy" = host.noisy,
@@ -354,6 +355,12 @@
host.client.prefs_vr.can_be_drop_prey = host.can_be_drop_prey
unsaved_changes = TRUE
return TRUE
+ if("toggle_allow_spontaneous_tf")
+ host.allow_spontaneous_tf = !host.allow_spontaneous_tf
+ if(host.client.prefs_vr)
+ host.client.prefs_vr.allow_spontaneous_tf = host.allow_spontaneous_tf
+ unsaved_changes = TRUE
+ return TRUE
if("toggle_digest")
host.digestable = !host.digestable
if(host.client.prefs_vr)
diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js
index 34722433ff..bc91fb376c 100644
--- a/tgui/packages/tgui/interfaces/VorePanel.js
+++ b/tgui/packages/tgui/interfaces/VorePanel.js
@@ -607,6 +607,7 @@ const VoreUserPreferences = (props, context) => {
show_vore_fx,
can_be_drop_prey,
can_be_drop_pred,
+ allow_spontaneous_tf,
step_mechanics_active,
pickup_mechanics_active,
noisy,
@@ -767,7 +768,7 @@ const VoreUserPreferences = (props, context) => {
+ " Click this to enable showing FX.")}
content={show_vore_fx ? "Show Vore FX" : "Do Not Show Vore FX"} />
-
+
-
+
+
+