From b295e7809ece28f7bb63f71c6d3d36c1cad7ebae Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 3 May 2016 19:55:11 -0400 Subject: [PATCH] Overdose Rework --- code/datums/diseases/berserker.dm | 55 +++++ code/modules/mob/mob.dm | 8 +- code/modules/reagents/newchem/disease.dm | 13 ++ code/modules/reagents/newchem/drugs.dm | 218 +++++++++++++----- code/modules/reagents/newchem/food.dm | 21 +- code/modules/reagents/newchem/medicine.dm | 138 ++++++----- .../modules/reagents/newchem/newchem_procs.dm | 12 +- code/modules/reagents/newchem/toxins.dm | 58 +++-- .../reagents/drink/reagents_alcohol.dm | 8 +- .../oldchem/reagents/drink/reagents_drink.dm | 5 +- .../oldchem/reagents/reagents_food.dm | 24 +- .../reagents/oldchem/reagents/reagents_med.dm | 26 ++- paradise.dme | 1 + sound/goonstation/effects/heartbeat.ogg | Bin 0 -> 9838 bytes 14 files changed, 411 insertions(+), 176 deletions(-) create mode 100644 code/datums/diseases/berserker.dm create mode 100644 sound/goonstation/effects/heartbeat.ogg 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/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..9e2c4d89554 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -50,6 +50,19 @@ 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/spore name = "Blob Spores" id = "spore" diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 6d8a7d4117f..5ca177cb48e 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('sound/goonstation/effects/heartbeat.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" @@ -255,7 +361,7 @@ 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) +/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob, severity) M.hallucination += 10 if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 8, i++) @@ -266,7 +372,6 @@ var/obj/item/I = M.get_active_hand() if(I) M.drop_item() - ..() return /datum/chemical_reaction/aranesp @@ -381,24 +486,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 +556,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 +568,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 +594,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 +612,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..a2f259242e8 100644 --- a/code/modules/reagents/newchem/food.dm +++ b/code/modules/reagents/newchem/food.dm @@ -175,15 +175,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" @@ -283,11 +280,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 +438,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 +449,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..e331f4d3565 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.playsound_local(M.loc, "sound/goonstation/effects/heartbeat.ogg", 50, 1) + 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" 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 9077d8b86f4..cab6d3172c7 100644 --- a/paradise.dme +++ b/paradise.dme @@ -213,6 +213,7 @@ #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" diff --git a/sound/goonstation/effects/heartbeat.ogg b/sound/goonstation/effects/heartbeat.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a98aec8037af082cd96da32b3a899809fc2c481f GIT binary patch literal 9838 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

~sJ4EVX~ zcA`l4;;%Qz!4o8bny405H1f1+?CtV@0OHsQi4UB!a+$Au%14Oub8^R^(1Ma>9TMY_ zVctC`5mB)GwHYZ}_h+#DLk0f0dGo=V5>fFicHFU~6EVk+M#ZJZLRrz*Pa@f|OXb2< zBZc!DUE$dlQXlB99j@_zoumkwdYmMD**^lgmS3D@qo4bL3R>HLUaF&6!P~!6jhI zTs(A4(1I5_y|H-Y=9i7;Xw04B!l#4Dal0_>e}m<~t>&MO0bL`(@Le|54lj2frjrhH zY395k`@xQ8=+H}-Y@>z%J<XHC!nK4JB^{Ika^2$?p7Va(FKH9! zovpL(XzA10ifYOOXgj-e3Aw$>-vf_Wgyx2bQ+`ntM1NuI2cc!1850vDKr7O`slO{U zD(2WaFDtjs}&VkZ|q($NA7Yx^k&%a4&4;e7Pfeal&r|rPRsPjzh!8w=_mea6jWIHJ%Y}8&i(XZ&#H%k z$SsI&Yk0Rcf|cXiv5`j#f~C2np3{aWx=f%^D*Js?$DnoW>-6amCi9!w zHtDNaCbkv7V5EEssT5nsb|&{LIvLji-)h9+ZDaGSgl?$ zviGCQE#a)_O8D!b{L@gF?)mG9j1EiYHgmI`^R8Ri1T%7vh*E}MeilwXf;+;%B61FG z2^_ae%I~^7oXYSL8l!38YcCQRqw5>i^doW8U18OyVB^p4f%x(A8wRa4u(Nj;VaWsL9^D9K}`{-X8Dpm1+i~%UN z0l&SfT@^(2G?_>bvS{ZaBs$6ZrKf^{FbwUrrNWaU$V%tAzYTprJwWYNNYR&W3;=#t zHVw!?3+06fE-~$fwem(SNB3@K zB;=HS?Z2hQ%Cy?2$zBQCz-=$&xle}}ll>ceu{ z?V0_f+=S;|qx<7(4^+@ewIvCEcenb-~GvFbUZ;6{d`>K1MF+RmdUnV zhPJ1M`#a+m`=M>Jr{DvR95{u2?5KZ?0{@)gt?l0MozI@Qbm$J} z*B^`gjjuaJkUVXx%6uc&_l-_ufXZRyJ4*6a8)$EE`Br+nH`9=&8XP2lDB8Be_qWHd z{x#(RFB%g_rbwxm7ZhgXBF0lIcFgF3D`JMUdf~>#TL^GK7Q+AQHR~`R<+iFb;*7c* zdms8;*x#l074v!!Zr9;TkjxNY8GOHegjqvnb)u@NYX&Yj71kfFEgT4f34%qP1YH|$ z!%Mwc_-IOJjk>M@3omOO^xYH`o%|>@dC7UsP!+TygQHnv>i|y?CJwFuRxJ|h`TMo) zUecu>Y(po9etc;YJco-oz|k!f*n@D-s3#@;?bz4xZ5C4{Xw0cee8e*h4TjL?RfjmL z3HTfoDb_tRR{S}~BY)22iKfPu3Fh<**>CxQ3Vr>XM$lK*-WRl(J23H)H#>9Dn)v;t zC`i0hCI*fI?_+>xD9K+GqL#$vEYnBK&*t7L8~Hf(G2M(`k$ZhW$Z$t+AJtGPDUm;Z znvXFv?R;gIQ;n~fkfEuo!5FWZSj4hCfqk?cJDL%4Egi1$6Fhhh7F$}xND>jLi%pJ& z&bC;De9*`*v-5f(=}Tfl=U^8UPr-o6b`!zipA?bKZ2N`KJx<6h%S264eqcBzo_A2# zA6Y8(M$o$U_kE8qTKJQ!a3!CKCf<;x^PeMs0I+d{@^3k=VtuYoRwV_PJ6Zm5cztv7 zix8b}p5)ZfH0y(0dRh2n#O5;>$vfUx2nE2^BMUYaY=`N7+`Mbge3-;Jlhh6C*6rWC UY2m|E