Reviewer fixes and spacing

This commit is contained in:
Artur
2019-11-30 01:21:07 +02:00
parent c9c648f7ad
commit a6e6274039
17 changed files with 53 additions and 238 deletions
+7 -12
View File
@@ -161,7 +161,7 @@
// [FLEDGLING]
if (creator)
A = new ANTAG_DATUM_BLOODSUCKER(bloodsucker)
A = new (bloodsucker)
A.creator = creator
bloodsucker.add_antag_datum(A)
// Log
@@ -200,9 +200,10 @@
if (!am_valid)
H.set_species(/datum/species/human)
H.real_name = H.client.prefs.custom_names["human"]
if (H.wear_id)
H.wear_id.GetID().registered_name = H.real_name
H.wear_id.GetID().update_label()
var/obj/item/card/id/ID = H.wear_id?.GetID()
if(ID)
ID.registered_name = H.real_name
ID.update_label()
/datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning=TRUE)//, check_antag_or_loyal=FALSE)
@@ -253,7 +254,6 @@
// No List?
if(!islist(M.antag_datums) || M.antag_datums.len == 0)
return FALSE
// Am I NOT an invalid Antag? NOTE: We already excluded non-antags above. Don't worry about the "No List?" check in AmInvalidIntag()
return !AmInvalidAntag(M)
@@ -261,34 +261,29 @@
// No List?
if(!islist(M.antag_datums) || M.antag_datums.len == 0)
return FALSE
// Does even ONE antag appear in this mind that isn't in the list? Then FAIL!
for(var/datum/antagonist/antag_datum in M.antag_datums)
if (!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above.
//message_admins("DEBUG VASSAL: Found Invalid: [antag_datum] // [antag_datum.type]")
return TRUE
//message_admins("DEBUG VASSAL: Valid Antags! (total of [M.antag_datums.len])")
// WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too.
return FALSE
/datum/game_mode/proc/make_vassal(mob/living/target, datum/mind/creator)
if (!can_make_vassal(target,creator))
return FALSE
// Make Vassal
var/datum/antagonist/vassal/V = new ANTAG_DATUM_VASSAL(target.mind)
var/datum/antagonist/vassal/V = new (target.mind)
var/datum/antagonist/bloodsucker/B = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
V.master = B
target.mind.add_antag_datum(V, V.master.get_team())
// Update Bloodsucker Title (we're a daddy now)
B.SelectTitle(am_fledgling = FALSE) // Only works if you have no title yet.
// Log
message_admins("[target] has become a Vassal, and is enslaved to [creator].")
log_admin("[target] has become a Vassal, and is enslaved to [creator].")
return TRUE
/datum/game_mode/proc/remove_vassal(datum/mind/vassal)
vassal.remove_antag_datum(ANTAG_D
vassal.remove_antag_datum(ANTAG_DATUM_VASSAL)
+1 -1
View File
@@ -43,7 +43,7 @@
/datum/game_mode/proc/finalize_monster_hunters(monster_count = 4)
var/amEvil = TRUE // First hunter is always an evil boi
for(var/datum/mind/hunter in vamphunters)
var/datum/antagonist/vamphunter/A = new ANTAG_DATUM_HUNTER(hunter)
var/datum/antagonist/vamphunter/A = new (hunter)
A.bad_dude = amEvil
hunter.add_antag_datum(A)
amEvil = FALSE // Every other hunter is just a boring greytider
@@ -8,11 +8,11 @@
/mob/living/proc/HaveBloodsuckerBodyparts(var/displaymessage="") // displaymessage can be something such as "rising from death" for Torpid Sleep. givewarningto is the person receiving messages.
if (!getorganslot("heart"))
if (!getorganslot(ORGAN_SLOT_HEART))
if (displaymessage != "")
to_chat(src, "<span class='warning'>Without a heart, you are incapable of [displaymessage].</span>")
return FALSE
if (!get_bodypart("head"))
if (!get_bodypart(BODY_ZONE_HEAD))
if (displaymessage != "")
to_chat(src, "<span class='warning'>Without a head, you are incapable of [displaymessage].</span>")
return FALSE
@@ -103,7 +103,7 @@
// Reagents (NOT Blood!)
if(target.reagents && target.reagents.total_volume)
target.reagents.reaction(owner.current, INGEST, 1 / target.reagents.total_volume) // Run Reaction: what happens when what they have mixes with what I have?
target.reagents.reaction(owner.current, INGEST, 1) // Run Reaction: what happens when what they have mixes with what I have?
target.reagents.trans_to(owner.current, 1) // Run transfer of 1 unit of reagent from them to me.
// Blood Gulp Sound
@@ -114,38 +114,47 @@
description = "<span class='nicegreen'>I have fed greedly from that which nourishes me.</span>\n"
mood_change = 10
timeout = 900
/datum/mood_event/drankblood_bad
description = "<span class='boldwarning'>I drank the blood of a lesser creature. Disgusting.</span>\n"
mood_change = -4
timeout = 900
/datum/mood_event/drankblood_dead
description = "<span class='boldwarning'>I drank dead blood. I am better than this.</span>\n"
mood_change = -7
timeout = 900
/datum/mood_event/drankblood_synth
description = "<span class='boldwarning'>I drank synthetic blood. What is wrong with me?</span>\n"
mood_change = -7
timeout = 900
/datum/mood_event/drankkilled
description = "<span class='boldwarning'>I drank from my victim until they died. I feel...less human.</span>\n"
mood_change = -12
timeout = 6000
/datum/mood_event/madevamp
description = "<span class='boldwarning'>A soul has been cursed to undeath by my own hand.</span>\n"
mood_change = -10
timeout = 10000
/datum/mood_event/vampatefood
description = "<span class='boldwarning'>Mortal nourishment no longer sustains me. I feel unwell.</span>\n"
mood_change = -6
timeout = 1000
/datum/mood_event/coffinsleep
description = "<span class='nicegreen'>I slept in a coffin during the day. I feel whole again.</span>\n"
mood_change = 8
timeout = 1200
/datum/mood_event/daylight_1
description = "<span class='boldwarning'>I slept poorly in a makeshift coffin during the day.</span>\n"
mood_change = -3
timeout = 1000
/datum/mood_event/daylight_2
description = "<span class='boldwarning'>I have been scorched by the unforgiving rays of the sun.</span>\n"
mood_change = -6
@@ -1,6 +1,3 @@
/datum/action/bloodsucker
name = "Vampiric Gift"
desc = "A vampiric gift."
@@ -20,8 +17,6 @@
var/active = FALSE
var/cooldown = 20 // 10 ticks, 1 second.
var/cooldownUntil = 0 // From action.dm: next_use_time = world.time + cooldown_time
// Power-Related
var/level_current = 0 // Can increase to yield new abilities. Each power goes up in strength each Rank.
//var/level_max = 1 //
@@ -45,37 +40,27 @@
desc += "<br><br><i>Useable once per night.</i>"
..()
// NOTES
//
// click.dm <--- Where we can take over mouse clicks
// spells.dm /add_ranged_ability() <--- How we take over the mouse click to use a power on a target.
/datum/action/bloodsucker/Trigger()
// Active? DEACTIVATE AND END!
if (active && CheckCanDeactivate(TRUE))
DeactivatePower()
return
if (!CheckCanPayCost(TRUE) || !CheckCanUse(TRUE))
return
PayCost()
if (amToggle)
active = !active
UpdateButtonIcon()
if (!amToggle || !active)
StartCooldown() // Must come AFTER UpdateButton(), otherwise icon will revert.
ActivatePower() // NOTE: ActivatePower() freezes this power in place until it ends.
if (active) // Did we not manually disable? Handle it here.
DeactivatePower()
if (amSingleUse)
RemoveAfterUse()
@@ -110,7 +95,7 @@
// Incap?
if(must_be_capacitated)
var/mob/living/L = owner
if (L.incapacitated(ignore_restraints=TRUE,ignore_grab=TRUE) || L.lying && !can_be_immobilized)
if (L.incapacitated(TRUE, TRUE) || L.lying && !can_be_immobilized)
if(display_error)
to_chat(owner, "<span class='warning'>Not while you're incapacitated!</span>")
return FALSE
@@ -123,7 +108,6 @@
return FALSE
return TRUE
/datum/action/bloodsucker/proc/StartCooldown()
set waitfor = FALSE
// Alpha Out
@@ -140,8 +124,6 @@
button.color = rgb(255,255,255,255)
button.alpha = 255
/datum/action/bloodsucker/proc/CheckCanDeactivate(display_error)
return TRUE
@@ -159,7 +141,6 @@
/datum/action/bloodsucker/proc/ActivatePower()
/datum/action/bloodsucker/proc/DeactivatePower(mob/living/user = owner, mob/living/target)
active = FALSE
UpdateButtonIcon()
@@ -168,7 +149,6 @@
/datum/action/bloodsucker/proc/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active.
return active && user && (!warn_constant_cost || user.blood_volume > 0)
/datum/action/bloodsucker/proc/RemoveAfterUse()
// Un-Learn Me! (GO HOME
var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
@@ -176,13 +156,11 @@
bloodsuckerdatum.powers -= src
Remove(owner)
/datum/action/bloodsucker/proc/Upgrade()
level_current ++
/////////////////////////////////// PASSIVE POWERS ///////////////////////////////////
// New Type: Passive (Always on, no button)
/datum/action/bloodsucker/passive
@@ -218,18 +196,14 @@
// Click power: Begin Aim
/datum/action/bloodsucker/targeted/Trigger()
if (active && CheckCanDeactivate(TRUE))
DeactivateRangedAbility()
DeactivatePower()
return
if (!CheckCanPayCost(TRUE) || !CheckCanUse(TRUE))
return
active = !active
UpdateButtonIcon()
// Create & Link Targeting Proc
var/mob/living/L = owner
if (L.ranged_ability)
@@ -240,13 +214,13 @@
to_chat(owner, "<span class='announce'>[message_Trigger]</span>")
/datum/action/bloodsucker/targeted/CheckCanUse(display_error)
if (!..())
return FALSE
. = ..()
if(!.)
return
if (!owner.client) // <--- We don't allow non client usage so that using powers like mesmerize will FAIL if you try to use them as ghost. Why? because ranged_abvility in spell.dm
return FALSE // doesn't let you remove powers if you're not there. So, let's just cancel the power entirely.
return TRUE
/datum/action/bloodsucker/targeted/DeactivatePower(mob/living/user = owner, mob/living/target)
// Don't run ..(), we don't want to engage the cooldown until we USE this power!
active = FALSE
@@ -255,7 +229,6 @@
/datum/action/bloodsucker/targeted/proc/DeactivateRangedAbility()
// Only Turned off when CLICK is disabled...aka, when you successfully clicked (or
bs_proc_holder.remove_ranged_ability()
//qdel(bs_proc_holder)
// Check if target is VALID (wall, turf, or character?)
/datum/action/bloodsucker/targeted/proc/CheckValidTarget(atom/A)
@@ -278,15 +251,12 @@
// Valid? (return true means DON'T cancel power!)
if (!CheckCanPayCost(TRUE) || !CheckCanUse(TRUE) || !CheckCanTarget(A, TRUE))
return TRUE
// Skip this part so we can return TRUE right away.
if (power_activates_immediately)
PowerActivatedSuccessfully() // Mesmerize pays only after success.
power_in_use = TRUE // Lock us into this ability until it successfully fires off. Otherwise, we pay the blood even if we fail.
FireTargetedPower(A) // We use this instead of ActivatePower(), which has no input
power_in_use = FALSE
return TRUE
/datum/action/bloodsucker/targeted/proc/FireTargetedPower(atom/A)
@@ -294,17 +264,13 @@
/datum/action/bloodsucker/targeted/proc/PowerActivatedSuccessfully()
// The power went off! We now pay the cost of the power.
PayCost()
DeactivateRangedAbility()
DeactivatePower()
StartCooldown() // Do AFTER UpdateIcon() inside of DeactivatePower. Otherwise icon just gets wiped.
/datum/action/bloodsucker/targeted/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active.
return ..() // active// && user.mind && user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
return ..()
// Target Proc Holder
/obj/effect/proc_holder/bloodsucker
var/datum/action/bloodsucker/targeted/linked_power
@@ -312,102 +278,6 @@
/obj/effect/proc_holder/bloodsucker/remove_ranged_ability(msg)
..()
linked_power.DeactivatePower()
//qdel(src)
/obj/effect/proc_holder/bloodsucker/InterceptClickOn(mob/living/caller, params, atom/A)
return linked_power.ClickWithPower(A)
// P O W E R S
// * BLOOD
// ADDICTIVE: A) Your blood is dangerously addictive, and causes consumers to rendew their own blood at an increased rate (as well as heal). B) Vassals on your blood get special gifts.
//
// * HASTE
// SPRINT: A) Hastily speed in a direction faster than the eye can see. B) Spin and dizzy people you pass. C) Chance to knock down people you pass.
// LUNGE: Leap toward a location and put your target into an agressive hold.
//
// * AGILITY
// CELERITY: Dodge projectiles and even bullets. Perhaps avoid explosions!
// REFLEXES TRAIT_NOSLIPWATER, TRAIT_NOSLIPALL
//
// * STEALTH
// CLOAK: A) Vanish into the shadows when stationary. B) Moving does not break your current level of invisibility (but stops you from hiding further).
// DISGUISE: A) Bear the face and voice of a new person. B) Bear a random outfit of an unknown profession.
//
// * FEED
// A) Mute victim while Feeding (and slowly deal Stamina damage) B) Paralyze victim while feeding C) Sleep victim while Feeding
//
// * MEZMERIZE
// LOVE: Target falls in love with you. Being harmed directly causes them harm if they see it?
// STAY: Target will do everything they can to stand in the same place.
// FOLLOW: Target follows you, spouting random phrases from their history (or maybe Poly's or NPC's vocab?)
// ATTACK: Target finds a nearby non-Bloodsucker victim to attack.
//
// * EXPEL
// TAINT: Mark areas with your corrupting blood. Your coffin must remain in an area so marked to gain any benefit. Spiders, roaches, and rats will infest the area, cobwebs grow rapidly, and trespassers are overcome with fear.
// SERVITUDE: Your blood binds a mortal to your will. Vassals feel your pain and can locate you anywhere. Your death causes them agony.
// HEIR: Raise a moral corpse into a Bloodsucker. The change will take a while, and the body must be brought to a tainted coffin to rise.
//
// * NIGHTMARE
// BOGEYMAN: Terrify those who view you in your death-form, causing them to shake, pale, and drop possessions.
// HORROR: Horrified characters cannot speak, shake, and slowly push away from the source.
//
/* POWERS: VERSION TWO
* FEED
1: Paralyze
2: Unconscious
3: Sleep
* LUNGE
1: Grab: Aggressive
2: Grab from Behind: Neck
3: Grab from Darkness: Neck
* CLOAK
1: Hide
2: Move
3: Full Speed
* MESMERIZE
1: Stay
2: Mute
3: Follow + Blind
* BRAWN
1: Punch Hard
2: Open Doors and Lockers
3:
* HASTE
1: Speed to location
2: Dodge Bullets
3:
* VEIL
1:
2:
3:
* FORTITUDE
1: Break Bonds and Grapples
2:
3: Immune to Brute Damage
* DEMENT
1: Shuffle Names
2:
3:
*/
@@ -17,8 +17,9 @@
var/upgrade_canDoor = FALSE
/datum/action/bloodsucker/targeted/brawn/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
. = TRUE
// Break Out of Restraints! (And then cancel)
if (CheckBreakRestraints())
@@ -61,38 +62,31 @@
/datum/action/bloodsucker/targeted/brawn/FireTargetedPower(atom/A)
// set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done.
var/mob/living/carbon/target = A
var/mob/living/user = owner
// Target Type: Mob
if (isliving(target))
var/mob/living/carbon/user_C = user
var/hitStrength = user_C.dna.species.punchdamagehigh * 1.25 + 2
// Knockdown!
var/powerlevel = min(7, 1 + level_current)
if (rand(10 + powerlevel) >= 5)
target.visible_message("<span class='danger'>[user] has knocked [target] down!</span>", \
"<span class='userdanger'>[user] has knocked you down!</span>", null, COMBAT_MESSAGE_RANGE)
target.Knockdown( min(5, rand(10, 10 * powerlevel)) )
// Chance of KO
if (rand(5 + powerlevel) >= 5 && target.stat <= UNCONSCIOUS)
target.Unconscious(40)
// Attack!
playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, 1, -1)
user.do_attack_animation(target, ATTACK_EFFECT_SMASH)
var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(target.zone_selected))
target.apply_damage(hitStrength, BRUTE, affecting)
// Knockback
var/send_dir = get_dir(owner, target)
var/turf/T = get_ranged_target_turf(target, send_dir, powerlevel)
owner.newtonian_move(send_dir) // Bounce back in 0 G
target.throw_at(T, powerlevel, TRUE, owner) //new /datum/forced_movement(target, get_ranged_target_turf(target, send_dir, (hitStrength / 4)), 1, FALSE)
// Target Type: Door
else if (upgrade_canDoor && istype(target, /obj/machinery/door))
playsound(get_turf(usr), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1)
@@ -104,7 +98,6 @@
user.do_attack_animation(D, ATTACK_EFFECT_SMASH)
playsound(get_turf(D), 'sound/effects/bang.ogg', 30, 1, -1)
D.open(2) // open(2) is like a crowbar or jaws of life.
// Target Type: Closet
else if (upgrade_canLocker && istype(target, /obj/structure/closet))
playsound(get_turf(usr), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1)
@@ -116,7 +109,6 @@
playsound(get_turf(C), 'sound/effects/bang.ogg', 30, 1, -1)
C.bust_open()
/datum/action/bloodsucker/targeted/brawn/proc/CheckBreakRestraints()
if (!iscarbon(owner)) // || !owner.restrained()
@@ -145,7 +137,6 @@
user_C.clear_cuffs(S,TRUE)
playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1)
return TRUE
// Destroy Leg Cuffs
if(user_C.legcuffed)
var/obj/O = user_C.get_item_by_slot(SLOT_LEGCUFFED)
@@ -155,32 +146,25 @@
user_C.clear_cuffs(O,TRUE)
playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1)
return TRUE
return FALSE
/datum/action/bloodsucker/targeted/brawn/proc/CheckEscapePuller()
if (!owner.pulledby)// || owner.pulledby.grab_state <= GRAB_PASSIVE)
return FALSE
var/mob/M = owner.pulledby
var/pull_power = M.grab_state
playsound(get_turf(M), 'sound/effects/woodhit.ogg', 75, 1, -1)
// Knock Down (if Living)
if (isliving(M))
var/mob/living/L = M
L.Knockdown(pull_power * 10 + 20)
// Knock Back (before Knockdown, which probably cancels pull)
var/send_dir = get_dir(owner, M)
var/turf/T = get_ranged_target_turf(M, send_dir, pull_power)
owner.newtonian_move(send_dir) // Bounce back in 0 G
M.throw_at(T, pull_power, TRUE, owner, FALSE) // Throw distance based on grab state! Harder grabs punished more aggressively.
// /proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null)
log_combat(owner, M, "used Brawn power")
owner.visible_message("<span class='warning'>[owner] tears free of [M]'s grasp!</span>", \
"<span class='warning'>You shrug off [M]'s grasp!</span>")
owner.pulledby = null // It's already done, but JUST IN CASE.
@@ -16,8 +16,9 @@
var/upgrade_canMove = FALSE // Can I move around with this power?
/datum/action/bloodsucker/cloak/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
// Must be Dark
var/turf/T = owner.loc
if(istype(T) && T.get_lumcount() > light_min)
@@ -17,25 +17,19 @@
var/target_grappled = FALSE // If you started grappled, then ending it will end your Feed.
/datum/action/bloodsucker/feed/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
// Wearing mask
var/mob/living/L = owner
if (L.is_mouth_covered())
if (display_error)
to_chat(owner, "<span class='warning'>You cannot feed with your mouth covered! Remove your mask.</span>")
return FALSE
// Find my Target!
if (!FindMyTarget(display_error)) // Sets feed_target within after Validating
return FALSE
// Not in correct state
//if (owner.grab_state < GRAB_PASSIVE)//GRAB_AGGRESSIVEs)
// to_chat(owner, "<span class='warning'>You aren't grabbing anyone!</span>")
// return FALSE
// Not in correct state
// DONE!
return TRUE
@@ -80,7 +74,6 @@
// Default
feed_target = null
target_grappled = FALSE
// If you are pulling a mob, that's your target. If you don't like it, then release them.
if (owner.pulling && ismob(owner.pulling))
// Check grapple target Valid
@@ -89,20 +82,17 @@
target_grappled = TRUE
feed_target = owner.pulling
return TRUE
// Find Targets
var/list/mob/living/seen_targets = view(1, owner)
var/list/mob/living/seen_mobs = list()
for(var/mob/living/M in seen_targets)
if (isliving(M) && M != owner)
seen_mobs += M
// None Seen!
if (seen_mobs.len == 0)
if (display_error)
to_chat(owner, "<span class='warning'>You must be next to or grabbing a victim to feed from them.</span>")
return FALSE
// Check Valids...
var/list/targets_valid = list()
var/list/targets_dead = list()
@@ -114,7 +104,6 @@
targets_valid += M
else
targets_dead += M
// No Living? Try dead.
if (targets_valid.len == 0 && targets_dead.len > 0)
targets_valid = targets_dead
@@ -137,17 +126,13 @@
feed_target = pick(targets_valid)//targets[1]
return TRUE
/datum/action/bloodsucker/feed/ActivatePower()
// set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up Activate(), so Deactivate() can happen after.
var/mob/living/target = feed_target // Stored during CheckCanUse(). Can be a grabbed OR adjecent character.
var/mob/living/user = owner
var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
// Am I SECRET or LOUD? It stays this way the whole time! I must END IT to try it the other way.
var/amSilent = (!target_grappled || owner.grab_state <= GRAB_PASSIVE) // && iscarbon(target) // Non-carbons (animals) not passive. They go straight into aggressive.
// Initial Wait
var/feed_time = (amSilent ? 45 : 25) - (2.5 * level_current)
feed_time = max(15, feed_time)
@@ -159,7 +144,6 @@
to_chat(user, "<span class='warning'>Your feeding was interrupted.</span>")
//DeactivatePower(user,target)
return
// Put target to Sleep (Bloodsuckers are immune to their own bite's sleep effect)
if (!amSilent)
ApplyVictimEffects(target) // Sleep, paralysis, immobile, unconscious, and mute
@@ -172,7 +156,6 @@
// Pull Target Close
if (!target.density) // Pull target to you if they don't take up space.
target.Move(user.loc)
// Broadcast Message
if (amSilent)
//if (!iscarbon(target))
@@ -198,7 +181,6 @@
else // /atom/proc/visible_message(message, self_message, blind_message, vision_distance, ignored_mobs)
user.visible_message("<span class='warning'>[user] closes [user.p_their()] mouth around [target]'s neck!</span>", \
"<span class='warning'>You sink your fangs into [target]'s neck.</span>")
// My mouth is full!
ADD_TRAIT(user, TRAIT_MUTE, "bloodsucker_feed")
@@ -19,8 +19,9 @@
/datum/action/bloodsucker/gohome/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
// Have No Lair (NOTE: You only got this power if you had a lair, so this means it's destroyed)
var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
if (!istype(bloodsuckerdatum) || !bloodsuckerdatum.coffin)
@@ -20,8 +20,9 @@
/datum/action/bloodsucker/targeted/haste/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
// Being Grabbed
if (owner.pulledby && owner.pulledby.grab_state >= GRAB_AGGRESSIVE)
if (display_error)
@@ -1,8 +1,6 @@
// Level 1: Grapple level 2
// Level 2: Grapple 3 from Behind
// Level 3: Grapple 3 from Shadows
/datum/action/bloodsucker/targeted/lunge
name = "Predatory Lunge"
desc = "Spring at your target and aggressively grapple them without warning. Attacks from concealment or the rear may even knock them down."
@@ -15,7 +13,6 @@
must_be_capacitated = TRUE
bloodsucker_can_buy = TRUE
/datum/action/bloodsucker/targeted/lunge/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
@@ -26,11 +23,9 @@
return FALSE
return TRUE
/datum/action/bloodsucker/targeted/lunge/CheckValidTarget(atom/A)
return isliving(A)
/datum/action/bloodsucker/targeted/lunge/CheckCanTarget(atom/A, display_error)
// Check: Self
if (target == owner)
@@ -51,18 +46,14 @@
/datum/action/bloodsucker/targeted/lunge/FireTargetedPower(atom/A)
// set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done.
var/mob/living/user = owner
var/mob/living/carbon/target = A
var/turf/T = get_turf(target)
// Clear Vars
owner.pulling = null
// Will we Knock them Down?
var/do_knockdown = !is_A_facing_B(target,owner) || owner.alpha <= 0 || istype(owner.loc, /obj/structure/closet)
// 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.
var/safety = 10
@@ -70,7 +61,6 @@
if(owner.incapacitated())
sleep(1)
safety --
// Did I get knocked down?
if (owner && owner.incapacitated())
if (user.lying)
@@ -78,8 +68,6 @@
new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE)
owner.spin(10)
break
// Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination)
if (target.Adjacent(owner))
// LEVEL 2: If behind target, mute or unconscious!
@@ -91,12 +79,6 @@
target.grabbedby(owner) // Taken from mutations.dm under changelings
target.grippedby(owner, instant = TRUE) //instant aggro grab
// UNCONSCIOUS or MUTE!
//owner.start_pulling(target,GRAB_AGGRESSIVE) // GRAB_PASSIVE, GRAB_AGGRESSIVE, GRAB_NECK, GRAB_KILL
//DeactivatePower()
/datum/action/bloodsucker/targeted/lunge/DeactivatePower(mob/living/user = owner, mob/living/target)
..() // activate = FALSE
user.update_canmove()
@@ -19,8 +19,9 @@
bloodsucker_can_buy = TRUE
/datum/action/bloodsucker/targeted/mesmerize/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
if (!owner.getorganslot(ORGAN_SLOT_EYES))
if (display_error)
to_chat(owner, "<span class='warning'>You have no eyes with which to mesmerize.</span>")
@@ -17,8 +17,9 @@
var/turf/target_turf // We need to decide where we're going based on where we clicked. It's not actually the tile we clicked.
/datum/action/bloodsucker/targeted/trespass/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
if(owner.notransform || !get_turf(owner))
return FALSE
@@ -31,8 +31,9 @@
/datum/action/bloodsucker/veil/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
return TRUE
@@ -1,13 +0,0 @@
/*
/datum/action/bloodsucker/vassal/distress
name = "Distress"
desc = "Call out to your master and other vassals for aid"
button_icon_state = "power_recup"
amToggle = TRUE
bloodcost = 10
cooldown = 100
not_bloodsucker = TRUE
*/
@@ -15,8 +15,9 @@
// Deal STAMINA damage over time, trickle down blood, and heal wounds.
/datum/action/bloodsucker/vassal/recuperate/CheckCanUse(display_error)
if(!..(display_error))// DEFAULT CHECKS
return FALSE
. = ..()
if(!.)
return
if (owner.stat >= DEAD)
return FALSE
var/mob/living/carbon/C = owner
-1
View File
@@ -1243,7 +1243,6 @@
#include "code\modules\antagonists\bloodsucker\powers\bs_mesmerize.dm"
#include "code\modules\antagonists\bloodsucker\powers\bs_trespass.dm"
#include "code\modules\antagonists\bloodsucker\powers\bs_veil.dm"
#include "code\modules\antagonists\bloodsucker\powers\v_distress.dm"
#include "code\modules\antagonists\bloodsucker\powers\v_recuperate.dm"
#include "code\modules\antagonists\brainwashing\brainwashing.dm"
#include "code\modules\antagonists\brother\brother.dm"