Merge pull request #4019 from tigercat2000/disease1

-tg- disease1
This commit is contained in:
Fox McCloud
2016-03-30 21:29:58 -04:00
127 changed files with 4943 additions and 3508 deletions
+17 -4
View File
@@ -362,6 +362,23 @@
. = 1
return 1
/atom/proc/add_blood_list(mob/living/carbon/M)
// Returns 0 if we have that blood already
if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it.
blood_DNA = list()
//if this blood isn't already in the list, add it
if(blood_DNA[M.dna.unique_enzymes])
return 0 //already bloodied with this blood. Cannot add more.
var/blood_type = "X*"
if(ishuman(M))
var/mob/living/carbon/human/H = M
blood_type = H.b_type
blood_DNA[M.dna.unique_enzymes] = blood_type
return 1
// Only adds blood on the floor -- Skie
/atom/proc/add_blood_floor(mob/living/carbon/M)
return //why the fuck this is at an atom level but only works on simulated turfs I don't know
/atom/proc/clean_blood()
src.germ_level = 0
@@ -377,10 +394,6 @@
if(toxvomit)
this.icon_state = "vomittox_[pick(1,4)]"
/atom/proc/add_poop_floor(mob/living/carbon/M as mob)
if( istype(src, /turf/simulated) )
new /obj/effect/decal/cleanable/poop(src)
/atom/proc/get_global_map_pos()
if(!islist(global_map) || isemptylist(global_map)) return
+3 -2
View File
@@ -60,10 +60,11 @@
//called when a carbon changes virus
/mob/living/carbon/proc/check_virus()
for (var/ID in virus2)
if (ID in virusDB)
for(var/datum/disease/D in viruses)
if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT))
return 1
return 0
//helper for getting the appropriate health status
/proc/RoundHealth(health)
switch(health)
-2
View File
@@ -668,8 +668,6 @@
shake_camera(M, 10, 5)
if (M == usr)
continue
if(!airborne_can_reach(UT, T))
continue
M << "<span class='warning'>You are sent flying!</span>"
M.Weaken(5)
step_away(M, UT, 15)
@@ -23,12 +23,8 @@
user.reagents.add_reagent("potass_iodide", 10)
user.reagents.add_reagent("charcoal", 20)
if(istype(user, /mob/living/carbon))
var/mob/living/carbon/C = user
if(C.virus2.len)
for (var/ID in C.virus2)
var/datum/disease2/disease/V = C.virus2[ID]
C.antibodies |= V.antigen
for(var/datum/disease/D in user.viruses)
D.cure()
feedback_add_details("changeling_powers","AP")
return 1
-3
View File
@@ -95,9 +95,6 @@
if(istype(M, /obj/effect/decal/cleanable/blood))
score_mess += 1
if(istype(M, /obj/effect/decal/cleanable/poop))
score_mess += 1
if(istype(M, /obj/effect/decal/cleanable/vomit))
score_mess += 1
+4 -17
View File
@@ -192,8 +192,8 @@
/obj/effect/proc_holder/spell/vampire/targetted/disease
name = "Diseased Touch (100)"
desc = "Touches your victim with infected blood giving them the Shutdown Syndrome which quickly shutsdown their major organs resulting in a quick painful death."
gain_desc = "You have gained the Diseased Touch ability which causes those you touch to die shortly after unless treated medically."
desc = "Touches your victim with infected blood giving them appendicitis, which will, left untreated, cause a slow death by poison."
gain_desc = "You have gained the Diseased Touch ability which causes those you touch to die unless treated medically."
action_icon_state = "vampire_disease"
required_blood = 100
@@ -204,21 +204,8 @@
if(!affects(target))
usr << "<span class='warning'>They seem to be unaffected.</span>"
continue
var/datum/disease2/disease/shutdown = new /datum/disease2/disease
var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
var/datum/disease2/effect/organs/vampire/O = new /datum/disease2/effect/organs/vampire
holder.effect += O
holder.chance = 10
shutdown.infectionchance = 100
shutdown.antigen |= text2num(pick(ANTIGENS))
shutdown.antigen |= text2num(pick(ANTIGENS))
shutdown.spreadtype = "None"
shutdown.uniqueID = rand(0,10000)
shutdown.effects += holder
shutdown.speed = 1
shutdown.stage = 2
shutdown.clicks = 185
infect_virus2(target, shutdown, 0)
var/datum/disease/D = new /datum/disease/appendicitis //someone should probably make a better virus for this
target.ForceContractDisease(D)
/obj/effect/proc_holder/spell/vampire/mob_aoe/glare
name = "Glare"
+1 -1
View File
@@ -173,7 +173,7 @@
selection_color = "#ffeef0"
idtype = /obj/item/weapon/card/id/medical
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_virology, access_maint_tunnels)
minimal_access = list(access_medical, access_virology, access_maint_tunnels, access_mineral_storeroom)
alt_titles = list("Pathologist","Microbiologist")
minimal_player_age = 7
+2 -2
View File
@@ -317,7 +317,7 @@
occupantData["health"] = H.health
occupantData["maxHealth"] = H.maxHealth
occupantData["hasVirus"] = H.virus2.len
occupantData["hasVirus"] = H.viruses.len
occupantData["bruteLoss"] = H.getBruteLoss()
occupantData["oxyLoss"] = H.getOxyLoss()
@@ -476,7 +476,7 @@
t1 = "*dead*"
dat += "[occupant.health > 50 ? "<font color='blue'>" : "<font color='red'>"]\tHealth %: [occupant.health], ([t1])</font><br>"
if(occupant.virus2.len)
if(occupant.viruses.len)
dat += "<font color='red'>Viral pathogen detected in blood stream.</font><BR>"
var/extra_font = null
-2
View File
@@ -208,7 +208,6 @@ text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
target_types += /obj/effect/decal/cleanable/blood/oil
target_types += /obj/effect/decal/cleanable/vomit
target_types += /obj/effect/decal/cleanable/poop
target_types += /obj/effect/decal/cleanable/blood/gibs/robot
target_types += /obj/effect/decal/cleanable/crayon
target_types += /obj/effect/decal/cleanable/liquid_fuel
@@ -220,7 +219,6 @@ text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
target_types += /obj/effect/decal/cleanable/ash
target_types += /obj/effect/decal/cleanable/greenglow
target_types += /obj/effect/decal/cleanable/dirt
target_types += /obj/effect/decal/cleanable/mucus
if(blood)
target_types += /obj/effect/decal/cleanable/blood/xeno/
+18 -9
View File
@@ -424,10 +424,17 @@
if((C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_tox)))
return 1
if((C.virus2.len) && (!C.reagents.has_reagent(treatment_virus)))
for (var/ID in C.virus2)
if (ID in virusDB) // If the virus is known, the medbot is aware of it
return 1
if(treat_virus)
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)
return 0
if(D.severity == NONTHREAT) // medibot doesn't try to heal truly harmless viruses
return 0
if((D.stage > 1) || (D.spread_flags & AIRBORNE)) // medibot can't detect a virus in its initial stage unless it spreads airborne.
if(!C.reagents.has_reagent(treatment_virus))
return 1 //STOP DISEASE FOREVER
return 0
/obj/machinery/bot/medbot/proc/medicate_patient(mob/living/carbon/C as mob)
@@ -458,12 +465,14 @@
else
if(treat_virus)
var/virus = 0
if(C:virus2.len)
for (var/ID in C.virus2)
if (ID in virusDB) // If the virus is known, the medbot is aware of it and will try to cure it
virus = 1
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
if((D.stage > 1) || (D.spread_flags & AIRBORNE))
virus = 1
if (!reagent_id && (virus))
if(!reagent_id && (virus))
if(!C.reagents.has_reagent(treatment_virus))
reagent_id = treatment_virus
@@ -54,6 +54,10 @@
/obj/item/weapon/circuitboard/med_data
name = "Circuit board (Medical Records)"
build_path = /obj/machinery/computer/med_data
/obj/item/weapon/circuitboard/pandemic
name = "circuit board (PanD.E.M.I.C. 2200)"
build_path = /obj/machinery/computer/pandemic
origin_tech = "programming=2;biotech=2"
/obj/item/weapon/circuitboard/scan_consolenew
name = "Circuit board (DNA Machine)"
build_path = /obj/machinery/computer/scan_consolenew
@@ -243,12 +247,6 @@
build_path = /obj/machinery/computer/shuttle/white_ship
/obj/item/weapon/circuitboard/curefab
name = "Circuit board (Cure Fabricator)"
build_path = /obj/machinery/computer/curer
/obj/item/weapon/circuitboard/splicer
name = "Circuit board (Disease Splicer)"
build_path = /obj/machinery/computer/diseasesplicer
/obj/item/weapon/circuitboard/HolodeckControl
name = "Circuit board (Holodeck Control)"
build_path = /obj/machinery/computer/HolodeckControl
+14 -12
View File
@@ -84,7 +84,6 @@
dat += text("\n<A href='?src=\ref[];print_p=1'>Print Record</A><BR>\n<A href='?src=\ref[];screen=2'>Back</A><BR>", src, src)
if(5.0)
dat += "<CENTER><B>Virus Database</B></CENTER>"
/* Advanced diseases is weak! Feeble! Glory to virus2!
for(var/Dt in typesof(/datum/disease/))
var/datum/disease/Dis = new Dt(0)
if(istype(Dis, /datum/disease/advance))
@@ -92,11 +91,6 @@
if(!Dis.desc)
continue
dat += "<br><a href='?src=\ref[src];vir=[Dt]'>[Dis.name]</a>"
*/
for (var/ID in virusDB)
var/datum/data/record/v = virusDB[ID]
dat += "<br><a href='?src=\ref[src];vir=\ref[v]'>[v.fields["name"]]</a>"
dat += "<br><a href='?src=\ref[src];screen=1'>Back</a>"
if(6.0)
dat += "<center><b>Medical Robot Monitor</b></center>"
@@ -206,12 +200,20 @@
src.active2 = null
if(href_list["vir"])
var/datum/data/record/v = locate(href_list["vir"])
src.temp = "<center>GNAv2 based virus lifeform V-[v.fields["id"]]</center>"
src.temp += "<br><b>Name:</b> <A href='?src=\ref[src];field=vir_name;edit_vir=\ref[v]'>[v.fields["name"]]</A>"
src.temp += "<br><b>Antigen:</b> [v.fields["antigen"]]"
src.temp += "<br><b>Spread:</b> [v.fields["spread type"]] "
src.temp += "<br><b>Details:</b><br> <A href='?src=\ref[src];field=vir_desc;edit_vir=\ref[v]'>[v.fields["description"]]</A>"
var/type = href_list["vir"]
var/datum/disease/Dis = new type(0)
var/AfS = ""
for(var/mob/M in Dis.viable_mobtypes)
AfS += " [initial(M.name)];"
src.temp = {"<b>Name:</b> [Dis.name]
<BR><b>Number of stages:</b> [Dis.max_stages]
<BR><b>Spread:</b> [Dis.spread_text] Transmission
<BR><b>Possible Cure:</b> [(Dis.cure_text||"none")]
<BR><b>Affected Lifeforms:</b>[AfS]
<BR>
<BR><b>Notes:</b> [Dis.desc]
<BR>
<BR><b>Severity:</b> [Dis.severity]"}
if (href_list["del_all"])
src.temp = text("Are you sure you wish to delete all records?<br>\n\t<A href='?src=\ref[];temp=1;del_all2=1'>Yes</A><br>\n\t<A href='?src=\ref[];temp=1'>No</A><br>", src, src)
+33 -16
View File
@@ -108,37 +108,54 @@
return 1
return 0
/obj/machinery/smartfridge/secure/virology
name = "\improper Refrigerated Virus Storage"
desc = "A refrigerated storage unit for storing viral material."
req_access_txt = "39"
icon_state = "smartfridge_virology"
icon_on = "smartfridge_virology"
icon_off = "smartfridge_virology-off"
/obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/weapon/reagent_containers/glass/beaker/vial/))
return 1
if(istype(O,/obj/item/weapon/virusdish/))
return 1
return 0
/obj/machinery/smartfridge/secure/chemistry
name = "\improper Smart Chemical Storage"
desc = "A refrigerated storage unit for medicine and chemical storage."
icon_state = "smartfridge" //To fix the icon in the map editor.
icon_on = "smartfridge_chem"
req_access_txt = "33"
var/list/spawn_meds = list()
/obj/machinery/smartfridge/secure/chemistry/New()
..()
for(var/typekey in spawn_meds)
var/amount = spawn_meds[typekey]
if(isnull(amount)) amount = 1
while(amount)
var/obj/item/I = new typekey(src)
if(item_quants[I.name])
item_quants[I.name]++
else
item_quants[I.name] = 1
nanomanager.update_uis(src)
amount--
/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers))
return 1
return 0
// ----------------------------
// Virology Medical Smartfridge
// ----------------------------
/obj/machinery/smartfridge/secure/chemistry/virology
name = "\improper Smart Virus Storage"
name = "smart virus storage"
desc = "A refrigerated storage unit for volatile sample storage."
req_access_txt = "39"
spawn_meds = list(/obj/item/weapon/reagent_containers/syringe/antiviral = 4,
/obj/item/weapon/reagent_containers/glass/bottle/cold = 1,
/obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1,
/obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1,
/obj/item/weapon/reagent_containers/glass/bottle/plasma = 1,
/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine = 1)
/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(obj/item/O)
if(..(O))
return 1
if(istype(O, /obj/item/weapon/reagent_containers/syringe))
return 1
return 0
/obj/machinery/smartfridge/drinks
name = "\improper Drink Showcase"
+7 -1
View File
@@ -1008,7 +1008,13 @@
vend_delay = 15
vend_reply = "Have an enchanted evening!"
product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/twohanded/staff = 2)
products = list(/obj/item/clothing/head/wizard = 1,
/obj/item/clothing/suit/wizrobe = 1,
/obj/item/clothing/head/wizard/red = 1,
/obj/item/clothing/suit/wizrobe/red = 1,
/obj/item/clothing/shoes/sandal = 1,
/obj/item/weapon/twohanded/staff = 2)
contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/wizarditis = 1)
/obj/machinery/vending/autodrobe
name = "\improper AutoDrobe"
@@ -18,7 +18,6 @@ var/global/list/image/splatter_cache=list()
var/list/viruses = list()
blood_DNA = list()
var/basecolor="#A10808" // Color when wet.
var/list/datum/disease2/disease/virus2 = list()
var/amount = 5
appearance_flags = NO_CLIENT_COLOR
@@ -198,20 +197,20 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/gibs/proc/streak(var/list/directions)
spawn (0)
var/direction = pick(directions)
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
sleep(3)
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
b.basecolor = src.basecolor
b.update_icon()
for(var/datum/disease2/disease/D in src.viruses)
var/datum/disease2/disease/ND = D.getcopy()
b.viruses += ND
if (step_to(src, get_step(src, direction), 0))
break
set waitfor = 0
var/direction = pick(directions)
for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++)
sleep(3)
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
b.basecolor = src.basecolor
b.update_icon()
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/old/New()
@@ -221,29 +220,3 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/blood/gibs/old/New()
..()
dry()
/obj/effect/decal/cleanable/mucus
name = "mucus"
desc = "Disgusting mucus."
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "mucus"
random_icon_states = list("mucus")
var/list/datum/disease2/disease/virus2 = list()
var/dry=0 // Keeps the lag down
/obj/effect/decal/cleanable/mucus/New()
spawn(DRYING_TIME * 2)
dry=1
/obj/effect/decal/cleanable/blood/viralsputum
name = "viral sputum"
desc = "It's black and nasty."
// basecolor="#030303"
icon = 'icons/mob/robots.dmi'
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
@@ -114,7 +114,6 @@
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
var/list/datum/disease2/disease/virus2 = list()
noclear = 1
/obj/effect/decal/cleanable/vomit/New()
@@ -133,17 +132,6 @@
reagents.remove_reagent("vomit", 5)
reagents.add_reagent("green_vomit", 5)
/obj/effect/decal/cleanable/poop
name = "poop"
desc = "Gosh, how unpleasant."
gender = PLURAL
density = 0
anchored = 1
layer = 2
icon = 'icons/effects/poop.dmi'
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
var/list/datum/disease2/disease/virus2 = list()
/obj/effect/decal/cleanable/tomato_smudge
name = "tomato smudge"
desc = "It's red."
+3 -9
View File
@@ -187,19 +187,13 @@ REAGENT SCANNER
if (istype(M, /mob/living/carbon))
if(upgraded)
chemscan(user, M)
if(M:virus2.len) // WHAT IS TYPECASTING
var/mob/living/carbon/C = M
for (var/ID in C.virus2)
if (ID in virusDB)
var/datum/data/record/V = virusDB[ID]
user.show_message(text("\red Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]"))
// user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood."))
for(var/datum/disease/D in M.viruses)
if(!(D.visibility_flags & HIDDEN_SCANNER))
user << "<span class='alert'><b>Warning: [D.form] detected</b>\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]</span>"
if(M.getStaminaLoss())
user.show_message("<span class='info'>Subject appears to be suffering from fatigue.</span>")
if (M.getCloneLoss())
user.show_message("<span class='warning'>Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.</span>")
// if (M.reagents && M.reagents.get_reagent_amount("epinephrine"))
// user.show_message("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals.")
if (M.has_brain_worms())
user.show_message("\red Subject suffering from aberrant brain activity. Recommend further scanning.")
else if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && !M.get_int_organ(/obj/item/organ/internal/brain))
+7 -10
View File
@@ -113,22 +113,19 @@
//returns 1 if made bloody, returns 0 otherwise
/turf/simulated/add_blood(mob/living/carbon/human/M as mob)
/turf/simulated/add_blood(mob/living/carbon/human/M)
if (!..())
return 0
if(istype(M))
for(var/obj/effect/decal/cleanable/blood/B in contents)
if(!B.blood_DNA[M.dna.unique_enzymes])
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
B.virus2 = virus_copylist(M.virus2)
return 1 //we bloodied the floor
var/obj/effect/decal/cleanable/blood/B = locate() in contents //check for existing blood splatter
if(!B)
blood_splatter(src,M.get_blood(M.vessel),1)
return 1 //we bloodied the floor
return 0
B = locate(/obj/effect/decal/cleanable/blood) in contents
B.add_blood_list(M)
return 1 //we bloodied the floor
// Only adds blood on the floor -- Skie
/turf/simulated/proc/add_blood_floor(mob/living/carbon/M as mob)
/turf/simulated/add_blood_floor(mob/living/carbon/M as mob)
if(ishuman(M))
blood_splatter(src,M,1)
if( istype(M, /mob/living/carbon/alien ))