diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm new file mode 100644 index 00000000000..248503ba672 --- /dev/null +++ b/code/datums/diseases/berserker.dm @@ -0,0 +1,55 @@ +/datum/disease/berserker + name = "Berserker" + max_stages = 2 + stage_prob = 5 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Anti-Psychotics" + cures = list("haloperidol") + agent = "Jagged Crystals" + cure_chance = 10 + viable_mobtypes = list(/mob/living/carbon/human) + desc = "Swearing, shouting, attacking nearby crew members uncontrollably." + severity = DANGEROUS + disease_flags = CURABLE + spread_flags = NON_CONTAGIOUS + +/datum/disease/berserker/stage_act() + ..() + if(affected_mob.reagents.has_reagent("thc")) + to_chat(affected_mob, "You mellow out.") + cure() + return + switch(stage) + if(1) + if(prob(5)) + affected_mob.emote(pick("twitch_s", "grumble")) + if(prob(5)) + var/speak = pick("Grr...", "Fuck...", "Fucking...", "Fuck this fucking.. fuck..") + affected_mob.say(speak) + if(2) + if(prob(5)) + affected_mob.emote(pick("twitch_s", "scream")) + if (prob(5)) + var/speak = pick("AAARRGGHHH!!!!", "GRR!!!", "FUCK!! FUUUUUUCK!!!", "FUCKING SHITCOCK!!", "WROOAAAGHHH!!") + affected_mob.say(speak) + if (prob(15)) + affected_mob.visible_message("[affected_mob] twitches violently!") + affected_mob.drop_l_hand() + affected_mob.drop_r_hand() + if (prob(33)) + if(affected_mob.incapacitated()) + affected_mob.visible_message("[affected_mob] spasms and twitches!") + return + affected_mob.visible_message("[affected_mob] thrashes around violently!") + for(var/mob/living/carbon/M in range(1, affected_mob)) + if(M == affected_mob) + continue + var/damage = rand(1, 5) + if (prob(80)) + playsound(affected_mob.loc, "punch", 25, 1, -1) + affected_mob.visible_message("[affected_mob] hits [M] with their thrashing!") + M.adjustBruteLoss(damage) + else + playsound(affected_mob.loc, "sound/weapons/punchmiss.ogg", 25, 1, -1) + affected_mob.visible_message("[affected_mob] fails to hit [M] with their thrashing!") \ No newline at end of file diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm new file mode 100644 index 00000000000..25166ecf13b --- /dev/null +++ b/code/datums/diseases/food_poisoning.dm @@ -0,0 +1,77 @@ +/datum/disease/food_poisoning + name = "Food Poisoning" + max_stages = 3 + stage_prob = 5 + spread_text = "Non-Contagious" + spread_flags = SPECIAL + cure_text = "Sleep" + agent = "Salmonella" + cures = list("chicken_soup") + cure_chance = 10 + viable_mobtypes = list(/mob/living/carbon/human) + desc = "Nausea, sickness, and vomitting." + severity = MINOR + disease_flags = CURABLE + spread_flags = NON_CONTAGIOUS + var/remissive = 0 + +/datum/disease/food_poisoning/stage_act() + if(!remissive) + ..() + if(affected_mob.sleeping && prob(33)) + to_chat(affected_mob, "You feel better.") + remissive = 1 + if(remissive) + if(prob(stage_prob)) + stage-- + if(stage == 0) + cure() + return + switch(stage) + if(1) + if(prob(5)) + to_chat(affected_mob, "Your stomach feels weird.") + if(prob(5)) + to_chat(affected_mob, "You feel queasy.") + if(2) + if(affected_mob.sleeping && prob(40)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(10)) + affected_mob.emote("groan") + if(prob(5)) + to_chat(affected_mob, "Your stomach aches.") + if(prob(5)) + to_chat(affected_mob, "You feel nauseous.") + if(3) + if(affected_mob.sleeping && prob(25)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(1) && prob(10)) + to_chat(affected_mob, "You feel better.") + cure() + return + if(prob(10)) + affected_mob.emote("moan") + if(prob(10)) + affected_mob.emote("groan") + if(prob(1)) + to_chat(affected_mob, "Your stomach hurts.") + if(prob(1)) + to_chat(affected_mob, "You feel sick.") + if(prob(5)) + if(affected_mob.nutrition > 10) + affected_mob.visible_message("[affected_mob] vomits on the floor profusely!") + affected_mob.fakevomit(no_text = 1) + affected_mob.nutrition -= rand(3,5) + else + to_chat(affected_mob, "Your stomach lurches painfully!") + affected_mob.visible_message("[affected_mob] gags and retches!") + affected_mob.Stun(rand(2,4)) + affected_mob.Weaken(rand(2,4)) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 657d40983de..9f1b41b3ac5 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -336,7 +336,7 @@ message = "[src] faints." if(src.sleeping) return //Can't faint while asleep - src.sleeping += 10 //Short-short nap + src.sleeping += 1 m_type = 1 if ("cough", "coughs") @@ -791,14 +791,9 @@ continue // Now, we don't have this: //new /obj/effects/fart_cloud(T,L) - // But: - // <[REDACTED]> so, what it does is...imagine a 3x3 grid with the person in the center. When someone uses the emote *fart (it's not a spell style ability and has no cooldown), then anyone in the 8 tiles AROUND the person who uses it - // <[REDACTED]> gets between 1 and 10 units of jenkem added to them...we obviously don't have Jenkem, but Space Drugs do literally the same exact thing as Jenkem - // <[REDACTED]> the user, of course, isn't impacted because it's not an actual smoke cloud - // So, let's give 'em space drugs. if (M == src) continue - M.reagents.add_reagent("space_drugs",rand(1,10)) + M.reagents.add_reagent("jenkem", 1) if ("help") var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dap(s)(none)/mob," \ diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 658959001a1..e5661f10ea5 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1349,16 +1349,18 @@ mob/proc/yank_out_object() ghost.notify_cloning(message, sound, source) return ghost -/mob/proc/fakevomit(green=0) //for aesthetic vomits that need to be instant and do not stun. -Fox +/mob/proc/fakevomit(green = 0, no_text = 0) //for aesthetic vomits that need to be instant and do not stun. -Fox if(stat==DEAD) return var/turf/location = loc if (istype(location, /turf/simulated)) if(green) - src.visible_message("[src] vomits up some green goo!","You vomit up some green goo!") + if(!no_text) + visible_message("[src] vomits up some green goo!","You vomit up some green goo!") new /obj/effect/decal/cleanable/vomit/green(location) else - src.visible_message("[src] pukes all over \himself!","You puke all over yourself!") + if(!no_text) + visible_message("[src] pukes all over \himself!","You puke all over yourself!") location.add_vomit_floor(src, 1) playsound(location, 'sound/effects/splat.ogg', 50, 1) diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 9c18efe308d..be1672434e4 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -50,6 +50,30 @@ M.ForceContractDisease(new /datum/disease/tuberculosis(0)) ..() +/datum/reagent/jagged_crystals + name = "Jagged Crystals" + id = "jagged_crystals" + description = "Rapid chemical decomposition has warped these crystals into twisted spikes." + reagent_state = SOLID + color = "#FA0000" // rgb: 250, 0, 0 + +/datum/reagent/jagged_crystals/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + M.ForceContractDisease(new /datum/disease/berserker(0)) + ..() + +/datum/reagent/salmonella + name = "Salmonella " + id = "salmonella " + description = "A nasty bacteria found in spoiled food." + reagent_state = LIQUID + color = "#1E4600" + +/datum/reagent/salmonella/on_mob_life(var/mob/living/carbon/M as mob) + if(!M) M = holder.my_atom + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) + ..() + /datum/reagent/spore name = "Blob Spores" id = "spore" diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 6d8a7d4117f..127a37593d1 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -26,11 +26,45 @@ ..() return -/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) - M.adjustToxLoss(1*REM) - M.adjustOxyLoss(1*REM) - ..() - return +/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] looks nervous!") + M.confused += 15 + M.adjustToxLoss(2) + M.Jitter(10) + M.emote("twitch_s") + else if(effect <= 4) + M.visible_message("[M] is all sweaty!") + M.bodytemperature += rand(15,30) + M.adjustToxLoss(3) + else if(effect <= 7) + M.adjustToxLoss(4) + M.emote("twitch") + M.Jitter(10) + else if(severity == 2) + if(effect <= 2) + M.emote("gasp") + to_chat(M, "You can't breathe!") + M.adjustOxyLoss(15) + M.adjustToxLoss(3) + M.Stun(1) + else if(effect <= 4) + to_chat(M, "You feel terrible!") + M.emote("drool") + M.Jitter(10) + M.adjustToxLoss(5) + M.Weaken(1) + M.confused += 33 + else if(effect <= 7) + M.emote("collapse") + to_chat(M, "Your heart is pounding!") + M << 'sound/effects/singlebeat.ogg' + M.Paralyse(5) + M.Jitter(30) + M.adjustToxLoss(6) + M.adjustOxyLoss(20) /datum/reagent/crank name = "Crank" @@ -62,12 +96,45 @@ M.emote(pick("groan", "moan")) ..() return -/datum/reagent/crank/overdose_process(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)*REM) - M.adjustToxLoss(rand(1,10)*REM) - M.adjustBruteLoss(rand(1,10)*REM) - ..() - return + +/datum/reagent/crank/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] looks confused!") + M.confused += 20 + M.Jitter(20) + M.emote("scream") + else if(effect <= 4) + M.visible_message("[M] is all sweaty!") + M.bodytemperature += rand(5,30) + M.adjustBrainLoss(1) + M.adjustToxLoss(1) + M.Stun(2) + else if(effect <= 7) + M.Jitter(30) + M.emote("grumble") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] is sweating like a pig!") + M.bodytemperature += rand(20,100) + M.adjustToxLoss(5) + M.Stun(3) + else if(effect <= 4) + M.visible_message("[M] starts tweaking the hell out!") + M.Jitter(100) + M.adjustToxLoss(2) + M.adjustBrainLoss(8) + M.Weaken(3) + M.confused += 25 + M.emote("scream") + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 7) + M.emote("scream") + M.visible_message("[M] nervously scratches at their skin!") + M.Jitter(10) + M.adjustBruteLoss(5) + M.emote("twitch_s") /datum/chemical_reaction/crank name = "Crank" @@ -120,12 +187,40 @@ ..() return -/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob) - if(prob(10)) - M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) - ..() - return +/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] looks dazed!") + M.Stun(3) + M.emote("drool") + else if(effect <= 4) + M.emote("shiver") + M.bodytemperature -= 40 + else if(effect <= 7) + to_chat(M, "Your skin is cracking and bleeding!") + M.adjustBruteLoss(5) + M.adjustToxLoss(2) + M.adjustBrainLoss(1) + M.emote("cry") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] sways and falls over!") + M.adjustToxLoss(3) + M.adjustBrainLoss(3) + M.Weaken(8) + M.emote("faint") + else if(effect <= 4) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.visible_message("[M]'s skin is rotting away!") + H.adjustBruteLoss(25) + H.emote("scream") + H.ChangeToHusk() + H.emote("faint") + else if(effect <= 7) + M.emote("shiver") + M.bodytemperature -= 70 /datum/chemical_reaction/krokodil name = "Krokodil" @@ -169,19 +264,30 @@ ..() return -/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob) - if(prob(20)) - M.emote("laugh") - if(prob(33)) - M.visible_message("[M]'s hands flip out and flail everywhere!") - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - ..() - if(prob(50)) - M.adjustToxLoss(10) - M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) - return +/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] can't seem to control their legs!") + M.confused += 20 + M.Weaken(4) + else if(effect <= 4) + M.visible_message("[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() + M.drop_r_hand() + else if(effect <= 7) + M.emote("laugh") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() + M.drop_r_hand() + else if(effect <= 4) + M.visible_message("[M] falls to the floor and flails uncontrollably!") + M.Jitter(10) + M.Weaken(10) + else if(effect <= 7) + M.emote("laugh") /datum/chemical_reaction/methamphetamine name = "methamphetamine" @@ -220,30 +326,97 @@ name = "Bath Salts" id = "bath_salts" description = "Sometimes packaged as a refreshing bathwater additive, these crystals are definitely not for human consumption." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 + reagent_state = SOLID + color = "#FAFAFA" overdose_threshold = 20 addiction_chance = 80 metabolization_rate = 0.6 - /datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") - if(prob(5)) - to_chat(M, "[high_message]") - M.AdjustParalysis(-5) - M.AdjustStunned(-5) - M.AdjustWeakened(-5) - M.adjustStaminaLoss(-10) - M.adjustBrainLoss(1) - M.adjustToxLoss(0.1) - M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) - step(M, pick(cardinal)) - step(M, pick(cardinal)) + var/check = rand(0,100) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(check < 8 && H.h_style != "Very Long Beard") + H.h_style = "Very Long Hair" + H.f_style = "Very Long Beard" + H.update_hair() + H.update_fhair() + H.visible_message("[H] has a wild look in their eyes!") + if(check < 60) + M.SetParalysis(0) + M.SetStunned(0) + M.SetWeakened(0) + if(check < 30) + M.emote(pick("twitch", "twitch_s", "scream", "drool", "grumble", "mumble")) + M.druggy = max(M.druggy, 15) + if(check < 20) + M.confused += 10 + if(check < 8) + M.reagents.add_reagent(pick("methamphetamine", "crank", "neurotoxin"), rand(1,5)) + M.visible_message("[M] scratches at something under their skin!") + M.adjustBruteLoss(5) + else if(check < 16) + M.hallucination += 30 + else if(check < 24) + to_chat(M, "They're coming for you!") + else if(check < 28) + to_chat(M, "THEY'RE GONNA GET YOU!") ..() - return + +/datum/reagent/bath_salts/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == INGEST) + to_chat(M, "You feel FUCKED UP!!!!!!") + M << 'sound/effects/singlebeat.ogg' + M.emote("faint") + M.apply_effect(5, IRRADIATE, negate_armor = 1) + M.adjustToxLoss(5) + M.adjustBrainLoss(10) + else + to_chat(M, "You feel a bit more salty than usual.") + +/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] flails around like a lunatic!") + M.confused += 25 + M.Jitter(10) + M.emote("scream") + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 4) + M.visible_message("[M]'s eyes dilate!") + M.emote("twitch_s") + M.adjustToxLoss(2) + M.adjustBrainLoss(1) + M.Stun(3) + M.eye_blurry = max(M.eye_blurry, 7) + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 7) + M.emote("faint") + M.reagents.add_reagent("jagged_crystals", 5) + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M]'s eyes dilate!") + M.adjustToxLoss(2) + M.adjustBrainLoss(1) + M.Stun(3) + M.eye_blurry = max(M.eye_blurry, 7) + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 4) + M.visible_message("[M] convulses violently and falls to the floor!") + M.Jitter(50) + M.adjustToxLoss(2) + M.adjustBrainLoss(1) + M.Weaken(8) + M.emote("gasp") + M.reagents.add_reagent("jagged_crystals", 5) + else if(effect <= 7) + M.emote("scream") + M.visible_message("[M] tears at their own skin!") + M.adjustBruteLoss(5) + M.reagents.add_reagent("jagged_crystals", 5) + M.emote("twitch") /datum/chemical_reaction/bath_salts name = "bath_salts" @@ -255,19 +428,37 @@ mix_message = "Tiny cubic crystals precipitate out of the mixture. Huh." mix_sound = 'sound/goonstation/misc/fuse.ogg' -/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob) - M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) - for(var/i = 0, i < 8, i++) - step(M, pick(cardinal)) - if(prob(20)) - M.emote(pick("twitch","drool","moan")) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() +/datum/chemical_reaction/jenkem + name = "Jenkem" + id = "jenkem" + result = "jenkem" + required_reagents = list("toiletwater" = 1, "ammonia" = 1, "water" = 1) + result_amount = 3 + mix_message = "The mixture ferments into a filthy morass." + mix_sound = 'sound/effects/blobattack.ogg' + +/datum/chemical_reaction/jenkem/on_reaction(var/datum/reagents/holder) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The solution generates a strong vapor!") + for(var/mob/living/carbon/C in range(T, 1)) + if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + C.reagents.add_reagent("jenkem", 25) + +/datum/reagent/jenkem + name = "Jenkem" + id = "jenkem" + description = "Jenkem is a prison drug made from fermenting feces in a solution of urine. Extremely disgusting." + reagent_state = LIQUID + color = "#644600" + addiction_chance = 30 + +/datum/reagent/jenkem/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.Dizzy(5) + if(prob(10)) + M.emote(pick("twitch_s","drool","moan")) + M.adjustToxLoss(1) ..() - return /datum/chemical_reaction/aranesp name = "Aranesp" @@ -381,24 +572,30 @@ /datum/reagent/fliptonium/reagent_deleted(var/mob/living/M as mob) M.SpinAnimation(speed = 12, loops = -1) -/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob) - if(volume > 15) - if(prob(5)) - switch(pick(1, 2, 3)) - if(1) - M.emote("laugh") - M.adjustToxLoss(1) - if(2) - to_chat(M, "[M] can't seem to control their legs!") - M.Weaken(8) - M.adjustToxLoss(1) - if(3) - to_chat(M, "[M]'s hands flip out and flail everywhere!") - M.drop_l_hand() - M.drop_r_hand() - M.adjustToxLoss(1) - ..() - return +/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + M.visible_message("[M] can't seem to control their legs!") + M.confused += 33 + M.Weaken(2) + else if(effect <= 4) + M.visible_message("[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() + M.drop_r_hand() + else if(effect <= 7) + M.emote("laugh") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M]'s hands flip out and flail everywhere!") + M.drop_l_hand() + M.drop_r_hand() + else if (effect <= 4) + M.visible_message("[M] falls to the floor and flails uncontrollably!") + M.Jitter(5) + M.Weaken(5) + else if(effect <= 7) + M.emote("laugh") ////////////////////////////// // Synth-Drugs // @@ -445,7 +642,7 @@ ..() return -/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob) +/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob, severity) if(prob(20)) M.emote("ping") if(prob(33)) @@ -457,7 +654,6 @@ if(prob(50)) M.adjustFireLoss(10) M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) - return //Surge: Krokodil /datum/reagent/surge @@ -484,7 +680,7 @@ ..() return -/datum/reagent/surge/overdose_process(var/mob/living/M as mob) +/datum/reagent/surge/overdose_process(var/mob/living/M as mob, severity) //Hit them with the same effects as an electrode! M.Stun(5) M.Weaken(5) @@ -502,8 +698,6 @@ B.icon = I M.adjustFireLoss(rand(1,5)*REM) M.adjustBruteLoss(rand(1,5)*REM) - ..() - return /datum/chemical_reaction/surge name = "Surge" diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm index 6dd18d307f7..e86ed8a2b11 100644 --- a/code/modules/reagents/newchem/food.dm +++ b/code/modules/reagents/newchem/food.dm @@ -10,8 +10,10 @@ datum/reagent/questionmark/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) if(!istype(M, /mob/living)) return if(method == INGEST) + M.Stun(2) M.Weaken(2) to_chat(M, "Ugh! Eating that was a terrible idea!") + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) datum/reagent/egg name = "Egg" @@ -175,15 +177,12 @@ datum/reagent/mugwort/on_mob_life(var/mob/living/M as mob) metabolization_rate = 0.2 overdose_threshold = 133 -datum/reagent/porktonium/overdose_process(var/mob/living/M as mob) - if(volume > 133) - if(prob(15)) - M.reagents.add_reagent("cholesterol", rand(1,3)) - if(prob(8)) - M.reagents.add_reagent("radium", 15) - M.reagents.add_reagent("cyanide", 10) - ..() - return +/datum/reagent/porktonium/overdose_process(var/mob/living/M as mob, severity) + if(prob(15)) + M.reagents.add_reagent("cholesterol", rand(1,3)) + if(prob(8)) + M.reagents.add_reagent("radium", 15) + M.reagents.add_reagent("cyanide", 10) /datum/reagent/fungus name = "Space fungus" @@ -202,6 +201,7 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) M.reagents.add_reagent("toxin", rand(1,5)) else if(ranchance <= 5) to_chat(M, "That tasted absolutely FOUL.") + M.ForceContractDisease(new /datum/disease/food_poisoning(0)) else to_chat(M, "Yuck!") @@ -283,11 +283,10 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume) color = "#B2B139" overdose_threshold = 50 -/datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob) +/datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob, severity) if(prob(8)) to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat.") M.adjustToxLoss(rand(1,2)) - ..() /datum/reagent/weird_cheese name = "Weird cheese" @@ -442,7 +441,7 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume) ..() return -/datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob) +/datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob, severity) if(prob(33)) to_chat(M, "You feel horribly weak.") if(prob(10)) @@ -453,7 +452,6 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume) M.adjustOxyLoss(25) M.Stun(5) M.Paralyse(10) - ..() /datum/chemical_reaction/hydrogenated_soybeanoil name = "Partially hydrogenated space-soybean oil" diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 90980c3a421..bc319a9b6bd 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -65,6 +65,7 @@ datum/reagent/salglu_solution description = "This saline and glucose solution can help stabilize critically injured patients and cleanse wounds." reagent_state = LIQUID color = "#C8A5DC" + penetrates_skin = 1 metabolization_rate = 0.15 datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) @@ -170,7 +171,7 @@ datum/reagent/omnizine overdose_threshold = 30 addiction_chance = 5 -datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) +/datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(-1*REM) M.adjustOxyLoss(-1*REM) @@ -181,13 +182,39 @@ datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/omnizine/overdose_process(var/mob/living/M as mob) - M.adjustToxLoss(3*REM) - M.adjustOxyLoss(3*REM) - M.adjustBruteLoss(3*REM) - M.adjustFireLoss(3*REM) - ..() - return +/datum/reagent/omnizine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) //lesser + M.stuttering += 1 + if(effect <= 1) + M.visible_message("[M] suddenly cluches their gut!") + M.emote("scream") + M.Stun(4) + M.Weaken(4) + else if(effect <= 3) + M.visible_message("[M] completely spaces out for a moment.") + M.confused += 15 + else if(effect <= 5) + M.visible_message("[M] stumbles and staggers.") + M.Dizzy(5) + M.Weaken(3) + else if(effect <= 7) + M.visible_message("[M] shakes uncontrollably.") + M.Jitter(30) + else if(severity == 2) // greater + if(effect <= 2) + M.visible_message("[M] suddenly cluches their gut!") + M.emote("scream") + M.Stun(7) + M.Weaken(7) + else if(effect <= 5) + M.visible_message("[M] jerks bolt upright, then collapses!") + M.Paralyse(5) + M.Weaken(4) + else if(effect <= 8) + M.visible_message("[M] stumbles and staggers.") + M.Dizzy(5) + M.Weaken(3) datum/reagent/calomel name = "Calomel" @@ -290,13 +317,6 @@ datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob) - if(volume > 25) - if(prob(8)) - M.adjustToxLoss(rand(1,2)) - ..() - return - /datum/chemical_reaction/sal_acid name = "Salicyclic Acid" id = "sal_acid" @@ -361,17 +381,17 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) mix_message = "The mixture rapidly turns into a dense pink liquid." mix_sound = 'sound/goonstation/misc/drinkfizz.ogg' -datum/reagent/ephedrine +/datum/reagent/ephedrine name = "Ephedrine" id = "ephedrine" description = "Ephedrine is a plant-derived stimulant." reagent_state = LIQUID color = "#C8A5DC" metabolization_rate = 0.3 - overdose_threshold = 45 + overdose_threshold = 35 addiction_chance = 25 -datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) +/datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.drowsyness = max(0, M.drowsyness-5) M.AdjustParalysis(-1) @@ -389,12 +409,26 @@ datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(1*REM) - M.losebreath++ - ..() - return +/datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 1) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 3) + M.emote(pick("groan","moan")) + if(effect <= 8) + M.emote("collapse") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 5) + M.visible_message("[M.name] staggers and drools, their eyes bloodshot!") + M.Dizzy(2) + M.Weaken(3) + if(effect <= 15) + M.emote("collapse") /datum/chemical_reaction/ephedrine name = "Ephedrine" @@ -441,7 +475,7 @@ datum/reagent/morphine description = "A strong but highly addictive opiate painkiller with sedative side effects." reagent_state = LIQUID color = "#C8A5DC" - overdose_threshold = 30 + overdose_threshold = 20 addiction_chance = 50 shock_reduction = 50 @@ -464,16 +498,6 @@ datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/morphine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.Dizzy(1) - M.Jitter(1) - ..() - return - datum/reagent/oculine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(prob(80)) @@ -519,7 +543,7 @@ datum/reagent/atropine reagent_state = LIQUID color = "#000000" metabolization_rate = 0.2 - overdose_threshold = 35 + overdose_threshold = 25 datum/reagent/atropine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -541,14 +565,6 @@ datum/reagent/atropine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/atropine/overdose_process(var/mob/living/M as mob) - if(prob(50)) - M.adjustToxLoss(2*REM) - M.Dizzy(1) - M.Jitter(1) - ..() - return - /datum/chemical_reaction/atropine name = "Atropine" id = "atropine" @@ -564,7 +580,7 @@ datum/reagent/epinephrine reagent_state = LIQUID color = "#96B1AE" metabolization_rate = 0.2 - overdose_threshold = 30 + overdose_threshold = 20 datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -591,13 +607,26 @@ datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustStaminaLoss(5*REM) - M.adjustToxLoss(2*REM) - M.losebreath++ - ..() - return +/datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if (severity == 1) + if(effect <= 1) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 3) + M.emote(pick("groan","moan")) + if(effect <= 8) + M.emote("collapse") + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 5) + M.visible_message("[M] staggers and drools, their eyes bloodshot!") + M.Dizzy(2) + M.Weaken(3) + if(effect <= 15) + M.emote("collapse") /datum/chemical_reaction/epinephrine name = "Epinephrine" @@ -812,13 +841,11 @@ datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob) M.adjustStaminaLoss(-5*REM) ..() -/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M) +/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M, severity) if(prob(33)) M.adjustStaminaLoss(2.5*REM) M.adjustToxLoss(1*REM) M.losebreath++ - ..() - return datum/reagent/insulin name = "Insulin" @@ -855,6 +882,7 @@ datum/reagent/teporone reagent_state = LIQUID color = "#D782E6" addiction_chance = 20 + overdose_threshold = 50 datum/reagent/teporone/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 97516f916c9..8f3fa6204d2 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -51,14 +51,15 @@ continue //If you got this far, that means we can process whatever reagent this iteration is for. Handle things normally from here. if(M && R) + R.on_mob_life(M) if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) R.overdosed = 1 R.overdose_start(M) if(R.volume < R.overdose_threshold && R.overdosed) R.overdosed = 0 if(R.overdosed) - R.overdose_process(M) - R.on_mob_life(M) + R.overdose_process(M, R.volume >= R.overdose_threshold*2 ? 2 : 1) + for(var/A in addiction_list) var/datum/reagent/R = A if(M && R) @@ -117,8 +118,11 @@ return // Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects -/datum/reagent/proc/overdose_process(var/mob/living/M as mob) - return +/datum/reagent/proc/overdose_process(var/mob/living/M as mob, severity) + var/effect = rand(1, 100) - severity + if (effect <= 8) + M.adjustToxLoss(severity) + return effect /datum/reagent/proc/overdose_start(var/mob/living/M as mob) return diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index b602e282b1f..4c7f75829e0 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -55,23 +55,45 @@ ..() return -/datum/reagent/histamine/overdose_process(var/mob/living/M as mob) - if(prob(2)) - to_chat(M, "You feel mucus running down the back of your throat.") - M.adjustToxLoss(1) - M.jitteriness += 4 - M.emote("sneeze", "cough") - else if(prob(4)) - M.stuttering += rand(0,5) - if(prob(25)) - M.emote(pick("choke","gasp")) - M.adjustOxyLoss(5) - else if(prob(7)) - to_chat(M, "Your chest hurts!") - M.emote(pick("cough","gasp")) - M.adjustOxyLoss(3) - ..() - return +/datum/reagent/histamine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 2) + to_chat(M, "You feel mucus running down the back of your throat.") + M.adjustToxLoss(1) + M.Jitter(4) + M.emote(pick("sneeze", "cough")) + else if(effect <= 4) + M.stuttering += rand(0,5) + if(prob(25)) + M.emote(pick("choke","gasp")) + M.adjustOxyLoss(5) + else if(effect <= 7) + to_chat(M, "Your chest hurts!") + M.emote(pick("cough","gasp")) + M.adjustOxyLoss(3) + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] breaks out in hives!") + M.adjustBruteLoss(6) + else if(effect <= 4) + M.visible_message("[M] has a horrible coughing fit!") + M.Jitter(10) + M.stuttering += rand(0,5) + M.emote("cough") + if(prob(40)) + M.emote(pick("choke","gasp")) + M.adjustOxyLoss(6) + M.Weaken(8) + else if(effect <= 7) + to_chat(M, "Your heartbeat is pounding inside your head!") + M << 'sound/effects/singlebeat.ogg' + M.emote("collapse") + M.adjustOxyLoss(8) + M.adjustToxLoss(3) + M.Weaken(3) + M.emote(pick("choke", "gasp")) + to_chat(M, "You feel like you're dying!") /datum/reagent/formaldehyde name = "Formaldehyde" @@ -130,8 +152,6 @@ M.jitteriness += 1000 spawn(rand(20, 100)) M.gib() - ..() - return /datum/reagent/neurotoxin2 name = "Neurotoxin" @@ -627,6 +647,7 @@ color = "#C7C7C7" metabolization_rate = 0.1 penetrates_skin = 1 + overdose_threshold = 25 /datum/chemical_reaction/sarin name = "sarin" diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index 2d85730193f..12e1a554edd 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -151,10 +151,8 @@ ..() return -/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M) +/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M, severity) M.adjustToxLoss(1) - ..() - return /datum/reagent/ethanol/rum name = "Rum" @@ -169,10 +167,8 @@ M.dizziness +=5 return -/datum/reagent/ethanol/rum/overdose_process(mob/living/M) +/datum/reagent/ethanol/rum/overdose_process(mob/living/M, severity) M.adjustToxLoss(1) - ..() - return /datum/reagent/ethanol/mojito name = "Mojito" diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm index 9daf9cb9ec1..45e0e2e8ac2 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm @@ -201,13 +201,10 @@ ..() return -/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob) +/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob, severity) if(volume > 45) M.Jitter(5) - ..() - return - /datum/reagent/drink/coffee/icecoffee name = "Iced Coffee" id = "icecoffee" diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm index 05a3fad7808..4c284d7d7cc 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -167,13 +167,11 @@ description = "Sodium chloride, common table salt." reagent_state = SOLID color = "#B1B0B0" + overdose_threshold = 100 -/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob) - if(volume > 100) - if(prob(70)) - M.adjustBrainLoss(1) - if(prob(8)) - M.adjustToxLoss(rand(1,2)) +/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob, severity) + if(prob(70)) + M.adjustBrainLoss(1) ..() return @@ -454,11 +452,9 @@ M.emote("collapse") ..() -/datum/reagent/sugar/overdose_process(var/mob/living/M as mob) - if(volume > 200) - M.Paralyse(3) - M.Weaken(4) - if(prob(8)) - M.adjustToxLoss(1) - ..() - return +/datum/reagent/sugar/overdose_process(var/mob/living/M as mob, severity) + M.Paralyse(3 * severity) + M.Weaken(4 * severity) + if(prob(8)) + M.adjustToxLoss(severity) + diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm index 64e3b00936d..0a2fa0396bf 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_med.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm @@ -40,6 +40,7 @@ description = "Synaptizine is used to treat neuroleptic shock. Can be used to help remove disabling symptoms such as paralysis." reagent_state = LIQUID color = "#FA46FA" + overdose_threshold = 40 /datum/reagent/synaptizine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -53,6 +54,27 @@ ..() return +/datum/reagent/synaptizine/overdose_process(var/mob/living/M as mob, severity) + var/effect = ..() + if(severity == 1) + if(effect <= 1) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 3) + M.emote(pick("groan","moan")) + if(effect <= 8) + M.adjustToxLoss(1) + else if(severity == 2) + if(effect <= 2) + M.visible_message("[M] suddenly and violently vomits!") + M.fakevomit(no_text = 1) + else if(effect <= 5) + M.visible_message("[M] staggers and drools, their eyes bloodshot!") + M.Dizzy(8) + M.Weaken(4) + if(effect <= 15) + M.adjustToxLoss(1) + /datum/reagent/mitocholide name = "Mitocholide" id = "mitocholide" @@ -114,12 +136,10 @@ ..() return -/datum/reagent/rezadone/overdose_process(mob/living/M) +/datum/reagent/rezadone/overdose_process(mob/living/M, severity) M.adjustToxLoss(1) M.Dizzy(5) M.Jitter(5) - ..() - return /datum/reagent/spaceacillin name = "Spaceacillin" diff --git a/paradise.dme b/paradise.dme index 3a5da1134eb..11e0b205f71 100644 --- a/paradise.dme +++ b/paradise.dme @@ -214,12 +214,14 @@ #include "code\datums\diseases\anxiety.dm" #include "code\datums\diseases\appendicitis.dm" #include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\berserker.dm" #include "code\datums\diseases\brainrot.dm" #include "code\datums\diseases\cold.dm" #include "code\datums\diseases\cold9.dm" #include "code\datums\diseases\fake_gbs.dm" #include "code\datums\diseases\flu.dm" #include "code\datums\diseases\fluspanish.dm" +#include "code\datums\diseases\food_poisoning.dm" #include "code\datums\diseases\gbs.dm" #include "code\datums\diseases\magnitis.dm" #include "code\datums\diseases\pierrot_throat.dm"