diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index b9df144ace..f0ba15446c 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -100,7 +100,8 @@ "[name] bites [ML]!") if(armor >= 2) return - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing 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 5499680a2f..451bd05606 100644 --- a/code/controllers/subsystem/disease.dm +++ b/code/controllers/subsystem/disease.dm @@ -1,11 +1,8 @@ SUBSYSTEM_DEF(disease) name = "Disease" - flags = SS_KEEP_TIMING|SS_NO_INIT - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - - var/list/currentrun = list() - var/list/processing = list() + flags = SS_NO_FIRE + var/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing. var/list/diseases var/list/archive_diseases = list() @@ -15,27 +12,5 @@ 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:[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 + ..("P:[active_diseases.len]") \ No newline at end of file diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 77b8aeed6a..84d177a390 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -1,6 +1,7 @@ /mob/proc/HasDisease(datum/disease/D) - for(var/datum/disease/DD in viruses) + for(var/thing in viruses) + var/datum/disease/DD = thing if(D.IsSame(DD)) return 1 return 0 @@ -39,7 +40,7 @@ var/datum/disease/DD = new D.type(1, D, 0) viruses += DD DD.affected_mob = src - DD.holder = src + SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed. //Copy properties over. This is so edited diseases persist. var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed") @@ -147,6 +148,9 @@ /mob/living/carbon/human/CanContractDisease(datum/disease/D) - if(dna && (VIRUSIMMUNE in dna.species.species_traits)) + if(dna && (VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity) 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 cc11d0e6d2..13ad3ece4e 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -46,21 +46,23 @@ 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 = 0 //If our host is only a carrier + 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/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() @@ -93,13 +95,16 @@ if(!. || (needs_all_cures && . < cures.len)) return 0 -/datum/disease/proc/spread(atom/source, force_spread = 0) + +/datum/disease/proc/spread(force_spread = 0) + if(!affected_mob) + return + if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread) return - if(affected_mob) - if( affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10)) ) - return + if(affected_mob.reagents.has_reagent("spaceacillin") || (affected_mob.satiety > 0 && prob(affected_mob.satiety/10))) + return var/spread_range = 1 @@ -109,15 +114,9 @@ if(spread_flags & AIRBORNE) spread_range++ - if(!source) - if(affected_mob) - source = affected_mob - else - return - - var/turf/T = source.loc + var/turf/T = affected_mob.loc if(istype(T)) - for(var/mob/living/carbon/C in oview(spread_range, source)) + for(var/mob/living/carbon/C in oview(spread_range, affected_mob)) var/turf/V = get_turf(C) if(V) while(TRUE) @@ -129,29 +128,6 @@ 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) @@ -161,20 +137,6 @@ 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 @@ -191,11 +153,6 @@ 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 3aa4dab99b..623b436893 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(src.GetDiseaseID() != D.GetDiseaseID()) + if(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(!(src.IsSame(D))) + if(!(IsSame(D))) var/list/possible_symptoms = shuffle(D.symptoms) for(var/datum/symptom/S in possible_symptoms) AddSymptom(new S.type) @@ -156,7 +156,6 @@ return generated /datum/disease/advance/proc/Refresh(new_name = 0) - //to_chat(world, "[src.name] \ref[src] - REFRESH!") GenerateProperties() AssignProperties() id = null @@ -395,7 +394,7 @@ D.AssignName(new_name) D.Refresh() - for(var/datum/disease/advance/AD in SSdisease.processing) + for(var/datum/disease/advance/AD in SSdisease.active_diseases) AD.Refresh() for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list)) @@ -410,13 +409,6 @@ 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 9413eea5db..11d8b714ba 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(A.holder, 5) + A.spread(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 44d7db5709..bd5d09afa3 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(src.type == S[i]) + if(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 eba5e1173b..8c681b8ec3 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 a58f85a494..e830cafbef 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/bodypart/head) + required_organs = list(/obj/item/organ/brain) 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 69b30589ac..2b77885359 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"]) - src.carrier = 1 - src.stage = 4 + carrier = TRUE + stage = 4 return switch(stage) diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm index b2195a9527..75f63edf43 100644 --- a/code/datums/diseases/pierrot_throat.dm +++ b/code/datums/diseases/pierrot_throat.dm @@ -10,7 +10,6 @@ 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 d33446cadf..9cbb829061 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") - src.cure() + cure() return switch(stage) if(2) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 03b746a3bd..e5746c3f8b 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -73,7 +73,6 @@ 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 4b57c2655b..c8e2a4609b 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -1,4 +1,5 @@ /datum/disease/tuberculosis + form = "Disease" name = "Fungal tuberculosis" max_stages = 5 spread_text = "Airborne" @@ -8,8 +9,9 @@ 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/bodypart/head) + required_organs = list(/obj/item/organ/lungs) 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 f23f01d068..b484e1e480 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -629,10 +629,11 @@ text = "[text]: " if (ishuman(current)) text += "healthy|infected|HUMAN|other" - 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 + else if(ismonkey(current)) + var/found = FALSE + for(var/datum/disease/transformation/jungle_fever/JF in current.viruses) + found = TRUE + break if(found) text += "healthy|INFECTED|human|other" @@ -1342,7 +1343,8 @@ 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/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing D.cure(0) if("infected") if (check_rights(R_ADMIN, 0)) @@ -1362,10 +1364,9 @@ var/mob/living/carbon/human/H = current var/mob/living/carbon/monkey/M = current if (istype(M)) - 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) + 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 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 2e5854509a..4e4c35a937 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -62,7 +62,8 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() var/threat = 0 - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing 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 40ce63a60e..c961406810 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -41,6 +41,9 @@ user.reagents.add_reagent("antihol", 10) user.reagents.add_reagent("mannitol", 25) - for(var/datum/disease/D in user.viruses) + for(var/thing in user.viruses) + var/datum/disease/D = thing + if(D.severity == NONTHREAT) + continue D.cure() return TRUE diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 13e86dd5d3..6a0993db54 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -133,10 +133,9 @@ 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 = 1 + D.carrier = TRUE 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 20ba54afc4..da9f4b61f1 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -60,7 +60,6 @@ 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 5e876d3b92..4785fab384 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(loc) + new /obj/effect/gibspawner/generic(get_turf(src)) 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 3ab96f6df5..26b5bca1ec 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -6,17 +6,10 @@ 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") @@ -34,13 +27,9 @@ var/direction = pick(directions) for(var/i = 0, i < pick(1, 200; 2, 150; 3, 50), i++) sleep(2) - 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)) + if(i > 0) + new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc) + 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 8248776a95..5127aa2285 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -4,17 +4,10 @@ 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() @@ -70,15 +63,11 @@ /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) - 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)) + if(i > 0) + new /obj/effect/decal/cleanable/blood/splatter(loc) + 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 f1b0a9ce40..98a9782600 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -80,9 +80,8 @@ 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(var/mob/user) +/obj/effect/decal/cleanable/vomit/attack_hand(mob/user) if(ishuman(user)) var/mob/living/carbon/human/H = user if(isflyperson(H)) @@ -98,12 +97,6 @@ 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 862d21ad6b..e91c273903 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -43,7 +43,6 @@ 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 @@ -52,11 +51,5 @@ ..() 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 06beef6940..b25b9f7d8f 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, list/viruses, datum/dna/MobDNA) - ..() +/obj/effect/gibspawner/Initialize(mapload, datum/dna/MobDNA) + . = ..() if(gibtypes.len != gibamounts.len || gibamounts.len != gibdirections.len) to_chat(world, "Gib list length mismatch!") @@ -29,13 +29,6 @@ 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 @@ -56,7 +49,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) @@ -65,7 +58,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). @@ -75,7 +68,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 @@ -85,7 +78,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). @@ -96,7 +89,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) @@ -105,7 +98,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) @@ -114,7 +107,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 @@ -124,4 +117,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 70b6d54f73..968f361544 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -171,7 +171,8 @@ MASS SPECTROMETER if(tdelta < (DEFIB_TIME_LIMIT * 10)) to_chat(user, "Subject died [tdelta / 10] seconds ago, defibrillation may be possible!") - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing 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 e10d04611a..6285dcaa13 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(H.loc, H.viruses, H.dna) + new /obj/effect/gibspawner/generic(get_turf(H), 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 ffad361db8..1b00e01d4e 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -149,8 +149,9 @@ 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/datum/disease/D in SSdisease.processing) - D.cure(D) + for(var/thing in SSdisease.active_diseases) + var/datum/disease/D = thing + D.cure(0) 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 9a8e7c8278..90ac9416d9 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(M.loc, M.viruses) + new /obj/effect/gibspawner/generic(get_turf(M)) return if(confirm == "Yes") M.gib() diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 906bde2a87..4061c4db03 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."]") + to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") \ No newline at end of file diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index fc86356adf..dbac242321 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -27,11 +27,17 @@ continue if(T.z != ZLEVEL_STATION) continue - var/foundAlready = 0 // don't infect someone that already has the virus - for(var/datum/disease/D in H.viruses) - foundAlready = 1 + 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 break - if(H.stat == DEAD || foundAlready) + if(foundAlready) continue var/datum/disease/D @@ -45,6 +51,6 @@ DS.strain_data["SE"] = H.dna.struc_enzymes else D = new virus_type() - D.carrier = 1 + D.carrier = TRUE 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 60d7535e5a..f19471fffc 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/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/fluspanish) + 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/turf/T for(var/i=0, i<10, i++) if(prob(15)) @@ -142,11 +142,7 @@ else if(prob(25)) shuttle_spawns.Add(/obj/item/weapon/shard) T = pick_n_take(empty_shuttle_turfs) - 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 + new virus_type(T) 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 new file mode 100644 index 0000000000..98a7e42033 --- /dev/null +++ b/code/modules/events/shuttle_loan.dm.rej @@ -0,0 +1,10 @@ +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 eb66be3038..a441210432 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -8,10 +8,17 @@ /datum/round_event/spontaneous_appendicitis/start() for(var/mob/living/carbon/human/H in shuffle(GLOB.living_mob_list)) - 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) + 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) 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 09a0560357..d20b74210b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -162,7 +162,8 @@ //set reagent data B.data["donor"] = O - for(var/datum/disease/D in O.viruses) + for(var/thing in O.viruses) + var/datum/disease/D = thing 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 69eacbb69e..8e547eeb12 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -137,7 +137,8 @@ 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/datum/disease/D in blood_data["viruses"]) + for(var/thing in blood_data["viruses"]) + var/datum/disease/D = thing if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) continue C.ForceContractDisease(D) @@ -162,7 +163,8 @@ blood_data["donor"] = src blood_data["viruses"] = list() - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing 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 46facdc454..a31dba9fa9 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(loc,viruses) + new /obj/effect/gibspawner/xeno(get_turf(src)) else - new /obj/effect/gibspawner/xenobodypartless(loc,viruses) + new /obj/effect/gibspawner/xenobodypartless(get_turf(src)) /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 585e5779c6..f49e545dfa 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(loc,viruses) + new /obj/effect/gibspawner/larva(get_turf(src)) else - new /obj/effect/gibspawner/larvabodypartless(loc,viruses) + new /obj/effect/gibspawner/larvabodypartless(get_turf(src)) /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 4415c0d7ab..c71751ab2f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -716,8 +716,9 @@ var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) if(B) B.damaged_brain = 0 - for(var/datum/disease/D in viruses) - if (D.severity != NONTHREAT) + for(var/thing in viruses) + var/datum/disease/D = thing + 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 780fabe64d..599c3a43cd 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -107,11 +107,13 @@ /mob/living/carbon/attack_hand(mob/living/carbon/human/user) - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing if(D.IsSpreadByTouch()) user.ContractDisease(D) - for(var/datum/disease/D in user.viruses) + for(var/thing in user.viruses) + var/datum/disease/D = thing if(D.IsSpreadByTouch()) ContractDisease(D) @@ -124,11 +126,13 @@ /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing if(D.IsSpreadByTouch()) M.ContractDisease(D) - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D.IsSpreadByTouch()) ContractDisease(D) @@ -137,7 +141,8 @@ return 0 if(..()) //successful monkey bite. - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing 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 4547390f56..a1b67fbee1 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(loc, viruses, dna) + new /obj/effect/gibspawner/human(get_turf(src), dna) else - new /obj/effect/gibspawner/humanbodypartless(loc, viruses, dna) + new /obj/effect/gibspawner/humanbodypartless(get_turf(src), 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 aec0da4b8a..134f50052f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -119,7 +119,8 @@ //Virsuses if(viruses.len) stat("Viruses:", null) - for(var/datum/disease/D in viruses) + for(var/thing in viruses) + var/datum/disease/D = thing 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 e50997f634..9a82ba5ba9 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -222,6 +222,15 @@ /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 new file mode 100644 index 0000000000..b62c84a34f --- /dev/null +++ b/code/modules/mob/living/carbon/life.dm.rej @@ -0,0 +1,10 @@ +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 eb96d09bde..0fd86ed02e 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(loc, viruses) + new /obj/effect/gibspawner/generic(get_turf(src)) /mob/living/proc/spill_organs() return diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 2df4c83b85..9e51ece6d6 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -19,14 +19,19 @@ var/datum/gas_mixture/environment = loc.return_air() if(stat != DEAD) - //Breathing, if applicable - handle_breathing(times_fired) + //Chemicals in the body + handle_chemicals_in_body() + if(stat != DEAD) //Mutations and radiation handle_mutations_and_radiation() + if(stat != DEAD) - //Chemicals in the body - handle_chemicals_in_body() + //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. + if(stat != DEAD) //Random events (vomiting etc) handle_random_events() @@ -66,6 +71,9 @@ /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 new file mode 100644 index 0000000000..aeba977c88 --- /dev/null +++ b/code/modules/mob/living/life.dm.rej @@ -0,0 +1,11 @@ +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 ca93c95f48..7537697d71 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(loc,viruses) + new /obj/effect/gibspawner/robot(get_turf(src)) /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 a4f8638c4a..0806f457d9 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -513,7 +513,8 @@ Structural Integrity: [M.getBruteLoss() > 50 ? "" : ""][M.getBruteLoss()]
Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
"} - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing 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 a0399d2b2c..b4694dc93a 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -372,7 +372,8 @@ return 1 if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus)) - for(var/datum/disease/D in C.viruses) + for(var/thing in C.viruses) + var/datum/disease/D = thing //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 \ @@ -423,7 +424,8 @@ else if(treat_virus) var/virus = 0 - for(var/datum/disease/D in C.viruses) + for(var/thing in C.viruses) + var/datum/disease/D = thing //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 7681566854..6d6f0ff72e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -11,8 +11,7 @@ qdel(hud_used) if(mind && mind.current == src) spellremove(src) - for(var/infection in viruses) - qdel(infection) + QDEL_LIST(viruses) 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 053cba123a..56e56bfcaa 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() // replaces var/datum/disease/virus + var/list/viruses = list() // list of all diseases in a mob 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 cf598b7a2e..e421b84853 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/datum/disease/D in O.viruses) + for(var/thing in O.viruses) + var/datum/disease/D = thing 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/datum/disease/D in O.viruses) + for(var/thing in O.viruses) + var/datum/disease/D = thing 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 ab68dffc0b..1685eeb72d 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.processing) + for(var/datum/disease/advance/AD in SSdisease.active_diseases) 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 a59af94aee..54e59f3584 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -58,13 +58,11 @@ M.confused = 0 M.SetSleeping(0, 0) M.jitteriness = 0 - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D.severity == NONTHREAT) continue - D.spread_text = "Remissive" - D.stage-- - if(D.stage < 1) - D.cure() + D.cure() ..() . = 1 @@ -686,7 +684,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 fb7b99ce4d..1480c33429 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -13,7 +13,8 @@ /datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_volume) if(data && data["viruses"]) - for(var/datum/disease/D in data["viruses"]) + for(var/thing in data["viruses"]) + var/datum/disease/D = thing if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) continue @@ -73,11 +74,6 @@ 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" @@ -96,7 +92,8 @@ /datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume) if(islist(data) && (method == INGEST || method == INJECT)) - for(var/datum/disease/D in M.viruses) + for(var/thing in M.viruses) + var/datum/disease/D = thing if(D.GetDiseaseID() in data) D.cure() M.resistances |= data