diff --git a/code/WorkInProgress/Cib/MedicalSideEffects.dm b/code/WorkInProgress/Cib/MedicalSideEffects.dm index c886a8abe9..cf1811b9ed 100644 --- a/code/WorkInProgress/Cib/MedicalSideEffects.dm +++ b/code/WorkInProgress/Cib/MedicalSideEffects.dm @@ -2,6 +2,8 @@ // ======================== /datum/medical_effect/var/name = "None" /datum/medical_effect/var/strength = 0 +/datum/medical_effect/var/start = 0 +/datum/medical_effect/proc/manifest(mob/living/carbon/human/H) /datum/medical_effect/proc/on_life(mob/living/carbon/human/H, strength) /datum/medical_effect/proc/cure(mob/living/carbon/human/H) @@ -11,9 +13,11 @@ /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) - return + 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 @@ -21,32 +25,34 @@ 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() - if(src.reagents.has_reagent("cryoxadone") || src.reagents.get_reagent_amount("bicaridine") >= 15 || src.reagents.get_reagent_amount("tricordrazine") >= 15) - src.add_side_effect("Headache") - if(src.reagents.get_reagent_amount("kelotane") >= 30 || src.reagents.get_reagent_amount("dermaline") >= 15) - src.add_side_effect("Bad Stomach") - - if(src.reagents.get_reagent_amount("tramadol") >= 16 || src.reagents.get_reagent_amount("anti_toxin") >= 30) - src.add_side_effect("Cramps") - - if(src.reagents.get_reagent_amount("space_drugs") >= 10) - src.add_side_effect("Itch") + 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)) + log_debug ("[src], tick [life_tick] : [M] manfiested.") + src.add_side_effect(M.name) // One full cycle(in terms of strength) every 10 minutes - var/strength_percent = sin(life_tick / 2) + 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) - for (var/datum/medical_effect/M in side_effects) - if (M.cure(src) || M.strength > 60) + // 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 @@ -54,20 +60,22 @@ // HEADACHE // ======== /datum/medical_effect/headache/name = "Headache" +/datum/medical_effect/headache/manifest(mob/living/carbon/human/H) + if(H.reagents.has_reagent("alkysine") || H.reagents.has_reagent("tramadol")) + return 0 + if(H.reagents.has_reagent("cryoxadone") >= 10 || H.reagents.get_reagent_amount("bicaridine") >= 15 || H.reagents.get_reagent_amount("tricordrazine") >= 15) + return 1 + return 0 + /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 50) + if(31 to INFINITY) H.custom_pain("You feel an excrutiating pain in your head!",1) H.adjustBrainLoss(1) - if(51 to INFINITY) - H.custom_pain("It feels like your head is about to split open!",1) - H.adjustBrainLoss(3) - var/datum/organ/external/O = H.organs_by_name["head"] - O.take_damage(0, 1, 0, "Headache") /datum/medical_effect/headache/cure(mob/living/carbon/human/H) if(H.reagents.has_reagent("alkysine") || H.reagents.has_reagent("tramadol")) @@ -78,18 +86,23 @@ // BAD STOMACH // =========== /datum/medical_effect/bad_stomach/name = "Bad Stomach" +/datum/medical_effect/bad_stomach/manifest(mob/living/carbon/human/H) + if(H.reagents.has_reagent("anti_toxin")) + return 0 + if(H.reagents.get_reagent_amount("kelotane") >= 30 || H.reagents.get_reagent_amount("dermaline") >= 15) + return 1 + return 0 + + /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 50) + if(31 to INFINITY) H.custom_pain("You feel sick.",1) H.adjustToxLoss(1) - if(51 to INFINITY) - H.custom_pain("You can't hold it in any longer!",1) - H.vomit() /datum/medical_effect/bad_stomach/cure(mob/living/carbon/human/H) if(H.reagents.has_reagent("anti_toxin")) @@ -101,20 +114,22 @@ // CRAMPS // ====== /datum/medical_effect/cramps/name = "Cramps" +/datum/medical_effect/cramps/manifest(mob/living/carbon/human/H) + if(H.reagents.has_reagent("inaprovaline")) + return 0 + if( H.reagents.get_reagent_amount("anti_toxin") >= 30 || H.reagents.get_reagent_amount("tramadol") >= 15) + return 1 + return 0 /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 50) + 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) - if(51 to INFINITY) - H.emote("me",1,"flinches as all the muscles in their body cramp up.") - H.custom_pain("It feels as though your muscles are being ripped apart!",1) - H.apply_damage(1, used_weapon = "Cramps") /datum/medical_effect/cramps/cure(mob/living/carbon/human/H) if(H.reagents.has_reagent("inaprovaline")) @@ -125,21 +140,22 @@ // ITCH // ==== /datum/medical_effect/itch/name = "Itch" +/datum/medical_effect/itch/manifest(mob/living/carbon/human/H) + if(H.reagents.has_reagent("inaprovaline")) + return 0 + if(H.reagents.get_reagent_amount("space_drugs") >= 10) + return 1 + return 0 /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 50) + 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) - if(51 to INFINITY) - H.emote("me",1,"shivers.") - H.custom_pain("The itch starts hurting and oozing blood.",1) - H.apply_damage(1, BURN, used_weapon = "Itch") - H.drip(1) /datum/medical_effect/itch/cure(mob/living/carbon/human/H) if(H.reagents.has_reagent("inaprovaline")) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0f0cf418e3..95cc8562e5 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -97,7 +97,7 @@ handle_pain() -// handle_medical_side_effects() + handle_medical_side_effects() handle_stasis_bag() diff --git a/html/changelog.html b/html/changelog.html index bae30a6da9..c324f0d231 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,13 @@ should be listed in the changelog upon commit though. Thanks. --> +