diff --git a/aurorastation.dme b/aurorastation.dme index 6d14d6dfe26..30046430bc4 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -380,6 +380,7 @@ #include "code\datums\uplink\ammunition.dm" #include "code\datums\uplink\announcements.dm" #include "code\datums\uplink\badassery.dm" +#include "code\datums\uplink\bioweapons.dm" #include "code\datums\uplink\corporate_equipment.dm" #include "code\datums\uplink\devices_and_tools.dm" #include "code\datums\uplink\exosuit.dm" diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index cc7ee692edb..9c97c0d57c1 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -80,6 +80,7 @@ #define CE_OXYGENATED "oxygenated" // Dexalin #define CE_BLOODCLOT "bloodclot" // Coagzolug #define CE_ORGANREPAIR "organrepair" // Rezadone +#define CE_ANTIPARASITE "antiparasite" // Helmizole, garlic // Deal damage #define CE_BREATHLOSS "breathloss" diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 5266f1b95fd..eeb718185a6 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -140,8 +140,10 @@ #define BP_OPTICS "optics" #define BP_IPCTAG "ipc tag" -// Zombie organ +// Parasite organs #define BP_ZOMBIE_PARASITE "black tumour" +#define BP_WORM_HEART "heart fluke" +#define BP_WORM_NERVE "nerve fluke" //Augment organs #define BP_AUG_TIMEPIECE "integrated timepiece" diff --git a/code/datums/uplink/bioweapons.dm b/code/datums/uplink/bioweapons.dm new file mode 100644 index 00000000000..d637f8dc137 --- /dev/null +++ b/code/datums/uplink/bioweapons.dm @@ -0,0 +1,45 @@ +// Chemical, Biological, Radiological ~~and Nuclear~~ Weapons +/datum/uplink_item/item/bioweapons + category = /datum/uplink_category/bioweapons + +/datum/uplink_item/item/bioweapons/random_toxin + name = "Random Toxins Kit" + desc = "A kit that contains 3 vials containing random toxins. Comes with a syringe!" + item_cost = 1 + path = /obj/item/storage/box/syndie_kit/toxin + +/datum/uplink_item/item/bioweapons/nerveworms_kit + name = "Parasitic Worms Kit - Nerve Fluke" + desc = "Contains the eggs of a Nerve Fluke. Non-lethal but incapacitating." + item_cost = 3 + path = /obj/item/storage/box/syndie_kit/nerveworms + +/datum/uplink_item/item/bioweapons/heartworms_kit + name = "Parasitic Worms Kit - Heart Fluke" + desc = "Contains the eggs of a Heart Fluke. Lethal if left untreated." + item_cost = 5 + path = /obj/item/storage/box/syndie_kit/heartworms + +/datum/uplink_item/item/bioweapons/greimorian_eggs + name = "Greimorian Eggs" + desc = "A cluster of greimorian eggs. (They will be planted at your feet on-purchase and CANNOT be moved, so make sure you're where you want them to be)" + item_cost = 4 + path = /obj/effect/spider/eggcluster + +/datum/uplink_item/item/bioweapons/radsuit + name = "Radiation Suit" + desc = "A kit containing a radiation suit. Complete with a geiger counter and one anti-radiation tablet." + item_cost = 1 + path = /obj/item/storage/box/syndie_kit/radsuit + +/datum/uplink_item/item/bioweapons/dirtybomb + name = "Dirty Bomb" + desc = "A small explosive laced with radium. The explosion is small, but the radioactive will affect a large area for a while (10 minutes approx)." + item_cost = 4 + path = /obj/item/plastique/dirty + +/datum/uplink_item/item/bioweapons/syringe_gun + name = "Syringe Gun Kit" + desc = "A kit containing a syringe gun and 3 disassembled darts. Fill a syringe, add it to a dart, then load into the rifle." + item_cost = 3 + path = /obj/item/storage/box/syndie_kit/syringe_gun diff --git a/code/datums/uplink/stealthy and inconspicuous weapons.dm b/code/datums/uplink/stealthy and inconspicuous weapons.dm index 6e0584b3853..92656cdf2de 100644 --- a/code/datums/uplink/stealthy and inconspicuous weapons.dm +++ b/code/datums/uplink/stealthy and inconspicuous weapons.dm @@ -14,12 +14,6 @@ item_cost = 1 path = /obj/item/storage/box/syndie_kit/cigarette -/datum/uplink_item/item/stealthy_weapons/random_toxin - name = "Random Toxins Kit" - desc = "A kit that contains 3 vials containing random toxins. Comes with a syringe!" - item_cost = 1 - path = /obj/item/storage/box/syndie_kit/toxin - /datum/uplink_item/item/stealthy_weapons/pens name = "Pen-jector Kit" desc = "A kit that contains four differently coloured pens. A blue pacifying pen, a green pen containing healing chemicals, and a yellow hyperzine pen." diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm index f7d111c0b69..3ce81e2cec8 100644 --- a/code/datums/uplink/uplink_categories.dm +++ b/code/datums/uplink/uplink_categories.dm @@ -88,3 +88,6 @@ /datum/uplink_category/martial_arts name = "Martial Arts" + +/datum/uplink_category/bioweapons + name = "Chemical, Biological & Radiological Weaponary" diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index c8f3b3914a6..e77b877ea3c 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -65,3 +65,25 @@ reagents.add_reagent(/singleton/reagent/venenum,volume) desc = "Contains venenum." update_icon() + +/obj/item/reagent_containers/glass/beaker/vial/nerveworm_eggs + flags = 0 + +/obj/item/reagent_containers/glass/beaker/vial/nerveworm_eggs/Initialize() + . = ..() + if(is_open_container()) + flags ^= OPENCONTAINER + reagents.add_reagent(/singleton/reagent/toxin/nerveworm_eggs, 2) + desc = "BIOHAZARDOUS! - Nerve Fluke eggs. Purchased from SciSupply Eridani, recently incorporated into Zeng-Hu Pharmaceuticals' Keiretsu!" + update_icon() + +/obj/item/reagent_containers/glass/beaker/vial/heartworm_eggs + flags = 0 + +/obj/item/reagent_containers/glass/beaker/vial/heartworm_eggs/Initialize() + . = ..() + if(is_open_container()) + flags ^= OPENCONTAINER + reagents.add_reagent(/singleton/reagent/toxin/heartworm_eggs, 2) + desc = "BIOHAZARDOUS! - Heart Fluke eggs. Purchased from SciSupply Eridani, recently incorporated into Zeng-Hu Pharmaceuticals' Keiretsu!" + update_icon() diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 5aa0a92a235..3b22fd48699 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -138,3 +138,21 @@ R.cell.use(1000) can_deploy = TRUE maptext = "Ready" + +/obj/item/plastique/dirty + name = "dirty bomb" + desc = "A small explosive laced with radium. The explosion is small, but the radioactive material will remain for a fair while." + timer = 300 + +/obj/item/plastique/dirty/attack_self(mob/user as mob) + var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num + if(user.get_active_hand() == src) + newtime = Clamp(newtime, 300, 60000) + timer = newtime + to_chat(user, SPAN_NOTICE("Timer set for [timer] seconds.")) + +/obj/item/plastique/dirty/explode(turf/location) + if(location) + SSradiation.radiate(src, 250) + new /obj/effect/decal/cleanable/greenglow(get_turf(src)) + ..() diff --git a/code/game/objects/items/weapons/storage/pill_bottle.dm b/code/game/objects/items/weapons/storage/pill_bottle.dm index 53e7386a32b..74a33b5ab87 100644 --- a/code/game/objects/items/weapons/storage/pill_bottle.dm +++ b/code/game/objects/items/weapons/storage/pill_bottle.dm @@ -142,7 +142,7 @@ starts_with = list(/obj/item/reagent_containers/pill/parvosil = 3) /obj/item/storage/pill_bottle/assorted - name = "pill bottle (assorted)" + name = "bottle of assorted pills" desc = "Commonly found on paramedics, these assorted pill bottles contain all the basics." starts_with = list( /obj/item/reagent_containers/pill/inaprovaline = 6, @@ -155,6 +155,21 @@ ) /obj/item/storage/pill_bottle/antidexafen - name = "pill bottle (cold medicine)" + name = "bottle of 15u Antidexafen pills" desc = "All-in-one cold medicine. 15u dose per pill. Safe for babies like you!" starts_with = list(/obj/item/reagent_containers/pill/antidexafen = 21) + +/obj/item/storage/pill_bottle/antiparasitic + name = "bottle of 5u Helmizole pills" + desc = "Contains pills used to treat parasitic infections caused by worms." + starts_with = list(/obj/item/reagent_containers/pill/antiparasitic = 8) + +/obj/item/storage/pill_bottle/asinodryl + name = "bottle of 10u Asinodryl pills" + desc = "Contains pills used to treat nausea and vomiting." + starts_with = list(/obj/item/reagent_containers/pill/asinodryl = 8) + +/obj/item/storage/pill_bottle/steramycin + name = "bottle of 5u Steramycin pills" + desc = "Contains prophylactic antibiotic pills." + starts_with = list(/obj/item/reagent_containers/pill/steramycin = 3) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 6abacd3bc52..965d56b2079 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -197,3 +197,23 @@ starts_with = list( /obj/item/reagent_containers/hypospray/autoinjector/berserk = 2 ) + +/obj/item/storage/box/syndie_kit/nerveworms + name = "nerve fluke kit" + desc = "Contains the eggs of a Nerve Fluke (non-lethal, incapacitating)." + starts_with = list(/obj/item/reagent_containers/glass/beaker/vial/nerveworm_eggs = 1, /obj/item/reagent_containers/syringe = 1, /obj/item/reagent_containers/pill/antiparasitic = 1, /obj/item/reagent_containers/pill/asinodryl = 1) + +/obj/item/storage/box/syndie_kit/heartworms + name = "heart fluke kit" + desc = "Contains the eggs of a Heart Fluke (lethal)." + starts_with = list(/obj/item/reagent_containers/glass/beaker/vial/heartworm_eggs = 1, /obj/item/reagent_containers/syringe = 1, /obj/item/reagent_containers/pill/antiparasitic = 1, /obj/item/reagent_containers/pill/asinodryl = 1) + +/obj/item/storage/box/syndie_kit/radsuit + name = "radiation suit kit" + desc = "Contains a radiation suit and geiger counter to protect you from radiation." + starts_with = list(/obj/item/clothing/head/radiation = 1, /obj/item/clothing/suit/radiation = 1, /obj/item/clothing/glasses/safety/goggles = 1, /obj/item/device/geiger = 1, /obj/item/reagent_containers/pill/hyronalin = 1) + +/obj/item/storage/box/syndie_kit/syringe_gun + name = "syringe gun kit" + desc = "Contains a syringe gun and the parts require to assemble a few darts." + starts_with = list(/obj/item/gun/launcher/syringe = 1, /obj/item/syringe_cartridge = 3, /obj/item/reagent_containers/syringe = 3) diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index c814a53c2f5..8dbd1ab0532 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -152,12 +152,24 @@ /obj/item/stack/medical/splint = 1, /obj/item/bodybag = 2, /obj/item/bodybag/cryobag = 1, - /obj/item/storage/pill_bottle/kelotane = 2, - /obj/item/storage/pill_bottle/bicaridine = 2, - /obj/item/storage/pill_bottle/antitox = 2, + /obj/item/auto_cpr = 1, + /obj/item/storage/pill_bottle/kelotane = 3, + /obj/item/storage/pill_bottle/bicaridine = 3, + /obj/item/storage/pill_bottle/antitox = 3, /obj/item/storage/pill_bottle/mortaphenyl = 2, - /obj/item/reagent_containers/syringe/dylovene = 2, - /obj/item/reagent_containers/syringe/inaprovaline = 2, + /obj/item/storage/pill_bottle/antiparasitic = 1, + /obj/item/storage/pill_bottle/asinodryl = 1, + /obj/item/storage/pill_bottle/steramycin =1, + /obj/item/reagent_containers/syringe/dylovene = 3, + /obj/item/reagent_containers/syringe/inaprovaline = 3, + /obj/item/reagent_containers/syringe/antiparasitic = 1, + /obj/item/reagent_containers/syringe/antibiotic = 2, + /obj/item/reagent_containers/syringe/fluvectionem = 2, + /obj/item/reagent_containers/hypospray/autoinjector/coagzolug = 2, + /obj/item/reagent_containers/hypospray/autoinjector/hyronalin = 2, + /obj/item/reagent_containers/hypospray/autoinjector/sideeffectbgone = 1, + /obj/item/reagent_containers/inhaler/pneumalin = 1, + /obj/item/reagent_containers/inhaler/peridaxon = 1, /obj/item/stack/nanopaste = 1 ) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index af79b64f1e4..17c80bdd331 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -973,6 +973,10 @@ if(stomach.ingested.total_volume) stomach.ingested.trans_to_obj(splat, min(15, stomach.ingested.total_volume)) + for(var/obj/item/organ/internal/parasite/P in src.internal_organs) + if(P) + if(P.egg && (P.stage == P.max_stage)) + splat.reagents.add_reagent(P.egg, 2) handle_additional_vomit_reagents(splat) splat.update_icon() @@ -985,6 +989,10 @@ if(!check_has_mouth() || isSynthetic() || !timevomit || !level || stat == DEAD || lastpuke) return + if(chem_effects[CE_ANTIEMETIC]) + to_chat(src, SPAN_WARNING("You feel a very brief wave of nausea, but it quickly disapparates.")) + return + if(deliberate) if(incapacitated()) to_chat(src, SPAN_WARNING("You cannot do that right now.")) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ac091450523..dd8ad6fff5e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -605,10 +605,7 @@ adjustToxLoss(chem_effects[CE_TOXIN]) if(CE_EMETIC in chem_effects) - var/nausea = chem_effects[CE_EMETIC] - if(CE_ANTIEMETIC in chem_effects) - nausea -= min(nausea, chem_effects[CE_ANTIEMETIC]) // so it can only go down to 0 - if(prob(nausea)) + if(prob(chem_effects[CE_EMETIC])) delayed_vomit() if(CE_ITCH in chem_effects) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ea2b0e6fe7a..6952a863b9b 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -731,6 +731,10 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) return if(stat == DEAD) return + if(chem_effects[CE_ANTIEMETIC]) + to_chat(src, SPAN_WARNING("You feel a very brief wave of nausea, but it quickly disapparates.")) + return + if(!lastpuke) lastpuke = 1 to_chat(src, "You feel nauseous...") diff --git a/code/modules/organs/subtypes/parasite.dm b/code/modules/organs/subtypes/parasite.dm index 10378d6ef53..233748e9993 100644 --- a/code/modules/organs/subtypes/parasite.dm +++ b/code/modules/organs/subtypes/parasite.dm @@ -5,11 +5,14 @@ var/stage = 1 var/max_stage = 4 var/stage_ticker = 0 + var/recession = 0 var/infection_speed = 2 //Will be determined by get_infect_speed() var/infect_speed_high = 35 //The fastest this parasite will advance stages var/infect_speed_low = 15 //The slowest this parasite will advance stages - var/stage_interval = 600 //time between stages, in seconds + var/stage_interval = 300 //time between stages, in seconds. interval of 300 allows convenient treating with antiparasitics, higher will require spaced dosing of medications. var/subtle = 0 //will the body reject the parasite naturally? + var/egg = null //does the parasite have a reagent which seeds an infection? + var/drug_resistance = 0 //is the parasite resistant to antiparasitic medications? /obj/item/organ/internal/parasite/Initialize() . = ..() @@ -20,17 +23,28 @@ /obj/item/organ/internal/parasite/process() ..() - if(!owner) return - if(stage < max_stage) - stage_ticker += infection_speed + if(owner.chem_effects[CE_ANTIPARASITE] && !drug_resistance) + recession = owner.chem_effects[CE_ANTIPARASITE]/10 - if(stage_ticker >= stage*stage_interval) - stage = min(stage+1,max_stage) - get_infect_speed() //Each stage may progress faster or slower than the previous one - stage_effect() + if((stage < max_stage) && !recession) + stage_ticker = Clamp(stage_ticker+=infection_speed, 0, stage_interval*max_stage) + if(stage_ticker >= stage*stage_interval) + stage = min(stage+1,max_stage) + get_infect_speed() //Each stage may progress faster or slower than the previous one + stage_effect() + + if(recession) + stage_ticker = Clamp(stage_ticker-=recession, 0, stage_interval*max_stage) + if(stage_ticker <= stage*stage_interval-stage_interval) + stage = max(stage-1, 1) + stage_effect() + if(!owner.chem_effects[CE_ANTIPARASITE] || drug_resistance) + recession = 0 + if(stage_ticker == 0) + qdel(src) /obj/item/organ/internal/parasite/handle_rejection() if(subtle) @@ -57,9 +71,12 @@ parent_organ = BP_CHEST stage_interval = 150 + drug_resistance = 1 origin_tech = list(TECH_BIO = 3) + egg = /singleton/reagent/kois + /obj/item/organ/internal/parasite/kois/process() ..() @@ -128,8 +145,12 @@ parent_organ = BP_HEAD var/removed_langs = 0 stage_interval = 150 + drug_resistance = 1 + origin_tech = list(TECH_BIO = 7) + egg = /singleton/reagent/kois/black + /obj/item/organ/internal/parasite/blackkois/process() ..() @@ -229,8 +250,11 @@ organ_tag = BP_ZOMBIE_PARASITE parent_organ = BP_HEAD stage_interval = 150 + drug_resistance = 1 relative_size = 0 + egg = /singleton/reagent/toxin/trioxin + var/last_heal = 0 var/heal_rate = 5 SECONDS @@ -320,3 +344,97 @@ owner.update_dna() else owner.adjustToxLoss(50) + +//Parasitic Worms// + +/obj/item/organ/internal/parasite/nerveworm + name = "bundle of nerve flukes" + icon = 'icons/obj/organs/organs.dmi' + icon_state = "helminth" + dead_icon = "helminth_dead" + + organ_tag = BP_WORM_NERVE + parent_organ = BP_L_ARM //if desperate, can lop your arm off to remove the infection :) + subtle = 1 + + origin_tech = list(TECH_BIO = 4) + + egg = /singleton/reagent/toxin/nerveworm_eggs + +/obj/item/organ/internal/parasite/nerveworm/process() + ..() + + if (!owner) + return + + if(prob(10)) + owner.adjustNutritionLoss(10) + + if(stage >= 2) //after ~5 minutes + owner.confused = max(owner.confused, 10) + + if(stage >= 3) //after ~10 minutes + owner.slurring = max(owner.slurring, 100) + owner.drowsiness = max(owner.drowsiness, 20) + if(prob(1)) + owner.delayed_vomit() + if(prob(2)) + to_chat(owner, SPAN_WARNING(pick("You feel a tingly sensation in your fingers.", "Is that pins and needles?", "An electric sensation jolts its way up your left arm.", "You smell something funny.", "You taste something funny."))) + + if(stage >= 4) //after ~15 minutes + if(prob(2)) + to_chat(owner, SPAN_WARNING(pick("A deep, tingling sensation paralyses your left arm.", "You feel as if you just struck your funny bone.", "You feel a pulsing sensation within your left arm."))) + owner.emote(pick("twitch", "shiver")) + owner.stuttering = 20 + if(prob(1)) + owner.seizure() + if(prob(5)) + owner.reagents.add_reagent(/singleton/reagent/toxin/nerveworm_eggs, 2) + owner.adjustHalLoss(15) + to_chat(owner, SPAN_WARNING("An extreme, nauseating pain erupts from deep within your left arm!")) + + +/obj/item/organ/internal/parasite/heartworm + name = "bundle of heart flukes" + icon = 'icons/obj/organs/organs.dmi' + icon_state = "helminth" + dead_icon = "helminth_dead" + + organ_tag = BP_WORM_HEART + parent_organ = BP_CHEST + subtle = 1 + + stage_interval = 450 //~7.5 minutes/stage + + origin_tech = list(TECH_BIO = 4) + + egg = /singleton/reagent/toxin/heartworm_eggs + +/obj/item/organ/internal/parasite/heartworm/process() + ..() + + var/obj/item/organ/internal/heart = owner.internal_organs_by_name[BP_HEART] + + if (!owner) + return + + if(prob(10)) + owner.adjustNutritionLoss(10) + + if(stage >= 2) //after ~7.5 minutes + if(prob(2)) + owner.emote("cough") + + if(stage >= 3) //after ~15 minutes + if(prob(7)) + heart.take_damage(rand(2,5)) + if(prob(5)) + to_chat(owner, SPAN_WARNING(pick("Your chest feels tight.", "Your chest is aching.", "You feel a stabbing pain in your chest!", "You feel a painful, tickly sensation within your chest."))) + owner.adjustHalLoss(15) + + if(stage >= 4) //after ~22.5 minutes + if(prob(5)) + owner.reagents.add_reagent(/singleton/reagent/toxin/heartworm_eggs, 2) + owner.adjustHalLoss(15) + to_chat(owner, SPAN_WARNING("An extreme, nauseating pain erupts from the centre of your chest!")) + diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 77a2178910f..1727d4225cc 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -665,6 +665,11 @@ condiment_desc = "Perfect for repelling vampires and/or potential dates." condiment_icon_state = "garlic_sauce" +/singleton/reagent/nutriment/garlicsauce/affect_chem_effect(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + . = ..() + if(.) + M.add_chemical_effect(CE_ANTIPARASITE, 10) + /singleton/reagent/nutriment/mayonnaise name = "Mayonnaise" description = "Mayonnaise, a staple classic for sandwiches." @@ -1214,6 +1219,11 @@ germ_adjust = 7.5 // has allicin, an antibiotic +/singleton/reagent/drink/garlicjuice/affect_chem_effect(var/mob/living/carbon/M, var/alien, var/removed) + . = ..() + if(.) + M.add_chemical_effect(CE_ANTIPARASITE, 10) + /singleton/reagent/drink/onionjuice name = "Onion Juice" description = "Juice from an onion, for when you need to cry." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 2a9debf2c39..babd5c77135 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -777,10 +777,17 @@ metabolism = REM * 0.25 fallback_specific_heat = 1 +/singleton/reagent/asinodryl/affect_chem_effect(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) + . = ..() + if(.) + M.add_chemical_effect(CE_ANTIEMETIC, M.chem_doses[type]/4) // 1u should suppress 2u thetamycin + M.add_chemical_effect(CE_STRAIGHTWALK) + /singleton/reagent/asinodryl/affect_blood(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder) if(alien == IS_DIONA) return - M.add_chemical_effect(CE_ANTIEMETIC, M.chem_doses[type]/4) // 1u should suppress 2u thetamycin + M.confused = max(M.confused - 10, 0) + M.dizziness = max(M.confused - 10, 0) /singleton/reagent/antidexafen name = "Antidexafen" @@ -1624,3 +1631,29 @@ if(heart) to_chat(H, SPAN_DANGER("Your heart skips a beat and screams out in pain!")) heart.take_internal_damage(10) + +/singleton/reagent/antiparasitic + name = "Helmizole" + description = "Helmizole is an anti-helminthic medication which combats parasitic worm infections, compromising their nervous system and inducing respiratory paralysis." + reagent_state = LIQUID + color = "#c7f3a4" + overdose = 10 + od_minimum_dose = 1 + metabolism = REM*0.2 + scannable = TRUE + taste_description = "alcohol" + +/singleton/reagent/antiparasitic/affect_chem_effect(var/mob/living/carbon/M, var/alien, var/removed) + . = ..() + if(.) + M.add_chemical_effect(CE_ANTIPARASITE, 50) //~10u will get rid of a standard-lengthed (stage interval = 300) parasitic infection. ~5mins to eliminate symptoms, ~7.5mins to kill parasite. + M.add_chemical_effect(CE_EMETIC, M.chem_doses[type]/2) + +/singleton/reagent/antiparasitic/overdose(mob/living/carbon/M, alien, removed, scale, datum/reagents/holder) + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + + for(var/obj/item/organ/internal/parasite/P in H.internal_organs) + if(P) + if(P.drug_resistance == 0) + P.drug_resistance = 1 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 415e6cf28e1..b91646a0488 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -661,7 +661,7 @@ taste_description = "acrid smoke" nicotine = 0.1 -/singleton/reagent/toxin/tobacco/sweet +/singleton/reagent/toxin/tobacco/sweet name = "Sweet Tobacco" description = "This tobacco is much sweeter than the strains usually found in human space." taste_description = "sweet tobacco" @@ -854,3 +854,53 @@ /singleton/reagent/toxin/coagulated_blood/affect_blood(mob/living/carbon/M, alien, removed, datum/reagents/holder) M.add_chemical_effect(CE_NEPHROTOXIC, 0) // deal no damage, but prevent regeneration ..() + +/singleton/reagent/toxin/nerveworm_eggs + name = "Nerve Fluke Eggs" + description = "The eggs of a parasitic worm. These ones grow to infest the nervous system, working their way up from the peripheral to the central nervous system. The infection is gradual: lethargy, issues with motor coordination, then eventually seizures." + reagent_state = SOLID + color = "#b9b9d9" + metabolism = REM*2 + ingest_met = REM*2 + touch_met = REM*5 + taste_description = "something tingly" + taste_mult = 0.25 + strength = 0 + +/singleton/reagent/toxin/nerveworm_eggs/affect_blood(mob/living/carbon/M, alien, removed, datum/reagents/holder) + ..() + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + + if(H.chem_effects[CE_ANTIPARASITE]) + return + + if(!H.internal_organs_by_name[BP_WORM_NERVE]) + var/obj/item/organ/external/affected = H.get_organ(BP_L_ARM) + var/obj/item/organ/internal/parasite/nerveworm/infest = new() + infest.replaced(H, affected) + +/singleton/reagent/toxin/heartworm_eggs + name = "Heart Fluke Eggs" + description = "The eggs of a parasitic worm. These ones grow to infest the cardiac tissue of the heart. The infection is gradual: coughing first, then eventually heart failure." + reagent_state = SOLID + color = "#caaaaa" + metabolism = REM/2 //Slow metabolisation so medical can potentially screen it early, given it's danger. + ingest_met = REM/2 + touch_met = REM*5 + taste_description = "something quite sour" + taste_mult = 0.75 + strength = 0 + +/singleton/reagent/toxin/heartworm_eggs/affect_blood(mob/living/carbon/M, alien, removed, datum/reagents/holder) + ..() + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + + if(H.chem_effects[CE_ANTIPARASITE]) + return + + if(!H.internal_organs_by_name[BP_WORM_HEART]) + var/obj/item/organ/external/affected = H.get_organ(BP_CHEST) + var/obj/item/organ/internal/parasite/heartworm/infest = new() + infest.replaced(H, affected) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index e6f49cba167..1f07732f369 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -389,6 +389,13 @@ required_reagents = list(/singleton/reagent/thetamycin = 2, /singleton/reagent/sterilizine = 1, /singleton/reagent/radium = 1) result_amount = 2 +/datum/chemical_reaction/antiparasitic + name = "Helmizole" + id = "helmizole" + result = /singleton/reagent/antiparasitic + required_reagents = list(/singleton/reagent/dylovene = 1, /singleton/reagent/fluvectionem = 1, /singleton/reagent/leporazine = 1) + result_amount = 2 + /datum/chemical_reaction/cetahydramine name = "Cetahydramine" id = "cetahydramine" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 125cf586c26..7b01cc56a6f 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -294,7 +294,25 @@ reagents_to_add = list(/singleton/reagent/iron = 5, /singleton/reagent/sugar = 10) /obj/item/reagent_containers/pill/antidexafen - name = "15u antidexafen" + name = "15u Antidexafen" desc = "Common cold mediciation. Safe for babies!" icon_state = "pill4" reagents_to_add = list(/singleton/reagent/antidexafen = 10, /singleton/reagent/drink/lemonjuice = 5, /singleton/reagent/nutriment/mint = REM*0.2) + +/obj/item/reagent_containers/pill/antiparasitic + name = "5u Helmizole" + desc = "An antiparasitic used to treat worms." + icon_state = "pill11" + reagents_to_add = list(/singleton/reagent/antiparasitic = 5) + +/obj/item/reagent_containers/pill/asinodryl + name = "10u Asinodryl" + desc = "An antiemetic which prevents vomiting." + icon_state = "pill20" + reagents_to_add = list(/singleton/reagent/asinodryl = 10) + +/obj/item/reagent_containers/pill/steramycin + name = "5u Steramycin" + desc = "A prophylactic antibiotic that kills infections before they start." + icon_state = "pill8" + reagents_to_add = list(/singleton/reagent/steramycin = 5) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 4303d542b52..5ffc04e73ce 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -441,3 +441,13 @@ . = ..() mode = SYRINGE_INJECT update_icon() + +/obj/item/reagent_containers/syringe/antiparasitic + name = "Syringe (helmizole)" + desc = "Contains an antiparasitic medication." + reagents_to_add = list(/singleton/reagent/antiparasitic = 10) + +/obj/item/reagent_containers/syringe/antiparasitic/Initialize() + . = ..() + mode = SYRINGE_INJECT + update_icon() diff --git a/html/changelogs/kermit-bioweapons.yml b/html/changelogs/kermit-bioweapons.yml new file mode 100644 index 00000000000..8e98df6369e --- /dev/null +++ b/html/changelogs/kermit-bioweapons.yml @@ -0,0 +1,15 @@ +author: kermit +delete-after: True + +changes: + - rscadd: "Added a Chemical, Biological & Radiological Weapons tab on the Traitor Uplink" + - rscadd: "Adds a 2 different parasitic worm kits: Nerve Flukes (3TC) which are non-lethal, incapacitating; Heart Flukes (5TC) which are lethal if left untreated." + - rscadd: "Adds Helmizole (1u Dylovene, 1u Fluvectionem, 1u Leporazine) which is used to treat parasitic infections (does not treat k'ois mycosis parasites). 2x syringes spawn in the Medications Cabinet. ODing will make the parasite drug resistant, forcing surgical extraction." + - rscadd: "Garlic(juice/sauce) also has weak antiparasitic properties. Only enough to slow progression." + - rscadd: "Adds Greimorian Eggs (4TC) which are planted on the ground on-purchase." + - rscadd: "Adds a Dirty Bomb (4TC). It functions like a plastic explosive but irradiates the room it detonates in for ~10 minutes. It has a minimum timer of 5 minutes. This is alongside a Radiation Suit Kit (1TC)" + - rscadd: "Adds a Syringe Gun Kit (3TC) to the CBR tab with the components for 3 darts." + - tweak: "The Random Toxin Kit is under the new CBR tab." + - tweak: "Pill bottle naming consistency." + - tweak: "Asinodryl now works properly. In addition to actually preventing vomiting, it now prevents dizziness (screen wobbling) and confusion (random step direction)." + - tweak: "Updated the warehouse/strange crate spawns to include more recently added medical items/drugs (coagzolug, helmizole, pill bottles of x, stabiliser harnesses)." diff --git a/icons/obj/organs/organs.dmi b/icons/obj/organs/organs.dmi index 93dc02275e0..475f1f9f9c3 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 131e332df30..d2a81522f20 100644 --- a/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm +++ b/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm @@ -19311,6 +19311,8 @@ /obj/item/storage/pill_bottle/dylovene, /obj/item/storage/pill_bottle/dermaline, /obj/item/storage/pill_bottle/bicaridine, +/obj/item/reagent_containers/syringe/antiparasitic, +/obj/item/reagent_containers/syringe/antiparasitic, /obj/item/reagent_containers/glass/bottle/antitoxin, /turf/simulated/floor/tiled/white, /area/medical/gen_treatment)