From 8be0c7b5876818fe631cf6a2d187e90142277646 Mon Sep 17 00:00:00 2001 From: Ms-Mee <88832933+Ms-Mee@users.noreply.github.com> Date: Tue, 28 Nov 2023 22:31:23 -0300 Subject: [PATCH] Return of the morbius real (fake) (real) (#9) * now everything is actually proper this time * just a wee bit more I forgord * AAAAAAAAAAAAAAAAAA * there * KILLS YOU KILLS YOU KILLS YOU * no permanent hungy overlay no thank you --- code/__DEFINES/DNA.dm | 1 + .../subsystem/processing/quirks.dm | 6 +- code/datums/blood_type.dm | 23 ++- code/datums/traits/neutral.dm | 173 ++++++++++++++++++ code/game/machinery/cryopod.dm | 10 +- .../modules/mob/dead/new_player/new_player.dm | 22 +-- code/modules/mob/living/blood.dm | 2 +- code/modules/mob/living/carbon/life.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 88 ++++++++- code/modules/surgery/organs/heart.dm | 2 +- 10 files changed, 300 insertions(+), 29 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 8cdb11fd00b..0ada4fba276 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -135,6 +135,7 @@ #define NO_BONES 25 //! You don't have any bones for breaking #define MUTCOLORS_SECONDARY 26 //! A second mutant colour for other things #define SKINCOLORS 27 //Human skintones +#define NOHEART 28 //Heartless vampires! //organ slots #define ORGAN_SLOT_BRAIN "brain" diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index b5b8113384d..394be6bad9d 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -24,9 +24,11 @@ PROCESSING_SUBSYSTEM_DEF(quirks) list("Ananas Affinity","Ananas Aversion"), \ list("Alcohol Tolerance","Light Drinker"), \ list("Clown Fan","Mime Fan"), \ - list("Bad Touch", "Friendly")) + list("Bad Touch", "Friendly"), \ + list("Blood Deficiency", "Vampirism")) - species_blacklist = list("Blood Deficiency" = list(SPECIES_IPC, SPECIES_JELLYPERSON, SPECIES_PLASMAMAN, SPECIES_VAMPIRE)) + species_blacklist = list("Blood Deficiency" = list(SPECIES_IPC, SPECIES_JELLYPERSON, SPECIES_PLASMAMAN, SPECIES_VAMPIRE), \ + "Vampirism" = list(SPECIES_IPC, SPECIES_JELLYPERSON, SPECIES_PLASMAMAN, SPECIES_ETHEREAL, SPECIES_VAMPIRE)) for(var/client/client in GLOB.clients) client?.prefs.check_quirk_compatibility() diff --git a/code/datums/blood_type.dm b/code/datums/blood_type.dm index 9541699db92..b7389c5f46e 100644 --- a/code/datums/blood_type.dm +++ b/code/datums/blood_type.dm @@ -8,35 +8,35 @@ /datum/blood_type/a_minus name = "A-" - compatible_types = list(/datum/blood_type/a_minus, /datum/blood_type/o_minus) + compatible_types = list(/datum/blood_type/a_minus, /datum/blood_type/o_minus, /datum/blood_type/morbius) /datum/blood_type/a_plus name = "A+" - compatible_types = list(/datum/blood_type/a_minus, /datum/blood_type/a_plus, /datum/blood_type/o_minus, /datum/blood_type/o_plus) + compatible_types = list(/datum/blood_type/a_minus, /datum/blood_type/a_plus, /datum/blood_type/o_minus, /datum/blood_type/o_plus, /datum/blood_type/morbius) /datum/blood_type/b_minus name = "B-" - compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/o_minus) + compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/o_minus, /datum/blood_type/morbius) /datum/blood_type/b_plus name = "B+" - compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/b_plus, /datum/blood_type/o_minus, /datum/blood_type/o_plus) + compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/b_plus, /datum/blood_type/o_minus, /datum/blood_type/o_plus, /datum/blood_type/morbius) /datum/blood_type/ab_minus name = "AB-" - compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/a_minus, /datum/blood_type/ab_minus, /datum/blood_type/o_minus) + compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/a_minus, /datum/blood_type/ab_minus, /datum/blood_type/o_minus, /datum/blood_type/morbius) /datum/blood_type/ab_plus name = "AB+" - compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/a_minus, /datum/blood_type/ab_minus, /datum/blood_type/o_minus) + compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/b_plus, /datum/blood_type/a_minus, /datum/blood_type/a_plus, /datum/blood_type/ab_minus, /datum/blood_type/ab_plus, /datum/blood_type/o_minus, /datum/blood_type/o_plus, /datum/blood_type/morbius) /datum/blood_type/o_minus name = "O-" - compatible_types = list(/datum/blood_type/o_minus) + compatible_types = list(/datum/blood_type/o_minus, /datum/blood_type/morbius) /datum/blood_type/o_plus name = "O+" - compatible_types = list(/datum/blood_type/o_minus, /datum/blood_type/o_plus) + compatible_types = list(/datum/blood_type/o_minus, /datum/blood_type/o_plus, /datum/blood_type/morbius) /datum/blood_type/xenomorph //for xenomorph gib dna name = "X" @@ -50,7 +50,7 @@ /datum/blood_type/lizard name = "L" color = "#009696" - compatible_types = list(/datum/blood_type/lizard) + compatible_types = list(/datum/blood_type/lizard, /datum/blood_type/morbius) /datum/blood_type/elzuosa name = "E" @@ -62,6 +62,11 @@ color = "#dddeff" compatible_types = list(/datum/blood_type/synthetic) +/datum/blood_type/morbius //It's morbing blood!! + name = "Draculine" + color = "#6e1b42" + compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/b_plus, /datum/blood_type/a_minus, /datum/blood_type/a_plus, /datum/blood_type/ab_minus, /datum/blood_type/ab_plus, /datum/blood_type/o_minus, /datum/blood_type/o_plus, /datum/blood_type/lizard, /datum/blood_type/animal, /datum/blood_type/morbius, /datum/blood_type/universal, /datum/blood_type/lizard) + /datum/blood_type/universal name = "U" diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index b92a3d137dc..d75b722d604 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -226,3 +226,176 @@ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "bad_hair_day", /datum/mood_event/bald) +/datum/quirk/vampire + name = "Vampirism" + desc = "You're a bloodsucking vampire, able to suck the blood of others, heal in coffins, transfer to them your own, and you're undead, do be careful not to run out of blood or give others too much of your own, lest peril come. This is not a license to grief." + value = 0 + gain_text = "Your blood is accursed, feed on others lest you become dry and fall apart, however your blood is also helpful to others which are not vampires, and you may gift them, careful for them not to become like you." + lose_text = "You feel blessed, your blood no longer cursed." + medical_record_text = "Patient is a vampire." + mob_traits = list(TRAIT_NOBREATH, TRAIT_NOHUNGER) + var/old_blood + var/obj/item/organ/heart/old_heart + var/datum/action/vampire_quirk_drain/vampire_drain + var/datum/action/vampire_quirk_transfer/vampire_transfer + var/list/old_traits + var/list/old_biotypes + var/list/species_traits = list(NOHEART, DRINKSBLOOD) + +/datum/quirk/vampire/add() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/organ/heart/current_heart = H.getorganslot(ORGAN_SLOT_HEART) + old_heart = current_heart.type + vampire_drain = new + vampire_transfer = new + vampire_drain.Grant(H) + vampire_transfer.Grant(H) + old_blood = H.dna.blood_type + H.dna.species.exotic_blood = /datum/reagent/blood/true_draculine + H.dna.blood_type = get_blood_type("Draculine") + H.dna.species.species_traits |= species_traits + H.dna.species.inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID + +/datum/quirk/vampire/post_add() + if(!quirk_holder.mind || quirk_holder.mind.special_role) + return + to_chat(quirk_holder, "Please note that your vampirism does NOT give you the right to attack people or otherwise cause any interference to \ + the round without reason or escalation. You are not an antagonist, and the rules will treat you the same as other crewmembers.") + +/datum/quirk/vampire/remove() + if(quirk_holder) + var/mob/living/carbon/human/H = quirk_holder + if(vampire_drain) + vampire_drain.Remove(H) + if(vampire_transfer) + vampire_transfer.Remove(H) + H.dna.species.exotic_blood = "" + H.dna.blood_type = old_blood + if(!H.getorganslot(ORGAN_SLOT_HEART)) + old_heart = new + old_heart.Insert(H) + H.dna.species.species_traits ^= species_traits + H.dna.species.inherent_biotypes = old_biotypes + +/datum/quirk/vampire/on_process() + var/mob/living/carbon/human/C = quirk_holder + if(istype(C.loc, /obj/structure/closet/crate/coffin)) + C.heal_overall_damage(2,2,0, BODYPART_ORGANIC) + C.adjustToxLoss(-2) + C.adjustOxyLoss(-2) + C.adjustCloneLoss(-2) + return + if(!C.client) //Can't blame no one for no disconnects + return + C.blood_volume -= max(C.blood_volume/3500, 0.07) + if(C.blood_volume <= BLOOD_VOLUME_BAD) + if(prob(5) && C.blood_volume > BLOOD_VOLUME_SURVIVE) + to_chat(C, "You're running out of blood!") + if(C.blood_volume <= BLOOD_VOLUME_SURVIVE) + to_chat(C, "You ran out of blood!") + C.death() + C.Drain() + +#define VAMP_DRAIN_AMOUNT 20 + +/datum/action/vampire_quirk_drain + name = "Drain Victim" + desc = "Leech blood from any compatible victim you are passively grabbing." + check_flags = AB_CHECK_CONSCIOUS + icon_icon = 'icons/effects/bleed.dmi' + button_icon_state = "bleed1" + +/datum/action/vampire_quirk_drain/Trigger() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/H = owner + if(H.quirk_cooldown["Vampire"] >= world.time) + return + while(H.pulling && iscarbon(H.pulling) && H.grab_state == GRAB_PASSIVE) + var/mob/living/carbon/victim = H.pulling + if(H.blood_volume >= BLOOD_VOLUME_MAXIMUM) + to_chat(H, "You're already full!") + break + if(victim.stat == DEAD) + to_chat(H, "You need a living victim!") + break + if(!victim.blood_volume || (victim.dna && ((NOBLOOD in victim.dna.species.species_traits) || !(victim.dna.blood_type.type in H.dna.blood_type.compatible_types)))) + to_chat(H, "[victim] doesn't have suitable blood!") + break + H.quirk_cooldown["Vampire"] = world.time + 30 + if(victim.anti_magic_check(FALSE, TRUE, FALSE, 0)) + to_chat(victim, "[H] tries to bite you, but stops before touching you!") + to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") + break + if(victim?.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + to_chat(victim, "[H] tries to bite you, but recoils in disgust!") + to_chat(H, "[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.") + break + if(!do_after(H, 30, target = victim)) + break + var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood + var/drained_blood = min(victim.blood_volume, VAMP_DRAIN_AMOUNT, blood_volume_difference) + to_chat(victim, "[H] is draining your blood!") + to_chat(H, "You drain some blood!") + playsound(H, 'sound/items/drink.ogg', 30, TRUE, -2) + victim.blood_volume = clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + H.blood_volume = clamp(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + if(!victim.blood_volume) + to_chat(H, "You finish off [victim]'s blood supply.") + +#undef VAMP_DRAIN_AMOUNT + +#define VAMP_TRANSFER_AMOUNT 5 + +/datum/action/vampire_quirk_transfer + name = "Blood Transfer" + desc = "Transfer your own tainted blood to one from which you could feed." + check_flags = AB_CHECK_CONSCIOUS + icon_icon = 'icons/effects/bleed.dmi' + button_icon_state = "bleed9" + +/datum/action/vampire_quirk_transfer/Trigger() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/H = owner + if(H.quirk_cooldown["Vampire Transfer"] >= world.time) + return + if(H.pulling && iscarbon(H.pulling) && H.grab_state == GRAB_PASSIVE) + var/mob/living/carbon/victim = H.pulling + if(victim.blood_volume >= BLOOD_VOLUME_MAXIMUM) + to_chat(H, "They're already full!") + return + if(victim.stat == DEAD) + to_chat(H, "You need to transfer blood to a living being!") + return + if(!victim.blood_volume || (victim.dna && ((NOBLOOD in victim.dna.species.species_traits) || !(victim.dna.blood_type.type in H.dna.blood_type.compatible_types)))) + to_chat(H, "[victim] doesn't have suitable blood!") + return + H.quirk_cooldown["Vampire Transfer"] = world.time + 20 + if(victim.anti_magic_check(FALSE, TRUE, FALSE, 0)) + to_chat(victim, "[H] tries to twist you, but stops before touching you!") + to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") + return + if(victim?.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + to_chat(victim, "[H] tries to twist you, but recoils in disgust!") + to_chat(H, "[victim] reeks of garlic! you can't bring yourself to twist such tainted blood.") + return + if(!do_after(H, 20, target = victim)) + return + var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - victim.blood_volume //How much capacity we have left to transfer blood + var/transfered_blood = min(H.blood_volume, VAMP_TRANSFER_AMOUNT, blood_volume_difference) + to_chat(victim, "You feel darkness leaving[H] and entering you!") + to_chat(H, "You transfer blood to [victim]!") + playsound(H, 'sound/items/drink.ogg', 30, TRUE, -2) + H.blood_volume = clamp(H.blood_volume - transfered_blood, 0, BLOOD_VOLUME_MAXIMUM) + var/blood_id = H.get_blood_id() + var/list/blood_data = H.get_blood_data(blood_id) + victim.reagents.add_reagent(blood_id, transfered_blood, blood_data, H.bodytemperature) + +#undef VAMP_TRANSFER_AMOUNT + + +/mob/living/carbon/get_status_tab_items() + . = ..() + if(has_quirk(/datum/quirk/vampire)) + . += "Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM]." diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index ebc5479eccc..8a0e3af47be 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -431,9 +431,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/retro, 17) /obj/machinery/cryopod/apply_effects_to_mob(mob/living/carbon/sleepyhead) //it always sucks a little to get up - sleepyhead.set_nutrition(200) + if(HAS_TRAIT(sleepyhead, TRAIT_NOHUNGER)) + to_chat(sleepyhead, "Unlike most, you're fortunate enough to feel no hunger...") + else + sleepyhead.set_nutrition(200) + to_chat(sleepyhead, "A dull hunger pangs in your stomach as you awaken...") sleepyhead.SetSleeping(60) //if you read this comment and feel like shitting together something to adjust elzu and IPC charge on wakeup, be my guest. - to_chat(sleepyhead, "A dull hunger pangs in your stomach as you awaken...") @@ -442,7 +445,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/retro, 17) desc = "Keeps crew frozen in cryostasis until they are needed in order to cut down on supply usage. This one seems cheaply made." /obj/machinery/cryopod/poor/apply_effects_to_mob(mob/living/carbon/sleepyhead) - sleepyhead.set_nutrition(200) + if(!HAS_TRAIT(sleepyhead, TRAIT_NOHUNGER)) + sleepyhead.set_nutrition(200) sleepyhead.SetSleeping(80) if(prob(90)) sleepyhead.apply_effect(rand(5,15), EFFECT_DROWSY) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index d7865c9d227..8963804f5c5 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -314,17 +314,6 @@ if(isliving(equip)) //Borgs get borged in the equip, so we need to make sure we handle the new mob. character = equip - if(job && !job.override_latejoin_spawn(character)) - var/atom/spawn_point = pick(ship.shuttle_port.spawn_points) - spawn_point.join_player_here(character) - var/atom/movable/screen/splash/Spl = new(character.client, TRUE) - Spl.Fade(TRUE) - character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) - - character.update_parallax_teleport() - - character.client.init_verbs() // init verbs for the late join - if(ishuman(character)) //These procs all expect humans var/mob/living/carbon/human/humanc = character ship.manifest_inject(humanc, client, job) @@ -342,6 +331,17 @@ if(CONFIG_GET(flag/roundstart_traits)) SSquirks.AssignQuirks(humanc, humanc.client, TRUE) + if(job && !job.override_latejoin_spawn(character)) + var/atom/spawn_point = pick(ship.shuttle_port.spawn_points) + spawn_point.join_player_here(character) + var/atom/movable/screen/splash/Spl = new(character.client, TRUE) + Spl.Fade(TRUE) + character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) + + character.update_parallax_teleport() + + character.client.init_verbs() // init verbs for the late join + GLOB.joined_player_list += character.ckey log_manifest(character.mind.key, character.mind, character, TRUE) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index aec75960989..a119a8c8cf5 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -52,7 +52,7 @@ nutrition_ratio *= 1.25 adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR) blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio) - if(blood_volume < BLOOD_VOLUME_NORMAL && HAS_TRAIT(src, TRAIT_NOHUNGER)) //blood regen for non eaters + if(blood_volume < BLOOD_VOLUME_NORMAL && HAS_TRAIT(src, TRAIT_NOHUNGER) && !(NOHEART in dna.species.species_traits)) //blood regen for non eaters blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * 1.25) //assumes best nutrition conditions for non eaters because they don't eat //Effects of bloodloss diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 0fc21db37d8..3031edda549 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -762,7 +762,7 @@ All effects don't start immediately, but rather get worse over time; the rate is /mob/living/carbon/proc/needs_heart() if(HAS_TRAIT(src, TRAIT_STABLEHEART)) return FALSE - if(dna && dna.species && (NOBLOOD in dna.species.species_traits)) //not all carbons have species! + if(dna && dna.species && (NOBLOOD in dna.species.species_traits) || (NOHEART in dna.species.species_traits)) //not all carbons have species! return FALSE return TRUE diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 9915ca9c4d2..3b4eed18f32 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -25,7 +25,7 @@ if(iscarbon(L)) var/mob/living/carbon/exposed_carbon = L - if(exposed_carbon.get_blood_id() == /datum/reagent/blood && (method == INJECT || (method == INGEST && exposed_carbon.dna && exposed_carbon.dna.species && (DRINKSBLOOD in exposed_carbon.dna.species.species_traits)))) + if((exposed_carbon.get_blood_id() == /datum/reagent/blood || exposed_carbon.get_blood_id() == /datum/reagent/blood/true_draculine) && (method == INJECT || (method == INGEST && exposed_carbon.dna && exposed_carbon.dna.species && (DRINKSBLOOD in exposed_carbon.dna.species.species_traits)))) if(data && data["blood_type"]) var/datum/blood_type/blood_type = data["blood_type"] if(blood_type.type in exposed_carbon.dna.blood_type.compatible_types) @@ -33,6 +33,92 @@ return exposed_carbon.reagents.add_reagent(/datum/reagent/toxin, reac_volume * 0.5) +/datum/reagent/blood/true_draculine + name = "True Draculine" + description = "Slowly heals all damage types. Overdose will, after a short while, turn you into a vampire, addiction lowers your max health as your body attempts to fight off the corruption, if you're incompatible you're immune to the addiction and overdose will damage you instead." + metabolization_rate = 1 + addiction_threshold = 20 + overdose_threshold = 30 + var/healing = 0.20 + +/datum/reagent/blood/true_draculine/on_mob_add(mob/living/carbon/human/M) + if(M.dna.species.exotic_blood) + src.addiction_threshold = 0 + if(M.dna.species.exotic_blood == /datum/reagent/blood/true_draculine) + src.overdose_threshold = 0 + ..() + +/datum/reagent/blood/true_draculine/on_mob_life(mob/living/carbon/human/M) + if(M.dna.species.exotic_blood != /datum/reagent/blood/true_draculine) + M.adjustToxLoss(-healing*REM, 0, TRUE) + M.adjustOxyLoss(-healing*REM, 0) + M.adjustBruteLoss(-healing*REM, 0) + M.adjustFireLoss(-healing*REM, 0) + M.Jitter(2) + . = 1 + ..() + +/datum/reagent/blood/true_draculine/overdose_process(mob/living/carbon/human/M) + if(M.dna.species.exotic_blood) + M.adjustToxLoss(1*REM, 0) + M.adjustOxyLoss(1*REM, 0) + M.adjustBruteLoss(1*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustFireLoss(1*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.Jitter(6) + else + if(current_cycle >= 50) + for(var/datum/reagent/addiction in M.reagents.addiction_list) + if(addiction.name == "True Draculine") + M.reagents.remove_addiction(addiction) + M.add_quirk(/datum/quirk/vampire) + ..() + . = 1 + +/datum/reagent/blood/true_draculine/addiction_act_stage1(mob/living/carbon/human/M) + M.dna.species.species_traits |= list(DRINKSBLOOD) + if(M.health > 60) + M.adjustToxLoss(1.5*REM, 0) + M.adjustOxyLoss(1.5*REM, 0) + M.adjustBruteLoss(1.5*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustFireLoss(1.5*REM, FALSE, FALSE, BODYPART_ORGANIC) + . = 1 + M.Jitter(3) + ..() + +/datum/reagent/blood/true_draculine/addiction_act_stage2(mob/living/M) + if(M.health > 50) + M.adjustToxLoss(2.5*REM, 0) + M.adjustOxyLoss(2.5*REM, 0) + M.adjustBruteLoss(2.5*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustFireLoss(2.5*REM, FALSE, FALSE, BODYPART_ORGANIC) + . = 1 + M.Jitter(4) + ..() + +/datum/reagent/blood/true_draculine/addiction_act_stage3(mob/living/M) + if(M.health > 40) + M.adjustToxLoss(3*REM, 0) + M.adjustOxyLoss(3*REM, 0) + M.adjustBruteLoss(3*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustFireLoss(3*REM, FALSE, FALSE, BODYPART_ORGANIC) + . = 1 + M.Jitter(5) + ..() + +/datum/reagent/blood/true_draculine/addiction_act_stage4(mob/living/M) + if(M.health > 30) + M.adjustToxLoss(5*REM, 0) + M.adjustOxyLoss(5*REM, 0) + M.adjustBruteLoss(5*REM, FALSE, FALSE, BODYPART_ORGANIC) + M.adjustFireLoss(5*REM, FALSE, FALSE, BODYPART_ORGANIC) + . = 1 + M.Jitter(6) + ..() + +/datum/reagent/blood/true_draculine/on_addiction_removal(mob/living/carbon/human/M) + if(!(/datum/quirk/vampire in M.roundstart_quirks)) + M.dna.species.species_traits ^= list(DRINKSBLOOD) + ..() /datum/reagent/blood/on_new(list/data) if(istype(data)) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 26b93d2c464..e2596ec6c0b 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -125,7 +125,7 @@ if(world.time > (last_pump + pump_delay)) if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects. var/mob/living/carbon/human/H = owner - if(H.dna && !(NOBLOOD in H.dna.species.species_traits)) + if(H.dna && (!(NOBLOOD in H.dna.species.species_traits) || ((NOHEART in H.dna.species.species_traits) && H.blood_volume > BLOOD_VOLUME_BAD))) H.blood_volume = max(H.blood_volume - blood_loss, 0) to_chat(H, "You have to keep pumping your blood!") if(add_colour)