diff --git a/code/datums/diseases/crabcancer.dm b/code/datums/diseases/crabcancer.dm new file mode 100644 index 0000000000..a762028807 --- /dev/null +++ b/code/datums/diseases/crabcancer.dm @@ -0,0 +1,67 @@ +/datum/disease/crabcancer + name = "Crab Cancer" + form = "Skin Cancer" + max_stages = 3 + cure_text = "Mutadone" + spread_text = "Noncontagious" + cures = list(/datum/reagent/medicine/mutadone) + agent = "Carcinisoprojection Jelly" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + permeability_mod = 1 + desc = "If left untreated, the patient will rapidly and painfully grow flesh that will fall off the subject. This can result in death if unmaintained." + severity = DISEASE_SEVERITY_DANGEROUS + spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS + visibility_flags = HIDDEN_PANDEMIC + bypasses_immunity = TRUE + +/datum/disease/crabcancer/stage_act() + ..() + switch(stage) + if(1) + if(prob(10)) + to_chat(affected_mob, "" + pick("You feel uncomfortable.", + "You can feel your arms and legs throbbing.", + "You feel... crabby.", + "You're starting to smell like seafood.") + "") + if(2) + if(prob(10)) + to_chat(affected_mob, "" + pick("Your flesh is starting to look deformed.", + "You feel your flesh bubbling and swelling.", + "You think you see pincers coming out of your flesh.", + "It's time for crab...") + "") + if(3) + if(prob(5)) + to_chat(affected_mob, "" + pick("Your skin forms black, rough patches!", + "The pain is unbearable!", + "Your skin is forming painful cysts!") + "") + affected_mob.take_bodypart_damage(rand(1,5)) + if(prob(5)) + affected_mob.visible_message("[affected_mob]'s own flesh swells and tears away from \him!", \ + "" + pick("You feel your flesh swelling and tearing away from you!", + "Your own flesh grows and falls beneath you!", + "The pain... the crabby meat falls off you!", + "Your flesh... it tears!", + "It is now time for crab!") + "", + "You hear a disgusting squelch of flesh being torn.") + playsound(affected_mob, 'sound/items/poster_ripped.ogg', 50, TRUE) + playsound(get_turf(affected_mob), 'sound/effects/splat.ogg', 20, TRUE) + affected_mob.emote("scream") + affected_mob.take_bodypart_damage(rand(15,25)) + var/humanmeatamount = rand(0,2) + var/crabmeatamount = rand(1,2) + var/meattype = /obj/item/reagent_containers/food/snacks/meat/slab/human + if(ishuman(affected_mob)) + meattype = affected_mob.dna.species.meat + else //grab the carbon's meat instead (usually this means monkey meat... though other disease-compatible carbon mobs might apply.) + meattype = affected_mob.type_of_meat + + if(humanmeatamount) + for(var/i=1 to humanmeatamount) + var/obj/item/reagent_containers/food/snacks/meat/slab/newmeat = new meattype + newmeat.name = "[affected_mob.real_name] [newmeat.name]" + newmeat.forceMove(affected_mob.loc) + if(crabmeatamount) + for(var/i=1 to crabmeatamount) + new /obj/item/reagent_containers/food/snacks/meat/rawcrab(affected_mob.loc) + affected_mob.jitteriness += 3 + diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 4b2d872aec..3521fe756c 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -147,6 +147,11 @@ mood_change = -5 timeout = 1 MINUTES +/datum/mood_event/painful_limb_regrowth + description = "It's great to have all my limbs back but that was absolutely painful.\n" + mood_change = -5 + timeout = 1 MINUTES + /datum/mood_event/loud_gong description = "That loud gong noise really hurt my ears!\n" mood_change = -3 diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 57501beab3..c8646ab618 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -139,6 +139,7 @@ /datum/reagent/medicine/atropine,\ /datum/reagent/medicine/strange_reagent,\ /datum/reagent/medicine/regen_jelly,\ + /datum/reagent/medicine/limb_regrowth,\ /datum/reagent/drug/space_drugs,\ /datum/reagent/drug/crank,\ /datum/reagent/drug/krokodil,\ diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 4d1ded3913..0a78af67b2 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1359,7 +1359,7 @@ /datum/reagent/medicine/neo_jelly name = "Neo Jelly" - description = "Gradually regenerates all types of damage, without harming slime anatomy.Can OD" + description = "Gradually regenerates all types of damage, without harming slime anatomy. Can overdose." reagent_state = LIQUID metabolization_rate = 1 * REAGENTS_METABOLISM color = "#91D865" @@ -1797,3 +1797,50 @@ else M.adjustToxLoss(0.5*REAGENTS_EFFECT_MULTIPLIER) . = 1 + +/datum/reagent/medicine/limb_regrowth + name = "Carcinisoprojection Jelly" + description = "Also known as \"limb regrowth jelly\", this crabby looking xenobiological jelly will rapidly regrow any missing limbs someone has at the cost of some of their blood. Do not overdose." + taste_description = "salty slime" + color = "#EF5428" //like cooked crab! + reagent_state = LIQUID + overdose_threshold = 65 //it takes more than one bluespace syringe to overdose someone with this given how nasty the OD is. + value = REAGENT_VALUE_RARE + +/datum/reagent/medicine/limb_regrowth/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume) + . = ..() + if(!.) + return + if(method == TOUCH) //as funny as it would be to have this hurled at someone, nah. + return + var/vol = reac_volume + C.reagents.get_reagent_amount(/datum/reagent/medicine/limb_regrowth) + if(vol < 5) //need at least 5 units. + return + var/list/limbs_to_heal = C.get_missing_limbs(exclude_head = TRUE) + if(limbs_to_heal.len < 1) //nothing happens if they already got all limbs. + return + if(HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM)) //sorry synths, consider a visit to the roboticist. dunno how to justify regrowing robolimbs. + return + else if(ishuman(C) && !(HAS_BONE in C.dna?.species?.species_traits)) //boneless have little trouble with the limb chemical. + C.visible_message("[C] suddenly regrows \his limbs!", + "You suddenly regrow your limbs, sensation and all!") + else //boneful beings get to scream. + C.visible_message("[C]'s body lets off a grotesque squelching, bone crunching sound as \his limbs grow back rapidly!", + "Your body emits a grotesque squelching, bone crunching sound as your limbs grow back rapidly! \ + With the sensation of your regained limbs, also comes pain!", + "You hear a grotsque squelching noise and the sound of crunching bones.") + playsound(C, 'sound/magic/demon_consume.ogg', 50, 1) + SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "painful_limb_regrowth", /datum/mood_event/painful_limb_regrowth) + C.emote("scream") + C.regenerate_limbs(excluded_limbs = list(BODY_ZONE_HEAD)) //would be a little funky for dullahans if they suddenly sprouted a head. + C.blood_volume = max(C.blood_volume - 30*limbs_to_heal.len,0) + //lose blood for each limb that was regained. + //10 units less expensive than slime limb regrowth, but doesn't check for low blood like the ability, so it could be dangerous. + to_chat(C,"You feel like this ordeal of your limbs regrowing has made you a little paler... as well as made you feel a little thirsty.") + //hint at the blood loss. (paler is a common symptom depicted in-game of low blood, but dehydration is another symptom of low blood.) + + +/datum/reagent/medicine/limb_regrowth/overdose_start(mob/living/M) + M.ForceContractDisease(new /datum/disease/crabcancer, FALSE, TRUE) //it is now, time for crab. + ..() + . = 1 diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 918ccf01e5..74c7d0d3c6 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -371,3 +371,9 @@ id = /datum/reagent/medicine/system_cleaner results = list(/datum/reagent/medicine/system_cleaner = 4) required_reagents = list(/datum/reagent/iron = 2, /datum/reagent/oil = 2, /datum/reagent/medicine/calomel = 2, /datum/reagent/acetone = 2) + +/datum/chemical_reaction/limb_regrowth + name = "Carcinisoprojection Jelly" + id = /datum/reagent/medicine/limb_regrowth + results = list(/datum/reagent/medicine/limb_regrowth = 2) + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/slime_toxin = 1) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index c2c5582f59..40f599c103 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -124,19 +124,25 @@ /mob/living/carbon/alien/larva/get_leg_ignore() return TRUE -/mob/living/proc/get_missing_limbs() +/mob/living/proc/get_missing_limbs(exclude_head = FALSE) return list() -/mob/living/carbon/get_missing_limbs() +/mob/living/carbon/get_missing_limbs(exclude_head = FALSE) var/list/full = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) for(var/zone in full) + if(exclude_head && zone == BODY_ZONE_HEAD) //this is needed in case we don't care for the lack of a dullahan's head or something. + full -= zone + continue if(get_bodypart(zone)) full -= zone return full -/mob/living/carbon/alien/larva/get_missing_limbs() +/mob/living/carbon/alien/larva/get_missing_limbs(exclude_head = FALSE) var/list/full = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST) for(var/zone in full) + if(exclude_head && zone == BODY_ZONE_HEAD) //I guess???? + full -= zone + continue if(get_bodypart(zone)) full -= zone return full diff --git a/tgstation.dme b/tgstation.dme index 69acf7bff4..f3d34ee6bd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -608,6 +608,7 @@ #include "code\datums\diseases\brainrot.dm" #include "code\datums\diseases\cold.dm" #include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\crabcancer.dm" #include "code\datums\diseases\dna_spread.dm" #include "code\datums\diseases\fake_gbs.dm" #include "code\datums\diseases\flu.dm"