diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 2129c802681..af4a9ba7e97 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -54,6 +54,7 @@
#define MOB_EPIC (1 << 7) //megafauna
#define MOB_REPTILE (1 << 8)
#define MOB_SPIRIT (1 << 9)
+#define MOB_PLANT (1 << 10)
//Organ defines for carbon mobs
#define ORGAN_ORGANIC 1
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 4c762bd5a36..1f852f2a4ca 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -223,6 +223,7 @@ DEFINE_BITFIELD(mob_biotypes, list(
"MOB_ROBOTIC" = MOB_ROBOTIC,
"MOB_SPIRIT" = MOB_SPIRIT,
"MOB_UNDEAD" = MOB_UNDEAD,
+ "MOB_PLANT" = MOB_PLANT
))
DEFINE_BITFIELD(mobility_flags, list(
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index f9adcd4cd7e..293e7171337 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -56,9 +56,11 @@
if(scanned_object.get_plant_seed() || istype(scanned_object, /obj/item/seeds))
to_chat(user, scan_plant_stats(scanned_object))
return TRUE
- if(ispodperson(scan_target))
- pod_person_health_scan(scan_target, user)
- return TRUE
+ if(isliving(scan_target))
+ var/mob/living/L = scan_target
+ if(L.mob_biotypes & MOB_PLANT)
+ plant_biotype_health_scan(scan_target, user)
+ return TRUE
return FALSE
@@ -87,19 +89,21 @@
if(scanned_object.get_plant_seed() || istype(scanned_object, /obj/item/seeds))
to_chat(user, scan_plant_chems(scanned_object))
return TRUE
- if(ispodperson(scan_target))
- pod_person_chem_scan(scan_target, user)
- return TRUE
+ if(isliving(scan_target))
+ var/mob/living/L = scan_target
+ if(L.mob_biotypes & MOB_PLANT)
+ plant_biotype_chem_scan(scan_target, user)
+ return TRUE
return FALSE
/*
- * Scan a podperson's health with the plant analyzer. No wound scanning, though.
+ * Scan a living mob's (with MOB_PLANT biotype) health with the plant analyzer. No wound scanning, though.
*
- * scanned_mob - the podperson being scanned
+ * scanned_mob - the living mob being scanned
* user - the person doing the scanning
*/
-/obj/item/plant_analyzer/proc/pod_person_health_scan(mob/living/carbon/human/scanned_mob, mob/living/carbon/human/user)
+/obj/item/plant_analyzer/proc/plant_biotype_health_scan(mob/living/scanned_mob, mob/living/carbon/human/user)
user.visible_message("[user] analyzes [scanned_mob]'s vitals.", \
"You analyze [scanned_mob]'s vitals.")
@@ -107,12 +111,12 @@
add_fingerprint(user)
/*
- * Scan a podperson's chemical contents with the plant analyzer.
+ * Scan a living mob's (with MOB_PLANT biotype) chemical contents with the plant analyzer.
*
- * scanned_mob - the podperson being scanned
+ * scanned_mob - the living mob being scanned
* user - the person doing the scanning
*/
-/obj/item/plant_analyzer/proc/pod_person_chem_scan(mob/living/carbon/human/scanned_mob, mob/living/carbon/human/user)
+/obj/item/plant_analyzer/proc/plant_biotype_chem_scan(mob/living/scanned_mob, mob/living/carbon/human/user)
user.visible_message("[user] analyzes [scanned_mob]'s bloodstream.", \
"You analyze [scanned_mob]'s bloodstream.")
chemscan(user, scanned_mob)
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index db6de6ec344..b05174f405b 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -279,6 +279,7 @@
meat = /obj/item/stack/sheet/mineral/wood
//Can burn and take damage from heat
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
+ inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
armor = 30
burnmod = 1.25
heatmod = 1.5
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index c0ef45e5f89..33f65db5d10 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -4,6 +4,7 @@
id = "pod"
default_color = "59CE00"
species_traits = list(MUTCOLORS,EYECOLOR, HAS_FLESH, HAS_BONE)
+ inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
inherent_factions = list("plants", "vines")
attack_verb = "slash"
attack_effect = ATTACK_EFFECT_CLAW
@@ -42,27 +43,3 @@
H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time)
return TRUE
-
-/datum/species/pod/on_hit(obj/projectile/P, mob/living/carbon/human/H)
- switch(P.type)
- if(/obj/projectile/energy/floramut)
- if(prob(15))
- H.rad_act(rand(30,80))
- H.Paralyze(100)
- H.visible_message("[H] writhes in pain as [H.p_their()] vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.")
- if(prob(80))
- H.easy_randmut(NEGATIVE+MINOR_NEGATIVE)
- else
- H.easy_randmut(POSITIVE)
- H.randmuti()
- H.domutcheck()
- else
- H.adjustFireLoss(rand(5,15))
- H.show_message("The radiation beam singes you!")
- if(/obj/projectile/energy/florayield)
- H.set_nutrition(min(H.nutrition+30, NUTRITION_LEVEL_FULL))
- if(/obj/projectile/energy/florarevolution)
- H.show_message("The radiation beam leaves you feeling disoriented!")
- H.Dizzy(15)
- H.emote("flip")
- H.emote("spin")
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
index c5ca2b08b3a..49315dfd65c 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
@@ -13,6 +13,7 @@
icon_state = "seedling"
icon_living = "seedling"
icon_dead = "seedling_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_PLANT
maxHealth = 100
health = 100
melee_damage_lower = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
index c43e8e916f1..9a428e9abd5 100644
--- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm
+++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm
@@ -4,6 +4,7 @@
icon_state = "tomato"
icon_living = "tomato"
icon_dead = "tomato_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_PLANT
gender = NEUTER
speak_chance = 0
turns_per_move = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 7fc82e643d2..d301584993e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -4,6 +4,7 @@
icon_state = "mushroom_color"
icon_living = "mushroom_color"
icon_dead = "mushroom_dead"
+ mob_biotypes = MOB_ORGANIC | MOB_PLANT
speak_chance = 0
turns_per_move = 1
maxHealth = 10
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index a72f186f97e..09bc95ebc5c 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -7,6 +7,7 @@
icon_dead = "pine_1"
icon_gib = "pine_1"
health_doll_icon = "pine_1"
+ mob_biotypes = MOB_ORGANIC | MOB_PLANT
gender = NEUTER
speak_chance = 0
turns_per_move = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index b1f5e172f58..eeb202bdf4d 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -98,6 +98,7 @@
icon = 'icons/effects/spacevines.dmi'
icon_state = "venus_human_trap"
health_doll_icon = "venus_human_trap"
+ mob_biotypes = MOB_ORGANIC | MOB_PLANT
layer = SPACEVINE_MOB_LAYER
health = 50
maxHealth = 50
diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm
index 730133e951b..c37b16bb7d4 100644
--- a/code/modules/projectiles/projectile/special/floral.dm
+++ b/code/modules/projectiles/projectile/special/floral.dm
@@ -6,6 +6,27 @@
nodamage = TRUE
flag = ENERGY
+/obj/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.mob_biotypes & MOB_PLANT)
+ if(prob(15))
+ L.rad_act(rand(30, 80))
+ L.Paralyze(100)
+ L.visible_message("[L] writhes in pain as [L.p_their()] vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.")
+ if(iscarbon(L) && L.has_dna())
+ var/mob/living/carbon/C = L
+ if(prob(80))
+ C.easy_randmut(NEGATIVE + MINOR_NEGATIVE)
+ else
+ C.easy_randmut(POSITIVE)
+ C.randmuti()
+ C.domutcheck()
+ else
+ L.adjustFireLoss(rand(5, 15))
+ L.show_message("The radiation beam singes you!")
+
/obj/projectile/energy/florayield
name = "beta somatoray"
icon_state = "energy2"
@@ -14,6 +35,13 @@
nodamage = TRUE
flag = ENERGY
+/obj/projectile/energy/florayield/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.mob_biotypes & MOB_PLANT)
+ L.set_nutrition(min(L.nutrition + 30, NUTRITION_LEVEL_FULL))
+
/obj/projectile/energy/florarevolution
name = "gamma somatoray"
icon_state = "energy3"
@@ -21,3 +49,13 @@
damage_type = TOX
nodamage = TRUE
flag = ENERGY
+
+/obj/projectile/energy/florarevolution/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.mob_biotypes & MOB_PLANT)
+ L.show_message("The radiation beam leaves you feeling disoriented!")
+ L.Dizzy(15)
+ L.emote("flip")
+ L.emote("spin")
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 7c2dae37565..4dd862331fa 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -326,13 +326,16 @@
var/obj/structure/spacevine/SV = exposed_obj
SV.on_chem_effect(src)
-/datum/reagent/toxin/plantbgone/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)
+/datum/reagent/toxin/plantbgone/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume)
. = ..()
+ var/damage = min(round(0.4 * reac_volume, 0.1), 10)
+ if(exposed_mob.mob_biotypes & MOB_PLANT)
+ exposed_mob.adjustToxLoss(damage)
if(!(methods & VAPOR) || !iscarbon(exposed_mob))
return
var/mob/living/carbon/exposed_carbon = exposed_mob
if(!exposed_carbon.wear_mask)
- exposed_carbon.adjustToxLoss(min(round(0.4 * reac_volume, 0.1), 10))
+ exposed_carbon.adjustToxLoss(damage)
/datum/reagent/toxin/plantbgone/weedkiller
name = "Weed Killer"