diff --git a/code/WorkInProgress/Chemistry-Reagents.dm b/code/WorkInProgress/Chemistry-Reagents.dm index 3b7d8cba5db..90e078f579c 100644 --- a/code/WorkInProgress/Chemistry-Reagents.dm +++ b/code/WorkInProgress/Chemistry-Reagents.dm @@ -76,7 +76,7 @@ datum if(method == TOUCH)//respect all protective clothing... M.contract_disease(V) else //injected - M.contract_disease(V, 1) + M.contract_disease(V, 1, 0) return @@ -993,9 +993,7 @@ datum reaction_mob(var/mob/M, var/method=TOUCH, var/volume) src = null if( (prob(10) && method==TOUCH) || method==INGEST) - var/datum/disease/D = new /datum/disease/robotic_transformation - M.contract_disease(D,1) - del(D) + M.contract_disease(new /datum/disease/robotic_transformation(0),1) xenomicrobes name = "Xenomicrobes" @@ -1005,9 +1003,7 @@ datum reaction_mob(var/mob/M, var/method=TOUCH, var/volume) src = null if( (prob(10) && method==TOUCH) || method==INGEST) - var/datum/disease/D = new /datum/disease/xeno_transformation - M.contract_disease(D,1) - del(D) + M.contract_disease(new /datum/disease/xeno_transformation(0),1) //foam precursor diff --git a/code/WorkInProgress/Chemistry-Tools.dm b/code/WorkInProgress/Chemistry-Tools.dm index 3f8c55f703d..6c4ec22749a 100644 --- a/code/WorkInProgress/Chemistry-Tools.dm +++ b/code/WorkInProgress/Chemistry-Tools.dm @@ -563,7 +563,7 @@ //set reagent data B.data["donor"] = T if(T.virus && T.virus.spread_type != SPECIAL) - B.data["virus"] = new T.virus.type + B.data["virus"] = new T.virus.type(0) B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0) if(T.resistances&&T.resistances.len) B.data["resistances"] = T.resistances.Copy() @@ -1168,7 +1168,7 @@ var/datum/reagents/R = new/datum/reagents(20) reagents = R R.my_atom = src - var/datum/disease/F = new /datum/disease/flu + var/datum/disease/F = new /datum/disease/flu(0) var/list/data = list("virus"= F) R.add_reagent("blood", 20, data) @@ -1184,7 +1184,7 @@ var/datum/reagents/R = new/datum/reagents(20) reagents = R R.my_atom = src - var/datum/disease/F = new /datum/disease/cold + var/datum/disease/F = new /datum/disease/cold(0) var/list/data = list("virus"= F) R.add_reagent("blood", 20, data) @@ -1215,7 +1215,7 @@ var/datum/reagents/R = new/datum/reagents(20) reagents = R R.my_atom = src - var/datum/disease/F = new /datum/disease/fake_gbs + var/datum/disease/F = new /datum/disease/fake_gbs(0) var/list/data = list("virus"= F) R.add_reagent("blood", 20, data) @@ -1231,7 +1231,7 @@ var/datum/reagents/R = new/datum/reagents(30) reagents = R R.my_atom = src - var/datum/disease/F = new /datum/disease/brainrot + var/datum/disease/F = new /datum/disease/brainrot(0) var/list/data = list("virus"= F) R.add_reagent("blood", 20, data) @@ -1246,7 +1246,7 @@ var/datum/reagents/R = new/datum/reagents(20) reagents = R R.my_atom = src - var/datum/disease/F = new /datum/disease/magnitis + var/datum/disease/F = new /datum/disease/magnitis(0) var/list/data = list("virus"= F) R.add_reagent("blood", 20, data) @@ -1262,7 +1262,7 @@ var/datum/reagents/R = new/datum/reagents(20) reagents = R R.my_atom = src - var/datum/disease/F = new /datum/disease/wizarditis + var/datum/disease/F = new /datum/disease/wizarditis(0) var/list/data = list("virus"= F) R.add_reagent("blood", 20, data) diff --git a/code/datums/disease.dm b/code/datums/disease.dm index ad8a80d8f09..d65388b0ef0 100644 --- a/code/datums/disease.dm +++ b/code/datums/disease.dm @@ -36,7 +36,6 @@ to null does not delete the object itself. Thank you. var/severity = null//severity descr /datum/disease/proc/stage_act() - var/cure_present = has_cure() //world << "[cure_present]" @@ -70,8 +69,17 @@ to null does not delete the object itself. Thank you. return result -/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0) - //world << "Contract_disease called by [src] with virus [virus]" +/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1) +// world << "Contract_disease called by [src] with virus [virus]" + + if(force_species_check) + var/fail = 1 + for(var/name in virus.affected_species) + var/mob_type = text2path("/mob/living/carbon/[lowertext(name)]") + if(mob_type && istype(src, mob_type)) + fail = 0 + break + if(fail) return if(skip_this == 1)//be wary, it replaces the current disease... if(src.virus) @@ -139,41 +147,43 @@ to null does not delete the object itself. Thank you. switch(target_zone) if(1) - if(H.head) + if(H.head && isobj(H.head)) Cl = H.head passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod) - //world << "Head pass [passed]" - if(passed && H.wear_mask) +// world << "Head pass [passed]" + if(passed && H.wear_mask && isobj(H.wear_mask)) Cl = H.wear_mask passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod) - //world << "Mask pass [passed]" +// world << "Mask pass [passed]" if(2)//arms and legs included - if(H.wear_suit) + if(H.wear_suit && isobj(H.wear_suit)) Cl = H.wear_suit passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod) - //world << "Suit pass [passed]" - if(passed && H.slot_w_uniform) +// world << "Suit pass [passed]" + if(passed && H.slot_w_uniform && isobj(H.slot_w_uniform)) Cl = H.slot_w_uniform passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod) - //world << "Uniform pass [passed]" +// world << "Uniform pass [passed]" if(3) - if(H.wear_suit && H.wear_suit.body_parts_covered&HANDS) + if(H.wear_suit && isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS) Cl = H.wear_suit passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod) +// world << "Suit pass [passed]" - if(passed && H.gloves) + if(passed && H.gloves && isobj(H.gloves)) Cl = H.gloves passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod) - //world << "Gloves pass [passed]" +// world << "Gloves pass [passed]" if(4) - if(H.wear_suit && H.wear_suit.body_parts_covered&FEET) + if(H.wear_suit && isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET) Cl = H.wear_suit passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod) +// world << "Suit pass [passed]" - if(passed && H.shoes) + if(passed && H.shoes && isobj(H.shoes)) Cl = H.shoes passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod) - //world << "Shoes pass [passed]" +// world << "Shoes pass [passed]" else src << "Something strange's going on, something's wrong." @@ -188,7 +198,7 @@ to null does not delete the object itself. Thank you. var/mob/living/carbon/monkey/M = src switch(target_zone) if(1) - if(M.wear_mask) + if(M.wear_mask && isobj(M.wear_mask)) Cl = M.wear_mask passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod) //world << "Mask pass [passed]" @@ -257,11 +267,8 @@ to null does not delete the object itself. Thank you. check_range = 1 for(var/mob/living/carbon/M in oviewers(check_range, source)) - for(var/name in src.affected_species) - var/mob_type = text2path("/mob/living/carbon/[lowertext(name)]") - if(mob_type && istype(M, mob_type))//check if mob can be infected - M.contract_disease(src) - break + M.contract_disease(src) + return @@ -269,7 +276,7 @@ to null does not delete the object itself. Thank you. if(!src.holder) return if(prob(40)) src.spread(holder) - if(src.holder == src.affected_mob) + if(src.holder == src.affected_mob && affected_mob.stat < 2) src.stage_act() return @@ -284,8 +291,9 @@ to null does not delete the object itself. Thank you. return -/datum/disease/New()//adding the object to global list. List is processed by master controller. - active_diseases += src +/datum/disease/New(var/process=1)//adding the object to global list. List is processed by master controller. + if(process) + active_diseases += src /* /datum/disease/Del() diff --git a/code/datums/diseases/alien_embryo.dm b/code/datums/diseases/alien_embryo.dm index f133b67b2be..a936af5f033 100644 --- a/code/datums/diseases/alien_embryo.dm +++ b/code/datums/diseases/alien_embryo.dm @@ -71,8 +71,8 @@ else if(affected_mob.client) affected_mob.client.mob = new/mob/living/carbon/alien/larva(affected_mob.loc) - src.cure(0) affected_mob.gib() + src.cure(0) gibbed = 1 /* diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 4b458c9029c..798ddb4a947 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -48,6 +48,5 @@ affected_mob << "\red Mucous runs down the back of your throat." if(prob(1) && prob(50)) if(!affected_mob.resistances.Find(/datum/disease/flu)) - var/datum/disease/Flu = new /datum/disease/flu - affected_mob.contract_disease(Flu,1) - del(Flu) + var/datum/disease/Flu = new /datum/disease/flu(0) + affected_mob.contract_disease(Flu,1) \ No newline at end of file diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm index 6384a6ad525..18747bdad85 100644 --- a/code/game/gamemodes/monkey/monkey.dm +++ b/code/game/gamemodes/monkey/monkey.dm @@ -26,7 +26,7 @@ amount-- for (var/mob/living/carbon/monkey/rabid_monkey in world) - rabid_monkey.contract_disease(new /datum/disease/jungle_fever) + rabid_monkey.contract_disease(new /datum/disease/jungle_fever,0,0) /datum/game_mode/monkey/check_finished() if(emergency_shuttle.location==2) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 1f18cd6deb1..4259e0d59c7 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -85,12 +85,10 @@ if(5.0) dat += "
Virus Database
" for(var/Dt in typesof(/datum/disease/)) - var/datum/disease/Dis = new Dt + var/datum/disease/Dis = new Dt(0) if(!Dis.desc) - del(Dis) continue dat += "
[Dis.name]" - del(Dis) dat += "
Back" if(6.0) dat += "
Medical Robot Monitor
" @@ -169,7 +167,7 @@ if(href_list["vir"]) var/type = href_list["vir"] - var/datum/disease/Dis = new type + var/datum/disease/Dis = new type(0) var/AfS = "" for(var/Str in Dis.affected_species) AfS += " [Str];" @@ -182,7 +180,6 @@
Notes: [Dis.desc]

Severity: [Dis.severity]"} - del(Dis) if (href_list["del_all"]) src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) diff --git a/code/game/objects/alien/facehugger.dm b/code/game/objects/alien/facehugger.dm index 3dccd52ce1e..271214da067 100644 --- a/code/game/objects/alien/facehugger.dm +++ b/code/game/objects/alien/facehugger.dm @@ -247,7 +247,7 @@ target.alien_egg_flag = 1 var/mob/trg = target src.death() - trg.contract_disease(new /datum/disease/alien_embryo) + trg.contract_disease(new /datum/disease/alien_embryo(0)) return else sleep(50) diff --git a/code/game/objects/gibs.dm b/code/game/objects/gibs.dm index 15c1ea1a1a8..0590ff65e73 100644 --- a/code/game/objects/gibs.dm +++ b/code/game/objects/gibs.dm @@ -1,47 +1,72 @@ /proc/gibs(atom/location, var/datum/disease/virus) var/obj/decal/cleanable/blood/gibs/gib = null + if(virus && virus.spread_type == SPECIAL) + virus = null // NORTH gib = new /obj/decal/cleanable/blood/gibs(location) if (prob(30)) gib.icon_state = "gibup1" - gib.virus = virus + if(virus && prob(20)) + gib.virus = new virus.type + gib.virus.holder = gib + gib.virus.spread_type = CONTACT_FEET gib.streak(list(NORTH, NORTHEAST, NORTHWEST)) // SOUTH gib = new /obj/decal/cleanable/blood/gibs(location) if (prob(30)) gib.icon_state = "gibdown1" - gib.virus = virus + if(virus && prob(20)) + gib.virus = new virus.type + gib.virus.holder = gib + gib.virus.spread_type = CONTACT_FEET gib.streak(list(SOUTH, SOUTHEAST, SOUTHWEST)) // WEST gib = new /obj/decal/cleanable/blood/gibs(location) - gib.virus = virus + if(virus && prob(20)) + gib.virus = new virus.type + gib.virus.holder = gib + gib.virus.spread_type = CONTACT_FEET gib.streak(list(WEST, NORTHWEST, SOUTHWEST)) // EAST gib = new /obj/decal/cleanable/blood/gibs(location) - gib.virus = virus + if(virus) + gib.virus = new virus.type + gib.virus.holder = gib + gib.virus.spread_type = CONTACT_FEET gib.streak(list(EAST, NORTHEAST, SOUTHEAST)) // RANDOM BODY gib = new /obj/decal/cleanable/blood/gibs/body(location) - gib.virus = virus + if(virus && prob(20)) + gib.virus = new virus.type + gib.virus.holder = gib + gib.virus.spread_type = CONTACT_FEET gib.streak(alldirs) // RANDOM LIMBS for (var/i = 0, i < pick(0, 1, 2), i++) gib = new /obj/decal/cleanable/blood/gibs/limb(location) - gib.virus = virus + if(virus && prob(20)) + gib.virus = new virus.type + gib.virus.holder = gib + gib.virus.spread_type = CONTACT_FEET gib.streak(alldirs) // CORE gib = new /obj/decal/cleanable/blood/gibs/core(location) - gib.virus = virus + if(virus && prob(20)) + gib.virus = new virus.type + gib.virus.holder = gib + gib.virus.spread_type = CONTACT_FEET /proc/robogibs(atom/location, var/datum/disease/virus) var/obj/decal/cleanable/robot_debris/gib = null + if(virus && virus.spread_type == SPECIAL) + virus = null // RUH ROH var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread diff --git a/code/game/vials.dm b/code/game/vials.dm index 16e7fccaafd..d041948206d 100644 --- a/code/game/vials.dm +++ b/code/game/vials.dm @@ -67,10 +67,10 @@ user:gib() if(2) user:weakened += 5 - user:contract_disease(new /datum/disease/gbs) + user:contract_disease(new /datum/disease/gbs,1) if(3) spawn(200) - user:contract_disease(new /datum/disease/gbs) + user:contract_disease(new /datum/disease/gbs,1) /obj/item/weapon/vial/green/shatter() var/A = src var/atom/sourceloc = get_turf(src.loc) @@ -89,11 +89,11 @@ O2.icon = 'objects.dmi' O2.icon_state = "shards" for(var/mob/living/carbon/human/H in view(5, sourceloc)) - if(!H.virus) H.contract_disease(new /datum/disease/gbs) + if(!H.virus) H.contract_disease(new /datum/disease/gbs,1) var/i for(i=0, i<5, i++) for(var/mob/living/carbon/human/H in view(5, sourceloc)) - if(!H.virus) H.contract_disease(new /datum/disease/gbs) + if(!H.virus) H.contract_disease(new /datum/disease/gbs,1) sleep(20) flick("greenshatter2",O) O.icon_state = "nothing"