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