From f235839351f005a39e48009ba57b74a1d65d690e Mon Sep 17 00:00:00 2001
From: BlueWildrose <57083662+BlueWildrose@users.noreply.github.com>
Date: Thu, 14 Apr 2022 15:37:08 -0700
Subject: [PATCH] Adds carcinisoprojection jelly, a limb regrowth chem that is
made from slime mutation toxin & blood (#15053)
* Limb regrowth chem, new disease of crab cancer
* Limb regrowth adjustments
* oops, sorry linters.
* oh right this would probably fuck with dullahans
* woops missed a newline
* Update code/modules/reagents/chemistry/reagents/medicine_reagents.dm
Co-authored-by: DeltaFire <46569814+DeltaFire15@users.noreply.github.com>
* just realized this check is unnecessary.
* let's add a mood debuff while we're at it
* Update medicine_reagents.dm
* add a bounty
* misspelling
* Update crabcancer.dm
Co-authored-by: DeltaFire <46569814+DeltaFire15@users.noreply.github.com>
---
code/datums/diseases/crabcancer.dm | 67 +++++++++++++++++++
.../mood_events/generic_negative_events.dm | 5 ++
code/modules/cargo/bounties/reagent.dm | 1 +
.../chemistry/reagents/medicine_reagents.dm | 49 +++++++++++++-
.../reagents/chemistry/recipes/medicine.dm | 6 ++
code/modules/surgery/bodyparts/helpers.dm | 12 +++-
tgstation.dme | 1 +
7 files changed, 137 insertions(+), 4 deletions(-)
create mode 100644 code/datums/diseases/crabcancer.dm
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"