diff --git a/aurorastation.dme b/aurorastation.dme index 4621ac0b28b..dd8ed153cb0 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -2918,6 +2918,7 @@ #include "code\modules\organs\subtypes\parasite\black_kois.dm" #include "code\modules\organs\subtypes\parasite\heart_fluke.dm" #include "code\modules\organs\subtypes\parasite\kois.dm" +#include "code\modules\organs\subtypes\parasite\tumours.dm" #include "code\modules\organs\subtypes\parasite\worms.dm" #include "code\modules\organs\subtypes\parasite\zombie.dm" #include "code\modules\overmap\_defines.dm" diff --git a/code/__DEFINES/chemistry.dm b/code/__DEFINES/chemistry.dm index 6ad8dcec322..c448ae48e15 100644 --- a/code/__DEFINES/chemistry.dm +++ b/code/__DEFINES/chemistry.dm @@ -71,6 +71,7 @@ #define CE_STRAIGHTWALK "straightwalk" // prevents the confused walking chem side effect #define CE_NOSTUTTER "nostutter" // helps alleviate stuttering #define CE_HAUNTED "haunted" // Spectrocybin's ghost vision +#define CE_BLOODTHIN "bloodthin" // Makes you bleed out quicker // Apply healing effects #define CE_ANTIBIOTIC "antibiotic" // Thetamycin @@ -92,6 +93,7 @@ #define CE_HEPATOTOXIC "livertoxic" // Liver damage #define CE_CARDIOTOXIC "hearttoxic" // Heart damage #define CE_PNEUMOTOXIC "lungtoxic" // Lung damage +#define CE_OCULOTOXIC "eyetoxic" // Eye damage //Alcohol #define INTOX_BUZZED 0.01 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index b1fe0de45d1..5f76e7f0ad8 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -146,6 +146,8 @@ #define BP_ZOMBIE_PARASITE "black tumour" #define BP_WORM_HEART "heart fluke" #define BP_WORM_NERVE "nerve fluke" +#define BP_TUMOUR_NONSPREADING "benign tumour" +#define BP_TUMOUR_SPREADING "malignant tumour" //Augment organs #define BP_AUG_TIMEPIECE "integrated timepiece" diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm index 964c16e768f..1ba670a0335 100644 --- a/code/datums/uplink/medical.dm +++ b/code/datums/uplink/medical.dm @@ -19,6 +19,7 @@ bluecrystal_cost = 3 item_limit = 2 path = /obj/item/reagent_containers/hypospray/autoinjector/sanasomnum + desc = "A special autoinjector loaded with outlawed biomechanical stem cells, inducing a regenerative coma so intense it can heal almost any injury - even broken bones, organ and brain damage, severed tendons, and arterial damage. Upon use one will fall immediately into a state of unconsciousness lasting roughly three to five minutes, arising completely healed. The only thing it cannot fix are organs that have been destroyed outright, or so much cumulative damage that death is all but certain. In the short-term, it will save your life; in the long term, the cancerous tumours immediately onset by the drug will invariable cause death down the line." /datum/uplink_item/item/medical/combathypo name = "Combat Hypospray" diff --git a/code/game/machinery/body_scanner.dm b/code/game/machinery/body_scanner.dm index 6d565dc649b..93debc50e3a 100644 --- a/code/game/machinery/body_scanner.dm +++ b/code/game/machinery/body_scanner.dm @@ -479,19 +479,6 @@ return data /obj/machinery/body_scanconsole/proc/get_internal_damage(var/obj/item/organ/internal/I) - if(istype(I, /obj/item/organ/internal/parasite)) - var/obj/item/organ/internal/parasite/P = I - switch(P.stage) - if(1) - return "Tiny" - if(2) - return "Small" - if(3) - return "Large" - if(4) - return "Massive" - else - return "Present" if(I.is_broken()) return "Severe" if(I.is_bruised()) @@ -614,6 +601,15 @@ if(A.inflamed) wounds += "inflamed" + if(istype(O, /obj/item/organ/internal/parasite)) + var/obj/item/organ/internal/parasite/P = O + if(P.stage) + wounds += "stage [P.stage]" + if(P.parent_organ) + wounds += "growing in [P.parent_organ]" + if(istype(P, /obj/item/organ/internal/parasite/malignant_tumour) && P.stage >= 4) + wounds += "metastasising" + if(O.status & ORGAN_DEAD) if(O.can_recover()) wounds += "necrotic; debridable" diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 481cfa800e2..dcf02797c63 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -31,6 +31,15 @@ clicksound = 'sound/machines/buttonbeep.ogg' clickvol = 30 + component_types = list( + /obj/item/circuitboard/cryotube, + /obj/item/stock_parts/scanning_module, + /obj/item/stock_parts/scanning_module, + /obj/item/stock_parts/manipulator, + /obj/item/stock_parts/console_screen, + /obj/item/reagent_containers/glass/beaker/large + ) + var/temperature_archived var/mob/living/carbon/human/occupant = null var/obj/item/reagent_containers/glass/beaker = null @@ -40,8 +49,8 @@ var/temperature_warning_threshold = 170 var/temperature_danger_threshold = T0C - var/fast_stasis_mult = 0.8 - var/slow_stasis_mult = 1.25 + var/fast_stasis_mult = 0.6 + var/slow_stasis_mult = 1.7 var/current_stasis_mult = 1 var/global/list/screen_overlays @@ -343,6 +352,10 @@ return occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity()) occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise + + if(occupant.isSynthetic()) + return + occupant.set_stat(UNCONSCIOUS) var/has_cryo = REAGENT_VOLUME(occupant.reagents, /singleton/reagent/cryoxadone) >= 1 var/has_clonexa = REAGENT_VOLUME(occupant.reagents, /singleton/reagent/clonexadone) >= 1 @@ -451,14 +464,29 @@ if(loc) return loc.return_air() +/obj/machinery/atmospherics/unary/cryo_cell/attackby(obj/item/attacking_item, mob/user) + if(default_deconstruction_screwdriver(user, attacking_item)) + return TRUE + if(default_deconstruction_crowbar(user, attacking_item)) + return TRUE + if(default_part_replacement(user, attacking_item)) + return TRUE + + return ..() + +/obj/machinery/atmospherics/unary/cryo_cell/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) + . = ..() + if(panel_open) + . += "The maintenance hatch is open." + /obj/machinery/atmospherics/unary/cryo_cell/RefreshParts() ..() var/man_rating = 0 for(var/obj/item/stock_parts/P in component_parts) if(ismanipulator(P)) man_rating += P.rating - fast_stasis_mult = max(1 - (man_rating * 0.06), 0.66) - slow_stasis_mult = min(1 + (man_rating * 0.06), 1.5) + fast_stasis_mult = max(0.6/man_rating, 0.2) + slow_stasis_mult = min(1.6+(man_rating/10), 2) /datum/data/function/proc/reset() return diff --git a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm index b80fe75a2b8..0e706ddfdae 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/miscboards.dm @@ -43,6 +43,7 @@ req_components = list( "/obj/item/stock_parts/scanning_module" = 2, "/obj/item/stock_parts/console_screen" = 1, + "/obj/item/stock_parts/manipulator" = 1, "/obj/item/reagent_containers/glass/beaker/large" = 1) diff --git a/code/game/objects/items/weapons/storage/pill_bottle.dm b/code/game/objects/items/weapons/storage/pill_bottle.dm index fb1ce121d53..cbff2b3156d 100644 --- a/code/game/objects/items/weapons/storage/pill_bottle.dm +++ b/code/game/objects/items/weapons/storage/pill_bottle.dm @@ -175,3 +175,8 @@ name = "bottle of 5u Steramycin pills" desc = "Contains prophylactic antibiotic pills." starts_with = list(/obj/item/reagent_containers/pill/steramycin = 3) + +/obj/item/storage/pill_bottle/ryetalyn + name = "bottle of 10u Ryetalyn pills" + desc = "Contains pills used to treat genetic and immune diseases." + starts_with = list(/obj/item/reagent_containers/pill/ryetalyn = 4) diff --git a/code/modules/cargo/random_stock/t2_uncommon.dm b/code/modules/cargo/random_stock/t2_uncommon.dm index 3781f46b4e3..abd2da67fc7 100644 --- a/code/modules/cargo/random_stock/t2_uncommon.dm +++ b/code/modules/cargo/random_stock/t2_uncommon.dm @@ -92,7 +92,7 @@ STOCK_ITEM_UNCOMMON(chempack, 5) var/list/exclusion = list(/singleton/reagent/drink, /singleton/reagent, /singleton/reagent/adminordrazine, /singleton/reagent/polysomnine/beer2, /singleton/reagent/azoth, /singleton/reagent/elixir,\ /singleton/reagent/liquid_fire, /singleton/reagent/philosopher_stone, /singleton/reagent/toxin/undead, /singleton/reagent/love_potion, /singleton/reagent/shapesand, /singleton/reagent/usolve,\ /singleton/reagent/sglue, /singleton/reagent/black_matter, /singleton/reagent/drugs/cocaine, /singleton/reagent/drugs/raskara_dust, /singleton/reagent/drugs/heroin, /singleton/reagent/drugs/joy, /singleton/reagent/toxin/stimm, /singleton/reagent/drugs/impedrezene, /singleton/reagent/bottle_lightning, /singleton/reagent/toxin/hylemnomil, /singleton/reagent/toxin/nanites, /singleton/reagent/nitroglycerin, - /singleton/reagent/aslimetoxin, /singleton/reagent/sanasomnum, /singleton/reagent/rezadone, /singleton/reagent/kois/black, /singleton/reagent/toxin/carpotoxin) + /singleton/reagent/aslimetoxin, /singleton/reagent/sanasomnum, /singleton/reagent/rezadone, /singleton/reagent/kois/black, /singleton/reagent/toxin/carpotoxin, /singleton/reagent/toxin/malignant_tumour_cells) chems -= exclusion for (var/i in 1 to rand(2, 4)) var/obj/item/reagent_containers/chem_disp_cartridge/C = new /obj/item/reagent_containers/chem_disp_cartridge(L) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index c6efca70b07..d3b564ffb78 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -139,7 +139,7 @@ new /datum/stack_recipe("plastic rack", /obj/structure/table/rack, BUILD_AMT, time = 5, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, BUILD_AMT, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("plastic bag", /obj/item/storage/bag/plasticbag, 3, on_floor = 1), - new /datum/stack_recipe("blood pack", /obj/item/reagent_containers/blood/empty, 4, on_floor = 0), + new /datum/stack_recipe("IV bag", /obj/item/reagent_containers/blood/empty, 4, on_floor = 0), new /datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/reagent_containers/chem_disp_cartridge, 5, on_floor=0), // 500u new /datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0), // 250u new /datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0), // 100u diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index c1fd25a65c2..2123025a992 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -254,13 +254,13 @@ return 0 else if(bodytemperature > species.cold_level_2) . = 5 * (1 - (bodytemperature - species.cold_level_2) / (species.cold_level_1 - species.cold_level_2)) - . = max(2, .) + . = max(2, .) //stasis factor range: 2 to 5 after rounding else if(bodytemperature > species.cold_level_3) - . = 20 * (1 - (bodytemperature - species.cold_level_3) / (species.cold_level_2 - species.cold_level_3)) - . = max(5, .) + . = 11 * (1 - (bodytemperature - species.cold_level_3) / (species.cold_level_2 - species.cold_level_3)) + . = max(5, .) //stasis factor range: 5 to 10 after rounding. we still want chemicals to metabolise at a bearable speed for those sick pharmacy beaker mixes. else . = 80 * (1 - bodytemperature / species.cold_level_3) - . = max(20, .) + . = max(20, .) //stasis factor range: 20 to 80 after rounding. irl cryonics ''achieves full stasis'' in bodies at 80K. if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) var/obj/machinery/atmospherics/unary/cryo_cell/cryo = loc if(cryo.current_stasis_mult) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6fc8d60b4fa..e05662fe2da 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -970,12 +970,12 @@ default behaviour is: /mob/living/proc/get_resist_power() return 1 -/mob/living/proc/seizure() +/mob/living/proc/seizure(var/severity_multiplier = 1) if(!paralysis && stat == CONSCIOUS) - visible_message("\The [src] starts having a seizure!") - Paralyse(rand(16,24)) - make_jittery(rand(150,200)) - adjustHalLoss(rand(50,60)) + visible_message(SPAN_HIGHDANGER("\The [src] starts having a seizure!")) + Paralyse(24*severity_multiplier) + make_jittery(200*severity_multiplier) + adjustHalLoss(60*severity_multiplier) /mob/living/proc/InStasis() return FALSE diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index 834edfac4d1..ab6c4d06710 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -8,6 +8,7 @@ max_damage = 45 min_broken_damage = 25 relative_size = 5 + toxin_type = CE_OCULOTOXIC var/list/eye_colour = list(0,0,0) var/singular_name = "eye" diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index a6160998ea4..0daf7b31c12 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -148,8 +148,10 @@ if(temp.status & ORGAN_ARTERY_CUT) var/bleed_amount = FLOOR((owner.vessel.total_volume / (temp.applied_pressure || !open_wound ? 450 : 250)) * temp.arterial_bleed_severity, 1) if(bleed_amount) - if(CE_BLOODCLOT in owner.chem_effects) + if((CE_BLOODCLOT in owner.chem_effects) && !(owner.chem_effects[CE_BLOODTHIN])) bleed_amount *= 0.8 // won't do much, but it'll help + if(CE_BLOODTHIN in owner.chem_effects) + bleed_amount *= 1+(owner.chem_effects[CE_BLOODTHIN]/100) if(open_wound) blood_max += bleed_amount do_spray += "[temp.name]" diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 4137e3cc7e3..ef06e9deec1 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -1526,7 +1526,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(genetic_degradation <= 30) if(status & ORGAN_MUTATED) unmutate() - to_chat(src, "Your [name] is shaped normally again.") + to_chat(src, SPAN_NOTICE("Your [name] is shaped normally again.")) return -(genetic_degradation - last_gene_dam) /obj/item/organ/external/proc/add_genetic_damage(var/amount) @@ -1536,10 +1536,12 @@ Note that amputating the affected organ does in fact remove the infection from t return var/last_gene_dam = genetic_degradation genetic_degradation = min(100,max(0,genetic_degradation + amount)) - if(genetic_degradation > 30) + if(genetic_degradation > 10) + owner.infest_with_parasite(owner, BP_TUMOUR_SPREADING, src) + if(genetic_degradation > 20) if(!(status & ORGAN_MUTATED) && prob(genetic_degradation)) mutate() - to_chat(owner, "Something is not right with your [name]...") + to_chat(owner, SPAN_NOTICE("Something is not right with your [name]...")) return (genetic_degradation - last_gene_dam) // Pain/halloss diff --git a/code/modules/organs/subtypes/parasite/_parasite.dm b/code/modules/organs/subtypes/parasite/_parasite.dm index 763893bbc28..c99da42443f 100644 --- a/code/modules/organs/subtypes/parasite/_parasite.dm +++ b/code/modules/organs/subtypes/parasite/_parasite.dm @@ -73,3 +73,25 @@ /obj/item/organ/internal/parasite/proc/stage_effect() return + +/mob/living/carbon/human/proc/infest_with_parasite(var/mob/living/carbon/victim, var/parasite_type, var/obj/item/organ/external/organ_to_infest, var/chance_to_infest = 100, var/parasite_limit = 3) + if(ishuman(victim)) + var/mob/living/carbon/human/H = victim + if(BP_IS_ROBOTIC(organ_to_infest)) + return + var/i = 0 + for(var/obj/item/organ/internal/O in H.internal_organs) //dont want there to be a silly amount of parasites + if(istype(O, /obj/item/organ/internal/parasite)) + i++ + if((i < parasite_limit) && prob(chance_to_infest)) + switch(parasite_type) //such a shitty way to do this but i couldnt get a better alternative to work in a sane amount of time :/ + if("malignant tumour") + var/obj/item/organ/internal/parasite/malignant_tumour/P = new() + P.parent_organ = organ_to_infest + P.replaced(H, organ_to_infest) + P.generate_name() + if("benign tumour") + var/obj/item/organ/internal/parasite/benign_tumour/P = new() + P.parent_organ = organ_to_infest + P.replaced(H, organ_to_infest) + P.generate_name() diff --git a/code/modules/organs/subtypes/parasite/tumours.dm b/code/modules/organs/subtypes/parasite/tumours.dm new file mode 100644 index 00000000000..df5cd9012dd --- /dev/null +++ b/code/modules/organs/subtypes/parasite/tumours.dm @@ -0,0 +1,141 @@ +/obj/item/organ/internal/parasite/benign_tumour + name = "benign tumour" + icon = 'icons/obj/organs/organs.dmi' + icon_state = "tumour" + dead_icon = "tumour" + + organ_tag = BP_TUMOUR_NONSPREADING + parent_organ = BP_CHEST + subtle = 1 + + drug_resistance = 1 + + max_stage = 3 + stage_interval = 300 //~5 minutes minutes/stage + + origin_tech = list(TECH_BIO = 2) + +/obj/item/organ/internal/parasite/benign_tumour/proc/generate_name() + if(parent_organ) + switch(parent_organ) + if(BP_CHEST) + name = "benign chest lipoma" + if(BP_GROIN) + name = "benign abdominal tumour" + if(BP_HEAD) + name = "benign skull cavity tumour" + if(BP_L_ARM) + name = "benign lipoma (left arm)" + if(BP_R_ARM) + name = "benign lipoma (right arm)" + if(BP_L_HAND) + name = "benign chondroma (left hand)" + if(BP_R_HAND) + name = "benign chondroma (right hand)" + if(BP_L_LEG) + name = "benign lipoma (left leg)" + if(BP_R_LEG) + name = "benign lipoma (right leg)" + if(BP_L_FOOT) + name = "benign plantar fibroma (left foot)" + if(BP_R_FOOT) + name = "benign plantar fibroma (right foot)" + +/obj/item/organ/internal/parasite/benign_tumour/process() + ..() + if (!owner) + return + if(REAGENT_VOLUME(owner.reagents, /singleton/reagent/ryetalyn)) //10u will treat most tumours, 20u will nuke fully developed tumours + recession = 20 + if(prob(2)) + owner.adjustNutritionLoss(5) + if(stage >= 2) //after ~5 minutes + if(prob(5)) + owner.adjustHalLoss(10*stage) + +/obj/item/organ/internal/parasite/malignant_tumour + name = "malignant tumour" + icon = 'icons/obj/organs/organs.dmi' + icon_state = "tumour" + dead_icon = "tumour" + + organ_tag = BP_TUMOUR_SPREADING + parent_organ = BP_CHEST + subtle = 1 + + drug_resistance = 1 + + max_stage = 4 + stage_interval = 300 //~5 minutes minutes/stage + + origin_tech = list(TECH_BIO = 3) + + egg = /singleton/reagent/toxin/malignant_tumour_cells + +/obj/item/organ/internal/parasite/malignant_tumour/proc/generate_name() + if(parent_organ) + switch(parent_organ) + if(BP_CHEST) + name = "malignant chest wall sarcoma" + if(BP_GROIN) + name = "gastric cancer" + if(BP_HEAD) + name = "malignant brain tumour" + if(BP_L_ARM) + name = "malignant melanoma (left arm)" + if(BP_R_ARM) + name = "malignant melanoma (right arm)" + if(BP_L_HAND) + name = "malignant chondrosarcoma (left hand)" + if(BP_R_HAND) + name = "malignant chondrosarcoma (right hand)" + if(BP_L_LEG) + name = "malignant melanoma (left leg)" + if(BP_R_LEG) + name = "malignant melanoma (right leg)" + if(BP_L_FOOT) + name = "malignant chondrosarcoma (left foot)" + if(BP_R_FOOT) + name = "malignant chondrosarcoma (right foot)" + +/obj/item/organ/internal/parasite/malignant_tumour/process() + ..() + if (!owner) + return + if(REAGENT_VOLUME(owner.reagents, /singleton/reagent/ryetalyn)) //10u will treat most tumours, 20u will nuke fully developed tumours + recession = 20 + if(prob(5)) + owner.adjustNutritionLoss(5) + if(prob(5)) + owner.adjustHalLoss((10*stage)/2) + if(stage >= 2) //after ~5 minutes + switch(parent_organ) + if(BP_HEAD) + owner.confused = min(owner.confused + (stage*2), 10) + owner.slurring = min(owner.slurring + (stage*2), 50) + if(prob(5)) + to_chat(owner, SPAN_WARNING(pick("You struggle to remember the last several moments.", "You smell something funny.", "You taste something funny.", "You can't figure out how to properly string words together.", "What was I just doing?"))) + owner.emote("drool") + if(BP_CHEST) + if(prob(3)) + to_chat(owner, SPAN_WARNING(pick("You feel a tightness in your chest.", "You feel a little lightheaded.", "You need to take larger breaths than normal."))) + owner.emote(pick("cough", "gasp")) + if(BP_GROIN) + if(prob(3)) + to_chat(owner, SPAN_WARNING(pick("You feel a sharp pain in your gut.", "You feel a little bloated."))) + owner.visible_message("[owner] winces slightly.") + owner.delayed_vomit() + else + if(prob(stage*2)) + to_chat(owner, SPAN_WARNING("You feel very lethargic.")) + if(stage >= 3) //after ~10 minutes + for(var/obj/item/organ/internal/O in owner.internal_organs) + if(O.parent_organ == parent_organ) + if(BP_IS_ROBOTIC(O)) + continue + if(prob(stage*stage)) + O.damage = min(O.damage+stage, O.max_damage) + + if(stage >= 4) //after 15 minutes + if(prob(3)) + owner.reagents.add_reagent(egg, 2) //malignant cells breaking off, enter circulatory/lymphatic nodes to spread diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm index 80e0da49d26..fac7a7eb166 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Drugs.dm @@ -284,7 +284,7 @@ if(prob(85)) M.emote(pick("twitch", "shiver")) else - M.seizure() + M.seizure(rand(2,3)) /singleton/reagent/drugs/colorspace name = "Colorspace" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 633d12b08e8..0102ce3d398 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -40,6 +40,12 @@ M.add_chemical_effect(CE_ITCH, M.chem_doses[type] * 2) M.adjustHydrationLoss(2*removed) M.adjustCloneLoss(2.5*removed) // Cell regeneration spiralling out of control resulting in genetic damage. + if(((M.chem_doses[type] > 30) && prob(2)) || ((M.bodytemperature < 189) && prob(10))) //Bicaridine treats arterial bleeding when dose is greater than 30u. Alternatively, if the drug is used in a cryotube. + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/external/E in H.organs) + if(E.status & ORGAN_ARTERY_CUT) + E.status &= ~ORGAN_ARTERY_CUT + M.visible_message("[M] spasms!", SPAN_DANGER("You feel a stabbing pain in your [E.name]!")) /singleton/reagent/bicaridine/overdose(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.dizziness = max(100, M.dizziness) @@ -47,12 +53,6 @@ M.adjustHydrationLoss(5*removed) M.adjustNutritionLoss(5*removed) - var/mob/living/carbon/human/H = M - if(M.chem_doses[type] > 30) //Bicaridine treats arterial bleeding when dose is greater than 30u and when the drug is overdosing (chemical volume in blood greater than 20). - for(var/obj/item/organ/external/E in H.organs) - if(E.status & ORGAN_ARTERY_CUT && prob(2)) - E.status &= ~ORGAN_ARTERY_CUT - /singleton/reagent/butazoline name = "Butazoline" description = "Butazoline, a recent improvement upon Bicaridine, is specialised at treating the most traumatic of wounds, though less so for treating severe bleeding." @@ -86,6 +86,13 @@ M.adjustHydrationLoss(2*removed) M.adjustCloneLoss(2.5*removed) //Cell regeneration spiralling out of control resulting in genetic damage. + if((M.bodytemperature < 192)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/head = H.get_organ(BP_HEAD) + if(head.disfigured && prob(10)) + M.visible_message("[M]'s face begins to contort back into it's original shape.", SPAN_DANGER("You feel a truly disgusting sensation as the skin and muscles of your face twist, crawl and turn.")) + head.disfigured = FALSE + /singleton/reagent/kelotane/overdose(var/mob/living/carbon/M, var/alien, var/datum/reagents/holder) var/mob/living/carbon/human/H = M var/obj/item/organ/external/head = H.get_organ(BP_HEAD) @@ -217,13 +224,14 @@ description = "Cryoxadone is a ground-breaking and complex medication that, when acting on bodies cooler than 170K, is capable of increasing the rate at which wounds regenerate, as well as treating genetic damage. Cryoxadone, alongside Clonexadone, are the backbones of the cloning industry." reagent_state = LIQUID color = "#8080FF" - metabolism = REM * 0.5 + metabolism = REM*3 //0.6u/t + overdose = 5 scannable = TRUE taste_description = "sludge" /singleton/reagent/cryoxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_CRYO, 1) - if(M.bodytemperature < 170 && !M.is_diona()) + if(M.bodytemperature < 170 && !M.is_diona() && (REAGENT_VOLUME(holder, type) < overdose)) M.add_chemical_effect(CE_PULSE, -2) M.add_chemical_effect(CE_OXYGENATED, 1) M.adjustCloneLoss(-100 * removed) @@ -232,22 +240,30 @@ var/mob/living/carbon/human/H = M for(var/obj/item/organ/internal/I in H.internal_organs) if(!BP_IS_ROBOTIC(I)) - I.heal_damage(20*removed) + if(I.organ_tag == BP_BRAIN) + if(I.damage > I.max_damage/2) //will only treat brain activity above 50% brain activity + continue + I.heal_damage(4*removed) else if(M.is_diona() && M.bodytemperature < 170) M.adjustFireLoss(5 * removed)//Cryopods kill diona. This damage combines with the normal cold temp damage, and their disabled regen +/singleton/reagent/cryoxadone/overdose(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + M.adjustCloneLoss(10*removed) //'genetic healing' spirals out of control. + M.add_chemical_effect(CE_OCULOTOXIC, 4*removed) + /singleton/reagent/clonexadone name = "Clonexadone" description = "Clonexadone is a ground-breaking, complex medication that improved upon Cryoxadone. When acting on bodies cooler than 170K, the drug is capable of increasing the rate at which wounds regenerate, as well as treating genetic damage. Clonexadone, alongside Cryoxadone, are the backbones of the cloning industry." reagent_state = LIQUID color = "#80BFFF" - metabolism = REM * 0.5 + metabolism = REM*2 //0.4u/t + overdose = 5 scannable = TRUE taste_description = "slime" /singleton/reagent/clonexadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_CRYO, 1) - if(M.bodytemperature < 170 && !M.is_diona()) + if(M.bodytemperature < 170 && !M.is_diona() && (REAGENT_VOLUME(holder, type) < overdose)) M.add_chemical_effect(CE_PULSE, -2) M.add_chemical_effect(CE_OXYGENATED, 2) M.adjustCloneLoss(-300 * removed) @@ -256,10 +272,17 @@ var/mob/living/carbon/human/H = M for(var/obj/item/organ/internal/I in H.internal_organs) if(!BP_IS_ROBOTIC(I)) - I.heal_damage(30*removed) + if(I.organ_tag == BP_BRAIN) + if(I.damage > I.max_damage/2) //will only treat brain activity above 50% brain activity + continue + I.heal_damage(4*removed) else if(M.is_diona() && M.bodytemperature < 170) M.adjustFireLoss(15 * removed)//Cryopods kill diona. This damage combines with the normal cold temp damage, and their disabled regen +/singleton/reagent/clonexadone/overdose(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + M.adjustCloneLoss(20*removed) //'genetic healing' spirals out of control. + M.add_chemical_effect(CE_OCULOTOXIC, 8*removed) + /* Painkillers */ /singleton/reagent/perconol @@ -552,6 +575,7 @@ M.add_chemical_effect(CE_PAINKILLER, 30) M.add_chemical_effect(CE_HALLUCINATE, -1) M.add_up_to_chemical_effect(CE_ADRENALINE, 1) + M.add_chemical_effect(CE_BLOODTHIN, 25) /singleton/reagent/synaptizine/overdose(var/mob/living/carbon/M, var/alien, var/datum/reagents/holder) if(prob(M.chem_doses[type] / 2)) @@ -560,7 +584,7 @@ if(prob(75)) M.emote(pick("twitch", "shiver")) else - M.seizure() + M.seizure(rand(1,2)) /singleton/reagent/alkysine name = "Alkysine" @@ -647,31 +671,47 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M H.add_chemical_effect(CE_CLUMSY, 1) + for(var/obj/item/organ/internal/I in H.internal_organs) if(I.organ_tag == BP_BRAIN) if(I.damage >= I.min_bruised_damage) continue if((I.damage > 0) && (I.robotic != 2)) //Peridaxon heals only non-robotic organs - I.damage = max(I.damage - removed, 0) + var/damage_healed = ((M.bodytemperature < 186) && M.chem_effects[CE_CRYO]) ? 2 : 1 //2x effective if administered in cryogenic conditions + I.damage = max(I.damage - damage_healed*removed, 0) + + if((M.bodytemperature < 153) && M.chem_effects[CE_ANTIBIOTIC]) //peridaxon in extracool cryogenic conditions alongside antibiotics will have a chance to de-nercotise liver and kidneys, though will incur overdose symptoms + H.infest_with_parasite(H, BP_TUMOUR_NONSPREADING, pick(H.organs), 10) + for(var/obj/item/organ/internal/O in H.internal_organs) + if((O.organ_tag == BP_LIVER) || (O.organ_tag == BP_KIDNEYS)) + if(O.damage && prob(5)) + if((O.status & ORGAN_DEAD) && !BP_IS_ROBOTIC(O)) + if(O.can_recover()) + O.status &= ~ORGAN_DEAD + O.heal_damage(5) + M.visible_message("[M] spasms!", SPAN_DANGER("You feel a stabbing pain!")) /singleton/reagent/peridaxon/overdose(var/mob/living/carbon/M, var/alien, var/datum/reagents/holder) M.dizziness = max(150, M.dizziness) M.make_dizzy(5) - if(prob(M.chem_doses[type] / 2)) - to_chat(M, SPAN_DANGER("You feel your insides twisting and burning.")) - M.adjustHalLoss(5) + if(REAGENT_VOLUME(M.reagents, /singleton/reagent/ryetalyn)) + return + var/mob/living/carbon/human/H = M + H.infest_with_parasite(H, BP_TUMOUR_NONSPREADING, pick(H.organs), 5) /singleton/reagent/ryetalyn name = "Ryetalyn" - description = "Ryetalyn is a novel, highly advanced, broad-spectrum medication, developed by Dominian scientists, which has varying clinical uses in treating genetic abnormalities including certain cancers, autoimmune conditions, and Hulk Syndrome." + description = "Ryetalyn is a highly advanced, broad-spectrum medication developed by Dominian scientists, which has varying clinical uses in treating genetic abnormalities including certain cancers, autoimmune conditions, and Hulk Syndrome." reagent_state = SOLID color = "#004000" overdose = REAGENTS_OVERDOSE taste_description = "acid" - metabolism = 1 + metabolism = REM metabolism_min = 0.25 /singleton/reagent/ryetalyn/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + holder.remove_reagent(/singleton/reagent/toxin/malignant_tumour_cells, 2) + var/needs_mutation_update = M.mutations > 0 M.mutations = 0 M.disabilities = 0 @@ -1048,6 +1088,8 @@ description = "Leporazine is a complex medication which improves thermal homeostasis, stabilising and regulating the body's core temperature. Leporazine often results in hyperventilation which should be monitored." reagent_state = LIQUID color = "#C8A5DC" + metabolism = REM/2 //0.1u/t + breathe_met = REM/4 //0.05u/t overdose = REAGENTS_OVERDOSE scannable = TRUE taste_description = "bitterness" @@ -1056,7 +1098,7 @@ if(!check_min_dose(M)) return M.add_up_to_chemical_effect(CE_NOFEVER, 5) //Also handles the effects of fevers - if(!(REAGENT_VOLUME(holder, type) > 20)) + if(!(REAGENT_VOLUME(holder, type) > overdose)) if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT)) else if(M.bodytemperature < 311) @@ -1315,34 +1357,58 @@ /singleton/reagent/cataleptinol name = "Cataleptinol" - description = "Cataleptinol is a highly advanced, expensive medication capable of regenerating the most damaged of brain tissues. Cataleptinol is used in the treatment of dumbness, cerebral blindness, cerebral paralysis and aphasia. The drug is more effective when the patient's core temperature is below 170K." + description = "Cataleptinol is a highly advanced, expensive medication recently developed by Yomi Genetics. Originally developed as a drug to facilitate the advanced cloning of non-human animal brains for wealthy pet owners, some doctors have found it exceptional at treating significant brain injuries in humans. The drug is licensed as a safe medication for use in cryogenics; outside of cryogenic conditions, the drug performs worse, though emergency, off-label uses of cataleptinol can prove lifesaving." reagent_state = LIQUID color = "#FFFF00" - metabolism = REM //0.2u/tick - overdose = 15 + metabolism = REM*3 //0.6u/t + od_minimum_dose = 2.4 + overdose = 3 scannable = TRUE - taste_description = "bitterness" + taste_description = "sharp cardamom" metabolism_min = REM * 0.25 - /singleton/reagent/cataleptinol/affect_blood(var/mob/living/carbon/human/M, var/alien, var/removed, var/datum/reagents/holder) - M.add_chemical_effect(CE_PAINKILLER, 10) - M.dizziness = max(100, M.dizziness) - M.make_dizzy(5) - var/chance = M.chem_doses[type]*removed - if(M.bodytemperature < 170) - chance = (chance*4) + 5 - M.add_chemical_effect(CE_BRAIN_REGEN, 30) //1 unit of cryo-tube Cataleptinol will raise brain activity by 10%. - else - M.add_chemical_effect(CE_BRAIN_REGEN, 20) //1 unit of Cataleptinol will raise brain activity by 5%. + if(REAGENT_VOLUME(M.reagents, /singleton/reagent/alkysine)) //don't mix alkysine and cataleptinol + overdose(M, alien, removed, holder) + return + var/obj/item/organ/internal/brain = M.internal_organs_by_name[BP_BRAIN] + if((M.bodytemperature < 179) && (M.chem_effects[CE_CRYO])) //best use in cryogenics, experiment with Balanced or Prioritising Metabolisation settings, aiming for a gas cooler temperature target that minimises the cryostasis multiplier. remember the cryotube heats slowly when someone is inside. + if(brain) + if(brain.damage && brain.damage < brain.max_damage && !(M.chem_effects[CE_NEUROTOXIC])) //skips the oxygenation check under brain.dm + brain.damage = max(brain.damage - 16*removed, 0) //high number, as cryo slows metabolism. also needs to slightly outpace rough injuries to actually make it worthwhile to use. + else //without cryogenics. skips the oxygen check, however has large downsides if not pushed thorugh an IV to moderate volume in blood. + if(brain) + if(brain.damage && brain.damage < brain.max_damage && !(M.chem_effects[CE_NEUROTOXIC]) && prob(75)) + brain.damage = max(brain.damage - 8*removed, 0) //pretty slow, non-guaranteed brain healing - 75% chance of restoring 2.5% brain activity per tick. only really useful during apocalyptic scenarios. + M.dizziness = max(200, M.dizziness + 15) + M.hallucination = max(M.hallucination, 100) + M.add_chemical_effect(CE_BLOODTHIN, 40) //treat (arterial) bleeding first + if(prob(40)) + to_chat(M, SPAN_HIGHDANGER(pick("You have a painful headache!", "You feel a throbbing pain behind your eyes!", "You feel a painful pressure build up within your skull!", "An unbearable pain radiates throughout your head!"))) + M.adjustHalLoss(rand(30,60)) //painshock levels of pain, though still managable. + M.Weaken(2) + M.stuttering = 40 + M.emote(pick("flail", "twitch_v", "choke", "scream")) + else if(prob(25)) + if(prob(50)) + to_chat(M, SPAN_WARNING(pick("You feel a tingly sensation in your body.", "You can smell something unusual.", "You can taste something unusual."))) + else + M.emote(pick("twitch", "shiver")) + +/singleton/reagent/cataleptinol/affect_chem_effect(var/mob/living/carbon/M, var/alien, var/removed) //hallucinations done under here so antipsychotics can still work + . = ..() + if(.) + M.add_chemical_effect(CE_HALLUCINATE, 2) + if(prob(40)) + M.add_chemical_effect(CE_HEPATOTOXIC, 2) //major downside of using cataleptinol, this will create more problems if left unchecked. outside of cryogenic conditions, this translates to trading ~25% brain activity for total liver failure; in cryogenic conditions, you trade ~40% brain activity for total liver failure. /singleton/reagent/cataleptinol/overdose(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) - M.hallucination = max(M.hallucination, 15) - if(prob(5)) - to_chat(M, SPAN_WARNING(pick("You have a painful headache!", "You feel a throbbing pain behind your eyes!"))) - ..() - + M.add_chemical_effect(CE_NEUROTOXIC, 6*removed) //crashes both the brain & liver if you OD. Neurotoxic also stops it from healing, so you just fucked up a patient for no gain. + if(prob(40)) + M.add_chemical_effect(CE_HEPATOTOXIC, 2) //stacks on top of ambient liver damage from using cataleptinol + if(prob(30)) + M.seizure(rand(2,3)) /singleton/reagent/fluvectionem name = "Fluvectionem" @@ -1379,6 +1445,11 @@ . = ..() +/singleton/reagent/fluvectionem/affect_chem_effect(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + . = ..() + if(.) + M.add_chemical_effect(CE_BLOODTHIN, 25) + /singleton/reagent/pulmodeiectionem name = "Pulmodeiectionem" description = "Pulmodeiectionem is a complex anti-toxin medication that is capable of purging the lungs of toxic reagents by damaging the mucous lining of the bronchi and trachea, allowing particulate to be coughed out of the lungs. Pulmodeiectionem works only when inhaled and can cause long-term damage to the lungs." @@ -1477,7 +1548,7 @@ /singleton/reagent/sanasomnum name = "Sanasomnum" - description = "Not strictly a drug, Sanasomnum is actually a cocktail of biomechanical stem cells, which induce a regenerative state of unconsciousness capable healing almost any injury in minutes - however, usage nearly guarantees long-term and irreversible complications, and it is banned from medical use throughout the spur." + description = "Not strictly a drug, Sanasomnum is a cocktail of biomechanical stem cells known to cause paralysis and cancerous growths in the few human studies it was trialled during. As a result, little further research has been done on it... nothing that's available to the public, at least." reagent_state = SOLID color = "#b2db5e" overdose = REAGENTS_OVERDOSE diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 584276d4a3b..b0764f016b5 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -550,17 +550,31 @@ description = "A bright orange powder consisting of strange self-heating properties that reacts when exposed to sodium chloride." reagent_state = SOLID color = "#FFFF00" + scannable = TRUE + breathe_met = REM/2 + touch_met = REM/2 taste_description = "chalk" default_temperature = 600 //Kelvin -/singleton/reagent/cryosurfactant - name = "Cryosurfactant" +/singleton/reagent/pyrosilicate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + if(M.bodytemperature < M.species.heat_level_3) + M.bodytemperature = min(474, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) +/singleton/reagent/cryosilicate + name = "Cryosilicate" description = "A bright cyan liquid consisting of strange self-cooling properties that reacts when exposed to water." reagent_state = LIQUID color = "#00FFFF" + scannable = TRUE + breathe_met = REM/2 + touch_met = REM/2 taste_description = "needles" default_temperature = 100 //Kelvin +/singleton/reagent/cryosilicate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + if(!(REAGENT_VOLUME(M.reagents, /singleton/reagent/leporazine) > 5)) + if(M.bodytemperature > M.species.cold_level_3) + M.bodytemperature = max(140, M.bodytemperature - (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) + /singleton/reagent/venenum name = "Venenum" description = "A thick tar like liquid that seems to move around on it's own every now and then. Limited data shows it only works when injected into the bloodstream." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 6909bf7106b..9debeb92908 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -805,6 +805,16 @@ if(prob(5)) M.emote(pick("twitch_v", "grunt")) + if((M.bodytemperature < 151)) //red nightshade in extracool cryogenic conditions will restore bonebreaks, at the cost of blood depletion + var/mob/living/carbon/human/H = M + H.vessel.remove_reagent(/singleton/reagent/blood, rand(15,30)) + for(var/obj/item/organ/external/E in H.organs) + if(E.status & ORGAN_BROKEN) + if(prob(10)) + H.vessel.remove_reagent(/singleton/reagent/blood, rand(30, 60)) + E.status &= ~ORGAN_BROKEN + M.visible_message("[M] spasms!", SPAN_DANGER("You feel a stabbing pain!")) + /singleton/reagent/toxin/berserk/overdose(var/mob/living/carbon/M, var/datum/reagents/holder) if(prob(25)) M.add_chemical_effect(CE_CARDIOTOXIC, 1) @@ -997,3 +1007,23 @@ var/obj/item/organ/external/affected = H.get_organ(BP_CHEST) var/obj/item/organ/internal/parasite/heartworm/infest = new() infest.replaced(H, affected) + +/singleton/reagent/toxin/malignant_tumour_cells + name = "Malignant Tumour Cells" + description = "Cells of a malignant tumour which have broken off and entered the circulatory and/or lymphatic system to spread to other regions of the body." + reagent_state = SOLID + color = "#460000" + metabolism = REM/2 //Slow metabolisation so medical can potentially screen it early, given it's danger. + ingest_mul = 0 + touch_mul = 0 + breathe_mul = 0 + taste_description = "blood" + taste_mult = 0.1 + strength = 0 + +/singleton/reagent/toxin/malignant_tumour_cells/affect_blood(mob/living/carbon/M, alien, removed, datum/reagents/holder) + ..() + var/mob/living/carbon/human/H = M + if(!(REAGENT_VOLUME(M.reagents, /singleton/reagent/cytophenolate)) && !H.internal_organs_by_name[BP_TUMOUR_SPREADING]) //only affects people with immunosuppressants or a pre-existing malignant tumour + return + H.infest_with_parasite(H, BP_TUMOUR_SPREADING, pick(H.organs), 10) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index e2f8efdb050..3ae859bbc35 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -733,7 +733,8 @@ name = "Cataleptinol" id = "cataleptinol" result = /singleton/reagent/cataleptinol - required_reagents = list(/singleton/reagent/toxin/phoron = 0.1, /singleton/reagent/alkysine = 1, /singleton/reagent/cryoxadone = 0.1) + required_reagents = list(/singleton/reagent/toxin/phoron = 0.5, /singleton/reagent/alkysine = 2, /singleton/reagent/clonexadone = 1) + catalysts = list(/singleton/reagent/cryosilicate = 5) result_amount = 1 /datum/chemical_reaction/coughsyrup @@ -3891,41 +3892,41 @@ result_amount = 4 required_reagents = list(/singleton/reagent/silicate = 1, /singleton/reagent/acid = 1, /singleton/reagent/hydrazine = 1, /singleton/reagent/iron = 1) -/datum/chemical_reaction/cryosurfactant - name = "Cryosurfactant" - id = "cryosurfactant" - result = /singleton/reagent/cryosurfactant +/datum/chemical_reaction/cryosilicate + name = "Cryosilicate" + id = "cryosilicate" + result = /singleton/reagent/cryosilicate result_amount = 3 - required_reagents = list(/singleton/reagent/surfactant = 1, /singleton/reagent/drink/ice = 1, /singleton/reagent/sodium = 1) + required_reagents = list(/singleton/reagent/silicate = 1, /singleton/reagent/drink/ice = 1, /singleton/reagent/sodium = 1) //WATER -/datum/chemical_reaction/cryosurfactant_cooling_water - name = "Cryosurfactant Cooling Water" - id = "cryosurfactant_cooling_water" +/datum/chemical_reaction/cryosilicate_cooling_water + name = "Cryosilicate Cooling Water" + id = "cryosilicate_cooling_water" result = null result_amount = 1 - required_reagents = list(/singleton/reagent/cryosurfactant = 1) + required_reagents = list(/singleton/reagent/cryosilicate = 1) inhibitors = list(/singleton/reagent/pyrosilicate = 1) catalysts = list(/singleton/reagent/water = 1) mix_message = "The solution begins to freeze." -/datum/chemical_reaction/cryosurfactant_cooling_water/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) - holder.del_reagent(/singleton/reagent/cryosurfactant) +/datum/chemical_reaction/cryosilicate_cooling_water/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) + holder.del_reagent(/singleton/reagent/cryosilicate) holder.add_thermal_energy(-created_volume*500) //ICE -/datum/chemical_reaction/cryosurfactant_cooling_ice - name = "Cryosurfactant Cooling Ice" - id = "cryosurfactant_cooling_ice" +/datum/chemical_reaction/cryosilicate_cooling_ice + name = "Cryosilicate Cooling Ice" + id = "cryosilicate_cooling_ice" result = null result_amount = 1 - required_reagents = list(/singleton/reagent/cryosurfactant = 1) + required_reagents = list(/singleton/reagent/cryosilicate = 1) inhibitors = list(/singleton/reagent/pyrosilicate = 1) catalysts = list(/singleton/reagent/drink/ice = 1) mix_message = "The solution begins to freeze." -/datum/chemical_reaction/cryosurfactant_cooling_ice/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) - holder.del_reagent(/singleton/reagent/cryosurfactant) +/datum/chemical_reaction/cryosilicate_cooling_ice/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) + holder.del_reagent(/singleton/reagent/cryosilicate) holder.add_thermal_energy(-created_volume*500) /datum/chemical_reaction/pyrosilicate_heating @@ -3934,22 +3935,22 @@ result = null result_amount = 1 required_reagents = list(/singleton/reagent/pyrosilicate = 1) - inhibitors = list(/singleton/reagent/cryosurfactant = 1) + inhibitors = list(/singleton/reagent/cryosilicate = 1) catalysts = list(/singleton/reagent/sodiumchloride = 1) /datum/chemical_reaction/pyrosilicate_heating/on_reaction(var/datum/reagents/holder, var/created_volume) holder.del_reagent(/singleton/reagent/pyrosilicate) holder.add_thermal_energy(created_volume*1000) -/datum/chemical_reaction/pyrosilicate_cryosurfactant - name = "Pyrosilicate Cryosurfactant Reaction" - id = "pyrosilicate_cryosurfactant" +/datum/chemical_reaction/pyrosilicate_cryosilicate + name = "Pyrosilicate Cryosilicate Reaction" + id = "pyrosilicate_cryosilicate" result = null - required_reagents = list(/singleton/reagent/pyrosilicate = 1, /singleton/reagent/cryosurfactant = 1) + required_reagents = list(/singleton/reagent/pyrosilicate = 1, /singleton/reagent/cryosilicate = 1) required_temperature_min = T0C //Does not react when below these temperatures. result_amount = 1 -/datum/chemical_reaction/pyrosilicate_cryosurfactant/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) +/datum/chemical_reaction/pyrosilicate_cryosilicate/on_reaction(var/datum/reagents/holder, var/created_volume, var/created_thermal_energy) if(created_volume) var/turf/simulated/floor/T = get_turf(holder.my_atom.loc) if(istype(T)) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 00e04ae43f7..acad3bd2600 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -1,6 +1,6 @@ /obj/item/storage/box/bloodpacks - name = "blood packs bags" - desc = "This box contains blood packs." + name = "\improper IV bags" + desc = "This box contains IV bags." illustration = "blood" /obj/item/storage/box/bloodpacks/fill() @@ -14,7 +14,7 @@ new /obj/item/reagent_containers/blood/empty(src) /obj/item/reagent_containers/blood - name = "blood pack" + name = "\improper IV bag" desc = "Contains fluids used for transfusions." icon = 'icons/obj/bloodpack.dmi' icon_state = "bloodpack" @@ -37,7 +37,7 @@ /obj/item/reagent_containers/blood/Initialize() . = ..() if(blood_type != null) - name = "blood pack [blood_type]" + name = "\improper IV bag - [blood_type] blood" reagents.add_reagent(/singleton/reagent/blood, volume, list("donor"=null,"blood_DNA"=null,"blood_type"=blood_type,"trace_chem"=null,"dose_chem"=null)) w_class = ITEMSIZE_NORMAL update_icon() @@ -163,10 +163,10 @@ /obj/item/reagent_containers/blood/attackby(obj/item/attacking_item, mob/user) ..() if (attacking_item.ispen()) - if (REAGENT_VOLUME(reagents, /singleton/reagent/blood) && name != "empty blood pack") //Stops people mucking with bloodpacks that are filled + if (REAGENT_VOLUME(reagents, /singleton/reagent/blood) && name != "empty IV bag") //Stops people mucking with bloodpacks that are filled to_chat(user, SPAN_NOTICE("You can't relabel [name] until it is empty!")) return - var/blood_name = tgui_input_list(user, "What blood type would you like to label it as?", "Blood Types", list("A+", "A-", "B+", "B-", "O+", "O-", "AB+", "AB-", "Saline Plus", "Clear", "Cancel")) + var/blood_name = tgui_input_list(user, "What would you like to label the IV bag?", "Label Selection", list("A+ blood", "A- blood", "B+ blood", "B- blood", "O+ blood", "O- blood", "AB+ blood", "AB- blood", "Saline Plus", "Cryonics mixture", "Other mixture", "Clear", "Cancel")) if(blood_name == "Cancel") return var/obj/item/i = user.get_active_hand() @@ -176,13 +176,13 @@ blood_type = null name = initial(name) desc = initial(desc) - to_chat(user, SPAN_NOTICE("You clear the blood pack label.")) + to_chat(user, SPAN_NOTICE("You clear the IV bag label.")) update_icon() return blood_type = blood_name - name = "blood pack [blood_type]" + name = "\improper IV bag - [blood_type]" desc = "Contains fluids used for transfusions." - to_chat(user, SPAN_NOTICE("You label the blood pack as [blood_type].")) + to_chat(user, SPAN_NOTICE("You label the IV bag as [blood_type].")) update_icon() return @@ -269,12 +269,12 @@ blood_type = "O-" /obj/item/reagent_containers/blood/empty - name = "empty blood pack" + name = "empty IV bag" desc = "Seems pretty useless... Maybe if there were a way to fill it?" icon_state = "bloodpack" /obj/item/reagent_containers/blood/ripped - name = "ripped blood pack" + name = "ripped IV bag" desc = "It's torn up and useless." icon = 'icons/obj/bloodpack.dmi' icon_state = "ripped" diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 902fa38bfe4..59c5572a3e3 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -145,15 +145,15 @@ /obj/item/reagent_containers/glass/bottle/pyrosilicate name = "pyrosilicate bottle" - desc = "A small bottle. Contains pyrosilicate - used to heat up reagents." + desc = "A small bottle. Contains pyrosilicate which is used to heat up reagents." icon_state = "bottle-4" reagents_to_add = list(/singleton/reagent/pyrosilicate = 60) -/obj/item/reagent_containers/glass/bottle/cryosurfactant - name = "cryosurfactant bottle" - desc = "A small bottle. Contains cryosurfactant - used to cool down reagents." +/obj/item/reagent_containers/glass/bottle/cryosilicate + name = "cryosilicate bottle" + desc = "A small bottle. Contains cryosilicate which is used to cool down reagents." icon_state = "bottle-4" - reagents_to_add = list(/singleton/reagent/cryosurfactant = 60) + reagents_to_add = list(/singleton/reagent/cryosilicate = 60) /obj/item/reagent_containers/glass/bottle/epinephrine name = "epinephrine bottle" @@ -229,7 +229,7 @@ /obj/item/reagent_containers/glass/bottle/trioxin name = "hylemnomil-zeta vial" - desc = "A small, unmarked lial with an ominous label. It contains a swirling, purple liquid." + desc = "A small, unmarked vial with an ominous label. It contains a swirling, purple liquid." icon_state = "bouteille" reagents_to_add = list(/singleton/reagent/toxin/hylemnomil = 60) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index f9d91e99f3e..e027eb73c25 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -321,7 +321,7 @@ /obj/item/reagent_containers/hypospray/autoinjector/sanasomnum name = "sanasomnum autoinjector" - desc = "A special autoinjector loaded with outlawed biomechanical stem cells, inducing a regenerative coma so intense it can heal almost any injury - even broken bones, organ and brain damage, severed tendons, and arterial damage. Upon use one will fall immediately into a state of unconsciousness lasting roughly three to five minutes, arising completely healed. The only thing it cannot fix are organs that have been destroyed outright, or so much cumulative damage that death is all but certain. The only downside is that Sanasomnum use guarantees extreme cancerous growth months or years down the line, which is invariably fatal in the long-term. However, in the short-term, it will save your life." + desc = "An autoinjector loaded with sanasomnum, an experimental and outlawed combination medicine known to cause paralysis and cancerous growths in the few human studies it was trialled during. As a result, little further research has been done on it... nothing that's available to the public, at least." //antag chemical. this is the non-antag facing description so no one reads the autoinjector desc and considers it fairgame to then use it. volume = 20 amount_per_transfer_from_this = 20 diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 3fe9403e073..bd2de09f860 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -370,3 +370,8 @@ icon_state = "cleanertablet" reagents_to_add = list(/singleton/reagent/spacecleaner = 15) +/obj/item/reagent_containers/pill/ryetalyn + name = "10u Ryetalyn Pill" + desc = "A medicine used to treat genetic conditions, including benign and malignant tumours." + icon_state = "pill11" + reagents_to_add = list(/singleton/reagent/ryetalyn = 10) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 14bc17e07af..45b5c7b7ece 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -419,11 +419,8 @@ if(src.loc) var/datum/gas_mixture/env = src.loc.return_air() - if(env) - if (reagents.total_volume > 750) - env.temperature = 0 - else if (reagents.total_volume > 500) - env.temperature -= 100 + if(env && reagents.total_volume) + env.temperature = max(173, env.temperature - (reagents.total_volume/10)) QDEL_IN(src, 10) diff --git a/html/changelogs/kermit-cryonicsadditions.yml b/html/changelogs/kermit-cryonicsadditions.yml new file mode 100644 index 00000000000..b76d874fbfe --- /dev/null +++ b/html/changelogs/kermit-cryonicsadditions.yml @@ -0,0 +1,21 @@ +author: kermit + +delete-after: True + +changes: + - qol: "Cryotubes apply less stasis at temperatures between 120K and 200K, meaning cryotube beaker mixes are more viable." + - rscadd: "Cataleptinol (new recipe: 0.5u phoron, 2u alkysine, 1u clonexadone and a 5u cryosilicate catalyst) has been reworked from the ground up to be more useful and versatile. Cataleptinol will heal brain activity regardless of oxygenation - at cryo temperatures, this is with no consequence; outside of cryogenics, the benefits come with large consequences which will exacerbate any medical conditions." + - rscadd: "Cryo/Clonexadone both overdose at 5u. This isn't anything to worry about when using Cryo/Clonexadone in a cryotube; using these two chemicals outside of cryotubes requires much greater care. Added ocular toxicity (eye damage) for use by Cryo/Clonexadone's overdose." + - balance: "Significantly nerfs Cryo/Clonexadone's organ healing. It's still there, but pharmacist's can improve upon the organ healing - it's also required due to metabolisation/stasis changes. Cryo/Clonexadone only heals brain damage above the 50% mark." + - rscadd: "Renames Cryosurfactant -> Cryosilicate. The recipe now also uses silicate instead of surfactant." + - rscadd: "Pyrosilicate and Cryosilicate respectively superheat or supercool the body, making them useful for inducing cryogenic conditions or chemically incinerating someone. Leporazine inhibits these functions." + - rscadd: "Adds a chemical effect for blood thinning - essentially an anti-coagzolug effect, it makes you bleed faster. Will prevent coagzolug from working. Currently used by Cataleptinol, Fluvectionem and Synaptizine." + - qol: "Bicaridine's AB fixing requires a minimum of 30u (you should still use more than this - every 0.1u above this is another roll of 'will it fix the AB?') instead of a minimum of 50u. Alternatively, you can used bicaridine in a cryotube." + - rscadd: "Kelotane can now be used in a cryotube to fix disfiguration. Red Nightshade in cryogenic conditions will restore bone breaks. Peridaxon+Thetamycin combo can de-necrose livers/kidneys in cryogenic conditions." + - rscadd: "Overdosing peridaxon results in the developing of benign tumours; benign tumours do not spread or cause collateral damage to organs, they simply cause pain. Ryetalyn will put a tumour into recession." + - rscadd: "Genetic damage now results in the developing of malignant tumours; malignant tumours will eventually spread and cause collateral damage to organs. Symptoms will be different depending on the tumour's location. Ryetalyn will put a tumour into recession - some ryetalyn pills can be found in the GTR's Medication Cabinet." + - balance: "Limb deformities resulting from genetic damage may occur more often." + - imageadd: "Renames Blood Pack -> IV Bag. Adds 'Cryonics Mixture' and 'Other Mixture' IV bag labels." + - rscadd: "Cryocells can be deconstructed or have their components upgraded. Upgrading the components increases the effectiveness of the Cryostasis Settings." + - bugfix: "Coolant tanks no longer anti-nuke an environment's atmosphere when destroyed." + - bugfix: "Cryotubes no longer render synthetics unconscious - IPCs can now bathe in cryotubes to cool off." diff --git a/icons/obj/bloodpack.dmi b/icons/obj/bloodpack.dmi index cbfc8828184..4c6f9952a47 100644 Binary files a/icons/obj/bloodpack.dmi and b/icons/obj/bloodpack.dmi differ diff --git a/icons/obj/organs/organs.dmi b/icons/obj/organs/organs.dmi index 475f1f9f9c3..8e47b189d82 100644 Binary files a/icons/obj/organs/organs.dmi and b/icons/obj/organs/organs.dmi differ diff --git a/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm b/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm index 0b3c656a2af..bc932e028dc 100644 --- a/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm +++ b/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm @@ -20411,6 +20411,7 @@ /obj/item/storage/pill_bottle/dylovene, /obj/item/storage/pill_bottle/bicaridine, /obj/item/storage/pill_bottle/kelotane, +/obj/item/storage/pill_bottle/ryetalyn, /obj/item/reagent_containers/syringe/antiparasitic, /obj/item/reagent_containers/syringe/antiparasitic, /obj/item/reagent_containers/glass/bottle/antitoxin,