diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 2e3f8b07600..0a2e49d907c 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -13,6 +13,9 @@
#define O_ORCH "orchestrator"
#define O_FACT "refactory"
+//Alraune organs
+#define A_FRUIT "fruit gland"
+
//species defines
#define SPECIES_AKULA "Akula"
#define SPECIES_ALRAUNE "Alraune"
diff --git a/code/global_vr.dm b/code/global_vr.dm
index 4170750ee4d..154613a4bb1 100644
--- a/code/global_vr.dm
+++ b/code/global_vr.dm
@@ -7,28 +7,28 @@
return 1
var/global/list/acceptable_fruit_types= list(
- "chili",
- "berry",
- "tomato",
- "eggplant",
- "apple",
"ambrosia",
+ "apple",
+ "banana",
+ "berry",
+ "cabbage",
+ "carrot",
+ "cherry",
+ "chili",
+ "eggplant",
"grape",
"greengrapes",
- "peanut",
- "cabbage",
- "banana",
- "potato",
- "onion",
- "soybean",
- "wheat",
- "rice",
- "carrot",
- "whitebeet",
- "sugarcane",
- "watermelon",
- "pumpkin",
- "lime",
"lemon",
+ "lime",
+ "onion",
"orange",
- "cherry")
\ No newline at end of file
+ "peanut",
+ "potato",
+ "pumpkin",
+ "rice",
+ "soybean",
+ "sugarcane",
+ "tomato",
+ "watermelon",
+ "wheat",
+ "whitebeet")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_defines_vr.dm b/code/modules/mob/living/carbon/human/human_defines_vr.dm
index f21caae5e7e..d7617da72e5 100644
--- a/code/modules/mob/living/carbon/human/human_defines_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm
@@ -7,4 +7,4 @@
var/flapping = 0
var/vantag_pref = VANTAG_NONE //What's my status?
var/impersonate_bodytype //For impersonating a bodytype
- var/fruit_type = "apple" // Decides the frruit type. Not used outside of Alraunes
\ No newline at end of file
+ var/fruit_type = "apple" // Decides the fruit type. Not used outside of Alraunes
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm
index a52377f0b2c..4aa39470c6a 100644
--- a/code/modules/mob/living/carbon/human/species/station/alraune.dm
+++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm
@@ -50,7 +50,8 @@
/mob/living/carbon/human/proc/succubus_drain,
/mob/living/carbon/human/proc/succubus_drain_finalize,
/mob/living/carbon/human/proc/succubus_drain_lethal,
- /mob/living/carbon/human/proc/bloodsuck) //Give them the voremodes related to wrapping people in vines and sapping their fluids
+ /mob/living/carbon/human/proc/bloodsuck,
+ /mob/living/carbon/human/proc/alraune_fruit_select) //Give them the voremodes related to wrapping people in vines and sapping their fluids
color_mult = 1
icobase = 'icons/mob/human_races/r_human_vr.dmi'
@@ -88,19 +89,9 @@
O_KIDNEYS = /obj/item/organ/internal/kidneys/alraune,
O_BRAIN = /obj/item/organ/internal/brain/alraune,
O_EYES = /obj/item/organ/internal/eyes/alraune,
+ A_FRUIT = /obj/item/organ/internal/fruitgland,
)
-/datum/species/alraune/equip_survival_gear(var/mob/living/carbon/human/H)
- ..()
-
- var/implanter = /obj/item/weapon/implanter/reagent_generator/fruit_implant
- var/obj/item/weapon/implanter/reagent_generator/fruit_implant/implant = new implanter
-
- if(H.backbag == 1)
- H.equip_to_slot_or_del(implant, slot_r_hand)
- else
- H.equip_to_slot_or_del(implant, slot_in_backpack)
-
/datum/species/alraune/can_breathe_water()
return TRUE //eh, why not? Aquatic plants are a thing.
@@ -345,10 +336,121 @@
/obj/item/organ/internal/liver/alraune
icon = 'icons/mob/species/alraune/organs.dmi'
icon_state = "phytoextractor"
- name = "phytoextractor"
+ name = "enzoretector"
desc = "A bulbous gourd-like structure."
+//Begin fruit gland and its code.
+/obj/item/organ/internal/fruitgland //Amazing name, I know.
+ icon = 'icons/mob/species/alraune/organs.dmi'
+ icon_state = "phytoextractor"
+ name = "fruit gland"
+ desc = "A bulbous gourd-like structure."
+ organ_tag = A_FRUIT
+ var/generated_reagents = list("sugar" = 2) //This actually allows them. This could be anything, but sugar seems most fitting.
+ var/usable_volume = 250 //Five fruit.
+ var/transfer_amount = 50
+ var/empty_message = list("Your have no fruit on you.", "You have a distinct lack of fruit..")
+ var/full_message = list("You have a multitude of fruit that is ready for harvest!", "You have fruit that is ready to be picked!")
+ var/emote_descriptor = list("fruit right off of the Alraune!", "a fruit from the Alraune!")
+ var/verb_descriptor = list("grabs", "snatches", "picks")
+ var/self_verb_descriptor = list("grab", "snatch", "pick")
+ var/short_emote_descriptor = list("picks", "grabs")
+ var/self_emote_descriptor = list("grab", "pick", "snatch")
+ var/fruit_type = "apple"
+ var/mob/organ_owner = null
+ var/gen_cost = 0.5
+/obj/item/organ/internal/fruitgland/New()
+ ..()
+ create_reagents(usable_volume)
+
+
+/obj/item/organ/internal/fruitgland/process()
+ if(!owner) return
+ var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
+ var/before_gen
+ if(parent && generated_reagents && organ_owner) //Is it in the chest/an organ, has reagents, and is 'activated'
+ before_gen = reagents.total_volume
+ if(reagents.total_volume < reagents.maximum_volume)
+ if(organ_owner.nutrition >= gen_cost)
+ do_generation()
+
+ if(reagents)
+ if(reagents.total_volume == reagents.maximum_volume * 0.05)
+ to_chat(organ_owner, "[pick(empty_message)]")
+ else if(reagents.total_volume == reagents.maximum_volume && before_gen < reagents.maximum_volume)
+ to_chat(organ_owner, "[pick(full_message)]")
+
+/obj/item/organ/internal/fruitgland/proc/do_generation()
+ organ_owner.nutrition -= gen_cost
+ for(var/reagent in generated_reagents)
+ reagents.add_reagent(reagent, generated_reagents[reagent])
+
+
+/mob/living/carbon/human/proc/alraune_fruit_select() //So if someone doesn't want fruit/vegetables, they don't have to select one.
+ set name = "Select fruit"
+ set desc = "Select what fruit/vegetable you wish to grow."
+ set category = "Object"
+ var/obj/item/organ/internal/fruitgland/fruit_gland
+ for(var/F in contents)
+ if(istype(F, /obj/item/organ/internal/fruitgland))
+ fruit_gland = F
+ break
+
+ if(fruit_gland)
+ var/selection = input(src, "Choose your character's fruit type. Choosing nothing will result in a default of apples.", "Fruit Type", fruit_gland.fruit_type) as null|anything in acceptable_fruit_types
+ if(selection)
+ fruit_gland.fruit_type = selection
+ verbs |= /mob/living/carbon/human/proc/alraune_fruit_pick
+ verbs -= /mob/living/carbon/human/proc/alraune_fruit_select
+ fruit_gland.organ_owner = src
+ fruit_gland.emote_descriptor = list("fruit right off of [fruit_gland.organ_owner]!", "a fruit from [fruit_gland.organ_owner]!")
+
+ else
+ to_chat(src, "You lack the organ required to produce fruit.")
+ return
+
+/mob/living/carbon/human/proc/alraune_fruit_pick()
+ set name = "Pick Fruit"
+ set desc = "Pick fruit off of [src]."
+ set category = "Object"
+ set src in view(1)
+
+ //do_reagent_implant(usr)
+ if(!isliving(usr) || !usr.canClick())
+ return
+
+ if(usr.incapacitated() || usr.stat > CONSCIOUS)
+ return
+
+ var/obj/item/organ/internal/fruitgland/fruit_gland
+ for(var/I in contents)
+ if(istype(I, /obj/item/organ/internal/fruitgland))
+ fruit_gland = I
+ break
+ if (fruit_gland) //Do they have the gland?
+ if(fruit_gland.reagents.total_volume < fruit_gland.transfer_amount)
+ to_chat(src, "[pick(fruit_gland.empty_message)]")
+ return
+
+ var/datum/seed/S = plant_controller.seeds["[fruit_gland.fruit_type]"]
+ S.harvest(usr,0,0,1)
+
+ var/index = rand(0,2)
+
+ if (usr != src)
+ var/emote = fruit_gland.emote_descriptor[index]
+ var/verb_desc = fruit_gland.verb_descriptor[index]
+ var/self_verb_desc = fruit_gland.self_verb_descriptor[index]
+ usr.visible_message("[usr] [verb_desc] [emote]",
+ "You [self_verb_desc] [emote]")
+ else
+ visible_message("[src] [pick(fruit_gland.short_emote_descriptor)] a fruit.",
+ "You [pick(fruit_gland.self_emote_descriptor)] a fruit.")
+
+ fruit_gland.reagents.remove_any(fruit_gland.transfer_amount)
+
+//End of fruit gland code.
/datum/species/alraune/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H)
ASSERT(to_copy)
@@ -394,4 +496,4 @@
/datum/species/alraune/get_race_key()
var/datum/species/real = all_species[base_species]
- return real.race_key
\ No newline at end of file
+ return real.race_key
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index a61c7c836d5..680dac91f77 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -2006,75 +2006,3 @@
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "penlightlynn"
-
-//Fruit Implants for Alraune
-/obj/item/weapon/implant/reagent_generator/fruit_implant
- name = "fruit enabling implant"
- desc = "This is an implant that hastens Alraune's fruit production."
- generated_reagents = list("sugar" = 2) //This actually allows them. This could be anything, but sugar seems most fitting.
- usable_volume = 250 //Five fruit.
- transfer_amount = 50
- empty_message = list("Your have no fruit on you.", "You have a distinct lack of fruit..")
- full_message = list("You have a multitude of fruit that is ready for harvest!", "You have fruit that is ready to be picked!")
- emote_descriptor = list("fruit right off of the Alraune!", "a fruit from the Alraune!") //These are changed below
- var/verb_descriptor = list("grabs", "snatches", "picks")
- var/self_verb_descriptor = list("grab", "snatch", "pick")
- var/short_emote_descriptor = list("picks", "grabs")
- self_emote_descriptor = list("grab", "pick", "snatch")
- assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_fruit_implant
-
-/obj/item/weapon/implant/reagent_generator/fruit_implant/implanted(mob/living/carbon/human/source)
- if(source.species.name != SPECIES_ALRAUNE)
- to_chat(source, "Perhaps using this implant as a non Alraune was a bad idea...") //You wasted it. Good job.
- return 1
- processing_objects += src
- to_chat(source, "You implant [source] with \the [src].")
- emote_descriptor = list("fruit right off of [source]!", "a fruit from [source]!")
- var/selection = input(source, "Choose your character's fruit type. Choosing nothing will result in a default of apples.", "Fruit Type", source.fruit_type) as null|anything in acceptable_fruit_types
- if(selection)
- source.fruit_type = selection
- source.verbs |= assigned_proc
- return 1
-
-/obj/item/weapon/implanter/reagent_generator/fruit_implant
- implant_type = /obj/item/weapon/implant/reagent_generator/fruit_implant
-
-/mob/living/carbon/human/proc/use_reagent_implant_fruit_implant()
- set name = "Pick Fruit"
- set desc = "Pick fruit off of [src]."
- set category = "Object"
- set src in view(1)
-
- //do_reagent_implant(usr)
- if(!isliving(usr) || !usr.canClick())
- return
-
- if(usr.incapacitated() || usr.stat > CONSCIOUS)
- return
-
- var/obj/item/weapon/implant/reagent_generator/fruit_implant/rimplant
- for(var/I in contents)
- if(istype(I, /obj/item/weapon/implant/reagent_generator))
- rimplant = I
- break
- if (rimplant)
- if(rimplant.reagents.total_volume < rimplant.transfer_amount)
- to_chat(src, "[pick(rimplant.empty_message)]")
- return
-
- var/datum/seed/S = plant_controller.seeds["[fruit_type]"] //crosses fingers EVEN HARDER than last one.
- S.harvest(usr,0,0,1)
-
- var/index = rand(0,2)
-
- if (usr != src)
- var/emote = rimplant.emote_descriptor[index]
- var/verb_desc = rimplant.verb_descriptor[index]
- var/self_verb_desc = rimplant.self_verb_descriptor[index]
- usr.visible_message("[usr] [verb_desc] [emote]",
- "You [self_verb_desc] [emote]")
- else
- visible_message("[src] [pick(rimplant.short_emote_descriptor)] a fruit.",
- "You [pick(rimplant.self_emote_descriptor)] a fruit.")
-
- rimplant.reagents.remove_any(rimplant.transfer_amount)