diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index db2b099e..79b6c877 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -365,21 +365,21 @@
var/list/all_objectives = list()
- for(var/datum/antagonist/A in antag_datums)
- output += A.antag_memory
- all_objectives |= A.objectives
+ for(var/datum/antagonist/A in antag_datums)
+ output += A.antag_memory
+ all_objectives |= A.objectives
- if(all_objectives.len)
- output += "Objectives:"
- var/obj_count = 1
- for(var/datum/objective/objective in all_objectives)
- output += "
Objective #[obj_count++]: [objective.explanation_text]"
- var/list/datum/mind/other_owners = objective.get_owners() - src
- if(other_owners.len)
- output += "
"
- for(var/datum/mind/M in other_owners)
- output += "- Conspirator: [M.name]
"
- output += "
"
+ if(all_objectives.len)
+ output += "Objectives:"
+ var/obj_count = 1
+ for(var/datum/objective/objective in all_objectives)
+ output += "
Objective #[obj_count++]: [objective.explanation_text]"
+ var/list/datum/mind/other_owners = objective.get_owners() - src
+ if(other_owners.len)
+ output += ""
+ for(var/datum/mind/M in other_owners)
+ output += "- Conspirator: [M.name]
"
+ output += "
"
if(window)
recipient << browse(output,"window=memory")
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 9108e4ce..d79bda0f 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -100,6 +100,14 @@
id = "Mesmerize"
alert_type = /obj/screen/alert/status_effect/mesmerized
+/datum/status_effect/no_combat_mode/mesmerize/on_creation(mob/living/new_owner, set_duration)
+ . = ..()
+ ADD_TRAIT(owner, TRAIT_MUTE, "mesmerize")
+
+/datum/status_effect/no_combat_mode/mesmerize/on_remove()
+ . = ..()
+ REMOVE_TRAIT(owner, TRAIT_MUTE, "mesmerize")
+
/obj/screen/alert/status_effect/mesmerized
name = "Mesmerized"
desc = "You cant tear your sight from who is in front of you...Their gaze is simply too enthralling.."
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
index a8e34cb2..3085a0f4 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
@@ -1,39 +1,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 lightly 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.5 // If lum is above this, no good.
+var/moveintent_was_run
+var/walk_threshold = 0.4 // arbitrary number, to be changed. edit in last commit: this is fine after testing on box station for a bit
+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
- return TRUE
+ // 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
/datum/action/bloodsucker/cloak/ActivatePower()
var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
var/mob/living/user = owner
- var/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) || user.m_intent == MOVE_INTENT_RUN)
// Pay Blood Toll (if awake)
- owner.alpha = max(0, owner.alpha - min(75, 20 + 15 * level_current))
+ owner.alpha = max(20, owner.alpha - min(75, 20 + 15 * 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
+
// Return to Running (if you were before)
if(was_running && user.m_intent != MOVE_INTENT_RUN)
user.toggle_move_intent()
@@ -44,13 +61,12 @@
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(moveintent_was_run)
+ user.toggle_move_intent()
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm b/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm
index 2a6cf285..b4e00e83 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm
@@ -6,10 +6,10 @@
desc = "Spring at your target and aggressively grapple them without warning. Attacks from concealment or the rear may even knock them down."
button_icon_state = "power_lunge"
bloodcost = 10
- cooldown = 300
- target_range = 3
+ cooldown = 250
+ target_range = 5
power_activates_immediately = TRUE
- message_Trigger = ""//"Whom will you subvert to your will?"
+ message_Trigger = "Whom will you ensnare within your grasp?"
must_be_capacitated = TRUE
bloodsucker_can_buy = TRUE
@@ -59,25 +59,29 @@
// CAUSES: Target has their back to me, I'm invisible, or I'm in a Closet
// Step One: Heatseek toward Target's Turf
- walk_towards(owner, T, 0.1, 10) // NOTE: this runs in the background! to cancel it, you need to use walk(owner.current,0), or give them a new path.
addtimer(CALLBACK(owner, .proc/_walk, 0), 2 SECONDS)
- if(get_turf(owner) != T && !(isliving(target) && target.Adjacent(owner)) && owner.incapacitated() && owner.resting)
- var/send_dir = get_dir(owner, T)
- new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE)
- owner.spin(10)
- // Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination)
- sleep(1)
- if(target.Adjacent(owner))
- // LEVEL 2: If behind target, mute or unconscious!
- if(do_knockdown) // && level_current >= 1)
- target.Knockdown(15 + 10 * level_current,1)
- target.adjustStaminaLoss(40 + 10 * level_current)
- // Cancel Walk (we were close enough to contact them)
- walk(owner, 0)
- target.Stun(10,1) //Without this the victim can just walk away
- target.grabbedby(owner) // Taken from mutations.dm under changelings
- target.grippedby(owner, instant = TRUE) //instant aggro grab
-
+ target.playsound_local(get_turf(owner), 'sound/bloodsucker/lunge_warn.ogg', 60, FALSE, pressure_affected = FALSE) // target-only telegraphing
+ owner.playsound_local(owner, 'sound/bloodsucker/lunge_warn.ogg', 60, FALSE, pressure_affected = FALSE) // audio feedback to the user
+ if(do_mob(owner, owner, 6, TRUE, TRUE))
+ walk_towards(owner, T, 0.1, 10) // yes i know i shouldn't use this but i don't know how to work in anything better
+ if(get_turf(owner) != T && !(isliving(target) && target.Adjacent(owner)) && owner.incapacitated() && owner.resting)
+ var/send_dir = get_dir(owner, T)
+ new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE)
+ owner.spin(10)
+ // Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination)
+ for(var/i in 1 to 6)
+ if (target.Adjacent(owner))
+ // LEVEL 2: If behind target, mute or unconscious!
+ if(do_knockdown) // && level_current >= 1)
+ target.Knockdown(15 + 10 * level_current,1)
+ target.adjustStaminaLoss(40 + 10 * level_current)
+ // Cancel Walk (we were close enough to contact them)
+ walk(owner, 0)
+ target.Stun(10,1) //Without this the victim can just walk away
+ target.grabbedby(owner) // Taken from mutations.dm under changelings
+ target.grippedby(owner, instant = TRUE) //instant aggro grab
+ break
+ sleep(i*3)
/datum/action/bloodsucker/targeted/lunge/DeactivatePower(mob/living/user = owner, mob/living/target)
..() // activate = FALSE
user.update_canmove()
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
index 94bc0e11..2fe7115d 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
@@ -89,17 +89,14 @@
if(istype(target))
target.Stun(40) //Utterly useless without this, its okay since there are so many checks to go through
- target.silent = 45 //Shhhh little lamb
target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 45) //So you cant rotate with combat mode, plus fancy status alert
- if(do_mob(user, target, 40, 0, TRUE, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))
+ if(do_mob(user, target, 40, 0, TRUE, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))
PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!
var/power_time = 90 + level_current * 12
- target.silent = power_time + 20
- target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 100 + level_current * 15)
+ target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time + 80)
to_chat(user, "[target] is fixed in place by your hypnotic gaze.")
target.Stun(power_time)
- //target.silent += power_time / 10 // Silent isn't based on ticks.
target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm
target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze.
spawn(power_time)
diff --git a/sound/bloodsucker/lunge_warn.ogg b/sound/bloodsucker/lunge_warn.ogg
new file mode 100644
index 00000000..0feec432
Binary files /dev/null and b/sound/bloodsucker/lunge_warn.ogg differ