diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index 397ee26b20a..523f52bdff2 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -43,6 +43,8 @@
/obj/machinery/smartfridge/extract/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/slime_extract))
return 1
+ if(istype(O,/obj/item/device/slime_scanner))
+ return 1
return 0
/obj/machinery/smartfridge/medbay
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 9707a2b2383..d5dc9a0e838 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -891,7 +891,7 @@
products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4,
/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,
/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12,
- /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,
+ /obj/item/device/healthanalyzer = 5,/obj/item/device/healthupgrade = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,
/obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, /obj/item/stack/medical/splint = 2, /obj/item/device/sensor_device = 2)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 92cfb499ad0..ada6dcfce83 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -106,6 +106,7 @@ REAGENT SCANNER
throw_range = 10
m_amt = 200
origin_tech = "magnets=1;biotech=1"
+ var/upgraded = 0
var/mode = 1;
@@ -171,21 +172,11 @@ REAGENT SCANNER
OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal"
user.show_message("[OX] | [TX] | [BU] | [BR]")
if (istype(M, /mob/living/carbon))
- if(M:reagents.total_volume > 0)
- var/unknown = 0
- var/reagentdata[0]
+ if(M:reagents.total_volume > 0 && upgraded)
+ user.show_message("\blue Reagents detected in subject's blood:")
for(var/A in M.reagents.reagent_list)
var/datum/reagent/R = A
- if(R.scannable)
- reagentdata["[R.id]"] = "\t \blue [round(M.reagents.get_reagent_amount(R.id), 1)]u [R.name]"
- else
- unknown++
- if(reagentdata.len)
- user.show_message("\blue Beneficial reagents detected in subject's blood:")
- for(var/d in reagentdata)
- user.show_message(reagentdata[d])
- if(unknown)
- user.show_message(text("\red Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood."))
+ user.show_message("\t \blue [M.reagents.get_reagent_amount(R.id)]u [R.name]")
if(M:virus2.len)
var/mob/living/carbon/C = M
for (var/ID in C.virus2)
@@ -252,6 +243,30 @@ REAGENT SCANNER
if(0)
usr << "The scanner no longer shows limb damage."
+/obj/item/device/healthanalyzer/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/device/healthupgrade))
+ if(upgraded)
+ user << "You have already installed an upgraded in the [src]."
+ else
+ user << "You install the upgrade in the [src]."
+ overlays += "advanced"
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ upgraded = 1
+ qdel(W)
+
+/obj/item/device/healthanalyzer/advanced
+ upgraded = 1
+
+/obj/item/device/healthanalyzer/advanced/New()
+ overlays += "advanced"
+
+
+/obj/item/device/healthupgrade
+ name = "Health Analyzer Upgrade"
+ icon_state = "healthupgrade"
+ desc = "An upgrade unit that can be installed on a health analyzer for expanded functionality."
+ w_class = 1.0
+ origin_tech = "magnets=2;biotech=2"
/obj/item/device/analyzer
desc = "A hand-held environmental scanner which reports current gas levels."
@@ -464,35 +479,37 @@ REAGENT SCANNER
throwforce = 0
throw_speed = 3
throw_range = 7
-// matter = list("metal" = 30,"glass" = 20)
+ m_amt = 30
+ g_amt = 20
/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
if (!isslime(M))
- user << "This device can only scan slimes!"
+ user.show_message("This device can only scan slimes!", 1)
return
var/mob/living/carbon/slime/T = M
- user.show_message("Slime scan results:")
- user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"))
- user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()))
+ user.show_message("Slime scan results:", 1)
+ user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"), 1)
+ user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()), 1)
if (T.nutrition < T.get_starve_nutrition())
- user.show_message("Warning: slime is starving!")
+ user.show_message("Warning: slime is starving!", 1)
else if (T.nutrition < T.get_hunger_nutrition())
- user.show_message("Warning: slime is hungry")
- user.show_message("Electric change strength: [T.powerlevel]")
- user.show_message("Health: [T.health]")
+ user.show_message("Warning: slime is hungry", 1)
+ user.show_message("Electric change strength: [T.powerlevel]", 1)
+ user.show_message("Health: [T.health]", 1)
if (T.slime_mutation[4] == T.colour)
- user.show_message("This slime does not evolve any further")
+ user.show_message("This slime does not evolve any further.", 1)
else
if (T.slime_mutation[3] == T.slime_mutation[4])
if (T.slime_mutation[2] == T.slime_mutation[1])
- user.show_message(text("Possible mutation: []", T.slime_mutation[3]))
- user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting")
+ user.show_message("Possible mutation: [T.slime_mutation[3]]", 1)
+ user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting", 1)
else
- user.show_message(text("Possible mutations: [], [], [] (x2)", T.slime_mutation[1], T.slime_mutation[2], T.slime_mutation[3]))
- user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting")
+ user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)", 1)
+ user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1)
else
- user.show_message(text("Possible mutations: [], [], [], []", T.slime_mutation[1], T.slime_mutation[2], T.slime_mutation[3], T.slime_mutation[4]))
- user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting")
+ user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1)
+ user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1)
if (T.cores > 1)
- user.show_message("Anomalious slime core amount detected")
- user.show_message("Growth progress: [T.amount_grown]/10")
+ user.show_message("Anomalious slime core amount detected", 1)
+ user.show_message("Growth progress: [T.amount_grown]/10", 1)
+
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 141da47284a..143f8170572 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -23,7 +23,6 @@ datum
var/nutriment_factor = 0
var/custom_metabolism = REAGENTS_METABOLISM
var/overdose = 0
- var/scannable = 0 //shows up on health analyzers
//var/list/viruses = list()
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
@@ -325,7 +324,6 @@ datum
description = "Dylovene is a broad-spectrum antitoxin."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob, var/alien)
if(!M) M = holder.my_atom
@@ -504,7 +502,6 @@ datum
description = "Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob, var/alien)
if(!M) M = holder.my_atom
@@ -1011,7 +1008,6 @@ datum
description = "Ryetalyn can cure all genetic abnomalities."
reagent_state = SOLID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1062,7 +1058,6 @@ datum
description = "Most probably know this as Tylenol, but this chemical is a mild, simple painkiller."
reagent_state = LIQUID
color = "#C855DC"
- scannable = 1
custom_metabolism = 0.2 // Lasts 2.5 minutes for 15 units
on_mob_life(var/mob/living/M as mob)
@@ -1103,7 +1098,6 @@ datum
description = "A simple, yet effective painkiller."
reagent_state = LIQUID
color = "#C8A5DC"
- scannable = 1
custom_metabolism = 0.2 // Lasts 2.5 minutes for 15 units
on_mob_life(var/mob/living/M as mob)
@@ -1119,7 +1113,6 @@ datum
reagent_state = LIQUID
color = "#C805DC"
custom_metabolism = 0.3 // Lasts 1.5 minutes for 15 units
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1461,7 +1454,6 @@ datum
description = "Leporazine can be use to stabilize an individuals body temperature."
reagent_state = LIQUID
color = "#E9D66B" // rgb: 233, 214, 107
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1512,7 +1504,6 @@ datum
description = "Kelotane is a drug used to treat burns."
reagent_state = LIQUID
color = "#ECD540" // rgb: 236, 213, 64
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(M.stat == 2.0)
@@ -1529,7 +1520,6 @@ datum
description = "Dermaline is the next step in burn medication. Works twice as good as kelotane and enables the body to restore even the direst heat-damaged tissue."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0) //THE GUY IS **DEAD**! BEREFT OF ALL LIFE HE RESTS IN PEACE etc etc. He does NOT metabolise shit anymore, god DAMN
@@ -1546,7 +1536,6 @@ datum
description = "Dexalin is used in the treatment of oxygen deprivation."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
@@ -1569,7 +1558,6 @@ datum
description = "Dexalin Plus is used in the treatment of oxygen deprivation. Its highly effective."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
@@ -1592,7 +1580,6 @@ datum
description = "Tricordrazine is a highly potent stimulant, originally derived from cordrazine. Can be used to treat a wide range of injuries."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
@@ -1666,7 +1653,6 @@ datum
description = "Synaptizine is a synaptic stimulant that can also be used to treat certain diseases."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1704,7 +1690,6 @@ datum
description = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1718,7 +1703,6 @@ datum
description = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning."
reagent_state = LIQUID
color = "#BFFF00" // rgb: 191, 255, 0
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(M.stat == 2.0)
@@ -1737,7 +1721,6 @@ datum
description = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue."
reagent_state = LIQUID
color = "#F77FBE" // rgb: 247, 127, 190
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1751,7 +1734,6 @@ datum
description = "Heals eye damage"
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1772,7 +1754,6 @@ datum
description = "Heals ear damage."
reagent_state = LIQUID
color = "#6600FF" // rgb: 100, 165, 255
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1787,7 +1768,6 @@ datum
description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1809,7 +1789,6 @@ datum
description = "Bicaridine is an analgesic medication and can be used to treat blunt trauma."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
@@ -1841,7 +1820,6 @@ datum
description = "A chemical mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1859,7 +1837,6 @@ datum
description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' clones that get ejected early when used in conjunction with a cryo tube."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1878,7 +1855,6 @@ datum
description = "A powder derived from fish toxin, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects."
reagent_state = SOLID
color = "#669900" // rgb: 102, 153, 0
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -1906,7 +1882,6 @@ datum
description = "An all-purpose antiviral agent."
reagent_state = LIQUID
color = "#228B22" // rgb: 34, 139, 34
- scannable = 1
on_mob_life(var/mob/living/M as mob)
..()
@@ -2092,7 +2067,6 @@ datum
description = "A powerful oxidizer that reacts with ethanol."
reagent_state = SOLID
color = "#605048" // rgb: 96, 80, 72
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
@@ -2188,7 +2162,6 @@ datum
reagent_state = LIQUID
nutriment_factor = 10 * REAGENTS_METABOLISM
color = "#BBEDA4" // rgb: 187, 237, 164
- scannable = 1
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 0c03f1c6756..44eb8c6cf1e 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -45,6 +45,16 @@
build_path = /obj/item/device/robotanalyzer
category = list("Medical")
+/datum/design/healthanalyzer_upgrade
+ name = "Health Analyzer Upgrade"
+ desc = "An upgrade unit for expanding the functionality of a health analyzer."
+ id = "healthanalyzer_upgrade"
+ req_tech = list("biotech" = 2, "magnets" = 2)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 20, "$glass" = 20)
+ build_path = /obj/item/device/healthupgrade
+ category = list("Medical")
+
/datum/design/defib
name = "Defibrillator"
desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients."
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 374d95f9bc1..33f94a46604 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index c166b09612a..eb04e1ab564 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -6367,7 +6367,7 @@
"csw" = (/turf/simulated/wall,/area/medical/morgue)
"csx" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"csy" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"csz" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/beakers{pixel_x = -1; pixel_y = -1; pixel_x = 2; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
+"csz" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/beakers{pixel_x = -1; pixel_y = -1; pixel_x = 2; pixel_y = 2},/obj/item/device/slime_scanner,/obj/item/device/slime_scanner,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"csA" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"csB" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
"csC" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)