diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index a844d248e00..05de6b9ac69 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -71,6 +71,8 @@
for(var/i=1 to 5)
var/obj/item/xenoproduct/slime/core/C = new(src)
C.traits = new()
+ C.nameVar = "grey"
+ item_quants[C.name]++
/obj/machinery/smartfridge/secure/medbay
name = "\improper Refrigerated Medicine Storage"
diff --git a/code/modules/xenobio2/mob/xeno procs.dm b/code/modules/xenobio2/mob/xeno procs.dm
index b98bf334d62..e20373c21ce 100644
--- a/code/modules/xenobio2/mob/xeno procs.dm
+++ b/code/modules/xenobio2/mob/xeno procs.dm
@@ -29,7 +29,7 @@ Procs for targeting
set_light(traitdat.traits[TRAIT_XENO_GLOW_RANGE], traitdat.traits[TRAIT_XENO_GLOW_STRENGTH], traitdat.traits[TRAIT_XENO_BIO_COLOR])
else
set_light(0, 0, "#000000") //Should kill any light that shouldn't be there.
- if(!(chromatic))
+ if(chromatic)
hostile = 0 //No. No laser-reflecting hostile creatures. Bad.
else
hostile = traitdat.traits[TRAIT_XENO_HOSTILE]
diff --git a/code/modules/xenobio2/tools/xeno_trait_scanner.dm b/code/modules/xenobio2/tools/xeno_trait_scanner.dm
new file mode 100644
index 00000000000..6913e7514dc
--- /dev/null
+++ b/code/modules/xenobio2/tools/xeno_trait_scanner.dm
@@ -0,0 +1,167 @@
+/obj/item/device/analyzer/xeno_analyzer
+ name = "exotic biological analyzer"
+ desc = "A device to investigate the genetic data of a biological target."
+ var/form_title
+ var/last_data
+
+/obj/item/device/analyzer/xeno_analyzer/proc/print_report_verb()
+ set name = "Print Plant Report"
+ set category = "Object"
+ set src = usr
+
+ if(usr.stat || usr.restrained() || usr.lying)
+ return
+ print_report(usr)
+
+/obj/item/device/analyzer/xeno_analyzer/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["print"])
+ print_report(usr)
+
+/obj/item/device/analyzer/xeno_analyzer/proc/print_report(var/mob/living/user)
+ if(!last_data)
+ user << "There is no scan data to print."
+ return
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
+ P.name = "paper - [form_title]"
+ P.info = "[last_data]"
+ if(istype(user,/mob/living/carbon/human))
+ user.put_in_hands(P)
+ user.visible_message("\The [src] spits out a piece of paper.")
+ return
+
+/obj/item/device/analyzer/xeno_analyzer/attack_self(mob/user as mob)
+ print_report(user)
+ return 0
+
+/obj/item/device/analyzer/xeno_analyzer/afterattack(var/target, mob/user, flag)
+ if(!flag) return
+
+ var/datum/xeno/traits/trait_info
+ var/datum/reagents/prod_reagents
+ var/targetName
+ if(istype(target,/obj/structure/table))
+ return ..()
+ else if(istype(target,/mob/living/simple_animal/xeno))
+
+ var/mob/living/simple_animal/xeno/X = target
+ targetName = X.name
+ trait_info = X.traitdat
+
+ else if(istype(target,/obj/item/xenoproduct))
+
+ var/obj/item/xenoproduct/P = target
+ trait_info = P.traits
+ targetName = P.name
+ prod_reagents = P.reagents
+
+ if(!trait_info)
+ user << "[src] can tell you nothing about \the [target]."
+ return
+
+ form_title = "[targetName]"
+ var/dat = "
Biological data for [form_title]
"
+ user.visible_message("[user] runs the scanner over \the [target].")
+
+ dat += "General Data
"
+
+
+ dat += "| Health: | [trait_info.get_trait(TRAIT_XENO_HEALTH)] |
"
+
+ if(prod_reagents && prod_reagents.reagent_list && prod_reagents.reagent_list.len)
+ dat += "Reagent Data
"
+
+ dat += "
This sample contains: "
+ for(var/datum/reagent/R in prod_reagents.reagent_list)
+ dat += "
- [R.name], [prod_reagents.get_reagent_amount(R.id)] unit(s)"
+
+ dat += "Other Data
"
+
+ if(trait_info.get_trait(TRAIT_XENO_EATS))
+ dat += "This subject requires nutritional intake.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_HUNGER))
+ if(trait_info.get_trait(TRAIT_XENO_HUNGER) < 7)
+ dat += "It appears to have a slower metabolism.
"
+ else if(trait_info.get_trait(TRAIT_XENO_HUNGER) > 15)
+ dat += "It appears to have a greater metabolism.
"
+ else
+ dat += "It appears to have an average metabolism.
"
+
+ if(trait_info.get_trait(TRAIT_IMMUTABLE) == -1)
+ dat += "This plant is highly mutable.
"
+ else if(trait_info.get_trait(TRAIT_IMMUTABLE) > 0)
+ dat += "This plant does not possess genetics that are alterable.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_HEALTH))
+ if(trait_info.get_trait(TRAIT_XENO_HEALTH) < 20)
+ dat += "It bears characteristics that indicate resilience to damage.
"
+ else if(trait_info.get_trait(TRAIT_XENO_HEALTH) > 10)
+ dat += "It bears characteristics that indicate susceptibility to damage.
"
+ else
+ dat += "It bears no characters indicating resilience to damage.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_COLDRES))
+ if(trait_info.get_trait(TRAIT_XENO_COLDRES) < 10)
+ dat += "It bears characteristics that indicate resilience to colder temperatures.
"
+ else if(trait_info.get_trait(TRAIT_XENO_COLDRES) > 20)
+ dat += "It bears characteristics that indicate susceptibility to colder temperatures.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_HEATRES))
+ if(trait_info.get_trait(TRAIT_XENO_HEATRES) < 10)
+ dat += "It bears characteristics that indicate resilience to warmer temperatures.
"
+ else if(trait_info.get_trait(TRAIT_XENO_HEATRES) > 20)
+ dat += "It bears characteristics that indicate susceptibility to warmer temperatures.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_SPEED))
+ if(trait_info.get_trait(TRAIT_XENO_SPEED) < 0)
+ dat += "It appears to be agile.
"
+ else if(trait_info.get_trait(TRAIT_XENO_SPEED) > 0)
+ dat += "It appears to be slower.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_CANSPEAK))
+ dat += "
The subject appears to be able to articulate."
+
+ if(trait_info.get_trait(TRAIT_XENO_SPEAKCHANCE))
+ if(trait_info.get_trait(TRAIT_XENO_SPEAKCHANCE) < 10)
+ dat += "The subject appears to articulate infrequently.
"
+ else if(trait_info.get_trait(TRAIT_XENO_SPEAKCHANCE) > 20)
+ dat += "The subject appears to articulate frequently.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_CANLEARN))
+ dat += "
The subject appears to have process verbal information."
+
+ if(trait_info.get_trait(TRAIT_XENO_LEARNCHANCE))
+ if(trait_info.get_trait(TRAIT_XENO_LEARNCHANCE) < 50)
+ dat += "The subject appears to comprehend verbal information infrequently.
"
+ else if(trait_info.get_trait(TRAIT_XENO_LEARNCHANCE) > 51)
+ dat += "The subject appears to comprehend verbal information frequently.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_STRENGTH) < 5)
+ dat += "It appears to have lower average physical capacity.
"
+ else if(trait_info.get_trait(TRAIT_XENO_STRENGTH) > 7)
+ dat += "It appears to have greater average physical capacity.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_STR_RANGE))
+ if(trait_info.get_trait(TRAIT_XENO_STR_RANGE) < 50)
+ dat += "The subject appears to have more consistent attacks.
"
+ else if(trait_info.get_trait(TRAIT_XENO_STR_RANGE) > 51)
+ dat += "The subject appears to have more varied attacks.
"
+
+ if(trait_info.get_trait(TRAIT_XENO_BIOLUMESCENT))
+ dat += "
It is [trait_info.get_trait(TRAIT_XENO_BIO_COLOR) ? "bio-luminescent" : "bio-luminescent"]."
+
+ if(trait_info.get_trait(TRAIT_XENO_HOSTILE))
+ dat += "
The subject appears to have hostile tendencies."
+
+ if(trait_info.get_trait(TRAIT_XENO_CHROMATIC))
+ dat += "
The subject appears to have chromatic particles inside of it."
+
+
+ if(dat)
+ last_data = dat
+ dat += "
\[print report\]"
+ user << browse(dat,"window=xeno_analyzer")
+
+ return
\ No newline at end of file
diff --git a/html/changelogs/Datraen-Xenobio2Update2.yml b/html/changelogs/Datraen-Xenobio2Update2.yml
new file mode 100644
index 00000000000..7db43469277
--- /dev/null
+++ b/html/changelogs/Datraen-Xenobio2Update2.yml
@@ -0,0 +1,9 @@
+author: Datraen
+
+
+delete-after: True
+
+changes:
+ - rscadd: "Adds a trait tool for Xenobio2. It was supposed to be in the initial implementation, but fell through the cracks, sorry!"
+ - bugfix: "Fixed the xenobio smartfridge not displaying it's starting core amount."
+ - bugfix: "Fixed an inverted check with slimes."
diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm
index aa97ea0411f..23fd1e1026a 100644
--- a/maps/polaris-5.dmm
+++ b/maps/polaris-5.dmm
@@ -445,7 +445,7 @@
"iC" = (/obj/structure/disposaloutlet{dir = 1},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"iD" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"iE" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
-"iF" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/folder,/obj/item/weapon/pen,/obj/item/weapon/melee/baton/slime/loaded,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
+"iF" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/folder,/obj/item/weapon/pen,/obj/item/weapon/melee/baton/slime/loaded,/obj/item/device/analyzer/xeno_analyzer,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
"iG" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"iH" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"iI" = (/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for a door to space."; id = "xenobioout6"; name = "Containment Release Switch"; pixel_x = 0; pixel_y = -28; req_access = list(55)},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
@@ -461,7 +461,7 @@
"iS" = (/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Xenobiology Aft Starboard"; dir = 1},/obj/machinery/newscaster{pixel_y = -32},/obj/machinery/light,/obj/machinery/computer/xenobio2,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"iT" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"iU" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
-"iV" = (/obj/structure/table/steel,/obj/item/clothing/glasses/science,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
+"iV" = (/obj/structure/table/steel,/obj/item/clothing/glasses/science,/obj/item/device/analyzer/xeno_analyzer,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
"iW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/blue,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
"iX" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"iY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/blue,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
@@ -469,9 +469,9 @@
"ja" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"jb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/blue,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
"jc" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
-"jd" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/xenobiodisk,/obj/item/weapon/melee/baton/slime/loaded,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
+"jd" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/xenobiodisk,/obj/item/weapon/melee/baton/slime/loaded,/obj/item/device/analyzer/xeno_analyzer,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"je" = (/turf/simulated/wall,/area/outpost/research/xenobiology)
-"jf" = (/obj/structure/closet,/obj/item/toy/figure/scientist,/obj/item/clothing/accessory/armband/science,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
+"jf" = (/obj/structure/closet,/obj/item/toy/figure/scientist,/obj/item/clothing/accessory/armband/science,/obj/item/device/analyzer/xeno_analyzer,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
"jg" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"jh" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"ji" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
diff --git a/polaris.dme b/polaris.dme
index c81c1ac0750..d051306f68b 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1916,6 +1916,7 @@
#include "code\modules\xenobio2\mob\slime\slime_core.dm"
#include "code\modules\xenobio2\mob\slime\slime_monkey.dm"
#include "code\modules\xenobio2\tools\slime_handling_tools.dm"
+#include "code\modules\xenobio2\tools\xeno_trait_scanner.dm"
#include "code\modules\xgm\xgm_gas_data.dm"
#include "code\modules\xgm\xgm_gas_mixture.dm"
#include "code\unit_tests\loadout_tests.dm"