diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
index a8cfa95f2c0..0be2ab3ecc4 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
@@ -85,6 +85,16 @@
/datum/trait/neutral/bloodsucker
name = "Bloodsucker, Obligate"
desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey."
+ tutorial = "This trait forces you to only consume blood - you cannot have normal food anymore. Vore is, of course, an exception!
\
+ You can satisfy this by clicking bloodbags in your hand on harm intent, drinking from glasses, blood tomatoes \
+ or finding a (un)willing donor for your appropriate appendage!
\
+ Controls for taking blood from your victim can be changed at will by trying to drink from yourself.\
+ Intent-based control scheme:
\
+ HELP - Loud, No Bleeding
\
+ DISARM - Subtle, Causes bleeding
\
+ GRAB - Subtle, No Bleeding
\
+ HARM - Loud, Causes Bleeding"
+
cost = 0
custom_only = FALSE
var_changes = list("organic_food_coeff" = 0, "bloodsucker" = TRUE)
@@ -97,6 +107,15 @@
/datum/trait/neutral/bloodsucker_freeform
name = "Bloodsucker"
desc = "You get fangs that can be used to drain blood from prey."
+ tutorial = "This trait allows you to consume blood on top of normal food!
\
+ You can do this by clicking bloodbags in your hand on harm intent, drinking from glasses, blood tomatoes \
+ or finding a (un)willing donor for your appropriate appendage!
\
+ Controls for taking blood from your victim can be changed at will by trying to drink from yourself.\
+ Intent-based control scheme:
\
+ HELP - Loud, No Bleeding
\
+ DISARM - Subtle, Causes bleeding
\
+ GRAB - Subtle, No Bleeding
\
+ HARM - Loud, Causes Bleeding"
cost = 0
custom_only = FALSE
var_changes = list("bloodsucker" = TRUE)
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
index 0de5ae30974..5ec3b04cb79 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
@@ -1,6 +1,7 @@
/datum/trait
var/name
var/desc = "Contact a developer if you see this trait."
+ var/tutorial = "This trait has no detailed tutorial yet. Suggest one at #Dev-Suggestions on the discord!"
var/cost = 0
var/sort = TRAIT_SORT_NORMAL // Sort order, 1 before 2 before 3 etc. Alphabetical is used for same-group traits.
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm
new file mode 100644
index 00000000000..b286021b601
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm
@@ -0,0 +1,58 @@
+/*
+A new Ability given to all human mobs
+
+This ability intends to retrieve all positive, neutral and negative traits chosen in the character set-up
+then retrieve their relevant vars by assuming the character's species has the full list. This should always work. Should
+
+The ability is intended to be developed both as a to_chat() and a tgui window.
+The user is given the ability to choose which they would like whenever they press the ability to better suit whatever scenario they find themselves
+thirsty for knowledge.
+*/
+
+
+
+
+
+/mob/living/carbon/human/verb/trait_tutorial()
+ set name = "Explain Custom Traits"
+ set desc = "Click this verb to obtain a detailed tutorial on your selected traits. "
+ set category = "Abilities"
+
+ var/list/list_of_traits = species.traits
+ if(!list_of_traits)
+ to_chat(usr, SPAN_NOTICE("You do not have any custom traits!"))
+
+
+ var/UI_choice = tgui_alert(src, "Would you like the tutorial text to be printed to chat?", "Choose preferred tutorial interface", list("To Chat", "Cancel"))
+ if(UI_choice == "Cancel")
+ return
+
+ //Initializing associative lists
+ var/trait_names = list() //List of keys
+ var/trait_category = list() // name:category
+ var/trait_desc = list() // name:desc
+ var/trait_tutorial = list() //name:tutorial
+ for(var/trait in list_of_traits)
+ var/datum/trait/T = all_traits[trait]
+ to_world_log("##DEBUG [T.name] is of category [T.category]")
+ trait_names += T.name
+ trait_desc[T.name] = T.desc
+ trait_tutorial[T.name] = T.tutorial
+ switch(T.category) //Using magic numbers rather than the #defines because it did not work with defines and idk why
+ if(-1) //TRAIT_TYPE_NEGATIVE
+ trait_category[T.name] = "Negative Trait"
+ if(0) //TRAIT_TYPE_NEUTRAL
+ trait_category[T.name] = "Neutral Trait"
+ if(1) //TRAIT_TYPE_POSITIVE
+ trait_category[T.name] = "Positive Trait"
+
+
+ if(UI_choice == "To Chat")
+ var/to_chat_choice = tgui_input_list(usr, "Please choose the trait to be explained", "Print to Chat", trait_names, null)
+ if(to_chat_choice)
+ to_chat(usr,SPAN_NOTICE("Name: [to_chat_choice] \n Category: [trait_category[to_chat_choice]] \n Description: [trait_desc[to_chat_choice]] \n \
+ Guide: \n [trait_tutorial[to_chat_choice]]"))
+
+
+// else if(UI_choice == "TGUI")
+ to_chat(usr, SPAN_NOTICE("TGUI functionality is not yet implemented, sorry!"))
diff --git a/vorestation.dme b/vorestation.dme
index 96664be9087..4fe311b1277 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2926,6 +2926,7 @@
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm"
+#include "code\modules\mob\living\carbon\human\species\station\traits_vr\traits_tutorial.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm"
#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm"