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 += "" + 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 += "" 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