diff --git a/code/__HELPERS/traits.dm b/code/__HELPERS/traits.dm
index 467b07a0ddf..ee6c5d10fe0 100644
--- a/code/__HELPERS/traits.dm
+++ b/code/__HELPERS/traits.dm
@@ -62,7 +62,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
//mob traits
#define TRAIT_PACIFISM "pacifism"
-#define TRAIT_WATERBREATH "waterbreathing"
+#define TRAIT_WATERBREATH "waterbreathing"
+#define TRAIT_BLOODCRAWL "bloodcrawl"
+#define TRAIT_BLOODCRAWL_EAT "bloodcrawl_eat"
// common trait sources
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index 9e0d45643be..ccc31e5c501 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -5,7 +5,10 @@
*/
GLOBAL_LIST_INIT(traits_by_type, list(
/mob = list(
- "TRAIT_PACIFISM" = TRAIT_PACIFISM
+ "TRAIT_PACIFISM" = TRAIT_PACIFISM,
+ "TRAIT_WATERBREATH" = TRAIT_WATERBREATH,
+ "BLOODCRAWL" = TRAIT_BLOODCRAWL,
+ "BLOODCRAWL_EAT" = TRAIT_BLOODCRAWL_EAT
)))
/// value -> trait name, generated on use from trait_by_type global
diff --git a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm
index ccaad5bca87..ed0a4a908ed 100644
--- a/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm
+++ b/code/game/gamemodes/miniantags/slaughter/bloodcrawl.dm
@@ -35,8 +35,8 @@
animation.dir = dir
ExtinguishMob()
- if(pulling && bloodcrawl == BLOODCRAWL_EAT)
- if(istype(pulling, /mob/living/))
+ if(pulling && HAS_TRAIT(src, TRAIT_BLOODCRAWL_EAT))
+ if(isliving(pulling))
var/mob/living/victim = pulling
if(victim.stat == CONSCIOUS)
visible_message("[victim] kicks free of [B] just before entering it!")
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 1f525e93076..64f07bccbaa 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -35,7 +35,6 @@
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
var/boost = 0
- bloodcrawl = BLOODCRAWL_EAT
var/devoured = 0
@@ -59,6 +58,7 @@
/mob/living/simple_animal/slaughter/New()
..()
remove_from_all_data_huds()
+ ADD_TRAIT(src, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat")
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
whisper_action = new()
@@ -247,33 +247,39 @@
user.visible_message("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!", \
"An unnatural hunger consumes you. You raise [src] to your mouth and devour it!")
playsound(user, 'sound/misc/demon_consume.ogg', 50, 1)
- for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
- if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl)
- qdel(src)
- return
-
- if(user.bloodcrawl == 0)
- user.visible_message("[user]'s eyes flare a deep crimson!", \
- "You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!")
- user.bloodcrawl = BLOODCRAWL
- else if(user.bloodcrawl == BLOODCRAWL)
- to_chat(user, "You feel diffr- CONSUME THEM! ")
- user.bloodcrawl = BLOODCRAWL_EAT
- else
- to_chat(user, "...and you don't feel any different.")
-
user.drop_item()
insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E
/obj/item/organ/internal/heart/demon/insert(mob/living/carbon/M, special = 0)
- ..()
- if(M.mind)
+ if(!M.mind)
+ return
+
+ // Eating the heart for the first time. Gives basic bloodcrawling.
+ if(!HAS_TRAIT(M, TRAIT_BLOODCRAWL))
+ M.visible_message("[M]'s eyes flare a deep crimson!", \
+ "You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
+ ADD_TRAIT(M, TRAIT_BLOODCRAWL, "bloodcrawl")
+ return ..() // The only time we actually need to replace the user's heart with the demon heart.
+
+ // Eating a 2nd heart. Gives the ability to drag people into blood and eat them.
+ if(HAS_TRAIT(M, TRAIT_BLOODCRAWL))
+ to_chat(M, "You feel diffr- CONSUME THEM! ")
+ ADD_TRAIT(M, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat")
+ qdel(src) // Replacing their demon heart with another demon heart is pointless, just delete this one and return.
+ return TRUE
+
+ // Eating any more than 2 demon hearts does nothing.
+ else
+ to_chat(M, "...and you don't feel any different.")
+ qdel(src)
+ return
/obj/item/organ/internal/heart/demon/remove(mob/living/carbon/M, special = 0)
..()
if(M.mind)
- M.bloodcrawl = 0
+ REMOVE_TRAIT(M, TRAIT_BLOODCRAWL, "bloodcrawl")
+ REMOVE_TRAIT(M, TRAIT_BLOODCRAWL_EAT, "bloodcrawl_eat")
M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl)
/obj/item/organ/internal/heart/demon/Stop()
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 4fbfaaa4e09..e230f7a2b99 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -33,7 +33,6 @@
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
var/digestion_ratio = 1 //controls how quickly reagents metabolize; largely governered by species attributes.
- var/bloodcrawl = 0 //0 No blood crawling, 1 blood crawling, 2 blood crawling+mob devour
var/holder = null //The holder for blood crawling
var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always