Antag Dirty Bombs & Bodyhorror Parasites (#16317)

* dirty bombs & bodyhorror

* clean up + extra flavour

CE_ANTIEMETIC taken into account in the delayed_vomit() proc. doesn't need to subtract from CE_EMETIC anymore.

* desc. fix, TC tweak, syringe gun kit

* dirty bomb tweaks

radiation remains for as long as advertised (~8mins in an open space)
it also actually leaves behind the green goo now.
This commit is contained in:
smellie
2023-05-16 01:34:10 +01:00
committed by GitHub
parent 0a3be0f04c
commit f237ea8309
24 changed files with 434 additions and 29 deletions
@@ -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."))
+1 -4
View File
@@ -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)
+4
View File
@@ -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, "<span class='warning'>You feel nauseous...</span>")
+126 -8
View File
@@ -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 <b>extreme</b>, 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 <b>extreme</b>, nauseating pain erupts from the centre of your chest!"))
@@ -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."
@@ -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
@@ -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)
@@ -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"
@@ -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)
@@ -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()