Repository: Near-Web/The-Final-Nights
Pull request #282: Re-Enables Diablerie, Fixes Burn Healing On Feeding
Author: login: anything86
Labels: name: Enhancement
description: Enhances something already in the game
name: Balance
description: This PR or Issue touches the balance of the game.
Created: 2025-04-13T04:50:30Z | Merged: 2025-04-23T12:22:07Z

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull request process. -->

## About The Pull Request
Makes it so Diablerie is no longer restricted to Salubri, Caitiff and Banu Haqim.
Adds a prompt to Diablerie, followed by a 60 second timer before it actually happens.
Removes the hike in chance of dying when diablerizing just for having the Diablerist trait.
Removes old code from back when Generation was tied to healthpool.

The high associated with Diablerizing another Kindred is now represented with a status effect.

Tones down/removes the burn damage healing from drinking blood.

## Why It's Good For The Game
Lore-accuracy. As for potential rulebreaking, The Final Nights is a more curated environment, and wanton Diablerie should be held to a higher standard of punishment rather than mechanically restricted - specially in its current iteration, where it does not in any way affect the Diablerized player's character sheet.

Drinking blood healing such a massive amount of burn damage was a leftover. As part of the server's launch, all sources of kindred fire damage healing were slashed down (from 30 per BP to 6), and whoever did it forgot to change it for blood drinking as well.


## Testing Photographs and Procedure
![1f3bc55eebf680ca59be56f7e4eb5250](https://github.com/user-attachments/assets/4205600b-019f-420b-9419-2ebc36c602d7)


</details>

## Changelog

:cl:
add: Vampires of all clans can now attempt Diablerie without getting mindcontrolled by Hardestadt and his 5G towers.
add: Diablerie now comes with its associated high.
/:cl:


Diff:
diff --git a/code/__DEFINES/wod13/status_effects_debuffs.dm b/code/__DEFINES/wod13/status_effects_debuffs.dm
index f3e64f12580..3f2c630c4d3 100644
--- a/code/__DEFINES/wod13/status_effects_debuffs.dm
+++ b/code/__DEFINES/wod13/status_effects_debuffs.dm
@@ -2,3 +2,4 @@
 
 #define STATUS_EFFECT_SILVER_SLOWDOWN /datum/status_effect/silver_slowdown //slows down any mobs with a bane to silver.
 #define STATUS_EFFECT_AWE /datum/status_effect/awe
+#define STATUS_EFFECT_DIABLERIE_HIGH /datum/status_effect/diablerie_high
diff --git a/code/modules/wod13/bloodsucking.dm b/code/modules/wod13/bloodsucking.dm
index 8a6f4862434..5e6b37f1b11 100644
--- a/code/modules/wod13/bloodsucking.dm
+++ b/code/modules/wod13/bloodsucking.dm
@@ -40,50 +40,22 @@
 		mob.Stun(40) //NPCs don't get to resist
 
 	if(mob.bloodpool <= 1 && mob.maxbloodpool > 1)
-		to_chat(src, "<span class='warning'>You feel small amount of <b>BLOOD</b> in your victim.</span>")
+		to_chat(src, span_warning("You feel only a sliver of <b>BLOOD</b> in your victim."))
 		if(iskindred(mob) && iskindred(src))
-			if(!mob.client)
+			if(!mob.client || !mob.key)
 				to_chat(src, "<span class='warning'>You need [mob]'s attention to do that...</span>")
+				last_drinkblood_use = 0
+				if(client)
+					client.images -= suckbar
+					qdel(suckbar)
+				stop_sound_channel(CHANNEL_BLOOD)
 				return
 			message_admins("[ADMIN_LOOKUPFLW(src)] is attempting to Diablerize [ADMIN_LOOKUPFLW(mob)]")
 			log_attack("[key_name(src)] is attempting to Diablerize [key_name(mob)].")
-			if(mob.key)
-				var/vse_taki = FALSE
-				if(clane)
-					var/salubri_allowed = FALSE
-					var/mob/living/carbon/human/H = mob
-					if(H.clane)
-						if(H.clane.name == "Salubri")
-							salubri_allowed = TRUE
-					if(clane.name != "Banu Haqim" && clane.name != "Caitiff")
-						if(!salubri_allowed)
-							if(!mind.special_role)
-								to_chat(src, "<span class='warning'>You find the idea of drinking your own <b>KIND's</b> blood disgusting!</span>")
-								last_drinkblood_use = 0
-								if(client)
-									client.images -= suckbar
-								qdel(suckbar)
-								stop_sound_channel(CHANNEL_BLOOD)
-								return
-							else
-								vse_taki = TRUE
-						else
-							vse_taki = TRUE
-					else
-						vse_taki = TRUE
-
-				if(!GLOB.canon_event)
-					to_chat(src, "<span class='warning'>It's not a canon event!</span>")
-					return
-
-				if(vse_taki)
-					to_chat(src, "<span class='userdanger'><b>YOU TRY TO COMMIT DIABLERIE ON [mob].</b></span>")
-				else
-					to_chat(src, "<span class='warning'>You find the idea of drinking your own <b>KIND</b> disgusting!</span>")
-					return
-			else
-				to_chat(src, "<span class='warning'>You need [mob]'s attention to do that...</span>")
+			if(!GLOB.canon_event)
+				to_chat(src, span_warning("It's not a canon event!"))
 				return
+			to_chat(src, span_userdanger("YOU TRY TO COMMIT DIABLERIE ON [mob]."))
 
 	if(!HAS_TRAIT(src, TRAIT_BLOODY_LOVER))
 		if(CheckEyewitness(src, src, 7, FALSE))
@@ -134,7 +106,7 @@
 		if(iskindred(mob))
 			to_chat(src, "<span class='userlove'>[mob]'s blood tastes HEAVENLY...</span>")
 			adjustBruteLoss(-25, TRUE)
-			adjustFireLoss(-25, TRUE)
+			adjustFireLoss(-6, TRUE)
 		else
 			to_chat(src, "<span class='warning'>You sip some <b>BLOOD</b> from your victim. It feels good.</span>")
 		if(HAS_TRAIT(src, TRAIT_MESSY_EATER))
@@ -149,7 +121,6 @@
 		else
 			bloodpool = min(maxbloodpool, bloodpool+bloodgain)
 			adjustBruteLoss(-10, TRUE)
-			adjustFireLoss(-10, TRUE)
 			update_damage_overlays()
 			update_health_hud()
 			update_blood_hud()
@@ -159,58 +130,58 @@
 				if(iskindred(mob) && iskindred(src))
 					var/datum/preferences/P = GLOB.preferences_datums[ckey(key)]
 					var/datum/preferences/P2 = GLOB.preferences_datums[ckey(mob.key)]
-					SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
-					AdjustMasquerade(-1)
-					if(K.generation >= generation)
-						message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-						log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-						if(K.client)
-							var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-							trauma.friend.key = K.key
-						mob.death()
-						if(P2)
-							P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						adjustBruteLoss(-50, TRUE)
-						adjustFireLoss(-50, TRUE)
-						if(key)
-							if(P)
-								P.diablerist = 1
-							diablerist = 1
-					else
-						var/start_prob = 10
-						if(HAS_TRAIT(src, TRAIT_DIABLERIE))
-							start_prob = 30
-						if(prob(min(99, start_prob+((generation-K.generation)*10))))
-							to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
-							message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
-							log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
-							generation = min(13, P.generation+1)
-							death()
-							if(P)
-								P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						else
-							message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-							log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-							if(P)
-								P.diablerist = 1
-								if(mob.generation + 3 < generation)
-									P.generation = max(P.generation - 2, 7)
+					var/confirmation = tgui_alert(src, "Attempt to diablerize [mob]?", "Diablerize", buttons = list("Yes", "No"))
+					if(confirmation == "Yes")
+						SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
+						AdjustMasquerade(-1)
+						if(do_after(src, 60 SECONDS, mob))
+							if(K.generation >= generation)
+								message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
+								log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
+								if(K.client)
+									var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
+									trauma.friend.key = K.key
+								mob.death()
+								if(P2)
+									P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
+								apply_status_effect(STATUS_EFFECT_DIABLERIE_HIGH)
+								adjustBruteLoss(-50, TRUE)
+								adjustFireLoss(-50, TRUE)
+								if(key)
+									if(P)
+										P.diablerist = 1
+									diablerist = 1
+							else
+								var/start_prob = 10
+								if(prob(min(99, start_prob+((generation-K.generation)*10))))
+									to_chat(src, span_userdanger("[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY."))
+									message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
+									log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
+									generation = min(13, P.generation+1)
+									death()
+									if(P)
+										P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
 								else
-									P.generation = max(P.generation - 1, 7)
-								generation = P.generation
-							diablerist = 1
-							maxHealth = initial(maxHealth)+max(0, 50*(13-generation))
-							health = initial(health)+max(0, 50*(13-generation))
-							if(K.client)
-								var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-								trauma.friend.key = K.key
-							mob.death()
-							if(P2)
-								P2.reason_of_death = "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-					if(client)
-						client.images -= suckbar
-					qdel(suckbar)
-					return
+									message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
+									log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
+									if(P)
+										P.diablerist = 1
+										if(mob.generation + 3 < generation)
+											P.generation = max(P.generation - 2, 7)
+										else
+											P.generation = max(P.generation - 1, 7)
+										generation = P.generation
+									diablerist = 1
+									if(K.client)
+										var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
+										trauma.friend.key = K.key
+									mob.death()
+									if(P2)
+										P2.reason_of_death = "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
+							if(client)
+								client.images -= suckbar
+							qdel(suckbar)
+							return
 				else
 					K.blood_volume = 0
 			if(ishuman(mob) && !iskindred(mob))
diff --git a/code/modules/wod13/status_effects/debuffs.dm b/code/modules/wod13/status_effects/debuffs.dm
index bdd1eaec86d..405030dc3ec 100644
--- a/code/modules/wod13/status_effects/debuffs.dm
+++ b/code/modules/wod13/status_effects/debuffs.dm
@@ -1005,3 +1005,41 @@
 /datum/status_effect/awe/Destroy()
 	source = null
 	return ..()
+
+/datum/status_effect/diablerie_high //Used for powers that force a target to walk to you.
+	id = "diablerie"
+	status_type = STATUS_EFFECT_REPLACE
+	duration = 15 MINUTES
+	tick_interval = 2 SECONDS
+	alert_type = /atom/movable/screen/alert/status_effect/diablerie_high
+
+/atom/movable/screen/alert/status_effect/diablerie_high
+	name = "Amaranth"
+	desc = "That felt amazing... I am zooted out of my mind."
+	icon_state = "hypnosis"
+
+/datum/movespeed_modifier/diablerie_high
+	multiplicative_slowdown = 0.15
+
+/datum/status_effect/diablerie_high/tick()
+	var/mob/living/carbon/H = owner
+	H.set_drugginess(15)
+	if(prob(4))
+		var/high_message = pick("You feel in tune with your Beast.","You feel like fistfighting Hardestadt.","Some more Vitae would wash this down nicely..","You could use some more of that nectar.","You can feel your blood pulsing.","You feel relaxed.","Your Beast craves for more.","You notice you've been moving more slowly.")
+		to_chat(H, span_notice("[high_message]"))
+
+/datum/status_effect/diablerie_high/on_apply()
+	. = ..()
+	owner.add_movespeed_modifier(/datum/movespeed_modifier/diablerie_high)
+	if(!HAS_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN))
+		ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, SPECIES_TRAIT)
+	owner.additional_dexterity -= 2
+	owner.additional_mentality -= 1
+
+/datum/status_effect/diablerie_high/on_remove()
+	. = ..()
+	owner.remove_movespeed_modifier(/datum/movespeed_modifier/diablerie_high)
+	owner.additional_dexterity += 2
+	owner.additional_mentality += 1
+	if(HAS_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN))
+		REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, SPECIES_TRAIT)


Reviews:
user: login: XeonMations
state: CHANGES_REQUESTED
author_association: COLLABORATOR
submitted_at: 2025-04-16T06:10:38Z
user: login: anything86
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T06:11:36Z
user: login: anything86
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T06:17:45Z
user: login: XeonMations
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-16T08:14:43Z
user: login: XeonMations
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-16T08:17:09Z
user: login: XeonMations
state: CHANGES_REQUESTED
author_association: COLLABORATOR
submitted_at: 2025-04-16T09:59:52Z
user: login: XeonMations
state: CHANGES_REQUESTED
author_association: COLLABORATOR
submitted_at: 2025-04-17T12:18:52Z
user: login: anything86
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-18T01:30:13Z
user: login: XeonMations
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-18T11:07:41Z

Review comments:
diff_hunk: @@ -159,58 +130,58 @@
 				if(iskindred(mob) && iskindred(src))
 					var/datum/preferences/P = GLOB.preferences_datums[ckey(key)]
 					var/datum/preferences/P2 = GLOB.preferences_datums[ckey(mob.key)]
-					SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
-					AdjustMasquerade(-1)
-					if(K.generation >= generation)
-						message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-						log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-						if(K.client)
-							var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-							trauma.friend.key = K.key
-						mob.death()
-						if(P2)
-							P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						adjustBruteLoss(-50, TRUE)
-						adjustFireLoss(-50, TRUE)
-						if(key)
-							if(P)
-								P.diablerist = 1
-							diablerist = 1
-					else
-						var/start_prob = 10
-						if(HAS_TRAIT(src, TRAIT_DIABLERIE))
-							start_prob = 30
-						if(prob(min(99, start_prob+((generation-K.generation)*10))))
-							to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
-							message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
-							log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
-							generation = min(13, P.generation+1)
-							death()
-							if(P)
-								P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						else
-							message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-							log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-							if(P)
-								P.diablerist = 1
-								if(mob.generation + 3 < generation)
-									P.generation = max(P.generation - 2, 7)
+					var/confirmation = input(src, "ATTEMPT TO DIABLERIZE [mob]?") in list("No", "Yes")
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: Use TGUI confirmation popups instead.
created_at: 2025-04-16T06:09:37Z
author_association: COLLABORATOR
diff_hunk: @@ -159,58 +130,58 @@
 				if(iskindred(mob) && iskindred(src))
 					var/datum/preferences/P = GLOB.preferences_datums[ckey(key)]
 					var/datum/preferences/P2 = GLOB.preferences_datums[ckey(mob.key)]
-					SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
-					AdjustMasquerade(-1)
-					if(K.generation >= generation)
-						message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-						log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-						if(K.client)
-							var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-							trauma.friend.key = K.key
-						mob.death()
-						if(P2)
-							P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						adjustBruteLoss(-50, TRUE)
-						adjustFireLoss(-50, TRUE)
-						if(key)
-							if(P)
-								P.diablerist = 1
-							diablerist = 1
-					else
-						var/start_prob = 10
-						if(HAS_TRAIT(src, TRAIT_DIABLERIE))
-							start_prob = 30
-						if(prob(min(99, start_prob+((generation-K.generation)*10))))
-							to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
-							message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
-							log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
-							generation = min(13, P.generation+1)
-							death()
-							if(P)
-								P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						else
-							message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-							log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-							if(P)
-								P.diablerist = 1
-								if(mob.generation + 3 < generation)
-									P.generation = max(P.generation - 2, 7)
+					var/confirmation = input(src, "ATTEMPT TO DIABLERIZE [mob]?") in list("No", "Yes")
+					if(confirmation == "Yes")
+						SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
+						AdjustMasquerade(-1)
+						if(do_mob(src, mob, 60 SECONDS))
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: do_afters, not do_mob
created_at: 2025-04-16T06:09:47Z
author_association: COLLABORATOR
diff_hunk: @@ -159,58 +130,58 @@
 				if(iskindred(mob) && iskindred(src))
 					var/datum/preferences/P = GLOB.preferences_datums[ckey(key)]
 					var/datum/preferences/P2 = GLOB.preferences_datums[ckey(mob.key)]
-					SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
-					AdjustMasquerade(-1)
-					if(K.generation >= generation)
-						message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-						log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-						if(K.client)
-							var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-							trauma.friend.key = K.key
-						mob.death()
-						if(P2)
-							P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						adjustBruteLoss(-50, TRUE)
-						adjustFireLoss(-50, TRUE)
-						if(key)
-							if(P)
-								P.diablerist = 1
-							diablerist = 1
-					else
-						var/start_prob = 10
-						if(HAS_TRAIT(src, TRAIT_DIABLERIE))
-							start_prob = 30
-						if(prob(min(99, start_prob+((generation-K.generation)*10))))
-							to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
-							message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
-							log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
-							generation = min(13, P.generation+1)
-							death()
-							if(P)
-								P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						else
-							message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-							log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-							if(P)
-								P.diablerist = 1
-								if(mob.generation + 3 < generation)
-									P.generation = max(P.generation - 2, 7)
+					var/confirmation = input(src, "ATTEMPT TO DIABLERIZE [mob]?") in list("No", "Yes")
+					if(confirmation == "Yes")
+						SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
+						AdjustMasquerade(-1)
+						if(do_mob(src, mob, 60 SECONDS))
+							if(K.generation >= generation)
+								message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
+								log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
+								if(K.client)
+									var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
+									trauma.friend.key = K.key
+								mob.death()
+								if(P2)
+									P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
+								apply_status_effect(STATUS_EFFECT_DIABLERIE_HIGH)
+								adjustBruteLoss(-50, TRUE)
+								adjustFireLoss(-50, TRUE)
+								if(key)
+									if(P)
+										P.diablerist = 1
+									diablerist = 1
+							else
+								var/start_prob = 10
+								if(prob(min(99, start_prob+((generation-K.generation)*10))))
+									to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: span macros
created_at: 2025-04-16T06:10:11Z
author_association: COLLABORATOR
diff_hunk: @@ -159,58 +130,58 @@
 				if(iskindred(mob) && iskindred(src))
 					var/datum/preferences/P = GLOB.preferences_datums[ckey(key)]
 					var/datum/preferences/P2 = GLOB.preferences_datums[ckey(mob.key)]
-					SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
-					AdjustMasquerade(-1)
-					if(K.generation >= generation)
-						message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-						log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-						if(K.client)
-							var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-							trauma.friend.key = K.key
-						mob.death()
-						if(P2)
-							P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						adjustBruteLoss(-50, TRUE)
-						adjustFireLoss(-50, TRUE)
-						if(key)
-							if(P)
-								P.diablerist = 1
-							diablerist = 1
-					else
-						var/start_prob = 10
-						if(HAS_TRAIT(src, TRAIT_DIABLERIE))
-							start_prob = 30
-						if(prob(min(99, start_prob+((generation-K.generation)*10))))
-							to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
-							message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
-							log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
-							generation = min(13, P.generation+1)
-							death()
-							if(P)
-								P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						else
-							message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-							log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-							if(P)
-								P.diablerist = 1
-								if(mob.generation + 3 < generation)
-									P.generation = max(P.generation - 2, 7)
+					var/confirmation = input(src, "ATTEMPT TO DIABLERIZE [mob]?") in list("No", "Yes")
+					if(confirmation == "Yes")
+						SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
+						AdjustMasquerade(-1)
+						if(do_mob(src, mob, 60 SECONDS))
path: code/modules/wod13/bloodsucking.dm
user: login: anything86
body: wouldn't a do_after allow you to diablerize even if the body was moved away?
created_at: 2025-04-16T06:11:36Z
author_association: CONTRIBUTOR
diff_hunk: @@ -159,58 +130,58 @@
 				if(iskindred(mob) && iskindred(src))
 					var/datum/preferences/P = GLOB.preferences_datums[ckey(key)]
 					var/datum/preferences/P2 = GLOB.preferences_datums[ckey(mob.key)]
-					SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
-					AdjustMasquerade(-1)
-					if(K.generation >= generation)
-						message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-						log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-						if(K.client)
-							var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-							trauma.friend.key = K.key
-						mob.death()
-						if(P2)
-							P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						adjustBruteLoss(-50, TRUE)
-						adjustFireLoss(-50, TRUE)
-						if(key)
-							if(P)
-								P.diablerist = 1
-							diablerist = 1
-					else
-						var/start_prob = 10
-						if(HAS_TRAIT(src, TRAIT_DIABLERIE))
-							start_prob = 30
-						if(prob(min(99, start_prob+((generation-K.generation)*10))))
-							to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
-							message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
-							log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
-							generation = min(13, P.generation+1)
-							death()
-							if(P)
-								P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						else
-							message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-							log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-							if(P)
-								P.diablerist = 1
-								if(mob.generation + 3 < generation)
-									P.generation = max(P.generation - 2, 7)
+					var/confirmation = input(src, "ATTEMPT TO DIABLERIZE [mob]?") in list("No", "Yes")
path: code/modules/wod13/bloodsucking.dm
user: login: anything86
body: Can you show an example? I'm not familiar with TGUI confirmation popups.
created_at: 2025-04-16T06:17:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -159,58 +130,58 @@
 				if(iskindred(mob) && iskindred(src))
 					var/datum/preferences/P = GLOB.preferences_datums[ckey(key)]
 					var/datum/preferences/P2 = GLOB.preferences_datums[ckey(mob.key)]
-					SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
-					AdjustMasquerade(-1)
-					if(K.generation >= generation)
-						message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-						log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-						if(K.client)
-							var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-							trauma.friend.key = K.key
-						mob.death()
-						if(P2)
-							P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						adjustBruteLoss(-50, TRUE)
-						adjustFireLoss(-50, TRUE)
-						if(key)
-							if(P)
-								P.diablerist = 1
-							diablerist = 1
-					else
-						var/start_prob = 10
-						if(HAS_TRAIT(src, TRAIT_DIABLERIE))
-							start_prob = 30
-						if(prob(min(99, start_prob+((generation-K.generation)*10))))
-							to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
-							message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
-							log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
-							generation = min(13, P.generation+1)
-							death()
-							if(P)
-								P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						else
-							message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-							log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-							if(P)
-								P.diablerist = 1
-								if(mob.generation + 3 < generation)
-									P.generation = max(P.generation - 2, 7)
+					var/confirmation = input(src, "ATTEMPT TO DIABLERIZE [mob]?") in list("No", "Yes")
+					if(confirmation == "Yes")
+						SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
+						AdjustMasquerade(-1)
+						if(do_mob(src, mob, 60 SECONDS))
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: not if you set it as the target. Then whenever it, or you, move, it cancels.
created_at: 2025-04-16T08:14:43Z
author_association: COLLABORATOR
diff_hunk: @@ -159,58 +130,58 @@
 				if(iskindred(mob) && iskindred(src))
 					var/datum/preferences/P = GLOB.preferences_datums[ckey(key)]
 					var/datum/preferences/P2 = GLOB.preferences_datums[ckey(mob.key)]
-					SEND_SIGNAL(src, COMSIG_PATH_HIT, PATH_SCORE_DOWN, 0)
-					AdjustMasquerade(-1)
-					if(K.generation >= generation)
-						message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-						log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-						if(K.client)
-							var/datum/brain_trauma/special/imaginary_friend/trauma = gain_trauma(/datum/brain_trauma/special/imaginary_friend)
-							trauma.friend.key = K.key
-						mob.death()
-						if(P2)
-							P2.reason_of_death =  "Diablerized by [true_real_name ? true_real_name : real_name] ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						adjustBruteLoss(-50, TRUE)
-						adjustFireLoss(-50, TRUE)
-						if(key)
-							if(P)
-								P.diablerist = 1
-							diablerist = 1
-					else
-						var/start_prob = 10
-						if(HAS_TRAIT(src, TRAIT_DIABLERIE))
-							start_prob = 30
-						if(prob(min(99, start_prob+((generation-K.generation)*10))))
-							to_chat(src, "<span class='userdanger'><b>[K]'s SOUL OVERCOMES YOURS AND GAIN CONTROL OF YOUR BODY.</b></span>")
-							message_admins("[ADMIN_LOOKUPFLW(src)] tried to Diablerize [ADMIN_LOOKUPFLW(mob)] and was overtaken.")
-							log_attack("[key_name(src)] tried to Diablerize [key_name(mob)] and was overtaken.")
-							generation = min(13, P.generation+1)
-							death()
-							if(P)
-								P.reason_of_death = "Failed the Diablerie ([time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")])."
-						else
-							message_admins("[ADMIN_LOOKUPFLW(src)] successfully Diablerized [ADMIN_LOOKUPFLW(mob)]")
-							log_attack("[key_name(src)] successfully Diablerized [key_name(mob)].")
-							if(P)
-								P.diablerist = 1
-								if(mob.generation + 3 < generation)
-									P.generation = max(P.generation - 2, 7)
+					var/confirmation = input(src, "ATTEMPT TO DIABLERIZE [mob]?") in list("No", "Yes")
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: in this case it'd be

```var/confirmation = tgui_alert(src, "Attempt to diablerize [mob]?", "Diablerize", buttons = list("Yes", "No"))```
created_at: 2025-04-16T08:17:08Z
author_association: COLLABORATOR
diff_hunk: @@ -40,50 +40,22 @@
 		mob.Stun(40) //NPCs don't get to resist
 
 	if(mob.bloodpool <= 1 && mob.maxbloodpool > 1)
-		to_chat(src, "<span class='warning'>You feel small amount of <b>BLOOD</b> in your victim.</span>")
+		to_chat(src, "<span class='warning'>You feel only a sliver of <b>BLOOD</b> in your victim.</span>")
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: missed a span macro here
created_at: 2025-04-16T09:57:40Z
author_association: COLLABORATOR
diff_hunk: @@ -40,50 +40,22 @@
 		mob.Stun(40) //NPCs don't get to resist
 
 	if(mob.bloodpool <= 1 && mob.maxbloodpool > 1)
-		to_chat(src, "<span class='warning'>You feel small amount of <b>BLOOD</b> in your victim.</span>")
+		to_chat(src, "<span class='warning'>You feel only a sliver of <b>BLOOD</b> in your victim.</span>")
 		if(iskindred(mob) && iskindred(src))
-			if(!mob.client)
+			if(!mob.client || !mob.key)
 				to_chat(src, "<span class='warning'>You need [mob]'s attention to do that...</span>")
+				last_drinkblood_use = 0
+				if(client)
+					client.images -= suckbar
+					qdel(suckbar)
+				stop_sound_channel(CHANNEL_BLOOD)
 				return
 			message_admins("[ADMIN_LOOKUPFLW(src)] is attempting to Diablerize [ADMIN_LOOKUPFLW(mob)]")
 			log_attack("[key_name(src)] is attempting to Diablerize [key_name(mob)].")
-			if(mob.key)
-				var/vse_taki = FALSE
-				if(clane)
-					var/salubri_allowed = FALSE
-					var/mob/living/carbon/human/H = mob
-					if(H.clane)
-						if(H.clane.name == "Salubri")
-							salubri_allowed = TRUE
-					if(clane.name != "Banu Haqim" && clane.name != "Caitiff")
-						if(!salubri_allowed)
-							if(!mind.special_role)
-								to_chat(src, "<span class='warning'>You find the idea of drinking your own <b>KIND's</b> blood disgusting!</span>")
-								last_drinkblood_use = 0
-								if(client)
-									client.images -= suckbar
-								qdel(suckbar)
-								stop_sound_channel(CHANNEL_BLOOD)
-								return
-							else
-								vse_taki = TRUE
-						else
-							vse_taki = TRUE
-					else
-						vse_taki = TRUE
-
-				if(!GLOB.canon_event)
-					to_chat(src, "<span class='warning'>It's not a canon event!</span>")
-					return
-
-				if(vse_taki)
-					to_chat(src, "<span class='userdanger'><b>YOU TRY TO COMMIT DIABLERIE ON [mob].</b></span>")
-				else
-					to_chat(src, "<span class='warning'>You find the idea of drinking your own <b>KIND</b> disgusting!</span>")
-					return
-			else
-				to_chat(src, "<span class='warning'>You need [mob]'s attention to do that...</span>")
+			if(!GLOB.canon_event)
+				to_chat(src, "<span class='warning'>It's not a canon event!</span>")
 				return
+			to_chat(src, "<span class='userdanger'><b>YOU TRY TO COMMIT DIABLERIE ON [mob].</b></span>")
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: and here
created_at: 2025-04-16T09:57:48Z
author_association: COLLABORATOR
diff_hunk: @@ -40,50 +40,22 @@
 		mob.Stun(40) //NPCs don't get to resist
 
 	if(mob.bloodpool <= 1 && mob.maxbloodpool > 1)
-		to_chat(src, "<span class='warning'>You feel small amount of <b>BLOOD</b> in your victim.</span>")
+		to_chat(src, span_warning("You feel only a sliver of <b>BLOOD</b> in your victim."))
 		if(iskindred(mob) && iskindred(src))
-			if(!mob.client)
+			if(!mob.client || !mob.key)
 				to_chat(src, "<span class='warning'>You need [mob]'s attention to do that...</span>")
+				last_drinkblood_use = 0
+				if(client)
+					client.images -= suckbar
+					qdel(suckbar)
+				stop_sound_channel(CHANNEL_BLOOD)
 				return
 			message_admins("[ADMIN_LOOKUPFLW(src)] is attempting to Diablerize [ADMIN_LOOKUPFLW(mob)]")
 			log_attack("[key_name(src)] is attempting to Diablerize [key_name(mob)].")
-			if(mob.key)
-				var/vse_taki = FALSE
-				if(clane)
-					var/salubri_allowed = FALSE
-					var/mob/living/carbon/human/H = mob
-					if(H.clane)
-						if(H.clane.name == "Salubri")
-							salubri_allowed = TRUE
-					if(clane.name != "Banu Haqim" && clane.name != "Caitiff")
-						if(!salubri_allowed)
-							if(!mind.special_role)
-								to_chat(src, "<span class='warning'>You find the idea of drinking your own <b>KIND's</b> blood disgusting!</span>")
-								last_drinkblood_use = 0
-								if(client)
-									client.images -= suckbar
-								qdel(suckbar)
-								stop_sound_channel(CHANNEL_BLOOD)
-								return
-							else
-								vse_taki = TRUE
-						else
-							vse_taki = TRUE
-					else
-						vse_taki = TRUE
-
-				if(!GLOB.canon_event)
-					to_chat(src, "<span class='warning'>It's not a canon event!</span>")
-					return
-
-				if(vse_taki)
-					to_chat(src, "<span class='userdanger'><b>YOU TRY TO COMMIT DIABLERIE ON [mob].</b></span>")
-				else
-					to_chat(src, "<span class='warning'>You find the idea of drinking your own <b>KIND</b> disgusting!</span>")
-					return
-			else
-				to_chat(src, "<span class='warning'>You need [mob]'s attention to do that...</span>")
+			if(!GLOB.canon_event)
+				to_chat(src, "<span class='warning'>It's not a canon event!</span>")
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: missed a span macro
created_at: 2025-04-17T12:17:27Z
author_association: COLLABORATOR
diff_hunk: @@ -149,7 +121,6 @@
 		else
 			bloodpool = min(maxbloodpool, bloodpool+bloodgain)
 			adjustBruteLoss(-10, TRUE)
-			adjustFireLoss(-10, TRUE)
path: code/modules/wod13/bloodsucking.dm
user: login: XeonMations
body: is the complete removal of all fire healing on drinking from a human intended here?
created_at: 2025-04-17T12:17:56Z
author_association: COLLABORATOR
diff_hunk: @@ -149,7 +121,6 @@
 		else
 			bloodpool = min(maxbloodpool, bloodpool+bloodgain)
 			adjustBruteLoss(-10, TRUE)
-			adjustFireLoss(-10, TRUE)
path: code/modules/wod13/bloodsucking.dm
user: login: anything86
body: It is. There is no such effect in the tabletop or lore, as the only healing you'd get from drinking blood would be from simultaneously spending it to heal your wounds. Given that -10 would, under new standards, go down to something like -2 burn damage, I thought it reasonable to just cut it out altogether.
created_at: 2025-04-18T01:30:13Z
author_association: CONTRIBUTOR

PR comments:
user: login: Kevak
created_at: 2025-04-13T05:09:07Z
body: Please add a good 60 seconds to the time required to preform diab, ideally tie it to a yesno prompt as well, so we don't have accidental instances of such.
author_association: CONTRIBUTOR
user: login: Necbro
created_at: 2025-04-13T10:03:45Z
body: There are already way too many Diablerists around, and somehow just saying Diablerie is bad has become this risky, controversial take, which is kind of insane when you think about it. That shouldn't be the case.
author_association: CONTRIBUTOR
user: login: anything86
created_at: 2025-04-13T10:43:46Z
body: > There are already way too many Diablerists around, and somehow just saying Diablerie is bad has become this risky, controversial take, which is kind of insane when you think about it. That shouldn't be the case.

This is entirely your opinion and also completely unrelated to this PR. Maybe it has more to do with the Diablerist quirk?
author_association: CONTRIBUTOR
user: login: Sparrowbird611
created_at: 2025-04-13T13:41:28Z
body: Caitiff W
author_association: CONTRIBUTOR
user: login: SoreYew
created_at: 2025-04-13T14:12:14Z
body: It would be very nice to allow other characters to taste temptation. 
author_association: CONTRIBUTOR
user: login: Ophanimdev
created_at: 2025-04-14T01:25:18Z
body: 
> Please add a good 60 seconds to the time required to preform diab, ideally tie it to a yesno prompt as well, so we don't have accidental instances of such.

I think that slapping a prompt and a flat out 60 second timer on the whole thing's pretty lame and immersion breaking. I'm not really a fan of 'balancing' by slapping pointless cooldowns on features to make changes easier to swallow despite being an actively detrimental timewaste. 

I also think that the dialog makes it too 'gamey' and that as a whitelisted server, admins should be capable of trusting their players to diablerize responsibly.




author_association: CONTRIBUTOR
user: login: Kevak
created_at: 2025-04-14T07:20:16Z
body: > > Please add a good 60 seconds to the time required to preform diab, ideally tie it to a yesno prompt as well, so we don't have accidental instances of such.
> 
> I think that slapping a prompt and a flat out 60 second timer on the whole thing's pretty lame and immersion breaking. I'm not really a fan of 'balancing' by slapping pointless cooldowns on features to make changes easier to swallow despite being an actively detrimental timewaste.
> 
> I also think that the dialog makes it too 'gamey' and that as a whitelisted server, admins should be capable of trusting their players to diablerize responsibly.

In the tabletop diablerie takes five minutes and is a very intentional decision. Sixty seconds is the compromise.
author_association: CONTRIBUTOR
user: login: Ophanimdev
created_at: 2025-04-14T16:03:49Z
body: I don't think this is a valid argument when ingame time's already pretty condensed and every other discipline operates off of this compresssed timescale. We should also keep in mind that it's already going to take a while to fully drain an elder 10th gen with their cap of 19 bloodpoints. 

In addition we need to bear in mind that all the while, the player needs to keep the victim in question still and conscious, as torporing and/or corpsing a vampire will then make the game count the victim as being logged out, which already triggers the 'you need their attention!' failstate. As a result, the act itself is still pretty difficult to actually accomplish.
author_association: CONTRIBUTOR
user: login: anything86
created_at: 2025-04-15T08:59:30Z
body: > I don't think this is a valid argument when ingame time's already pretty condensed and every other discipline operates off of this compresssed timescale. We should also keep in mind that it's already going to take a while to fully drain an elder 10th gen with their cap of 19 bloodpoints.
> 
> In addition we need to bear in mind that all the while, the player needs to keep the victim in question still and conscious, as torporing and/or corpsing a vampire will then make the game count the victim as being logged out, which already triggers the 'you need their attention!' failstate. As a result, the act itself is still pretty difficult to actually accomplish.

It should be doable with them in torpor. The attention check is just for if they are logged off or ghosted. Additionally, once the diablerie begins, it doesn't matter if they log off or die during the 60 seconds timer.
author_association: CONTRIBUTOR
user: login: WhereAmO
created_at: 2025-04-20T19:39:23Z
body: Btw blood bags heal separately, unsure if you want to change that in this PR if you're re-balancing the burn healing? I think currently they heal 20 brute/burn.
author_association: CONTRIBUTOR