From 44742cb11510a7cd0075d4b35b6a043ac4f26fb4 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sat, 15 Jul 2017 11:41:36 -0700 Subject: [PATCH] im a dumbass and didn't see the .rej files Revert "[MIRROR] Disease Refactor" (#2025) * Revert "Automatic changelog generation for PR #2021 [ci skip]" This reverts commit 9d0cd37dd3ff958eb0f4401b45ef07d0c1735a44. * Revert "Disease Refactor (#2021)" This reverts commit f2ac487927a92488fbd83d507d2f236a158b4022. --- code/_onclick/other_mobs.dm | 3 +- code/controllers/subsystem/disease.dm | 31 +++++++- code/datums/diseases/_MobProcs.dm | 10 +-- code/datums/diseases/_disease.dm | 73 +++++++++++++++---- code/datums/diseases/advance/advance.dm | 14 +++- .../diseases/advance/symptoms/sneeze.dm | 2 +- .../diseases/advance/symptoms/symptoms.dm | 2 +- code/datums/diseases/appendicitis.dm | 2 +- code/datums/diseases/brainrot.dm | 2 +- code/datums/diseases/dna_spread.dm | 4 +- code/datums/diseases/pierrot_throat.dm | 1 + code/datums/diseases/rhumba_beat.dm | 2 +- code/datums/diseases/transformation.dm | 1 + code/datums/diseases/tuberculosis.dm | 4 +- code/datums/mind.dm | 19 +++-- code/game/data_huds.dm | 3 +- .../gamemodes/changeling/powers/panacea.dm | 5 +- .../gamemodes/miniantags/abduction/gland.dm | 3 +- .../gamemodes/miniantags/monkey/monkey.dm | 1 + code/game/machinery/cloning.dm | 2 +- .../effects/decals/cleanable/aliens.dm | 17 ++++- .../effects/decals/cleanable/humans.dm | 19 ++++- .../objects/effects/decals/cleanable/misc.dm | 9 ++- .../effects/decals/cleanable/robots.dm | 7 ++ .../objects/effects/spawners/gibspawner.dm | 27 ++++--- code/game/objects/items/devices/scanners.dm | 3 +- code/game/objects/items/weapons/melee/misc.dm | 2 +- code/modules/admin/secrets.dm | 5 +- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/clothing/ears/ears.dm | 2 +- code/modules/events/disease_outbreak.dm | 16 ++-- code/modules/events/shuttle_loan.dm | 8 +- code/modules/events/shuttle_loan.dm.rej | 10 --- .../events/spontaneous_appendicitis.dm | 15 +--- .../kitchen_machinery/processor.dm | 3 +- code/modules/mob/living/blood.dm | 6 +- code/modules/mob/living/carbon/alien/death.dm | 4 +- .../mob/living/carbon/alien/larva/death.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 5 +- .../mob/living/carbon/carbon_defense.dm | 15 ++-- code/modules/mob/living/carbon/human/death.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 3 +- code/modules/mob/living/carbon/life.dm | 9 --- code/modules/mob/living/carbon/life.dm.rej | 10 --- code/modules/mob/living/death.dm | 2 +- code/modules/mob/living/life.dm | 16 +--- code/modules/mob/living/life.dm.rej | 11 --- code/modules/mob/living/silicon/death.dm | 2 +- .../mob/living/silicon/pai/software.dm | 3 +- .../mob/living/simple_animal/bot/medbot.dm | 6 +- code/modules/mob/mob.dm | 3 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/transform_procs.dm | 8 +- .../reagents/chemistry/machinery/pandemic.dm | 2 +- .../chemistry/reagents/medicine_reagents.dm | 10 ++- .../chemistry/reagents/other_reagents.dm | 11 ++- 56 files changed, 255 insertions(+), 210 deletions(-) delete mode 100644 code/modules/events/shuttle_loan.dm.rej delete mode 100644 code/modules/mob/living/carbon/life.dm.rej delete mode 100644 code/modules/mob/living/life.dm.rej diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index f0ba15446c..b9df144ace 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -100,8 +100,7 @@ "[name] bites [ML]!") if(armor >= 2) return - for(var/thing in viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in viruses) ML.ForceContractDisease(D) else ML.visible_message("[src] has attempted to bite [ML]!") diff --git a/code/controllers/subsystem/disease.dm b/code/controllers/subsystem/disease.dm index 451bd05606..5499680a2f 100644 --- a/code/controllers/subsystem/disease.dm +++ b/code/controllers/subsystem/disease.dm @@ -1,8 +1,11 @@ SUBSYSTEM_DEF(disease) name = "Disease" - flags = SS_NO_FIRE + flags = SS_KEEP_TIMING|SS_NO_INIT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/currentrun = list() + var/list/processing = list() - var/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing. var/list/diseases var/list/archive_diseases = list() @@ -12,5 +15,27 @@ SUBSYSTEM_DEF(disease) if(!diseases) diseases = subtypesof(/datum/disease) +/datum/controller/subsystem/disease/Recover() + currentrun = SSdisease.currentrun + processing = SSdisease.processing + diseases = SSdisease.diseases + archive_diseases = SSdisease.archive_diseases + /datum/controller/subsystem/disease/stat_entry(msg) - ..("P:[active_diseases.len]") \ No newline at end of file + ..("P:[processing.len]") + +/datum/controller/subsystem/disease/fire(resumed = 0) + if(!resumed) + src.currentrun = processing.Copy() + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(currentrun.len) + var/datum/thing = currentrun[currentrun.len] + currentrun.len-- + if(thing) + thing.process() + else + processing.Remove(thing) + if (MC_TICK_CHECK) + return diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 84d177a390..77b8aeed6a 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,7 +1,6 @@ /mob/proc/HasDisease(datum/disease/D) - for(var/thing in viruses) - var/datum/disease/DD = thing + for(var/datum/disease/DD in viruses) if(D.IsSame(DD)) return 1 return 0 @@ -40,7 +39,7 @@ var/datum/disease/DD = new D.type(1, D, 0) viruses += DD DD.affected_mob = src - SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed. + DD.holder = src //Copy properties over. This is so edited diseases persist. var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed") @@ -148,9 +147,6 @@ /mob/living/carbon/human/CanContractDisease(datum/disease/D) - if(dna && (VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity) + if(dna && (VIRUSIMMUNE in dna.species.species_traits)) return 0 - for(var/thing in D.required_organs) - if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs))) - return 0 return ..() \ No newline at end of file diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 13ad3ece4e..cc11d0e6d2 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -46,23 +46,21 @@ var/stage_prob = 4 //Other + var/longevity = 150 //Time in ticks disease stays in objects, Syringes and such are infinite. var/list/viable_mobtypes = list() //typepaths of viable mobs var/mob/living/carbon/affected_mob = null + var/atom/movable/holder = null var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids var/infectivity = 65 var/cure_chance = 8 - var/carrier = FALSE //If our host is only a carrier - var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses + var/carrier = 0 //If our host is only a carrier var/permeability_mod = 1 var/severity = NONTHREAT var/list/required_organs = list() var/needs_all_cures = TRUE var/list/strain_data = list() //dna_spread special bullshit -/datum/disease/Destroy() - affected_mob = null - SSdisease.active_diseases.Remove(src) - return ..() + /datum/disease/proc/stage_act() var/cure = has_cure() @@ -95,16 +93,13 @@ if(!. || (needs_all_cures && . < cures.len)) return 0 - -/datum/disease/proc/spread(force_spread = 0) - if(!affected_mob) - return - +/datum/disease/proc/spread(atom/source, force_spread = 0) if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) return - if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) - return + if(affected_mob) + if( affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)) ) + return var/spread_range = 1 @@ -114,9 +109,15 @@ if(spread_flags & AIRBORNE) spread_range++ - var/turf/T = affected_mob.loc + if(!source) + if(affected_mob) + source = affected_mob + else + return + + var/turf/T = source.loc if(istype(T)) - for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) + for(var/mob/living/carbon/C in oview(spread_range, source)) var/turf/V = get_turf(C) if(V) while(TRUE) @@ -128,6 +129,29 @@ break V = Temp +/datum/disease/process() + if(!holder) + SSdisease.processing -= src + return + + if(prob(infectivity)) + spread(holder) + + if(affected_mob) + for(var/datum/disease/D in affected_mob.viruses) + if(D != src) + if(IsSame(D)) + qdel(D) + + if(holder == affected_mob) + if(affected_mob.stat != DEAD) + stage_act() + + if(!affected_mob) + if(prob(70)) + if(--longevity<=0) + cure() + /datum/disease/proc/cure() if(affected_mob) @@ -137,6 +161,20 @@ remove_virus() qdel(src) + +/datum/disease/New() + if(required_organs && required_organs.len) + if(ishuman(affected_mob)) + var/mob/living/carbon/human/H = affected_mob + for(var/obj/item/organ/O in required_organs) + if(!locate(O) in H.bodyparts) + if(!locate(O) in H.internal_organs) + cure() + return + + SSdisease.processing += src + + /datum/disease/proc/IsSame(datum/disease/D) if(istype(src, D.type)) return 1 @@ -153,6 +191,11 @@ return type +/datum/disease/Destroy() + SSdisease.processing.Remove(src) + return ..() + + /datum/disease/proc/IsSpreadByTouch() if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL) return 1 diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 623b436893..3aa4dab99b 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -91,7 +91,7 @@ if(!(istype(D, /datum/disease/advance))) return 0 - if(GetDiseaseID() != D.GetDiseaseID()) + if(src.GetDiseaseID() != D.GetDiseaseID()) return 0 return 1 @@ -116,7 +116,7 @@ // Mix the symptoms of two diseases (the src and the argument) /datum/disease/advance/proc/Mix(datum/disease/advance/D) - if(!(IsSame(D))) + if(!(src.IsSame(D))) var/list/possible_symptoms = shuffle(D.symptoms) for(var/datum/symptom/S in possible_symptoms) AddSymptom(new S.type) @@ -156,6 +156,7 @@ return generated /datum/disease/advance/proc/Refresh(new_name = 0) + //to_chat(world, "[src.name] \ref[src] - REFRESH!") GenerateProperties() AssignProperties() id = null @@ -394,7 +395,7 @@ D.AssignName(new_name) D.Refresh() - for(var/datum/disease/advance/AD in SSdisease.active_diseases) + for(var/datum/disease/advance/AD in SSdisease.processing) AD.Refresh() for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list)) @@ -409,6 +410,13 @@ name_symptoms += S.name message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]") +/* +/mob/verb/test() + + for(var/datum/disease/D in SSdisease.processing) + to_chat(src, "[D.name] - [D.holder]") +*/ + /datum/disease/advance/proc/totalStageSpeed() return properties["stage_rate"] diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 11d8b714ba..9413eea5db 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -35,5 +35,5 @@ Bonus M.emote("sniff") else M.emote("sneeze") - A.spread(5) + A.spread(A.holder, 5) return \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index bd5d09afa3..44d7db5709 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -18,7 +18,7 @@ /datum/symptom/New() var/list/S = SSdisease.list_symptoms for(var/i = 1; i <= S.len; i++) - if(type == S[i]) + if(src.type == S[i]) id = "[i]" return CRASH("We couldn't assign an ID!") diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 8c681b8ec3..eba5e1173b 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -8,11 +8,11 @@ permeability_mod = 1 desc = "If left untreated the subject will become very weak, and may vomit often." severity = "Dangerous!" + longevity = 1000 disease_flags = CAN_CARRY|CAN_RESIST spread_flags = NON_CONTAGIOUS visibility_flags = HIDDEN_PANDEMIC required_organs = list(/obj/item/organ/appendix) - bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus /datum/disease/appendicitis/stage_act() ..() diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index e830cafbef..a58f85a494 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -9,7 +9,7 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 15//higher chance to cure, since two reagents are required desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication." - required_organs = list(/obj/item/organ/brain) + required_organs = list(/obj/item/bodypart/head) severity = DANGEROUS /datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 2b77885359..69b30589ac 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -25,8 +25,8 @@ //Absorbs the target DNA. strain_data["dna"] = new affected_mob.dna.type affected_mob.dna.copy_dna(strain_data["dna"]) - carrier = TRUE - stage = 4 + src.carrier = 1 + src.stage = 4 return switch(stage) diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index 75f63edf43..b2195a9527 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -10,6 +10,7 @@ permeability_mod = 0.75 desc = "If left untreated the subject will probably drive others to insanity." severity = MEDIUM + longevity = 400 /datum/disease/pierrot_throat/stage_act() ..() diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm index 9cbb829061..d33446cadf 100644 --- a/code/datums/diseases/rhumba_beat.dm +++ b/code/datums/diseases/rhumba_beat.dm @@ -13,7 +13,7 @@ /datum/disease/rhumba_beat/stage_act() ..() if(affected_mob.ckey == "rosham") - cure() + src.cure() return switch(stage) if(2) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index e5746c3f8b..03b746a3bd 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -73,6 +73,7 @@ permeability_mod = 1 cure_chance = 1 disease_flags = CAN_CARRY|CAN_RESIST + longevity = 30 desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." severity = BIOHAZARD stage_prob = 4 diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index c8e2a4609b..4b57c2655b 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -1,5 +1,4 @@ /datum/disease/tuberculosis - form = "Disease" name = "Fungal tuberculosis" max_stages = 5 spread_text = "Airborne" @@ -9,9 +8,8 @@ viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 5//like hell are you getting out of hell desc = "A rare highly transmittable virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue." - required_organs = list(/obj/item/organ/lungs) + required_organs = list(/obj/item/bodypart/head) severity = DANGEROUS - bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing. /datum/disease/tuberculosis/stage_act() //it begins ..() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b484e1e480..f23f01d068 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -629,11 +629,10 @@ text = "[text]: " if (ishuman(current)) text += "healthy|infected|HUMAN|other" - else if(ismonkey(current)) - var/found = FALSE - for(var/datum/disease/transformation/jungle_fever/JF in current.viruses) - found = TRUE - break + else if (ismonkey(current)) + var/found = 0 + for(var/datum/disease/D in current.viruses) + if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1 if(found) text += "healthy|INFECTED|human|other" @@ -1343,8 +1342,7 @@ src = M.mind //to_chat(world, "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!") else if (istype(M) && length(M.viruses)) - for(var/thing in M.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in M.viruses) D.cure(0) if("infected") if (check_rights(R_ADMIN, 0)) @@ -1364,9 +1362,10 @@ var/mob/living/carbon/human/H = current var/mob/living/carbon/monkey/M = current if (istype(M)) - for(var/datum/disease/transformation/jungle_fever/JF in M.viruses) - JF.cure(0) - sleep(0) //because deleting of virus is doing throught spawn(0) //What + for(var/datum/disease/D in M.viruses) + if (istype(D,/datum/disease/transformation/jungle_fever)) + D.cure(0) + sleep(0) //because deleting of virus is doing throught spawn(0) log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 4e4c35a937..2e5854509a 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -62,8 +62,7 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() var/threat = 0 - for(var/thing in viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in viruses) if(!(D.visibility_flags & HIDDEN_SCANNER)) if (D.severity != NONTHREAT) //a buffing virus gets an icon threat = 2 diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index c961406810..40ce63a60e 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -41,9 +41,6 @@ user.reagents.add_reagent("antihol", 10) user.reagents.add_reagent("mannitol", 25) - for(var/thing in user.viruses) - var/datum/disease/D = thing - if(D.severity == NONTHREAT) - continue + for(var/datum/disease/D in user.viruses) D.cure() return TRUE diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 6a0993db54..13e86dd5d3 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -133,9 +133,10 @@ to_chat(owner, "You feel sick.") var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis) var/datum/disease/D = new virus_type() - D.carrier = TRUE + D.carrier = 1 owner.viruses += D D.affected_mob = owner + D.holder = owner owner.med_hud_set_status() diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index da9f4b61f1..20ba54afc4 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -60,6 +60,7 @@ var/datum/disease/D = new /datum/disease/transformation/jungle_fever D.visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC + D.holder = carriermind.current D.affected_mob = carriermind.current carriermind.current.viruses += D ..() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 4785fab384..5e876d3b92 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -365,7 +365,7 @@ fl.forceMove(T) unattached_flesh.Cut() mess = FALSE - new /obj/effect/gibspawner/generic(get_turf(src)) + new /obj/effect/gibspawner/generic(loc) audible_message("You hear a splat.") icon_state = "pod_0" return diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index 26b5bca1ec..3ab96f6df5 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -6,10 +6,17 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") + var/list/viruses = list() blood_DNA = list("UNKNOWN DNA" = "X*") bloodiness = MAX_SHOE_BLOODINESS blood_state = BLOOD_STATE_XENO +/obj/effect/decal/cleanable/xenoblood/Destroy() + for(var/datum/disease/D in viruses) + D.cure(0) + viruses = null + return ..() + /obj/effect/decal/cleanable/xenoblood/xsplatter random_icon_states = list("xgibbl1", "xgibbl2", "xgibbl3", "xgibbl4", "xgibbl5") @@ -27,9 +34,13 @@ var/direction = pick(directions) for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) sleep(2) - if(i > 0) - new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc) - if(!step_to(src, get_step(src, direction), 0)) + if (i > 0) + var/obj/effect/decal/cleanable/xenoblood/b = new /obj/effect/decal/cleanable/xenoblood/xsplatter(src.loc) + for(var/datum/disease/D in src.viruses) + var/datum/disease/ND = D.Copy(1) + b.viruses += ND + ND.holder = b + if (!step_to(src, get_step(src, direction), 0)) break /obj/effect/decal/cleanable/xenoblood/xgibs/ex_act() diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 5127aa2285..8248776a95 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -4,10 +4,17 @@ icon = 'icons/effects/blood.dmi' icon_state = "floor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") + var/list/viruses = list() blood_DNA = list() blood_state = BLOOD_STATE_HUMAN bloodiness = MAX_SHOE_BLOODINESS +/obj/effect/decal/cleanable/blood/Destroy() + for(var/datum/disease/D in viruses) + D.cure(0) + viruses = null + return ..() + /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) if (C.blood_DNA) blood_DNA |= C.blood_DNA.Copy() @@ -63,11 +70,15 @@ /obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions) set waitfor = 0 var/direction = pick(directions) - for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) + for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) sleep(2) - if(i > 0) - new /obj/effect/decal/cleanable/blood/splatter(loc) - if(!step_to(src, get_step(src, direction), 0)) + if (i > 0) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) + for(var/datum/disease/D in src.viruses) + var/datum/disease/ND = D.Copy(1) + b.viruses += ND + ND.holder = b + if (!step_to(src, get_step(src, direction), 0)) break /obj/effect/decal/cleanable/blood/gibs/up diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 98a9782600..f1b0a9ce40 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -80,8 +80,9 @@ icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") + var/list/viruses = list() -/obj/effect/decal/cleanable/vomit/attack_hand(mob/user) +/obj/effect/decal/cleanable/vomit/attack_hand(var/mob/user) if(ishuman(user)) var/mob/living/carbon/human/H = user if(isflyperson(H)) @@ -97,6 +98,12 @@ reagents.trans_to(H, reagents.total_volume) qdel(src) +/obj/effect/decal/cleanable/vomit/Destroy() + for(var/datum/disease/D in viruses) + D.cure(0) + viruses = null + return ..() + /obj/effect/decal/cleanable/vomit/old name = "crusty dried vomit" desc = "You try not to look at the chunks, and fail." diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index e91c273903..862d21ad6b 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -43,6 +43,7 @@ desc = "It's black and greasy. Looks like Beepsky made another mess." icon = 'icons/mob/robots.dmi' icon_state = "floor1" + var/viruses = list() random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") blood_state = BLOOD_STATE_OIL bloodiness = MAX_SHOE_BLOODINESS @@ -51,5 +52,11 @@ ..() reagents.add_reagent("oil", 30) +/obj/effect/decal/cleanable/oil/Destroy() + for(var/datum/disease/D in viruses) + D.cure(0) + viruses = null + return ..() + /obj/effect/decal/cleanable/oil/streak random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index b25b9f7d8f..06beef6940 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -6,8 +6,8 @@ var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn. var/list/gibdirections = list() //of lists of possible directions to spread each gib decal type towards. -/obj/effect/gibspawner/Initialize(mapload, datum/dna/MobDNA) - . = ..() +/obj/effect/gibspawner/Initialize(mapload, list/viruses, datum/dna/MobDNA) + ..() if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) to_chat(world, "Gib list length mismatch!") @@ -29,6 +29,13 @@ var/mob/living/carbon/digester = loc digester.stomach_contents += gib + if(viruses && viruses.len > 0) + for(var/datum/disease/D in viruses) + if(prob(virusProb)) + var/datum/disease/viruus = D.Copy(1) + gib.viruses += viruus + viruus.holder = gib + if(MobDNA) gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.blood_type else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey @@ -49,7 +56,7 @@ /obj/effect/gibspawner/generic/Initialize() playsound(src, 'sound/effects/blobattack.ogg', 40, 1) gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) - . = ..() + ..() /obj/effect/gibspawner/human gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood/gibs/core) @@ -58,7 +65,7 @@ /obj/effect/gibspawner/human/Initialize() playsound(src, 'sound/effects/blobattack.ogg', 50, 1) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) - . = ..() + ..() /obj/effect/gibspawner/humanbodypartless //only the gibs that don't look like actual full bodyparts (except torso). @@ -68,7 +75,7 @@ /obj/effect/gibspawner/humanbodypartless/Initialize() playsound(src, 'sound/effects/blobattack.ogg', 50, 1) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) - . = ..() + ..() /obj/effect/gibspawner/xeno @@ -78,7 +85,7 @@ /obj/effect/gibspawner/xeno/Initialize() playsound(src, 'sound/effects/blobattack.ogg', 60, 1) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list()) - . = ..() + ..() /obj/effect/gibspawner/xenobodypartless //only the gibs that don't look like actual full bodyparts (except torso). @@ -89,7 +96,7 @@ /obj/effect/gibspawner/xenobodypartless/Initialize() playsound(src, 'sound/effects/blobattack.ogg', 60, 1) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list()) - . = ..() + ..() /obj/effect/gibspawner/larva gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body) @@ -98,7 +105,7 @@ /obj/effect/gibspawner/larva/Initialize() playsound(src, 'sound/effects/blobattack.ogg', 60, 1) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs) - . = ..() + ..() /obj/effect/gibspawner/larvabodypartless gibtypes = list(/obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva, /obj/effect/decal/cleanable/xenoblood/xgibs/larva) @@ -107,7 +114,7 @@ /obj/effect/gibspawner/larvabodypartless/Initialize() playsound(src, 'sound/effects/blobattack.ogg', 60, 1) gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST), list()) - . = ..() + ..() /obj/effect/gibspawner/robot sparks = 1 @@ -117,4 +124,4 @@ /obj/effect/gibspawner/robot/Initialize() gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs) gibamounts[6] = pick(0,1,2) - . = ..() + ..() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 968f361544..70b6d54f73 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -171,8 +171,7 @@ MASS SPECTROMETER if(tdelta < (DEFIB_TIME_LIMIT * 10)) to_chat(user, "Subject died [tdelta / 10] seconds ago, defibrillation may be possible!") - for(var/thing in M.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in M.viruses) if(!(D.visibility_flags & HIDDEN_SCANNER)) to_chat(user, "Warning: [D.form] detected\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]") diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 6285dcaa13..e10d04611a 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -160,7 +160,7 @@ if (B && !QDELETED(B)) H.internal_organs -= B qdel(B) - new /obj/effect/gibspawner/generic(get_turf(H), H.dna) + new /obj/effect/gibspawner/generic(H.loc, H.viruses, H.dna) return (BRUTELOSS) /obj/item/weapon/melee/classic_baton/telescopic/attack_self(mob/user) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 1b00e01d4e..ffad361db8 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -149,9 +149,8 @@ var/choice = input("Are you sure you want to cure all disease?") in list("Yes", "Cancel") if(choice == "Yes") message_admins("[key_name_admin(usr)] has cured all diseases.") - for(var/thing in SSdisease.active_diseases) - var/datum/disease/D = thing - D.cure(0) + for(var/datum/disease/D in SSdisease.processing) + D.cure(D) if("set_name") if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 90ac9416d9..9a8e7c8278 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -615,7 +615,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]") if(isobserver(M)) - new /obj/effect/gibspawner/generic(get_turf(M)) + new /obj/effect/gibspawner/generic(M.loc, M.viruses) return if(confirm == "Yes") M.gib() diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 4061c4db03..906bde2a87 100644 --- a/code/modules/clothing/ears/ears.dm +++ b/code/modules/clothing/ears/ears.dm @@ -47,4 +47,4 @@ H.update_inv_ears() H.update_inv_neck() H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") \ No newline at end of file + to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index dbac242321..fc86356adf 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -27,17 +27,11 @@ continue if(T.z != ZLEVEL_STATION) continue - if(!H.client) - continue - if(H.stat == DEAD) - continue - if(VIRUSIMMUNE in H.dna.species.species_traits) //Don't pick someone who's virus immune, only for it to not do anything. - continue - var/foundAlready = FALSE // don't infect someone that already has a disease - for(var/thing in H.viruses) - foundAlready = TRUE + var/foundAlready = 0 // don't infect someone that already has the virus + for(var/datum/disease/D in H.viruses) + foundAlready = 1 break - if(foundAlready) + if(H.stat == DEAD || foundAlready) continue var/datum/disease/D @@ -51,6 +45,6 @@ DS.strain_data["SE"] = H.dna.struc_enzymes else D = new virus_type() - D.carrier = TRUE + D.carrier = 1 H.AddDisease(D) break \ No newline at end of file diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index f19471fffc..60d7535e5a 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -132,7 +132,7 @@ new /obj/structure/spider/stickyweb(T) if(ANTIDOTE_NEEDED) - var/obj/item/weapon/reagent_containers/glass/bottle/virus_type = pick(/obj/item/weapon/reagent_containers/glass/bottle/beesease, /obj/item/weapon/reagent_containers/glass/bottle/brainrot, /obj/item/weapon/reagent_containers/glass/bottle/fluspanish) + var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/fluspanish) var/turf/T for(var/i=0, i<10, i++) if(prob(15)) @@ -142,7 +142,11 @@ else if(prob(25)) shuttle_spawns.Add(/obj/item/weapon/shard) T = pick_n_take(empty_shuttle_turfs) - new virus_type(T) + var/obj/effect/decal/cleanable/blood/b = new(T) + var/datum/disease/D = new virus_type() + D.longevity = 1000 + b.viruses += D + D.holder = b shuttle_spawns.Add(/obj/structure/closet/crate) shuttle_spawns.Add(/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat) shuttle_spawns.Add(/obj/item/weapon/reagent_containers/glass/bottle/magnitis) diff --git a/code/modules/events/shuttle_loan.dm.rej b/code/modules/events/shuttle_loan.dm.rej deleted file mode 100644 index 98a7e42033..0000000000 --- a/code/modules/events/shuttle_loan.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm (rejected hunks) -@@ -21,7 +21,7 @@ - var/thanks_msg = "The cargo shuttle should return in five minutes. Have some supply points for your trouble." - - /datum/round_event/shuttle_loan/start() -- dispatch_type = ANTIDOTE_NEEDED /*pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY) */ -+ dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY) - - /datum/round_event/shuttle_loan/announce() - SSshuttle.shuttle_loan = src diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index a441210432..eb66be3038 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -8,17 +8,10 @@ /datum/round_event/spontaneous_appendicitis/start() for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list)) - if(!H.client) - continue - if(H.stat == DEAD) - continue - if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured - continue - var/foundAlready = FALSE //don't infect someone that already has appendicitis - for(var/datum/disease/appendicitis/A in H.viruses) - foundAlready = TRUE - break - if(foundAlready) + var/foundAlready = 0 //don't infect someone that already has the virus + for(var/datum/disease/D in H.viruses) + foundAlready = 1 + if(H.stat == 2 || foundAlready) continue var/datum/disease/D = new /datum/disease/appendicitis diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index d20b74210b..09a0560357 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -162,8 +162,7 @@ //set reagent data B.data["donor"] = O - for(var/thing in O.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in O.viruses) if(!(D.spread_flags & SPECIAL)) B.data["viruses"] += D.Copy() if(O.has_dna()) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 8e547eeb12..69eacbb69e 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -137,8 +137,7 @@ if(blood_id == C.get_blood_id())//both mobs have the same blood substance if(blood_id == "blood") //normal blood if(blood_data["viruses"]) - for(var/thing in blood_data["viruses"]) - var/datum/disease/D = thing + for(var/datum/disease/D in blood_data["viruses"]) if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) continue C.ForceContractDisease(D) @@ -163,8 +162,7 @@ blood_data["donor"] = src blood_data["viruses"] = list() - for(var/thing in viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in viruses) blood_data["viruses"] += D.Copy() blood_data["blood_DNA"] = copytext(dna.unique_enzymes,1,0) diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index a31dba9fa9..46facdc454 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -1,8 +1,8 @@ /mob/living/carbon/alien/spawn_gibs(with_bodyparts) if(with_bodyparts) - new /obj/effect/gibspawner/xeno(get_turf(src)) + new /obj/effect/gibspawner/xeno(loc,viruses) else - new /obj/effect/gibspawner/xenobodypartless(get_turf(src)) + new /obj/effect/gibspawner/xenobodypartless(loc,viruses) /mob/living/carbon/alien/gib_animation() new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a") diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index f49e545dfa..585e5779c6 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -8,9 +8,9 @@ /mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts) if(with_bodyparts) - new /obj/effect/gibspawner/larva(get_turf(src)) + new /obj/effect/gibspawner/larva(loc,viruses) else - new /obj/effect/gibspawner/larvabodypartless(get_turf(src)) + new /obj/effect/gibspawner/larvabodypartless(loc,viruses) /mob/living/carbon/alien/larva/gib_animation() new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c71751ab2f..4415c0d7ab 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -716,9 +716,8 @@ var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) if(B) B.damaged_brain = 0 - for(var/thing in viruses) - var/datum/disease/D = thing - if(D.severity != NONTHREAT) + for(var/datum/disease/D in viruses) + if (D.severity != NONTHREAT) D.cure(0) if(admin_revive) regenerate_limbs() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 599c3a43cd..780fabe64d 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -107,13 +107,11 @@ /mob/living/carbon/attack_hand(mob/living/carbon/human/user) - for(var/thing in viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in viruses) if(D.IsSpreadByTouch()) user.ContractDisease(D) - for(var/thing in user.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in user.viruses) if(D.IsSpreadByTouch()) ContractDisease(D) @@ -126,13 +124,11 @@ /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) - for(var/thing in viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in viruses) if(D.IsSpreadByTouch()) M.ContractDisease(D) - for(var/thing in M.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in M.viruses) if(D.IsSpreadByTouch()) ContractDisease(D) @@ -141,8 +137,7 @@ return 0 if(..()) //successful monkey bite. - for(var/thing in M.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in M.viruses) ForceContractDisease(D) return 1 diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index a1b67fbee1..4547390f56 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -6,9 +6,9 @@ /mob/living/carbon/human/spawn_gibs(with_bodyparts) if(with_bodyparts) - new /obj/effect/gibspawner/human(get_turf(src), dna) + new /obj/effect/gibspawner/human(loc, viruses, dna) else - new /obj/effect/gibspawner/humanbodypartless(get_turf(src), dna) + new /obj/effect/gibspawner/humanbodypartless(loc, viruses, dna) /mob/living/carbon/human/spawn_dust(just_ash = FALSE) if(just_ash) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 134f50052f..aec0da4b8a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -119,8 +119,7 @@ //Virsuses if(viruses.len) stat("Viruses:", null) - for(var/thing in viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in viruses) stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]") diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 9a82ba5ba9..e50997f634 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -222,15 +222,6 @@ /mob/living/carbon/proc/handle_blood() return -/mob/living/carbon/handle_diseases() - for(var/thing in viruses) - var/datum/disease/D = thing - if(prob(D.infectivity)) - D.spread() - - if(stat != DEAD) - D.stage_act() - /mob/living/carbon/proc/handle_changeling() if(mind && hud_used && hud_used.lingchemdisplay) if(mind.changeling) diff --git a/code/modules/mob/living/carbon/life.dm.rej b/code/modules/mob/living/carbon/life.dm.rej deleted file mode 100644 index b62c84a34f..0000000000 --- a/code/modules/mob/living/carbon/life.dm.rej +++ /dev/null @@ -1,10 +0,0 @@ -diff a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm (rejected hunks) -@@ -12,7 +12,7 @@ - if(..()) //not dead - handle_blood() - -- if(stat != DEAD) // Reagent processing needs to be handled before breathing and such, to prevent edge cases -+ if(stat != DEAD) - handle_organs() - - if(stat == DEAD) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 0fd86ed02e..eb96d09bde 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -18,7 +18,7 @@ return /mob/living/proc/spawn_gibs() - new /obj/effect/gibspawner/generic(get_turf(src)) + new /obj/effect/gibspawner/generic(loc, viruses) /mob/living/proc/spill_organs() return diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 9e51ece6d6..2df4c83b85 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -19,19 +19,14 @@ var/datum/gas_mixture/environment = loc.return_air() if(stat != DEAD) - //Chemicals in the body - handle_chemicals_in_body() - + //Breathing, if applicable + handle_breathing(times_fired) if(stat != DEAD) //Mutations and radiation handle_mutations_and_radiation() - if(stat != DEAD) - //Breathing, if applicable - handle_breathing(times_fired) - - handle_diseases() // DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not. - + //Chemicals in the body + handle_chemicals_in_body() if(stat != DEAD) //Random events (vomiting etc) handle_random_events() @@ -71,9 +66,6 @@ /mob/living/proc/handle_chemicals_in_body() return -/mob/living/proc/handle_diseases() - return - /mob/living/proc/handle_diginvis() if(!digitaldisguise) src.digitaldisguise = image(loc = src) diff --git a/code/modules/mob/living/life.dm.rej b/code/modules/mob/living/life.dm.rej deleted file mode 100644 index aeba977c88..0000000000 --- a/code/modules/mob/living/life.dm.rej +++ /dev/null @@ -1,11 +0,0 @@ -diff a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm (rejected hunks) -@@ -64,9 +64,6 @@ - /mob/living/proc/handle_diseases() - return - --/mob/living/proc/handle_chemicals_in_body() -- return -- - /mob/living/proc/handle_diginvis() - if(!digitaldisguise) - src.digitaldisguise = image(loc = src) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 7537697d71..ca93c95f48 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -1,5 +1,5 @@ /mob/living/silicon/spawn_gibs() - new /obj/effect/gibspawner/robot(get_turf(src)) + new /obj/effect/gibspawner/robot(loc,viruses) /mob/living/silicon/spawn_dust() new /obj/effect/decal/remains/robot(loc) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 0806f457d9..a4f8638c4a 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -513,8 +513,7 @@ Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"} - for(var/thing in M.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in M.viruses) dat += {"

Infection Detected.


Name: [D.name]
Type: [D.spread_text]
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index b4694dc93a..a0399d2b2c 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -372,8 +372,7 @@ return 1 if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus)) - for(var/thing in C.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in C.viruses) //the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines. if(!(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) \ && D.severity != NONTHREAT \ @@ -424,8 +423,7 @@ else if(treat_virus) var/virus = 0 - for(var/thing in C.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in C.viruses) //detectable virus if((!(D.visibility_flags & HIDDEN_SCANNER)) || (!(D.visibility_flags & HIDDEN_PANDEMIC))) if(D.severity != NONTHREAT) //virus is harmful diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 6d6f0ff72e..7681566854 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -11,7 +11,8 @@ qdel(hud_used) if(mind && mind.current == src) spellremove(src) - QDEL_LIST(viruses) + for(var/infection in viruses) + qdel(infection) for(var/cc in client_colours) qdel(cc) client_colours = null diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 56e56bfcaa..053cba123a 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -113,7 +113,7 @@ //List of active diseases - var/list/viruses = list() // list of all diseases in a mob + var/list/viruses = list() // replaces var/datum/disease/virus var/list/resistances = list() mouse_drag_pointer = MOUSE_ACTIVE_POINTER diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e421b84853..cf598b7a2e 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -65,9 +65,9 @@ if (tr_flags & TR_KEEPVIRUS) O.viruses = viruses viruses = list() - for(var/thing in O.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in O.viruses) D.affected_mob = O + D.holder = O //keep damage? if (tr_flags & TR_KEEPDAMAGE) @@ -219,9 +219,9 @@ if (tr_flags & TR_KEEPVIRUS) O.viruses = viruses viruses = list() - for(var/thing in O.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in O.viruses) D.affected_mob = O + D.holder = O O.med_hud_set_status() //keep damage? diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 1685eeb72d..ab68dffc0b 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -149,7 +149,7 @@ if(!new_name || ..()) return A.AssignName(new_name) - for(var/datum/disease/advance/AD in SSdisease.active_diseases) + for(var/datum/disease/advance/AD in SSdisease.processing) AD.Refresh() . = TRUE if("create_culture_bottle") diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 54e59f3584..a59af94aee 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -58,11 +58,13 @@ M.confused = 0 M.SetSleeping(0, 0) M.jitteriness = 0 - for(var/thing in M.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in M.viruses) if(D.severity == NONTHREAT) continue - D.cure() + D.spread_text = "Remissive" + D.stage-- + if(D.stage < 1) + D.cure() ..() . = 1 @@ -684,7 +686,7 @@ taste_description = "dull toxin" /datum/reagent/medicine/oculine/on_mob_life(mob/living/M) - var/obj/item/organ/eyes/eyes = M.getorganslot("eyes_sight") + var/obj/item/organ/eyes/eyes = M.getorganslot("eyes_sight") if (!eyes) return if(M.disabilities & BLIND) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 1480c33429..fb7b99ce4d 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -13,8 +13,7 @@ /datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_volume) if(data && data["viruses"]) - for(var/thing in data["viruses"]) - var/datum/disease/D = thing + for(var/datum/disease/D in data["viruses"]) if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) continue @@ -74,6 +73,11 @@ if(data["blood_DNA"]) B.blood_DNA[data["blood_DNA"]] = data["blood_type"] + for(var/datum/disease/D in data["viruses"]) + var/datum/disease/newVirus = D.Copy(1) + B.viruses += newVirus + newVirus.holder = B + /datum/reagent/liquidgibs name = "Liquid gibs" @@ -92,8 +96,7 @@ /datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume) if(islist(data) && (method == INGEST || method == INJECT)) - for(var/thing in M.viruses) - var/datum/disease/D = thing + for(var/datum/disease/D in M.viruses) if(D.GetDiseaseID() in data) D.cure() M.resistances |= data