Organ Growing Kit | Coroner Cytology Cargo Content (1/2) (#92108)

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
This commit is contained in:
Time-Green
2025-08-11 18:36:50 +02:00
committed by GitHub
co-authored by MrMelbert SmArtKar
parent fc240dc1d1
commit 43fc75facb
28 changed files with 527 additions and 30 deletions
@@ -5,15 +5,26 @@
icon = 'icons/obj/science/vatgrowing.dmi'
icon_state = "biopsy"
worn_icon_state = "biopsy"
base_icon_state = "biopsy"
/// Whether or not we can swab objects
var/can_swap_objects = FALSE
///Adds the swabbing component to the biopsy tool
/obj/item/biopsy_tool/Initialize(mapload)
. = ..()
AddComponent(/datum/component/swabbing, FALSE, FALSE, TRUE, CALLBACK(src, PROC_REF(update_swab_icon)), max_items = 1)
AddComponent(/datum/component/swabbing, can_swap_objects, FALSE, TRUE, CALLBACK(src, PROC_REF(update_swab_icon)), max_items = 1)
/obj/item/biopsy_tool/proc/update_swab_icon(list/swabbed_items)
if(LAZYLEN(swabbed_items))
icon_state = "biopsy_full"
icon_state = base_icon_state + "_full"
else
icon_state = "biopsy"
icon_state = base_icon_state
/obj/item/biopsy_tool/organ
name = "tissue biopsy tool"
desc = "Used to retrieve cell lines from organ tissue and organisms. Don't worry, it won't sting."
icon_state = "biopsy_organ"
base_icon_state = "biopsy_organ"
can_swap_objects = TRUE
@@ -120,6 +120,9 @@
balloon_alert(user, "dish removed")
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/structure/microscope/unanchored
anchored = FALSE
/datum/crafting_recipe/microscope
name = "Microscope"
result = /obj/structure/microscope
@@ -112,6 +112,7 @@
if(vat_creature.mutate())
return
mutate_color(thing)
SEND_SIGNAL(vat.biological_sample, COMSIG_SAMPLE_DEPOSITED, thing)
///Overriden to show more info like needs, supplementary and supressive reagents and also growth.
/datum/micro_organism/cell_line/get_details(show_details)
@@ -137,23 +138,30 @@
var/hue_shift = 1
//This affix is added to the name of the atom, to help players understand and converse about the different rarity levels.
var/rarity_affix = "glitched"
// for adding some unique effects for subtypes, should you wish to do so
var/strength_factor = 1
switch(rand(1, 100))
if(1 to 35) //35% chance : painted
hue_shift = 0.15
rarity_affix = "painted"
strength_factor = 1.2
if(36 to 70) //35% chance : mutant
hue_shift = 0.85 //this value is equivalent in distance as the painted tier, just in the other direction.
rarity_affix = "mutant"
strength_factor = 1.4
if(71 to 83) //13% chance : rare
hue_shift = 0.3
rarity_affix = "rare"
strength_factor = 1.6
if(84 to 95) //12% chance : shiny
hue_shift = 0.7
rarity_affix = "shiny"
strength_factor = 2
if(96 to 100) //5% chance : mutant king
hue_shift = 0.5 //Best in show, most extreme color change.
rarity_affix = "mutant king" //The name is up to debate, since cyto is all about freaky creatures I thought it was good choice over something like "cosmic" or "regal".
strength_factor = 2.5
var/list/mutant_shift_matrix = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, hue_shift,0,0,0) //matrix for our colour shifting.
@@ -163,3 +171,5 @@
if(isliving(beautiful_mutant)) //update the real name var if it's actually a living mob
var/mob/living/living_mutie = beautiful_mutant
living_mutie.real_name = living_mutie.name
return strength_factor
@@ -0,0 +1,197 @@
/// Cell lines for organ cytology, letting you duplicate or grow new mutant strains!
/datum/micro_organism/cell_line/organs
desc = "dense tissue"
growth_rate = 1
consumption_rate = REAGENTS_METABOLISM
/datum/micro_organism/cell_line/organs/mutate_color(atom/beautiful_mutant)
. = ..()
if(isorgan(beautiful_mutant))
var/obj/item/organ/organ = beautiful_mutant
// Rare affix organs get more health
organ.maxHealth *= .
/datum/micro_organism/cell_line/organs/heart
desc = "dense heart tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue)
supplementary_reagents = list(
/datum/reagent/love = 6,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
suppressive_reagents = list(
/datum/reagent/toxin/mutagen = -2,
)
resulting_atom = /obj/item/organ/heart
/datum/micro_organism/cell_line/organs/heart/evolved
desc = "dense evolved heart tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue)
supplementary_reagents = list(
/datum/reagent/love = 6,
/datum/reagent/toxin/mutagen = 4,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
resulting_atom = /obj/item/organ/heart/evolved
/datum/micro_organism/cell_line/organs/heart/sacred
desc = "dense sacred heart tissue"
growth_rate = parent_type::growth_rate * 0.5
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue, /datum/reagent/water/holywater)
supplementary_reagents = list(
/datum/reagent/love = 6,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
resulting_atom = /obj/item/organ/heart/evolved/sacred
/datum/micro_organism/cell_line/organs/heart/corrupt
desc = "dense corrupted heart tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue)
supplementary_reagents = list(
/datum/reagent/hellwater = 6,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
suppressive_reagents = list(
/datum/reagent/water/holywater = -3,
)
resulting_atom = /obj/item/organ/heart/corrupt
/datum/micro_organism/cell_line/organs/lungs
desc = "dense lung tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue)
supplementary_reagents = list(
/datum/reagent/medicine/salbutamol = 6,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
suppressive_reagents = list(
/datum/reagent/toxin/mutagen = -2,
)
resulting_atom = /obj/item/organ/lungs
/datum/micro_organism/cell_line/organs/lungs/evolved
desc = "dense evolved lung tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue)
supplementary_reagents = list(
/datum/reagent/medicine/salbutamol = 6,
/datum/reagent/toxin/mutagen = 4,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
resulting_atom = /obj/item/organ/lungs/evolved
/datum/micro_organism/cell_line/organs/liver
desc = "dense liver tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue)
supplementary_reagents = list(
/datum/reagent/iron = 6,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
suppressive_reagents = list(
/datum/reagent/toxin/mutagen = -2,
)
resulting_atom = /obj/item/organ/liver
/datum/micro_organism/cell_line/organs/liver/evolved
desc = "dense evolved liver tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue)
supplementary_reagents = list(
/datum/reagent/iron = 6,
/datum/reagent/toxin/mutagen = 4,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
resulting_atom = /obj/item/organ/liver/evolved
/datum/micro_organism/cell_line/organs/liver/bloody
desc = "spongy liver tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue, /datum/reagent/blood)
supplementary_reagents = list(
/datum/reagent/iron = 6,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
resulting_atom = /obj/item/organ/liver/bloody
/datum/micro_organism/cell_line/organs/liver/distillery
desc = "alcoholic liver tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue, /datum/reagent/consumable/ethanol)
supplementary_reagents = list(
/datum/reagent/iron = 6,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
suppressive_reagents = list(
/datum/reagent/water = -6, //are you trying to poison me or something?
)
resulting_atom = /obj/item/organ/liver/distillery
/datum/micro_organism/cell_line/organs/stomach
desc = "dense stomach tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue/stomach_lining)
supplementary_reagents = list(
/datum/reagent/consumable/nutriment/organ_tissue = 3,
/datum/reagent/blood = 3,
/datum/reagent/consumable/nutriment = 1,
)
suppressive_reagents = list(
/datum/reagent/toxin/mutagen = -2,
)
resulting_atom = /obj/item/organ/stomach
/datum/micro_organism/cell_line/organs/stomach/evolved
desc = "dense evolved stomach tissue"
required_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue/stomach_lining)
supplementary_reagents = list(
/datum/reagent/toxin/mutagen = 4,
/datum/reagent/consumable/nutriment/organ_tissue = 3,
/datum/reagent/consumable/nutriment = 3,
/datum/reagent/blood = 3,
)
resulting_atom = /obj/item/organ/stomach/evolved
@@ -15,13 +15,16 @@
var/datum/biological_sample/biological_sample
///If the vat will restart the sample upon completion
var/resampler_active = FALSE
/// Whether or not to add the plumbing component and related stuff
var/use_plumbing = TRUE
/obj/machinery/vatgrower/Initialize(mapload, bolt, layer)
. = ..()
create_reagents(reagent_volume, reagent_flags)
AddComponent(/datum/component/simple_rotation)
AddComponent(/datum/component/plumbing/simple_demand)
if(use_plumbing)
AddComponent(/datum/component/simple_rotation)
AddComponent(/datum/component/plumbing/simple_demand)
var/static/list/hovering_item_typechecks = list(
/obj/item/petri_dish = list(
@@ -136,9 +139,9 @@
var/static/image/off_overlay
var/static/image/emissive_overlay
if(isnull(on_overlay))
on_overlay = iconstate2appearance(icon, "growing_vat_on")
off_overlay = iconstate2appearance(icon, "growing_vat_off")
emissive_overlay = emissive_appearance(icon, "growing_vat_glow", src, alpha = src.alpha)
on_overlay = iconstate2appearance(icon, "[icon_state]_on")
off_overlay = iconstate2appearance(icon, "[icon_state]_off")
emissive_overlay = emissive_appearance(icon, "[icon_state]_glow", src, alpha = src.alpha)
. += emissive_overlay
if(is_operational)
if(resampler_active)
@@ -148,11 +151,11 @@
if(!reagents.total_volume)
return
var/reagentcolor = mix_color_from_reagents(reagents.reagent_list)
var/mutable_appearance/base_overlay = mutable_appearance(icon, "vat_reagent", appearance_flags = RESET_COLOR|KEEP_APART)
var/mutable_appearance/base_overlay = mutable_appearance(icon, "[icon_state]_reagent", appearance_flags = RESET_COLOR|KEEP_APART)
base_overlay.color = reagentcolor
. += base_overlay
if(biological_sample && is_operational)
var/mutable_appearance/bubbles_overlay = mutable_appearance(icon, "vat_bubbles")
var/mutable_appearance/bubbles_overlay = mutable_appearance(icon, "[icon_state]_bubbles")
. += bubbles_overlay
/obj/machinery/vatgrower/emag_act(mob/user, obj/item/card/emag/emag_card)
@@ -170,6 +173,43 @@
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), get_turf(src), 'sound/effects/servostep.ogg', 100, 1), 1.5 SECONDS)
biological_sample.reset_sample()
else
UnregisterSignal(biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED)
QDEL_NULL(biological_sample)
update_appearance()
/obj/machinery/vatgrower/small
name = "small growing vat"
desc = "Tastes just like the chef's soup. Fit for growing organ tissue samples."
icon_state = "growing_vat_small"
density = FALSE
pass_flags_self = PASSMACHINE | LETPASSTHROW
circuit = null
anchored_tabletop_offset = 4
pass_flags = PASSTABLE
use_plumbing = FALSE
reagent_volume = 50
/obj/machinery/vatgrower/small/emag_act(mob/user, obj/item/card/emag/emag_card)
return
/obj/machinery/vatgrower/small/deposit_sample(mob/user, obj/item/petri_dish/petri)
. = ..()
if(. != ITEM_INTERACT_SUCCESS)
return
RegisterSignal(biological_sample, COMSIG_SAMPLE_DEPOSITED, PROC_REF(on_sample_deposited))
/obj/machinery/vatgrower/small/proc/on_sample_deposited(datum/biological_sample/sample, atom/thing)
SIGNAL_HANDLER
if(isliving(thing))
var/mob/living/living_type = thing
if(living_type.mob_size > MOB_SIZE_SMALL)
explosion(src, light_impact_range = 2, explosion_cause = "growing vat too small")
qdel(src)
return
/obj/machinery/vatgrower/small/unanchored
anchored = FALSE