// MEDICAL SIDE EFFECT BASE // ======================== /datum/medical_effect var/name = "None" var/strength = 0 var/start = 0 var/list/triggers var/list/cures var/cure_message /datum/medical_effect/proc/manifest(mob/living/carbon/human/H) for(var/R in cures) if(H.reagents.has_reagent(R)) return 0 for(var/R in triggers) if(H.reagents.get_reagent_amount(R) >= triggers[R]) return 1 return 0 /datum/medical_effect/proc/on_life(mob/living/carbon/human/H, strength) return /datum/medical_effect/proc/cure(mob/living/carbon/human/H) for(var/R in cures) if(H.reagents.has_reagent(R)) H <<"\red [cure_message]" return 1 return 0 // MOB HELPERS // =========== /mob/living/carbon/human/var/list/datum/medical_effect/side_effects = list() /mob/proc/add_side_effect(name, strength = 0) /mob/living/carbon/human/add_side_effect(name, strength = 0) for(var/datum/medical_effect/M in src.side_effects) if(M.name == name) M.strength = max(M.strength, 10) M.start = life_tick return var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect for(var/T in L) var/datum/medical_effect/M = new T if(M.name == name) M.strength = strength M.start = life_tick side_effects += M /mob/living/carbon/human/proc/handle_medical_side_effects() var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect for(var/T in L) var/datum/medical_effect/M = new T if (M.manifest(src)) src.add_side_effect(M.name) // One full cycle(in terms of strength) every 10 minutes for (var/datum/medical_effect/M in side_effects) if (!M) continue var/strength_percent = sin((life_tick - M.start) / 2) log_debug ("[src], tick [life_tick] : Processing [M], Current phase: [strength_percent]") // Only do anything if the effect is currently strong enough if(strength_percent >= 0.4) log_debug ("[src], tick [life_tick] : Active phase ; strength [M.strength]") if (M.cure(src) || M.strength > 50) log_debug ("[src], tick [life_tick] : [M] cured or reached end of lifecycle") side_effects -= M del(M) else if(life_tick % 45 == 0) log_debug ("[src], tick [life_tick] : Activating [M] ") M.on_life(src, strength_percent*M.strength) // Effect slowly growing stronger M.strength+=0.08 // HEADACHE // ======== /datum/medical_effect/headache name = "Headache" triggers = list("cryoxadone" = 10, "bicaridine" = 15, "tricordrazine" = 15) cures = list("alkysine", "tramadol") cure_message = "Your head stops throbbing..." /datum/medical_effect/headache/on_life(mob/living/carbon/human/H, strength) switch(strength) if(1 to 10) H.custom_pain("You feel a light pain in your head.",0) if(11 to 30) H.custom_pain("You feel a throbbing pain in your head!",1) if(31 to INFINITY) H.custom_pain("You feel an excrutiating pain in your head!",1) H.adjustBrainLoss(1) // BAD STOMACH // =========== /datum/medical_effect/bad_stomach name = "Bad Stomach" triggers = list("kelotane" = 30, "dermaline" = 15) cures = list("anti_toxin") cure_message = "Your stomach feels a little better now..." /datum/medical_effect/bad_stomach/on_life(mob/living/carbon/human/H, strength) switch(strength) if(1 to 10) H.custom_pain("You feel a bit light around the stomach.",0) if(11 to 30) H.custom_pain("Your stomach hurts.",0) if(31 to INFINITY) H.custom_pain("You feel sick.",1) H.adjustToxLoss(1) // CRAMPS // ====== /datum/medical_effect/cramps name = "Cramps" triggers = list("anti_toxin" = 30, "tramadol" = 15) cures = list("inaprovaline") cure_message = "The cramps let up..." /datum/medical_effect/cramps/on_life(mob/living/carbon/human/H, strength) switch(strength) if(1 to 10) H.custom_pain("The muscles in your body hurt a little.",0) if(11 to 30) H.custom_pain("The muscles in your body cramp up painfully.",0) if(31 to INFINITY) H.emote("me",1,"flinches as all the muscles in their body cramp up.") H.custom_pain("There's pain all over your body.",1) H.adjustToxLoss(1) // ITCH // ==== /datum/medical_effect/itch name = "Itch" triggers = list("space_drugs" = 10) cures = list("inaprovaline") cure_message = "The itching stops..." /datum/medical_effect/itch/on_life(mob/living/carbon/human/H, strength) switch(strength) if(1 to 10) H.custom_pain("You feel a slight itch.",0) if(11 to 30) H.custom_pain("You want to scratch your itch badly.",0) if(31 to INFINITY) H.emote("me",1,"shivers slightly.") H.custom_pain("This itch makes it really hard to concentrate.",1) H.adjustToxLoss(1)