diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 2d0af4c641..8cc8960b01 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -130,7 +130,7 @@
#define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp.
#define TRAIT_NONATURALHEAL "nonaturalheal" // Only Admins can heal you. NOTHING else does it unless it's given the god tag.
#define TRAIT_NORUNNING "norunning" // You walk!
-#define TRAIT_NOMARROW "nomarrow" // You don't make blood.
+#define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites.
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat.
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 9cb0c52b9a..f082f2ad16 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -110,7 +110,7 @@
totitemdamage *= 0.5
//CIT CHANGES END HERE
apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage
- if(I.damtype == BRUTE)
+ if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW))
if(prob(33))
I.add_mob_blood(src)
var/turf/location = get_turf(src)
@@ -163,4 +163,3 @@
/obj/item/proc/getweight()
return total_mass || w_class * 1.25
-
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index 281150b535..6190e0c287 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -201,5 +201,45 @@
/datum/mood_event/vampcandle
description = "Something is making your mind feel... loose...\n"
- mood_change = -20
+ mood_change = -20
timeout = 1 MINUTES
+
+/datum/mood_event/drankblood_bad
+ description = "I drank the blood of a lesser creature. Disgusting.\n"
+ mood_change = -4
+ timeout = 900
+
+/datum/mood_event/drankblood_dead
+ description = "I drank dead blood. I am better than this.\n"
+ mood_change = -7
+ timeout = 900
+
+/datum/mood_event/drankblood_synth
+ description = "I drank synthetic blood. What is wrong with me?\n"
+ mood_change = -7
+ timeout = 900
+
+/datum/mood_event/drankkilled
+ description = "I drank from my victim until they died. I feel...less human.\n"
+ mood_change = -12
+ timeout = 6000
+
+/datum/mood_event/madevamp
+ description = "A soul has been cursed to undeath by my own hand.\n"
+ mood_change = -10
+ timeout = 10000
+
+/datum/mood_event/vampatefood
+ description = "Mortal nourishment no longer sustains me. I feel unwell.\n"
+ mood_change = -6
+ timeout = 1000
+
+/datum/mood_event/daylight_1
+ description = "I slept poorly in a makeshift coffin during the day.\n"
+ mood_change = -3
+ timeout = 1000
+
+/datum/mood_event/daylight_2
+ description = "I have been scorched by the unforgiving rays of the sun.\n"
+ mood_change = -6
+ timeout = 1200
diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm
index 9ae7ba2289..6b4fa5e636 100644
--- a/code/datums/mood_events/generic_positive_events.dm
+++ b/code/datums/mood_events/generic_positive_events.dm
@@ -134,6 +134,15 @@
mood_change = 3
timeout = 3000
+/datum/mood_event/drankblood
+ description = "I have fed greedly from that which nourishes me.\n"
+ mood_change = 10
+ timeout = 900
+
+/datum/mood_event/coffinsleep
+ description = "I slept in a coffin during the day. I feel whole again.\n"
+ mood_change = 8
+ timeout = 1200
//Cursed stuff below.
/datum/mood_event/orgasm
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 3cd06d3a3c..402645f1c9 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -420,12 +420,12 @@ SLIME SCANNER
blood_type = R.name
else
blood_type = blood_id
- if(C.blood_volume <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.blood_volume > (BLOOD_VOLUME_OKAY*C.blood_ratio))
- msg += "LOW blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n"
- else if(C.blood_volume <= (BLOOD_VOLUME_OKAY*C.blood_ratio))
- msg += "CRITICAL blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n"
+ if(C.scan_blood_volume() <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.scan_blood_volume() > (BLOOD_VOLUME_OKAY*C.blood_ratio))
+ msg += "LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n"
+ else if(C.scan_blood_volume() <= (BLOOD_VOLUME_OKAY*C.blood_ratio))
+ msg += "CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n"
else
- msg += "Blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n"
+ msg += "Blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n"
var/cyberimp_detect
for(var/obj/item/organ/cyberimp/CI in C.internal_organs)
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
index e2bf217ab9..86e4a51d98 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
@@ -73,56 +73,6 @@
// Blood Gulp Sound
owner.current.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head.
-/datum/mood_event/drankblood
- description = "I have fed greedly from that which nourishes me.\n"
- mood_change = 10
- timeout = 900
-
-/datum/mood_event/drankblood_bad
- description = "I drank the blood of a lesser creature. Disgusting.\n"
- mood_change = -4
- timeout = 900
-
-/datum/mood_event/drankblood_dead
- description = "I drank dead blood. I am better than this.\n"
- mood_change = -7
- timeout = 900
-
-/datum/mood_event/drankblood_synth
- description = "I drank synthetic blood. What is wrong with me?\n"
- mood_change = -7
- timeout = 900
-
-/datum/mood_event/drankkilled
- description = "I drank from my victim until they died. I feel...less human.\n"
- mood_change = -12
- timeout = 6000
-
-/datum/mood_event/madevamp
- description = "A soul has been cursed to undeath by my own hand.\n"
- mood_change = -10
- timeout = 10000
-
-/datum/mood_event/vampatefood
- description = "Mortal nourishment no longer sustains me. I feel unwell.\n"
- mood_change = -6
- timeout = 1000
-
-/datum/mood_event/coffinsleep
- description = "I slept in a coffin during the day. I feel whole again.\n"
- mood_change = 8
- timeout = 1200
-
-/datum/mood_event/daylight_1
- description = "I slept poorly in a makeshift coffin during the day.\n"
- mood_change = -3
- timeout = 1000
-
-/datum/mood_event/daylight_2
- description = "I have been scorched by the unforgiving rays of the sun.\n"
- mood_change = -6
- timeout = 1200
-
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// HEALING
@@ -138,10 +88,10 @@
owner.current.adjustCloneLoss(-1 * (regenRate * 4) * mult, 0)
owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0)
// No Bleeding
- if (ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete.
+ if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete.
var/mob/living/carbon/human/H = owner.current
H.bleed_rate = 0
- if (iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart?
+ if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart?
var/mob/living/carbon/C = owner.current
var/costMult = 1 // Coffin makes it cheaper
var/fireheal = 0 // BURN: Heal in Coffin while Fakedeath, or when damage above maxhealth (you can never fully heal fire)
@@ -150,9 +100,10 @@
mult *= 5 // Increase multiplier if we're sleeping in a coffin.
fireheal = min(C.getFireLoss_nonProsthetic(), regenRate) // NOTE: Burn damage ONLY heals in torpor.
costMult = 0.25
- C.ExtinguishMob() // Extinguish Fire
+ C.ExtinguishMob()
+ CureDisabilities() // Extinguish Fire
else
- if (owner.current.blood_volume <= 0) // No Blood? Lower Mult
+ if(owner.current.blood_volume <= 0) // No Blood? Lower Mult
mult = 0.25
// Crit from burn? Lower damage to maximum allowed.
//if (C.getFireLoss() > owner.current.getMaxHealth())
@@ -161,8 +112,8 @@
var/bruteheal = min(C.getBruteLoss_nonProsthetic(), regenRate)
var/toxinheal = min(C.getToxLoss(), regenRate)
// Heal if Damaged
- if (bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return.
- if (mult == 0)
+ if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return.
+ if(mult == 0)
return TRUE
// We have damage. Let's heal (one time)
C.adjustBruteLoss(-bruteheal * mult, forced=TRUE)// Heal BRUTE / BURN in random portions throughout the body.
@@ -171,7 +122,7 @@
//C.heal_overall_damage(bruteheal * mult, fireheal * mult) // REMOVED: We need to FORCE this, because otherwise, vamps won't heal EVER. Swapped to above.
AddBloodVolume((bruteheal * -0.5 + fireheal * -1) / mult * costMult) // Costs blood to heal
return TRUE // Healed! Done for this tick.
- if (amInCoffinWhileTorpor) // Limbs? (And I have no other healing)
+ if(amInCoffinWhileTorpor) // Limbs? (And I have no other healing)
var/list/missing = owner.current.get_missing_limbs() // Heal Missing
if (missing.len) // Cycle through ALL limbs and regen them!
for (var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it.
@@ -193,7 +144,6 @@
return TRUE
// NOTE: Limbs have a "status", like their hosts "stat". 2 is dead (aka Prosthetic). 1 seems to be idle/alive.
*/
- CureDisabilities() // Cure Final Disabilities
C.remove_all_embedded_objects() // Remove Embedded!
owner.current.regenerate_organs() // Heal Organs (will respawn original eyes etc. but we replace right away, next)
CheckVampOrgans() // Heart, Eyes
@@ -328,7 +278,7 @@
var/mob/living/carbon/C = owner.current
C.remove_all_embedded_objects()
// Make me UN-CLONEABLE
- owner.current.hellbound = TRUE // This was done during creation, but let's do it again one more time...to make SURE this guy stays dead.
+ owner.current.hellbound = TRUE // This was done during creation, but let's do it again one more time...to make SURE this guy stays dead, but they dont stay dead because brains can be cloned!
// Free my Vassals!
FreeAllVassals()
// Elders get Dusted
@@ -342,7 +292,7 @@
owner.current.visible_message("[owner.current]'s skin bursts forth in a spray of gore and detritus. A horrible cry echoes from what is now a wet pile of decaying meat.", \
"Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \
"You hear a wet, bursting sound.")
- owner.current.gib()
+ owner.current.gib(TRUE, FALSE, FALSE)//Brain cloning is wierd and allows hellbounds. Lets destroy the brain for safety.
playsound(owner.current.loc, 'sound/effects/tendril_destroyed.ogg', 40, 1)
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm
index 726eb8c452..4521842ff6 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm
@@ -24,18 +24,18 @@
time_til_cycle = TIME_BLOODSUCKER_NIGHT
// Part 1: Night (all is well)
- while (time_til_cycle > TIME_BLOODSUCKER_DAY_WARN)
+ while(time_til_cycle > TIME_BLOODSUCKER_DAY_WARN)
sleep(10)
- if (cancel_me)
+ if(cancel_me)
return
//sleep(TIME_BLOODSUCKER_NIGHT - TIME_BLOODSUCKER_DAY_WARN)
warn_daylight(1,"Solar Flares will bombard the station with dangerous UV in [TIME_BLOODSUCKER_DAY_WARN / 60] minutes. Prepare to seek cover in a coffin or closet.") // time2text <-- use Help On
give_home_power() // Give VANISHING ACT power to all vamps with a lair!
// Part 2: Night Ending
- while (time_til_cycle > TIME_BLOODSUCKER_DAY_FINAL_WARN)
+ while(time_til_cycle > TIME_BLOODSUCKER_DAY_FINAL_WARN)
sleep(10)
- if (cancel_me)
+ if(cancel_me)
return
//sleep(TIME_BLOODSUCKER_DAY_WARN - TIME_BLOODSUCKER_DAY_FINAL_WARN)
message_admins("BLOODSUCKER NOTICE: Daylight beginning in [TIME_BLOODSUCKER_DAY_FINAL_WARN] seconds.)")
@@ -43,7 +43,7 @@
"In [TIME_BLOODSUCKER_DAY_FINAL_WARN / 10], your master will be at risk of a Solar Flare. Make sure they find cover!")
// (FINAL LIL WARNING)
- while (time_til_cycle > 5)
+ while(time_til_cycle > 5)
sleep(10)
if (cancel_me)
return
@@ -90,56 +90,56 @@
while(!cancel_me)
// Update all Bloodsucker sunlight huds
- for (var/datum/mind/M in SSticker.mode.bloodsuckers)
- if (!istype(M) || !istype(M.current))
+ for(var/datum/mind/M in SSticker.mode.bloodsuckers)
+ if(!istype(M) || !istype(M.current))
continue
var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
- if (istype(bloodsuckerdatum))
+ if(istype(bloodsuckerdatum))
bloodsuckerdatum.update_sunlight(max(0, time_til_cycle), amDay) // This pings all HUDs
sleep(10)
time_til_cycle --
/obj/effect/sunlight/proc/warn_daylight(danger_level=0, vampwarn = "", vassalwarn = "")
- for (var/datum/mind/M in SSticker.mode.bloodsuckers)
- if (!istype(M))
+ for(var/datum/mind/M in SSticker.mode.bloodsuckers)
+ if(!istype(M))
continue
to_chat(M,vampwarn)
- if (M.current)
- if (danger_level == 1)
+ if(M.current)
+ if(danger_level == 1)
M.current.playsound_local(null, 'sound/chatter/griffin_3.ogg', 50 + danger_level, 1)
- else if (danger_level == 2)
+ else if(danger_level == 2)
M.current.playsound_local(null, 'sound/chatter/griffin_5.ogg', 50 + danger_level, 1)
- else if (danger_level == 3)
+ else if(danger_level == 3)
M.current.playsound_local(null, 'sound/effects/alert.ogg', 75, 1)
- else if (danger_level == 4)
+ else if(danger_level == 4)
M.current.playsound_local(null, 'sound/ambience/ambimystery.ogg', 100, 1)
- else if (danger_level == 5)
+ else if(danger_level == 5)
M.current.playsound_local(null, 'sound/spookoween/ghosty_wind.ogg', 90, 1)
- if (vassalwarn != "")
- for (var/datum/mind/M in SSticker.mode.vassals)
- if (!istype(M))
+ if(vassalwarn != "")
+ for(var/datum/mind/M in SSticker.mode.vassals)
+ if(!istype(M))
continue
to_chat(M,vassalwarn)
/obj/effect/sunlight/proc/punish_vamps()
// Cycle through all vamp antags and check if they're inside a closet.
- for (var/datum/mind/M in SSticker.mode.bloodsuckers)
- if (!istype(M) || !istype(M.current))
+ for(var/datum/mind/M in SSticker.mode.bloodsuckers)
+ if(!istype(M) || !istype(M.current))
continue
var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
- if (!istype(bloodsuckerdatum))
+ if(!istype(bloodsuckerdatum))
continue
// Closets offer SOME protection
- if (istype(M.current.loc, /obj/structure))
+ if(istype(M.current.loc, /obj/structure))
// Coffins offer the BEST protection
- if (istype(M.current.loc, /obj/structure/closet/crate/coffin))
+ if(istype(M.current.loc, /obj/structure/closet/crate/coffin))
SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/coffinsleep)
continue
else
- if (!bloodsuckerdatum.warn_sun_locker)
+ if(!bloodsuckerdatum.warn_sun_locker)
to_chat(M, "Your skin sizzles. The [M.current.loc] doesn't protect well against UV bombardment.")
bloodsuckerdatum.warn_sun_locker = TRUE
M.current.adjustFireLoss(0.5 + bloodsuckerdatum.vamplevel / 2) // M.current.fireloss += 0.5 + bloodsuckerdatum.vamplevel / 2 // Do DIRECT damage. Being spaced was causing this to not occur. setFireLoss(bloodsuckerdatum.vamplevel)
@@ -147,15 +147,15 @@
SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_1)
// Out in the Open? Buh Bye
else
- if (!bloodsuckerdatum.warn_sun_burn)
- if (bloodsuckerdatum.vamplevel > 0)
+ if(!bloodsuckerdatum.warn_sun_burn)
+ if(bloodsuckerdatum.vamplevel > 0)
to_chat(M, "The solar flare sets your skin ablaze!")
else
to_chat(M, "The solar flare scalds your neophyte skin!")
bloodsuckerdatum.warn_sun_burn = TRUE
- if (M.current.fire_stacks <= 0)
+ if(M.current.fire_stacks <= 0)
M.current.fire_stacks = 0
- if (bloodsuckerdatum.vamplevel > 0)
+ if(bloodsuckerdatum.vamplevel > 0)
M.current.adjust_fire_stacks(0.2 + bloodsuckerdatum.vamplevel / 10)
M.current.IgniteMob()
M.current.adjustFireLoss(2 + bloodsuckerdatum.vamplevel) // M.current.fireloss += 2 + bloodsuckerdatum.vamplevel // Do DIRECT damage. Being spaced was causing this to not occur. //setFireLoss(2 + bloodsuckerdatum.vamplevel)
@@ -163,36 +163,36 @@
SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_2)
/obj/effect/sunlight/proc/day_end()
- for (var/datum/mind/M in SSticker.mode.bloodsuckers)
- if (!istype(M) || !istype(M.current))
+ for(var/datum/mind/M in SSticker.mode.bloodsuckers)
+ if(!istype(M) || !istype(M.current))
continue
var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
- if (!istype(bloodsuckerdatum))
+ if(!istype(bloodsuckerdatum))
continue
// Reset Warnings
bloodsuckerdatum.warn_sun_locker = FALSE
bloodsuckerdatum.warn_sun_burn = FALSE
// Remove Dawn Powers
for(var/datum/action/bloodsucker/P in bloodsuckerdatum.powers)
- if (istype(P, /datum/action/bloodsucker/gohome))
+ if(istype(P, /datum/action/bloodsucker/gohome))
bloodsuckerdatum.powers -= P
P.Remove(M.current)
/obj/effect/sunlight/proc/vamps_rank_up()
set waitfor = FALSE
// Cycle through all vamp antags and check if they're inside a closet.
- for (var/datum/mind/M in SSticker.mode.bloodsuckers)
- if (!istype(M) || !istype(M.current))
+ for(var/datum/mind/M in SSticker.mode.bloodsuckers)
+ if(!istype(M) || !istype(M.current))
continue
var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
- if (istype(bloodsuckerdatum))
+ if(istype(bloodsuckerdatum))
bloodsuckerdatum.RankUp() // Rank up! Must still be in a coffin to level!
/obj/effect/sunlight/proc/give_home_power()
// It's late...! Give the "Vanishing Act" gohome power to bloodsuckers.
- for (var/datum/mind/M in SSticker.mode.bloodsuckers)
- if (!istype(M) || !istype(M.current))
+ for(var/datum/mind/M in SSticker.mode.bloodsuckers)
+ if(!istype(M) || !istype(M.current))
continue
var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
- if (istype(bloodsuckerdatum) && bloodsuckerdatum.lair && !(locate(/datum/action/bloodsucker/gohome) in bloodsuckerdatum.powers))
+ if(istype(bloodsuckerdatum) && bloodsuckerdatum.lair && !(locate(/datum/action/bloodsucker/gohome) in bloodsuckerdatum.powers))
bloodsuckerdatum.BuyPower(new /datum/action/bloodsucker/gohome)
diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
index e52b63110c..10fc09157f 100644
--- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
+++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
@@ -36,7 +36,7 @@
// LISTS
var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_NIGHT_VISION, \
- TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE)
+ TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_NOCLONE)
// NOTES: TRAIT_AGEUSIA <-- Doesn't like flavors.
// REMOVED: TRAIT_NODEATH
// TO ADD:
@@ -187,6 +187,8 @@
// Traits
for (var/T in defaultTraits)
ADD_TRAIT(owner.current, T, "bloodsucker")
+ if(HAS_TRAIT(owner.current, TRAIT_TOXINLOVER)) //No slime bonuses here, no thank you
+ REMOVE_TRAIT(owner.current, TRAIT_TOXINLOVER, "species")
// Traits: Species
if (ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
@@ -233,14 +235,14 @@
power.Remove(owner.current)
// owner.RemoveSpell(power)
// Traits
- for (var/T in defaultTraits)
+ for(var/T in defaultTraits)
REMOVE_TRAIT(owner.current, T, "bloodsucker")
// Traits: Species
- if (ishuman(owner.current))
+ if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
H.set_species(H.dna.species.type)
// Stats
- if (ishuman(owner.current))
+ if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
H.set_species(H.dna.species.type)
// Clown
@@ -260,15 +262,15 @@
datum/antagonist/bloodsucker/proc/RankUp()
set waitfor = FALSE
- if (!owner || !owner.current)
+ if(!owner || !owner.current)
return
vamplevel_unspent ++
// Spend Rank Immediately?
- if (istype(owner.current.loc, /obj/structure/closet/crate/coffin))
+ if(istype(owner.current.loc, /obj/structure/closet/crate/coffin))
SpendRank()
else
to_chat(owner, "You have grown more ancient! Sleep in a coffin that you have claimed to thicken your blood and become more powerful.")
- if (vamplevel_unspent >= 2)
+ if(vamplevel_unspent >= 2)
to_chat(owner, "Bloodsucker Tip: If you cannot find or steal a coffin to use, they can be built from wooden planks.
")
datum/antagonist/bloodsucker/proc/LevelUpPowers()
@@ -287,19 +289,19 @@ datum/antagonist/bloodsucker/proc/SpendRank()
for(var/pickedpower in typesof(/datum/action/bloodsucker))
var/datum/action/bloodsucker/power = pickedpower
// If I don't own it, and I'm allowed to buy it.
- if (!(locate(power) in powers) && initial(power.bloodsucker_can_buy))
+ if(!(locate(power) in powers) && initial(power.bloodsucker_can_buy))
options[initial(power.name)] = power // TESTING: After working with TGUI, it seems you can use initial() to view the variables inside a path?
options["\[ Not Now \]"] = null
// Abort?
- if (options.len > 1)
+ if(options.len > 1)
var/choice = input(owner.current, "You have the opportunity to grow more ancient. Select a power to advance your Rank.", "Your Blood Thickens...") in options
// Cheat-Safety: Can't keep opening/closing coffin to spam levels
- if (vamplevel_unspent <= 0) // Already spent all your points, and tried opening/closing your coffin, pal.
+ if(vamplevel_unspent <= 0) // Already spent all your points, and tried opening/closing your coffin, pal.
return
- if (!istype(owner.current.loc, /obj/structure/closet/crate/coffin))
+ if(!istype(owner.current.loc, /obj/structure/closet/crate/coffin))
to_chat(owner.current, "Return to your coffin to advance your Rank.")
return
- if (!choice || !options[choice] || (locate(options[choice]) in powers)) // ADDED: Check to see if you already have this power, due to window stacking.
+ if(!choice || !options[choice] || (locate(options[choice]) in powers)) // ADDED: Check to see if you already have this power, due to window stacking.
to_chat(owner.current, "You prevent your blood from thickening just yet, but you may try again later.")
return
// Buy New Powers
@@ -313,7 +315,7 @@ datum/antagonist/bloodsucker/proc/SpendRank()
LevelUpPowers()
////////
// Advance Stats
- if (ishuman(owner.current))
+ if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
var/datum/species/S = H.dna.species
S.burnmod += 0.025 // Slightly more burn damage
@@ -331,7 +333,7 @@ datum/antagonist/bloodsucker/proc/SpendRank()
vamplevel_unspent --
// Assign True Reputation
- if (vamplevel == 4)
+ if(vamplevel == 4)
SelectReputation(am_fledgling=FALSE, forced=TRUE)
to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, resistence, health, feed rate, regen rate, and maximum blood have all increased!")
to_chat(owner.current, "Your existing powers have all ranked up as well!")
@@ -485,7 +487,7 @@ datum/antagonist/bloodsucker/proc/SpendRank()
// - Warms up the body
// - Creates a heartbeat
// - Fake blood amount (550)
-// Feign DEATH:
+// Feign DEATH: Not yet done
// - When lying down or sitting, you appear "dead and lifeless"
// * Bloodsuckers REGENERATE
diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
index d319017ede..b901b2a88f 100644
--- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
+++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
@@ -109,38 +109,17 @@
var/disloyalty_offered = FALSE // Has the popup been issued? Don't spam them.
var/convert_cost = 10
-//obj/structure/kitchenspike/vassalrack/crowbar_act()
-// // Do Nothing (Cancel crowbar deconstruct)
-// return FALSE
-
/obj/structure/bloodsucker/vassalrack/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/metal(src.loc, 4)
new /obj/item/stack/rods(loc, 4)
qdel(src)
-/*
- /obj/structure/closet/CtrlShiftClick(mob/living/user)
- if(!user.has_trait(TRAIT_SKITTISH))
- return ..()
- if(!user.canUseTopic(src) || !isturf(user.loc))
- return
- dive_into(user)
-*/
-
-
-
-// adding a STRAP on top of an icon: look at update_icon in closets.dm, and the use of overlays.dm cut_overlay() and add_overlay()
-
-
-
-
/obj/structure/bloodsucker/vassalrack/MouseDrop_T(atom/movable/O, mob/user)
if (!O.Adjacent(src) || O == user || !isliving(O) || !isliving(user) || useLock || has_buckled_mobs() || user.incapacitated())
return
if (!anchored && user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
to_chat(user, "Until this rack is secured in place, it cannot serve its purpose.")
return
-
// PULL TARGET: Remember if I was pullin this guy, so we can restore this
var/waspulling = (O == owner.pulling)
var/wasgrabstate = owner.grab_state
@@ -463,7 +442,7 @@
///obj/structure/bloodsucker/candelabrum/is_hot() // candle.dm
//return FALSE
-/datum/component/nanites/Destroy()
+/obj/structure/bloodsucker/candelabrum/Destroy()
STOP_PROCESSING(SSobj, src)
/obj/structure/bloodsucker/candelabrum/update_icon()
diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm
index 63f8838882..f93d4d4261 100644
--- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm
+++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm
@@ -33,73 +33,60 @@
/datum/antagonist/bloodsucker/proc/RunLair()
set waitfor = FALSE // Don't make on_gain() wait for this function to finish. This lets this code run on the side.
-
- while (!AmFinalDeath() && coffin && lair)
-
- // WAit 1 min and Repeat
- sleep(60)
-
+ while(!AmFinalDeath() && coffin && lair)
+ // WAit 2 min and Repeat
+ sleep(120)
// Coffin Moved SOMEHOW?
- if (lair != get_area(coffin))
- if (coffin)
+ if(lair != get_area(coffin))
+ if(coffin)
coffin.UnclaimCoffin()
//lair = get_area(coffin)
break // DONE
-
var/list/turf/area_turfs = get_area_turfs(lair)
-
-
// Create Dirt etc.
var/turf/T_Dirty = pick(area_turfs)
- if (T_Dirty && !T_Dirty.density)
+ if(T_Dirty && !T_Dirty.density)
// Default: Dirt
-
// CHECK: Cobweb already there?
//if (!locate(var/obj/effect/decal/cleanable/cobweb) in T_Dirty) // REMOVED! Cleanables don't stack.
-
// STEP ONE: COBWEBS
-
// CHECK: Wall to North?
var/turf/check_N = get_step(T_Dirty, NORTH)
- if (istype(check_N, /turf/closed/wall))
+ if(istype(check_N, /turf/closed/wall))
// CHECK: Wall to West?
var/turf/check_W = get_step(T_Dirty, WEST)
- if (istype(check_W, /turf/closed/wall))
+ if(istype(check_W, /turf/closed/wall))
new /obj/effect/decal/cleanable/cobweb (T_Dirty)
// CHECK: Wall to East?
var/turf/check_E = get_step(T_Dirty, EAST)
- if (istype(check_E, /turf/closed/wall))
+ if(istype(check_E, /turf/closed/wall))
new /obj/effect/decal/cleanable/cobweb/cobweb2 (T_Dirty)
-
// STEP TWO: DIRT
new /obj/effect/decal/cleanable/dirt (T_Dirty)
-
-
// Find Animals in Area
- if (rand(0,2) == 0)
+ if(rand(0,2) == 0)
var/mobCount = 0
var/mobMax = CLAMP(area_turfs.len / 25, 1, 4)
for (var/turf/T in area_turfs)
- if (!T) continue
+ if(!T) continue
var/mob/living/simple_animal/SA = locate() in T
- if (SA)
+ if(SA)
mobCount ++
if (mobCount >= mobMax) // Already at max
break
// Spawn One
- if (mobCount < mobMax)
+ if(mobCount < mobMax)
// Seek Out Location
- while (area_turfs.len > 0)
+ while(area_turfs.len > 0)
+ sleep(240) //We dont want this to happen often
var/turf/T = pick(area_turfs) // We use while&pick instead of a for/loop so it's random, rather than from the top of the list.
- if (T && !T.density)
+ if(T && !T.density)
var/mob/living/simple_animal/SA = /mob/living/simple_animal/mouse // pick(/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse, /mob/living/simple_animal/hostile/retaliate/bat) //prob(300) /mob/living/simple_animal/mouse,
new SA (T)
break
area_turfs -= T
-
// NOTE: area_turfs is now cleared out!
- if (coffin)
+ if(coffin)
coffin.UnclaimCoffin()
-
// Done (somehow)
lair = null
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm b/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm
index 7754e27a76..a7401b0214 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm
@@ -22,22 +22,24 @@
return
. = TRUE
// Break Out of Restraints! (And then cancel)
- if (CheckBreakRestraints())
+ if(CheckBreakRestraints())
//PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!DEACTIVATE!
. = FALSE //return FALSE
// Throw Off Attacker! (And then cancel)
- if (CheckEscapePuller())
+ if(CheckEscapePuller())
//PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!DEACTIVATE!
. = FALSE //return FALSE
- // Did we successfuly use power to BREAK CUFFS and/or ESCAPE PULLER?
+ /*if(CheckBreakLocker())
+ .= FALSE */
+ // Did we successfuly use power to BREAK CUFFS and/or ESCAPE PULLER and/or escape from a locker?
// Then PAY COST!
- if (. == FALSE)
+ if(. == FALSE)
PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!DEACTIVATE!
// NOTE: We use . = FALSE so that we can break cuffs AND throw off our attacker in one use!
//return TRUE
/datum/action/bloodsucker/targeted/brawn/CheckValidTarget(atom/A)
- return isliving(A) || istype(A, /obj/machinery/door) || istype(A, /obj/structure/closet)
+ return isliving(A) || istype(A, /obj/machinery/door))
/datum/action/bloodsucker/targeted/brawn/CheckCanTarget(atom/A, display_error)
// DEFAULT CHECKS (Distance)
@@ -53,10 +55,7 @@
if(isliving(A))
return TRUE
// Target Type: Door
- else if(upgrade_canDoor && istype(A, /obj/machinery/door))
- return TRUE
- // Target Type: Closet
- else if(upgrade_canLocker && istype(A, /obj/structure/closet))
+ else if(istype(A, /obj/machinery/door))
return TRUE
return ..() // yes, FALSE! You failed if you got here! BAD TARGET
@@ -88,30 +87,21 @@
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))
+ else if(istype(target, /obj/machinery/door))
+ var/obj/machinery/door/D = target
playsound(get_turf(usr), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1)
- if (do_mob(usr,target,25))
- var/obj/machinery/door/D = target
+ to_chat(user, "You prepare to tear open [D].")
+ if(do_mob(usr,target,25))
if (D.Adjacent(user))
- to_chat(user, "You prepare to tear open [D].")
+ to_chat(user, "You tear open the [D].")
user.Stun(10)
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)
- if (do_mob(usr,target,25))
- var/obj/structure/closet/C = target
- to_chat(user, "You prepare to tear open the [C].")
- user.Stun(10)
- user.do_attack_animation(C, ATTACK_EFFECT_SMASH)
- 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()
+ if(!iscarbon(owner)) // || !owner.restrained()
return FALSE
// (NOTE: Just like biodegrade.dm, we only remove one thing per use //
// Destroy Cuffs
@@ -125,18 +115,18 @@
user_C.clear_cuffs(O,TRUE)
playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1)
return TRUE
-
+/* Doesnt work
// Destroy Straightjacket
- if (ishuman(owner))
+ if(ishuman(owner))
var/mob/living/carbon/human/user_H = owner
if(user_H.wear_suit && user_H.wear_suit.breakouttime)
- var/obj/item/clothing/suit/S = user_H.get_item_by_slot(ITEM_SLOT_ICLOTHING)
+ var/obj/item/clothing/suit/straight_jacket/S = user_H.get_item_by_slot(ITEM_SLOT_ICLOTHING)
if(istype(S))
user_C.visible_message("[user_C] attempts to remove [S]!", \
"You rip through [S] like it's nothing!")
user_C.clear_cuffs(S,TRUE)
playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1)
- return TRUE
+ return TRUE */
// Destroy Leg Cuffs
if(user_C.legcuffed)
var/obj/O = user_C.get_item_by_slot(SLOT_LEGCUFFED)
@@ -149,7 +139,7 @@
return FALSE
/datum/action/bloodsucker/targeted/brawn/proc/CheckEscapePuller()
- if (!owner.pulledby)// || owner.pulledby.grab_state <= GRAB_PASSIVE)
+ if(!owner.pulledby)// || owner.pulledby.grab_state <= GRAB_PASSIVE)
return FALSE
var/mob/M = owner.pulledby
var/pull_power = M.grab_state
@@ -169,3 +159,16 @@
"You shrug off [M]'s grasp!")
owner.pulledby = null // It's already done, but JUST IN CASE.
return TRUE
+/* Doesnt work
+/datum/action/bloodsucker/targeted/brawn/proc/CheckBreakLocker()
+ if(!istype(owner.loc, /obj/structure/closet))
+ return FALSE
+ playsound(get_turf(owner), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1)
+ if(do_mob(owner ,target, 25))
+ var/obj/structure/closet/C = owner.loc
+ to_chat(owner, "You prepare to tear open the [C].")
+ owner.do_attack_animation(C, ATTACK_EFFECT_SMASH)
+ playsound(get_turf(C), 'sound/effects/bang.ogg', 30, 1, -1)
+ C.bust_open()
+ return TRUE
+*/
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
index 2612ad659e..7a00f97382 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm
@@ -11,9 +11,6 @@
warn_constant_cost = TRUE
var/light_min = 0.5 // If lum is above this, no good.
- var/remember_start_loc // Where this power was activated, so it can be checked from ContinueActive
- // Level Up
- var/upgrade_canMove = FALSE // Can I move around with this power?
/datum/action/bloodsucker/cloak/CheckCanUse(display_error)
. = ..()
@@ -30,19 +27,11 @@
var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
var/mob/living/user = owner
- remember_start_loc = user.loc
-
- // Freeze in Place (so you don't auto-cancel)
-//user.mobility_flags &= ~MOBILITY_MOVE
while (bloodsuckerdatum && ContinueActive(user))
-
- //if (!do_mob(user, user, 10, 0, 0, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))
- // return
-
// Fade from sight
owner.alpha = max(0, owner.alpha - min(75, 20 + 15 * level_current))
bloodsuckerdatum.AddBloodVolume(-0.2)
-
+ ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
sleep(5)
/datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target)
@@ -52,12 +41,8 @@
if(user.stat == !CONSCIOUS)
to_chat(owner, "Your cloak failed due to you falling unconcious! ")
return FALSE
- // Must be SAME LOCATION
- var/turf/T = owner.loc
- if (!upgrade_canMove && T != remember_start_loc)
- to_chat(owner, "Your cloak is not yet powerfull enough to allow you to move!")
- return FALSE
// Must be DARK
+ var/turf/T = owner.loc
if(istype(T) && T.get_lumcount() > light_min)
to_chat(owner, "Your cloak failed due to there being too much light!")
return FALSE
@@ -66,4 +51,5 @@
/datum/action/bloodsucker/cloak/DeactivatePower(mob/living/user = owner, mob/living/target)
..()
+ REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
user.alpha = 255
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_gohome.dm b/code/modules/antagonists/bloodsucker/powers/bs_gohome.dm
index 514fa8805a..2f1526284a 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_gohome.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_gohome.dm
@@ -94,7 +94,7 @@
puff.set_up(3, 0, get_turf(owner))
puff.start()
// TELEPORT: Move to Coffin & Close it!
- do_teleport(owner, bloodsuckerdatum.coffin, no_effects=TRUE) // in teleport.dm?
+ do_teleport(owner, bloodsuckerdatum.coffin, no_effects = TRUE, forced = TRUE) // in teleport.dm?
// SLEEP
user.resting = TRUE
//user.Unconscious(30,0)
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_haste.dm b/code/modules/antagonists/bloodsucker/powers/bs_haste.dm
index b9e35c6a4b..5755931d64 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_haste.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_haste.dm
@@ -20,10 +20,14 @@
if(!.)
return
// Being Grabbed
- if (owner.pulledby && owner.pulledby.grab_state >= GRAB_AGGRESSIVE)
- if (display_error)
+ if(owner.pulledby && owner.pulledby.grab_state >= GRAB_AGGRESSIVE)
+ if(display_error)
to_chat(owner, "You're being grabbed!")
return FALSE
+ if(!owner.has_gravity(owner.loc)) //We dont want people to be able to use this to fly around in space
+ if(display_error)
+ to_chat(owner, "You cant dash while floating!")
+ return FALSE
return TRUE
/datum/action/bloodsucker/targeted/haste/CheckValidTarget(atom/A)
@@ -67,9 +71,6 @@
if (rand(0, 5) < level_current)
playsound(get_turf(newtarget), "sound/weapons/punch[rand(1,4)].ogg", 15, 1, -1)
newtarget.Knockdown(10 + level_current * 5)
- newtarget.adjustStaminaLoss(10 + 5 * level_current)
- newtarget.Stun(5 + level_current * 2)
- newtarget.adjustStaminaLoss(5 + 3 * level_current)
if(newtarget.IsStun())
newtarget.spin(10,1)
if (rand(0,4))
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm b/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm
index 53b8365b44..2c1b8d6321 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm
@@ -17,10 +17,14 @@
if(!..(display_error))// DEFAULT CHECKS
return FALSE
// Being Grabbed
- if (owner.pulledby && owner.pulledby.grab_state >= GRAB_AGGRESSIVE)
- if (display_error)
+ if(owner.pulledby && owner.pulledby.grab_state >= GRAB_AGGRESSIVE)
+ if(display_error)
to_chat(owner, "You're being grabbed!")
return FALSE
+ if(!owner.has_gravity(owner.loc))//TODO figure out how to check if theyre able to move while in nograv
+ if(display_error)
+ to_chat(owner, "You cant lunge while floating!")
+ return FALSE
return TRUE
/datum/action/bloodsucker/targeted/lunge/CheckValidTarget(atom/A)
@@ -28,7 +32,7 @@
/datum/action/bloodsucker/targeted/lunge/CheckCanTarget(atom/A, display_error)
// Check: Self
- if (target == owner)
+ if(target == owner)
return FALSE
// Check: Range
//if (!(target in view(target_range, get_turf(owner))))
@@ -36,11 +40,11 @@
// to_chat(owner, "Your victim is too far away.")
// return FALSE
// DEFAULT CHECKS (Distance)
- if (!..())
+ if(!..())
return FALSE
// Check: Turf
var/mob/living/L = A
- if (!isturf(L.loc))
+ if(!isturf(L.loc))
return FALSE
return TRUE
@@ -56,6 +60,7 @@
// 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)
@@ -64,7 +69,7 @@
sleep(1)
if(target.Adjacent(owner))
// LEVEL 2: If behind target, mute or unconscious!
- if (do_knockdown) // && level_current >= 1)
+ 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)
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
index 789f5e860b..4d4520c8b3 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm
@@ -94,8 +94,8 @@
if(do_mob(user, target, 40, 0, TRUE, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))
PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!
- target.silent += 100 + level_current * 15
var/power_time = 90 + level_current * 15
+ target.silent += power_time + 50
target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 100 + level_current * 15)
to_chat(user, "[target] is fixed in place by your hypnotic gaze.")
target.Stun(power_time)
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_trespass.dm b/code/modules/antagonists/bloodsucker/powers/bs_trespass.dm
index 9e3ee8939d..9b266a4cfe 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_trespass.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_trespass.dm
@@ -101,7 +101,7 @@
// Move & Freeze
if (isturf(target_turf))
- do_teleport(owner, target_turf, no_effects=TRUE) // in teleport.dm?
+ do_teleport(owner, target_turf, no_effects=TRUE, forced = TRUE) // in teleport.dm?
user.next_move = world.time + mist_delay / 2
user.Stun(mist_delay / 2, ignore_canstun = TRUE)
diff --git a/code/modules/antagonists/bloodsucker/powers/v_recuperate.dm b/code/modules/antagonists/bloodsucker/powers/v_recuperate.dm
index 27277b215b..0595b83eda 100644
--- a/code/modules/antagonists/bloodsucker/powers/v_recuperate.dm
+++ b/code/modules/antagonists/bloodsucker/powers/v_recuperate.dm
@@ -33,7 +33,7 @@
C.heal_overall_damage(bruteheal)
C.blood_volume -= 0.6
if (C.getStaminaLoss() < 60)
- C.adjustStaminaLoss(25, forced = TRUE)
+ C.adjustStaminaLoss(10, forced = TRUE)
// Stop Bleeding
if (istype(H) && H.bleed_rate > 0 && rand(20) == 0)
H.bleed_rate --
@@ -41,7 +41,7 @@
C.Jitter(5)
- sleep(20)
+ sleep(10)
// DONE!
//DeactivatePower(owner)
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 069190d9e0..069317d4a8 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -177,6 +177,8 @@
bodies = old_species.bodies
/datum/species/jelly/slime/spec_life(mob/living/carbon/human/H)
+ if((HAS_TRAIT(H, TRAIT_NOMARROW)))
+ return
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
if(prob(5))
to_chat(H, "You feel very bloated!")
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 88e766edfc..9141a6d299 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -180,7 +180,7 @@
else
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color())
- if(iscarbon(L))
+ if(iscarbon(L) && !HAS_TRAIT(L, TRAIT_NOMARROW))
var/mob/living/carbon/C = L
C.bleed(damage)
else
diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi
index ed83aea17f..a93a4e38d5 100644
Binary files a/icons/mob/inhands/weapons/melee_righthand.dmi and b/icons/mob/inhands/weapons/melee_righthand.dmi differ