diff --git a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
index 9d83c95f05..2281a2cecd 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
@@ -2,40 +2,56 @@
/datum/action/bloodsucker/cloak
name = "Cloak of Darkness"
- desc = "Blend into the shadows and become invisible to the untrained eye."
+ desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas."
button_icon_state = "power_cloak"
bloodcost = 5
cooldown = 50
bloodsucker_can_buy = TRUE
amToggle = TRUE
warn_constant_cost = TRUE
- var/was_running
-
- var/light_min = 0.2 // If lum is above this, no good.
+ var/moveintent_was_run
+ var/walk_threshold = 0.4 // arbitrary number, to be changed.
+ var/lum
/datum/action/bloodsucker/cloak/CheckCanUse(display_error)
. = ..()
if(!.)
return
- // Must be Dark
- var/turf/T = owner.loc
- if(istype(T) && T.get_lumcount() > light_min)
- to_chat(owner, "This area is not dark enough to blend in")
- return FALSE
+
+ // must have nobody around to see the cloak
+ var/watchers = viewers(9,get_turf(owner))
+ for(var/mob/living/M in watchers)
+ if(M != owner)
+ to_chat(owner, "You may only vanish into the shadows unseen.")
+ return FALSE
+
return TRUE
/datum/action/bloodsucker/cloak/ActivatePower()
var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
var/mob/living/user = owner
- was_running = (user.m_intent == MOVE_INTENT_RUN)
- if(was_running)
- user.toggle_move_intent()
- ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
+
while(bloodsuckerdatum && ContinueActive(user))
// Pay Blood Toll (if awake)
- owner.alpha = max(20, owner.alpha - min(75, 10 + 5 * level_current))
+ owner.alpha = max(35, owner.alpha - min(75, 10 + 5 * level_current))
bloodsuckerdatum.AddBloodVolume(-0.2)
- sleep(5) // Check every few ticks that we haven't disabled this power
+
+ moveintent_was_run = (user.m_intent == MOVE_INTENT_RUN)
+ var/turf/T = get_turf(user)
+ lum = T.get_lumcount()
+
+ if(istype(owner.loc))
+ if(lum > walk_threshold)
+ if(moveintent_was_run)
+ user.toggle_move_intent()
+ ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
+
+ if(lum < walk_threshold)
+ if(!moveintent_was_run)
+ user.toggle_move_intent()
+ REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
+
+ sleep(5) // Check every few ticks
/datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target)
if (!..())
@@ -43,15 +59,11 @@
if(user.stat == !CONSCIOUS) // Must be CONSCIOUS
to_chat(owner, "Your cloak failed due to you falling unconcious! ")
return FALSE
- var/turf/T = owner.loc // Must be DARK
- if(istype(T) && T.get_lumcount() > light_min)
- to_chat(owner, "Your cloak failed due to there being too much light!")
- return FALSE
return TRUE
/datum/action/bloodsucker/cloak/DeactivatePower(mob/living/user = owner, mob/living/target)
..()
REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
user.alpha = 255
- if(was_running && user.m_intent != MOVE_INTENT_RUN)
+ if(!moveintent_was_run)
user.toggle_move_intent()
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
index 0e1a9d44b0..796a3afedd 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
@@ -21,14 +21,14 @@
. = ..()
if(!.)
return
- if (!owner.getorganslot(ORGAN_SLOT_EYES))
+ if(!owner.getorganslot(ORGAN_SLOT_EYES))
if (display_error)
to_chat(owner, "You have no eyes with which to mesmerize.")
return FALSE
// Check: Eyes covered?
var/mob/living/L = owner
- if (istype(L) && L.is_eyes_covered() || !isturf(owner.loc))
- if (display_error)
+ if(istype(L) && L.is_eyes_covered() || !isturf(owner.loc))
+ if(display_error)
to_chat(owner, "Your eyes are concealed from sight.")
return FALSE
return TRUE
@@ -38,51 +38,51 @@
/datum/action/bloodsucker/targeted/mesmerize/CheckCanTarget(atom/A,display_error)
// Check: Self
- if (A == owner)
+ if(A == owner)
return FALSE
var/mob/living/carbon/target = A // We already know it's carbon due to CheckValidTarget()
// Bloodsucker
- if (target.mind && target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
+ if(target.mind && target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
if (display_error)
to_chat(owner, "Bloodsuckers are immune to [src].")
return FALSE
// Dead/Unconscious
- if (target.stat > CONSCIOUS)
+ if(target.stat > CONSCIOUS)
if (display_error)
to_chat(owner, "Your victim is not [(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH))?"alive":"conscious"].")
return FALSE
// Check: Target has eyes?
- if (!target.getorganslot(ORGAN_SLOT_EYES))
+ if(!target.getorganslot(ORGAN_SLOT_EYES))
if (display_error)
to_chat(owner, "They have no eyes!")
return FALSE
// Check: Target blind?
- if (target.eye_blind > 0)
+ if(target.eye_blind > 0)
if (display_error)
to_chat(owner, "Your victim's eyes are glazed over. They cannot perceive you.")
return FALSE
// Check: Target See Me? (behind wall)
- if (!(target in view(target_range, get_turf(owner))))
+ if(!(target in view(target_range, get_turf(owner))))
// Sub-Check: GET CLOSER
//if (!(owner in range(target_range, get_turf(target)))
// if (display_error)
// to_chat(owner, "You're too far from your victim.")
- if (display_error)
+ if(display_error)
to_chat(owner, "You're too far outside your victim's view.")
return FALSE
- if (target.has_status_effect(STATUS_EFFECT_MESMERIZE)) // ?
+ if(target.has_status_effect(STATUS_EFFECT_MESMERIZE)) // ?
return TRUE
// Check: Facing target?
- if (!is_A_facing_B(owner,target)) // in unsorted.dm
+ if(!is_A_facing_B(owner,target)) // in unsorted.dm
if (display_error)
to_chat(owner, "You must be facing your victim.")
return FALSE
// Check: Target facing me?
- if (!target.resting && !is_A_facing_B(target,owner))
- if (display_error)
+ if(!target.resting && !is_A_facing_B(target,owner))
+ if(display_error)
to_chat(owner, "Your victim must be facing you to see into your eyes.")
return FALSE
return TRUE
@@ -93,12 +93,12 @@
var/mob/living/user = owner
if(istype(target))
- PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!
var/power_time = 138 + level_current * 12
- target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 50)
- user.apply_status_effect(STATUS_EFFECT_MESMERIZE, 50)
- if(do_mob(user, target, 50, TRUE, TRUE))
- if (CheckCanTarget(target)) // target just has to be out of view when it is fully charged in order to avoid
+ target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30)
+ user.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30)
+ if(do_mob(user, target, 30, TRUE, TRUE)) // 3 seconds windup
+ if(CheckCanTarget(target)) // target just has to be out of view when it is fully charged in order to avoid
+ PowerActivatedSuccessfully() // blood & cooldown only altered if power activated successfully - less "fuck you"-y
target.face_atom(user)
target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time) // pretty much purely cosmetic
target.Stun(power_time)