diff --git a/code/game/gamemodes/vampire/vampire_helpers.dm b/code/game/gamemodes/vampire/vampire_helpers.dm
index 1ce94e0a112..3f126b7ff74 100644
--- a/code/game/gamemodes/vampire/vampire_helpers.dm
+++ b/code/game/gamemodes/vampire/vampire_helpers.dm
@@ -104,9 +104,81 @@
mind.vampire = thrall
-// #TODO: Finish vampire_check_frenzy and implement frenzy.
-/mob/proc/vampire_check_frenzy()
- return
+/mob/proc/vampire_check_frenzy(var/force_frenzy = 0)
+ if (!mind || !mind.vampire)
+ return
+
+ var/datum/vampire/vampire = mind.vampire
+
+ // Thralls don't frenzy.
+ if (vampire.status & VAMP_ISTHRALL)
+ return
+
+/*
+ * Misc info:
+ * 100 points ~= 3.5 minutes.
+ * Average duration should be around 4 minutes of frenzy.
+ * Trigger at 120 points or higher.
+ */
+
+ if (vampire.status & VAMP_FRENZIED)
+ if (vampire.frenzy < 10)
+ vampire_stop_frenzy()
+ else
+ switch (vampire.frenzy)
+ if (0)
+ return
+ if (1 to 40)
+ if (prob(15))
+ src << "You feel the power of the Veil bubbling in your veins."
+ if (41 to 60)
+ if (prob(35))
+ src << "The corruption within your blood is seeking to take over, you can feel it."
+ if (61 to 80)
+ if (prob(40))
+ src << "Your rage is growing ever greater. You are having to actively resist it."
+ if (81 to 120)
+ if (prob(50))
+ src << "The corruption of the Veil is about to take over. You have little time left."
+ else
+ if (!(vampire.status & VAMP_FRENZIED))
+ vampire_start_frenzy(force_frenzy)
+
+ // Remove one point per every life() tick.
+ vampire.frenzy--
+
+/mob/proc/vampire_start_frenzy(var/force_frenzy = 0)
+ var/datum/vampire/vampire = mind.vampire
+
+ if (vampire.status & VAMP_FRENZIED)
+ return
+
+ var/probablity = force_frenzy ? 100 : vampire.frenzy * 0.5
+
+ if (prob(probablity))
+ vampire.status |= VAMP_FRENZIED
+ visible_message("A dark aura manifests itself around [src.name], their eyes turning red and their composure changing to be more beast-like.", "You can resist no longer. The power of the Veil takes control over your mind: you are unable to speak or think. In people, you see nothing but prey to be feasted upon. You are reduced to an animal.")
+
+ mutations.Add(HULK)
+ update_mutations()
+
+ sight |= SEE_MOBS
+
+/mob/proc/vampire_stop_frenzy(var/force_stop = 0)
+ var/datum/vampire/vampire = mind.vampire
+
+ if (!(vampire.status & VAMP_FRENZIED))
+ return
+
+ if (prob(force_stop ? 100 : vampire.blood_usable))
+ vampire.status &= ~VAMP_FRENZIED
+
+ mutations.Remove(HULK)
+ update_mutations()
+
+ sight &= ~SEE_MOBS
+
+ visible_message("[src.name]'s eyes no longer glow with violent rage, their form reverting to resemble that of a normal human's.", "The beast within you retreats. You gain control over your body once more.")
// Removes all vampire powers.
/mob/proc/remove_vampire_powers()
@@ -117,10 +189,17 @@
if (P.isVerb)
verbs -= P.verbpath
+ if (mind.vampire.status & VAMP_FRENZIED)
+ vampire_stop_frenzy(1)
+
/mob/proc/handle_vampire()
// Apply frenzy while in the chapel.
if (istype(get_area(loc), /area/chapel))
+ mind.vampire.frenzy += 3
+
+ if (mind.vampire.blood_usable < 10)
mind.vampire.frenzy += 2
- vampire_check_frenzy()
+
+ vampire_check_frenzy()
return
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 71da772f1c3..485d53159d6 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1122,7 +1122,7 @@
proc/handle_regular_hud_updates()
if(!overlays_cache)
overlays_cache = list()
- overlays_cache.len = 23
+ overlays_cache.len = 24
overlays_cache[1] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage1")
overlays_cache[2] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage2")
overlays_cache[3] = image('icons/mob/screen1_full.dmi', "icon_state" = "passage3")
@@ -1146,6 +1146,7 @@
overlays_cache[21] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay4")
overlays_cache[22] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay5")
overlays_cache[23] = image('icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay6")
+ overlays_cache[24] = image('icons/mob/screen1_full.dmi', "icon_state" = "frenzyoverlay")
if(hud_updateflag) // update our mob's hud overlays, AKA what others see flaoting above our head
handle_hud_list()
@@ -1213,6 +1214,12 @@
I = overlays_cache[17]
damageoverlay.overlays += I
+ // Vampire frenzy overlay.
+ if (mind.vampire)
+ if (mind.vampire.status & VAMP_FRENZIED)
+ var/image/I = overlays_cache[24]
+ damageoverlay.overlays += I
+
//Fire and Brute damage overlay (BSSR)
var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp
damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not.
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
index 87ad6518f0b..28d7f5aa638 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
@@ -208,7 +208,10 @@
/datum/reagent/water/holywater/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
- //#TODO: holy water adds frenzy
+
+ if (M.mind && M.mind.vampire)
+ var/datum/vampire/vampire = M.mind.vampire
+ vampire.frenzy += removed * 5
/datum/reagent/water/holywater/touch_turf(var/turf/T)
if(volume >= 5)
diff --git a/icons/mob/screen1_full.dmi b/icons/mob/screen1_full.dmi
index 37bd1c9df67..10c96e23c6c 100644
Binary files a/icons/mob/screen1_full.dmi and b/icons/mob/screen1_full.dmi differ