diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 94ace816ac..5f8c4bf78f 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -363,3 +363,6 @@ #define MAPPING_HELPER_TRAIT "mapping-helper" /// Trait associated with mafia #define MAFIA_TRAIT "mafia" + +/// snowflake blood process (slimes) +#define TRAIT_SNOWFLAKE_BLOOD_PROCESS "snowflake_blood_process" diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 2d3ceb728c..ec1409c7b7 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -38,6 +38,9 @@ if(HAS_TRAIT(src, TRAIT_NOMARROW)) //Bloodsuckers don't need to be here. return + if(HAS_TRAIT(src, TRAIT_SNOWFLAKE_BLOOD_PROCESS)) //slimes regenerate blood in their own way and take damage from not having blood in their own way + return + if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. if(integrating_blood > 0) var/blood_integrated = max(integrating_blood - 1, 0) diff --git a/code/modules/mob/living/carbon/human/innate_abilities/limb_regeneration.dm b/code/modules/mob/living/carbon/human/innate_abilities/limb_regeneration.dm index ce36397c91..672b6f5b7a 100644 --- a/code/modules/mob/living/carbon/human/innate_abilities/limb_regeneration.dm +++ b/code/modules/mob/living/carbon/human/innate_abilities/limb_regeneration.dm @@ -22,28 +22,24 @@ return FALSE return 0 -/datum/action/innate/ability/limb_regrowth/Activate() +/datum/action/innate/limb_regrowth/Activate() var/mob/living/carbon/human/H = owner var/list/limbs_to_heal = H.get_missing_limbs() - if(limbs_to_heal.len < 1) - to_chat(H, "You feel intact enough as it is.") + if(!length(limbs_to_heal)) + to_chat(H, span_notice("You feel intact enough as it is.")) return - to_chat(H, "You focus intently on your missing [limbs_to_heal.len >= 2 ? "limbs" : "limb"]...") - var/mode = H.get_ability_property(INNATE_ABILITY_LIMB_REGROWTH, PROPERTY_LIMB_REGROWTH_USAGE_TYPE) - switch(mode) - if(REGROWTH_USES_BLOOD) - if(H.blood_volume >= 40*limbs_to_heal.len+(BLOOD_VOLUME_OKAY*H.blood_ratio)) - H.regenerate_limbs() - H.blood_volume -= 40*limbs_to_heal.len - to_chat(H, "...and after a moment you finish reforming!") - return - else if(H.blood_volume >= 40)//We can partially heal some limbs - while(H.blood_volume >= (BLOOD_VOLUME_OKAY*H.blood_ratio)+40) - var/healed_limb = pick(limbs_to_heal) - H.regenerate_limb(healed_limb) - limbs_to_heal -= healed_limb - H.blood_volume -= 40 - to_chat(H, "...but there is not enough of you to fix everything! You must attain more mass to heal completely!") - return - to_chat(H, "...but there is not enough of you to go around! You must attain more mass to heal!") - + to_chat(H, span_notice("You focus intently on your missing [length(limbs_to_heal) >= 2 ? "limbs" : "limb"]...")) + if(H.blood_volume >= 40*length(limbs_to_heal)+BLOOD_VOLUME_OKAY) + H.regenerate_limbs() + H.blood_volume -= 40*length(limbs_to_heal) + to_chat(H, span_notice("...and after a moment you finish reforming!")) + return + else if(H.blood_volume >= 40)//We can partially heal some limbs + while(H.blood_volume >= BLOOD_VOLUME_OKAY+40) + var/healed_limb = pick(limbs_to_heal) + H.regenerate_limb(healed_limb) + limbs_to_heal -= healed_limb + H.blood_volume -= 40 + to_chat(H, span_warning("...but there is not enough of you to fix everything! You must attain more mass to heal completely!")) + return + to_chat(H, span_warning("...but there is not enough of you to go around! You must attain more mass to heal!")) 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 13c9aaa8f1..3ab8ca1d07 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -55,38 +55,44 @@ //update blood color to body color exotic_blood_color = "#" + H.dna.features["mcolor"] -/datum/species/jelly/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for bloodsuckers +/datum/species/jelly/spec_life(mob/living/carbon/human/H, delta_time, times_fired) + if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely return - if(!H.blood_volume) - H.adjust_integration_blood(5) - H.adjustBruteLoss(5) - to_chat(H, "You feel empty!") - if(H.blood_volume < (BLOOD_VOLUME_NORMAL * H.blood_ratio)) + if(!H.blood_volume) + H.blood_volume += 2.5 * delta_time + H.adjustBruteLoss(2.5 * delta_time) + to_chat(H, span_danger("You feel empty!")) + + if(H.blood_volume < BLOOD_VOLUME_NORMAL) if(H.nutrition >= NUTRITION_LEVEL_STARVING) - H.adjust_integration_blood(3) - H.nutrition -= 2.5 - if(H.blood_volume < (BLOOD_VOLUME_OKAY*H.blood_ratio)) - if(prob(5)) - to_chat(H, "You feel drained!") - if(H.blood_volume < (BLOOD_VOLUME_BAD*H.blood_ratio)) + H.blood_volume += 1.5 * delta_time + H.adjust_nutrition(-1.25 * delta_time) + + if(H.blood_volume < BLOOD_VOLUME_OKAY) + if(DT_PROB(2.5, delta_time)) + to_chat(H, span_danger("You feel drained!")) + + if(H.blood_volume < BLOOD_VOLUME_BAD) Cannibalize_Body(H) - ..() + + var/datum/action/innate/ability/regrowth = H.ability_actions[INNATE_ABILITY_LIMB_REGROWTH] + if(regrowth) + regrowth.UpdateButtonIcon() /datum/species/jelly/proc/Cannibalize_Body(mob/living/carbon/human/H) var/list/limbs_to_consume = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - H.get_missing_limbs() var/obj/item/bodypart/consumed_limb - if(!limbs_to_consume.len) + if(!length(limbs_to_consume)) H.losebreath++ return if(H.get_num_legs(FALSE)) //Legs go before arms limbs_to_consume -= list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) consumed_limb = H.get_bodypart(pick(limbs_to_consume)) consumed_limb.drop_limb() - to_chat(H, "Your [consumed_limb] is drawn back into your body, unable to maintain its shape!") + to_chat(H, span_userdanger("Your [consumed_limb] is drawn back into your body, unable to maintain its shape!")) qdel(consumed_limb) - H.adjust_integration_blood(20) + H.blood_volume += 20 ////////////////////////////////////////////////////////SLIMEPEOPLE/////////////////////////////////////////////////////////////////// @@ -407,7 +413,7 @@ limbs_id = SPECIES_SLIME default_color = "00FFFF" species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,HAS_FLESH) - inherent_traits = list(TRAIT_TOXINLOVER) + inherent_traits = list(TRAIT_TOXINLOVER, TRAIT_SNOWFLAKE_BLOOD_PROCESS) mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade") say_mod = "says" hair_color = "mutcolor"